Align Range.insertNode() input validation with the specification
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 03:17:09 +0000 (03:17 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 03:17:09 +0000 (03:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160624

Reviewed by Sam Weinig.

LayoutTests/imported/w3c:

Rebaseline W3C test now that more checks are passing.

* web-platform-tests/dom/ranges/Range-insertNode-expected.txt:

Source/WebCore:

Align Range.insertNode() input validation with the specification:
- https://dom.spec.whatwg.org/#dom-range-insertnode
- https://dom.spec.whatwg.org/#concept-range-insert (step 1)

In particular, if range’s start node is a ProcessingInstruction or
Comment node, is a Text node whose parent is null, or is node, then
we should throw a HierarchyRequestError.

Chrome behaves according to the specification.

No new tests, rebaselined existing test.

* dom/Range.cpp:
(WebCore::Range::insertNode):

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/ranges/Range-insertNode-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/Range.cpp

index d1cc885..33a5784 100644 (file)
@@ -1,5 +1,16 @@
 2016-08-05  Chris Dumez  <cdumez@apple.com>
 
+        Align Range.insertNode() input validation with the specification
+        https://bugs.webkit.org/show_bug.cgi?id=160624
+
+        Reviewed by Sam Weinig.
+
+        Rebaseline W3C test now that more checks are passing.
+
+        * web-platform-tests/dom/ranges/Range-insertNode-expected.txt:
+
+2016-08-05  Chris Dumez  <cdumez@apple.com>
+
         Window's named properties should be exposed on a WindowProperties object in its prototype
         https://bugs.webkit.org/show_bug.cgi?id=160354
 
index 62f3b3d..3b27f79 100644 (file)
@@ -3,11 +3,8 @@ To debug test failures, add a query parameter "subtest" with the test id (like "
 
 PASS 0,0: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0] 
 PASS 0,0: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0] 
-FAIL 0,1: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 0,1: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 0,1: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0].firstChild 
+PASS 0,1: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[0].firstChild 
 PASS 0,2: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[1].firstChild 
 PASS 0,2: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node paras[1].firstChild 
 PASS 0,3: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignPara1 
@@ -50,11 +47,8 @@ PASS 0,21: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild,
 PASS 0,21: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 0], node foreignDoctype 
 PASS 1,0: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0] 
 PASS 1,0: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0] 
-FAIL 1,1: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 1,1: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 1,1: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0].firstChild 
+PASS 1,1: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[0].firstChild 
 PASS 1,2: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[1].firstChild 
 PASS 1,2: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node paras[1].firstChild 
 PASS 1,3: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignPara1 
@@ -97,11 +91,8 @@ PASS 1,21: resulting DOM for range [paras[0].firstChild, 0, paras[0].firstChild,
 PASS 1,21: resulting range position for range [paras[0].firstChild, 0, paras[0].firstChild, 1], node foreignDoctype 
 PASS 2,0: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0] 
 PASS 2,0: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0] 
-FAIL 2,1: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 2,1: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "Ä" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 2,1: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0].firstChild 
+PASS 2,1: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[0].firstChild 
 PASS 2,2: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[1].firstChild 
 PASS 2,2: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node paras[1].firstChild 
 PASS 2,3: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignPara1 
@@ -144,11 +135,8 @@ PASS 2,21: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild,
 PASS 2,21: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 8], node foreignDoctype 
 PASS 3,0: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0] 
 PASS 3,0: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0] 
-FAIL 3,1: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 3,1: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "Ä" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 3,1: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0].firstChild 
+PASS 3,1: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[0].firstChild 
 PASS 3,2: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[1].firstChild 
 PASS 3,2: resulting range position for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node paras[1].firstChild 
 PASS 3,3: resulting DOM for range [paras[0].firstChild, 2, paras[0].firstChild, 9], node foreignPara1 
@@ -193,11 +181,8 @@ PASS 4,0: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild,
 PASS 4,0: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
 PASS 4,1: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
 PASS 4,1: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
