瀏覽代碼

LibWeb: Add an Internals API to trigger a user-activated (trusted) event

Some DOM APIs are restricted to user-activated events. For example, you
can't just invoke `navigator.clipboard.writeText` from JS - it has to be
accompanied by a user gesture, such as a mouse-down event. This adds an
Internals API to simulate such a gesture.
Timothy Flynn 1 年之前
父節點
當前提交
78d455e231

+ 8 - 0
Userland/Libraries/LibWeb/Internals/Internals.cpp

@@ -8,6 +8,8 @@
 #include <LibWeb/Bindings/InternalsPrototype.h>
 #include <LibWeb/Bindings/Intrinsics.h>
 #include <LibWeb/DOM/Document.h>
+#include <LibWeb/DOM/Event.h>
+#include <LibWeb/DOM/EventTarget.h>
 #include <LibWeb/HTML/BrowsingContext.h>
 #include <LibWeb/HTML/Window.h>
 #include <LibWeb/Internals/Internals.h>
@@ -58,4 +60,10 @@ JS::Object* Internals::hit_test(double x, double y)
     return nullptr;
 }
 
+WebIDL::ExceptionOr<bool> Internals::dispatch_user_activated_event(DOM::EventTarget& target, DOM::Event& event)
+{
+    event.set_is_trusted(true);
+    return target.dispatch_event(event);
+}
+
 }

+ 2 - 0
Userland/Libraries/LibWeb/Internals/Internals.h

@@ -21,6 +21,8 @@ public:
     void gc();
     JS::Object* hit_test(double x, double y);
 
+    WebIDL::ExceptionOr<bool> dispatch_user_activated_event(DOM::EventTarget&, DOM::Event& event);
+
 private:
     explicit Internals(JS::Realm&);
     virtual void initialize(JS::Realm&) override;

+ 3 - 0
Userland/Libraries/LibWeb/Internals/Internals.idl

@@ -1,7 +1,10 @@
+#import <DOM/EventTarget.idl>
+
 [Exposed=Nobody] interface Internals {
 
     undefined signalTextTestIsDone();
     undefined gc();
     object hitTest(double x, double y);
+    boolean dispatchUserActivatedEvent(EventTarget target, Event event);
 
 };