[Web IDL] interfaces should inherit EventTarget instead of duplicating the EventTarge...
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Feb 2016 07:28:32 +0000 (07:28 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Feb 2016 07:28:32 +0000 (07:28 +0000)
https://bugs.webkit.org/show_bug.cgi?id=154121
<rdar://problem/24613234>

Reviewed by Gavin Barraclough.

LayoutTests/imported/w3c:

Rebaseline several W3C tests now that more checks are passing.

* web-platform-tests/dom/interfaces-expected.txt:
* web-platform-tests/html/dom/interfaces-expected.txt:

Source/WebCore:

Interfaces should inherit EventTarget instead of duplicating the
EventTarget API in their IDL. Not only the duplication is ugly and
error-prone, but this also does not match the specifications and
have subtle web-exposed differences.

This patch takes care of all interfaces except for DOMWindow and
WorkerGlobalScope. Those will be updated in the follow-up patch
as they will require a little bit more work and testing.

We should also be able to get rid of the [EventTarget] WebKit IDL
attribute in a follow-up.

No new tests, already covered by existing tests.

* Modules/battery/BatteryManager.idl:
* Modules/encryptedmedia/MediaKeySession.idl:
* Modules/indexeddb/IDBDatabase.h:
* Modules/indexeddb/IDBDatabase.idl:
* Modules/indexeddb/IDBRequest.h:
* Modules/indexeddb/IDBRequest.idl:
* Modules/indexeddb/IDBTransaction.h:
* Modules/indexeddb/IDBTransaction.idl:
* Modules/mediasession/MediaRemoteControls.idl:
* Modules/mediasource/MediaSource.h:
* Modules/mediasource/MediaSource.idl:
* Modules/mediasource/SourceBuffer.h:
* Modules/mediasource/SourceBuffer.idl:
* Modules/mediasource/SourceBufferList.h:
* Modules/mediasource/SourceBufferList.idl:
* Modules/mediastream/MediaStream.h:
* Modules/mediastream/MediaStream.idl:
* Modules/mediastream/MediaStreamTrack.h:
* Modules/mediastream/MediaStreamTrack.idl:
* Modules/mediastream/RTCDTMFSender.h:
* Modules/mediastream/RTCDTMFSender.idl:
* Modules/mediastream/RTCDataChannel.h:
* Modules/mediastream/RTCDataChannel.idl:
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCPeerConnection.idl:
* Modules/notifications/Notification.idl:
* Modules/speech/SpeechSynthesisUtterance.idl:
* Modules/webaudio/AudioContext.idl:
* Modules/webaudio/AudioNode.idl:
* Modules/websockets/WebSocket.idl:
* css/FontLoader.idl:
* dom/EventTarget.h:
* dom/MessagePort.idl:
* dom/Node.h:
* dom/Node.idl:
* dom/WebKitNamedFlow.idl:
* fileapi/FileReader.idl:
* html/MediaController.idl:
* html/track/AudioTrackList.idl:
* html/track/TextTrack.idl:
* html/track/TextTrackCue.idl:
* html/track/TextTrackList.idl:
* html/track/VideoTrackList.idl:
* loader/appcache/DOMApplicationCache.h:
* loader/appcache/DOMApplicationCache.idl:
* page/EventSource.idl:
* page/Performance.h:
* page/Performance.idl:
* workers/Worker.idl:
* xml/XMLHttpRequest.h:
* xml/XMLHttpRequest.idl:
* xml/XMLHttpRequestUpload.idl:
- Drop hardcoded EventTarget operations and inherit EventTarget instead.
- Drop JSGenerateToNativeObject / JSGenerateToJSObject IDL extended
  attributes for interfaces inheriting the EventTarget interface as
  the bindings generator now does this automatically for us.
- On native side, have EventTarget subclass ScriptWrappable instead of
  each of its subclasses doing so. The issue was that
  EventTargetOwner::finalize() was calling uncacheWrapper() with an
  EventTarget*, which would not clear inlined cached wrapped (see
  clearInlineCachedWrapper()) because EventTarget did not subclass
  ScriptWrappable. However, cacheWrapper() is called is a specific
  subtype pointer (e.g. Node*) and we would decide to create an
  inline cached wrapper because Node subclassed ScriptWrappable
  (as well as EventTarget).

* WebCore.xcodeproj/project.pbxproj:
Export JSEventTarget.h as private header to fix the build.

* bindings/js/JSDOMBinding.h:
(WebCore::wrapperKey):
(WebCore::getCachedWrapper):
(WebCore::cacheWrapper):
(WebCore::uncacheWrapper):
Use new wrapperKey() function that is generated for each bindings
class that also has wrapperOwner(). This is used instead of the
C cast to void* in order to cast to the base wrapped type to fix
issues with multiple inheritance. The issue was that cacheWrapper()
was getting called with a DOM object subtype pointer (e.g.
AudioContext*) but uncacheWrapper() was getting called with a base
wrapped type pointer (e.g. EventTarget*). Most of our DOM classes
use multiple inheritance and thus the pointer values (used as keys
in the weak map) may differ.

* bindings/js/JSTrackCustom.cpp:
(WebCore::toJS):
Call CREATE_DOM_WRAPPER() with an actual wrapped type (e.g. AudioTrack)
instead of TrackBase type. TrackBase does not have corresponding
generated bindings and therefore does not have a wrapperKey()
function.

* bindings/scripts/CodeGeneratorJS.pm:
(ShouldGenerateToWrapped):
(ShouldGenerateToJSDeclaration):
(GenerateHeader):
- Generate a wrapperKey() utility function along-side wrapperOwner()
  to help cast to the base wrapped type.
- Generate toWrapped() / toJS() utility functions for interfaces
  that inherit EventTarget as those are required by our
  implementation and this avoids having to explicitly have them in
  the IDL.

* bindings/scripts/test/*:
Rebaseline bindings tests.

LayoutTests:

Rebaseline a couple of layout tests now that interfaces inherit EventTarget
instead of duplicating the EventTarget API in their IDL.

* fast/dom/Window/window-properties-performance-expected.txt:
* fast/dom/prototype-chain-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@196466 268f45cc-cd09-0410-ab3c-d52691b4dbfc

88 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/Window/window-properties-performance-expected.txt
LayoutTests/fast/dom/prototype-chain-expected.txt
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt
LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/Modules/battery/BatteryManager.idl
Source/WebCore/Modules/encryptedmedia/MediaKeySession.idl
Source/WebCore/Modules/indexeddb/IDBDatabase.h
Source/WebCore/Modules/indexeddb/IDBDatabase.idl
Source/WebCore/Modules/indexeddb/IDBRequest.h
Source/WebCore/Modules/indexeddb/IDBRequest.idl
Source/WebCore/Modules/indexeddb/IDBTransaction.h
Source/WebCore/Modules/indexeddb/IDBTransaction.idl
Source/WebCore/Modules/mediasession/MediaRemoteControls.idl
Source/WebCore/Modules/mediasource/MediaSource.h
Source/WebCore/Modules/mediasource/MediaSource.idl
Source/WebCore/Modules/mediasource/SourceBuffer.h
Source/WebCore/Modules/mediasource/SourceBuffer.idl
Source/WebCore/Modules/mediasource/SourceBufferList.h
Source/WebCore/Modules/mediasource/SourceBufferList.idl
Source/WebCore/Modules/mediastream/MediaStream.h
Source/WebCore/Modules/mediastream/MediaStream.idl
Source/WebCore/Modules/mediastream/MediaStreamTrack.h
Source/WebCore/Modules/mediastream/MediaStreamTrack.idl
Source/WebCore/Modules/mediastream/RTCDTMFSender.h
Source/WebCore/Modules/mediastream/RTCDTMFSender.idl
Source/WebCore/Modules/mediastream/RTCDataChannel.h
Source/WebCore/Modules/mediastream/RTCDataChannel.idl
Source/WebCore/Modules/mediastream/RTCPeerConnection.h
Source/WebCore/Modules/mediastream/RTCPeerConnection.idl
Source/WebCore/Modules/notifications/Notification.idl
Source/WebCore/Modules/speech/SpeechSynthesisUtterance.idl
Source/WebCore/Modules/webaudio/AudioContext.idl
Source/WebCore/Modules/webaudio/AudioNode.idl
Source/WebCore/Modules/websockets/WebSocket.idl
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/bindings/js/JSDOMBinding.h
Source/WebCore/bindings/js/JSTrackCustom.cpp
Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/CodeGeneratorObjC.pm
Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.h
Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h
Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.h
Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.h
Source/WebCore/bindings/scripts/test/JS/JSTestException.h
Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.h
Source/WebCore/bindings/scripts/test/JS/JSTestInterface.h
Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.h
Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestNondeterministic.h
Source/WebCore/bindings/scripts/test/JS/JSTestObj.h
Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.h
Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.h
Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h
Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h
Source/WebCore/bindings/scripts/test/JS/JSattribute.h
Source/WebCore/bindings/scripts/test/JS/JSreadonly.h
Source/WebCore/bindings/scripts/test/ObjC/DOMTestEventTarget.h
Source/WebCore/bindings/scripts/test/ObjC/DOMTestEventTarget.mm
Source/WebCore/bindings/scripts/test/TestEventTarget.idl
Source/WebCore/css/FontLoader.idl
Source/WebCore/dom/EventTarget.h
Source/WebCore/dom/MessagePort.idl
Source/WebCore/dom/Node.h
Source/WebCore/dom/Node.idl
Source/WebCore/dom/WebKitNamedFlow.idl
Source/WebCore/fileapi/FileReader.idl
Source/WebCore/html/MediaController.idl
Source/WebCore/html/track/AudioTrackList.idl
Source/WebCore/html/track/TextTrack.idl
Source/WebCore/html/track/TextTrackCue.idl
Source/WebCore/html/track/TextTrackList.idl
Source/WebCore/html/track/VideoTrackList.idl
Source/WebCore/loader/appcache/DOMApplicationCache.h
Source/WebCore/loader/appcache/DOMApplicationCache.idl
Source/WebCore/page/EventSource.idl
Source/WebCore/page/Performance.h
Source/WebCore/page/Performance.idl
Source/WebCore/workers/Worker.idl
Source/WebCore/xml/XMLHttpRequest.h
Source/WebCore/xml/XMLHttpRequest.idl
Source/WebCore/xml/XMLHttpRequestUpload.idl

index 0c0928a..d1f3e96 100644 (file)
@@ -1,3 +1,17 @@
+2016-02-11  Chris Dumez  <cdumez@apple.com>
+
+        [Web IDL] interfaces should inherit EventTarget instead of duplicating the EventTarget API
+        https://bugs.webkit.org/show_bug.cgi?id=154121
+        <rdar://problem/24613234>
+
+        Reviewed by Gavin Barraclough.
+
+        Rebaseline a couple of layout tests now that interfaces inherit EventTarget
+        instead of duplicating the EventTarget API in their IDL.
+
+        * fast/dom/Window/window-properties-performance-expected.txt:
+        * fast/dom/prototype-chain-expected.txt:
+
 2016-02-11  Zalan Bujtas  <zalan@apple.com>
 
         Subpixel rendering: Make focusring painting subpixel aware.
index 666ce30..cffe168 100644 (file)
@@ -1,6 +1,8 @@
 This test dumps all of the properties that are reachable from the window.performance object, along with their types.
 
 window.performance [object Performance]
+window.performance.addEventListener [function]
+window.performance.dispatchEvent [function]
 window.performance.navigation [object PerformanceNavigation]
 window.performance.navigation.TYPE_BACK_FORWARD [number]
 window.performance.navigation.TYPE_NAVIGATE [number]
@@ -9,6 +11,7 @@ window.performance.navigation.TYPE_RESERVED [number]
 window.performance.navigation.redirectCount [number]
 window.performance.navigation.type [number]
 window.performance.now [function]
+window.performance.removeEventListener [function]
 window.performance.timing [object PerformanceTiming]
 window.performance.timing.connectEnd [number]
 window.performance.timing.connectStart [number]
index 694c033..2435f7e 100644 (file)
@@ -2,20 +2,24 @@ This page prints out the prototype chains of select DOM objects. Older versions
 
 NOTE: This test will start failing if you change the layout of a related prototype chain in WebCore. That does not necessarily mean that you have done something wrong; you may just need to check in new results.
 
------ [object HTMLDocument] (4 prototypes) -----
+----- [object HTMLDocument] (5 prototypes) -----
 
 [object Object]
 
+[object EventTargetPrototype]
+
 [object NodePrototype]
 
 [object DocumentPrototype]
 
 [object HTMLDocumentPrototype]
 
------ [object HTMLDivElement] (5 prototypes) -----
+----- [object HTMLDivElement] (6 prototypes) -----
 
 [object Object]
 
+[object EventTargetPrototype]
+
 [object NodePrototype]
 
 [object ElementPrototype]
@@ -24,10 +28,12 @@ NOTE: This test will start failing if you change the layout of a related prototy
 
 [object HTMLDivElementPrototype]
 
------ [object HTMLFormElement] (5 prototypes) -----
+----- [object HTMLFormElement] (6 prototypes) -----
 
 [object Object]
 
+[object EventTargetPrototype]
+
 [object NodePrototype]
 
 [object ElementPrototype]
index 6e126a2..da2883d 100644 (file)
@@ -1,5 +1,18 @@
 2016-02-11  Chris Dumez  <cdumez@apple.com>
 
+        [Web IDL] interfaces should inherit EventTarget instead of duplicating the EventTarget API
+        https://bugs.webkit.org/show_bug.cgi?id=154121
+        <rdar://problem/24613234>
+
+        Reviewed by Gavin Barraclough.
+
+        Rebaseline several W3C tests now that more checks are passing.
+
+        * web-platform-tests/dom/interfaces-expected.txt:
+        * web-platform-tests/html/dom/interfaces-expected.txt:
+
+2016-02-11  Chris Dumez  <cdumez@apple.com>
+
         Move 'length' property to the prototype
         https://bugs.webkit.org/show_bug.cgi?id=154051
         <rdar://problem/24577385>
index 03a745d..1aab9e6 100644 (file)
@@ -170,14 +170,10 @@ PASS MutationRecord interface: attribute nextSibling
 PASS MutationRecord interface: attribute attributeName 
 PASS MutationRecord interface: attribute attributeNamespace 
 PASS MutationRecord interface: attribute oldValue 
-FAIL Node interface: existence and properties of interface object assert_equals: prototype of Node is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS Node interface: existence and properties of interface object 
 PASS Node interface object length 
 PASS Node interface object name 
-FAIL Node interface: existence and properties of interface prototype object assert_equals: prototype of Node.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS Node interface: existence and properties of interface prototype object 
 PASS Node interface: existence and properties of interface prototype object's "constructor" property 
 PASS Node interface: constant ELEMENT_NODE on interface object 
 PASS Node interface: constant ELEMENT_NODE on interface prototype object 
index e5e6604..2680361 100644 (file)
@@ -2233,14 +2233,10 @@ FAIL VideoTrack interface: attribute kind assert_own_property: self does not hav
 FAIL VideoTrack interface: attribute label assert_own_property: self does not have own property "VideoTrack" expected property "VideoTrack" missing
 FAIL VideoTrack interface: attribute language assert_own_property: self does not have own property "VideoTrack" expected property "VideoTrack" missing
 FAIL VideoTrack interface: attribute selected assert_own_property: self does not have own property "VideoTrack" expected property "VideoTrack" missing
-FAIL MediaController interface: existence and properties of interface object assert_equals: prototype of MediaController is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS MediaController interface: existence and properties of interface object 
 PASS MediaController interface object length 
 PASS MediaController interface object name 
-FAIL MediaController interface: existence and properties of interface prototype object assert_equals: prototype of MediaController.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS MediaController interface: existence and properties of interface prototype object 
 PASS MediaController interface: existence and properties of interface prototype object's "constructor" property 
 FAIL MediaController interface: attribute readyState assert_true: The prototype object must have a property "readyState" expected true got false
 PASS MediaController interface: attribute buffered 
@@ -2312,14 +2308,10 @@ FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,
 }" did not throw
 PASS EventTarget interface: new MediaController() must inherit property "dispatchEvent" with the proper type (2) 
 PASS EventTarget interface: calling dispatchEvent(Event) on new MediaController() with too few arguments must throw TypeError 
-FAIL TextTrackList interface: existence and properties of interface object assert_equals: prototype of TextTrackList is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS TextTrackList interface: existence and properties of interface object 
 PASS TextTrackList interface object length 
 PASS TextTrackList interface object name 
-FAIL TextTrackList interface: existence and properties of interface prototype object assert_equals: prototype of TextTrackList.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS TextTrackList interface: existence and properties of interface prototype object 
 PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property 
 PASS TextTrackList interface: attribute length 
 PASS TextTrackList interface: operation getTrackById(DOMString) 
@@ -2344,14 +2336,10 @@ FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,
 }" did not throw
 PASS EventTarget interface: document.createElement("video").textTracks must inherit property "dispatchEvent" with the proper type (2) 
 PASS EventTarget interface: calling dispatchEvent(Event) on document.createElement("video").textTracks with too few arguments must throw TypeError 
-FAIL TextTrack interface: existence and properties of interface object assert_equals: prototype of TextTrack is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS TextTrack interface: existence and properties of interface object 
 PASS TextTrack interface object length 
 PASS TextTrack interface object name 
-FAIL TextTrack interface: existence and properties of interface prototype object assert_equals: prototype of TextTrack.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS TextTrack interface: existence and properties of interface prototype object 
 PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property 
 FAIL TextTrack interface: attribute kind assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function kind() {
     [native code]
@@ -2405,14 +2393,10 @@ PASS Stringification of document.createElement("video").addTextTrack("subtitles"
 PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type (0) 
 PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById" with the proper type (2) 
 PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError 
-FAIL TextTrackCue interface: existence and properties of interface object assert_equals: prototype of TextTrackCue is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS TextTrackCue interface: existence and properties of interface object 
 FAIL TextTrackCue interface object length assert_equals: wrong value for TextTrackCue.length expected 0 but got 3
 PASS TextTrackCue interface object name 
-FAIL TextTrackCue interface: existence and properties of interface prototype object assert_equals: prototype of TextTrackCue.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS TextTrackCue interface: existence and properties of interface prototype object 
 PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property 
 PASS TextTrackCue interface: attribute track 
 PASS TextTrackCue interface: attribute id 
@@ -4208,14 +4192,10 @@ PASS BeforeUnloadEvent interface object name
 PASS BeforeUnloadEvent interface: existence and properties of interface prototype object 
 PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property 
 PASS BeforeUnloadEvent interface: attribute returnValue 
-FAIL ApplicationCache interface: existence and properties of interface object assert_equals: prototype of ApplicationCache is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS ApplicationCache interface: existence and properties of interface object 
 PASS ApplicationCache interface object length 
 PASS ApplicationCache interface object name 
-FAIL ApplicationCache interface: existence and properties of interface prototype object assert_equals: prototype of ApplicationCache.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS ApplicationCache interface: existence and properties of interface prototype object 
 PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property 
 PASS ApplicationCache interface: constant UNCACHED on interface object 
 PASS ApplicationCache interface: constant UNCACHED on interface prototype object 
@@ -4406,14 +4386,10 @@ PASS MessageEvent interface: attribute lastEventId
 PASS MessageEvent interface: attribute source 
 PASS MessageEvent interface: attribute ports 
 FAIL MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],MessagePort) assert_equals: property has wrong .length expected 8 but got 0
-FAIL EventSource interface: existence and properties of interface object assert_equals: prototype of EventSource is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS EventSource interface: existence and properties of interface object 
 PASS EventSource interface object length 
 PASS EventSource interface object name 
-FAIL EventSource interface: existence and properties of interface prototype object assert_equals: prototype of EventSource.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS EventSource interface: existence and properties of interface prototype object 
 PASS EventSource interface: existence and properties of interface prototype object's "constructor" property 
 PASS EventSource interface: attribute url 
 PASS EventSource interface: attribute withCredentials 
@@ -4428,14 +4404,10 @@ PASS EventSource interface: attribute onopen
 PASS EventSource interface: attribute onmessage 
 PASS EventSource interface: attribute onerror 
 PASS EventSource interface: operation close() 
-FAIL WebSocket interface: existence and properties of interface object assert_equals: prototype of WebSocket is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS WebSocket interface: existence and properties of interface object 
 PASS WebSocket interface object length 
 PASS WebSocket interface object name 
-FAIL WebSocket interface: existence and properties of interface prototype object assert_equals: prototype of WebSocket.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS WebSocket interface: existence and properties of interface prototype object 
 PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property 
 PASS WebSocket interface: attribute url 
 PASS WebSocket interface: constant CONNECTING on interface object 
@@ -4536,14 +4508,10 @@ PASS MessageChannel interface: existence and properties of interface prototype o
 PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property 
 PASS MessageChannel interface: attribute port1 
 PASS MessageChannel interface: attribute port2 
-FAIL MessagePort interface: existence and properties of interface object assert_equals: prototype of MessagePort is not EventTarget expected function "function EventTarget() {
-    [native code]
-}" but got function "function () {
-    [native code]
-}"
+PASS MessagePort interface: existence and properties of interface object 
 PASS MessagePort interface object length 
 PASS MessagePort interface object name 
-FAIL MessagePort interface: existence and properties of interface prototype object assert_equals: prototype of MessagePort.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
+PASS MessagePort interface: existence and properties of interface prototype object 
 PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property 
 PASS MessagePort interface: operation postMessage(any,[object Object]) 
 PASS MessagePort interface: operation start() 
index f89ee00..710871b 100644 (file)
@@ -1,3 +1,130 @@
+2016-02-11  Chris Dumez  <cdumez@apple.com>
+
+        [Web IDL] interfaces should inherit EventTarget instead of duplicating the EventTarget API
+        https://bugs.webkit.org/show_bug.cgi?id=154121
+        <rdar://problem/24613234>
+
+        Reviewed by Gavin Barraclough.
+
+        Interfaces should inherit EventTarget instead of duplicating the
+        EventTarget API in their IDL. Not only the duplication is ugly and
+        error-prone, but this also does not match the specifications and
+        have subtle web-exposed differences.
+
+        This patch takes care of all interfaces except for DOMWindow and
+        WorkerGlobalScope. Those will be updated in the follow-up patch
+        as they will require a little bit more work and testing.
+
+        We should also be able to get rid of the [EventTarget] WebKit IDL
+        attribute in a follow-up.
+
+        No new tests, already covered by existing tests.
+
+        * Modules/battery/BatteryManager.idl:
+        * Modules/encryptedmedia/MediaKeySession.idl:
+        * Modules/indexeddb/IDBDatabase.h:
+        * Modules/indexeddb/IDBDatabase.idl:
+        * Modules/indexeddb/IDBRequest.h:
+        * Modules/indexeddb/IDBRequest.idl:
+        * Modules/indexeddb/IDBTransaction.h:
+        * Modules/indexeddb/IDBTransaction.idl:
+        * Modules/mediasession/MediaRemoteControls.idl:
+        * Modules/mediasource/MediaSource.h:
+        * Modules/mediasource/MediaSource.idl:
+        * Modules/mediasource/SourceBuffer.h:
+        * Modules/mediasource/SourceBuffer.idl:
+        * Modules/mediasource/SourceBufferList.h:
+        * Modules/mediasource/SourceBufferList.idl:
+        * Modules/mediastream/MediaStream.h:
+        * Modules/mediastream/MediaStream.idl:
+        * Modules/mediastream/MediaStreamTrack.h:
+        * Modules/mediastream/MediaStreamTrack.idl:
+        * Modules/mediastream/RTCDTMFSender.h:
+        * Modules/mediastream/RTCDTMFSender.idl:
+        * Modules/mediastream/RTCDataChannel.h:
+        * Modules/mediastream/RTCDataChannel.idl:
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCPeerConnection.idl:
+        * Modules/notifications/Notification.idl:
+        * Modules/speech/SpeechSynthesisUtterance.idl:
+        * Modules/webaudio/AudioContext.idl:
+        * Modules/webaudio/AudioNode.idl:
+        * Modules/websockets/WebSocket.idl:
+        * css/FontLoader.idl:
+        * dom/EventTarget.h:
+        * dom/MessagePort.idl:
+        * dom/Node.h:
+        * dom/Node.idl:
+        * dom/WebKitNamedFlow.idl:
+        * fileapi/FileReader.idl:
+        * html/MediaController.idl:
+        * html/track/AudioTrackList.idl:
+        * html/track/TextTrack.idl:
+        * html/track/TextTrackCue.idl:
+        * html/track/TextTrackList.idl:
+        * html/track/VideoTrackList.idl:
+        * loader/appcache/DOMApplicationCache.h:
+        * loader/appcache/DOMApplicationCache.idl:
+        * page/EventSource.idl:
+        * page/Performance.h:
+        * page/Performance.idl:
+        * workers/Worker.idl:
+        * xml/XMLHttpRequest.h:
+        * xml/XMLHttpRequest.idl:
+        * xml/XMLHttpRequestUpload.idl:
+        - Drop hardcoded EventTarget operations and inherit EventTarget instead.
+        - Drop JSGenerateToNativeObject / JSGenerateToJSObject IDL extended
+          attributes for interfaces inheriting the EventTarget interface as
+          the bindings generator now does this automatically for us.
+        - On native side, have EventTarget subclass ScriptWrappable instead of
+          each of its subclasses doing so. The issue was that
+          EventTargetOwner::finalize() was calling uncacheWrapper() with an
+          EventTarget*, which would not clear inlined cached wrapped (see
+          clearInlineCachedWrapper()) because EventTarget did not subclass
+          ScriptWrappable. However, cacheWrapper() is called is a specific
+          subtype pointer (e.g. Node*) and we would decide to create an
+          inline cached wrapper because Node subclassed ScriptWrappable
+          (as well as EventTarget).
+
+        * WebCore.xcodeproj/project.pbxproj:
+        Export JSEventTarget.h as private header to fix the build.
+
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::wrapperKey):
+        (WebCore::getCachedWrapper):
+        (WebCore::cacheWrapper):
+        (WebCore::uncacheWrapper):
+        Use new wrapperKey() function that is generated for each bindings
+        class that also has wrapperOwner(). This is used instead of the
+        C cast to void* in order to cast to the base wrapped type to fix
+        issues with multiple inheritance. The issue was that cacheWrapper()
+        was getting called with a DOM object subtype pointer (e.g.
+        AudioContext*) but uncacheWrapper() was getting called with a base
+        wrapped type pointer (e.g. EventTarget*). Most of our DOM classes
+        use multiple inheritance and thus the pointer values (used as keys
+        in the weak map) may differ.
+
+        * bindings/js/JSTrackCustom.cpp:
+        (WebCore::toJS):
+        Call CREATE_DOM_WRAPPER() with an actual wrapped type (e.g. AudioTrack)
+        instead of TrackBase type. TrackBase does not have corresponding
+        generated bindings and therefore does not have a wrapperKey()
+        function.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (ShouldGenerateToWrapped):
+        (ShouldGenerateToJSDeclaration):
+        (GenerateHeader):
+        - Generate a wrapperKey() utility function along-side wrapperOwner()
+          to help cast to the base wrapped type.
+        - Generate toWrapped() / toJS() utility functions for interfaces
+          that inherit EventTarget as those are required by our
+          implementation and this avoids having to explicitly have them in
+          the IDL.
+
+        * bindings/scripts/test/*:
+        Rebaseline bindings tests.
+
 2016-02-11  Brent Fulgham  <bfulgham@apple.com>
 
         Optimize texture-complete checks
index eda1d51..b81edd2 100644 (file)
@@ -23,7 +23,7 @@
     Conditional=BATTERY_STATUS,
     ActiveDOMObject,
     EventTarget,
-] interface BatteryManager {
+] interface BatteryManager : EventTarget {
     readonly attribute boolean charging;
     readonly attribute unrestricted double chargingTime;
     readonly attribute unrestricted double dischargingTime;
@@ -33,9 +33,4 @@
     attribute EventHandler onchargingtimechange;
     attribute EventHandler ondischargingtimechange;
     attribute EventHandler onlevelchange;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 2e6ac01..85afd2d 100644 (file)
@@ -28,7 +28,7 @@
     EventTarget,
     InterfaceName=WebKitMediaKeySession,
     ActiveDOMObject,
-] interface MediaKeySession {
+] interface MediaKeySession : EventTarget {
     // error state
     readonly attribute MediaKeyError error;
 
@@ -43,9 +43,4 @@
     attribute EventHandler onwebkitkeyadded;
     attribute EventHandler onwebkitkeyerror;
     attribute EventHandler onwebkitkeymessage;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index e96ecef..f8476d8 100644 (file)
@@ -46,7 +46,7 @@ class ScriptExecutionContext;
 
 struct ExceptionCodeWithMessage;
 
-class IDBDatabase : public RefCounted<IDBDatabase>, public ScriptWrappable, public EventTargetWithInlineData, public ActiveDOMObject {
+class IDBDatabase : public RefCounted<IDBDatabase>, public EventTargetWithInlineData, public ActiveDOMObject {
 public:
     virtual ~IDBDatabase() { }
 
index cf3d9d4..686c378 100644 (file)
@@ -28,8 +28,6 @@
     Conditional=INDEXED_DATABASE,
     ActiveDOMObject,
     EventTarget,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
     EnabledAtRuntime=IndexedDB,
     SkipVTableValidation,
 ] interface IDBDatabase : EventTarget {
index f41b174..9d7056e 100644 (file)
@@ -53,7 +53,7 @@ enum class IDBRequestReadyState {
     DeprecatedEarlyDeath = 3, // FIXME: https://bugs.webkit.org/show_bug.cgi?id=149117 - Remove this when removing LegacyIDB
 };
 
-class IDBRequest : public ScriptWrappable, public EventTargetWithInlineData, public ActiveDOMObject {
+class IDBRequest : public EventTargetWithInlineData, public ActiveDOMObject {
 public:
     virtual ~IDBRequest() { }
 
index de7cc5a..83cb9d8 100644 (file)
@@ -32,8 +32,6 @@
     EnabledAtRuntime=IndexedDB,
     ActiveDOMObject,
     EventTarget,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
     SkipVTableValidation,
     GenerateIsReachable=Impl,
 ] interface IDBRequest : EventTarget {
index 0043e00..5f156af 100644 (file)
@@ -48,7 +48,7 @@ class IDBOpenDBRequest;
 struct ExceptionCodeWithMessage;
 struct IDBObjectStoreMetadata;
 
-class IDBTransaction : public ScriptWrappable, public RefCounted<IDBTransaction>, public EventTargetWithInlineData, public ActiveDOMObject {
+class IDBTransaction : public RefCounted<IDBTransaction>, public EventTargetWithInlineData, public ActiveDOMObject {
 public:
     virtual ~IDBTransaction() { }
 
index da27b28..857d937 100644 (file)
@@ -28,8 +28,6 @@
     Conditional=INDEXED_DATABASE,
     ActiveDOMObject,
     EventTarget,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
     EnabledAtRuntime=IndexedDB,
     SkipVTableValidation,
 ] interface IDBTransaction : EventTarget {
index 8a6eb28..3416d5e 100644 (file)
@@ -28,7 +28,6 @@
     Constructor,
     ConstructorCallWith=ScriptExecutionContext,
     EventTarget,
-    JSGenerateToJSObject,
 ] interface MediaRemoteControls : EventTarget {
     attribute boolean previousTrackEnabled;
     attribute boolean nextTrackEnabled;
index a4f4a5c..10502e7 100644 (file)
@@ -49,7 +49,7 @@ namespace WebCore {
 
 class GenericEventQueue;
 
-class MediaSource : public MediaSourcePrivateClient, public ActiveDOMObject, public EventTargetWithInlineData, public ScriptWrappable, public URLRegistrable {
+class MediaSource : public MediaSourcePrivateClient, public ActiveDOMObject, public EventTargetWithInlineData, public URLRegistrable {
 public:
     static void setRegistry(URLRegistry*);
     static MediaSource* lookup(const String& url) { return s_registry ? static_cast<MediaSource*>(s_registry->lookup(url)) : 0; }
index 9ba3f02..314e4cd 100644 (file)
@@ -38,8 +38,6 @@ enum EndOfStreamError {
     ActiveDOMObject,
     EventTarget,
     EnabledBySetting=MediaSource,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
     Constructor,
     ConstructorCallWith=ScriptExecutionContext,
 ] interface MediaSource : EventTarget {
index 8f3d034..555a31f 100644 (file)
@@ -59,7 +59,7 @@ class TextTrackList;
 class TimeRanges;
 class VideoTrackList;
 
-class SourceBuffer final : public RefCounted<SourceBuffer>, public ActiveDOMObject, public EventTargetWithInlineData, public ScriptWrappable, public SourceBufferPrivateClient, public AudioTrackClient, public VideoTrackClient, public TextTrackClient {
+class SourceBuffer final : public RefCounted<SourceBuffer>, public ActiveDOMObject, public EventTargetWithInlineData, public SourceBufferPrivateClient, public AudioTrackClient, public VideoTrackClient, public TextTrackClient {
 public:
     static Ref<SourceBuffer> create(Ref<SourceBufferPrivate>&&, MediaSource*);
 
index dd39ee7..6342665 100644 (file)
@@ -38,8 +38,6 @@
     NoInterfaceObject,
     ActiveDOMObject,
     EventTarget,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
 ] interface SourceBuffer : EventTarget {
 
     [SetterRaisesException] attribute AppendMode mode;
index 4bf3617..150f339 100644 (file)
@@ -43,7 +43,7 @@ namespace WebCore {
 
 class SourceBuffer;
 
-class SourceBufferList final : public RefCounted<SourceBufferList>, public ScriptWrappable, public EventTargetWithInlineData {
+class SourceBufferList final : public RefCounted<SourceBufferList>, public EventTargetWithInlineData {
 public:
     static Ref<SourceBufferList> create(ScriptExecutionContext* context)
     {
index d3b36df..a73f9cf 100644 (file)
@@ -32,8 +32,6 @@
     Conditional=MEDIA_SOURCE,
     NoInterfaceObject,
     EventTarget,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
     GenerateIsReachable=Impl,
     CallWith=ScriptExecutionContext,
 ] interface SourceBufferList : EventTarget {
index cd253da..c664a68 100644 (file)
@@ -44,7 +44,7 @@
 
 namespace WebCore {
 
-class MediaStream final : public URLRegistrable, public ScriptWrappable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, public RefCounted<MediaStream> {
+class MediaStream final : public URLRegistrable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, public RefCounted<MediaStream> {
 public:
     class Observer {
     public:
index 6022285..89a5479 100644 (file)
@@ -29,7 +29,7 @@
     Constructor(MediaStream stream),
     Constructor(MediaStreamTrack[] tracks),
     ConstructorCallWith=ScriptExecutionContext,
-] interface MediaStream {
+] interface MediaStream : EventTarget {
 
     readonly attribute DOMString id;
 
     attribute EventHandler oninactive;
     attribute EventHandler onaddtrack;
     attribute EventHandler onremovetrack;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index 76f212d..edb495b 100644 (file)
@@ -48,7 +48,7 @@ class MediaConstraintsImpl;
 class MediaSourceSettings;
 class MediaTrackConstraints;
 
-class MediaStreamTrack final : public RefCounted<MediaStreamTrack>, public ScriptWrappable, public ActiveDOMObject, public EventTargetWithInlineData, public MediaStreamTrackPrivate::Observer {
+class MediaStreamTrack final : public RefCounted<MediaStreamTrack>, public ActiveDOMObject, public EventTargetWithInlineData, public MediaStreamTrackPrivate::Observer {
 public:
     class Observer {
     public:
index 338f632..b241f6b 100644 (file)
@@ -30,7 +30,7 @@ enum MediaStreamTrackState { "new", "live", "ended" };
     EventTarget,
     ActiveDOMObject,
     SkipVTableValidation,
-] interface MediaStreamTrack {
+] interface MediaStreamTrack : EventTarget {
     readonly attribute DOMString kind;
     readonly attribute DOMString id;
     readonly attribute DOMString label;
@@ -52,10 +52,5 @@ enum MediaStreamTrackState { "new", "live", "ended" };
     void applyConstraints(Dictionary constraints);
 
     attribute EventHandler onoverconstrained;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index 9992ce0..f080a9f 100644 (file)
@@ -41,7 +41,7 @@ class MediaStreamTrack;
 class RTCPeerConnectionHandler;
 class RTCDTMFSenderHandler;
 
-class RTCDTMFSender final : public RefCounted<RTCDTMFSender>, public ScriptWrappable, public EventTargetWithInlineData, public RTCDTMFSenderHandlerClient, public ActiveDOMObject {
+class RTCDTMFSender final : public RefCounted<RTCDTMFSender>, public EventTargetWithInlineData, public RTCDTMFSenderHandlerClient, public ActiveDOMObject {
 public:
     static RefPtr<RTCDTMFSender> create(ScriptExecutionContext*, RTCPeerConnectionHandler*, PassRefPtr<MediaStreamTrack>, ExceptionCode&);
     ~RTCDTMFSender();
index fb86aff..168667c 100644 (file)
@@ -28,7 +28,7 @@
     Conditional=MEDIA_STREAM,
     ActiveDOMObject,
     EventTarget,
-] interface RTCDTMFSender {
+] interface RTCDTMFSender : EventTarget {
     readonly attribute boolean canInsertDTMF;
     readonly attribute MediaStreamTrack track;
     readonly attribute DOMString toneBuffer;
@@ -38,9 +38,4 @@
     [RaisesException] void insertDTMF(DOMString tones, optional long duration, optional long interToneGap);
 
     attribute EventHandler ontonechange;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 4a7a5af..ea5f471 100644 (file)
@@ -45,7 +45,7 @@ class Dictionary;
 class RTCDataChannelHandler;
 class RTCPeerConnectionHandler;
 
-class RTCDataChannel final : public RefCounted<RTCDataChannel>, public ScriptWrappable, public EventTargetWithInlineData, public RTCDataChannelHandlerClient {
+class RTCDataChannel final : public RefCounted<RTCDataChannel>, public EventTargetWithInlineData, public RTCDataChannelHandlerClient {
 public:
     static Ref<RTCDataChannel> create(ScriptExecutionContext*, std::unique_ptr<RTCDataChannelHandler>);
     static RefPtr<RTCDataChannel> create(ScriptExecutionContext*, RTCPeerConnectionHandler*, const String& label, const Dictionary& options, ExceptionCode&);
index e9919ff..b495887 100644 (file)
@@ -26,7 +26,7 @@
     NoInterfaceObject,
     Conditional=MEDIA_STREAM,
     EventTarget,
-] interface RTCDataChannel {
+] interface RTCDataChannel : EventTarget {
     readonly attribute DOMString label;
     readonly attribute boolean ordered;
     readonly attribute unsigned short maxRetransmitTime;
@@ -50,9 +50,4 @@
     attribute EventHandler onerror;
     attribute EventHandler onclose;
     attribute EventHandler onmessage;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 28e91f6..280a6fa 100644 (file)
@@ -59,7 +59,7 @@ class RTCPeerConnectionErrorCallback;
 class RTCSessionDescription;
 class RTCStatsCallback;
 
-class RTCPeerConnection final : public RefCounted<RTCPeerConnection>, public ScriptWrappable, public PeerConnectionBackendClient, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
+class RTCPeerConnection final : public RefCounted<RTCPeerConnection>, public PeerConnectionBackendClient, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
 public:
     static RefPtr<RTCPeerConnection> create(ScriptExecutionContext&, const Dictionary& rtcConfiguration, ExceptionCode&);
     ~RTCPeerConnection();
index 8dee3ce..62ae810 100644 (file)
@@ -38,7 +38,7 @@
     ConstructorRaisesException,
     EventTarget,
     InterfaceName=webkitRTCPeerConnection,
-] interface RTCPeerConnection {
+] interface RTCPeerConnection : EventTarget {
 
     // Private functions called by runQueuedOperation() (RTCPeerConnectionInternals.js)
     [Private] Promise queuedCreateOffer(optional Dictionary offerOptions);
     attribute EventHandler oniceconnectionstatechange;
     attribute EventHandler onicegatheringstatechange;
     attribute EventHandler ondatachannel;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 8675223..a729ba2 100644 (file)
@@ -37,7 +37,7 @@
     Constructor(DOMString title, [Default=Undefined] optional Dictionary options),
     ConstructorCallWith=Document,
 #endif
-] interface Notification {
+] interface Notification : EventTarget {
     void show();
     [Conditional=LEGACY_NOTIFICATIONS] void cancel();
     [Conditional=NOTIFICATIONS] void close();
     [Conditional=LEGACY_NOTIFICATIONS] attribute DOMString dir;
     [Conditional=LEGACY_NOTIFICATIONS] attribute DOMString replaceId;
     [Conditional=NOTIFICATIONS] attribute DOMString tag;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index cad34a2..5686db7 100644 (file)
@@ -28,7 +28,8 @@
     EventTarget,
     ConstructorCallWith=ScriptExecutionContext,
     Constructor([Default=NullString] optional DOMString text)
-] interface SpeechSynthesisUtterance {
+] interface SpeechSynthesisUtterance : EventTarget
+{
     attribute DOMString text;
     attribute DOMString lang;
     attribute SpeechSynthesisVoice voice;
@@ -43,9 +44,4 @@
     attribute EventHandler onresume;
     attribute EventHandler onmark;
     attribute EventHandler onboundary;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 48a54bc..e84c07a 100644 (file)
@@ -37,7 +37,7 @@ enum AudioContextState {
     CustomConstructor,
     EventTarget,
     InterfaceName=webkitAudioContext,
-] interface AudioContext {
+] interface AudioContext : EventTarget {
     // All rendered audio ultimately connects to destination, which represents the audio hardware.
     readonly attribute AudioDestinationNode destination;
 
index 431b715..cb5b03e 100644 (file)
@@ -24,8 +24,6 @@
 
 [
     Conditional=WEB_AUDIO,
-    JSGenerateToJSObject,
-    JSGenerateToNativeObject,
     GenerateIsReachable=Impl,
     EventTarget,
 ] interface AudioNode : EventTarget {
@@ -40,8 +38,4 @@
     [RaisesException] void connect(AudioNode? destination, [Default=Undefined] optional unsigned long output, [Default=Undefined] optional unsigned long input);
     [RaisesException] void connect(AudioParam? destination, [Default=Undefined] optional unsigned long output);
     [RaisesException] void disconnect([Default=Undefined] optional unsigned long output);
-
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 51f10af..52f885f 100644 (file)
@@ -39,7 +39,7 @@
     ConstructorRaisesException,
     ConstructorCallWith=ScriptExecutionContext,
     EventTarget,
-] interface WebSocket {
+] interface WebSocket : EventTarget {
     readonly attribute DOMString URL; // Lowercased .url is the one in the spec, but leaving .URL for compatibility reasons.
     readonly attribute DOMString url;
 
@@ -69,9 +69,4 @@
     [RaisesException] void send(DOMString data);
 
     [RaisesException] void close([Clamp] optional unsigned short code, optional DOMString reason);
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 27ca1da..87a9c30 100644 (file)
                5EA725D61ACABD5700EAD17B /* NavigatorMediaDevices.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EA725CB1ACABCB500EAD17B /* NavigatorMediaDevices.h */; };
                5F2DBBE9178E3C8100141486 /* CertificateInfoMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5F2DBBE7178E332D00141486 /* CertificateInfoMac.mm */; };
                5FA904CA178E61F5004C8A2D /* CertificateInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F2DBBE8178E336900141486 /* CertificateInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               5FC7DC26CFE2563200B85AE4 /* JSEventTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FC7DC26CFE2563200B85AE5 /* JSEventTarget.h */; };
