Title: [249194] trunk
Revision
249194
Author
[email protected]
Date
2019-08-28 03:22:56 -0700 (Wed, 28 Aug 2019)

Log Message

Unable to enter text in https://eat.fi
https://bugs.webkit.org/show_bug.cgi?id=193046

Reviewed by Ryosuke Niwa.

Source/WebCore:

This is because the button element inside the label is receiving the click event, which causes the form to be
submitted. According to the spec we should do nothing in this case, because button element is considered to be
interactive content.

"The activation behavior of a label element for events targeted at interactive content descendants of a label
element, and any descendants of those interactive content descendants, must be to do nothing."
https://html.spec.whatwg.org/#the-label-element

This patch adds HTMLElement::isInteractiveContent() according to the HTML spec:

"Interactive content is content that is specifically intended for user interaction.
a (if the href attribute is present), audio (if the controls attribute is present), button, details, embed,
iframe, img (if the usemap attribute is present), input (if the type attribute is not in the Hidden state),
label, object (if the usemap attribute is present), select, textarea, video (if the controls attribute is
present)"
https://html.spec.whatwg.org/#interactive-content-2

That's used in HTMLLabelElement::defaultEventHandler() using the helper method
isEventTargetedAtInteractiveDescendants() to decide whether to simulate a click event or do nothing.

* html/HTMLAnchorElement.cpp:
(WebCore::HTMLAnchorElement::isInteractiveContent const):
* html/HTMLAnchorElement.h:
* html/HTMLButtonElement.h:
* html/HTMLDetailsElement.h:
* html/HTMLElement.h:
(WebCore::HTMLElement::isInteractiveContent const):
* html/HTMLEmbedElement.h:
* html/HTMLIFrameElement.h:
* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::isInteractiveContent const):
* html/HTMLImageElement.h:
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::isInteractiveContent const):
* html/HTMLInputElement.h:
* html/HTMLLabelElement.cpp:
(WebCore::HTMLLabelElement::isEventTargetedAtInteractiveDescendants const):
(WebCore::HTMLLabelElement::defaultEventHandler):
* html/HTMLLabelElement.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::isInteractiveContent const):
* html/HTMLMediaElement.h:
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::isInteractiveContent const):
* html/HTMLObjectElement.h:
* html/HTMLSelectElement.h:
* html/HTMLTextAreaElement.h:
* html/HiddenInputType.h:
* html/InputType.cpp:
(WebCore::InputType::isInteractiveContent const):
* html/InputType.h:

LayoutTests:

Add new test imported for blink.

* imported/blink/fast/forms/label/label-contains-other-interactive-content-expected.txt: Added.
* imported/blink/fast/forms/label/label-contains-other-interactive-content.html: Added.
* platform/ios-wk2/TestExpectations: Skip the new test because it requires eventSender.mouseDown/Up/MoveTo()

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (249193 => 249194)


--- trunk/LayoutTests/ChangeLog	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/LayoutTests/ChangeLog	2019-08-28 10:22:56 UTC (rev 249194)
@@ -1,3 +1,16 @@
+2019-08-28  Carlos Garcia Campos  <[email protected]>
+
+        Unable to enter text in https://eat.fi
+        https://bugs.webkit.org/show_bug.cgi?id=193046
+
+        Reviewed by Ryosuke Niwa.
+
+        Add new test imported for blink.
+
+        * imported/blink/fast/forms/label/label-contains-other-interactive-content-expected.txt: Added.
+        * imported/blink/fast/forms/label/label-contains-other-interactive-content.html: Added.
+        * platform/ios-wk2/TestExpectations: Skip the new test because it requires eventSender.mouseDown/Up/MoveTo()
+
 2019-08-28  Said Abou-Hallawa  <[email protected]>
 
         SVG2: Add length, item getter and item setter to all SVG lists

Added: trunk/LayoutTests/imported/blink/fast/forms/label/label-contains-other-interactive-content-expected.txt (0 => 249194)


--- trunk/LayoutTests/imported/blink/fast/forms/label/label-contains-other-interactive-content-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/forms/label/label-contains-other-interactive-content-expected.txt	2019-08-28 10:22:56 UTC (rev 249194)
@@ -0,0 +1,39 @@
+button
+PASS document.activeElement.id is not "control"
+details
+PASS document.activeElement.id is not "control"
+embed
+PASS document.activeElement.id is not "control"
+iframe
+PASS document.activeElement.id is not "control"
+label
+PASS document.activeElement.id is not "control"
+select
+PASS document.activeElement.id is not "control"
+textarea
+PASS document.activeElement.id is not "control"
+
+a
+PASS document.activeElement.id is "control"
+a[href]
+PASS document.activeElement.id is not "control"
+audio[controls]
+PASS document.activeElement.id is not "control"
+video
+PASS document.activeElement.id is "control"
+video[controls]
+PASS document.activeElement.id is not "control"
+img
+PASS document.activeElement.id is "control"
+img[usemap]
+PASS document.activeElement.id is not "control"
+object
+PASS document.activeElement.id is "control"
+object[usemap]
+PASS document.activeElement.id is not "control"
+input
+PASS document.activeElement.id is not "control"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/imported/blink/fast/forms/label/label-contains-other-interactive-content.html (0 => 249194)


