Update more events to stop using legacy [ConstructorTemplate=Event]
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Oct 2016 20:41:49 +0000 (20:41 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Oct 2016 20:41:49 +0000 (20:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=163339

Reviewed by Ryosuke Niwa.

Source/WebCore:

Update more events to stop using legacy [ConstructorTemplate=Event]
and use regular constructors instead.

No new tests, updated existing tests.

* bindings/scripts/test/JS/JSTestEventConstructor.cpp:
(WebCore::convertDictionary<TestEventConstructor::Init>):
(WebCore::JSTestEventConstructorConstructor::construct):
(WebCore::JSTestEventConstructorConstructor::prototypeForStructure):
(WebCore::JSTestEventConstructor::JSTestEventConstructor):
(WebCore::JSTestEventConstructor::createPrototype):
(WebCore::JSTestEventConstructorPrototype::create): Deleted.
(WebCore::JSTestEventConstructorPrototype::createStructure): Deleted.
(WebCore::JSTestEventConstructorPrototype::JSTestEventConstructorPrototype): Deleted.
(WebCore::setJSTestEventConstructorConstructor): Deleted.
(WebCore::JSTestEventConstructor::getConstructor): Deleted.
* bindings/scripts/test/JS/JSTestEventConstructor.h:
(WebCore::JSTestEventConstructor::wrapped):
(WebCore::JSTestEventConstructor::create): Deleted.
(WebCore::toJS): Deleted.
(WebCore::toJSNewlyCreated): Deleted.
* bindings/scripts/test/TestEventConstructor.idl:
* css/CSSFontFaceLoadEvent.cpp:
(WebCore::CSSFontFaceLoadEvent::CSSFontFaceLoadEvent):
* css/CSSFontFaceLoadEvent.h:
* css/CSSFontFaceLoadEvent.idl:
* html/canvas/WebGLContextEvent.cpp:
(WebCore::WebGLContextEvent::WebGLContextEvent):
* html/canvas/WebGLContextEvent.h:
* html/canvas/WebGLContextEvent.idl:
* storage/StorageEvent.cpp:
(WebCore::StorageEvent::create):
(WebCore::StorageEvent::StorageEvent):
* storage/StorageEvent.h:
* storage/StorageEvent.idl:

LayoutTests:

Update existing tests to reflect minor behavior changes.

* fast/events/constructors/storage-event-constructor-expected.txt:
* fast/events/constructors/storage-event-constructor.html:
* fast/events/constructors/webgl-context-event-constructor-expected.txt:
* fast/events/constructors/webgl-context-event-constructor.html:

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

22 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/events/constructors/storage-event-constructor-expected.txt
LayoutTests/fast/events/constructors/storage-event-constructor.html
LayoutTests/fast/events/constructors/webgl-context-event-constructor-expected.txt
LayoutTests/fast/events/constructors/webgl-context-event-constructor.html
LayoutTests/storage/domstorage/events/basic-expected.txt
LayoutTests/storage/domstorage/events/basic-setattribute-expected.txt
LayoutTests/storage/domstorage/events/script-tests/basic-setattribute.js
LayoutTests/storage/domstorage/events/script-tests/basic.js
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h
Source/WebCore/bindings/scripts/test/TestEventConstructor.idl
Source/WebCore/css/CSSFontFaceLoadEvent.cpp
Source/WebCore/css/CSSFontFaceLoadEvent.h
Source/WebCore/css/CSSFontFaceLoadEvent.idl
Source/WebCore/html/canvas/WebGLContextEvent.cpp
Source/WebCore/html/canvas/WebGLContextEvent.h
Source/WebCore/html/canvas/WebGLContextEvent.idl
Source/WebCore/storage/StorageEvent.cpp
Source/WebCore/storage/StorageEvent.h
Source/WebCore/storage/StorageEvent.idl

index 18fd9b0..751648e 100644 (file)
@@ -1,3 +1,17 @@
+2016-10-12  Chris Dumez  <cdumez@apple.com>
+
+        Update more events to stop using legacy [ConstructorTemplate=Event]
+        https://bugs.webkit.org/show_bug.cgi?id=163339
+
+        Reviewed by Ryosuke Niwa.
+
+        Update existing tests to reflect minor behavior changes.
+
+        * fast/events/constructors/storage-event-constructor-expected.txt:
+        * fast/events/constructors/storage-event-constructor.html:
+        * fast/events/constructors/webgl-context-event-constructor-expected.txt:
+        * fast/events/constructors/webgl-context-event-constructor.html:
+
 2016-10-12  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector: Improve support for logging Proxy objects in console
index d922563..11199bf 100644 (file)
@@ -5,7 +5,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 PASS new StorageEvent('eventType').bubbles is false
 PASS new StorageEvent('eventType').cancelable is false
-PASS new StorageEvent('eventType').key is ""
+PASS new StorageEvent('eventType').key is null
 PASS new StorageEvent('eventType').oldValue is null
 PASS new StorageEvent('eventType').newValue is null
 PASS new StorageEvent('eventType').url is ""
@@ -16,8 +16,8 @@ PASS new StorageEvent('eventType', { cancelable: false }).cancelable is false
 PASS new StorageEvent('eventType', { cancelable: true }).cancelable is true
 PASS new StorageEvent('eventType', { key: 'abcde' }).key is "abcde"
 PASS new StorageEvent('eventType', { key: '' }).key is ""
-PASS new StorageEvent('eventType', { key: undefined }).key is "undefined"
-PASS new StorageEvent('eventType', { key: null }).key is "null"
+PASS new StorageEvent('eventType', { key: undefined }).key is null
+PASS new StorageEvent('eventType', { key: null }).key is null
 PASS new StorageEvent('eventType', { key: false }).key is "false"
 PASS new StorageEvent('eventType', { key: true }).key is "true"
 PASS new StorageEvent('eventType', { key: 12345 }).key is "12345"
@@ -29,8 +29,8 @@ PASS new StorageEvent('eventType', { key: {abcde: 12345} }).key is "[object Obje
 PASS new StorageEvent('eventType', { key: {valueOf: function () { return 'abcde'; } } }).key is "[object Object]"
 PASS new StorageEvent('eventType', { oldValue: 'abcde' }).oldValue is "abcde"
 PASS new StorageEvent('eventType', { oldValue: '' }).oldValue is ""
-PASS new StorageEvent('eventType', { oldValue: undefined }).oldValue is "undefined"
-PASS new StorageEvent('eventType', { oldValue: null }).oldValue is "null"
+PASS new StorageEvent('eventType', { oldValue: undefined }).oldValue is null
+PASS new StorageEvent('eventType', { oldValue: null }).oldValue is null
 PASS new StorageEvent('eventType', { oldValue: false }).oldValue is "false"
 PASS new StorageEvent('eventType', { oldValue: true }).oldValue is "true"
 PASS new StorageEvent('eventType', { oldValue: 12345 }).oldValue is "12345"
@@ -42,8 +42,8 @@ PASS new StorageEvent('eventType', { oldValue: {abcde: 12345} }).oldValue is "[o
 PASS new StorageEvent('eventType', { oldValue: {valueOf: function () { return 'abcde'; } } }).oldValue is "[object Object]"
 PASS new StorageEvent('eventType', { newValue: 'abcde' }).newValue is "abcde"
 PASS new StorageEvent('eventType', { newValue: '' }).newValue is ""
-PASS new StorageEvent('eventType', { newValue: undefined }).newValue is "undefined"
-PASS new StorageEvent('eventType', { newValue: null }).newValue is "null"
+PASS new StorageEvent('eventType', { newValue: undefined }).newValue is null
+PASS new StorageEvent('eventType', { newValue: null }).newValue is null
 PASS new StorageEvent('eventType', { newValue: false }).newValue is "false"
 PASS new StorageEvent('eventType', { newValue: true }).newValue is "true"
 PASS new StorageEvent('eventType', { newValue: 12345 }).newValue is "12345"
@@ -55,7 +55,7 @@ PASS new StorageEvent('eventType', { newValue: {abcde: 12345} }).newValue is "[o
 PASS new StorageEvent('eventType', { newValue: {valueOf: function () { return 'abcde'; } } }).newValue is "[object Object]"
 PASS new StorageEvent('eventType', { url: 'abcde' }).url is "abcde"
 PASS new StorageEvent('eventType', { url: '' }).url is ""
-PASS new StorageEvent('eventType', { url: undefined }).url is "undefined"
+PASS new StorageEvent('eventType', { url: undefined }).url is ""
 PASS new StorageEvent('eventType', { url: null }).url is "null"
 PASS new StorageEvent('eventType', { url: false }).url is "false"
 PASS new StorageEvent('eventType', { url: true }).url is "true"
@@ -68,20 +68,20 @@ PASS new StorageEvent('eventType', { url: {abcde: 12345} }).url is "[object Obje
 PASS new StorageEvent('eventType', { url: {valueOf: function () { return 'abcde'; } } }).url is "[object Object]"
 PASS new StorageEvent('eventType', { storageArea: localStorage }).storageArea is localStorage
 PASS new StorageEvent('eventType', { storageArea: sessionStorage }).storageArea is sessionStorage
-PASS new StorageEvent('eventType', { storageArea: test_object }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: window }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: document }).storageArea is null
+PASS new StorageEvent('eventType', { storageArea: test_object }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: window }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: document }) threw exception TypeError: Type error.
 PASS new StorageEvent('eventType', { storageArea: undefined }).storageArea is null
 PASS new StorageEvent('eventType', { storageArea: null }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: false }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: true }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: '' }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: 'chocolate' }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: 12345 }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: 18446744073709551615 }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: NaN }).storageArea is null