+               5FC7DC26CFE2563200B85AE4 /* JSEventTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FC7DC26CFE2563200B85AE5 /* JSEventTarget.h */; settings = {ATTRIBUTES = (Private, ); }; };
                5FE1D292178FD1F3001AA3C3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FE1D291178FD1F3001AA3C3 /* Security.framework */; };
                626CDE0E1140424C001E5A68 /* SpatialNavigation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 626CDE0C1140424C001E5A68 /* SpatialNavigation.cpp */; };
                626CDE0F1140424C001E5A68 /* SpatialNavigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 626CDE0D1140424C001E5A68 /* SpatialNavigation.h */; settings = {ATTRIBUTES = (Private, ); }; };
index 1bb3dc6..96a19cc 100644 (file)
@@ -177,6 +177,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld& world, JSC::ArrayBuff
     return static_cast<WebCoreTypedArrayController*>(world.vm().m_typedArrayController.get())->wrapperOwner();
 }
 
+inline void* wrapperKey(JSC::ArrayBuffer* domObject)
+{
+    return domObject;
+}
+
 inline JSDOMObject* getInlineCachedWrapper(DOMWrapperWorld&, void*) { return nullptr; }
 inline bool setInlineCachedWrapper(DOMWrapperWorld&, void*, JSDOMObject*, JSC::WeakHandleOwner*) { return false; }
 inline bool clearInlineCachedWrapper(DOMWrapperWorld&, void*, JSDOMObject*) { return false; }
