A label element not in a document should not label an element in a document
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Oct 2015 17:47:49 +0000 (17:47 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Oct 2015 17:47:49 +0000 (17:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=148863
<rdar://problem/22589300>

Reviewed by Ryosuke Niwa.

LayoutTests/imported/w3c:

Rebaseline W3C HTML test now that one more check is passing.

* web-platform-tests/html/semantics/forms/the-label-element/label-attributes-expected.txt:

Source/WebCore:

As per the HTML specification, a label element's 'for' attribute may be
specified to indicate a form control with which the caption is to be
associated. If the attribute is specified, the attribute's value must
be the ID of a labelable element in the same Document as the label
element:
https://html.spec.whatwg.org/multipage/forms.html#attr-label-for

However, our code was failing to check if the label element was actually
in the document before calling document.getElementById(). In such case,
we would potentially return a labelable Element that is not in the same
document as the label Element. This patch fixes the problem.

The new behavior is consistent with Firefox.

No new tests, already covered by existing test.

* html/HTMLLabelElement.cpp:
(WebCore::HTMLLabelElement::control):

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/html/semantics/forms/the-label-element/label-attributes-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLLabelElement.cpp

index c0195a5..7ac3d29 100644 (file)
@@ -1,3 +1,15 @@
+2015-10-23  Chris Dumez  <cdumez@apple.com>
+
+        A label element not in a document should not label an element in a document
+        https://bugs.webkit.org/show_bug.cgi?id=148863
+        <rdar://problem/22589300>
+
+        Reviewed by Ryosuke Niwa.
+
+        Rebaseline W3C HTML test now that one more check is passing.
+
+        * web-platform-tests/html/semantics/forms/the-label-element/label-attributes-expected.txt:
+
 2015-10-21  Chris Dumez  <cdumez@apple.com>
 
         Un-expose obsolete HTMLBaseFontElement
index c46bdd9..c4b776c 100644 (file)
@@ -1,6 +1,6 @@
 
 PASS A label element with a 'for' attribute should only be associated with a labelable element. 
-FAIL A label element not in a document can not label any element in the document. assert_not_equals: A label element not in a document should not label an element in a document. got disallowed value Element node <input id="test1"></input>
+PASS A label element not in a document can not label any element in the document. 
 PASS The labeled control for a label element that has no 'for' attribute is the first labelable element which is a descendant of that label element. 
 PASS The 'for' attribute points to an inexistent id. 
 PASS A non-control follows by a control with same ID. 
index 3123187..580801e 100644 (file)
@@ -1,3 +1,30 @@
+2015-10-23  Chris Dumez  <cdumez@apple.com>
+
+        A label element not in a document should not label an element in a document
+        https://bugs.webkit.org/show_bug.cgi?id=148863
+        <rdar://problem/22589300>
+
+        Reviewed by Ryosuke Niwa.
+
+        As per the HTML specification, a label element's 'for' attribute may be
+        specified to indicate a form control with which the caption is to be
+        associated. If the attribute is specified, the attribute's value must
+        be the ID of a labelable element in the same Document as the label
+        element:
+        https://html.spec.whatwg.org/multipage/forms.html#attr-label-for
+
+        However, our code was failing to check if the label element was actually
+        in the document before calling document.getElementById(). In such case,
+        we would potentially return a labelable Element that is not in the same
+        document as the label Element. This patch fixes the problem.
+
+        The new behavior is consistent with Firefox.
+
+        No new tests, already covered by existing test.
+
+        * html/HTMLLabelElement.cpp:
+        (WebCore::HTMLLabelElement::control):
+
 2015-10-23  Antoine Quint  <graouts@apple.com>
 
         Support for SVG `beginEvent` event and `onbegin` attribute
index 1eb7046..dfbf150 100644 (file)
@@ -36,12 +36,14 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-static LabelableElement* nodeAsSupportedLabelableElement(Node* node)
+static LabelableElement* firstElementWithIdIfLabelable(TreeScope& treeScope, const AtomicString& id)
 {
-    if (!is<LabelableElement>(node))
+    auto* element = treeScope.getElementById(id);
+    if (!is<LabelableElement>(element))
         return nullptr;
-    LabelableElement& element = downcast<LabelableElement>(*node);
-    return element.supportLabels() ? &element : nullptr;
+
+    auto& labelableElement = downcast<LabelableElement>(*element);
+    return labelableElement.supportLabels() ? &labelableElement : nullptr;
 }
 
 inline HTMLLabelElement::HTMLLabelElement(const QualifiedName& tagName, Document& document)
@@ -74,9 +76,7 @@ LabelableElement* HTMLLabelElement::control()
         return nullptr;
     }
     
-    // Find the first element whose id is controlId. If it is found and it is a labelable form control,
-    // return it, otherwise return 0.
-    return nodeAsSupportedLabelableElement(treeScope().getElementById(controlId));
+    return inDocument() ? firstElementWithIdIfLabelable(treeScope(), controlId) : nullptr;
 }
 
 HTMLFormElement* HTMLLabelElement::form() const