Changeset 99076 in webkit
- Timestamp:
- Nov 2, 2011, 10:12:07 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r99075 r99076 1 2011-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 1 14 2011-11-02 Tony Chang <tony@chromium.org> 2 15 -
trunk/Source/WebCore/ChangeLog
r99067 r99076 1 2011-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 1 22 2011-11-02 Ryosuke Niwa <rniwa@webkit.org> 2 23 -
trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp
r98899 r99076 84 84 85 85 private: 86 PassRefPtr<StyledElement> insertFragmentForTestRendering(Node* context);86 PassRefPtr<StyledElement> insertFragmentForTestRendering(Node* rootEditableNode); 87 87 void removeUnrenderedNodes(Node*); 88 void restore TestRenderingNodesToFragment(StyledElement*);88 void restoreAndRemoveTestRenderingNodesToFragment(StyledElement*); 89 89 void removeInterchangeNodes(Node*); 90 90 … … 157 157 } 158 158 159 RefPtr<Node> styleNode = selection.base().deprecatedNode(); 160 RefPtr<StyledElement> holder = insertFragmentForTestRendering(styleNode.get()); 159 RefPtr<StyledElement> holder = insertFragmentForTestRendering(editableRoot.get()); 161 160 if (!holder) { 162 161 removeInterchangeNodes(m_fragment.get()); … … 166 165 RefPtr<Range> range = VisibleSelection::selectionFromContentsOfNode(holder.get()).toNormalizedRange(); 167 166 String text = plainText(range.get()); 167 168 removeInterchangeNodes(holder.get()); 169 removeUnrenderedNodes(holder.get()); 170 restoreAndRemoveTestRenderingNodesToFragment(holder.get()); 171 168 172 // Give the root a chance to change the text. 169 173 RefPtr<BeforeTextInsertedEvent> evt = BeforeTextInsertedEvent::create(text); … … 172 176 ASSERT(ec == 0); 173 177 if (text != evt->text() || !editableRoot->rendererIsRichlyEditable()) { 174 restoreTestRenderingNodesToFragment(holder.get()); 175 removeNode(holder); 178 restoreAndRemoveTestRenderingNodesToFragment(holder.get()); 176 179 177 180 m_fragment = createFragmentFromText(selection.toNormalizedRange().get(), evt->text()); 178 181 if (!m_fragment->firstChild()) 179 182 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 } 188 189 } 189 190 … … 243 244 } 244 245 245 PassRefPtr<StyledElement> ReplacementFragment::insertFragmentForTestRendering(Node* context) 246 { 247 HTMLElement* body = m_document->body(); 248 if (!body) 249 return 0; 250 246 PassRefPtr<StyledElement> ReplacementFragment::insertFragmentForTestRendering(Node* rootEditableElement) 247 { 251 248 RefPtr<StyledElement> holder = createDefaultParagraphElement(m_document.get()); 252 249 253 250 ExceptionCode ec = 0; 254 251 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 270 252 holder->appendChild(m_fragment, ec); 271 253 ASSERT(ec == 0); 272 273 body->appendChild(holder.get(), ec);254 255 rootEditableElement->appendChild(holder.get(), ec); 274 256 ASSERT(ec == 0); 275 257 276 258 m_document->updateLayoutIgnorePendingStylesheets(); 277 259 278 260 return holder.release(); 279 261 } 280 262 281 void ReplacementFragment::restore TestRenderingNodesToFragment(StyledElement* holder)263 void ReplacementFragment::restoreAndRemoveTestRenderingNodesToFragment(StyledElement* holder) 282 264 { 283 265 if (!holder) … … 291 273 ASSERT(ec == 0); 292 274 } 275 276 removeNode(holder); 293 277 } 294 278
Note:
See TracChangeset
for help on using the changeset viewer.