@@ -231,7 +236,7 @@ template<typename DOMClass> inline JSC::JSObject* getCachedWrapper(DOMWrapperWor
 {
     if (JSC::JSObject* wrapper = getInlineCachedWrapper(world, domObject))
         return wrapper;
-    return world.m_wrappers.get(domObject);
+    return world.m_wrappers.get(wrapperKey(domObject));
 }
 
 template<typename DOMClass, typename WrapperClass> inline void cacheWrapper(DOMWrapperWorld& world, DOMClass* domObject, WrapperClass* wrapper)
@@ -239,14 +244,14 @@ template<typename DOMClass, typename WrapperClass> inline void cacheWrapper(DOMW
     JSC::WeakHandleOwner* owner = wrapperOwner(world, domObject);
     if (setInlineCachedWrapper(world, domObject, wrapper, owner))
         return;
-    weakAdd(world.m_wrappers, (void*)domObject, JSC::Weak<JSC::JSObject>(wrapper, owner, &world));
+    weakAdd(world.m_wrappers, wrapperKey(domObject), JSC::Weak<JSC::JSObject>(wrapper, owner, &world));
 }
 
 template<typename DOMClass, typename WrapperClass> inline void uncacheWrapper(DOMWrapperWorld& world, DOMClass* domObject, WrapperClass* wrapper)
 {
     if (clearInlineCachedWrapper(world, domObject, wrapper))
         return;
-    weakRemove(world.m_wrappers, (void*)domObject, wrapper);
+    weakRemove(world.m_wrappers, wrapperKey(domObject), wrapper);
 }
 
 #define CREATE_DOM_WRAPPER(globalObject, className, object) createWrapper<JS##className>(globalObject, static_cast<className*>(object))
index 9a9436a..fedbff6 100644 (file)
@@ -58,10 +58,6 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TrackBase* t
     if (!track)
         return jsNull();
     
-    JSObject* wrapper = getCachedWrapper(globalObject->world(), track);
-    if (wrapper)
-        return wrapper;
-    
     switch (track->type()) {
     case TrackBase::BaseTrack:
         // This should never happen.
@@ -69,12 +65,18 @@ JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject* globalObject, TrackBase* t
         break;
         
     case TrackBase::AudioTrack:
+        if (auto* wrapper = getCachedWrapper(globalObject->world(), toAudioTrack(track)))
+            return wrapper;
         return CREATE_DOM_WRAPPER(globalObject, AudioTrack, track);
 
     case TrackBase::VideoTrack:
+        if (auto* wrapper = getCachedWrapper(globalObject->world(), toVideoTrack(track)))
+            return wrapper;
         return CREATE_DOM_WRAPPER(globalObject, VideoTrack, track);
 
     case TrackBase::TextTrack:
+        if (auto* wrapper = getCachedWrapper(globalObject->world(), toTextTrack(track)))
+            return wrapper;
         return CREATE_DOM_WRAPPER(globalObject, TextTrack, track);
     }
     
index 7ec8cf0..515e09e 100644 (file)
@@ -1921,6 +1921,9 @@ sub ReadStableSymbols {
 sub GenerateInterface {
     my ($object, $interface, $defines) = @_;
 
+    # FIXME: GObject bindings do not support EventTarget as base class.
+    $interface->parent(undef) if $interface->parent && $interface->parent eq "EventTarget";
+
     # Set up some global variables
     $className = GetClassName($interface->name);
 
index a2d5bef..4d3c7d1 100644 (file)
@@ -531,9 +531,8 @@ sub ShouldGenerateToWrapped
     my ($hasParent, $interface) = @_;
 
     return 0 if not NeedsImplementationClass($interface);
-    if (!$hasParent or $interface->extendedAttributes->{"JSGenerateToNativeObject"}) {
-        return 1;
-    }
+    return 1 if !$hasParent or $interface->extendedAttributes->{"JSGenerateToNativeObject"};
+    return 1 if $interface->parent && $interface->parent eq "EventTarget";
     return 0;
 }
 
@@ -560,6 +559,7 @@ sub ShouldGenerateToJSDeclaration
     return 0 if not NeedsImplementationClass($interface);
     return 0 if $interface->name eq "AbstractView";
     return 1 if (!$hasParent or $interface->extendedAttributes->{"JSGenerateToJSObject"} or $interface->extendedAttributes->{"CustomToJSObject"});
+    return 1 if $interface->parent && $interface->parent eq "EventTarget";
     return 0;
 }
 
@@ -1243,6 +1243,11 @@ sub GenerateHeader
         push(@headerContent, "    return &owner.get();\n");
         push(@headerContent, "}\n");
         push(@headerContent, "\n");
+        push(@headerContent, "inline void* wrapperKey($implType* domObject)\n");
+        push(@headerContent, "{\n");
+        push(@headerContent, "    return domObject;\n");
+        push(@headerContent, "}\n");
+        push(@headerContent, "\n");
     }
     if (ShouldGenerateToJSDeclaration($hasParent, $interface)) {
         # Node and NodeList have custom inline implementations which thus cannot be exported.
index fd63637..fc67a28 100644 (file)
@@ -360,6 +360,10 @@ sub GenerateInterface
     $fatalError = 0;
 
     my $name = $interface->name;
+
+    # ObjC bindings only support EventTarget as base class for Node.
+    $interface->parents([grep(!/EventTarget/, @{$interface->parents})]) if $name ne "Node";
+
     my $className = GetClassName($name);
     my $parentClassName = "DOM" . GetParentImplClassName($interface);
     $isProtocol = $interface->extendedAttributes->{ObjCProtocol};
index 11745b5..8e1d336 100644 (file)
@@ -78,6 +78,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestActiveDOMObject*
     return &owner.get();
 }
 
