Align Range.createContextualFragment() input validation with the specification
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 7 Aug 2016 02:43:53 +0000 (02:43 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 7 Aug 2016 02:43:53 +0000 (02:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160634

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Rebaseline W3C test now that more checks are passing.

* web-platform-tests/domparsing/createContextualFragment-expected.txt:

Source/WebCore:

Align Range.createContextualFragment() input validation with the specification:
- https://w3c.github.io/DOM-Parsing/#idl-def-range-createcontextualfragment(domstring) (Step 2)

In particular, we were throwing a NOT_SUPPORTED_ERR when element had localname
"html" but was not in the HTML namespace. We should not throw in this case.

Firefox complies with the specification here.

No new tests, rebaselined existing test.

* dom/Range.cpp:
(WebCore::Range::createContextualFragment): Deleted.

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/domparsing/createContextualFragment-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h
Source/WebCore/dom/Range.cpp
Source/WebCore/editing/markup.cpp
Source/WebCore/editing/markup.h
Source/WebCore/html/HTMLElement.cpp
Source/WebCore/html/HTMLElement.h

index 7f1412d..2f14299 100644 (file)
@@ -1,5 +1,16 @@
 2016-08-06  Chris Dumez  <cdumez@apple.com>
 
+        Align Range.createContextualFragment() input validation with the specification
+        https://bugs.webkit.org/show_bug.cgi?id=160634
+
+        Reviewed by Darin Adler.
+
+        Rebaseline W3C test now that more checks are passing.
+
+        * web-platform-tests/domparsing/createContextualFragment-expected.txt:
+
+2016-08-06  Chris Dumez  <cdumez@apple.com>
+
         [Web IDL] Add support for [Unscopable] extended attribute
         https://bugs.webkit.org/show_bug.cgi?id=160637
 
index 4f77e01..df33aec 100644 (file)
@@ -7,8 +7,8 @@ PASS <script>s should be run when appended to the document (but not before)
 PASS <html> and <body> must work the same, 1 
 PASS <html> and <body> must work the same, 2 
 PASS Implicit <body> creation 
-FAIL Namespace generally shouldn't matter The operation is not supported.
-FAIL <html> in a different namespace shouldn't be special The operation is not supported.
+PASS Namespace generally shouldn't matter 
+PASS <html> in a different namespace shouldn't be special 
 PASS null should be stringified 
 PASS undefined should be stringified 
 
index 893e6b0..18e2036 100644 (file)
@@ -1,5 +1,25 @@
 2016-08-06  Chris Dumez  <cdumez@apple.com>
 
+        Align Range.createContextualFragment() input validation with the specification
+        https://bugs.webkit.org/show_bug.cgi?id=160634
+
+        Reviewed by Darin Adler.
+
+        Align Range.createContextualFragment() input validation with the specification:
+        - https://w3c.github.io/DOM-Parsing/#idl-def-range-createcontextualfragment(domstring) (Step 2)
+
+        In particular, we were throwing a NOT_SUPPORTED_ERR when element had localname
+        "html" but was not in the HTML namespace. We should not throw in this case.
+
+        Firefox complies with the specification here.
+
+        No new tests, rebaselined existing test.
+
+        * dom/Range.cpp:
+        (WebCore::Range::createContextualFragment): Deleted.
+
+2016-08-06  Chris Dumez  <cdumez@apple.com>
+
         [Web IDL] Add support for [Unscopable] extended attribute
         https://bugs.webkit.org/show_bug.cgi?id=160637
 
index bd18a3f..c30f437 100644 (file)
@@ -3481,6 +3481,44 @@ String Element::completeURLsInAttributeValue(const URL& base, const Attribute& a
     return URL(base, attribute.value()).string();
 }
 
+bool Element::ieForbidsInsertHTML() const
+{
+    // FIXME: Supposedly IE disallows setting innerHTML, outerHTML
+    // and createContextualFragment on these tags. We have no tests to
+    // verify this however, so this list could be totally wrong.
+    // This list was moved from the previous endTagRequirement() implementation.
+    // This is also called from editing and assumed to be the list of tags
+    // for which no end tag should be serialized. It's unclear if the list for
+    // IE compat and the list for serialization sanity are the same.
+    if (hasTagName(areaTag)
+        || hasTagName(baseTag)
+        || hasTagName(basefontTag)
+        || hasTagName(brTag)
+        || hasTagName(colTag)
+        || hasTagName(embedTag)
+        || hasTagName(frameTag)
+        || hasTagName(hrTag)
+        || hasTagName(imageTag)
+        || hasTagName(imgTag)
+        || hasTagName(inputTag)
+        || hasTagName(isindexTag)
+        || hasTagName(linkTag)
+        || hasTagName(metaTag)
+        || hasTagName(paramTag)
+        || hasTagName(sourceTag)
+        || hasTagName(wbrTag))
+        return true;
+    // FIXME: I'm not sure why dashboard mode would want to change the
+    // serialization of <canvas>, that seems like a bad idea.
+#if ENABLE(DASHBOARD_SUPPORT)
+    if (hasTagName(canvasTag)) {
+        Settings* settings = document().settings();
+        if (settings && settings->usesDashboardBackwardCompatibilityMode())
+            return true;
+    }
+#endif
+    return false;
+}
 
 Node* Element::insertAdjacent(const String& where, Ref<Node>&& newChild, ExceptionCode& ec)
 {
index 2d82864..ae6f5d4 100644 (file)
@@ -299,6 +299,8 @@ public:
     void insertAdjacentHTML(const String& where, const String& html, ExceptionCode&);
     void insertAdjacentText(const String& where, const String& text, ExceptionCode&);
 
+    bool ieForbidsInsertHTML() const;
+
     const RenderStyle* computedStyle(PseudoId = NOPSEUDO) override;
 
     bool needsStyleInvalidation() const;
index 1abe51b..1522574 100644 (file)
@@ -916,12 +916,8 @@ RefPtr<DocumentFragment> Range::createContextualFragment(const String& markup, E
 
     if (!element || (is<HTMLDocument>(element->document()) && is<HTMLHtmlElement>(*element)))
         element = HTMLBodyElement::create(node.document());
-    else if (!is<HTMLElement>(*element)) {
-        ec = NOT_SUPPORTED_ERR;
-        return nullptr;
-    }
 
-    return WebCore::createContextualFragment(downcast<HTMLElement>(*element), markup, AllowScriptingContentAndDoNotMarkAlreadyStarted, ec);
+    return WebCore::createContextualFragment(*element, markup, AllowScriptingContentAndDoNotMarkAlreadyStarted, ec);
 }
 
 
index 9f0c4e1..e4ce150 100644 (file)
@@ -951,7 +951,7 @@ static void removeElementFromFragmentPreservingChildren(DocumentFragment& fragme
     fragment.removeChild(element, ASSERT_NO_EXCEPTION);
 }
 
-RefPtr<DocumentFragment> createContextualFragment(HTMLElement& element, const String& markup, ParserContentPolicy parserContentPolicy, ExceptionCode& ec)
+RefPtr<DocumentFragment> createContextualFragment(Element& element, const String& markup, ParserContentPolicy parserContentPolicy, ExceptionCode& ec)
 {
     if (element.ieForbidsInsertHTML()) {
         ec = NOT_SUPPORTED_ERR;
index 3a12163..68067fd 100644 (file)
@@ -53,7 +53,7 @@ WEBCORE_EXPORT Ref<DocumentFragment> createFragmentFromText(Range& context, cons
 WEBCORE_EXPORT Ref<DocumentFragment> createFragmentFromMarkup(Document&, const String& markup, const String& baseURL, ParserContentPolicy = AllowScriptingContent);
 RefPtr<DocumentFragment> createFragmentForInnerOuterHTML(Element&, const String& markup, ParserContentPolicy, ExceptionCode&);
 RefPtr<DocumentFragment> createFragmentForTransformToFragment(Document&, const String& sourceString, const String& sourceMIMEType);
-RefPtr<DocumentFragment> createContextualFragment(HTMLElement&, const String& markup, ParserContentPolicy, ExceptionCode&);
+RefPtr<DocumentFragment> createContextualFragment(Element&, const String& markup, ParserContentPolicy, ExceptionCode&);
 
 bool isPlainTextMarkup(Node*);
 
index dc23a05..1d0639e 100644 (file)
@@ -83,45 +83,6 @@ String HTMLElement::nodeName() const
     return Element::nodeName();
 }
 
-bool HTMLElement::ieForbidsInsertHTML() const
-{
-    // FIXME: Supposedly IE disallows settting innerHTML, outerHTML
-    // and createContextualFragment on these tags.  We have no tests to
-    // verify this however, so this list could be totally wrong.
-    // This list was moved from the previous endTagRequirement() implementation.
-    // This is also called from editing and assumed to be the list of tags
-    // for which no end tag should be serialized. It's unclear if the list for
-    // IE compat and the list for serialization sanity are the same.
-    if (hasTagName(areaTag)
-        || hasTagName(baseTag)
-        || hasTagName(basefontTag)
-        || hasTagName(brTag)
-        || hasTagName(colTag)
-        || hasTagName(embedTag)
-        || hasTagName(frameTag)
-        || hasTagName(hrTag)
-        || hasTagName(imageTag)
-        || hasTagName(imgTag)
-        || hasTagName(inputTag)
-        || hasTagName(isindexTag)
-        || hasTagName(linkTag)
-        || hasTagName(metaTag)
-        || hasTagName(paramTag)
-        || hasTagName(sourceTag)
-        || hasTagName(wbrTag))
-        return true;
-    // FIXME: I'm not sure why dashboard mode would want to change the
-    // serialization of <canvas>, that seems like a bad idea.
-#if ENABLE(DASHBOARD_SUPPORT)
-    if (hasTagName(canvasTag)) {
-        Settings* settings = document().settings();
-        if (settings && settings->usesDashboardBackwardCompatibilityMode())
-            return true;
-    }
-#endif
-    return false;
-}
-
 static inline CSSValueID unicodeBidiAttributeForDirAuto(HTMLElement& element)
 {
     if (element.hasTagName(preTag) || element.hasTagName(textareaTag))
index cfd792a..7cafa97 100644 (file)
@@ -70,8 +70,6 @@ public:
 
     void accessKeyAction(bool sendMouseEvents) override;
 
-    bool ieForbidsInsertHTML() const;
-
     bool rendererIsNeeded(const RenderStyle&) override;
     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;