-PASS new StorageEvent('eventType', { storageArea: {valueOf: function () { return window; } } }).storageArea == window is false
-PASS new StorageEvent('eventType', { get storageArea() { return 123; } }).storageArea is null
+PASS new StorageEvent('eventType', { storageArea: false }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: true }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: '' }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: 'chocolate' }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: 12345 }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: 18446744073709551615 }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: NaN }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { storageArea: {valueOf: function () { return window; } } }) threw exception TypeError: Type error.
+PASS new StorageEvent('eventType', { get storageArea() { return 123; } }).storageArea threw exception TypeError: Type error.
 PASS new StorageEvent('eventType', { get storageArea() { throw 'StorageEvent Error'; } }) threw exception StorageEvent Error.
 PASS new StorageEvent('eventType', { bubbles: true, cancelable: false, key: 'abc', oldValue: 'def', newValue: 'ghi', url: 'jkl', storageArea: localStorage }).bubbles is true
 PASS new StorageEvent('eventType', { bubbles: false, cancelable: true, key: 'abc', oldValue: 'def', newValue: 'ghi', url: 'jkl', storageArea: localStorage }).cancelable is true
index 2f2c90e..89b32a8 100644 (file)
@@ -13,7 +13,7 @@ description("This tests the constructor for the StorageEvent DOM class.");
 // No initializer is passed.
 shouldBe("new StorageEvent('eventType').bubbles", "false");
 shouldBe("new StorageEvent('eventType').cancelable", "false");