+inline void* wrapperKey(TestActiveDOMObject* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestActiveDOMObject*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestActiveDOMObject& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestActiveDOMObject*);
index fcd337c..9e447d4 100644 (file)
@@ -77,6 +77,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestClassWithJSBuilt
     return &owner.get();
 }
 
+inline void* wrapperKey(TestClassWithJSBuiltinConstructor* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestClassWithJSBuiltinConstructor*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestClassWithJSBuiltinConstructor& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestClassWithJSBuiltinConstructor*);
index 00ca2a0..8d17bf8 100644 (file)
@@ -74,6 +74,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestCustomConstructo
     return &owner.get();
 }
 
+inline void* wrapperKey(TestCustomConstructorWithNoInterfaceObject* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestCustomConstructorWithNoInterfaceObject*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestCustomConstructorWithNoInterfaceObject& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestCustomConstructorWithNoInterfaceObject*);
index abe44d2..a3e5eea 100644 (file)
@@ -81,6 +81,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestCustomNamedGette
     return &owner.get();
 }
 
+inline void* wrapperKey(TestCustomNamedGetter* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestCustomNamedGetter*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestCustomNamedGetter& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestCustomNamedGetter*);
index 41c4f0c..ec620f8 100644 (file)
@@ -77,6 +77,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestEventConstructor
     return &owner.get();
 }
 
