这与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 工作吗?
我对这个感兴趣并且已经研究过它,但是如果可能的话,我可能需要一些指导。
我面临的第一个问题是如何在 _ports/glutin/browser.rs_ 中使用PermissionStatusBinding::PermissionState
@kleinph您需要在 embedder_traits 中定义一个等效的枚举,该枚举可用于脚本和端口/glutin,然后根据需要在两个枚举之间进行转换。
好的,我会试试@jdm 。 谢谢!
@highfive :分配给我
嘿@gatoWololo! 感谢您对解决此问题的兴趣。 现在已经分配给你了!
我对如何去做有一个大致的了解。 我不清楚的一件事是如何将消息发送到嵌入器。 #20428 和 #20429 都直接从servo/lib.rs
的星座获得embedder_proxy
对象。 然而,看看 Pemisssions 结构是如何创建的,在最终到达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 路由器并在接收到响应时将事件注入线程的事件循环。
至于如何与嵌入器进行通信,我认为在 GlobalScope 中添加一个 send_to_embedder API 并将嵌入器通道存储在 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
第一个只是崩溃。 第二个崩溃了,但这是预期的? 所以我不相信我已经测试过任何东西。
还有一些像tests/html/permission-test.html
这样的测试,它们不是 wpt 的一部分。 所以我不确定如何运行它们。
tests/html 是您可以使用./mach run tests/html/permission-test.html
运行的手动测试。 我刚刚注意到权限代码中as_window()
的使用(https://github.com/servo/servo/blob/fd174c54ef4fa6574ae782dacccaeccd14abb936/components/script/dom/permissions.rs#L321-L322)任何时候在非 Window 范围内调用该代码时都会发生恐慌。 我们需要通过将permission_state_invocation_results
API 移动到 GlobalScope 而不是 Window 来解决这些问题。
感谢您指出 test-background-fetch-permission.html 中的失败 - 我已提交 #23645 来修复它。
谢谢。 我知道了。
这将使该代码在任何时候在非 Window 范围内被调用时发生恐慌。 我们需要通过将 permission_state_invocation_results API 移动到 GlobalScope 而不是 Window 来解决这些问题。
这应该是一个单独的 PR 还是同一个 PR 的一部分?
它当然应该是一个单独的提交,但它也可以是一个单独的 PR。 我不希望自动化测试能很好地验证这个问题 (#23057),因为权限代码在无头运行时会抑制提示 UI。
#23651 中提议的修复是在正确的轨道上,但我有一些评论意见需要解决,作者已经转向其他事情。
@peacerebel这可能是一个很好的下一个问题!
@PeaceRebel这可能是一个很好的下一个问题!
明天看看这个。
@highfive分配给我
嘿@PeaceRebel! 感谢您对解决此问题的兴趣。 现在已经分配给你了!
由于不活动而取消分配。
我在我的分支https://github.com/iulianR/servo/tree/issue-23057-tinifiledialogs的 master 之上重新调整了 PR 中的更改
那很好啊!
我使用将字符串格式委托给嵌入器的提交更新了我的分支。
现在我在尝试解决 PR 的第二部分时遇到了一些困难。 我不确定是否需要在HostTrait
上使用新方法,或者是否应该使用/更新已经存在的prompt_yes_no()
。 也许你可以为我写方法签名。 谢谢。
我认为现在使用 prompt_yes_no 方法听起来不错。
最有用的评论
尝试使用
--pref dom.permissions.enabled
运行 Servo。