Title: [99076] trunk
Revision
99076
Author
[email protected]
Date
2011-11-02 10:12:07 -0700 (Wed, 02 Nov 2011)

Log 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.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (99075 => 99076)


--- trunk/LayoutTests/ChangeLog	2011-11-02 16:59:31 UTC (rev 99075)
+++ trunk/LayoutTests/ChangeLog	2011-11-02 17:12:07 UTC (rev 99076)
@@ -1,3 +1,16 @@
+2011-10-28  Ryosuke Niwa  <[email protected]>
+
+        div { display: none; } makes pasting into text fields impossible
+        https://bugs.webkit.org/show_bug.cgi?id=27683
+
+        Reviewed by Enrica Casucci.
+
+        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.
+
 2011-11-02  Tony Chang  <[email protected]>
 
         Add chromium test results for fast/reflections/reflection-masks-outset.html

Added: trunk/LayoutTests/editing/pasteboard/input-with-display-none-div-expected.txt (0 => 99076)


--- trunk/LayoutTests/editing/pasteboard/input-with-display-none-div-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/input-with-display-none-div-expected.txt	2011-11-02 17:12:07 UTC (rev 99076)
@@ -0,0 +1,4 @@
+This tests pasting (InsertHTML) into an input element with a CSS rule div { display: none}. You should see PASS below.
+
+
+PASS

Added: trunk/LayoutTests/editing/pasteboard/input-with-display-none-div.html (0 => 99076)


--- trunk/LayoutTests/editing/pasteboard/input-with-display-none-div.html	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/input-with-display-none-div.html	2011-11-02 17:12:07 UTC (rev 99076)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style type="text/css">
+div { display: none; }
+</style>
+</head>
+<body>
+<p>This tests pasting (InsertHTML) into an input element with a CSS rule div { display: none}.
+You should see PASS below.</p>
+<input type="text" value="FAIL">
+<p><script>
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+var input = document.querySelector('input');
+input.focus();
+document.execCommand('InsertHTML', false, 'PASS');
+
+document.write(input.value);
+
+</script></p>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (99075 => 99076)


--- trunk/Source/WebCore/ChangeLog	2011-11-02 16:59:31 UTC (rev 99075)
+++ trunk/Source/WebCore/ChangeLog	2011-11-02 17:12:07 UTC (rev 99076)
@@ -1,3 +1,24 @@
+2011-10-28  Ryosuke Niwa  <[email protected]>
+
+        div { display: none; } makes pasting into text fields impossible
+        https://bugs.webkit.org/show_bug.cgi?id=27683
+
+        Reviewed by Enrica Casucci.
+
+        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):
+
 2011-11-02  Ryosuke Niwa  <[email protected]>
 
         REGRESSION(r96870): WebKit generates background: transparent on blogger.com

Modified: trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp (99075 => 99076)


--- trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp	2011-11-02 16:59:31 UTC (rev 99075)
+++ trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp	2011-11-02 17:12:07 UTC (rev 99076)
@@ -83,9 +83,9 @@
     void removeNodePreservingChildren(Node*);
 
 private:
-    PassRefPtr<StyledElement> insertFragmentForTestRendering(Node* context);
+    PassRefPtr<StyledElement> insertFragmentForTestRendering(Node* rootEditableNode);
     void removeUnrenderedNodes(Node*);
-    void restoreTestRenderingNodesToFragment(StyledElement*);
+    void restoreAndRemoveTestRenderingNodesToFragment(StyledElement*);
     void removeInterchangeNodes(Node*);
     
     void insertNodeBefore(PassRefPtr<Node> node, Node* refNode);
@@ -156,8 +156,7 @@
         return;
     }
 