-shouldBeEqualToString("new StorageEvent('eventType').key", "");
+shouldBe("new StorageEvent('eventType').key", "null");
 // Note: oldValue is nullable.
 shouldBe("new StorageEvent('eventType').oldValue", "null");
 // Note: newValue is nullable.
@@ -36,8 +36,14 @@ shouldBe("new StorageEvent('eventType', { cancelable: true }).cancelable", "true
     shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": '' })." + attr, "");
 
     // Non-strings.
-    shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": undefined })." + attr, "undefined");
-    shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": null })." + attr, "null");
+    if (attr == "key" || attr == "oldValue" || attr == "newValue") {
+        // Those members are nullable.
+        shouldBe("new StorageEvent('eventType', { " + attr + ": undefined })." + attr, "null");
+        shouldBe("new StorageEvent('eventType', { " + attr + ": null })." + attr, "null");
+    } else {
+        shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": undefined })." + attr, "");
+        shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": null })." + attr, "null");
+    }
     shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": false })." + attr, "false");
     shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": true })." + attr, "true");
     shouldBeEqualToString("new StorageEvent('eventType', { " + attr + ": 12345 })." + attr, "12345");
@@ -56,21 +62,21 @@ shouldBe("new StorageEvent('eventType', { storageArea: sessionStorage }).storage
 
 // Non-Storage objects.
 var test_object = {abc: 123};
-shouldBe("new StorageEvent('eventType', { storageArea: test_object }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: window }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: document }).storageArea", "null");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: test_object })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: window })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: document })", "TypeError");
 shouldBe("new StorageEvent('eventType', { storageArea: undefined }).storageArea", "null");
 shouldBe("new StorageEvent('eventType', { storageArea: null }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: false }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: true }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: '' }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: 'chocolate' }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: 12345 }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: 18446744073709551615 }).storageArea", "null");
-shouldBe("new StorageEvent('eventType', { storageArea: NaN }).storageArea", "null");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: false })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: true })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: '' })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: 'chocolate' })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: 12345 })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: 18446744073709551615 })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: NaN })", "TypeError");
 // Note that valueOf() is not called, when the left hand side is evaluated.
-shouldBeFalse("new StorageEvent('eventType', { storageArea: {valueOf: function () { return window; } } }).storageArea == window");
-shouldBe("new StorageEvent('eventType', { get storageArea() { return 123; } }).storageArea", "null");
+shouldThrowErrorName("new StorageEvent('eventType', { storageArea: {valueOf: function () { return window; } } })", "TypeError");
+shouldThrowErrorName("new StorageEvent('eventType', { get storageArea() { return 123; } }).storageArea", "TypeError");
 shouldThrow("new StorageEvent('eventType', { get storageArea() { throw 'StorageEvent Error'; } })");
 
 // All initializers are passed.
index da51447..08ecd6a 100644 (file)
@@ -12,7 +12,7 @@ PASS new WebGLContextEvent('eventType', { cancelable: false }).cancelable is fal
 PASS new WebGLContextEvent('eventType', { cancelable: true }).cancelable is true
 PASS new WebGLContextEvent('eventType', { statusMessage: 'abcde' }).statusMessage is "abcde"
 PASS new WebGLContextEvent('eventType', { statusMessage: '' }).statusMessage is ""
-PASS new WebGLContextEvent('eventType', { statusMessage: undefined }).statusMessage is "undefined"
+PASS new WebGLContextEvent('eventType', { statusMessage: undefined }).statusMessage is ""
 PASS new WebGLContextEvent('eventType', { statusMessage: null }).statusMessage is "null"
 PASS new WebGLContextEvent('eventType', { statusMessage: false }).statusMessage is "false"
 PASS new WebGLContextEvent('eventType', { statusMessage: true }).statusMessage is "true"
index 8b96776..265c8bd 100644 (file)
@@ -29,7 +29,7 @@ shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: 'abcd
 shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: '' }).statusMessage", "");
 
 // Non-strings.
-shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: undefined }).statusMessage", "undefined");
+shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: undefined }).statusMessage", "");
 shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: null }).statusMessage", "null");
 shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: false }).statusMessage", "false");
 shouldBeEqualToString("new WebGLContextEvent('eventType', { statusMessage: true }).statusMessage", "true");
index 46703af..bccdb5c 100644 (file)
@@ -42,7 +42,7 @@ PASS storageEventList[6].oldValue is "BAR"
 PASS storageEventList[6].newValue is null
 storage.clear()
 PASS storageEventList.length is 8
-PASS storageEventList[7].key is ""
+PASS storageEventList[7].key is null
 PASS storageEventList[7].oldValue is null
 PASS storageEventList[7].newValue is null
 
@@ -86,7 +86,7 @@ PASS storageEventList[6].oldValue is "BAR"
 PASS storageEventList[6].newValue is null
 storage.clear()
 PASS storageEventList.length is 8
