Skip to content

仕様(日本語版)

Yuka MORI edited this page Apr 15, 2023 · 17 revisions

Specifications (Japanese)

非永続バックグラウンドページに対応する新しい仕様

非プライヴェートウインドウそれぞれについて,以下の情報をストレージ (local) に保存し,必要に応じて更新する。

  • Window ごとの現在アクティヴな cookieStoreId
  • Window ごとの隠されている cookieStoreId の一覧

隠されている cookieStoreId について

  • Pinned Tabs は無視
  • Screen sharing/microphone/webcam, etc. で隠すができない Tabs は無視する
  • 1つでも隠された Tab(s) が再表示されたらその cookieStoreId の Tabs 全体を再表示する
  • 隠された cookieStoreId に隠されていない新規 Tab が追加されたらその cookieStoreId の Tabs 全体を再表示する

以下の記述は古くなっている可能性があります。(2022-12)


この拡張機能では,主に UserContext,Tab,Window の3つの概念が肝心である。

  • UserContext - UI においては,Container (コンテナー) と表現される。WebExtensions API の contextualIdentities
  • Tab - それぞれの Window において,UserContext ごとに隠したり再表示したりできる。
  • Window - Tab のソートや,現在アクティヴな Tab を決めるのは Window ごとである。UserContext の表示/非表示を決めるのも Window ごとである。

現在の挙動

  • Window ごとにアクティヴな UserContext が何であるかを計算し,保持している。
    • Sticky new tabs (新しいタブや外部から開かれたタブ(設定が有効な場合のみ)を現在アクティヴなタブで開く機能) のために使われている。
    • この計算が現在は不正確で,アクティヴな UserContext で開かれない場合が往々にしてあるため,改良が求められている。
  • 外部から開かれたタブを検出するために,ブラウザ内部で開かれたタブを把握する必要がある。
    • discarded なタブは常に内部のタブ扱いするべき

設定

WebExtensions の storage API を使用。sync ストレージエリアに保存している。→ sync ストレージエリアには割と厳しめの容量制限があることに注意。設定にはそれほどのデータ量を要しない?

キーは config. から始まるドット区切りの文字列。

設定一覧:

  • newTab.keepContainer - 有効の場合,現在アクティヴなタブで「新しいタブ」を開く (default = true)
  • tab.external.containerOption - 外部アプリケーションから開かれたタブの扱い
    • choose - 毎回開く UserContext を選択する (デフォルト)
    • sticky - 現在アクティヴな UserContext で開く。
    • disabled - 何もしない。つまりブラウザのデフォルトとして,常に userContextId = 0 で開く。
  • tab.groups.indexOption - インデックスタブの表示
    • always - 常に表示
    • collapsed - 隠された UserContext についてのみ
    • never - 表示しない (デフォルト)
  • appearance.popupSize - ポップアップメニューの大きさ
    • standard - 標準のポップアップメニューの大きさ (デフォルト)
    • large - より大きいポップアップメニューの大きさ

変更可能な Firefox 設定:

  • browser.privacy.websites.firstPartyIsolate (default = true)
  • browser.privacy.websites.resistFingerprinting (default = false)

処理:sortTabs()

すべての Window において,Tab をソートして規定の UserContext 順にする。

  • すでに処理が走っているときには何もしないでリターンする。

あるべき仕様

OriginAttributes {
firstPartyDomain: String,
userContextId: u32, (default = 0)
privateBrowsingId: u32, (normal window = 0, private = 1)
}
  • Private Browsing でもタブの管理とサイト別のタブ表示ができるようにする。 Public Suffix List (PSL) を利用して,content script をむやみに利用しない。
  • ウィンドウごとに userContextId, firstPartyDomain のうち0以上の項目でグループ化できるようにする。

ConfigurationOption<T>

特定の型を持つ1つの設定オプションを表わすオブジェクト

  • managed, local, sync の順の優先順位で値を取得する

Properties:

  • private key: string - config. を除いたキー
  • private defaultValue: T - ストレージに値が無いときに使われる値

Methods:

  • public constructor(key: string, defaultValue: T)
  • public async get(): Promise
  • public async set(value: T, storageArea: StorageArea = StorageArea.SYNC): Promise
  • public observe(observer: (value: T) => void): void

UserContext

UserContext 自体のデータを保持し,直接関連する処理を行う

Properties:

  • public id: Int32 - userContextId
  • public name: string
  • public icon: string (enum)
  • public iconUrl: string
  • public color: string (enum)
  • public colorCode: string (#xxxxxx)
  • public defined: boolean - ContextualIdentity として定義されている UserContext かどうか (定義されている = true,userContextId = 0 に対しては true を返すものと定義していることに注意)

Methods:

  • public get cookieStoreId(): string - id の WebExtensions で定義されている cookieStoreId への変換
  • public isRemovable(): boolean - 削除可能な UserContext かどうか (userContextId = 0 は削除不能)
  • public isIncomplete(): boolean - 色やアイコンが定義されているかどうか (ContextualIdentity として定義されていない UserContext や userContextId = 0 の場合未定義。拡張機能側で適当な色やアイコンを見繕って表示する)
  • public async remove(): Promise - この UserContext を ContextualIdentities の定義から削除する。このクラスが行うのは削除のみだが,これを行う前に当該 UserContext に属するすべてのタブを閉じるべきである。(→ 当該 UserContext の Cookies なども削除したほうがいい?)

UserContextTabCollection

ある UserContext に属する Tabs の集合

UserContextTabSorting

  • Pinned Tabs は無視
  • 新しい Tab が開かれたら正しい位置に移動
  • Tab が移動したら再ソート

UserContextVisibilitySync

  • Pinned Tabs は無視
  • Screen sharing/microphone/webcam, etc. で隠すができない Tabs は無視する
  • 1つでも隠された Tab(s) が再表示されたらその UserContext の Tabs 全体を再表示する
  • 隠された UserContext に隠されていない新規 Tab が追加されたらその UserContext の Tabs 全体を再表示する

Privacy Policy (案)

This extension is designed to be safe with Private Browsing, so that no data is stored or sent while Private Browsing. In fact, no data is stored or sent if Private Browsing or not. All the processing is done inside your browser and this extension in particular sends no data out of the browser and of course we have no access to user data.