Servo: Hapus penggunaan tinyfiledialogs dari kode skrip

Dibuat pada 19 Mar 2019  ·  36Komentar  ·  Sumber: servo/servo

Ini sangat mirip dengan https://github.com/servo/servo/issues/20428 dan https://github.com/servo/servo/issues/20429. Saat ini kode izin DOM secara langsung memanggil pustaka tinyfiledialogs untuk membuat UI izin. Sebagai gantinya, kita harus mengirim pesan ke embedder dan membuat layer embedding membuat UI.

Kode: 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

Komentar yang paling membantu

Coba jalankan Servo dengan --pref dom.permissions.enabled .

Semua 36 komentar

@highfive : tugaskan aku

Hai @ejmg! Terima kasih atas minat Anda untuk menangani masalah ini. Sekarang ditugaskan untuk Anda!

Membatalkan penetapan per permintaan di IRC.

@highfive : tugaskan aku

Hai @cdeler! Terima kasih atas minat Anda untuk menangani masalah ini. Sekarang ditugaskan untuk Anda!

Halo @jdm ,

Saya memiliki draf implementasi secara lokal. Apakah Anda tahu, bagaimana saya bisa memeriksanya secara lokal?

@cdeler Anda dapat mencoba menjalankan halaman yang memanggil navigator.permissions.request({'name': 'geolocation'}) untuk memverifikasi bahwa kode yang dimodifikasi berjalan dengan benar dengan menambahkan println di tempat yang sesuai.

Apakah Anda masih mengerjakan @cdeler ini?

Saya tertarik dengan yang ini dan sudah melihatnya, tetapi saya mungkin perlu beberapa panduan jika ini memungkinkan.
Masalah pertama yang saya hadapi adalah bagaimana saya bisa menggunakan PermissionStatusBinding::PermissionState di _ports/glutin/browser.rs_

@kleinph Anda perlu mendefinisikan enum yang setara di embedder_traits, yang tersedia untuk skrip dan port/glutin, dan kemudian mengonversi antara dua enum sesuai kebutuhan.

Oke, saya akan mencobanya @jdm . Terima kasih!

@highfive : tugaskan aku

Hai @gatoWololo! Terima kasih atas minat Anda untuk menangani masalah ini. Sekarang ditugaskan untuk Anda!

Saya memiliki pengertian umum tentang bagaimana melakukannya. Satu hal yang tidak jelas bagi saya adalah bagaimana mengirim pesan ke embedder. #20428 dan #20429 keduanya mendapatkan objek embedder_proxy langsung dari konstelasi di servo/lib.rs . Namun, melihat bagaimana struct Pemisssions dibuat, ada cukup banyak lapisan sebelum akhirnya mencapai 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.

Saya melihat ada juga window.send_to_embedder(msg); , jadi saya bisa mengirim pesan tetapi bagaimana cara mendapatkan balasan dari embedder?

Berdasarkan percakapan di sini: https://github.com/servo/servo/pull/20480 tampaknya melewati embedder_proxy apakah cara yang disepakati?

Pesan ke penyemat dapat berisi IpcSender, dan kode izin dapat memblokir penerimaan respons secara serempak, atau menghubungkan penerima ke router ipc dan menyuntikkan peristiwa ke loop peristiwa utas saat respons diterima.

Adapun cara berkomunikasi dengan embedder, saya pikir menambahkan API send_to_embedder ke GlobalScope dan menyimpan saluran embedder di GlobalScope akan masuk akal. Maka kode izin harus dapat menggunakan sesuatu seperti self.global().send_to_embedder(...) .

Pesan ke embedder dapat berisi IpcSender

Aku mengerti.

Kedengarannya bagus. Saya akan bekerja dari sini!

Jadi saya pikir saya memiliki sesuatu yang berfungsi. Tapi saya tidak benar-benar bisa mengujinya. Saya pikir itu adalah kode saya, tetapi menggunakan versi Servo yang tidak dimodifikasi, saya masih mendapatkan kesalahan:

