[Web IDL] Specify default values for optional parameters of wrapper types
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 29 Apr 2016 16:51:58 +0000 (16:51 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 29 Apr 2016 16:51:58 +0000 (16:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=157161

Reviewed by Darin Adler.

Source/WebCore:

Specify default values for optional parameters of wrapper types.

* Modules/indexeddb/IDBIndex.cpp:
(WebCore::IDBIndex::count): Deleted.
* Modules/indexeddb/IDBIndex.h:
* Modules/indexeddb/IDBIndex.idl:
* Modules/indexeddb/IDBObjectStore.cpp:
(WebCore::IDBObjectStore::count): Deleted.
* Modules/indexeddb/IDBObjectStore.h:
* Modules/indexeddb/IDBObjectStore.idl:
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::createDataChannel): Deleted.
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCPeerConnection.idl:

* bindings/scripts/CodeGeneratorJS.pm:
(WillConvertUndefinedToDefaultParameterValue):
Optimization to avoid generating a ternary if the default
value of a wrapper type parameter is null, since undefined
will already convert to null for those.

(GenerateParametersCheck):
Use null as implicit default value for nullable parameters, given that Web IDL
converts undefined to null for such parameters:
http://heycam.github.io/webidl/#es-nullable-type

(CanUseWTFOptionalForParameter):
Drop the check for wrapper types.

* bindings/scripts/test/*:
Improve bindings tests coverage / rebaseline.

* css/MediaQueryList.idl:
* css/MediaQueryListListener.idl:
* dom/Document.idl:

* html/canvas/DOMPath.idl:
The previous syntax was working because the bindings was generating an early
return if addPath() was called with only one parameter, calling the
implementation method with only 1 parameter. However, since we no longer
generate early returns for optional parameters, we now have to use a slightly
different syntax to maintain the previous behavior. This is only temporary,
I just did not want to deal with SVG tear off types in this patch since they
are very special in the bindings generator.

* page/DOMSelection.idl:
The node parameter to extend() was confusingly marked as optional. However,
when omitted, it would get translated into null, which would throw an
exception since the type is not nullable. Since the specification says 'node'
should not be optional, and since there is no behavior change, I dropped
the 'optional'. The only web-exposed difference is the message provided with
the TypeError that is thrown when called without enough parameters. The new
message is more accurate (see rebaselined layout test).

* svg/SVGMarkerElement.idl:
The parameter for setOrientToAngle() was confusingly marked as optional and
having a default value of null. However, the bindings would throw a TypeError
if called with no parameters or when calling it with null. This is because
this is an SVG Tear off type and the bindings always throw when passing null
for an SVG Tear off type. I therefore updated the IDL to reflect the actual
behavior (no actual behavior change). The new IDL also now matches the spec:
http://www.w3.org/TR/SVG2/painting.html#InterfaceSVGMarkerElement

* svg/SVGSVGElement.idl:
Same comments as for SVGMarkerElement. The new IDL matches the actual
behavior and is closer to the specification. I added FIXME comments for when
it does not match the specification:
http://www.w3.org/TR/SVG2/struct.html#InterfaceSVGSVGElement
I did not change web-exposed behavior in this patch.

* svg/SVGTextContentElement.idl:
Same as above. No actual behavior change.

* testing/Internals.cpp:
* testing/Internals.h:
* testing/Internals.idl:
* xml/XPathEvaluator.idl:

LayoutTests:

Rebaseline as a different exception message is now given when calling
Selection.extend() without enough parameters.

* editing/selection/extend-expected.txt:

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

31 files changed:
LayoutTests/ChangeLog
LayoutTests/editing/selection/extend-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBIndex.cpp
Source/WebCore/Modules/indexeddb/IDBIndex.h
Source/WebCore/Modules/indexeddb/IDBIndex.idl
Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp
Source/WebCore/Modules/indexeddb/IDBObjectStore.h
Source/WebCore/Modules/indexeddb/IDBObjectStore.idl
Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp
Source/WebCore/Modules/mediastream/RTCPeerConnection.h
Source/WebCore/Modules/mediastream/RTCPeerConnection.idl
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.h
Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
Source/WebCore/bindings/scripts/test/ObjC/DOMTestObj.h
Source/WebCore/bindings/scripts/test/ObjC/DOMTestObj.mm
Source/WebCore/bindings/scripts/test/TestObj.idl
Source/WebCore/css/MediaQueryList.idl
Source/WebCore/css/MediaQueryListListener.idl
Source/WebCore/dom/Document.idl
Source/WebCore/html/canvas/DOMPath.idl
Source/WebCore/page/DOMSelection.idl
Source/WebCore/svg/SVGMarkerElement.idl
Source/WebCore/svg/SVGSVGElement.idl
Source/WebCore/svg/SVGTextContentElement.idl
Source/WebCore/testing/Internals.cpp
Source/WebCore/testing/Internals.h
Source/WebCore/testing/Internals.idl
Source/WebCore/xml/XPathEvaluator.idl

index 96405e3..e61257c 100644 (file)
@@ -1,3 +1,15 @@
+2016-04-29  Chris Dumez  <cdumez@apple.com>
+
+        [Web IDL] Specify default values for optional parameters of wrapper types
+        https://bugs.webkit.org/show_bug.cgi?id=157161
+
+        Reviewed by Darin Adler.
+
+        Rebaseline as a different exception message is now given when calling
+        Selection.extend() without enough parameters.
+
+        * editing/selection/extend-expected.txt:
+
 2016-04-29  Joanmarie Diggs  <jdiggs@igalia.com>
 
         [ATK] Expose the value of aria-roledescription via an AtkObject attribute
index 32f538d..01ec74b 100644 (file)
@@ -4,5 +4,5 @@ Success: s.extend(span2.firstChild, 4) raised Error: IndexSizeError: DOM Excepti
 Success: s.extend(span2.firstChild, -1) raised Error: IndexSizeError: DOM Exception 1.
 Success: window.getSelection() is b.
 Success: window.getSelection() is arbaz.
-Success: s.extend() raised TypeError: Type error.
+Success: s.extend() raised TypeError: Not enough arguments.
 Success: s.extend(null, 0) raised TypeError: Type error.
index 5bb41f4..223e2d8 100644 (file)
@@ -1,3 +1,88 @@
+2016-04-29  Chris Dumez  <cdumez@apple.com>
+
+        [Web IDL] Specify default values for optional parameters of wrapper types
+        https://bugs.webkit.org/show_bug.cgi?id=157161
+
+        Reviewed by Darin Adler.
+
+        Specify default values for optional parameters of wrapper types.
+
+        * Modules/indexeddb/IDBIndex.cpp:
+        (WebCore::IDBIndex::count): Deleted.
+        * Modules/indexeddb/IDBIndex.h:
+        * Modules/indexeddb/IDBIndex.idl:
+        * Modules/indexeddb/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::count): Deleted.
+        * Modules/indexeddb/IDBObjectStore.h:
+        * Modules/indexeddb/IDBObjectStore.idl:
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::createDataChannel): Deleted.
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCPeerConnection.idl:
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (WillConvertUndefinedToDefaultParameterValue):
+        Optimization to avoid generating a ternary if the default
+        value of a wrapper type parameter is null, since undefined
+        will already convert to null for those.
+
+        (GenerateParametersCheck):
+        Use null as implicit default value for nullable parameters, given that Web IDL
+        converts undefined to null for such parameters:
+        http://heycam.github.io/webidl/#es-nullable-type
+
+        (CanUseWTFOptionalForParameter):
+        Drop the check for wrapper types.
+
+        * bindings/scripts/test/*:
+        Improve bindings tests coverage / rebaseline.
+
+        * css/MediaQueryList.idl:
+        * css/MediaQueryListListener.idl:
+        * dom/Document.idl:
+
+        * html/canvas/DOMPath.idl:
+        The previous syntax was working because the bindings was generating an early
+        return if addPath() was called with only one parameter, calling the
+        implementation method with only 1 parameter. However, since we no longer
+        generate early returns for optional parameters, we now have to use a slightly
+        different syntax to maintain the previous behavior. This is only temporary,
+        I just did not want to deal with SVG tear off types in this patch since they
+        are very special in the bindings generator.
+
+        * page/DOMSelection.idl:
+        The node parameter to extend() was confusingly marked as optional. However,
+        when omitted, it would get translated into null, which would throw an
+        exception since the type is not nullable. Since the specification says 'node'
+        should not be optional, and since there is no behavior change, I dropped
+        the 'optional'. The only web-exposed difference is the message provided with
+        the TypeError that is thrown when called without enough parameters. The new
+        message is more accurate (see rebaselined layout test).
+
+        * svg/SVGMarkerElement.idl:
+        The parameter for setOrientToAngle() was confusingly marked as optional and
+        having a default value of null. However, the bindings would throw a TypeError
+        if called with no parameters or when calling it with null. This is because
+        this is an SVG Tear off type and the bindings always throw when passing null
+        for an SVG Tear off type. I therefore updated the IDL to reflect the actual
+        behavior (no actual behavior change). The new IDL also now matches the spec:
+        http://www.w3.org/TR/SVG2/painting.html#InterfaceSVGMarkerElement
+
+        * svg/SVGSVGElement.idl:
+        Same comments as for SVGMarkerElement. The new IDL matches the actual
+        behavior and is closer to the specification. I added FIXME comments for when
+        it does not match the specification:
+        http://www.w3.org/TR/SVG2/struct.html#InterfaceSVGSVGElement
+        I did not change web-exposed behavior in this patch.
+
+        * svg/SVGTextContentElement.idl:
+        Same as above. No actual behavior change.
+
+        * testing/Internals.cpp:
+        * testing/Internals.h:
+        * testing/Internals.idl:
+        * xml/XPathEvaluator.idl:
+
 2016-04-29  Joanmarie Diggs  <jdiggs@igalia.com>
 
         [ATK] Expose the value of aria-roledescription via an AtkObject attribute
index 43c2e3d..4895120 100644 (file)
@@ -137,13 +137,6 @@ RefPtr<IDBRequest> IDBIndex::openCursor(ScriptExecutionContext& context, JSValue
     return openCursor(context, keyRange.get(), direction, ec);
 }
 
-RefPtr<IDBRequest> IDBIndex::count(ScriptExecutionContext& context, ExceptionCodeWithMessage& ec)
-{
-    LOG(IndexedDB, "IDBIndex::count");
-
-    return doCount(context, IDBKeyRangeData::allKeys(), ec);
-}
-
 RefPtr<IDBRequest> IDBIndex::count(ScriptExecutionContext& context, IDBKeyRange* range, ExceptionCodeWithMessage& ec)
 {
     LOG(IndexedDB, "IDBIndex::count");
index f28f323..d7f38bb 100644 (file)
@@ -52,7 +52,6 @@ public:
     RefPtr<IDBRequest> openCursor(ScriptExecutionContext&, IDBKeyRange*, const String& direction, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> openCursor(ScriptExecutionContext&, JSC::JSValue key, const String& direction, ExceptionCodeWithMessage&);
 
-    RefPtr<IDBRequest> count(ScriptExecutionContext&, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> count(ScriptExecutionContext&, IDBKeyRange*, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> count(ScriptExecutionContext&, JSC::JSValue key, ExceptionCodeWithMessage&);
 
index 3fda1e9..35531f6 100644 (file)
@@ -46,7 +46,7 @@
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest get(any key);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest getKey(IDBKeyRange? key);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest getKey(any key);
-    [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(optional IDBKeyRange? range);
+    [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(optional IDBKeyRange? range = null);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(any key);
 };
 
index aa805ff..bcd3257 100644 (file)
@@ -562,13 +562,6 @@ void IDBObjectStore::deleteIndex(const String& name, ExceptionCodeWithMessage& e
     m_transaction->deleteIndex(m_info.identifier(), name);
 }
 
-RefPtr<IDBRequest> IDBObjectStore::count(ScriptExecutionContext& context, ExceptionCodeWithMessage& ec)
-{
-    LOG(IndexedDB, "IDBObjectStore::count");
-
-    return doCount(context, IDBKeyRangeData::allKeys(), ec);
-}
-
 RefPtr<IDBRequest> IDBObjectStore::count(ScriptExecutionContext& context, JSValue key, ExceptionCodeWithMessage& ec)
 {
     LOG(IndexedDB, "IDBObjectStore::count");
index f69c8ca..5c315d1 100644 (file)
@@ -74,7 +74,6 @@ public:
     RefPtr<IDBIndex> createIndex(ScriptExecutionContext&, const String& name, const IDBKeyPath&, bool unique, bool multiEntry, ExceptionCodeWithMessage&);
     RefPtr<IDBIndex> index(const String& name, ExceptionCodeWithMessage&);
     void deleteIndex(const String& name, ExceptionCodeWithMessage&);
-    RefPtr<IDBRequest> count(ScriptExecutionContext&, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> count(ScriptExecutionContext&, IDBKeyRange*, ExceptionCodeWithMessage&);
     RefPtr<IDBRequest> count(ScriptExecutionContext&, JSC::JSValue key, ExceptionCodeWithMessage&);
 
index 251d519..1759747 100644 (file)
@@ -49,6 +49,6 @@
     [CallWith=ScriptExecutionContext, Custom, RaisesExceptionWithMessage] IDBIndex createIndex(DOMString name, DOMString keyPath, optional Dictionary options);
     [RaisesExceptionWithMessage] IDBIndex index(DOMString name);
     [RaisesExceptionWithMessage] void deleteIndex(DOMString name);
-    [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(optional IDBKeyRange? range);
+    [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(optional IDBKeyRange? range = null);
     [CallWith=ScriptExecutionContext, RaisesExceptionWithMessage] IDBRequest count(any key);
 };
index 677eef2..18eb37b 100644 (file)
@@ -328,14 +328,9 @@ void RTCPeerConnection::setConfiguration(const Dictionary& configuration, Except
     m_backend->setConfiguration(*m_configuration);
 }
 
-void RTCPeerConnection::privateGetStats(MediaStreamTrack& selector, PeerConnection::StatsPromise&& promise)
+void RTCPeerConnection::privateGetStats(MediaStreamTrack* selector, PeerConnection::StatsPromise&& promise)
 {
-    m_backend->getStats(&selector, WTFMove(promise));
-}
-
-void RTCPeerConnection::privateGetStats(PeerConnection::StatsPromise&& promise)
-{
-    m_backend->getStats(nullptr, WTFMove(promise));
+    m_backend->getStats(selector, WTFMove(promise));
 }
 
 RefPtr<RTCDataChannel> RTCPeerConnection::createDataChannel(String, const Dictionary&, ExceptionCode& ec)
index 5e255ee..0c565ed 100644 (file)
@@ -93,8 +93,7 @@ public:
     RTCConfiguration* getConfiguration() const;
     void setConfiguration(const Dictionary& configuration, ExceptionCode&);
 
-    void privateGetStats(MediaStreamTrack&, PeerConnection::StatsPromise&&);
-    void privateGetStats(PeerConnection::StatsPromise&&);
+    void privateGetStats(MediaStreamTrack*, PeerConnection::StatsPromise&&);
 
     RefPtr<RTCDataChannel> createDataChannel(String label, const Dictionary& dataChannelDict, ExceptionCode&);
 
index 782663c..8b6fb30 100644 (file)
@@ -46,7 +46,7 @@
     [Private] Promise queuedSetRemoteDescription(RTCSessionDescription description);
     [Private] Promise queuedAddIceCandidate(RTCIceCandidate candidate);
 
-    [Private] Promise privateGetStats(optional MediaStreamTrack selector);
+    [Private] Promise privateGetStats(optional MediaStreamTrack? selector = null);
 
     [JSBuiltin] Promise createOffer(optional Dictionary offerOptions);
     // Legacy signature: void createOffer(RTCSessionDescriptionCallback successCallback
index 94e5e7e..740bbdd 100644 (file)
@@ -3380,7 +3380,6 @@ sub CanUseWTFOptionalForParameter
     return 0 if $parameter->isVariadic;
     return 0 if $codeGenerator->IsCallbackInterface($type);
     return 0 if $codeGenerator->IsEnumType($type);
-    return 0 if $codeGenerator->IsWrapperType($type);
 
     return 1;
 }
@@ -3420,6 +3419,8 @@ sub WillConvertUndefinedToDefaultParameterValue
         return 1 if $parameterType eq "float" or $parameterType eq "unrestricted float";
     }
 
+    return 1 if $codeGenerator->IsWrapperType($parameterType) and $defaultValue eq "null";
+
     return 0;
 }
 
@@ -3469,14 +3470,22 @@ sub GenerateParametersCheck
         my $argType = $parameter->type;
         my $optional = $parameter->isOptional;
 
-        # As per Web IDL, optional dictionary parameters are always considered to have a default value of an empty dictionary, unless otherwise specified.
-        $parameter->default("[]") if ($optional && !defined($parameter->default) && $argType eq "Dictionary");
+        die "Optional parameters of non-nullable wrapper types are not supported" if $optional && !$parameter->isNullable && $codeGenerator->IsWrapperType($argType) && !$codeGenerator->IsCallbackInterface($argType);
+
+        if ($optional && !defined($parameter->default)) {
+            # As per Web IDL, optional dictionary parameters are always considered to have a default value of an empty dictionary, unless otherwise specified.
+            $parameter->default("[]") if $argType eq "Dictionary";
+            
+            # We use undefined as default value for optional parameters of type 'any' unless specified otherwise.
+            $parameter->default("undefined") if $argType eq "any";
 
-        # We use the null string as default value for non-nullable parameters of type DOMString unless specified otherwise.
-        $parameter->default("null") if ($optional && !defined($parameter->default) && $argType eq "DOMString" && !$parameter->isNullable);
+            # We use the null string as default value for parameters of type DOMString unless specified otherwise.
+            $parameter->default("null") if $argType eq "DOMString";
 
-        # We use undefined as default value for optional parameters of type 'any' unless specified otherwise.
-        $parameter->default("undefined") if ($optional && !defined($parameter->default) && $argType eq "any");
+            # As per Web IDL, passing undefined for a nullable parameter is treated as null. Therefore, use null as
+            # default value for nullable parameters unless otherwise specified.
+            $parameter->default("null") if $parameter->isNullable;
+        }
 
         # FIXME: We should eventually stop generating any early calls, and instead use either default parameter values or WTF::Optional<>.
         if ($optional && !defined($parameter->default) && !CanUseWTFOptionalForParameter($parameter) && !$codeGenerator->IsCallbackInterface($argType)) {
index a5a93ca..7f4d336 100644 (file)
@@ -1770,6 +1770,26 @@ void webkit_dom_test_obj_method_with_optional_any(WebKitDOMTestObj* self, WebKit
     item->methodWithOptionalAny(convertedA);
 }
 
+void webkit_dom_test_obj_method_with_optional_nullable_wrapper(WebKitDOMTestObj* self, WebKitDOMTestObj* obj)
+{
+    WebCore::JSMainThreadNullState state;
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(obj));
+    WebCore::TestObj* item = WebKit::core(self);
+    WebCore::TestObj* convertedObj = WebKit::core(obj);
+    item->methodWithOptionalNullableWrapper(convertedObj);
+}
+
+void webkit_dom_test_obj_method_with_optional_nullable_wrapper_is_null(WebKitDOMTestObj* self, WebKitDOMTestObj* obj)
+{
+    WebCore::JSMainThreadNullState state;
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(obj));
+    WebCore::TestObj* item = WebKit::core(self);
+    WebCore::TestObj* convertedObj = WebKit::core(obj);
+    item->methodWithOptionalNullableWrapperIsNull(convertedObj);
+}
+
 gchar* webkit_dom_test_obj_conditional_method1(WebKitDOMTestObj* self)
 {
 #if ENABLE(Condition1)
index f22952a..0c31b24 100644 (file)
@@ -709,6 +709,26 @@ WEBKIT_API void
 webkit_dom_test_obj_method_with_optional_any(WebKitDOMTestObj* self, WebKitDOMany* a);
 
 /**
+ * webkit_dom_test_obj_method_with_optional_nullable_wrapper:
+ * @self: A #WebKitDOMTestObj
+ * @obj: A #WebKitDOMTestObj
+ *
+ * Stability: Unstable
+**/
+WEBKIT_API void
+webkit_dom_test_obj_method_with_optional_nullable_wrapper(WebKitDOMTestObj* self, WebKitDOMTestObj* obj);
+
+/**
+ * webkit_dom_test_obj_method_with_optional_nullable_wrapper_is_null:
+ * @self: A #WebKitDOMTestObj
+ * @obj: A #WebKitDOMTestObj
+ *
+ * Stability: Unstable
+**/
+WEBKIT_API void
+webkit_dom_test_obj_method_with_optional_nullable_wrapper_is_null(WebKitDOMTestObj* self, WebKitDOMTestObj* obj);
+
+/**
  * webkit_dom_test_obj_conditional_method1:
  * @self: A #WebKitDOMTestObj
  *
index 180a97e..9f84fc6 100644 (file)
@@ -158,6 +158,8 @@ JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAr
 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalBoolean(JSC::ExecState*);
 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalBooleanIsFalse(JSC::ExecState*);
 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAny(JSC::ExecState*);
+JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalNullableWrapper(JSC::ExecState*);
+JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalNullableWrapperIsNull(JSC::ExecState*);
 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithCallbackArg(JSC::ExecState*);
 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithNonCallbackArgAndCallbackArg(JSC::ExecState*);
 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithCallbackAndOptionalArg(JSC::ExecState*);
@@ -734,6 +736,8 @@ static const HashTableValue JSTestObjPrototypeTableValues[] =
     { "methodWithOptionalBoolean", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalBoolean), (intptr_t) (0) } },
     { "methodWithOptionalBooleanIsFalse", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalBooleanIsFalse), (intptr_t) (0) } },
     { "methodWithOptionalAny", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAny), (intptr_t) (0) } },
+    { "methodWithOptionalNullableWrapper", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalNullableWrapper), (intptr_t) (0) } },
+    { "methodWithOptionalNullableWrapperIsNull", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalNullableWrapperIsNull), (intptr_t) (0) } },
     { "methodWithCallbackArg", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithCallbackArg), (intptr_t) (1) } },
     { "methodWithNonCallbackArgAndCallbackArg", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithNonCallbackArgAndCallbackArg), (intptr_t) (2) } },
     { "methodWithCallbackAndOptionalArg", JSC::Function, NoIntrinsic, { (intptr_t)static_cast<NativeFunction>(jsTestObjPrototypeFunctionMethodWithCallbackAndOptionalArg), (intptr_t) (0) } },
@@ -4443,6 +4447,36 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAny(Exe
     return JSValue::encode(jsUndefined());
 }
 
+EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalNullableWrapper(ExecState* state)
+{
+    JSValue thisValue = state->thisValue();
+    auto castedThis = jsDynamicCast<JSTestObj*>(thisValue);
+    if (UNLIKELY(!castedThis))
+        return throwThisTypeError(*state, "TestObj", "methodWithOptionalNullableWrapper");
+    ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestObj::info());
+    auto& impl = castedThis->wrapped();
+    TestObj* obj = JSTestObj::toWrapped(state->argument(0));
+    if (UNLIKELY(state->hadException()))
+        return JSValue::encode(jsUndefined());
+    impl.methodWithOptionalNullableWrapper(obj);
+    return JSValue::encode(jsUndefined());
+}
+
+EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalNullableWrapperIsNull(ExecState* state)
+{
+    JSValue thisValue = state->thisValue();
+    auto castedThis = jsDynamicCast<JSTestObj*>(thisValue);
+    if (UNLIKELY(!castedThis))
+        return throwThisTypeError(*state, "TestObj", "methodWithOptionalNullableWrapperIsNull");
+    ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestObj::info());
+    auto& impl = castedThis->wrapped();
+    TestObj* obj = JSTestObj::toWrapped(state->argument(0));
+    if (UNLIKELY(state->hadException()))
+        return JSValue::encode(jsUndefined());
+    impl.methodWithOptionalNullableWrapperIsNull(obj);
+    return JSValue::encode(jsUndefined());
+}
+
 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithCallbackArg(ExecState* state)
 {
     JSValue thisValue = state->thisValue();
@@ -4881,13 +4915,6 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionOverloadedMethodWithOptio
     TestObj* objArg1 = JSTestObj::toWrapped(state->argument(0));
     if (UNLIKELY(state->hadException()))
         return JSValue::encode(jsUndefined());
-
-    size_t argsCount = state->argumentCount();
-    if (argsCount <= 1) {
-        impl.overloadedMethodWithOptionalParameter(objArg1);
-        return JSValue::encode(jsUndefined());
-    }
-
     TestObj* objArg2 = JSTestObj::toWrapped(state->argument(1));
     if (UNLIKELY(state->hadException()))
         return JSValue::encode(jsUndefined());
index 7811ae5..dea3d26 100644 (file)
@@ -194,6 +194,8 @@ WEBCORE_EXPORT @interface DOMTestObj : DOMObject
 - (void)methodWithOptionalBoolean:(BOOL)b;
 - (void)methodWithOptionalBooleanIsFalse:(BOOL)b;
 - (void)methodWithOptionalAny:(DOMany *)a;
+- (void)methodWithOptionalNullableWrapper:(DOMTestObj *)obj;
+- (void)methodWithOptionalNullableWrapperIsNull:(DOMTestObj *)obj;
 - (void)classMethod;
 - (int)classMethodWithOptional:(int)arg;
 - (void)classMethod2:(int)arg;
index d4ac453..397c3fe 100644 (file)
     IMPL->methodWithOptionalAny(core(a));
 }
 
+- (void)methodWithOptionalNullableWrapper:(DOMTestObj *)obj
+{
+    WebCore::JSMainThreadNullState state;
+    IMPL->methodWithOptionalNullableWrapper(core(obj));
+}
+
+- (void)methodWithOptionalNullableWrapperIsNull:(DOMTestObj *)obj
+{
+    WebCore::JSMainThreadNullState state;
+    IMPL->methodWithOptionalNullableWrapperIsNull(core(obj));
+}
+
 
 #if ENABLE(Condition1)
 - (NSString *)conditionalMethod1
index 2b4a37a..cdc0d14 100644 (file)
@@ -201,6 +201,8 @@ enum _optional { "", "OptionalValue1", "OptionalValue2", "OptionalValue3" };
     void    methodWithOptionalBoolean(optional boolean b);
     void    methodWithOptionalBooleanIsFalse(optional boolean b = false);
     void    methodWithOptionalAny(optional any a);
+    void    methodWithOptionalNullableWrapper(optional TestObj? obj);
+    void    methodWithOptionalNullableWrapperIsNull(optional TestObj? obj = null);
 
 #if defined(TESTING_JS)
     // Callback interface parameters.
@@ -258,7 +260,7 @@ enum _optional { "", "OptionalValue1", "OptionalValue2", "OptionalValue3" };
     // FIXME: Implement support for overloaded functions with variadic arguments.
     void    overloadedMethod(Blob... blobArgs);
 
-    void overloadedMethodWithOptionalParameter(TestObj? objArg1, optional TestObj? objArg2);
+    void overloadedMethodWithOptionalParameter(TestObj? objArg1, optional TestObj? objArg2 = null);
     void overloadedMethodWithOptionalParameter(TestObj? objArg, optional long longArg);
 #endif
 
index 9b62d19..3dffdcf 100644 (file)
@@ -22,6 +22,8 @@
 ] interface MediaQueryList {
     readonly attribute DOMString media;
     readonly attribute boolean matches;
-    void addListener(optional MediaQueryListListener listener);
-    void removeListener(optional MediaQueryListListener listener);
+
+    // FIXME: The listener parameter should not be optional.
+    void addListener(optional MediaQueryListListener? listener = null);
+    void removeListener(optional MediaQueryListListener? listener = null);
 };
index bd2d13f..3e6b0fd 100644 (file)
@@ -21,5 +21,5 @@
     CallbackNeedsOperatorEqual,
     Callback=FunctionOnly,
 ] callback interface MediaQueryListListener {
-    boolean queryChanged(optional MediaQueryList list = null);
+    boolean queryChanged(optional MediaQueryList? list = null);
 };
index 94ebc12..186a7ee 100644 (file)
 #else
     [NewObject] NodeIterator createNodeIterator(Node root,
         optional unsigned long whatToShow = 0xFFFFFFFF,
-        optional NodeFilter? filter);
+        optional NodeFilter? filter = null);
     [NewObject] TreeWalker createTreeWalker(Node root,
         optional unsigned long whatToShow = 0xFFFFFFFF,
-        optional NodeFilter? filter);
+        optional NodeFilter? filter = null);
 #endif
 
     // DOM Level 2 Abstract Views (DocumentView interface)
index 39c8cb4..e3c516a 100644 (file)
     ExportMacro=WEBCORE_EXPORT,
     InterfaceName=Path2D,
 ] interface DOMPath {
-    // FIXME: The parameters should not be nullable.
-    [Conditional=CANVAS_PATH] void addPath(DOMPath? path, optional SVGMatrix? transform);
+    // FIXME: This should be:
+    // [Conditional=CANVAS_PATH] void addPath(DOMPath path, optional SVGMatrix transform);
+    [Conditional=CANVAS_PATH] void addPath(DOMPath? path);
+    [Conditional=CANVAS_PATH] void addPath(DOMPath? path, SVGMatrix transform);
 
     // FIXME: These methods should be shared with CanvasRenderingContext2D in the CanvasPathMethods interface.
     void closePath();
index 336ae85..ac22050 100644 (file)
@@ -49,7 +49,7 @@
     boolean containsNode(optional Node? node = null, optional boolean allowPartial = false);
     [RaisesException] void selectAllChildren(optional Node? node = null);
 
-    [RaisesException] void extend(optional Node node = null, optional long offset = 0);
+    [RaisesException] void extend(Node node, optional long offset = 0);
 
     [RaisesException] Range getRangeAt(optional long index = 0);
     void removeAllRanges();
index ff7ec17..edd8de5 100644 (file)
@@ -43,7 +43,7 @@ interface SVGMarkerElement : SVGElement {
     readonly attribute SVGAnimatedAngle       orientAngle;
 
     void setOrientToAuto();
-    void setOrientToAngle(optional SVGAngle angle = null);
+    void setOrientToAngle(SVGAngle angle);
 };
 
 SVGMarkerElement implements SVGExternalResourcesRequired;
index 613c402..141260f 100644 (file)
@@ -50,10 +50,16 @@ interface SVGSVGElement : SVGGraphicsElement {
     boolean animationsPaused();
     unrestricted float getCurrentTime();
     void setCurrentTime(optional unrestricted float seconds = NaN);
-    NodeList getIntersectionList(optional SVGRect rect = null, optional SVGElement? referenceElement = null);
-    NodeList getEnclosureList(optional SVGRect rect = null, optional SVGElement? referenceElement = null);
-    boolean checkIntersection(optional SVGElement? element = null, optional SVGRect rect = null);
-    boolean checkEnclosure(optional SVGElement? element = null, optional SVGRect rect = null);
+
+    // FIXME: referenceElement should not be optional.
+    NodeList getIntersectionList(SVGRect rect, optional SVGElement? referenceElement = null);
+
+    // FIXME: referenceElement should not be optional.
+    NodeList getEnclosureList(SVGRect rect, optional SVGElement? referenceElement = null);
+
+    boolean checkIntersection(SVGElement? element, SVGRect rect); // element should not be nullable.
+    boolean checkEnclosure(SVGElement? element, SVGRect rect); // element should not be nullable.
+
     void deselectAll();
 
     SVGNumber createSVGNumber();
@@ -63,7 +69,7 @@ interface SVGSVGElement : SVGGraphicsElement {
     SVGMatrix createSVGMatrix();
     SVGRect createSVGRect();
     SVGTransform createSVGTransform();
-    SVGTransform createSVGTransformFromMatrix(optional SVGMatrix matrix = null);
+    SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
 
     // FIXME: Using "undefined" as default parameter value is wrong.
     Element getElementById([RequiresExistingAtomicString] optional DOMString elementId = "undefined");
index 151d797..b85e651 100644 (file)
@@ -40,7 +40,7 @@ interface SVGTextContentElement : SVGGraphicsElement {
     [RaisesException] SVGPoint getEndPositionOfChar(optional unsigned long offset = 0);
     [RaisesException] SVGRect getExtentOfChar(optional unsigned long offset = 0);
     [RaisesException] unrestricted float getRotationOfChar(optional unsigned long offset = 0);
-    long getCharNumAtPosition(optional SVGPoint point = null);
+    long getCharNumAtPosition(SVGPoint point);
     [RaisesException] void selectSubString(optional unsigned long offset = 0, optional unsigned long length = 0);
 };
 
index ae9cc98..f9650a5 100644 (file)
@@ -2384,11 +2384,6 @@ unsigned Internals::compositingUpdateCount(ExceptionCode& ec)
     return document->renderView()->compositor().compositingUpdateCount();
 }
 
-void Internals::updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(ExceptionCode& ec)
-{
-    updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(nullptr, ec);
-}
-
 void Internals::updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node* node, ExceptionCode& ec)
 {
     Document* document;
index 1099ff9..a3b05b8 100644 (file)
@@ -326,7 +326,6 @@ public:
     void startTrackingCompositingUpdates(ExceptionCode&);
     unsigned compositingUpdateCount(ExceptionCode&);
 
-    void updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(ExceptionCode&);
     void updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node*, ExceptionCode&);
     unsigned layoutCount() const;
 
index 4d4df19..a3aef12 100644 (file)
@@ -332,7 +332,7 @@ enum AutoFillButtonType {
     // |node| should be Document, HTMLIFrameElement, or unspecified.
     // If |node| is an HTMLIFrameElement, it assumes node.contentDocument is
     // specified without security checks. Unspecified or null means this document.
-    [RaisesException] void updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(optional Node? node);
+    [RaisesException] void updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(optional Node? node = null);
 
     readonly attribute unsigned long layoutCount;
 
index e1e6658..74d950e 100644 (file)
@@ -23,7 +23,7 @@
 ] interface XPathEvaluator {
     // FIXME: Using "undefined" as default parameter value is wrong.
     [RaisesException] XPathExpression createExpression(optional DOMString expression = "undefined",
-                                     optional XPathNSResolver resolver = null);
+                                     optional XPathNSResolver? resolver = null);
 
     XPathNSResolver createNSResolver(optional Node? nodeResolver = null);