-PASS storageEventList[7].key is ""
+PASS storageEventList[7].key is null
 PASS storageEventList[7].oldValue is null
 PASS storageEventList[7].newValue is null
 
index 357e7df..99c7f18 100644 (file)
@@ -44,7 +44,7 @@ PASS storageEventList[6].oldValue is "BAR"
 PASS storageEventList[6].newValue is null
 storage.clear()
 PASS storageEventList.length is 8
-PASS storageEventList[7].key is ""
+PASS storageEventList[7].key is null
 PASS storageEventList[7].oldValue is null
 PASS storageEventList[7].newValue is null
 
@@ -90,7 +90,7 @@ PASS storageEventList[6].oldValue is "BAR"
 PASS storageEventList[6].newValue is null
 storage.clear()
 PASS storageEventList.length is 8
-PASS storageEventList[7].key is ""
+PASS storageEventList[7].key is null
 PASS storageEventList[7].oldValue is null
 PASS storageEventList[7].newValue is null
 
index 1b4bacf..edf0a8e 100644 (file)
@@ -86,7 +86,7 @@ function step5()
 function step6()
 {
     shouldBe("storageEventList.length", "8");
-    shouldBeEqualToString("storageEventList[7].key", "");
+    shouldBeNull("storageEventList[7].key");
     shouldBeNull("storageEventList[7].oldValue");
     shouldBeNull("storageEventList[7].newValue");
  
index 605fe15..691f02c 100644 (file)
@@ -86,7 +86,7 @@ function step5()
 function step6()
 {
     shouldBe("storageEventList.length", "8");
-    shouldBeEqualToString("storageEventList[7].key", "");
+    shouldBeNull("storageEventList[7].key");
     shouldBeNull("storageEventList[7].oldValue");
     shouldBeNull("storageEventList[7].newValue");
  
index 7c7e82f..4a7a48e 100644 (file)
@@ -1,3 +1,46 @@
+2016-10-12  Chris Dumez  <cdumez@apple.com>
+
+        Update more events to stop using legacy [ConstructorTemplate=Event]
+        https://bugs.webkit.org/show_bug.cgi?id=163339
+
+        Reviewed by Ryosuke Niwa.
+
+        Update more events to stop using legacy [ConstructorTemplate=Event]
+        and use regular constructors instead.
+
+        No new tests, updated existing tests.
+
+        * bindings/scripts/test/JS/JSTestEventConstructor.cpp:
+        (WebCore::convertDictionary<TestEventConstructor::Init>):
+        (WebCore::JSTestEventConstructorConstructor::construct):
+        (WebCore::JSTestEventConstructorConstructor::prototypeForStructure):
+        (WebCore::JSTestEventConstructor::JSTestEventConstructor):
+        (WebCore::JSTestEventConstructor::createPrototype):
+        (WebCore::JSTestEventConstructorPrototype::create): Deleted.
+        (WebCore::JSTestEventConstructorPrototype::createStructure): Deleted.
+        (WebCore::JSTestEventConstructorPrototype::JSTestEventConstructorPrototype): Deleted.
+        (WebCore::setJSTestEventConstructorConstructor): Deleted.
+        (WebCore::JSTestEventConstructor::getConstructor): Deleted.
+        * bindings/scripts/test/JS/JSTestEventConstructor.h:
+        (WebCore::JSTestEventConstructor::wrapped):
+        (WebCore::JSTestEventConstructor::create): Deleted.
+        (WebCore::toJS): Deleted.
+        (WebCore::toJSNewlyCreated): Deleted.
+        * bindings/scripts/test/TestEventConstructor.idl:
+        * css/CSSFontFaceLoadEvent.cpp:
+        (WebCore::CSSFontFaceLoadEvent::CSSFontFaceLoadEvent):
+        * css/CSSFontFaceLoadEvent.h:
+        * css/CSSFontFaceLoadEvent.idl:
+        * html/canvas/WebGLContextEvent.cpp:
+        (WebCore::WebGLContextEvent::WebGLContextEvent):
+        * html/canvas/WebGLContextEvent.h:
+        * html/canvas/WebGLContextEvent.idl:
+        * storage/StorageEvent.cpp:
+        (WebCore::StorageEvent::create):
+        (WebCore::StorageEvent::StorageEvent):
+        * storage/StorageEvent.h:
+        * storage/StorageEvent.idl:
+
 2016-10-12  Andreas Kling  <akling@apple.com>
 
         Make Document::existingAXObjectCache() fast with accessibility disabled.
index cc187e2..3c48116 100644 (file)
 #include "config.h"
 #include "JSTestEventConstructor.h"
 
+#include "ExceptionCode.h"
 #include "JSDOMBinding.h"
 #include "JSDOMConstructor.h"
-#include "JSDictionary.h"
 #include "URL.h"
 #include <runtime/Error.h>
-#include <runtime/FunctionPrototype.h>
 #include <runtime/JSString.h>
 #include <wtf/GetPtr.h>
 
@@ -34,6 +33,54 @@ using namespace JSC;
 
 namespace WebCore {
 
+template<> Optional<TestEventConstructor::Init> convertDictionary<TestEventConstructor::Init>(ExecState& state, JSValue value)
+{
+    VM& vm = state.vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    bool isNullOrUndefined = value.isUndefinedOrNull();
+    auto* object = isNullOrUndefined ? nullptr : value.getObject();
+    if (UNLIKELY(!isNullOrUndefined && !object)) {
+        throwTypeError(&state, throwScope);
+        return Nullopt;
+    }
+    if (UNLIKELY(object && object->type() == RegExpObjectType)) {
+        throwTypeError(&state, throwScope);
+        return Nullopt;
+    }
+    TestEventConstructor::Init result;
+    JSValue bubblesValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "bubbles"));
+    if (!bubblesValue.isUndefined()) {
+        result.bubbles = convert<IDLBoolean>(state, bubblesValue);
+        RETURN_IF_EXCEPTION(throwScope, Nullopt);
+    } else
+        result.bubbles = false;
+    JSValue cancelableValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "cancelable"));
+    if (!cancelableValue.isUndefined()) {
+        result.cancelable = convert<IDLBoolean>(state, cancelableValue);
+        RETURN_IF_EXCEPTION(throwScope, Nullopt);
+    } else
+        result.cancelable = false;
+    JSValue composedValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "composed"));
+    if (!composedValue.isUndefined()) {
+        result.composed = convert<IDLBoolean>(state, composedValue);
+        RETURN_IF_EXCEPTION(throwScope, Nullopt);
+    } else
+        result.composed = false;
+    JSValue attr2Value = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "attr2"));
+    if (!attr2Value.isUndefined()) {
+        result.attr2 = convert<IDLDOMString>(state, attr2Value);
+        RETURN_IF_EXCEPTION(throwScope, Nullopt);
+    } else
+        result.attr2 = "";
+    JSValue attr3Value = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "attr3"));
+    if (!attr3Value.isUndefined()) {
+        result.attr3 = convert<IDLDOMString>(state, attr3Value);
+        RETURN_IF_EXCEPTION(throwScope, Nullopt);
+    } else
+        result.attr3 = "";
+    return WTFMove(result);
+}
+
 // Attributes
 
 JSC::EncodedJSValue jsTestEventConstructorAttr1(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
@@ -75,53 +122,22 @@ template<> EncodedJSValue JSC_HOST_CALL JSTestEventConstructorConstructor::const
 {
     VM& vm = state->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
-    auto* jsConstructor = jsCast<JSTestEventConstructorConstructor*>(state->callee());
-    ASSERT(jsConstructor);
-
-    if (!jsConstructor->scriptExecutionContext())
-        return throwConstructorScriptExecutionContextUnavailableError(*state, throwScope, "TestEventConstructor");
-
+    UNUSED_PARAM(throwScope);
+    auto* castedThis = jsCast<JSTestEventConstructorConstructor*>(state->callee());
+    ASSERT(castedThis);
     if (UNLIKELY(state->argumentCount() < 1))
         return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
-
-    AtomicString eventType = state->uncheckedArgument(0).toString(state)->toAtomicString(state);
+    auto type = state->uncheckedArgument(0).toWTFString(state);
     RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
-
-    TestEventConstructorInit eventInit;
-
-    JSValue initializerValue = state->argument(1);
-    if (!initializerValue.isUndefinedOrNull()) {
-        // Given the above test, this will always yield an object.
-        JSObject* initializerObject = initializerValue.toObject(state);
-        ASSERT(!throwScope.exception());
-
-        // Create the dictionary wrapper from the initializer object.
-        JSDictionary dictionary(state, initializerObject);
-
-        // Attempt to fill in the EventInit.
-        if (!fillTestEventConstructorInit(eventInit, dictionary))
-            return JSValue::encode(jsUndefined());
-    }
-
-    Ref<TestEventConstructor> event = TestEventConstructor::createForBindings(eventType, eventInit);
-    return JSValue::encode(createWrapper<TestEventConstructor>(jsConstructor->globalObject(), WTFMove(event)));
-}
-
-bool fillTestEventConstructorInit(TestEventConstructorInit& eventInit, JSDictionary& dictionary)
-{
-    if (!dictionary.tryGetProperty("attr2", eventInit.attr2))
-        return false;
-#if ENABLE(SPECIAL_EVENT)
-    if (!dictionary.tryGetProperty("attr3", eventInit.attr3))
-        return false;
-#endif
-    return true;
+    auto eventInitDict = convert<IDLDictionary<TestEventConstructor::Init>>(*state, state->argument(1));
+    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
+    auto object = TestEventConstructor::create(WTFMove(type), eventInitDict.value());
+    return JSValue::encode(toJSNewlyCreated(state, castedThis->globalObject(), WTFMove(object)));
 }
 
 template<> JSValue JSTestEventConstructorConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
 {
-    UNUSED_PARAM(vm);
-    return globalObject.functionPrototype();
+    return JSEvent::getConstructor(vm, &globalObject);
 }
 
 template<> void JSTestEventConstructorConstructor::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)