[2019-06-25T21:25:40Z ERROR script::dom::bindings::error] Error at file:///home/gatowololo/permissionTest.html:14:9 window.navigator.permissions is undefined

Di mana permissionTest.html hanyalah salinan dari servo/tests/html/permission-test.html .

window.navigator.permissions is undefined

Saya kira Anda mungkin perlu mengaktifkannya

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

Coba jalankan Servo dengan --pref dom.permissions.enabled .

Saya mengalami kesulitan menguji implementasi saya. Membuka halaman html yang memanggil izin berfungsi (yay!). Tetapi saya tidak dapat menjalankan tes yang terkait dengan fitur ini dengan benar. Jadi saya menemukan tes yang memanggil "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) {
...

Saya kemudian mencoba menjalankan beberapa tes wpt ini:

> ./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

Yang pertama hanya crash. Yang kedua crash tapi itu diharapkan? Jadi saya tidak yakin saya telah menguji apa pun.

Ada juga beberapa tes seperti tests/html/permission-test.html yang bukan bagian dari wpt. Jadi saya tidak yakin bagaimana menjalankannya.

tes/html adalah tes manual yang dapat Anda jalankan dengan ./mach run tests/html/permission-test.html . Saya baru saja memperhatikan penggunaan as_window() dalam kode izin (https://github.com/servo/servo/blob/fd174c54ef4fa6574ae782dacccaeccd14abb936/components/script/dom/permissions.rs#L321-L322) yang akan membuat kode itu panik setiap kali dipanggil dalam lingkup non-Window. Kita perlu memperbaikinya dengan memindahkan permission_state_invocation_results API ke GlobalScope alih-alih Window.

Terima kasih telah menunjukkan kegagalan dalam test-background-fetch-permission.html - Saya telah mengajukan #23645 untuk memperbaikinya.

Terima kasih. Jadi begitu.

yang akan membuat kode itu panik setiap kali dipanggil dalam lingkup non-Window. Kita perlu memperbaikinya dengan memindahkan API permission_state_invocation_results ke GlobalScope alih-alih Window.

Haruskah ini menjadi PR yang terpisah atau bagian dari yang sama?

Itu tentu harus menjadi komit yang terpisah, tetapi bisa juga menjadi PR yang terpisah. Saya tidak mengharapkan tes otomatis bagus untuk memverifikasi masalah ini (#23057), karena kode izin menekan UI yang meminta saat dijalankan tanpa kepala.

Perbaikan yang diusulkan di #23651 berada di jalur yang benar, tetapi saya memiliki beberapa komentar ulasan yang perlu ditangani dan penulis telah beralih ke hal-hal lain.

@peacerebel Ini mungkin masalah berikutnya yang bagus untuk dikerjakan!

@PeaceRebel Ini mungkin masalah berikutnya yang bagus untuk dikerjakan!

Akan melihat ini besok.

@highfive tugaskan aku

Hai @PeaceRebel! Terima kasih atas minat Anda untuk menangani masalah ini. Sekarang ditugaskan untuk Anda!

Membatalkan penetapan karena tidak aktif.

Saya mengubah dasar perubahan PR di atas master di cabang saya https://github.com/iulianR/servo/tree/issue-23057-tinifiledialogs. Saya dapat mencoba untuk mengatasi komentar dan membuat PR baru jika Anda setuju.

Itu bagus!

Saya memperbarui cabang saya dengan komit yang mendelegasikan pemformatan string ke penyemat.

Sekarang saya agak buntu mencoba membahas bagian kedua dari PR. Saya tidak yakin apakah saya memerlukan metode baru pada HostTrait , atau apakah saya harus menggunakan/memperbarui prompt_yes_no() yang sudah ada. Mungkin Anda bisa menulis metode tanda tangan untuk saya. Terima kasih.

Saya pikir menggunakan metode Prompt_yes_no terdengar baik untuk saat ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat