Changeset 94047 in webkit


Ignore:
Timestamp:
Aug 29, 2011, 10:51:19 PM (14 years ago)
Author:
rniwa@webkit.org
Message:

Move setInnerTextValue from RenderTextControl to HTMLTextFormControlElement
https://bugs.webkit.org/show_bug.cgi?id=67152

Reviewed by Darin Adler.

Moved setInnerTextValue from RenderTextControl to HTMLTextFormControlElement.

Also moved m_lastChangeWasUserEdit from RenderTextControl to HTMLTextFormControlElement
and related inline functions from RenderTextControl to HTMLTextFormControlElement.
Because m_lastChangeWasUserEdit is no longer reset when RenderTextControl is recreated,
added explicit calls to setLastChangeWasNotUserEdit in setValue functions of HTMLInputElement
and HTMLTextAreaElement.

This patch also fixes the bug that lastChangeWasUserEdit() incorrectly returns false
when input or textarea don't have renderer (e.g. invisible).

Unfortunately, there is no way to test this behavioral change from layout tests.

  • WebCore.exp.in: Exports lastChangeWasUserEdit in HTMLTextFormControlElement instead of

that of HTMLInputElement and HTMLTextAreaElement.

  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::setValue): Explicitly calls setLastChangeWasNotUserEdit.

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

(WebCore::HTMLTextAreaElement::setValueCommon): Ditto.

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

(WebCore::HTMLTextFormControlElement::HTMLTextFormControlElement):
(WebCore::HTMLTextFormControlElement::subtreeHasChanged): Sets m_lastChangeWasUserEdit true
as it used to do via respondToChangeByUser.
(WebCore::HTMLTextFormControlElement::lastChangeWasUserEdit): Moved from HTMLInputElement
and HTMLTextAreaElement.
(WebCore::HTMLTextFormControlElement::setInnerTextValue): Moved from RenderTextControl.

  • html/HTMLTextFormControlElement.h:

(WebCore::HTMLTextFormControlElement::setLastChangeWasNotUserEdit): Added.

  • rendering/RenderTextControl.cpp:

(WebCore::RenderTextControl::RenderTextControl): No longer initializes m_lastChangeWasUserEdit.

  • rendering/RenderTextControl.h:
  • rendering/RenderTextControlSingleLine.cpp:

(WebCore::RenderTextControlSingleLine::updateFromElement): Calls setInnerTextValue.

  • rendering/RenderTextControlMultiLine.cpp:

(WebCore::RenderTextControlMultiLine::updateFromElement): Ditto.

