Parameters to Node.replaceChild() / insertBefore() should be mandatory
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Jul 2016 19:54:13 +0000 (19:54 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Jul 2016 19:54:13 +0000 (19:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160091

Reviewed by Darin Adler.

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:

Parameters to Node.replaceChild() / insertBefore() should be mandatory:
- https://dom.spec.whatwg.org/#node

The compatibility risk should be low since Firefox and Chrome both agree
with the specification and because it does not make much sense to omit
parameters when using this API.

No new tests, rebaselined existing tests.

* bindings/js/JSNodeCustom.cpp:
(WebCore::JSNode::insertBefore):
(WebCore::JSNode::replaceChild):

LayoutTests:

Update existing tests due to the behavior change.

* fast/block/basic/empty-anonymous-block-remove-crash.html:
* fast/html/details-summary-document-child.html:
* fast/repaint/focus-ring-with-negative-offset-repaint.html:
* svg/animations/mpath-remove-from-dependents-on-delete-crash.html:

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

LayoutTests/ChangeLog
LayoutTests/fast/block/basic/empty-anonymous-block-remove-crash.html
LayoutTests/fast/dom/move-nodes-across-documents.html
LayoutTests/fast/html/details-summary-document-child.html
LayoutTests/fast/repaint/focus-ring-with-negative-offset-repaint.html
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
LayoutTests/svg/animations/mpath-remove-from-dependents-on-delete-crash.html
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSNodeCustom.cpp

index 6f964ab..a6fa06a 100644 (file)
@@ -1,5 +1,19 @@
 2016-07-22  Chris Dumez  <cdumez@apple.com>
 
+        Parameters to Node.replaceChild() / insertBefore() should be mandatory
+        https://bugs.webkit.org/show_bug.cgi?id=160091
+
+        Reviewed by Darin Adler.
+
+        Update existing tests due to the behavior change.
+
+        * fast/block/basic/empty-anonymous-block-remove-crash.html:
+        * fast/html/details-summary-document-child.html:
+        * fast/repaint/focus-ring-with-negative-offset-repaint.html:
+        * svg/animations/mpath-remove-from-dependents-on-delete-crash.html:
+
+2016-07-22  Chris Dumez  <cdumez@apple.com>
+
         First parameter to getElementById() should be mandatory
         https://bugs.webkit.org/show_bug.cgi?id=160087
 
index 22a5cfa..bbc2aa6 100644 (file)
@@ -10,7 +10,7 @@
             function runTest()\r
             {\r
                 var button = document.getElementById("test");\r
-                button.insertBefore(document.createElement("tbody"));\r
+                button.insertBefore(document.createElement("tbody"), null);\r
                 document.body.offsetTop;\r
                 document.body.removeChild(button);\r
                 \r
index 3881f04..0d8ff6e 100644 (file)
@@ -100,7 +100,7 @@ function run()
         };
         document.body.addEventListener('DOMSubtreeModified', mutationHandler, true);
         try {
-            iframeDoc.body.insertBefore(element);
+            iframeDoc.body.insertBefore(element, null);
         } catch (e) {
           throw e;
         } finally {
index df92138..243ad6c 100644 (file)
@@ -6,7 +6,7 @@ if (window.testRunner)
 
 function test() {
     document.open();
-    document.insertBefore(document.createElement("summary"));
+    document.insertBefore(document.createElement("summary"), null);
     // The document don't have <body> so we need use console.log()
     // to make readable expectation.
     console.log("PASS unless crash");
index bc8d351..363019f 100644 (file)
@@ -9,7 +9,7 @@ function repaintTest() {
         var element = document.createElement("div");
         element.style.outlineOffset = -i + "px";
         element.style.top = (30 * i) + "px";
-        document.body.insertBefore(element);
+        document.body.insertBefore(element, null);
     }
 }
 onload = runRepaintTest;
index a4f157e..ada2510 100644 (file)
@@ -1,5 +1,17 @@
 2016-07-22  Chris Dumez  <cdumez@apple.com>
 
+        Parameters to Node.replaceChild() / insertBefore() should be mandatory
+        https://bugs.webkit.org/show_bug.cgi?id=160091
+
+        Reviewed by Darin Adler.
+
+        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-07-22  Chris Dumez  <cdumez@apple.com>
+
         Parameter to Node.contains() should be mandatory
         https://bugs.webkit.org/show_bug.cgi?id=160084
 
index fd15341..abd863c 100644 (file)
@@ -391,9 +391,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on new Document() wit
 PASS Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "replaceChild" with the proper type (44) 
@@ -521,9 +519,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc with too fe
 PASS Node interface: xmlDoc must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on xmlDoc with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc must inherit property "replaceChild" with the proper type (44) 
@@ -631,9 +627,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on document.doctype w
 PASS Node interface: document.doctype must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on document.doctype with too few arguments must throw TypeError 
 PASS Node interface: document.doctype must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError 
 PASS Node interface: document.doctype must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on document.doctype with too few arguments must throw TypeError 
 PASS Node interface: document.doctype must inherit property "replaceChild" with the proper type (44) 
@@ -727,9 +721,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createDoc
 PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
 PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" did not throw
+PASS Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
 PASS Node interface: document.createDocumentFragment() must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
 PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild" with the proper type (44) 
@@ -934,9 +926,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on element with too f
 PASS Node interface: element must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on element with too few arguments must throw TypeError 
 PASS Node interface: element must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" did not throw
+PASS Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError 
 PASS Node interface: element must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on element with too few arguments must throw TypeError 
 PASS Node interface: element must inherit property "replaceChild" with the proper type (44) 
@@ -1097,9 +1087,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createTex
 PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
 PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
 PASS Node interface: document.createTextNode("abc") must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
 PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild" with the proper type (44) 
@@ -1193,9 +1181,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc.createProce
 PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
 PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild" with the proper type (44) 
@@ -1287,9 +1273,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createCom
 PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace" with the proper type (41) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
 PASS Node interface: document.createComment("abc") must inherit property "insertBefore" with the proper type (42) 
-FAIL Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
 PASS Node interface: document.createComment("abc") must inherit property "appendChild" with the proper type (43) 
 PASS Node interface: calling appendChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
 PASS Node interface: document.createComment("abc") must inherit property "replaceChild" with the proper type (44) 
index 501e7bb..199bf81 100644 (file)
@@ -372,9 +372,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on iframe.contentDocu
 PASS Node interface: iframe.contentDocument must inherit property "isDefaultNamespace" with the proper type (39) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
 PASS Node interface: iframe.contentDocument must inherit property "insertBefore" with the proper type (40) 
-FAIL Node interface: calling insertBefore(Node,Node) on iframe.contentDocument with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on iframe.contentDocument with too few arguments must throw TypeError 
 PASS Node interface: iframe.contentDocument must inherit property "appendChild" with the proper type (41) 
 PASS Node interface: calling appendChild(Node) on iframe.contentDocument with too few arguments must throw TypeError 
 PASS Node interface: iframe.contentDocument must inherit property "replaceChild" with the proper type (42) 
@@ -638,9 +636,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on new Document() wit
 PASS Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (39) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "insertBefore" with the proper type (40) 
-FAIL Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "appendChild" with the proper type (41) 
 PASS Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError 
 PASS Node interface: new Document() must inherit property "replaceChild" with the proper type (42) 
@@ -907,9 +903,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on document.implement
 PASS Node interface: document.implementation.createDocument(null, "", null) must inherit property "isDefaultNamespace" with the proper type (39) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
 PASS Node interface: document.implementation.createDocument(null, "", null) must inherit property "insertBefore" with the proper type (40) 
-FAIL Node interface: calling insertBefore(Node,Node) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" threw object "HierarchyRequestError (DOM Exception 3): The operation wo..." ("HierarchyRequestError") expected object "TypeError" ("TypeError")
+PASS Node interface: calling insertBefore(Node,Node) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
 PASS Node interface: document.implementation.createDocument(null, "", null) must inherit property "appendChild" with the proper type (41) 
 PASS Node interface: calling appendChild(Node) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
 PASS Node interface: document.implementation.createDocument(null, "", null) must inherit property "replaceChild" with the proper type (42) 
@@ -1301,9 +1295,7 @@ PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createEle
 PASS Node interface: document.createElement("noscript") must inherit property "isDefaultNamespace" with the proper type (39) 
 PASS Node interface: calling isDefaultNamespace(DOMString) on document.createElement("noscript") with too few arguments must throw TypeError 
 PASS Node interface: document.createElement("noscript") must inherit property "insertBefore" with the proper type (40) 
-FAIL Node interface: calling insertBefore(Node,Node) on document.createElement("noscript") with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
-            fn.apply(obj, args);
-        }" did not throw
+PASS Node interface: calling insertBefore(Node,Node) on document.createElement("noscript") with too few arguments must throw TypeError 
 PASS Node interface: document.createElement("noscript") must inherit property "appendChild" with the proper type (41) 
 PASS Node interface: calling appendChild(Node) on document.createElement("noscript") with too few arguments must throw TypeError 
 PASS Node interface: document.createElement("noscript") must inherit property "replaceChild" with the proper type (42) 
index 8029ba0..96ad9db 100644 (file)
@@ -19,7 +19,7 @@
             window.GCController.collect();
           else if (window.gc)
             gc();
-          document.getElementById("A").insertBefore(document.getElementById("path_a"));
+          document.getElementById("A").insertBefore(document.getElementById("path_a"), null);
           if (location.hash == '')
             location.hash = '#1';
           else
index cb41ced..8b40c70 100644 (file)
@@ -1,5 +1,25 @@
 2016-07-22  Chris Dumez  <cdumez@apple.com>
 
+        Parameters to Node.replaceChild() / insertBefore() should be mandatory
+        https://bugs.webkit.org/show_bug.cgi?id=160091
+
+        Reviewed by Darin Adler.
+
+        Parameters to Node.replaceChild() / insertBefore() should be mandatory:
+        - https://dom.spec.whatwg.org/#node
+
+        The compatibility risk should be low since Firefox and Chrome both agree
+        with the specification and because it does not make much sense to omit
+        parameters when using this API.
+
+        No new tests, rebaselined existing tests.
+
+        * bindings/js/JSNodeCustom.cpp:
+        (WebCore::JSNode::insertBefore):
+        (WebCore::JSNode::replaceChild):
+
+2016-07-22  Chris Dumez  <cdumez@apple.com>
+
         Parameter to Node.contains() should be mandatory
         https://bugs.webkit.org/show_bug.cgi?id=160084
 
index 8529075..9b90b23 100644 (file)
@@ -114,13 +114,16 @@ bool JSNodeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, v
 
 JSValue JSNode::insertBefore(ExecState& state)
 {
-    JSValue newChildValue = state.argument(0);
+    if (UNLIKELY(state.argumentCount() < 2))
+        return state.vm().throwException(&state, createNotEnoughArgumentsError(&state));
+
+    JSValue newChildValue = state.uncheckedArgument(0);
     auto* newChild = JSNode::toWrapped(newChildValue);
     if (UNLIKELY(!newChild))
         return JSValue::decode(throwArgumentTypeError(state, 0, "node", "Node", "insertBefore", "Node"));
 
     ExceptionCode ec = 0;
-    if (UNLIKELY(!wrapped().insertBefore(*newChild, JSNode::toWrapped(state.argument(1)), ec))) {
+    if (UNLIKELY(!wrapped().insertBefore(*newChild, JSNode::toWrapped(state.uncheckedArgument(1)), ec))) {
         setDOMException(&state, ec);
         return jsUndefined();
     }
@@ -131,8 +134,11 @@ JSValue JSNode::insertBefore(ExecState& state)
 
 JSValue JSNode::replaceChild(ExecState& state)
 {
-    auto* newChild = JSNode::toWrapped(state.argument(0));
-    JSValue oldChildValue = state.argument(1);
+    if (UNLIKELY(state.argumentCount() < 2))
+        return state.vm().throwException(&state, createNotEnoughArgumentsError(&state));
+
+    auto* newChild = JSNode::toWrapped(state.uncheckedArgument(0));
+    JSValue oldChildValue = state.uncheckedArgument(1);
     auto* oldChild = JSNode::toWrapped(oldChildValue);
     if (UNLIKELY(!newChild || !oldChild)) {
         if (!newChild)