RFC-0177:父項檢視表的焦點觀察器 | |
---|---|
狀態 | 已接受 |
領域 |
|
說明 | 父項檢視畫面的 API,可瞭解焦點在檢視區塊樹狀結構中移動的方式 |
問題 | |
毛皮變化 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2022-06-06 |
審查日期 (年-月-日) | 2022-07-07 |
摘要
這個 RFC 提出了一個適用於檢視焦點的 API 設計,您可以放心使用 並闡明一般 UI 用戶端。 聚焦觀測能力的限制這部影片的學習重點在於 資訊暴露,提供優質開發人員體驗。
提振精神
為了透過多個 是 UI 用戶端委派的常見模式 透過設定檢視區塊樹狀結構,向其他 UI 用戶端產生內容。 父母檢視模式會管理一或多個子檢視畫面。Ermine 系統 例如殼層另一個是 Google 智慧螢幕一個金鑰 父項檢視畫面負責監控檢視畫面聚焦狀態:
- 為了找出父項檢視畫面可以透過程式輔助方式將檢視畫面焦點移至
孩童檢視模式。
- 例如,父項檢視畫面的要求將焦點移至子項檢視畫面 就會失敗,如果父項的檢視區塊不在檢視區塊樹狀結構的 聚焦鏈結 (https://fxbug.dev/42168713)。
- 如果檢視畫面焦點已移至子項檢視畫面,可找出目前哪個子項
檢視焦點
- 舉例來說,如果使用者輕觸畫面,將焦點移到檢視畫面, 可能需要使用焦點邊界裝飾子項檢視畫面 必須知道事件發生的時間以及子項視圖的身分。
在未參與上層檢視畫面的情況下,焦點可能會變更 (使用者輕觸、卸除檢視畫面、 等)。上層檢視畫面必須隨時掌握檢視畫面焦點移動方式,但 避免違反由 Google 維護的資訊限制 會顯示全域檢視樹狀結構
此 RFC 提出了一個「聚焦觀察器」設計方式 (1) 允許上層檢視畫面 正確回應以檢視焦點變更;(2) 可以安心離開樹狀結構中;以及 (3) 以最低成本改善 Fuchsia View 系統的安全性狀態 資訊暴露。
相關人員
講師:
審查人員:sanjayc@google.com (Workstation)、quiche@google.com (HCI)、 neelsa@google.com (HCI)、akbiggs@google.com (Flutter)
曾諮詢:shiveshganju@google.com、fmil@google.com、emircan@google.com、 jsankey@google.com
社交功能:
此 RFC 透過與受影響團隊的主管進行社交化。
需求條件
- 資訊曝露在最低程度上,只能聚焦於焦點
- 定義完善的資安機制,以取得觀察管道
- 將 SDK 納入「合作夥伴」層級以上
- 開發人員體驗難易度
設計
此聚焦觀察器的核心提案如下 FIDL 通訊協定。
library fuchsia.ui.observation.focus;
using zx;
protocol ScopedProvider {
Watch() -> (ScopedResponse);
};
type ScopedResponse = table {
1: observation_end zx.time;
2: focused zx.koid;
};
「限定範圍」代表通訊協定提供焦點資訊 範圍限定或限制在 focus.ScopedProvider 用戶端的檢視畫面中 。opt.ScopedProvider 用戶端的檢視畫面是這個可觀察檢視畫面的根 。
observation_end
時間會標示觀察期的結束時間,因此用戶端
判斷傳回的焦點何時準確。比方說
區分同一焦點值的不同報酬 (如果有多個序列值)
聚焦變更,以便在單一手錶上返回上一個焦點
。
focused
KOID 是檢視畫面參照 KOID,或
表示檢視畫面的 特殊寄件值 ZX_KOID_INVALID
焦點不在 Focus.ScopedProvider 用戶端的檢視區塊樹狀結構之外。「可能性」
下文將詳細說明。
檢視表拓撲範例
請考慮下列檢視區塊拓撲,其中每個圓圈都代表一個檢視畫面,而 查看「U」是 Focus.ScopedProvider 的用戶端。
將焦點移至檢視樹狀結構
Focus.ScopedProvider 的用戶端無法完整掌握全域檢視畫面 樹狀結構 (詳情請參閱「安全性考量」)。模型可以得知檢視畫面的焦點 在其檢視區塊樹狀結構中 (以 focus.ScopedProvider 用戶端的檢視畫面取得) ,但我們刻意省略具體細節。
當焦點不在 Focus.ScopedProvider 用戶端的檢視區塊樹狀結構之外,用戶端會
而 ZX_KOID_INVALID
Sentinel 的
值。用戶端不會得知新檢視畫面焦點的身分。
Wen 的焦點位於 Focus.ScopedProvider 用戶端的檢視樹狀結構 (也就是用戶端) 僅得知下列資訊:
- 如果焦點位於 Focus.ScopedProvider 用戶端的檢視畫面,則 KOID 檢查政策項目
- 如果焦點位於客戶檢視畫面的直接子項檢視畫面,則 KOID 引導使用者前往一個進入子項檢視畫面
- 如果焦點位於客戶檢視畫面的間接子項檢視畫面,則 KOID 直接子項檢視區塊,即該間接子項檢視區塊的祖系。
上層檢視區塊必須知道,何時能夠在檢視區塊之間移動焦點 。如果檢視畫面的焦點位於檢視區塊樹狀結構中,則此功能具有這項能力。否則, 對 fuchsia.ui.views.Focuser.RequestFocus() 的呼叫一律失敗。
值得注意的是,Focus.ScopedProvider 的資訊是數據匯報 所以說,變更焦點的要求可能會與 更新快照例如,某張快照可能表示焦點位於 Focus.ScopedProvider 用戶端的檢視區塊樹狀結構,以及將焦點變更為 如果祖系檢視表成功要求聚焦,直接子項就可能遭拒 變更為這個檢視區塊樹狀結構以外的位置。
在這個序列圖中,焦點移至 U 時會通知 U,當焦點移至 U 時 焦點已完全移出 U 的檢視區塊。
回報給客戶的重點價值
focused
是三個值類別之一,其中包括 ZX_KOID_INVALID
Sentinel 值。如果 focused
有效 (也就是非 Sentinel),則檢視畫面
可讓焦點在本身和子項檢視畫面之間任意移動。
具體違規事項如下:
- 如果
focused
為ZX_KOID_INVALID
,則焦點會離開這個檢視區塊樹狀結構。這個 可能導致這種情況的原因有很多。例如,位於 U 的 View 樹狀結構 可能是與全域檢視區塊樹狀結構連結,但祖系檢視表 已將焦點移至 U 的同層檢視或者,U 可能已中斷連線 ,這表示 U 不再符合聚焦焦點的資格。 或者,U 的祖系本身也可能中斷連線,在這種情況下 該祖系的子系無法保留焦點。詳情請見 聚焦政策。 - 如果是父項的檢視畫面參照 KOID,則父項檢視畫面本身會成為焦點。 這個使用與 fuchsia.ui.views.ViewRefFocused 相同, 即可淘汰該通訊協定
- 如果 KOID 無效或父項,就是直接子項 查看參考資料 KOID這個欄位只會提及直接子項,即使 聚焦的檢視畫面是直接子項的子系。
本範例將焦點移至 X,也就是 U 底下的 V 子項。聚焦觀察者 回報 U 的直接子項,也就是 V。
摘要語意
如果在過去的觀察期間,有多個焦點變更,這個 API 會 只傳回最後一個焦點客戶通常無法對先前的焦點採取行動 因此,API 經過簡化,只能傳回「摘要」。
通常,如果等待回應的客戶透過手錶放置回呼,焦點就會改變 就會立即傳回用戶端。不過, 用戶端以便在下次等待時延遲停車,因此伺服器可能會 多次聚焦變更,總結下次回程。也有可能是 伺服器接收大量焦點變更,因此根據執行緒或工作 預約時間,這些停滯不前可能會在停車後迅速獲得服務 並輸入變更內容
在這些範例中,不論特定 Watch() 為何,U 都會收到相同的通知 。
狀態變更語意
智慧手錶呼叫是由個別用戶端的狀態變更驅動。
- 連線後第一次呼叫時,會傳回目前狀態 立即生效
- 在智慧手錶的一次回電與下一則 Watch 通話開始之間。 如果發生多種狀態變更,則下一次手錶呼叫 立即反映最新的變更
如果設定層級有所變更,伺服器只會在發生變更時通知用戶端 並在接到來電後忽略,並在收到 智慧手錶通話。在這段期間內,客戶可能會錯過焦點變更摘要 但不適用於預期的用途
因為如果因為狀態變更而導入這種模式,將為伺服器帶來更大的負擔 實作,因為需要追蹤每個觀察器的上次發出狀態 頻道。然而,由於應用程式狀態, 可有效避免用戶端手錶呼叫與 焦點變更舉例來說,在伺服器上停車後 焦點變更可能會在處理回呼前的這段期間內發生, 視伺服器的執行緒性和實作詳細資料而定。
實作
檢視畫面焦點與檢視畫面拓撲的生命週期和維護密切相關。 View 是 View Manager 元件,因此這個通訊協定的實作方式 屬於風景區
成效
焦距會頻繁變化,但實際上會「人類規模」的變動。因此 FIDL 呼叫頻率無關。FIDL 酬載也 而且流量控制模式可以避免管道濫填
人體工學
這個 API 致力於改善 DX 的效能,遠勝以往。簡化的錯誤處理機制 缺少容器資料類型,應能達到 較容易採用
演化
此 API 主要用於 OOT 存放區 位於 Android 平台元件中API 將持續發展 以便安全地保留及保持回溯相容性,方法是新增新的等待 get 方法。 當所有使用已淘汰方法的存放區更新至較新版本時 方法,就可以將已淘汰的方法標示為已刪除。
安全性考量
此 API 掛接到 fuchsia.ui.composition.Flatland.ViewBoundProtocols 表格,該表格會將這個 API 的伺服器端點與特定 在建立檢視表時,與父項檢視畫面相關聯的 ViewRef。
API 用戶端無法在自己的檢視畫面中要求更詳細的資訊 或在檢視區塊樹狀結構外。收到的檢視畫面參照 KOID 資訊受限定範圍 這樣可以改善該檢視區塊的安全防護機制。
焦點竊取
在更加寬鬆的系統中,惡意觀點可能會「竊取」都無法著重在 什麼都能看到Fuchsia View 系統的 聚焦政策可藉由定義 焦點移動的情境和範圍:檢視畫面只能移動焦點 且只能移動其檢視畫面內的焦點 不在子樹外。
此焦點觀察器設計遵循此焦點政策的範圍方法, 將觀測能力限制為觀測的檢視區塊及其直接子項。
KOID 無法使用
另一個微小改善是聚焦觀察器通訊協定將 子檢視畫面參照的 KOID,而非檢視畫面參照本身。部分使用者介面 通訊協定會依據檢視參照運作,因此傳回 KOID 可減少 濫用。例如,如果 Ermine 的 focus.ScopedProvider 管道端點 委派給另一個元件「C」,因為「C」是安全委派無法 假冒 Ermine 或任何 Emine 的子項檢視畫面 因此效能相當卓越
一般用途是找出哪些檢視畫面已聚焦,而該檢視區塊 的檢視表 KOID 就已足夠請注意,要求聚焦時 查看參考資料,而不只是檢視參考資料的 KOID。用戶端必須自行維護 子項檢視參照清單 (例如透過 Flatland 通訊協定取得) 清單,以及 檢視參考資料可用於要求聚焦。
隱私權注意事項
FocusChainListener 通訊協定能完全掌握 向上檢視樹狀結構刻意聚焦觀察器通訊協定 限制可見範圍,其中可見的檢視樹狀結構位於 用戶端檢視畫面。
ViewRefFocused 的範圍已限定為用戶端的檢視畫面。重點 觀察器通訊協定可將用戶端的瀏覽權限擴展至用戶端檢視畫面的直接位置 僅限子檢視。
由於這些緩解措施,我們預估隱私權受到的影響微乎其微。
測試
此實作項目包含單元測試和平台端整合測試。 此外,與其他可顯示 SDK 的 FIDL 相同,這項工具也提供 CTF 測試。
說明文件
fuchsia.dev 會提供使用說明文件指南。
缺點、替代方案和未知
這個 API 不適用於觀測焦點的所有已知使用方式。不過,前一個 社會化,進一步降低必須針對獨立開發 API 系統會按照資料類型和業務需求 將資料儲存到不同類型的儲存空間後續的 RFC 將協助處理其他的「聚焦觀察器」相互整合
既有藝術品和參考資料
舊版 FocusChainListener 相關問題
如要觀察檢視區塊樹狀結構中 檢視焦點移動的唯一方式 fuchsia.ui.focus.FocusChainListener 通訊協定。是 已淘汰,原因是:
- 可讓用戶端全域掌握檢視畫面焦點的移動位置, 會洩漏平台實作細節舉例來說, 根層級場景會在此焦點鏈中顯露,進而可讓用戶端聲明 進而防止特定平台 導入變更。
- 其中會產生 fuchsia.ui.views.ViewRef 符記 (支援 Zircon 事件配對物件,可讓採用較弱通訊協定的用戶端提出 並顯示為另一個檢視畫面