-FAIL 4,2: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 4,2: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild assert_true: First differing node: expected Text node "Ijklmnop
-", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 4,2: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
+PASS 4,2: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
 PASS 4,3: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
 PASS 4,3: resulting range position for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
 PASS 4,4: resulting DOM for range [paras[1].firstChild, 0, paras[1].firstChild, 0], node foreignPara1.firstChild 
@@ -240,11 +225,8 @@ PASS 5,0: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild,
 PASS 5,0: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0] 
 PASS 5,1: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0].firstChild 
 PASS 5,1: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[0].firstChild 
-FAIL 5,2: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[1].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 5,2: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[1].firstChild assert_true: First differing node: expected Text node "Ijklmnop
-", got Text node "Ij" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 5,2: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[1].firstChild 
+PASS 5,2: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node paras[1].firstChild 
 PASS 5,3: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1 
 PASS 5,3: resulting range position for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1 
 PASS 5,4: resulting DOM for range [paras[1].firstChild, 2, paras[1].firstChild, 9], node foreignPara1.firstChild 
@@ -295,10 +277,8 @@ PASS 6,4: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.fi
 PASS 6,4: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node foreignPara1.firstChild 
 PASS 6,5: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1 
 PASS 6,5: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1 
-FAIL 6,6: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1.firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 6,6: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1.firstChild assert_true: First differing node: expected Text node "Opqrstuv", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 6,6: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1.firstChild 
+PASS 6,6: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedPara1.firstChild 
 PASS 6,7: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node document 
 PASS 6,7: resulting range position for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node document 
 PASS 6,8: resulting DOM for range [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0], node detachedDiv 
@@ -341,10 +321,8 @@ PASS 7,4: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.fi
 PASS 7,4: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node foreignPara1.firstChild 
 PASS 7,5: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1 
 PASS 7,5: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1 
-FAIL 7,6: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1.firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 7,6: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1.firstChild assert_true: First differing node: expected Text node "Opqrstuv", got Text node "Op" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 7,6: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1.firstChild 
+PASS 7,6: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedPara1.firstChild 
 PASS 7,7: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node document 
 PASS 7,7: resulting range position for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node document 
 PASS 7,8: resulting DOM for range [detachedPara1.firstChild, 2, detachedPara1.firstChild, 8], node detachedDiv 
@@ -383,10 +361,8 @@ PASS 8,2: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firs
 PASS 8,2: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node paras[1].firstChild 
 PASS 8,3: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1 
 PASS 8,3: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1 
-FAIL 8,4: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1.firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 8,4: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1.firstChild assert_true: First differing node: expected Text node "Efghijkl", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 8,4: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1.firstChild 
+PASS 8,4: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node foreignPara1.firstChild 
 PASS 8,5: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1 
 PASS 8,5: resulting range position for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1 
 PASS 8,6: resulting DOM for range [foreignPara1.firstChild, 0, foreignPara1.firstChild, 0], node detachedPara1.firstChild 
@@ -429,10 +405,8 @@ PASS 9,2: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firs
 PASS 9,2: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node paras[1].firstChild 
 PASS 9,3: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1 
 PASS 9,3: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1 
-FAIL 9,4: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1.firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 9,4: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1.firstChild assert_true: First differing node: expected Text node "Efghijkl", got Text node "Ef" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 9,4: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1.firstChild 
+PASS 9,4: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node foreignPara1.firstChild 
 PASS 9,5: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1 
 PASS 9,5: resulting range position for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1 
 PASS 9,6: resulting DOM for range [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8], node detachedPara1.firstChild 
@@ -821,11 +795,8 @@ PASS 17,21: resulting DOM for range [detachedPara1, 0, detachedPara1, 1], node f
 PASS 17,21: resulting range position for range [detachedPara1, 0, detachedPara1, 1], node foreignDoctype 
 PASS 18,0: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
 PASS 18,0: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0] 
-FAIL 18,1: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 18,1: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 18,1: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
+PASS 18,1: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[0].firstChild 
 PASS 18,2: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
 PASS 18,2: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node paras[1].firstChild 
 PASS 18,3: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignPara1 
