Servo: 从脚本代码中删除 tinyfiledialogs 的使用

创建于 2019-03-19  ·  36评论  ·  资料来源: servo/servo

这与https://github.com/servo/servo/issues/20428https://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

A-contenscript A-embedding C-assigned E-less easy

最有用的评论

尝试使用--pref dom.permissions.enabled运行 Servo。

所有36条评论

@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

我想你可能需要启用它

https://github.com/servo/servo/blob/e100af57a5bd95701b5310871e9909e3726539f0/resources/prefs.json#L17

尝试使用--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 方法听起来不错。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

gterzian picture gterzian  ·  4评论

jdm picture jdm  ·  3评论

larsbergstrom picture larsbergstrom  ·  3评论

CYBAI picture CYBAI  ·  3评论

ferjm picture ferjm  ·  3评论