@@ -158,13 +174,13 @@ void JSTestEventConstructorPrototype::finishCreation(VM& vm)
 const ClassInfo JSTestEventConstructor::s_info = { "TestEventConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSTestEventConstructor) };
 
 JSTestEventConstructor::JSTestEventConstructor(Structure* structure, JSDOMGlobalObject& globalObject, Ref<TestEventConstructor>&& impl)
-    : JSDOMWrapper<TestEventConstructor>(structure, globalObject, WTFMove(impl))
+    : JSEvent(structure, globalObject, WTFMove(impl))
 {
 }
 
 JSObject* JSTestEventConstructor::createPrototype(VM& vm, JSGlobalObject* globalObject)
 {
-    return JSTestEventConstructorPrototype::create(vm, globalObject, JSTestEventConstructorPrototype::createStructure(vm, globalObject, globalObject->objectPrototype()));
+    return JSTestEventConstructorPrototype::create(vm, globalObject, JSTestEventConstructorPrototype::createStructure(vm, globalObject, JSEvent::prototype(vm, globalObject)));
 }
 
 JSObject* JSTestEventConstructor::prototype(VM& vm, JSGlobalObject* globalObject)
@@ -172,12 +188,6 @@ JSObject* JSTestEventConstructor::prototype(VM& vm, JSGlobalObject* globalObject
     return getDOMPrototype<JSTestEventConstructor>(vm, globalObject);
 }
 
-void JSTestEventConstructor::destroy(JSC::JSCell* cell)
-{
-    JSTestEventConstructor* thisObject = static_cast<JSTestEventConstructor*>(cell);
-    thisObject->JSTestEventConstructor::~JSTestEventConstructor();
-}
-
 template<> inline JSTestEventConstructor* BindingCaller<JSTestEventConstructor>::castForAttribute(ExecState&, EncodedJSValue thisValue)
 {
     return jsDynamicCast<JSTestEventConstructor*>(JSValue::decode(thisValue));
@@ -263,20 +273,6 @@ JSValue JSTestEventConstructor::getConstructor(VM& vm, const JSGlobalObject* glo
     return getDOMConstructor<JSTestEventConstructorConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));
 }
 