--- trunk/LayoutTests/imported/blink/fast/forms/label/label-contains-other-interactive-content.html	                        (rev 0)
+++ trunk/LayoutTests/imported/blink/fast/forms/label/label-contains-other-interactive-content.html	2019-08-28 10:22:56 UTC (rev 249194)
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<body id="body">
+<script src=""
+<script src=""
+<script>
+var interactiveElements1 = ['button', 'details', 'embed', 'iframe', 'label', 'select', 'textarea'];
+var interactiveElements2 = [
+    ['a', 'href'],
+    ['audio', 'controls'],
+    ['video', 'controls'],
+    ['img', 'usemap'],
+    ['object', 'usemap'],
+];
+
+var label = document.createElement('label');
+document.body.appendChild(label);
+var control = document.createElement('input');
+control.id = 'control';
+label.appendChild(control);
+
+interactiveElements1.forEach(function(tag) {
+    var element = document.createElement(tag);
+    element.id = tag;
+    element.style.display = 'block';
+    element.style.width = '100px';
+    element.style.height = '100px';
+    label.appendChild(element);
+    clickElement(element);
+    debug(tag);
+    shouldNotBe('document.activeElement.id', '"control"');
+    document.activeElement.blur();
+    label.removeChild(element);
+});
+debug('');
+
+interactiveElements2.forEach(function(entry) {
+    var element = document.createElement(entry[0]);
+    element.id = entry[0];
+    element.style.display = 'block';
+    element.style.width = '100px';
+    element.style.height = '100px';
+    label.appendChild(element);
+    // Audio elements without controls attribute is always invisible.
+    if (entry[0] != 'audio') {
+        clickElement(element);
+        debug(entry[0]);
+        shouldBeEqualToString('document.activeElement.id', 'control');
+    }
+    document.activeElement.blur();
+
+    element.setAttribute(entry[1], entry[1]);
+    // Prevents page transition.
+    if (entry[0] == 'a')
+        element.addEventListener('click', function(e) { e.preventDefault(); }, false);
+    clickElement(element);
+    debug(entry[0] + '[' + entry[1] + ']');
+    shouldNotBe('document.activeElement.id', '"control"');
+    document.activeElement.blur();
+    label.removeChild(element);
+});
+
+var element = document.createElement('input');
+element.id = 'input';
+element.type = 'text';
+element.style.display = 'block';
+element.style.width = '100px';
+element.style.height = '100px';
+label.appendChild(element);
+clickElement(element);
+debug('input');
+shouldNotBe('document.activeElement.id', '"control"');
+document.activeElement.blur();
+
+// Note: It's impossible to click on input[type=hidden].
+
+label.remove();
+</script>
+</body>

Modified: trunk/LayoutTests/platform/ios-wk2/TestExpectations (249193 => 249194)


--- trunk/LayoutTests/platform/ios-wk2/TestExpectations	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/LayoutTests/platform/ios-wk2/TestExpectations	2019-08-28 10:22:56 UTC (rev 249194)
@@ -1016,6 +1016,7 @@
 # eventSender.mouseDown is not implemented
 fast/loader/location-hash-user-gesture.html [ Skip ]
 imported/blink/editing/selection/selectstart-event-crash.html [ Skip ]
+imported/blink/fast/forms/label/label-contains-other-interactive-content.html [ Skip ]
 fast/dom/Window/post-message-user-action.html [ Skip ]
 fast/images/image-usemap-parsing.html [ Skip ]
 fast/shadow-dom/fullscreen-in-shadow-full-screen-ancestor.html [ Skip ]

Modified: trunk/Source/WebCore/ChangeLog (249193 => 249194)


