これは、 https://github.com/servo/servo/issues/20428およびhttps://github.com/servo/servo/issues/20429と非常によく似てい
コード: components/script/dom/permissions.rs
、 components/embedder_traits/lib.rs
、 ports/servo/browser.rs
、 ports/libsimpleservo/api/src/lib.rs
@highfive :割り当ててください
ねえ@ejmg! この問題に取り組むことに関心をお寄せいただき、ありがとうございます。 これであなたに割り当てられました!
IRCでのリクエストごとの割り当て解除。
@highfive :割り当ててください
ねえ@cdeler! この問題に取り組むことに関心をお寄せいただき、ありがとうございます。 これであなたに割り当てられました!
こんにちは@jdm 、
ローカルにドラフト実装があります。 どうすればローカルで確認できますか?
@cdeler navigator.permissions.request({'name': 'geolocation'})
を呼び出すページを実行して、適切な場所にprintlnを追加することにより、変更されたコードが正しく実行されることを確認してみてください。
あなたはまだこの@cdelerに取り組んでいますか?
私はこれに興味があり、すでに調べましたが、これが可能であれば、IIはいくつかのガイドが必要かもしれません。
私が直面している最初の問題は、_ports / glutin / browser.rs_でPermissionStatusBinding::PermissionState
をどのように使用できるかです。
@kleinphスクリプトとports / glutinの両方で使用できる同等の列挙型を
OK、 @ jdmを試して
script / DOMからエンベッダーにメッセージを送信する例は、 https://github.com/servo/servo/blob/9d9fff3b0ad843286875051e6544b3d4750d6238/components/script/dom/windowproxy.rs#L264にあります。
@highfive :割り当ててください
ねえ@gatoWololo! この問題に取り組むことに関心をお寄せいただき、ありがとうございます。 これであなたに割り当てられました!
私はそれを行う方法の一般的な感覚を持っています。 私にははっきりしないことの1つは、メッセージを埋め込み者に送信する方法です。 #20428と#20429はどちらも、 servo/lib.rs
コンステレーションから直接embedder_proxy
オブジェクトを取得します。 ただし、Pemissions構造体がどのように作成されるかを見ると、最終的にcreate_constellation
に到達する前にかなりの層があります。
Both of these contain Permissions:
struct WorkerNavigator
struct Navigator
WorkerNavigator is created by WorkerGlobalScope which is created by a:
- ServiceWorkerGlobalScope which is created by a ServiceWorkerManager
which is init from servo/lib.rs script::init_service_workers(sw_senders);
or
- DedicatedWorkerGlobalScope which is created by run_worker_scope() which is called
by Worker::Constructor() which does not seem to be called from anywhere...
Navigator is created by Window::Navigator(&self) it is not clear to me how a Window is
created.
window.send_to_embedder(msg);
あるので、メッセージを送信できましたが、埋め込み機能から応答を返すにはどうすればよいですか?
ここでの会話に基づいて: https : embedder_proxy
を通過することは合意された方法でしたか?
エンベッダーへのメッセージにはIpcSenderを含めることができ、アクセス許可コードは、応答の受信時に同期的にブロックするか、受信者をipcルーターに接続して、応答の受信時にスレッドのイベントループにイベントを挿入することができます。
エンベダーとの通信方法については、send_to_embedder APIをGlobalScopeに追加し、エンベダーチャネルをGlobalScopeに保存するのが賢明だと思います。 次に、権限コードはself.global().send_to_embedder(...)
ようなものを使用できるはずです。
埋め込みメッセージには、IpcSenderを含めることができます
ああ、分かった。
いいですね。 ここから働きます!
だから私は何かが働いていると思います。 しかし、私はそれを実際にテストすることはできません。 それは私のコードだと思いましたが、変更されていないバージョンのServoを使用しても、エラーが発生します。
[2019-06-25T21:25:40Z ERROR script::dom::bindings::error] Error at file:///home/gatowololo/permissionTest.html:14:9 window.navigator.permissions is undefined
ここで、 permissionTest.html
はservo/tests/html/permission-test.html
単なるコピーです。
window.navigator.permissions is undefined
私はあなたがそれを有効にする必要があるかもしれないと思います
--pref dom.permissions.enabled
Servoを実行してみてください。
実装のテストに苦労しています。 パーミッションを呼び出すhtmlページを開くと機能します(イェーイ!)。 しかし、この機能に関連するテストを適切に実行できません。 だから私は「navigator.permissions」を呼び出すテストを見つけます
> rg "navigator.permissions" *
tests/wpt/web-platform-tests/permissions/interfaces.any.js
24: self.permissionStatus = await navigator.permissions.query({ name: "geolocation" });
25: self.permissionStatus = await navigator.permissions.query({ name: "background-fetch" });
37: Permissions: ['navigator.permissions'],
tests/wpt/web-platform-tests/permissions/test-background-fetch-permission.html
10: return navigator.permissions.query({name:'background-fetch'}).then(function(result) {
...
次に、このwptテストのいくつかを実行しようとします。
> ./mach test-wpt --pref dom.permissions.enabled --release tests/wpt/web-platform-tests/permissions/interfaces.any.js
...
0:01.87 pid:4508 [2019-06-27T15:49:30Z ERROR servo] expected a Window scope
> ./mach test-wpt --pref dom.permissions.enabled --release tests/wpt/web-platform-tests/permissions/test-background-fetch-permission.html
...
0:01.65 pid:4793 [2019-06-27T15:51:24Z ERROR servo] assertion failed: !JS_IsExceptionPending(cx)
0:01.65 pid:4793 Pipeline failed in hard-fail mode. Crashing!
0:01.69 TEST_END: CRASH, expected OK
最初のものはただクラッシュします。 2つ目はクラッシュしますが、予想されますか? だから私は何かをテストしたとは確信していません。
wptの一部ではないtests/html/permission-test.html
ようないくつかのテストもあります。 だから私はそれらを実行する方法がわかりません。
tests / htmlは、 ./mach run tests/html/permission-test.html
実行できる手動テストです。 パーミッションコード(https://github.com/servo/servo/blob/fd174c54ef4fa6574ae782dacccaeccd14abb936/components/script/dom/permissions.rs#L321-L322)でas_window()
が使用されていることに気づきました。そのコードは、ウィンドウ以外のスコープで呼び出されるとパニックになります。 permission_state_invocation_results
APIをWindowではなくGlobalScopeに移動して、これらを修正する必要があります。
test-background-fetch-permission.htmlの失敗を指摘してくれてありがとう-私はそれを修正するために#23645を提出しました。
ありがとう。 分かりました。
これにより、ウィンドウ以外のスコープで呼び出されると、そのコードがパニックになります。 これを修正するには、permission_state_invocation_resultsAPIをWindowではなくGlobalScopeに移動します。
これは別のPRにするべきですか、それとも同じPRの一部にするべきですか?
確かに別のコミットである必要がありますが、別のPRである可能性もあります。 自動テストがこの問題(#23057)の検証に適しているとは思いません。これは、アクセス許可コードがヘッドレスで実行しているときにプロンプトUIを抑制するためです。
#23651で提案された修正は正しい方向に進んでいましたが、対処する必要のあるレビューコメントがいくつかあり、作成者は他のことに移りました。
@peacerebelこれは
@PeaceRebelこれは、
これを明日見ていきます。
@highfive私を割り当てます
ねえ@PeaceRebel! この問題に取り組むことに関心をお寄せいただき、ありがとうございます。 これであなたに割り当てられました!
非アクティブのために割り当てを解除します。
ブランチhttps://github.com/iulianR/servo/tree/issue-23057-tinifiledialogsのマスターの上にPRの変更をリベースしました
それは素晴らしいことです!
文字列のフォーマットをエンベッダーに委任するコミットでブランチを更新しました。
今、私はPRの2番目の部分に対処しようとして少し立ち往生しています。 HostTrait
に新しいメソッドが必要かどうか、または既存のprompt_yes_no()
メソッドを使用/更新する必要があるかどうかはわかりません。 たぶん、あなたは私のためにメソッドシグネチャを書くことができます。 ありがとう。
今のところ、prompt_yes_noメソッドの使用は問題ないと思います。
最も参考になるコメント
--pref dom.permissions.enabled
Servoを実行してみてください。