+inline void* wrapperKey(TestEventConstructor* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestEventConstructor*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestEventConstructor& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestEventConstructor*);
index 6bae3ee..768cd31 100644 (file)
 #include "config.h"
 #include "JSTestEventTarget.h"
 
-#include "Event.h"
 #include "ExceptionCode.h"
 #include "JSDOMBinding.h"
 #include "JSDOMConstructor.h"
-#include "JSEvent.h"
-#include "JSEventListener.h"
 #include "JSNode.h"
 #include "Node.h"
 #include "wtf/text/AtomicString.h"
 #include <runtime/Error.h>
-#include <runtime/FunctionPrototype.h>
 #include <runtime/PropertyNameArray.h>
 #include <wtf/GetPtr.h>
 
@@ -42,9 +38,6 @@ namespace WebCore {
 // Functions
 
 JSC::EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionItem(JSC::ExecState*);
-JSC::EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionAddEventListener(JSC::ExecState*);
-JSC::EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionRemoveEventListener(JSC::ExecState*);
-JSC::EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionDispatchEvent(JSC::ExecState*);
 
 // Attributes
 
@@ -80,8 +73,7 @@ typedef JSDOMConstructorNotConstructable<JSTestEventTarget> JSTestEventTargetCon
 
 template<> JSValue JSTestEventTargetConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
 {
-    UNUSED_PARAM(vm);
-    return globalObject.functionPrototype();
+    return JSEventTarget::getConstructor(vm, &globalObject);
 }
 
 template<> void JSTestEventTargetConstructor::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)