--- trunk/Source/WebCore/ChangeLog	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/ChangeLog	2019-08-28 10:22:56 UTC (rev 249194)
@@ -1,3 +1,62 @@
+2019-08-28  Carlos Garcia Campos  <[email protected]>
+
+        Unable to enter text in https://eat.fi
+        https://bugs.webkit.org/show_bug.cgi?id=193046
+
+        Reviewed by Ryosuke Niwa.
+
+        This is because the button element inside the label is receiving the click event, which causes the form to be
+        submitted. According to the spec we should do nothing in this case, because button element is considered to be
+        interactive content.
+
+        "The activation behavior of a label element for events targeted at interactive content descendants of a label
+        element, and any descendants of those interactive content descendants, must be to do nothing."
+        https://html.spec.whatwg.org/#the-label-element
+
+        This patch adds HTMLElement::isInteractiveContent() according to the HTML spec:
+
+        "Interactive content is content that is specifically intended for user interaction.
+        a (if the href attribute is present), audio (if the controls attribute is present), button, details, embed,
+        iframe, img (if the usemap attribute is present), input (if the type attribute is not in the Hidden state),
+        label, object (if the usemap attribute is present), select, textarea, video (if the controls attribute is
+        present)"
+        https://html.spec.whatwg.org/#interactive-content-2
+
+        That's used in HTMLLabelElement::defaultEventHandler() using the helper method
+        isEventTargetedAtInteractiveDescendants() to decide whether to simulate a click event or do nothing.
+
+        * html/HTMLAnchorElement.cpp:
+        (WebCore::HTMLAnchorElement::isInteractiveContent const):
+        * html/HTMLAnchorElement.h:
+        * html/HTMLButtonElement.h:
+        * html/HTMLDetailsElement.h:
+        * html/HTMLElement.h:
+        (WebCore::HTMLElement::isInteractiveContent const):
+        * html/HTMLEmbedElement.h:
+        * html/HTMLIFrameElement.h:
+        * html/HTMLImageElement.cpp:
+        (WebCore::HTMLImageElement::isInteractiveContent const):
+        * html/HTMLImageElement.h:
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::isInteractiveContent const):
+        * html/HTMLInputElement.h:
+        * html/HTMLLabelElement.cpp:
+        (WebCore::HTMLLabelElement::isEventTargetedAtInteractiveDescendants const):
+        (WebCore::HTMLLabelElement::defaultEventHandler):
+        * html/HTMLLabelElement.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::isInteractiveContent const):
+        * html/HTMLMediaElement.h:
+        * html/HTMLObjectElement.cpp:
+        (WebCore::HTMLObjectElement::isInteractiveContent const):
+        * html/HTMLObjectElement.h:
+        * html/HTMLSelectElement.h:
+        * html/HTMLTextAreaElement.h:
+        * html/HiddenInputType.h:
+        * html/InputType.cpp:
+        (WebCore::InputType::isInteractiveContent const):
+        * html/InputType.h:
+
 2019-08-28  Claudio Saavedra  <[email protected]>
 
         [GTK][WPE] Implement HSTS for the soup network backend

Modified: trunk/Source/WebCore/html/HTMLAnchorElement.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLAnchorElement.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLAnchorElement.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -103,6 +103,11 @@
     return HTMLElement::isMouseFocusable();
 }
 
+bool HTMLAnchorElement::isInteractiveContent() const
+{
+    return isLink();
+}
+
 static bool hasNonEmptyBox(RenderBoxModelObject* renderer)
 {
     if (!renderer)

Modified: trunk/Source/WebCore/html/HTMLAnchorElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLAnchorElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLAnchorElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -90,6 +90,7 @@
     String target() const override;
     int defaultTabIndex() const final;
     bool draggable() const final;
+    bool isInteractiveContent() const final;
 
     String effectiveTarget() const;
 

Modified: trunk/Source/WebCore/html/HTMLAppletElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLAppletElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLAppletElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -44,6 +44,8 @@
     void updateWidget(CreatePlugins) final;
 
     bool canEmbedJava() const;
+
+    bool isInteractiveContent() const final { return true; }
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/html/HTMLButtonElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLButtonElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLButtonElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -61,6 +61,7 @@
 
     bool isEnumeratable() const final { return true; }
     bool supportLabels() const final { return true; }
+    bool isInteractiveContent() const final { return true; }
 
     bool isSuccessfulSubmitButton() const final;
     bool matchesDefaultPseudoClass() const final;

Modified: trunk/Source/WebCore/html/HTMLDetailsElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLDetailsElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLDetailsElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -51,6 +51,7 @@
 
     void didAddUserAgentShadowRoot(ShadowRoot&) final;
     bool hasCustomFocusLogic() const final { return true; }
+    bool isInteractiveContent() const final { return true; }
 
     bool m_isOpen { false };
     HTMLSlotElement* m_summarySlot { nullptr };

Modified: trunk/Source/WebCore/html/HTMLElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -90,6 +90,8 @@
     virtual FormNamedItem* asFormNamedItem();
     virtual FormAssociatedElement* asFormAssociatedElement();
 
+    virtual bool isInteractiveContent() const { return false; }
+
     bool hasTagName(const HTMLQualifiedName& name) const { return hasLocalName(name.localName()); }
 
     static const AtomString& eventNameForEventHandlerAttribute(const QualifiedName& attributeName);

Modified: trunk/Source/WebCore/html/HTMLEmbedElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLEmbedElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLEmbedElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -43,6 +43,8 @@
     bool isURLAttribute(const Attribute&) const final;
     const AtomString& imageSourceURL() const final;
 
+    bool isInteractiveContent() const final { return true; }
+
     RenderWidget* renderWidgetLoadingPlugin() const final;
 
     void updateWidget(CreatePlugins) final;

Modified: trunk/Source/WebCore/html/HTMLIFrameElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLIFrameElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLIFrameElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -53,6 +53,8 @@
     bool isPresentationAttribute(const QualifiedName&) const final;
     void collectStyleForPresentationAttribute(const QualifiedName&, const AtomString&, MutableStyleProperties&) final;
 
+    bool isInteractiveContent() const final { return true; }
+
     bool rendererIsNeeded(const RenderStyle&) final;
     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
 

Modified: trunk/Source/WebCore/html/HTMLImageElement.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLImageElement.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLImageElement.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -303,6 +303,11 @@
     return HTMLElement::isFocusable();
 }
 
