Changeset 225837 in webkit


Ignore:
Timestamp:
Dec 12, 2017 8:05:33 PM (6 years ago)
Author:
Alan Bujtas
Message:

is<HTMLTextFormControlElement> reports the input type.
https://bugs.webkit.org/show_bug.cgi?id=180721
<rdar://problem/36005123>

Reviewed by Ryosuke Niwa.

This patch ensures that is<HTMLTextFormControlElement> consistently returns true even
when the input type changes from text to non-text (checkbox etc).

  • accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::selectText):

  • dom/Element.h:

(WebCore::Element::isTextFormControlElement const):
(WebCore::Element::isTextField const):
(WebCore::Element::isTextFormControl const): Deleted.

  • editing/Editor.cpp:

(WebCore::Editor::selectionForCommand):
(WebCore::Editor::setBaseWritingDirection):
(WebCore::findFirstMarkable):

  • editing/FrameSelection.cpp:

(WebCore::FrameSelection::selectAll):

  • html/FormController.cpp:

(WebCore::FormController::formElementsCharacterCount const):

  • html/HTMLElement.cpp:

(WebCore::HTMLElement::directionality const):

  • html/HTMLInputElement.h:
  • html/HTMLTextAreaElement.h:
  • html/HTMLTextFormControlElement.cpp:

(WebCore::HTMLTextFormControlElement::didEditInnerTextValue):
(WebCore::HTMLTextFormControlElement::selectedText const):
(WebCore::HTMLTextFormControlElement::setSelectionRange):
(WebCore::HTMLTextFormControlElement::selectionStart const):
(WebCore::HTMLTextFormControlElement::computeSelectionStart const):
(WebCore::HTMLTextFormControlElement::selectionEnd const):
(WebCore::HTMLTextFormControlElement::computeSelectionEnd const):
(WebCore::HTMLTextFormControlElement::selectionDirection const):
(WebCore::HTMLTextFormControlElement::computeSelectionDirection const):
(WebCore::HTMLTextFormControlElement::selection const):
(WebCore::HTMLTextFormControlElement::selectionChanged):
(WebCore::HTMLTextFormControlElement::lastChangeWasUserEdit const):
(WebCore::HTMLTextFormControlElement::setInnerTextValue):
(WebCore::HTMLTextFormControlElement::valueWithHardLineBreaks const):
(WebCore::enclosingTextFormControl):

  • html/HTMLTextFormControlElement.h:

(isType):

  • rendering/HitTestResult.cpp:

(WebCore::HitTestResult::isOverTextInsideFormControlElement const):