@@ -99,9 +91,6 @@ static const HashTableValue JSTestEventTargetPrototypeTableValues[] =
 {
     { "constructor", DontEnum, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestEventTargetConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestEventTargetConstructor) } },
     { "item", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestEventTargetPrototypeFunctionItem), (intptr_t) (1) } },
-    { "addEventListener", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestEventTargetPrototypeFunctionAddEventListener), (intptr_t) (2) } },
-    { "removeEventListener", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestEventTargetPrototypeFunctionRemoveEventListener), (intptr_t) (2) } },
-    { "dispatchEvent", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestEventTargetPrototypeFunctionDispatchEvent), (intptr_t) (1) } },
 };
 
 const ClassInfo JSTestEventTargetPrototype::s_info = { "TestEventTargetPrototype", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestEventTargetPrototype) };
@@ -115,13 +104,13 @@ void JSTestEventTargetPrototype::finishCreation(VM& vm)
 const ClassInfo JSTestEventTarget::s_info = { "TestEventTarget", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestEventTarget) };
 
 JSTestEventTarget::JSTestEventTarget(Structure* structure, JSDOMGlobalObject& globalObject, Ref<TestEventTarget>&& impl)
-    : JSDOMWrapper<TestEventTarget>(structure, globalObject, WTFMove(impl))
+    : JSEventTarget(structure, globalObject, WTFMove(impl))
 {
 }
 
 JSObject* JSTestEventTarget::createPrototype(VM& vm, JSGlobalObject* globalObject)
 {
-    return JSTestEventTargetPrototype::create(vm, globalObject, JSTestEventTargetPrototype::createStructure(vm, globalObject, globalObject->objectPrototype()));
+    return JSTestEventTargetPrototype::create(vm, globalObject, JSTestEventTargetPrototype::createStructure(vm, globalObject, JSEventTarget::getPrototype(vm, globalObject)));
 }
 
 JSObject* JSTestEventTarget::getPrototype(VM& vm, JSGlobalObject* globalObject)
@@ -129,12 +118,6 @@ JSObject* JSTestEventTarget::getPrototype(VM& vm, JSGlobalObject* globalObject)
     return getDOMPrototype<JSTestEventTarget>(vm, globalObject);
 }
 
-void JSTestEventTarget::destroy(JSC::JSCell* cell)
-{
-    JSTestEventTarget* thisObject = static_cast<JSTestEventTarget*>(cell);
-    thisObject->JSTestEventTarget::~JSTestEventTarget();
-}
-
 bool JSTestEventTarget::getOwnPropertySlot(JSObject* object, ExecState* state, PropertyName propertyName, PropertySlot& slot)
 {
     auto* thisObject = jsCast<JSTestEventTarget*>(object);
@@ -229,56 +212,6 @@ EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionItem(ExecState* s
     return JSValue::encode(result);
 }
 
-EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionAddEventListener(ExecState* state)
-{
-    JSValue thisValue = state->thisValue();
-    JSTestEventTarget* castedThis = jsDynamicCast<JSTestEventTarget*>(thisValue);
-    if (UNLIKELY(!castedThis))
-        return throwThisTypeError(*state, "TestEventTarget", "addEventListener");
-    ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestEventTarget::info());
-    auto& impl = castedThis->wrapped();
-    JSValue listener = state->argument(1);
-    if (UNLIKELY(!listener.isObject()))
-        return JSValue::encode(jsUndefined());
-    impl.addEventListener(state->argument(0).toString(state)->toAtomicString(state), createJSEventListenerForAdd(*state, *asObject(listener), *castedThis), state->argument(2).toBoolean(state));
-    return JSValue::encode(jsUndefined());
-}
-
-EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionRemoveEventListener(ExecState* state)
-{
-    JSValue thisValue = state->thisValue();
-    JSTestEventTarget* castedThis = jsDynamicCast<JSTestEventTarget*>(thisValue);
-    if (UNLIKELY(!castedThis))
-        return throwThisTypeError(*state, "TestEventTarget", "removeEventListener");
-    ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestEventTarget::info());
-    auto& impl = castedThis->wrapped();
-    JSValue listener = state->argument(1);
-    if (UNLIKELY(!listener.isObject()))
-        return JSValue::encode(jsUndefined());
-    impl.removeEventListener(state->argument(0).toString(state)->toAtomicString(state), createJSEventListenerForRemove(*state, *asObject(listener), *castedThis).ptr(), state->argument(2).toBoolean(state));
-    return JSValue::encode(jsUndefined());
-}
-
-EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionDispatchEvent(ExecState* state)
-{
-    JSValue thisValue = state->thisValue();
-    JSTestEventTarget* castedThis = jsDynamicCast<JSTestEventTarget*>(thisValue);
-    if (UNLIKELY(!castedThis))
-        return throwThisTypeError(*state, "TestEventTarget", "dispatchEvent");
-    ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestEventTarget::info());
-    auto& impl = castedThis->wrapped();
-    if (UNLIKELY(state->argumentCount() < 1))
-        return throwVMError(state, createNotEnoughArgumentsError(state));
-    ExceptionCode ec = 0;
-    Event* evt = JSEvent::toWrapped(state->argument(0));
-    if (UNLIKELY(state->hadException()))
-        return JSValue::encode(jsUndefined());
-    JSValue result = jsBoolean(impl.dispatchEvent(evt, ec));
-
-    setDOMException(state, ec);
-    return JSValue::encode(result);
-}
-
 void JSTestEventTarget::visitChildren(JSCell* cell, SlotVisitor& visitor)
 {
     auto* thisObject = jsCast<JSTestEventTarget*>(cell);
@@ -287,22 +220,6 @@ void JSTestEventTarget::visitChildren(JSCell* cell, SlotVisitor& visitor)
     thisObject->wrapped().visitJSEventListeners(visitor);
 }
 
-bool JSTestEventTargetOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor)
-{
-    auto* jsTestEventTarget = jsCast<JSTestEventTarget*>(handle.slot()->asCell());
-    if (jsTestEventTarget->wrapped().isFiringEventListeners())
-        return true;
-    UNUSED_PARAM(visitor);
-    return false;
-}
-
-void JSTestEventTargetOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)
-{
-    auto* jsTestEventTarget = jsCast<JSTestEventTarget*>(handle.slot()->asCell());
-    auto& world = *static_cast<DOMWrapperWorld*>(context);
-    uncacheWrapper(world, &jsTestEventTarget->wrapped(), jsTestEventTarget);
-}
-
 #if ENABLE(BINDING_INTEGRITY)
 #if PLATFORM(WIN)
 #pragma warning(disable: 4483)
index f385622..251c9ce 100644 (file)
 #ifndef JSTestEventTarget_h
 #define JSTestEventTarget_h
 
-#include "JSDOMWrapper.h"
+#include "JSEventTarget.h"
 #include "TestEventTarget.h"