-bool JSTestEventConstructorOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor)
-{
-    UNUSED_PARAM(handle);
-    UNUSED_PARAM(visitor);
-    return false;
-}
-
-void JSTestEventConstructorOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)
-{
-    auto* jsTestEventConstructor = jsCast<JSTestEventConstructor*>(handle.slot()->asCell());
-    auto& world = *static_cast<DOMWrapperWorld*>(context);
-    uncacheWrapper(world, &jsTestEventConstructor->wrapped(), jsTestEventConstructor);
-}
-
 #if ENABLE(BINDING_INTEGRITY)
 #if PLATFORM(WIN)
 #pragma warning(disable: 4483)
@@ -315,11 +311,5 @@ JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestEv
     return wrap(state, globalObject, impl);
 }
 
-TestEventConstructor* JSTestEventConstructor::toWrapped(JSC::JSValue value)
-{
-    if (auto* wrapper = jsDynamicCast<JSTestEventConstructor*>(value))
-        return &wrapper->wrapped();
-    return nullptr;
-}
 
 }
index d7abe71..6adad6c 100644 (file)
 
 #pragma once
 
-#include "JSDOMWrapper.h"
+#include "JSDOMConvert.h"
+#include "JSEvent.h"
 #include "TestEventConstructor.h"
-#include <wtf/NeverDestroyed.h>
 
 namespace WebCore {
 
-class JSDictionary;
-
-class JSTestEventConstructor : public JSDOMWrapper<TestEventConstructor> {
+class JSTestEventConstructor : public JSEvent {
 public:
-    using Base = JSDOMWrapper<TestEventConstructor>;
+    using Base = JSEvent;
+    using DOMWrapped = TestEventConstructor;
     static JSTestEventConstructor* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, Ref<TestEventConstructor>&& impl)
     {
         JSTestEventConstructor* ptr = new (NotNull, JSC::allocateCell<JSTestEventConstructor>(globalObject->vm().heap)) JSTestEventConstructor(structure, *globalObject, WTFMove(impl));
@@ -40,8 +39,6 @@ public:
 
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* prototype(JSC::VM&, JSC::JSGlobalObject*);
-    static TestEventConstructor* toWrapped(JSC::JSValue);
-    static void destroy(JSC::JSCell*);
 
     DECLARE_INFO;
 
@@ -51,6 +48,10 @@ public:
     }
 
     static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*);
+    TestEventConstructor& wrapped() const
+    {
+        return static_cast<TestEventConstructor&>(Base::wrapped());
+    }
 protected:
     JSTestEventConstructor(JSC::Structure*, JSDOMGlobalObject&, Ref<TestEventConstructor>&&);
 
@@ -62,32 +63,15 @@ protected:
 
 };
 
-class JSTestEventConstructorOwner : 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&, TestEventConstructor*)
-{
-    static NeverDestroyed<JSTestEventConstructorOwner> owner;
-    return &owner.get();
-}
-
-inline void* wrapperKey(TestEventConstructor* wrappableObject)
-{
-    return wrappableObject;
-}
-
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestEventConstructor&);
 inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, TestEventConstructor* impl) { return impl ? toJS(state, globalObject, *impl) : JSC::jsNull(); }
 JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, Ref<TestEventConstructor>&&);
 inline JSC::JSValue toJSNewlyCreated(JSC::ExecState* state, JSDOMGlobalObject* globalObject, RefPtr<TestEventConstructor>&& impl) { return impl ? toJSNewlyCreated(state, globalObject, impl.releaseNonNull()) : JSC::jsNull(); }
 
-bool fillTestEventConstructorInit(TestEventConstructorInit&, JSDictionary&);
-
 template<> struct JSDOMWrapperConverterTraits<TestEventConstructor> {
     using WrapperClass = JSTestEventConstructor;
 };
+template<> Optional<TestEventConstructor::Init> convertDictionary<TestEventConstructor::Init>(JSC::ExecState&, JSC::JSValue);
+
 
 } // namespace WebCore