Location:
trunk/Source/WebCore
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r225836 r225837  
     12017-12-12  Zalan Bujtas  <zalan@apple.com>
     2
     3        is<HTMLTextFormControlElement> reports the input type.
     4        https://bugs.webkit.org/show_bug.cgi?id=180721
     5        <rdar://problem/36005123>
     6
     7        Reviewed by Ryosuke Niwa.
     8
     9        This patch ensures that is<HTMLTextFormControlElement> consistently returns true even
     10        when the input type changes from text to non-text (checkbox etc).
     11
     12        * accessibility/AccessibilityObject.cpp:
     13        (WebCore::AccessibilityObject::selectText):
     14        * dom/Element.h:
     15        (WebCore::Element::isTextFormControlElement const):
     16        (WebCore::Element::isTextField const):
     17        (WebCore::Element::isTextFormControl const): Deleted.
     18        * editing/Editor.cpp:
     19        (WebCore::Editor::selectionForCommand):
     20        (WebCore::Editor::setBaseWritingDirection):
     21        (WebCore::findFirstMarkable):
     22        * editing/FrameSelection.cpp:
     23        (WebCore::FrameSelection::selectAll):
     24        * html/FormController.cpp:
     25        (WebCore::FormController::formElementsCharacterCount const):
     26        * html/HTMLElement.cpp:
     27        (WebCore::HTMLElement::directionality const):
     28        * html/HTMLInputElement.h:
     29        * html/HTMLTextAreaElement.h:
     30        * html/HTMLTextFormControlElement.cpp:
     31        (WebCore::HTMLTextFormControlElement::didEditInnerTextValue):
     32        (WebCore::HTMLTextFormControlElement::selectedText const):
     33        (WebCore::HTMLTextFormControlElement::setSelectionRange):
     34        (WebCore::HTMLTextFormControlElement::selectionStart const):
     35        (WebCore::HTMLTextFormControlElement::computeSelectionStart const):
     36        (WebCore::HTMLTextFormControlElement::selectionEnd const):
     37        (WebCore::HTMLTextFormControlElement::computeSelectionEnd const):
     38        (WebCore::HTMLTextFormControlElement::selectionDirection const):
     39        (WebCore::HTMLTextFormControlElement::computeSelectionDirection const):
     40        (WebCore::HTMLTextFormControlElement::selection const):
     41        (WebCore::HTMLTextFormControlElement::selectionChanged):
     42        (WebCore::HTMLTextFormControlElement::lastChangeWasUserEdit const):
     43        (WebCore::HTMLTextFormControlElement::setInnerTextValue):
     44        (WebCore::HTMLTextFormControlElement::valueWithHardLineBreaks const):
     45        (WebCore::enclosingTextFormControl):
     46        * html/HTMLTextFormControlElement.h:
     47        (isType):
     48        * rendering/HitTestResult.cpp:
     49        (WebCore::HitTestResult::isOverTextInsideFormControlElement const):
     50
    1512017-12-12  Dean Jackson  <dino@apple.com>
    252
  • trunk/Source/WebCore/accessibility/AccessibilityObject.cpp

    r225511 r225837  
    829829    if (RefPtr<Range> closestStringRange = rangeClosestToRange(selectedStringRange.get(), WTFMove(closestAfterStringRange), WTFMove(closestBeforeStringRange))) {
    830830        // If the search started within a text control, ensure that the result is inside that element.
    831         if (element() && element()->isTextFormControl()) {
     831        if (element() && element()->isTextField()) {
    832832            if (!closestStringRange->startContainer().isDescendantOrShadowDescendantOf(element()) || !closestStringRange->endContainer().isDescendantOrShadowDescendantOf(element()))
    833833                return String();
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r221788 r225837  
    33453345static bool makeContextStyleUniqueIfNecessaryAndTestIsPlaceholderShown(const Element* element, SelectorChecker::CheckingContext* checkingContext)
    33463346{
    3347     if (is<HTMLTextFormControlElement>(*element)) {
     3347    if (is<HTMLTextFormControlElement>(*element) && element->isTextField()) {
    33483348        if (checkingContext->resolvingMode == SelectorChecker::Mode::ResolvingStyle)
    33493349            checkingContext->styleRelations.append({ *element, Style::Relation::Unique, 1 });
  • trunk/Source/WebCore/dom/Element.h

    r225223 r225837  
    437437    virtual bool isFormControlElement() const { return false; }
    438438    virtual bool isSpinButtonElement() const { return false; }
    439     virtual bool isTextFormControl() const { return false; }
     439    virtual bool isTextFormControlElement() const { return false; }
     440    virtual bool isTextField() const { return false; }
    440441    virtual bool isOptionalFormControl() const { return false; }
    441442    virtual bool isRequiredFormControl() const { return false; }
  • trunk/Source/WebCore/editing/Editor.cpp

    r225429 r225837  
    244244    // If the target is a text control, and the current selection is outside of its shadow tree,
    245245    // then use the saved selection for that text control.
    246     if (is<HTMLTextFormControlElement>(event->target())) {
     246    if (is<Element>(event->target()) && downcast<Element>(*event->target()).isTextField()) {
    247247        auto& target = downcast<HTMLTextFormControlElement>(*event->target());
    248248        auto start = selection.start();
     
    17221722       
    17231723    Element* focusedElement = document().focusedElement();
    1724     if (is<HTMLTextFormControlElement>(focusedElement)) {
     1724    if (focusedElement && focusedElement->isTextField()) {
    17251725        if (direction == NaturalWritingDirection)
    17261726            return;
     
    36273627        if (node->renderer()->isTextOrLineBreak())
    36283628            return node;
    3629         if (is<HTMLTextFormControlElement>(*node))
     3629        if (is<Element>(*node) && downcast<Element>(*node).isTextField())
    36303630            node = downcast<HTMLTextFormControlElement>(*node).visiblePositionForIndex(1).deepEquivalent().deprecatedNode();
    36313631        else if (node->firstChild())
  • trunk/Source/WebCore/editing/FrameSelection.cpp

    r225117 r225837  
    19231923    } else {
    19241924        if (m_selection.isNone() && focusedElement) {
    1925             if (is<HTMLTextFormControlElement>(*focusedElement)) {
     1925            if (focusedElement->isTextField()) {
    19261926                downcast<HTMLTextFormControlElement>(*focusedElement).select();
    19271927                return;
  • trunk/Source/WebCore/html/FormController.cpp

    r225037 r225837  
    346346    unsigned count = 0;
    347347    for (auto& element : m_formElementsWithState) {
    348         if (element->isTextFormControl())
     348        if (element->isTextField())
    349349            count += element->saveFormControlState()[0].length();
    350350    }
  • trunk/Source/WebCore/html/HTMLElement.cpp

    r224390 r225837  
    794794TextDirection HTMLElement::directionality(Node** strongDirectionalityTextNode) const
    795795{
    796     if (is<HTMLTextFormControlElement>(*this)) {
     796    if (isTextField()) {
    797797        HTMLTextFormControlElement& textElement = downcast<HTMLTextFormControlElement>(const_cast<HTMLElement&>(*this));
    798798        bool hasStrongDirectionality;
     
    807807        // Skip bdi, script, style and text form controls.
    808808        if (equalLettersIgnoringASCIICase(node->nodeName(), "bdi") || node->hasTagName(scriptTag) || node->hasTagName(styleTag)
    809             || (is<Element>(*node) && downcast<Element>(*node).isTextFormControl())) {
     809            || (is<Element>(*node) && downcast<Element>(*node).isTextField())) {
    810810            node = NodeTraversal::nextSkippingChildren(*node, this);
    811811            continue;
  • trunk/Source/WebCore/html/HTMLInputElement.h

    r225680 r225837  
    9898
    9999    bool isRadioButton() const;
    100     WEBCORE_EXPORT bool isTextField() const;
     100    WEBCORE_EXPORT bool isTextField() const final;
    101101    WEBCORE_EXPORT bool isSearchField() const;
    102102    bool isInputTypeHidden() const;
     
    371371    void updateFocusAppearance(SelectionRestorationMode, SelectionRevealMode) final;
    372372    bool shouldUseInputMethod() final;
    373 
    374     bool isTextFormControl() const final { return isTextField(); }
    375373
    376374    bool canTriggerImplicitSubmission() const final { return isTextField(); }
  • trunk/Source/WebCore/html/HTMLTextAreaElement.h

    r224316 r225837  
    103103    void restoreFormControlState(const FormControlState&) final;
    104104
    105     bool isTextFormControl() const final { return true; }
     105    bool isTextField() const final { return true; }
    106106
    107107    void childrenChanged(const ChildChange&) final;
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp

    r224320 r225837  
    108108void HTMLTextFormControlElement::didEditInnerTextValue()
    109109{
    110     if (!isTextFormControl())
     110    if (!isTextField())
    111111        return;
    112112
     
    199199String HTMLTextFormControlElement::selectedText() const
    200200{
    201     if (!isTextFormControl())
     201    if (!isTextField())
    202202        return String();
    203203    return value().substring(selectionStart(), selectionEnd() - selectionStart());
     
    285285void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextFieldSelectionDirection direction, const AXTextStateChangeIntent& intent)
    286286{
    287     if (!isTextFormControl())
     287    if (!isTextField())
    288288        return;
    289289
     
    344344int HTMLTextFormControlElement::selectionStart() const
    345345{
    346     if (!isTextFormControl())
     346    if (!isTextField())
    347347        return 0;
    348348    if (document().focusedElement() != this && hasCachedSelection())
     
    354354int HTMLTextFormControlElement::computeSelectionStart() const
    355355{
    356     ASSERT(isTextFormControl());
     356    ASSERT(isTextField());
    357357    RefPtr<Frame> frame = document().frame();
    358358    if (!frame)
     
    364364int HTMLTextFormControlElement::selectionEnd() const
    365365{
    366     if (!isTextFormControl())
     366    if (!isTextField())
    367367        return 0;
    368368    if (document().focusedElement() != this && hasCachedSelection())
     
    373373int HTMLTextFormControlElement::computeSelectionEnd() const
    374374{
    375     ASSERT(isTextFormControl());
     375    ASSERT(isTextField());
    376376    RefPtr<Frame> frame = document().frame();
    377377    if (!frame)
     
    402402const AtomicString& HTMLTextFormControlElement::selectionDirection() const
    403403{
    404     if (!isTextFormControl())
     404    if (!isTextField())
    405405        return directionString(SelectionHasNoDirection);
    406406    if (document().focusedElement() != this && hasCachedSelection())
     
    412412TextFieldSelectionDirection HTMLTextFormControlElement::computeSelectionDirection() const
    413413{
    414     ASSERT(isTextFormControl());
     414    ASSERT(isTextField());
    415415    RefPtr<Frame> frame = document().frame();
    416416    if (!frame)
     
    434434RefPtr<Range> HTMLTextFormControlElement::selection() const
    435435{
    436     if (!renderer() || !isTextFormControl() || !hasCachedSelection())
     436    if (!renderer() || !isTextField() || !hasCachedSelection())
    437437        return nullptr;
    438438
     
    480480void HTMLTextFormControlElement::selectionChanged(bool shouldFireSelectEvent)
    481481{
    482     if (!isTextFormControl())
     482    if (!isTextField())
    483483        return;
    484484
     
    520520bool HTMLTextFormControlElement::lastChangeWasUserEdit() const
    521521{
    522     if (!isTextFormControl())
     522    if (!isTextField())
    523523        return false;
    524524    return m_lastChangeWasUserEdit;
     
    553553        return;
    554554
    555     ASSERT(isTextFormControl());
     555    ASSERT(isTextField());
    556556    String previousValue = innerTextValueFrom(*innerText);
    557557    bool textIsChanged = value != previousValue;
     
    686686    // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer.
    687687    // While we have no evidence this has ever been a practical problem, it would be best to fix it some day.
    688     if (!isTextFormControl())
     688    if (!isTextField())
    689689        return value();
    690690
     
    740740        return nullptr;
    741741    RefPtr<Element> ancestor = container->shadowHost();
    742     return ancestor && is<HTMLTextFormControlElement>(*ancestor) ? downcast<HTMLTextFormControlElement>(ancestor.get()) : nullptr;
     742    return ancestor && ancestor->isTextField() ? downcast<HTMLTextFormControlElement>(ancestor.get()) : nullptr;
    743743}
    744744
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.h

    r224740 r225837  
    133133    TextFieldSelectionDirection cachedSelectionDirection() const { return static_cast<TextFieldSelectionDirection>(m_cachedSelectionDirection); }
    134134
     135    bool isTextFormControlElement() const final { return true; }
     136
    135137    int computeSelectionStart() const;
    136138    int computeSelectionEnd() const;
     
    170172
    171173SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLTextFormControlElement)
    172     static bool isType(const WebCore::Element& element) { return element.isTextFormControl(); }
     174    static bool isType(const WebCore::Element& element) { return element.isTextFormControlElement(); }
    173175    static bool isType(const WebCore::Node& node) { return is<WebCore::Element>(node) && isType(downcast<WebCore::Element>(node)); }
    174176    static bool isType(const WebCore::EventTarget& target) { return is<WebCore::Node>(target) && isType(downcast<WebCore::Node>(target)); }
  • trunk/Source/WebCore/rendering/HitTestResult.cpp

    r225117 r225837  
    573573        return false;
    574574
    575     if (!is<HTMLTextFormControlElement>(*node))
     575    if (!is<Element>(*node) || !downcast<Element>(*node).isTextField())
    576576        return false;
    577577
Note: See TracChangeset for help on using the changeset viewer.