@@ -868,11 +839,8 @@ PASS 18,21: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild
 PASS 18,21: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 0], node foreignDoctype 
 PASS 19,0: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0] 
 PASS 19,0: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0] 
-FAIL 19,1: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 19,1: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 19,1: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0].firstChild 
+PASS 19,1: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[0].firstChild 
 PASS 19,2: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[1].firstChild 
 PASS 19,2: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node paras[1].firstChild 
 PASS 19,3: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignPara1 
@@ -915,11 +883,8 @@ PASS 19,21: resulting DOM for range [paras[0].firstChild, 0, paras[1].firstChild
 PASS 19,21: resulting range position for range [paras[0].firstChild, 0, paras[1].firstChild, 8], node foreignDoctype 
 PASS 20,0: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[0] 
 PASS 20,0: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[0] 
-FAIL 20,1: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[0].firstChild assert_throws: A HIERARCHY_REQUEST_ERR DOMException must be thrown in this case function "function () {
-                try {
-                    a..." did not throw
-FAIL 20,1: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[0].firstChild assert_true: First differing node: expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-", got Text node "Äb" [Actual and expected mismatch for range's tree root.  ] expected true got false
+PASS 20,1: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[0].firstChild 
+PASS 20,1: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[0].firstChild 
 PASS 20,2: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node paras[1].firstChild 
 PASS 20,2: resulting range position for range [paras[0].firstChild, 3, paras[3], 1], node paras[1].firstChild 
 PASS 20,3: resulting DOM for range [paras[0].firstChild, 3, paras[3], 1], node foreignPara1 
index c663127..f82424a 100644 (file)
@@ -1,5 +1,27 @@
 2016-08-05  Chris Dumez  <cdumez@apple.com>
 
+        Align Range.insertNode() input validation with the specification
+        https://bugs.webkit.org/show_bug.cgi?id=160624
+
+        Reviewed by Sam Weinig.
+
+        Align Range.insertNode() input validation with the specification:
+        - https://dom.spec.whatwg.org/#dom-range-insertnode
+        - https://dom.spec.whatwg.org/#concept-range-insert (step 1)
+
+        In particular, if range’s start node is a ProcessingInstruction or
+        Comment node, is a Text node whose parent is null, or is node, then
+        we should throw a HierarchyRequestError.
+
+        Chrome behaves according to the specification.
+
+        No new tests, rebaselined existing test.
+
+        * dom/Range.cpp:
+        (WebCore::Range::insertNode):
+
+2016-08-05  Chris Dumez  <cdumez@apple.com>
+
         [Web IDL] Add support for 'any' type in dictionaries
         https://bugs.webkit.org/show_bug.cgi?id=160511
 
index 5b383b2..1abe51b 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "ClientRect.h"
 #include "ClientRectList.h"
+#include "Comment.h"
 #include "DocumentFragment.h"
 #include "Event.h"
 #include "Frame.h"
@@ -814,12 +815,20 @@ RefPtr<DocumentFragment> Range::cloneContents(ExceptionCode& ec)
 
 void Range::insertNode(Ref<Node>&& node, ExceptionCode& ec)
 {
-    bool startIsCharacterData = is<CharacterData>(startContainer());
-    if (startIsCharacterData && !startContainer().parentNode()) {
+    if (is<Comment>(startContainer()) || is<ProcessingInstruction>(startContainer())) {
         ec = HIERARCHY_REQUEST_ERR;
         return;
     }
-    bool startIsText = startIsCharacterData && startContainer().nodeType() == Node::TEXT_NODE;
+    bool startIsText = startContainer().nodeType() == Node::TEXT_NODE;
+    if (startIsText && !startContainer().parentNode()) {
+        ec = HIERARCHY_REQUEST_ERR;
+        return;
+    }
+    if (node.ptr() == &startContainer()) {
+        ec = HIERARCHY_REQUEST_ERR;
+        return;
+    }
+
     RefPtr<Node> referenceNode = startIsText ? &startContainer() : startContainer().traverseToChildAt(startOffset());
     Node* parentNode = referenceNode ? referenceNode->parentNode() : &startContainer();
     if (!is<ContainerNode>(parentNode)) {