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