μ΄κ²μ 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 μ μ ν μμΉμ printlnμ μΆκ°νμ¬ μμ λ μ½λκ° μ¬λ°λ₯΄κ² μ€νλλμ§ νμΈνκΈ° μν΄ navigator.permissions.request({'name': 'geolocation'})
λ₯Ό νΈμΆνλ νμ΄μ§λ₯Ό μ€νν΄ λ³Ό μ μμ΅λλ€.
μ΄ @cdelerμμ μμ§λ μμ μ€μ΄μ κ°μ?
λλ μ΄κ²μ κ΄μ¬μ΄ μκ³ μ΄λ―Έ κ·Έκ²μ μ‘°μ¬νμ§λ§ μ΄κ²μ΄ κ°λ₯ν κ²½μ° IIμ μ½κ°μ μ§μΉ¨μ΄ νμν μ μμ΅λλ€.
λ΄κ° μ§λ©΄ν 첫 λ²μ§Έ λ¬Έμ λ _ports/glutin/browser.rs_μμ PermissionStatusBinding::PermissionState
λ₯Ό μ΄λ»κ² μ¬μ©ν μ μμ΅λκΉ?
@kleinph μ€ν¬λ¦½νΈμ ν¬νΈ/ embedder_traits μ λλ±ν μ΄κ±°νμ μ μν λ€μ νμμ λ°λΌ λ μ΄κ±°ν κ°μ λ³νν΄μΌ ν©λλ€.
μ’μμ, @jdm μ μλν΄
μ€ν¬λ¦½νΈ/DOMμμ μλ² λλ‘ λ©μμ§λ₯Ό 보λ΄λ μλ https://github.com/servo/servo/blob/9d9fff3b0ad843286875051e6544b3d4750d6238/components/script/dom/windowproxy.rs#L264μ μμ΅λλ€.
@highfive : λμκ² ν λΉ
μλ νμΈμ @gatoWololo! μ΄ λ¬Έμ μ κ΄μ¬μ κ°μ Έμ£Όμ μ κ°μ¬ν©λλ€. μ΄μ λΉμ μκ² ν λΉλμμ΅λλ€!
λλ κ·Έκ²μνλ λ°©λ²μ λν μΌλ°μ μΈ κ°κ°μ κ°μ§κ³ μμ΅λλ€. λμκ² λͺ
ννμ§ μμ ν κ°μ§λ μλ² λμ λ©μμ§λ₯Ό 보λ΄λ λ°©λ²μ
λλ€. #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://github.com/servo/servo/pull/20480 embedder_proxy
μ λ¬νλ κ²μ΄ ν©μλ λ°©μμ΄μμ΅λκΉ?
μλ² λμ λν λ©μμ§λ IpcSenderλ₯Ό ν¬ν¨ν μ μμΌλ©° κΆν μ½λλ μλ΅ μμ μ λκΈ°μ μΌλ‘ μ°¨λ¨νκ±°λ μμ κΈ°λ₯Ό ipc λΌμ°ν°μ μ°κ²°νκ³ μλ΅μ΄ μμ λ λ μ€λ λμ μ΄λ²€νΈ 루νμ μ΄λ²€νΈλ₯Ό μ£Όμ ν μ μμ΅λλ€.
Embedderμ ν΅μ νλ λ°©λ²μ GlobalScopeμ send_to_embedder APIλ₯Ό μΆκ°νκ³ Embedder μ±λμ 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
첫 λ²μ§Έλ κ·Έλ₯ μΆ©λν©λλ€. λ λ²μ§Έ μΆ©λμ΄ μμλμ§λ§ μμλ©λκΉ? κ·Έλμ λλ λ΄κ° μ무 κ²λ ν μ€νΈνμ§ μμλ€κ³ νμ νμ§ μμ΅λλ€.
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()
μ¬μ©μ νμΈνμ΅λλ€ λΉ Window λ²μμμ νΈμΆλ λλ§λ€ ν΄λΉ μ½λ ν¨λμ΄ λ°μν©λλ€. permission_state_invocation_results
APIλ₯Ό Window λμ GlobalScopeλ‘ μ΄λνμ¬ μμ ν΄μΌ ν©λλ€.
test-background-fetch-permission.htmlμ μ€λ₯λ₯Ό μ§μ ν΄ μ£Όμ μ κ°μ¬ν©λλ€. μμ νκΈ° μν΄ #23645λ₯Ό μ μΆνμ΅λλ€.
κ°μ¬ ν΄μ. μ κ² μ΄μ.
λΉ Window λ²μμμ νΈμΆλ λλ§λ€ ν΄λΉ μ½λλ₯Ό ν¨λ μνλ‘ λ§λλλ€. permission_state_invocation_results APIλ₯Ό Window λμ GlobalScopeλ‘ μ΄λνμ¬ μμ ν΄μΌ ν©λλ€.
μ΄κ²μ λ³λμ PR λλ λμΌν PRμ μΌλΆμ¬μΌ ν©λκΉ?
νμ€ν λ³λμ 컀λ°μ΄μ΄μΌ νμ§λ§ λ³λμ PRμΌ μλ μμ΅λλ€. μλ ν μ€νΈκ° μ΄ λ¬Έμ (#23057)λ₯Ό νμΈνλ λ° μ ν©νμ§ μμ κ²μ΄λΌκ³ μκ°ν©λλ€. κΆν μ½λκ° ν€λ리μ€λ‘ μ€νν λ ν둬ννΈ UIλ₯Ό μ΅μ νκΈ° λλ¬Έμ λλ€.
#23651μμ μ μλ μμ μ¬νμ μ¬λ°λ₯Έ λ°©ν₯μΌλ‘ μ§νλμμ§λ§ ν΄κ²°ν΄μΌ ν λͺ κ°μ§ κ²ν μκ²¬μ΄ μμκ³ μμ±μλ λ€λ₯Έ μμ μΌλ‘ μ΄λνμ΅λλ€.
@peacerebel μ΄κ²μ μμ νκΈ°μ μ’μ λ€μ νΈκ° λ κ²μ λλ€!
@PeaceRebel μ΄κ²μ μμ νκΈ°μ μ’μ λ€μ νΈκ° λ μ μμ΅λλ€!
μ΄κ²μ λ΄μΌ μ΄ν΄λ³Ό κ²μ λλ€.
@highfive ν λΉ
μλ νμΈμ @PeaceRebelμ λλ€! μ΄ λ¬Έμ μ κ΄μ¬μ κ°μ Έμ£Όμ μ κ°μ¬ν©λλ€. μ΄μ λΉμ μκ² ν λΉλμμ΅λλ€!
νλμ΄ μμ΄ ν λΉμ μ·¨μν©λλ€.
λ΄ λΆκΈ° https://github.com/iulianR/servo/tree/issue-23057-tinifiledialogs μ λ§μ€ν° μμ μλ PRμ λ³κ²½ μ¬νμ λ€μ κΈ°λ°μΌλ‘ νμ΅λλ€
κ·Έκ²μ μ’μ κ²μ λλ€!
λ¬Έμμ΄ νμμ μλ² λμ μμνλ 컀λ°μΌλ‘ λΆκΈ°λ₯Ό μ λ°μ΄νΈνμ΅λλ€.
μ΄μ PRμ λ λ²μ§Έ λΆλΆμ λ€λ£¨λ €κ³ νλ λ° μ½κ° λ§νμ΅λλ€. HostTrait
μ λν μ λ©μλκ° νμνμ§ λλ μ΄λ―Έ μ‘΄μ¬νλ prompt_yes_no()
λ©μλλ₯Ό μ¬μ©/μ
λ°μ΄νΈν΄μΌ νλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. μ λ₯Ό μν΄ λ©μλ μλͺ
μ μμ±ν΄ μ£Όμ€ μ μμ΅λλ€. κ°μ¬ ν΄μ.
μ§κΈμ prompt_yes_no λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€κ³ μκ°ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
--pref dom.permissions.enabled
Servoλ₯Ό μ€νν΄ λ³΄μΈμ.