-#include <wtf/NeverDestroyed.h>
 
 namespace WebCore {
 
-class JSTestEventTarget : public JSDOMWrapper<TestEventTarget> {
+class JSTestEventTarget : public JSEventTarget {
 public:
-    typedef JSDOMWrapper<TestEventTarget> Base;
+    typedef JSEventTarget Base;
     static JSTestEventTarget* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, Ref<TestEventTarget>&& impl)
     {
         globalObject->masqueradesAsUndefinedWatchpoint()->fireAll("Allocated masquerading object");
@@ -45,7 +44,6 @@ public:
     static TestEventTarget* toWrapped(JSC::JSValue);
     static bool getOwnPropertySlot(JSC::JSObject*, JSC::ExecState*, JSC::PropertyName, JSC::PropertySlot&);
     static bool getOwnPropertySlotByIndex(JSC::JSObject*, JSC::ExecState*, unsigned propertyName, JSC::PropertySlot&);
-    static void destroy(JSC::JSCell*);
 
     DECLARE_INFO;
 
@@ -58,6 +56,10 @@ public:
     static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*);
     static void visitChildren(JSCell*, JSC::SlotVisitor&);
 
+    TestEventTarget& wrapped() const
+    {
+        return static_cast<TestEventTarget&>(Base::wrapped());
+    }
 public:
     static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::MasqueradesAsUndefined | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags;
 protected:
@@ -73,18 +75,6 @@ private:
     bool nameGetter(JSC::ExecState*, JSC::PropertyName, JSC::JSValue&);
 };
 
-class JSTestEventTargetOwner : public JSC::WeakHandleOwner {
-public:
-    virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&);
-    virtual void finalize(JSC::Handle<JSC::Unknown>, void* context);
-};
-
-inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestEventTarget*)
-{
-    static NeverDestroyed<JSTestEventTargetOwner> owner;
-    return &owner.get();
-}
-
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestEventTarget*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestEventTarget& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestEventTarget*);
index b1b6fc6..e7b761a 100644 (file)
@@ -79,6 +79,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestException*)
     return &owner.get();
 }
 
+inline void* wrapperKey(TestException* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestException*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestException& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestException*);
index 26bffdd..9af6940 100644 (file)
@@ -75,6 +75,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestGenerateIsReacha
     return &owner.get();
 }
 
+inline void* wrapperKey(TestGenerateIsReachable* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestGenerateIsReachable*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestGenerateIsReachable& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestGenerateIsReachable*);
index 9b295f6..ebf0d62 100644 (file)
@@ -102,6 +102,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestInterface*)
     return &owner.get();
 }
 
+inline void* wrapperKey(TestInterface* domObject)
+{
+    return domObject;
+}
+
 WEBCORE_EXPORT JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestInterface*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestInterface& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestInterface*);
index b4644c3..da51faa 100644 (file)
@@ -75,6 +75,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestMediaQueryListLi
     return &owner.get();
 }
 
+inline void* wrapperKey(TestMediaQueryListListener* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestMediaQueryListListener*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestMediaQueryListListener& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestMediaQueryListListener*);
index a709cd1..bbdab93 100644 (file)
@@ -76,6 +76,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestNamedConstructor
     return &owner.get();
 }
 
+inline void* wrapperKey(TestNamedConstructor* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestNamedConstructor*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestNamedConstructor& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestNamedConstructor*);
index d47466d..c7f081a 100644 (file)
@@ -75,6 +75,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestNondeterministic
     return &owner.get();
 }
 
+inline void* wrapperKey(TestNondeterministic* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestNondeterministic*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestNondeterministic& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestNondeterministic*);
index 59ca494..f6ed924 100644 (file)
@@ -91,6 +91,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestObj*)
     return &owner.get();
 }
 
+inline void* wrapperKey(TestObj* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestObj*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestObj& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestObj*);
index 1252f41..f4f97aa 100644 (file)
@@ -75,6 +75,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestOverloadedConstr
     return &owner.get();
 }
 
+inline void* wrapperKey(TestOverloadedConstructors* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestOverloadedConstructors*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestOverloadedConstructors& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestOverloadedConstructors*);
index b4e2532..62b0e38 100644 (file)
@@ -82,6 +82,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestOverrideBuiltins
     return &owner.get();
 }
 
+inline void* wrapperKey(TestOverrideBuiltins* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestOverrideBuiltins*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestOverrideBuiltins& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestOverrideBuiltins*);
index 5d4f96d..3da5945 100644 (file)
@@ -81,6 +81,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestSerializedScript
     return &owner.get();
 }
 
+inline void* wrapperKey(TestSerializedScriptValueInterface* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestSerializedScriptValueInterface*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestSerializedScriptValueInterface& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestSerializedScriptValueInterface*);
index 48a9344..ea98399 100644 (file)
@@ -78,6 +78,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, TestTypedefs*)
     return &owner.get();
 }
 
+inline void* wrapperKey(TestTypedefs* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestTypedefs*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestTypedefs& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, TestTypedefs*);
index 7a4aad0..f1ee52d 100644 (file)
@@ -76,6 +76,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, attribute*)
     return &owner.get();
 }
 
+inline void* wrapperKey(attribute* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, attribute*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, attribute& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, attribute*);
index b942f1a..8b521d7 100644 (file)
@@ -75,6 +75,11 @@ inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, readonly*)
     return &owner.get();
 }
 
+inline void* wrapperKey(readonly* domObject)
+{
+    return domObject;
+}
+
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, readonly*);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, readonly& impl) { return toJS(state, globalObject, &impl); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, readonly*);
index 879f553..ef54e99 100644 (file)
 
 #import <WebCore/DOMObject.h>
 
-@class DOMEvent;
 @class DOMNode;
-@class NSString;
-@protocol DOMEventListener;
 
 WEBKIT_CLASS_AVAILABLE_MAC(9876_5)
 WEBCORE_EXPORT @interface DOMTestEventTarget : DOMObject
 - (DOMNode *)item:(unsigned)index;
-- (void)addEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture;
-- (void)removeEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture;
-- (BOOL)dispatchEvent:(DOMEvent *)evt;
 @end
index a1e58f7..6560528 100644 (file)
 #import "DOMEventInternal.h"
 #import "DOMNodeInternal.h"
 #import "DOMTestEventTargetInternal.h"
-#import "Event.h"
-#import "EventListener.h"
 #import "ExceptionHandlers.h"
 #import "JSMainThreadExecState.h"
 #import "Node.h"
-#import "ObjCEventListener.h"
 #import "TestEventTarget.h"
 #import "ThreadCheck.h"
-#import "URL.h"
 #import "WebCoreObjCExtras.h"
 #import "WebScriptObjectPrivate.h"
 #import <wtf/GetPtr.h>
     return kit(WTF::getPtr(IMPL->item(index)));
 }
 
-- (void)addEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture
-{
-    WebCore::JSMainThreadNullState state;
-    RefPtr<WebCore::EventListener> nativeEventListener = WebCore::ObjCEventListener::wrap(listener);
-    IMPL->addEventListener(type, WTF::getPtr(nativeEventListener), useCapture);
-}
-
-- (void)removeEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture
-{
-    WebCore::JSMainThreadNullState state;
-    RefPtr<WebCore::EventListener> nativeEventListener = WebCore::ObjCEventListener::wrap(listener);
-    IMPL->removeEventListener(type, WTF::getPtr(nativeEventListener), useCapture);
-}
-
-- (BOOL)dispatchEvent:(DOMEvent *)evt
-{
-    WebCore::JSMainThreadNullState state;
-    WebCore::ExceptionCode ec = 0;
-    BOOL result = IMPL->dispatchEvent(core(evt), ec);
-    WebCore::raiseOnDOMError(ec);
-    return result;
-}
-
 @end
 
 WebCore::TestEventTarget* core(DOMTestEventTarget *wrapper)
index 9d05480..2950f0a 100644 (file)
 [
     EventTarget,
     MasqueradesAsUndefined
-] interface TestEventTarget {
+] interface TestEventTarget : EventTarget {
 
     getter Node item(unsigned long index);
     getter Node (DOMString name);
-
-    void addEventListener(DOMString type, 
-                          EventListener listener, 
-                          optional boolean useCapture);
-    void removeEventListener(DOMString type, 
-                             EventListener listener, 
-                             optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event evt);
 };
 
index 18649cf..3246c2f 100644 (file)
@@ -34,7 +34,7 @@
     ActiveDOMObject,
     EventTarget,
     GenerateIsReachable=ImplDocument,
-] interface FontLoader {
+] interface FontLoader : EventTarget {
 
     attribute EventHandler onloading;
     attribute EventHandler onloadingdone;
@@ -46,8 +46,4 @@
     void loadFont(Dictionary params);
     void notifyWhenFontsReady(VoidCallback callback);
     readonly attribute boolean loading;
-
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 7077774..bc9290d 100644 (file)
@@ -34,6 +34,7 @@
 #include "EventListenerMap.h"
 #include "EventNames.h"
 #include "EventTargetInterfaces.h"
+#include "ScriptWrappable.h"
 #include <memory>
 #include <wtf/Forward.h>
 #include <wtf/HashMap.h>
@@ -108,7 +109,7 @@ DOM_EVENT_TARGET_INTERFACES_FOR_EACH(DOM_EVENT_INTERFACE_DECLARE)
 
 };
 
-class EventTarget {
+class EventTarget : public ScriptWrappable {
 public:
     void ref() { refEventTarget(); }
     void deref() { derefEventTarget(); }
index 2f4d739..4fe4fa5 100644 (file)
@@ -30,7 +30,7 @@
     GenerateIsReachable=Impl,
     ActiveDOMObject,
     EventTarget,
-] interface MessagePort {
+] interface MessagePort : EventTarget {
 // We need to have something as an ObjC binding, because MessagePort is used in MessageEvent, which already has one,
 // but we don't want to actually expose the API while it is in flux.
 #if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
     void close();
 
     attribute EventHandler onmessage;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 #endif
 };
 
index f660dd1..3f98935 100644 (file)
@@ -30,7 +30,6 @@
 #include "LayoutRect.h"
 #include "MutationObserver.h"
 #include "RenderStyleConstants.h"
-#include "ScriptWrappable.h"
 #include "TreeScope.h"
 #include <wtf/Forward.h>
 #include <wtf/ListHashSet.h>
@@ -113,7 +112,7 @@ private:
     RenderObject* m_renderer;
 };
 
