Servo: Entfernen Sie die Verwendung von tinyfiledialogs aus dem Skriptcode

Erstellt am 19. März 2019  ·  36Kommentare  ·  Quelle: servo/servo

Dies ist https://github.com/servo/servo/issues/20428 und https://github.com/servo/servo/issues/20429 sehr ähnlich

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

Hilfreichster Kommentar

Versuchen Sie, Servo mit --pref dom.permissions.enabled .

Alle 36 Kommentare

@highfive : weist mich zu

Hey @ejmg! Vielen Dank für Ihr Interesse, an diesem Thema zu arbeiten. Es ist Ihnen jetzt zugewiesen!

Aufheben der Zuweisung pro Anfrage im IRC.

@highfive : weist mich zu

Hallo @cdeler! Vielen Dank für Ihr Interesse, an diesem Thema zu arbeiten. Es ist Ihnen jetzt zugewiesen!

Hallo @jdm ,

Ich habe einen Implementierungsentwurf vor Ort. Wissen Sie, wie kann ich das lokal überprüfen?

@cdeler Sie können versuchen, eine Seite navigator.permissions.request({'name': 'geolocation'}) aufruft, um zu überprüfen, ob der geänderte Code korrekt ausgeführt wird, indem Sie println an den entsprechenden Stellen hinzufügen.

Arbeitest du noch an diesem @cdeler?

Ich interessiere mich für dieses und habe es mir bereits angesehen, aber ich brauche möglicherweise eine Anleitung, wenn dies möglich ist.
Das erste Problem, mit dem ich konfrontiert bin, ist, wie ich PermissionStatusBinding::PermissionState in _ports/glutin/browser.rs_ verwenden kann.

@kleinph Sie müssen eine äquivalente Aufzählung in embedder_traits definieren, die sowohl für Skripte als auch für Ports/Glutin verfügbar ist, und dann nach Bedarf zwischen den beiden Aufzählungen konvertieren.

OK, ich werde das @jdm versuchen. Vielen Dank!

Ein Beispiel für das Senden einer Nachricht von script/DOM an den Embedder finden Sie unter https://github.com/servo/servo/blob/9d9fff3b0ad843286875051e6544b3d4750d6238/components/script/dom/windowproxy.rs#L264

@highfive : weist mich zu

Hey @gatoWololo! Vielen Dank für Ihr Interesse, an diesem Thema zu arbeiten. Es ist Ihnen jetzt zugewiesen!

Ich habe ein allgemeines Gespür dafür, wie es geht. Eine Sache, die mir nicht klar ist, ist, wie die Nachricht an den Einbetter gesendet wird. Sowohl #20428 als auch #20429 erhalten ein embedder_proxy Objekt direkt aus der Konstellation in servo/lib.rs . Wenn man jedoch sieht, wie Pemisssions-Strukturen erstellt werden, gibt es einige Ebenen, bevor man schließlich zu create_constellation gelangt:

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.

Ich habe gesehen, dass es auch window.send_to_embedder(msg); , also könnte ich eine Nachricht senden, aber wie bekomme ich eine Antwort vom Einbetter?

Basierend auf dem Gespräch hier: https://github.com/servo/servo/pull/20480 scheint es, als ob das embedder_proxy der vereinbarte Weg war?

Die Nachricht an den Embedder kann einen IpcSender enthalten, und der Berechtigungscode kann entweder beim Empfang der Antwort synchron blockieren oder den Empfänger mit dem Ipc-Router verbinden und ein Ereignis in die Ereignisschleife des Threads einspeisen, wenn eine Antwort empfangen wird.

Was die Kommunikation mit dem Embedder angeht, halte ich es für sinnvoll, eine send_to_embedder-API zu GlobalScope hinzuzufügen und den Embedder-Kanal in GlobalScope zu speichern. Dann sollte der Berechtigungscode etwas wie self.global().send_to_embedder(...) .

Die Nachricht an den Embedder kann einen IpcSender enthalten

Ah ich sehe.

Hört sich gut an. Ich werde von hier aus arbeiten!