index 0444076..1237414 100644 (file)
 // This IDL file is for testing the bindings code generator and for tracking
 // changes in its ouput.
 [
-    ConstructorTemplate=Event
-] interface TestEventConstructor {
+    Constructor(DOMString type, optional TestEventConstructorInit eventInitDict),
+] interface TestEventConstructor : Event {
     // Attributes
     readonly attribute DOMString attr1;
-    [InitializedByEventConstructor] readonly attribute DOMString attr2;
-    [InitializedByEventConstructor, Conditional=SPECIAL_EVENT] readonly attribute DOMString attr3;
+    readonly attribute DOMString attr2;
+    [Conditional=SPECIAL_EVENT] readonly attribute DOMString attr3;
+};
+
+dictionary TestEventConstructorInit : EventInit {
+    DOMString attr2 = "";
+    [Conditional=SPECIAL_EVENT]  DOMString attr3 = "";
 };
index 2a430c7..017d4de 100644 (file)
@@ -46,8 +46,8 @@ CSSFontFaceLoadEvent::CSSFontFaceLoadEvent(const AtomicString& type, RefPtr<CSSF
 {
 }
 
-CSSFontFaceLoadEvent::CSSFontFaceLoadEvent(const AtomicString& type, const CSSFontFaceLoadEventInit& initializer)
-    : Event(type, initializer)
+CSSFontFaceLoadEvent::CSSFontFaceLoadEvent(const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
+    : Event(type, initializer, isTrusted)
     , m_fontface(initializer.fontface)
     , m_error(initializer.error)
 {
index 0ca2a9d..93a613b 100644 (file)
@@ -42,11 +42,6 @@ namespace WebCore {
 
 class DOMError;
 
-struct CSSFontFaceLoadEventInit : public EventInit {
-    RefPtr<CSSFontFaceRule> fontface;
-    RefPtr<DOMError> error;
-};
-
 class CSSFontFaceLoadEvent final : public Event {
 public:
     static Ref<CSSFontFaceLoadEvent> create()
@@ -54,9 +49,14 @@ public:
         return adoptRef<CSSFontFaceLoadEvent>(*new CSSFontFaceLoadEvent);
     }
 
-    static Ref<CSSFontFaceLoadEvent> create(const AtomicString& type, const CSSFontFaceLoadEventInit& initializer)
+    struct Init : EventInit {
+        RefPtr<CSSFontFaceRule> fontface;
+        RefPtr<DOMError> error;
+    };
+
+    static Ref<CSSFontFaceLoadEvent> create(const AtomicString& type, const Init& initializer, IsTrusted isTrusted = IsTrusted::No)
     {
-        return adoptRef<CSSFontFaceLoadEvent>(*new CSSFontFaceLoadEvent(type, initializer));
+        return adoptRef<CSSFontFaceLoadEvent>(*new CSSFontFaceLoadEvent(type, initializer, isTrusted));
     }
 
     static Ref<CSSFontFaceLoadEvent> createForFontFaceRule(const AtomicString& type, RefPtr<CSSFontFaceRule>&& rule)
@@ -79,7 +79,7 @@ public:
 private:
     CSSFontFaceLoadEvent();
     CSSFontFaceLoadEvent(const AtomicString&, RefPtr<CSSFontFaceRule>&&, RefPtr<DOMError>&&);
-    CSSFontFaceLoadEvent(const AtomicString&, const CSSFontFaceLoadEventInit&);
+    CSSFontFaceLoadEvent(const AtomicString&, const Init&, IsTrusted);
 
     RefPtr<CSSFontFaceRule> m_fontface;
     RefPtr<DOMError> m_error;
index bc15096..0ab6f20 100644 (file)
  */
 
 [
-    NoInterfaceObject,
     Conditional=FONT_LOAD_EVENTS,
-    ConstructorTemplate=Event
+    Constructor(DOMString type, optional CSSFontFaceLoadEventInit eventInit),
 ] interface CSSFontFaceLoadEvent : Event {
-    [InitializedByEventConstructor] readonly attribute CSSFontFaceRule fontface;
-    [InitializedByEventConstructor] readonly attribute DOMError error;
+    readonly attribute CSSFontFaceRule? fontface;
+    readonly attribute DOMError? error;
+};
+
+dictionary CSSFontFaceLoadEventInit : EventInit {
+    CSSFontFaceRule? fontface = null;
+    DOMError? error = null;
 };
index 11d1435..fc40472 100644 (file)
@@ -38,8 +38,8 @@ WebGLContextEvent::WebGLContextEvent(const AtomicString& type, bool canBubble, b
 {
 }
 
-WebGLContextEvent::WebGLContextEvent(const AtomicString& type, const WebGLContextEventInit& initializer)
-    : Event(type, initializer)
+WebGLContextEvent::WebGLContextEvent(const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
+    : Event(type, initializer, isTrusted)
     , m_statusMessage(initializer.statusMessage)
 {
 }
index 1f61863..6f463eb 100644 (file)
 
 namespace WebCore {
 
-struct WebGLContextEventInit : public EventInit {
-    String statusMessage;
-};
-
 class WebGLContextEvent final : public Event {
 public:
     static Ref<WebGLContextEvent> create(const AtomicString& type, bool canBubble, bool cancelable, const String& statusMessage)
     {
         return adoptRef(*new WebGLContextEvent(type, canBubble, cancelable, statusMessage));
     }
-    static Ref<WebGLContextEvent> createForBindings(const AtomicString& type, const WebGLContextEventInit& initializer)
+
+    struct Init : EventInit {
+        String statusMessage;
+    };
+
+    static Ref<WebGLContextEvent> create(const AtomicString& type, const Init& initializer, IsTrusted isTrusted = IsTrusted::No)
     {
-        return adoptRef(*new WebGLContextEvent(type, initializer));
+        return adoptRef(*new WebGLContextEvent(type, initializer, isTrusted));
     }
     virtual ~WebGLContextEvent();
 
@@ -52,7 +53,7 @@ public:
 
 private:
     WebGLContextEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& statusMessage);
-    WebGLContextEvent(const AtomicString&, const WebGLContextEventInit&);
+    WebGLContextEvent(const AtomicString&, const Init&, IsTrusted);
 
     String m_statusMessage;
 };
index c3eba10..3cd03b1 100644 (file)
 
 [
     Conditional=WEBGL,
-    ConstructorTemplate=Event
+    Constructor(DOMString type, optional WebGLContextEventInit eventInit),
 ] interface WebGLContextEvent : Event {
-    [InitializedByEventConstructor] readonly attribute DOMString statusMessage;
+    readonly attribute DOMString statusMessage;
 };
 
+dictionary WebGLContextEventInit : EventInit {
+    DOMString statusMessage = "";
+};
index d80e676..c1fc110 100644 (file)
@@ -49,9 +49,9 @@ Ref<StorageEvent> StorageEvent::create(const AtomicString& type, const String& k
     return adoptRef(*new StorageEvent(type, key, oldValue, newValue, url, storageArea));
 }
 
-Ref<StorageEvent> StorageEvent::createForBindings(const AtomicString& type, const StorageEventInit& initializer)
+Ref<StorageEvent> StorageEvent::create(const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
 {
-    return adoptRef(*new StorageEvent(type, initializer));
+    return adoptRef(*new StorageEvent(type, initializer, isTrusted));
 }
 
 StorageEvent::StorageEvent(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& url, Storage* storageArea)
@@ -64,8 +64,8 @@ StorageEvent::StorageEvent(const AtomicString& type, const String& key, const St
 {
 }
 
-StorageEvent::StorageEvent(const AtomicString& type, const StorageEventInit& initializer)
-    : Event(type, initializer)
+StorageEvent::StorageEvent(const AtomicString& type, const Init& initializer, IsTrusted isTrusted)
+    : Event(type, initializer, isTrusted)
     , m_key(initializer.key)
     , m_oldValue(initializer.oldValue)
     , m_newValue(initializer.newValue)
index ed2b601..36c928c 100644 (file)
@@ -33,19 +33,20 @@ namespace WebCore {
 
 class Storage;
 
-struct StorageEventInit : public EventInit {
-    String key;
-    String oldValue;
-    String newValue;
-    String url;
-    RefPtr<Storage> storageArea;
-};
-
 class StorageEvent : public Event {
 public:
     static Ref<StorageEvent> create(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& url, Storage* storageArea);
     static Ref<StorageEvent> createForBindings();
-    static Ref<StorageEvent> createForBindings(const AtomicString&, const StorageEventInit&);
+
+    struct Init : EventInit {
+        String key;
+        String oldValue;
+        String newValue;
+        String url;
+        RefPtr<Storage> storageArea;
+    };
+
+    static Ref<StorageEvent> create(const AtomicString&, const Init&, IsTrusted = IsTrusted::No);
     virtual ~StorageEvent();
 
     const String& key() const { return m_key; }
@@ -64,7 +65,7 @@ public:
 private:
     StorageEvent();
     StorageEvent(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& url, Storage* storageArea);
-    StorageEvent(const AtomicString&, const StorageEventInit&);
+    StorageEvent(const AtomicString&, const Init&, IsTrusted);
 
     String m_key;
     String m_oldValue;
index 64a42ea..51dadc0 100644 (file)
  */
 
 [
-    ConstructorTemplate=Event,
+    Constructor(DOMString type, optional StorageEventInit eventInitDict)
 ] interface StorageEvent : Event {
-    [InitializedByEventConstructor] readonly attribute DOMString key;
-    [InitializedByEventConstructor] readonly attribute DOMString? oldValue;
-    [InitializedByEventConstructor] readonly attribute DOMString? newValue;
-    [InitializedByEventConstructor] readonly attribute USVString url;
-    [InitializedByEventConstructor] readonly attribute Storage storageArea;
+    readonly attribute DOMString? key;
+    readonly attribute DOMString? oldValue;
+    readonly attribute DOMString? newValue;
+    readonly attribute USVString url;
+    readonly attribute Storage? storageArea;
 
     // FIXME: Using "undefined" as default parameter value is wrong.
     void initStorageEvent(optional DOMString typeArg = "undefined",
     // void initStorageEventNS(DOMString namespaceURI, DOMString typeArg, boolean canBubbleArg, boolean cancelableArg, DOMString keyArg, DOMString oldValueArg, DOMString newValueArg, USVString urlArg, Storage? storageAreaArg);
 };
 
+dictionary StorageEventInit : EventInit {
+    DOMString? key = null;
+    DOMString? oldValue = null;
+    DOMString? newValue = null;
+    USVString url = "";
+    Storage? storageArea = null;
+};