-class Node : public EventTarget, public ScriptWrappable {
+class Node : public EventTarget {
     WTF_MAKE_FAST_ALLOCATED;
 
     friend class Document;
index caea509..0ad3528 100644 (file)
     CustomIsReachable,
     CustomToJSObject,
     EventTarget,
-    JSGenerateToNativeObject,
     ObjCPolymorphic,
 ] interface Node
 #if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
     : Object, EventTarget
-#endif /* defined(LANGUAGE_OBJECTIVE_C) */
+#else
+    : EventTarget
+#endif
  {
     // NodeType
     const unsigned short      ELEMENT_NODE                   = 1;
 
     void inspect();
 #endif
-
-#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
-#endif
-
 };
 
index 2e41e99..e89b0e6 100644 (file)
 [
     NoInterfaceObject,
     EventTarget,
-    JSGenerateToJSObject,
     GenerateIsReachable=ImplOwnerNodeRoot,
-] interface WebKitNamedFlow {
+] interface WebKitNamedFlow
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+: EventTarget
+#endif
+{
     readonly attribute DOMString name;
     readonly attribute boolean overset;
     readonly attribute long firstEmptyRegionIndex;
     NodeList getRegionsByContent(Node contentNode);
     NodeList getRegions();
     NodeList getContent();
-    
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index c65a880..bb49291 100644 (file)
@@ -35,7 +35,7 @@
     Constructor,
     ConstructorCallWith=ScriptExecutionContext,
     EventTarget,
-] interface FileReader {
+] interface FileReader : EventTarget {
     // ready states
     const unsigned short EMPTY = 0;
     const unsigned short LOADING = 1;
 
     readonly attribute FileError error;
 
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
-
     attribute EventHandler onloadstart;
     attribute EventHandler onprogress;
     attribute EventHandler onload;
index ee0c277..834660e 100644 (file)
@@ -27,9 +27,8 @@
     Conditional=VIDEO,
     Constructor,
     ConstructorCallWith=ScriptExecutionContext,
-    JSGenerateToJSObject,
     EventTarget,
-] interface MediaController {
+] interface MediaController : EventTarget {
     readonly attribute TimeRanges buffered;
     readonly attribute TimeRanges seekable;
 
@@ -48,9 +47,4 @@
 
     [SetterRaisesException] attribute unrestricted double volume;
     attribute boolean muted;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 8c24cab..da85af2 100644 (file)
@@ -29,7 +29,7 @@
     GenerateIsReachable=ImplElementRoot,
     EventTarget,
     JSCustomMarkFunction,
-] interface AudioTrackList {
+] interface AudioTrackList : EventTarget {
     readonly attribute unsigned long length;
     getter AudioTrack item(unsigned long index);
     AudioTrack getTrackById(DOMString id);
@@ -37,9 +37,5 @@
     attribute EventHandler onchange;
     attribute EventHandler onaddtrack;
     attribute EventHandler onremovetrack;
-
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index 8f3ae78..38befff 100644 (file)
@@ -32,7 +32,7 @@ enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters", "me
     GenerateIsReachable=ImplElementRoot,
     JSCustomMarkFunction,
     SkipVTableValidation,
-] interface TextTrack {
+] interface TextTrack : EventTarget {
     readonly attribute DOMString id;
     [CustomSetter] attribute TextTrackKind kind;
     readonly attribute DOMString label;
@@ -54,9 +54,4 @@ enum TextTrackKind { "subtitles",  "captions",  "descriptions",  "chapters", "me
     void addRegion(VTTRegion region);
     [RaisesException] void removeRegion(VTTRegion region);
 #endif
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index b772bb6..beb9a99 100644 (file)
@@ -25,7 +25,6 @@
 
 [
     Conditional=VIDEO_TRACK,
-    JSGenerateToNativeObject,
     Constructor(unrestricted double startTime, unrestricted double endTime, DOMString text),
     ConstructorCallWith=ScriptExecutionContext,
     EventTarget,
@@ -33,7 +32,7 @@
     CustomIsReachable,
     CustomToJSObject,
     SkipVTableValidation,
-] interface TextTrackCue {
+] interface TextTrackCue : EventTarget {
     readonly attribute TextTrack track;
 
     attribute DOMString id;
 
     attribute EventHandler onenter;
     attribute EventHandler onexit;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index 08cca4a..028c612 100644 (file)
@@ -28,7 +28,7 @@
     GenerateIsReachable=ImplElementRoot,
     EventTarget,
     JSCustomMarkFunction,
-] interface TextTrackList {
+] interface TextTrackList : EventTarget {
     readonly attribute unsigned long length;
     getter TextTrack item(unsigned long index);
     TextTrack getTrackById(DOMString id);
@@ -36,9 +36,5 @@
     attribute EventHandler onaddtrack;
     attribute EventHandler onchange;
     attribute EventHandler onremovetrack;
-
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index a91f778..09b6cac 100644 (file)
@@ -29,7 +29,7 @@
     GenerateIsReachable=ImplElementRoot,
     EventTarget,
     JSCustomMarkFunction,
-] interface VideoTrackList {
+] interface VideoTrackList : EventTarget {
     readonly attribute unsigned long length;
     getter VideoTrack item(unsigned long index);
     VideoTrack getTrackById(DOMString id);
@@ -38,9 +38,5 @@
     attribute EventHandler onchange;
     attribute EventHandler onaddtrack;
     attribute EventHandler onremovetrack;
-
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index 08101f4..cf64b55 100644 (file)
@@ -41,7 +41,7 @@ namespace WebCore {
 class Frame;
 class URL;
 
-class DOMApplicationCache final : public ScriptWrappable, public RefCounted<DOMApplicationCache>, public EventTargetWithInlineData, public DOMWindowProperty {
+class DOMApplicationCache final : public RefCounted<DOMApplicationCache>, public EventTargetWithInlineData, public DOMWindowProperty {
 public:
     static Ref<DOMApplicationCache> create(Frame* frame) { return adoptRef(*new DOMApplicationCache(frame)); }
     virtual ~DOMApplicationCache() { ASSERT(!m_frame); }
index f8c88e0..96033d9 100644 (file)
@@ -28,7 +28,7 @@
     DoNotCheckConstants,
     GenerateIsReachable=ImplFrame,
     InterfaceName=ApplicationCache,
-] interface DOMApplicationCache {
+] interface DOMApplicationCache : EventTarget {
     // update status
     const unsigned short UNCACHED = 0;
     const unsigned short IDLE = 1;
     attribute EventHandler onupdateready;
     attribute EventHandler oncached;
     attribute EventHandler onobsolete;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
 
index e011e41..4286f3b 100644 (file)
@@ -36,7 +36,7 @@
     ConstructorCallWith=ScriptExecutionContext,
     ConstructorRaisesException,
     EventTarget,
-] interface EventSource {
+] interface EventSource : EventTarget {
 
     readonly attribute DOMString URL; // Lowercased .url is the one in the spec, but leaving .URL for compatibility reasons.
     readonly attribute DOMString url;
     attribute EventHandler onmessage;
     attribute EventHandler onerror;
     void close();
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
-
 };
index b47afca..5bf23f1 100644 (file)
@@ -52,7 +52,7 @@ class ResourceRequest;
 class ResourceResponse;
 class UserTiming;
 
-class Performance final : public ScriptWrappable, public RefCounted<Performance>, public DOMWindowProperty, public EventTargetWithInlineData {
+class Performance final : public RefCounted<Performance>, public DOMWindowProperty, public EventTargetWithInlineData {
 public:
     static Ref<Performance> create(Frame& frame) { return adoptRef(*new Performance(frame)); }
     ~Performance();
index 81117d2..7c3dd3a 100644 (file)
@@ -33,7 +33,7 @@
 [
     Conditional=WEB_TIMING,
     EventTarget,
-] interface Performance {
+] interface Performance : EventTarget {
     readonly attribute PerformanceNavigation navigation;
     readonly attribute PerformanceTiming timing;
 
index 33c27d0..1ca8f3d 100644 (file)
@@ -27,8 +27,6 @@
 
 [
     CustomConstructor(DOMString scriptUrl),
-    JSGenerateToNativeObject,
-    JSGenerateToJSObject,
     ActiveDOMObject,
 ] interface Worker : EventTarget {
 
index 32c712f..41fdbb0 100644 (file)
@@ -49,7 +49,7 @@ class SharedBuffer;
 class TextResourceDecoder;
 class ThreadableLoader;
 
-class XMLHttpRequest final : public ScriptWrappable, public RefCounted<XMLHttpRequest>, public EventTargetWithInlineData, private ThreadableLoaderClient, public ActiveDOMObject {
+class XMLHttpRequest final : public RefCounted<XMLHttpRequest>, public EventTargetWithInlineData, private ThreadableLoaderClient, public ActiveDOMObject {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     static Ref<XMLHttpRequest> create(ScriptExecutionContext&);
index 44322f1..445f382 100644 (file)
@@ -42,7 +42,7 @@ enum XMLHttpRequestResponseType {
     ConstructorCallWith=ScriptExecutionContext,
     JSCustomMarkFunction,
     EventTarget,
-] interface XMLHttpRequest {
+] interface XMLHttpRequest : EventTarget {
     // From XMLHttpRequestEventTarget
     attribute EventHandler onabort;
     attribute EventHandler onerror;
@@ -91,9 +91,4 @@ enum XMLHttpRequestResponseType {
 
     // Extension
     [RaisesException] void overrideMimeType(DOMString override);
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };
index 763da72..04698e5 100644 (file)
@@ -29,7 +29,7 @@
 [
     GenerateIsReachable=Impl,
     EventTarget,
-] interface XMLHttpRequestUpload {
+] interface XMLHttpRequestUpload : EventTarget {
     // From XMLHttpRequestEventTarget
     attribute EventHandler onabort;
     attribute EventHandler onerror;
     attribute EventHandler onloadstart;
     attribute EventHandler onprogress;
     attribute EventHandler ontimeout;
-
-    // EventTarget interface
-    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
-    [RaisesException] boolean dispatchEvent(Event event);
 };