-    RefPtr<Node> styleNode = selection.base().deprecatedNode();
-    RefPtr<StyledElement> holder = insertFragmentForTestRendering(styleNode.get());
+    RefPtr<StyledElement> holder = insertFragmentForTestRendering(editableRoot.get());
     if (!holder) {
         removeInterchangeNodes(m_fragment.get());
         return;
@@ -165,26 +164,28 @@
     
     RefPtr<Range> range = VisibleSelection::selectionFromContentsOfNode(holder.get()).toNormalizedRange();
     String text = plainText(range.get());
+
+    removeInterchangeNodes(holder.get());
+    removeUnrenderedNodes(holder.get());
+    restoreAndRemoveTestRenderingNodesToFragment(holder.get());
+
     // Give the root a chance to change the text.
     RefPtr<BeforeTextInsertedEvent> evt = BeforeTextInsertedEvent::create(text);
     ExceptionCode ec = 0;
     editableRoot->dispatchEvent(evt, ec);
     ASSERT(ec == 0);
     if (text != evt->text() || !editableRoot->rendererIsRichlyEditable()) {
-        restoreTestRenderingNodesToFragment(holder.get());
-        removeNode(holder);
+        restoreAndRemoveTestRenderingNodesToFragment(holder.get());
 
         m_fragment = createFragmentFromText(selection.toNormalizedRange().get(), evt->text());
         if (!m_fragment->firstChild())
             return;
-        holder = insertFragmentForTestRendering(styleNode.get());
+
+        holder = insertFragmentForTestRendering(editableRoot.get());
+        removeInterchangeNodes(holder.get());
+        removeUnrenderedNodes(holder.get());
+        restoreAndRemoveTestRenderingNodesToFragment(holder.get());
     }
-    
-    removeInterchangeNodes(holder.get());
-    
-    removeUnrenderedNodes(holder.get());
-    restoreTestRenderingNodesToFragment(holder.get());
-    removeNode(holder);
 }
 
 bool ReplacementFragment::isEmpty() const
@@ -242,43 +243,24 @@
     ASSERT(ec == 0);
 }
 
-PassRefPtr<StyledElement> ReplacementFragment::insertFragmentForTestRendering(Node* context)
+PassRefPtr<StyledElement> ReplacementFragment::insertFragmentForTestRendering(Node* rootEditableElement)
 {
-    HTMLElement* body = m_document->body();
-    if (!body)
-        return 0;
-
     RefPtr<StyledElement> holder = createDefaultParagraphElement(m_document.get());
     
     ExceptionCode ec = 0;
 
-    // Copy the whitespace and user-select style from the context onto this element.
-    // Walk up past <br> elements which may be placeholders and might have their own specified styles.
-    // FIXME: We should examine other style properties to see if they would be appropriate to consider during the test rendering.
-    Node* n = context;
-    while (n && (!n->isElementNode() || n->hasTagName(brTag)))
-        n = n->parentNode();
-    if (n) {
-        RefPtr<CSSComputedStyleDeclaration> conFontStyle = computedStyle(n);
-        CSSStyleDeclaration* style = holder->style();
-        style->setProperty(CSSPropertyWhiteSpace, conFontStyle->getPropertyValue(CSSPropertyWhiteSpace), false, ec);
-        ASSERT(ec == 0);
-        style->setProperty(CSSPropertyWebkitUserSelect, conFontStyle->getPropertyValue(CSSPropertyWebkitUserSelect), false, ec);
-        ASSERT(ec == 0);
-    }
-    
     holder->appendChild(m_fragment, ec);
     ASSERT(ec == 0);
-    
-    body->appendChild(holder.get(), ec);
+
+    rootEditableElement->appendChild(holder.get(), ec);
     ASSERT(ec == 0);
-    
+
     m_document->updateLayoutIgnorePendingStylesheets();
-    
+
     return holder.release();
 }
 
-void ReplacementFragment::restoreTestRenderingNodesToFragment(StyledElement* holder)
+void ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment(StyledElement* holder)
 {
     if (!holder)
         return;
@@ -290,6 +272,8 @@
         m_fragment->appendChild(node.get(), ec);
         ASSERT(ec == 0);
     }
+
+    removeNode(holder);
 }
 
 void ReplacementFragment::removeUnrenderedNodes(Node* holder)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to