Browse Source

LibWeb: Replace ad-hoc EventHandler type with callback function typedef

Idan Horowitz 3 năm trước cách đây
mục cha
commit
f45d361f03

+ 0 - 23
Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp

@@ -510,18 +510,6 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
         @cpp_name@ = @parameter.optional_default_value@L;
         @cpp_name@ = @parameter.optional_default_value@L;
 )~~~");
 )~~~");
         }
         }
-    } else if (parameter.type->name == "EventHandler") {
-        // x.onfoo = function() { ... }, x.onfoo = () => { ... }, x.onfoo = {}
-        // NOTE: Anything else than an object will be treated as null. This is because EventHandler has the [LegacyTreatNonObjectAsNull] extended attribute.
-        //       Yes, you can store objects in event handler attributes. They just get ignored when there's any attempt to invoke them.
-        // FIXME: Replace this with proper support for callback function types.
-
-        scoped_generator.append(R"~~~(
-    Optional<Bindings::CallbackType> @cpp_name@;
-    if (@js_name@@js_suffix@.is_object()) {
-        @cpp_name@ = Bindings::CallbackType { JS::make_handle(&@js_name@@js_suffix@.as_object()), HTML::incumbent_settings_object() };
-    }
-)~~~");
     } else if (parameter.type->name == "Promise") {
     } else if (parameter.type->name == "Promise") {
         // NOTE: It's not clear to me where the implicit wrapping of non-Promise values in a resolved
         // NOTE: It's not clear to me where the implicit wrapping of non-Promise values in a resolved
         // Promise is defined in the spec; https://webidl.spec.whatwg.org/#idl-promise doesn't say
         // Promise is defined in the spec; https://webidl.spec.whatwg.org/#idl-promise doesn't say
@@ -1350,17 +1338,6 @@ static void generate_wrap_statement(SourceGenerator& generator, String const& va
     } else if (type.name == "Location" || type.name == "Promise" || type.name == "Uint8Array" || type.name == "Uint8ClampedArray" || type.name == "any") {
     } else if (type.name == "Location" || type.name == "Promise" || type.name == "Uint8Array" || type.name == "Uint8ClampedArray" || type.name == "any") {
         scoped_generator.append(R"~~~(
         scoped_generator.append(R"~~~(
     @result_expression@ @value@;
     @result_expression@ @value@;
-)~~~");
-    } else if (type.name == "EventHandler") {
-        // FIXME: Replace this with proper support for callback function types.
-
-        scoped_generator.append(R"~~~(
-    if (!@value@) {
-        @result_expression@ JS::js_null();
-    } else {
-        VERIFY(!@value@->callback.is_null());
-        @result_expression@ @value@->callback.cell();
-    }
 )~~~");
 )~~~");
     } else if (is<IDL::UnionType>(type)) {
     } else if (is<IDL::UnionType>(type)) {
         TODO();
         TODO();

+ 1 - 0
Userland/Libraries/LibWeb/CSS/MediaQueryList.idl

@@ -1,4 +1,5 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
 
 
 [Exposed=Window]
 [Exposed=Window]
 interface MediaQueryList : EventTarget {
 interface MediaQueryList : EventTarget {

+ 1 - 0
Userland/Libraries/LibWeb/DOM/AbortSignal.idl

@@ -1,4 +1,5 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
 
 
 [Exposed=(Window,Worker), CustomVisit]
 [Exposed=(Window,Worker), CustomVisit]
 interface AbortSignal : EventTarget {
 interface AbortSignal : EventTarget {

+ 1 - 0
Userland/Libraries/LibWeb/DOM/Document.idl

@@ -5,6 +5,7 @@
 #import <DOM/DocumentType.idl>
 #import <DOM/DocumentType.idl>
 #import <DOM/Element.idl>
 #import <DOM/Element.idl>
 #import <DOM/Event.idl>
 #import <DOM/Event.idl>
+#import <DOM/EventHandler.idl>
 #import <DOM/HTMLCollection.idl>
 #import <DOM/HTMLCollection.idl>
 #import <DOM/Node.idl>
 #import <DOM/Node.idl>
 #import <DOM/NodeFilter.idl>
 #import <DOM/NodeFilter.idl>

+ 3 - 0
Userland/Libraries/LibWeb/DOM/EventHandler.idl

@@ -0,0 +1,3 @@
+[LegacyTreatNonObjectAsNull]
+callback EventHandlerNonNull = any (Event event);
+typedef EventHandlerNonNull? EventHandler;

+ 1 - 0
Userland/Libraries/LibWeb/HTML/HTMLElement.idl

@@ -1,4 +1,5 @@
 #import <HTML/DOMStringMap.idl>
 #import <HTML/DOMStringMap.idl>
+#import <DOM/EventHandler.idl>
 
 
 interface HTMLElement : Element {
 interface HTMLElement : Element {
 
 

+ 1 - 0
Userland/Libraries/LibWeb/HTML/MessagePort.idl

@@ -1,4 +1,5 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
 
 
 interface MessagePort : EventTarget {
 interface MessagePort : EventTarget {
 
 

+ 3 - 0
Userland/Libraries/LibWeb/HTML/Worker.idl

@@ -1,3 +1,6 @@
+#import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
+
 [Exposed=(Window)]
 [Exposed=(Window)]
 interface Worker : EventTarget {
 interface Worker : EventTarget {
     constructor(DOMString scriptURL, optional WorkerOptions options = {});
     constructor(DOMString scriptURL, optional WorkerOptions options = {});

+ 1 - 0
Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.idl

@@ -1,4 +1,5 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
 #import <HTML/WorkerLocation.idl>
 #import <HTML/WorkerLocation.idl>
 #import <HTML/WorkerNavigator.idl>
 #import <HTML/WorkerNavigator.idl>
 
 

+ 1 - 0
Userland/Libraries/LibWeb/WebSockets/WebSocket.idl

@@ -1,4 +1,5 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
 
 
 interface WebSocket : EventTarget {
 interface WebSocket : EventTarget {
 
 

+ 1 - 0
Userland/Libraries/LibWeb/XHR/XMLHttpRequest.idl

@@ -1,4 +1,5 @@
 #import <XHR/XMLHttpRequestEventTarget.idl>
 #import <XHR/XMLHttpRequestEventTarget.idl>
+#import <DOM/EventHandler.idl>
 
 
 enum XMLHttpRequestResponseType {
 enum XMLHttpRequestResponseType {
   "",
   "",

+ 1 - 0
Userland/Libraries/LibWeb/XHR/XMLHttpRequestEventTarget.idl

@@ -1,4 +1,5 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventTarget.idl>
+#import <DOM/EventHandler.idl>
 
 
 interface XMLHttpRequestEventTarget : EventTarget {
 interface XMLHttpRequestEventTarget : EventTarget {