Location:
trunk/Source/WebCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r94045 r94047  
     12011-08-29  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Move setInnerTextValue from RenderTextControl to HTMLTextFormControlElement
     4        https://bugs.webkit.org/show_bug.cgi?id=67152
     5
     6        Reviewed by Darin Adler.
     7
     8        Moved setInnerTextValue from RenderTextControl to HTMLTextFormControlElement.
     9
     10        Also moved m_lastChangeWasUserEdit from RenderTextControl to HTMLTextFormControlElement
     11        and related inline functions from RenderTextControl to HTMLTextFormControlElement.
     12        Because m_lastChangeWasUserEdit is no longer reset when RenderTextControl is recreated,
     13        added explicit calls to setLastChangeWasNotUserEdit in setValue functions of HTMLInputElement
     14        and HTMLTextAreaElement.
     15
     16        This patch also fixes the bug that lastChangeWasUserEdit() incorrectly returns false
     17        when input or textarea don't have renderer (e.g. invisible).
     18
     19        Unfortunately, there is no way to test this behavioral change from layout tests.
     20
     21        * WebCore.exp.in: Exports lastChangeWasUserEdit in HTMLTextFormControlElement instead of
     22        that of HTMLInputElement and HTMLTextAreaElement.
     23        * html/HTMLInputElement.cpp:
     24        (WebCore::HTMLInputElement::setValue): Explicitly calls setLastChangeWasNotUserEdit.
     25        * html/HTMLInputElement.h:
     26        * html/HTMLTextAreaElement.cpp:
     27        (WebCore::HTMLTextAreaElement::setValueCommon): Ditto.
     28        * html/HTMLTextAreaElement.h:
     29        * html/HTMLTextFormControlElement.cpp:
     30        (WebCore::HTMLTextFormControlElement::HTMLTextFormControlElement):
     31        (WebCore::HTMLTextFormControlElement::subtreeHasChanged): Sets m_lastChangeWasUserEdit true
     32        as it used to do via respondToChangeByUser.
     33        (WebCore::HTMLTextFormControlElement::lastChangeWasUserEdit): Moved from HTMLInputElement
     34        and HTMLTextAreaElement.
     35        (WebCore::HTMLTextFormControlElement::setInnerTextValue): Moved from RenderTextControl.
     36        * html/HTMLTextFormControlElement.h:
     37        (WebCore::HTMLTextFormControlElement::setLastChangeWasNotUserEdit): Added.
     38        * rendering/RenderTextControl.cpp:
     39        (WebCore::RenderTextControl::RenderTextControl): No longer initializes m_lastChangeWasUserEdit.
     40        * rendering/RenderTextControl.h:
     41        * rendering/RenderTextControlSingleLine.cpp:
     42        (WebCore::RenderTextControlSingleLine::updateFromElement): Calls setInnerTextValue.
     43        * rendering/RenderTextControlMultiLine.cpp:
     44        (WebCore::RenderTextControlMultiLine::updateFromElement): Ditto.
     45
    1462011-08-25  Kent Tamura  <tkent@chromium.org>
    247
  • trunk/Source/WebCore/WebCore.exp.in

    r94007 r94047  
    11831183__ZNK7WebCore16HTMLInputElement15isPasswordFieldEv
    11841184__ZNK7WebCore16HTMLInputElement18shouldAutocompleteEv
    1185 __ZNK7WebCore16HTMLInputElement21lastChangeWasUserEditEv
    11861185__ZNK7WebCore16IconDatabaseBase12databasePathEv
    11871186__ZNK7WebCore16ResourceResponse13nsURLResponseEv
     
    11931192__ZNK7WebCore17ResourceErrorBase8lazyInitEv
    11941193__ZNK7WebCore19AnimationController24numberOfActiveAnimationsEPNS_8DocumentE
    1195 __ZNK7WebCore19HTMLTextAreaElement21lastChangeWasUserEditEv
    11961194__ZNK7WebCore19ResourceRequestBase10httpMethodEv
    11971195__ZNK7WebCore19ResourceRequestBase15httpHeaderFieldEPKc
     
    12181216__ZNK7WebCore23FrameLoaderStateMachine15firstLayoutDoneEv
    12191217__ZNK7WebCore23FrameLoaderStateMachine23committingFirstRealLoadEv
     1218__ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv
    12201219__ZNK7WebCore26NetscapePlugInStreamLoader6isDoneEv
    12211220__ZNK7WebCore27AuthenticationChallengeBase15failureResponseEv
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r94009 r94047  
    205205        }
    206206    }
    207 }
    208 
    209 bool HTMLInputElement::lastChangeWasUserEdit() const
    210 {
    211     if (!isTextField())
    212         return false;
    213    
    214     if (!renderer())
    215         return false;
    216 
    217     return toRenderTextControl(renderer())->lastChangeWasUserEdit();
    218207}
    219208
     
    10691058    bool valueChanged = sanitizedValue != this->value();
    10701059
     1060    setLastChangeWasNotUserEdit();
    10711061    setFormControlValueMatchesRenderer(false);
    10721062    if (m_inputType->storesValueSeparateFromAttribute()) {
  • trunk/Source/WebCore/html/HTMLInputElement.h

    r94009 r94047  
    229229#endif
    230230
    231     bool lastChangeWasUserEdit() const;
    232 
    233231    static const int maximumLength;
    234232
  • trunk/Source/WebCore/html/HTMLTextAreaElement.cpp

    r94009 r94047  
    334334
    335335    m_value = normalizedValue;
     336    setLastChangeWasNotUserEdit();
    336337    updatePlaceholderVisibility(false);
    337338    setNeedsStyleRecalc();
     
    432433{
    433434    setAttribute(rowsAttr, String::number(rows));
    434 }
    435 
    436 bool HTMLTextAreaElement::lastChangeWasUserEdit() const
    437 {
    438     if (!renderer())
    439         return false;
    440     return toRenderTextControl(renderer())->lastChangeWasUserEdit();
    441435}
    442436
  • trunk/Source/WebCore/html/HTMLTextAreaElement.h

    r94009 r94047  
    5959    void setRows(int);
    6060
    61     bool lastChangeWasUserEdit() const;
    62 
    6361private:
    6462    HTMLTextAreaElement(const QualifiedName&, Document*, HTMLFormElement*);
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp

    r94009 r94047  
    2626#include "HTMLTextFormControlElement.h"
    2727
     28#include "AXObjectCache.h"
    2829#include "Attribute.h"
    2930#include "Chrome.h"
     
    3334#include "EventNames.h"
    3435#include "Frame.h"
     36#include "HTMLBRElement.h"
    3537#include "HTMLFormElement.h"
    3638#include "HTMLInputElement.h"
     
    5153HTMLTextFormControlElement::HTMLTextFormControlElement(const QualifiedName& tagName, Document* doc, HTMLFormElement* form)
    5254    : HTMLFormControlElementWithState(tagName, doc, form)
     55    , m_lastChangeWasUserEdit(false)
    5356    , m_cachedSelectionStart(-1)
    5457    , m_cachedSelectionEnd(-1)
     
    103106void HTMLTextFormControlElement::subtreeHasChanged()
    104107{
    105     toRenderTextControl(renderer())->respondToChangeByUser();
     108    m_lastChangeWasUserEdit = true;
    106109}
    107110
     
    442445    if (!frame)
    443446        return;
    444    
     447
    445448    if (Page* page = frame->page())
    446449        page->chrome()->client()->formStateDidChange(this);
     450}
     451
     452bool HTMLTextFormControlElement::lastChangeWasUserEdit() const
     453{
     454    if (!isTextFormControl())
     455        return false;
     456    return m_lastChangeWasUserEdit;
     457}
     458
     459void HTMLTextFormControlElement::setInnerTextValue(const String& value)
     460{
     461    if (!renderer() || !isTextFormControl())
     462        return;
     463
     464    RenderTextControl* textControl = toRenderTextControl(renderer());
     465    bool textIsChanged = value != textControl->text();
     466    if (textIsChanged || !innerTextElement()->hasChildNodes()) {
     467        if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())
     468            document()->axObjectCache()->postNotification(textControl, AXObjectCache::AXValueChanged, false);
     469
     470        ExceptionCode ec = 0;
     471        innerTextElement()->setInnerText(value, ec);
     472        ASSERT(!ec);
     473
     474        if (value.endsWith("\n") || value.endsWith("\r")) {
     475            innerTextElement()->appendChild(HTMLBRElement::create(document()), ec);
     476            ASSERT(!ec);
     477        }
     478
     479        // We set m_lastChangeWasUserEdit to false since this change was not explicitly made by the user (say, via typing on the keyboard), see <rdar://problem/5359921>.
     480        m_lastChangeWasUserEdit = false;
     481    }
     482
     483    setFormControlValueMatchesRenderer(true);
    447484}
    448485
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.h

    r94009 r94047  
    7676    void selectionChanged(bool userTriggered);
    7777    void notifyFormStateChanged();
     78    bool lastChangeWasUserEdit() const;
     79    void setInnerTextValue(const String&);
    7880
    7981protected:
     
    98100    virtual void subtreeHasChanged();
    99101
     102    void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
    100103private:
    101104    int computeSelectionStart() const;
     
    120123
    121124    String m_textAsOfLastFormControlChangeEvent;
     125    bool m_lastChangeWasUserEdit;
    122126   
    123127    int m_cachedSelectionStart;
  • trunk/Source/WebCore/rendering/RenderTextControl.cpp

    r94009 r94047  
    2323#include "RenderTextControl.h"
    2424
    25 #include "AXObjectCache.h"
    2625#include "Editor.h"
    2726#include "Frame.h"
     
    6968RenderTextControl::RenderTextControl(Node* node)
    7069    : RenderBlock(node)
    71     , m_lastChangeWasUserEdit(false)
    7270{
    7371    ASSERT(toTextFormControl(node));
     
    150148    if (innerText)
    151149        updateUserModifyProperty(node(), innerText->renderer()->style());
    152 }
    153 
    154 void RenderTextControl::setInnerTextValue(const String& value)
    155 {
    156     bool textIsChanged = value != text();
    157     if (textIsChanged || !innerTextElement()->hasChildNodes()) {
    158         if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())
    159             document()->axObjectCache()->postNotification(this, AXObjectCache::AXValueChanged, false);
    160 
    161         ExceptionCode ec = 0;
    162         innerTextElement()->setInnerText(value, ec);
    163         ASSERT(!ec);
    164 
    165         if (value.endsWith("\n") || value.endsWith("\r")) {
    166             innerTextElement()->appendChild(HTMLBRElement::create(document()), ec);
    167             ASSERT(!ec);
    168         }
    169 
    170         // We set m_lastChangeWasUserEdit to false since this change was not explicitly made by the user (say, via typing on the keyboard), see <rdar://problem/5359921>.
    171         m_lastChangeWasUserEdit = false;
    172     }
    173 
    174     textFormControlElement()->setFormControlValueMatchesRenderer(true);
    175150}
    176151
  • trunk/Source/WebCore/rendering/RenderTextControl.h

    r93334 r94047  
    3636    virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0;
    3737
    38     bool lastChangeWasUserEdit() const { return m_lastChangeWasUserEdit; }
    39     void respondToChangeByUser() { m_lastChangeWasUserEdit = true; }
    4038    String text();
    4139    String textWithHardLineBreaks();
     
    5149    int scrollbarThickness() const;
    5250    void adjustInnerTextStyle(const RenderStyle* startStyle, RenderStyle* textBlockStyle) const;
    53     void setInnerTextValue(const String&);
    5451
    5552    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     
    8986
    9087    static bool isSelectableElement(HTMLElement*, Node*);
    91    
    92     bool m_lastChangeWasUserEdit;
    9388};
    9489
  • trunk/Source/WebCore/rendering/RenderTextControlMultiLine.cpp

    r93334 r94047  
    8585    RenderTextControl::updateFromElement();
    8686
    87     setInnerTextValue(static_cast<HTMLTextAreaElement*>(node())->value());
     87    textFormControlElement()->setInnerTextValue(static_cast<HTMLTextAreaElement*>(node())->value());
    8888}
    8989
  • trunk/Source/WebCore/rendering/RenderTextControlSingleLine.cpp

    r93334 r94047  
    478478
    479479    if (!inputElement()->suggestedValue().isNull())
    480         setInnerTextValue(inputElement()->suggestedValue());
     480        textFormControlElement()->setInnerTextValue(inputElement()->suggestedValue());
    481481    else {
    482482        if (node()->hasTagName(inputTag)) {
     
    485485            // being overwritten with the DOM value.
    486486            if (!inputElement()->formControlValueMatchesRenderer())
    487                 setInnerTextValue(inputElement()->visibleValue());
     487                textFormControlElement()->setInnerTextValue(inputElement()->visibleValue());
    488488        }
    489489    }
Note: See TracChangeset for help on using the changeset viewer.