+bool HTMLImageElement::isInteractiveContent() const
+{
+    return hasAttributeWithoutSynchronization(usemapAttr);
+}
+
 void HTMLImageElement::didAttachRenderers()
 {
     if (!is<RenderImage>(renderer()))

Modified: trunk/Source/WebCore/html/HTMLImageElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLImageElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLImageElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -156,6 +156,8 @@
     HTMLImageElement& asHTMLElement() final { return *this; }
     const HTMLImageElement& asHTMLElement() const final { return *this; }
 
+    bool isInteractiveContent() const final;
+
     void selectImageSource();
 
     ImageCandidate bestFitSourceFromPictureElement();

Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLInputElement.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -450,6 +450,11 @@
     return m_inputType->isMouseFocusable();
 }
 
+bool HTMLInputElement::isInteractiveContent() const
+{
+    return m_inputType->isInteractiveContent();
+}
+
 bool HTMLInputElement::isTextFormControlFocusable() const
 {
     return HTMLTextFormControlElement::isFocusable();

Modified: trunk/Source/WebCore/html/HTMLInputElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLInputElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLInputElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -375,6 +375,8 @@
     void updateFocusAppearance(SelectionRestorationMode, SelectionRevealMode) final;
     bool shouldUseInputMethod() final;
 
+    bool isInteractiveContent() const final;
+
     bool isInnerTextElementEditable() const final { return !hasAutoFillStrongPasswordButton() && HTMLTextFormControlElement::isInnerTextElementEditable(); }
 
     bool canTriggerImplicitSubmission() const final { return isTextField(); }

Modified: trunk/Source/WebCore/html/HTMLLabelElement.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLLabelElement.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLLabelElement.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -111,6 +111,22 @@
         element->setHovered(over);
 }
 
+bool HTMLLabelElement::isEventTargetedAtInteractiveDescendants(Event& event) const
+{
+    if (!is<Node>(event.target()))
+        return false;
+
+    auto& node = downcast<Node>(*event.target());
+    if (!containsIncludingShadowDOM(&node))
+        return false;
+
+    for (const auto* it = &node; it && it != this; it = it->parentElementInComposedTree()) {
+        if (is<HTMLElement>(it) && downcast<HTMLElement>(*it).isInteractiveContent())
+            return true;
+    }
+
+    return false;
+}
 void HTMLLabelElement::defaultEventHandler(Event& event)
 {
     static bool processingClick = false;
@@ -125,6 +141,15 @@
             return;
         }
 
+        // The activation behavior of a label element for events targeted at interactive
+        // content descendants of a label element, and any descendants of those interactive
+        // content descendants, must be to do nothing.
+        // https://html.spec.whatwg.org/#the-label-element
+        if (isEventTargetedAtInteractiveDescendants(event)) {
+            HTMLElement::defaultEventHandler(event);
+            return;
+        }
+
         processingClick = true;
 
         control->dispatchSimulatedClick(&event);

Modified: trunk/Source/WebCore/html/HTMLLabelElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLLabelElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLLabelElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -40,6 +40,8 @@
 private:
     HTMLLabelElement(const QualifiedName&, Document&);
 
