Changeset 99076 in webkit


Ignore:
Timestamp:
Nov 2, 2011, 10:12:07 AM (14 years ago)
Author:
rniwa@webkit.org
Message:

div { display: none; } makes pasting into text fields impossible
https://bugs.webkit.org/show_bug.cgi?id=27683

Reviewed by Enrica Casucci.

Source/WebCore:

The bug was caused by insertFragmentForTestRendering's always inserting a node for test rendering
into document's body.

Fixed the bug by inserting the node for test rendering into the root editable element. In addition,
remove the node before dispatching beforeTextInserted event to avoid event listeners, in particular
TextFieldInputType::handleBeforeTextInsertedEvent, from seeing the test node.

Test: editing/pasteboard/input-with-display-none-div.html

  • editing/ReplaceSelectionCommand.cpp:

(WebCore::ReplacementFragment::ReplacementFragment):
(WebCore::ReplacementFragment::insertFragmentForTestRendering):
(WebCore::ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment):

LayoutTests:

Add a test to insert contents into an input element inside a page
with div { display: none; }

  • editing/pasteboard/input-with-display-none-div-expected.txt: Added.
  • editing/pasteboard/input-with-display-none-div.html: Added.
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r99075 r99076  
     12011-10-28  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        div { display: none; } makes pasting into text fields impossible
     4        https://bugs.webkit.org/show_bug.cgi?id=27683
     5
     6        Reviewed by Enrica Casucci.
     7
     8        Add a test to insert contents into an input element inside a page
     9        with div { display: none; }
     10
     11        * editing/pasteboard/input-with-display-none-div-expected.txt: Added.
     12        * editing/pasteboard/input-with-display-none-div.html: Added.
     13
    1142011-11-02  Tony Chang  <tony@chromium.org>
    215
  • trunk/Source/WebCore/ChangeLog

    r99067 r99076  
     12011-10-28  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        div { display: none; } makes pasting into text fields impossible
     4        https://bugs.webkit.org/show_bug.cgi?id=27683
     5
     6        Reviewed by Enrica Casucci.
     7
     8        The bug was caused by insertFragmentForTestRendering's always inserting a node for test rendering
     9        into document's body.
     10
     11        Fixed the bug by inserting the node for test rendering into the root editable element. In addition,
     12        remove the node before dispatching beforeTextInserted event to avoid event listeners, in particular
     13        TextFieldInputType::handleBeforeTextInsertedEvent, from seeing the test node.
     14
     15        Test: editing/pasteboard/input-with-display-none-div.html
     16
     17        * editing/ReplaceSelectionCommand.cpp:
     18        (WebCore::ReplacementFragment::ReplacementFragment):
     19        (WebCore::ReplacementFragment::insertFragmentForTestRendering):
     20        (WebCore::ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment):
     21
    1222011-11-02  Ryosuke Niwa  <rniwa@webkit.org>
    223
  • trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp

    r98899 r99076  
    8484
    8585private:
    86     PassRefPtr<StyledElement> insertFragmentForTestRendering(Node* context);
     86    PassRefPtr<StyledElement> insertFragmentForTestRendering(Node* rootEditableNode);
    8787    void removeUnrenderedNodes(Node*);
    88     void restoreTestRenderingNodesToFragment(StyledElement*);
     88    void restoreAndRemoveTestRenderingNodesToFragment(StyledElement*);
    8989    void removeInterchangeNodes(Node*);
    9090   
     
    157157    }
    158158
    159     RefPtr<Node> styleNode = selection.base().deprecatedNode();
    160     RefPtr<StyledElement> holder = insertFragmentForTestRendering(styleNode.get());
     159    RefPtr<StyledElement> holder = insertFragmentForTestRendering(editableRoot.get());
    161160    if (!holder) {
    162161        removeInterchangeNodes(m_fragment.get());
     
    166165    RefPtr<Range> range = VisibleSelection::selectionFromContentsOfNode(holder.get()).toNormalizedRange();
    167166    String text = plainText(range.get());
     167
     168    removeInterchangeNodes(holder.get());
     169    removeUnrenderedNodes(holder.get());
     170    restoreAndRemoveTestRenderingNodesToFragment(holder.get());
     171
    168172    // Give the root a chance to change the text.
    169173    RefPtr<BeforeTextInsertedEvent> evt = BeforeTextInsertedEvent::create(text);
     
    172176    ASSERT(ec == 0);
    173177    if (text != evt->text() || !editableRoot->rendererIsRichlyEditable()) {
    174         restoreTestRenderingNodesToFragment(holder.get());
    175         removeNode(holder);
     178        restoreAndRemoveTestRenderingNodesToFragment(holder.get());
    176179
    177180        m_fragment = createFragmentFromText(selection.toNormalizedRange().get(), evt->text());
    178181        if (!m_fragment->firstChild())
    179182            return;
    180         holder = insertFragmentForTestRendering(styleNode.get());
    181     }
    182    
    183     removeInterchangeNodes(holder.get());
    184    
    185     removeUnrenderedNodes(holder.get());
    186     restoreTestRenderingNodesToFragment(holder.get());
    187     removeNode(holder);
     183
     184        holder = insertFragmentForTestRendering(editableRoot.get());
     185        removeInterchangeNodes(holder.get());
     186        removeUnrenderedNodes(holder.get());
     187        restoreAndRemoveTestRenderingNodesToFragment(holder.get());
     188    }
    188189}
    189190
     
    243244}
    244245
    245 PassRefPtr<StyledElement> ReplacementFragment::insertFragmentForTestRendering(Node* context)
    246 {
    247     HTMLElement* body = m_document->body();
    248     if (!body)
    249         return 0;
    250 
     246PassRefPtr<StyledElement> ReplacementFragment::insertFragmentForTestRendering(Node* rootEditableElement)
     247{
    251248    RefPtr<StyledElement> holder = createDefaultParagraphElement(m_document.get());
    252249   
    253250    ExceptionCode ec = 0;
    254251
    255     // Copy the whitespace and user-select style from the context onto this element.
    256     // Walk up past <br> elements which may be placeholders and might have their own specified styles.
    257     // FIXME: We should examine other style properties to see if they would be appropriate to consider during the test rendering.
    258     Node* n = context;
    259     while (n && (!n->isElementNode() || n->hasTagName(brTag)))
    260         n = n->parentNode();
    261     if (n) {
    262         RefPtr<CSSComputedStyleDeclaration> conFontStyle = computedStyle(n);
    263         CSSStyleDeclaration* style = holder->style();
    264         style->setProperty(CSSPropertyWhiteSpace, conFontStyle->getPropertyValue(CSSPropertyWhiteSpace), false, ec);
    265         ASSERT(ec == 0);
    266         style->setProperty(CSSPropertyWebkitUserSelect, conFontStyle->getPropertyValue(CSSPropertyWebkitUserSelect), false, ec);
    267         ASSERT(ec == 0);
    268     }
    269    
    270252    holder->appendChild(m_fragment, ec);
    271253    ASSERT(ec == 0);
    272    
    273     body->appendChild(holder.get(), ec);
     254
     255    rootEditableElement->appendChild(holder.get(), ec);
    274256    ASSERT(ec == 0);
    275    
     257
    276258    m_document->updateLayoutIgnorePendingStylesheets();
    277    
     259
    278260    return holder.release();
    279261}
    280262
    281 void ReplacementFragment::restoreTestRenderingNodesToFragment(StyledElement* holder)
     263void ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment(StyledElement* holder)
    282264{
    283265    if (!holder)
     
    291273        ASSERT(ec == 0);
    292274    }
     275
     276    removeNode(holder);
    293277}
    294278
Note: See TracChangeset for help on using the changeset viewer.