Also ich glaube, ich habe etwas, das funktioniert. Aber ich kann es nicht wirklich testen. Ich dachte, es wäre mein Code, aber mit einer unveränderten Version von Servo erhalte ich immer noch den Fehler:

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

Wobei permissionTest.html nur eine Kopie von servo/tests/html/permission-test.html .

window.navigator.permissions is undefined

Ich denke, du musst es vielleicht aktivieren

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

Versuchen Sie, Servo mit --pref dom.permissions.enabled .

Es fällt mir schwer, meine Implementierung zu testen. Das Öffnen einer HTML-Seite, die Berechtigungen aufruft, funktioniert (yay!). Aber ich bin nicht in der Lage, Tests in Bezug auf diese Funktion ordnungsgemäß auszuführen. Also finde ich Tests, die "navigator.permissions" aufrufen

> 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) {
...

Ich versuche dann, einige dieser wpt-Tests auszuführen:

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

Der erste stürzt einfach ab. Der zweite stürzt ab, aber es wird erwartet? Ich bin also nicht überzeugt, etwas getestet zu haben.

Es gibt auch einige Tests wie tests/html/permission-test.html die nicht Teil von wpt sind. Daher bin ich mir nicht sicher, wie ich sie ausführen soll.

tests/html sind manuelle Tests, die Sie mit ./mach run tests/html/permission-test.html ausführen können. Mir sind gerade die Verwendungen von as_window() im Berechtigungscode (https://github.com/servo/servo/blob/fd174c54ef4fa6574ae782dacccaeccd14abb936/components/script/dom/permissions.rs#L321-L322) aufgefallen Dieser Code gerät jedes Mal in Panik, wenn er in einem Nicht-Windows-Bereich aufgerufen wird. Wir müssen diese beheben, indem wir die permission_state_invocation_results API in GlobalScope anstelle von Window verschieben.

Vielen Dank für den Hinweis auf den Fehler in test-background-fetch-permission.html - ich habe Nr. 23645 eingereicht, um ihn zu beheben.

Vielen Dank. Ich verstehe.

Dies führt dazu, dass dieser Code jedes Mal in Panik gerät, wenn er in einem Nicht-Windows-Bereich aufgerufen wird. Wir müssen diese beheben, indem wir die API permission_state_invocation_results in GlobalScope anstelle von Window verschieben.

Soll dies eine separate PR oder Teil derselben sein?

Es sollte sicherlich ein separater Commit sein, aber es könnte auch ein separater PR sein. Ich würde nicht erwarten, dass die automatisierten Tests gut sind, um dieses Problem zu überprüfen (#23057), da der Berechtigungscode die Benutzeroberfläche mit Eingabeaufforderung unterdrückt, wenn er kopflos ausgeführt wird.

Die vorgeschlagene Korrektur in #23651 war auf dem richtigen Weg, aber ich hatte einige Rezensionskommentare, die behandelt werden mussten, und der Autor ist zu anderen Dingen übergegangen.

@peacerebel Dies könnte eine gute nächste Ausgabe sein, an der Sie arbeiten können!

@PeaceRebel Dies könnte eine gute nächste Ausgabe sein, an der Sie arbeiten können!

Werde das morgen mal anschauen.

@highfive weist mich zu

Hey @PeaceRebel! Vielen Dank für Ihr Interesse, an diesem Thema zu arbeiten. Es ist Ihnen jetzt zugewiesen!

Zuweisung aufgrund von Inaktivität aufheben.

Ich habe die Änderungen in der PR auf den Master in meinem Zweig https://github.com/iulianR/servo/tree/issue-23057-tinifiledialogs umbasiert

Das wäre toll!

Ich habe meinen Branch mit einem Commit aktualisiert, der die Zeichenfolgenformatierung an Einbetter delegiert.

Jetzt stecke ich etwas fest beim Versuch, den zweiten Teil der PR anzusprechen. Ich bin mir nicht sicher, ob ich eine neue Methode für HostTrait benötige oder ob ich die bereits vorhandene prompt_yes_no() verwenden/aktualisieren soll. Vielleicht könnten Sie die Methodensignatur für mich schreiben. Vielen Dank.

Ich denke, die Verwendung der prompt_yes_no-Methode klingt im Moment gut.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen