8.4 KiB
8.4 KiB
実装時の判断記録
設計書はdocs/designへそのまま複写し、SHA-256を保存した。本書は実装時の追加判断であり、原設計の受入条件を書き換えない。
| 判断 | 実装と理由 | 検証・影響 |
|---|---|---|
| フォントを選択したバイト列だけで供給 | MainのFontconfig/GDIでOS索引から選択し、64 KiBずつ既存IPCでWorkerへ渡す。SFNT/TTC解析とPDFiumはWorker内 | Linuxのフォントディレクトリー許可を撤去。日本語CID横/縦と転送・取消・上限を試験。Windows実行は未確認。契約 |
| Linuxから実装 | Arch Linux x64に加え、専用KVMのUbuntu 24.04でもQt 6.11.2と固定PDFiumをビルド・検証 | UbuntuはXvfb/Swayのsoftware描画、ArchはAMD OpenGLも確認。Windows native、対象OSの物理表示・IME、製品配布の受入は未完了 |
| PDFタイルのオフスクリーン余白16px | 設計案の2pxでは、タイル境界を横切る文字のアンチエイリアスに差が出た。16px描画して要求矩形だけを返す | タイルと全ページの切り出しが試験資料でbyte一致。転送タイルは最大514px、通常512pxのまま |
| アーカイブワーカーを読み取り専用にする | ZIP解析・CRC確認・フォント難読化解除はワーカー、最大64KiBずつの展開結果の保存はメイン側 | パーサー侵害で一時領域を無制限に書き込む経路を除去。メイン側で資源256MiB・文書2GiBを確認し、完了後だけ公開 |
| 索引を分割する | PDF目次最大20,000件、初回64件/128KiB、継続最大256件/512KiB。ページ情報は最大256件/256KiB。アーカイブ目次等も件数と実バイト数で分割 | IPC制御フレーム1MiBを保ち、大きなラベルで一括応答が溢れる問題を防止。メイン側でも累積32MiBの索引上限 |
| 先読みの予算と優先度 | 可視タイルと通常操作が完了した後、設定された隣接ページの可視域相当の帯を1件ずつ読む。前ページは末尾、後ページは先頭を対象にする | 0〜3ページ、隣接1ページ最大8タイル。余白がなければ先読みせず、先読みで既存キャッシュを追い出さない |
| メモリ圧迫の段階的対応 | OSの利用可能物理メモリを1秒ごとに読み、先読み停止→不可視タイル回収→描画解像度抑制と通知→文書処理停止の順で進む。LinuxはMemAvailable、WindowsはGlobalMemoryStatusEx | 閾値・ヒステリシス・位置保持・回復と停止後の再openは 契約。設定のキャッシュ上限・隔離の資源上限は維持する。Windows側の実行は未確認 |
| 実際に提示した位置を保存 | PDFは可視タイル完成後のframeSwapped、Webは提示時の論理位置を状態へ渡す | 未表示のジャンプ先を終了時に保存しない。2秒debounce/10秒最大間隔はStateStoreへ集約 |
| 保存先の原本をセッション開始時と照合 | 全形式のopen時に取得した正規パス・サイズ・更新時刻・物理ファイルIDを保存時にも照合する | 閲覧中の変更・置換で古い位置を新原本へ転用しない。通常openでも履歴との同一性不一致を通知。実ファイル置換の回帰 |
| 目次の準備中を欠如と区別 | 能力がloadingの間は空の索引でも表示要求を保持し、パネルに読み込み中と示す | 本文のReadyを待たせず、DOM索引到着後に同じパネルへ項目を表示する |
| 見出しの代替と章境界を限定 | PDFのoutline代替は内部宛先だけを採用。EPUBの最初/最後の見出しへの指示は成立した章移動にだけ結び付ける | 外部だけの目次を見出しありと判定しない。失敗した章境界操作の指示が後の通常移動へ残らない |
| 日本語を初期表示し翻訳資源を分離 | tr/qsTr/固定contextからTSを生成し、QMを本体へ埋め込む。Qt標準部品の日本語資源も読み込む | 英語localeでの設定・コマンドの案内とQt Quick Dialogを検査。OSネイティブdialogはOS言語に従う。更新・配置条件 |
| Webの内部URLを履歴から除外 | Mainで位置の型・上限・originを検証し、resourcePath/CFI/進捗とEPUB package/spineで復元する。旧state/backupのlocation.urlも書込み可能時に除去 | 旧href形式の復元を維持。読み取り専用・forceReadOnlyではファイルを変えず、本文引用中のURLは削除しない |
| ZIP入口は読書位置と別に保存 | 選んだ相対HTMLを同じ原本identityと現在の候補で再確認し、表示成功後だけ記憶する | recent-only/position-only、別GUIプロセス再起動、取消・消去・原本置換を試験。記録 |
| 固定EPUBの見開きは最大2ビュー | 同じ文書profileのprimary/companionへ左右を配置し、author viewportと共通倍率を維持。renderer監視は2枠に限定 | LTR/RTL、両向き、単独中央、混在、取消を確認。章loadの同期通知は現在章のみ更新し、読書位置保存は提示後のまま |
| 資源拒否を分類・件数だけ集約 | broker、interceptor、ブラウザーCSPの検出を文書内でまとめ、:infoへ表示する |
URL・本文を記録しない。合成イベント・古いセッションを拒否。契約 |
| PDFリンク枠の辞書をWorker内で補完 | PDFium公開APIで不足するBorder/BSをlibqpdfで読み、保存外観がないリンクにだけ数値から一時外観を生成する | 原本は書かず、既存外観を維持。通常枠の欠落を解消。NoZoom/NoRotateは描画中だけRect/回転を補正し、原本座標と保存APを保持する。比較 |
| PDF注釈へキーボードで到達 | 既存のリンク順の後に本文付き注釈を加え、Tab/Shift+Tabで選びEnterで読み取り専用の本文を表示する | CropBox外の注釈も選択可能。通常モードのEscで選択解除し、Web文書へ切り替えた後はPDFの選択と画像を回収する |
| 生成資料を使用 | 利用者から既存コーパスなしとの回答。本文・図形・座標・色の期待値を持つ資料を生成 | PDFiumとは独立したPopplerで比較。実書籍全般・全描画機能の互換性を保証する試験には置き換えない |
| OSの保護が利用できないときは停止 | LinuxはLandlock ABI3以上・seccomp・資源上限。WindowsはLPAC・Job・明示ハンドル継承・子側の実token検証を本番経路へ接続 | Windows固有部分は未ビルド・未実行。保護なしで起動するフォールバックを設けない |
| Windowsワーカーの依存物を個別コピー | ビルド時に有限のDLL一覧とハッシュを生成し、起動時に検証して専用領域へコピーする | インストール先や原本のACLを変更しない。実機でのPE解析・初期表示速度・配布確認は残る |
| Windowsのprofileを読み取り専用にする | AppContainer作成時にできる固有filesystem/registryの書込権限も制限し、子側で検証する | 任意Tempと自身のprofileへの書込拒否を試すnative試験を追加。Windowsでの保護成立は未確認 |
PDF見出しはWorker内の共有qpdf contextでページ/Formの所有元、ParentTree、RoleMapと構造順を読み、文字・座標は公開PDFium APIから取得する。FormだけのStructParentsにも対応し、入れ子Form・名前付きproperty・複数ページの子要素順を試験した。複数呼出や一意に対応できないFormは理由付きページ精度へ下げ、別のstreamの同じMCIDから文字や座標を借用しない。跨ページ見出しはページ別の断片として扱い、フォントサイズから見出しを推測しない。補完アダプター。
本文の検索・保存位置・最近使った文書のローカル記録を実装した。これら補助機能の合格範囲は検証記録のT-P系列で区別する。OCR、PDF入力・編集・保存、外部通信、文書スクリプト実行を追加しない。