+    bool isEventTargetedAtInteractiveDescendants(Event&) const;
+
     void accessKeyAction(bool sendMouseEvents) final;
 
     // Overridden to update the hover/active state of the corresponding control.
@@ -50,6 +52,8 @@
     void defaultEventHandler(Event&) final;
 
     void focus(bool restorePreviousSelection, FocusDirection) final;
+
+    bool isInteractiveContent() const final { return true; }
 };
 
 } //namespace

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -803,6 +803,11 @@
     return false;
 }
 
+bool HTMLMediaElement::isInteractiveContent() const
+{
+    return controls();
+}
+
 void HTMLMediaElement::parseAttribute(const QualifiedName& name, const AtomString& value)
 {
     if (name == srcAttr) {

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -626,6 +626,7 @@
     void didFinishInsertingNode() override;
     void removedFromAncestor(RemovalType, ContainerNode&) override;
     void didRecalcStyle(Style::Change) override;
+    bool isInteractiveContent() const override;
 
     void willBecomeFullscreenElement() override;
     void willStopBeingFullscreenElement() override;

Modified: trunk/Source/WebCore/html/HTMLObjectElement.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLObjectElement.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLObjectElement.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -325,6 +325,11 @@
     return attribute.name() == dataAttr || attribute.name() == codebaseAttr || (attribute.name() == usemapAttr && attribute.value().string()[0] != '#') || HTMLPlugInImageElement::isURLAttribute(attribute);
 }
 
+bool HTMLObjectElement::isInteractiveContent() const
+{
+    return hasAttributeWithoutSynchronization(usemapAttr);
+}
+
 const AtomString& HTMLObjectElement::imageSourceURL() const
 {
     return attributeWithoutSynchronization(dataAttr);

Modified: trunk/Source/WebCore/html/HTMLObjectElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLObjectElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLObjectElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -95,6 +95,8 @@
     HTMLObjectElement& asHTMLElement() final { return *this; }
     const HTMLObjectElement& asHTMLElement() const final { return *this; }
 
+    bool isInteractiveContent() const final;
+
     bool isFormControlElement() const final { return false; }
 
     bool isEnumeratable() const final { return true; }

Modified: trunk/Source/WebCore/html/HTMLSelectElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLSelectElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLSelectElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -124,6 +124,8 @@
     bool isEnumeratable() const final { return true; }
     bool supportLabels() const final { return true; }
 
+    bool isInteractiveContent() const final { return true; }
+
     FormControlState saveFormControlState() const final;
     void restoreFormControlState(const FormControlState&) final;
 

Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.h (249193 => 249194)


--- trunk/Source/WebCore/html/HTMLTextAreaElement.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -98,6 +98,8 @@
     bool isEnumeratable() const final { return true; }
     bool supportLabels() const final { return true; }
 
+    bool isInteractiveContent() const final { return true; }
+
     const AtomString& formControlType() const final;
 
     FormControlState saveFormControlState() const final;

Modified: trunk/Source/WebCore/html/HiddenInputType.h (249193 => 249194)


--- trunk/Source/WebCore/html/HiddenInputType.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/HiddenInputType.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -49,6 +49,7 @@
     bool storesValueSeparateFromAttribute() override;
     bool isHiddenType() const override;
     bool supportLabels() const override { return false; }
+    bool isInteractiveContent() const final { return false; }
     bool shouldRespectHeightAndWidthAttributes() override;
     void setValue(const String&, bool, TextFieldEventBehavior) override;
     bool appendFormData(DOMFormData&, bool) const override;

Modified: trunk/Source/WebCore/html/InputType.cpp (249193 => 249194)


--- trunk/Source/WebCore/html/InputType.cpp	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/InputType.cpp	2019-08-28 10:22:56 UTC (rev 249194)
@@ -797,6 +797,11 @@
     return false;
 }
 
+bool InputType::isInteractiveContent() const
+{
+    return true;
+}
+
 bool InputType::supportLabels() const
 {
     return true;

Modified: trunk/Source/WebCore/html/InputType.h (249193 => 249194)


--- trunk/Source/WebCore/html/InputType.h	2019-08-28 10:21:12 UTC (rev 249193)
+++ trunk/Source/WebCore/html/InputType.h	2019-08-28 10:22:56 UTC (rev 249194)
@@ -101,6 +101,7 @@
     virtual bool isFileUpload() const;
     virtual bool isHiddenType() const;
     virtual bool isImageButton() const;
+    virtual bool isInteractiveContent() const;
     virtual bool supportLabels() const;
     virtual bool isMonthField() const;
     virtual bool isNumberField() const;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to