Changeset 71288 in webkit
- Timestamp:
- Nov 3, 2010 5:14:01 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r71282 r71288 1 2010-10-29 Ryosuke Niwa <rniwa@webkit.org> 2 3 Reviewed by Darin Adler. 4 5 Crash in ApplyStyleCommand::removeStyleFromRunBeforeApplyingStyle 6 https://bugs.webkit.org/show_bug.cgi?id=48581 7 8 Added a test to ensure removeStyleFromRunBeforeApplyingStyle doesn't crash. 9 10 * editing/style/iframe-onload-crash-expected.txt: Added. 11 * editing/style/iframe-onload-crash.html: Added. 12 1 13 2010-11-02 Zhenyao Mo <zmo@google.com> 2 14 -
trunk/WebCore/ChangeLog
r71284 r71288 1 2010-11-01 Ryosuke Niwa <rniwa@webkit.org> 2 3 Reviewed by Darin Adler. 4 5 Crash in ApplyStyleCommand::removeStyleFromRunBeforeApplyingStyle 6 https://bugs.webkit.org/show_bug.cgi?id=48581 7 8 The crash was caused by RemoveNodePreservingChildrenCommand's calling removeNode 9 on m_node without checking that m_node has a parent and it's still in the document. 10 Fixed the crash by adding an early exit in CompositeEditCommand::removeNode and 11 deploying RefPtr in several places of ApplyStyleCommand.cpp. 12 13 Test: editing/style/iframe-onload-crash.html 14 15 * editing/ApplyStyleCommand.cpp: 16 (WebCore::ApplyStyleCommand::applyInlineStyleToNodeRange): 17 (WebCore::ApplyStyleCommand::removeStyleFromRunBeforeApplyingStyle): 18 (WebCore::ApplyStyleCommand::removeInlineStyleFromElement): 19 * editing/ApplyStyleCommand.h: 20 * editing/CompositeEditCommand.cpp: 21 (WebCore::CompositeEditCommand::removeNode): 22 1 23 2010-11-03 Jia Pu <jpu@apple.com> 2 24 -
trunk/WebCore/editing/ApplyStyleCommand.cpp
r70821 r71288 1151 1151 return; 1152 1152 1153 for ( Node* next; node && node != pastEndNode; node = next) {1153 for (RefPtr<Node> next; node && node != pastEndNode; node = next.get()) { 1154 1154 next = node->traverseNextNode(); 1155 1155 1156 1156 if (!node->renderer() || !node->isContentEditable()) 1157 1157 continue; … … 1184 1184 } 1185 1185 1186 Node* runEnd = node; 1186 RefPtr<Node> runStart = node; 1187 RefPtr<Node> runEnd = node; 1187 1188 Node* sibling = node->nextSibling(); 1188 1189 while (sibling && sibling != pastEndNode && !sibling->contains(pastEndNode) … … 1194 1195 next = runEnd->traverseNextSibling(); 1195 1196 1196 if (!removeStyleFromRunBeforeApplyingStyle(style, node, runEnd))1197 if (!removeStyleFromRunBeforeApplyingStyle(style, runStart, runEnd)) 1197 1198 continue; 1198 addInlineStyleIfNeeded(style, node, runEnd, AddStyledElement);1199 addInlineStyleIfNeeded(style, runStart.get(), runEnd.get(), AddStyledElement); 1199 1200 } 1200 1201 } … … 1206 1207 } 1207 1208 1208 bool ApplyStyleCommand::removeStyleFromRunBeforeApplyingStyle(CSSMutableStyleDeclaration* style, Node*& runStart, Node*& runEnd)1209 bool ApplyStyleCommand::removeStyleFromRunBeforeApplyingStyle(CSSMutableStyleDeclaration* style, RefPtr<Node>& runStart, RefPtr<Node>& runEnd) 1209 1210 { 1210 1211 ASSERT(runStart && runEnd && runStart->parentNode() == runEnd->parentNode()); 1211 Node*pastEndNode = runEnd->traverseNextSibling();1212 RefPtr<Node> pastEndNode = runEnd->traverseNextSibling(); 1212 1213 bool needToApplyStyle = false; 1213 for (Node* node = runStart ; node && node != pastEndNode; node = node->traverseNextNode()) {1214 for (Node* node = runStart.get(); node && node != pastEndNode.get(); node = node->traverseNextNode()) { 1214 1215 if (node->childNodeCount()) 1215 1216 continue; … … 1224 1225 return false; 1225 1226 1226 Node* next;1227 for ( Node* node = runStart; node&& node != pastEndNode; node = next) {1227 RefPtr<Node> next = runStart; 1228 for (RefPtr<Node> node = next; node && node->inDocument() && node != pastEndNode; node = next) { 1228 1229 next = node->traverseNextNode(); 1229 1230 if (!node->isHTMLElement()) 1230 1231 continue; 1231 1232 Node*previousSibling = node->previousSibling();1233 Node*nextSibling = node->nextSibling();1234 ContainerNode*parent = node->parentNode();1235 removeInlineStyleFromElement(style, static_cast<HTMLElement*>(node ), RemoveAlways);1232 1233 RefPtr<Node> previousSibling = node->previousSibling(); 1234 RefPtr<Node> nextSibling = node->nextSibling(); 1235 RefPtr<ContainerNode> parent = node->parentNode(); 1236 removeInlineStyleFromElement(style, static_cast<HTMLElement*>(node.get()), RemoveAlways); 1236 1237 if (!node->inDocument()) { 1237 1238 // FIXME: We might need to update the start and the end of current selection here but need a test. … … 1246 1247 } 1247 1248 1248 bool ApplyStyleCommand::removeInlineStyleFromElement(CSSMutableStyleDeclaration* style, HTMLElement*element, InlineStyleRemovalMode mode, CSSMutableStyleDeclaration* extractedStyle)1249 bool ApplyStyleCommand::removeInlineStyleFromElement(CSSMutableStyleDeclaration* style, PassRefPtr<HTMLElement> element, InlineStyleRemovalMode mode, CSSMutableStyleDeclaration* extractedStyle) 1249 1250 { 1250 1251 ASSERT(style); … … 1254 1255 return false; 1255 1256 1256 if (isStyledInlineElementToRemove(element )) {1257 if (isStyledInlineElementToRemove(element.get())) { 1257 1258 if (mode == RemoveNone) 1258 1259 return true; … … 1265 1266 1266 1267 bool removed = false; 1267 if (removeImplicitlyStyledElement(style, element , mode, extractedStyle))1268 if (removeImplicitlyStyledElement(style, element.get(), mode, extractedStyle)) 1268 1269 removed = true; 1269 1270 … … 1273 1274 // If the node was converted to a span, the span may still contain relevant 1274 1275 // styles which must be removed (e.g. <b style='font-weight: bold'>) 1275 if (removeCSSStyle(style, element , mode, extractedStyle))1276 if (removeCSSStyle(style, element.get(), mode, extractedStyle)) 1276 1277 removed = true; 1277 1278 -
trunk/WebCore/editing/ApplyStyleCommand.h
r70283 r71288 80 80 // style-removal helpers 81 81 bool isStyledInlineElementToRemove(Element*) const; 82 bool removeStyleFromRunBeforeApplyingStyle(CSSMutableStyleDeclaration* style, Node*& runStart, Node*& runEnd);83 bool removeInlineStyleFromElement(CSSMutableStyleDeclaration*, HTMLElement*, InlineStyleRemovalMode = RemoveIfNeeded, CSSMutableStyleDeclaration* extractedStyle = 0);82 bool removeStyleFromRunBeforeApplyingStyle(CSSMutableStyleDeclaration* style, RefPtr<Node>& runStart, RefPtr<Node>& runEnd); 83 bool removeInlineStyleFromElement(CSSMutableStyleDeclaration*, PassRefPtr<HTMLElement>, InlineStyleRemovalMode = RemoveIfNeeded, CSSMutableStyleDeclaration* extractedStyle = 0); 84 84 inline bool shouldRemoveInlineStyleFromElement(CSSMutableStyleDeclaration* style, HTMLElement* element) {return removeInlineStyleFromElement(style, element, RemoveNone);} 85 85 bool removeImplicitlyStyledElement(CSSMutableStyleDeclaration*, HTMLElement*, InlineStyleRemovalMode, CSSMutableStyleDeclaration* extractedStyle); -
trunk/WebCore/editing/CompositeEditCommand.cpp
r70594 r71288 207 207 void CompositeEditCommand::removeNode(PassRefPtr<Node> node) 208 208 { 209 if (!node || !node->parentNode()) 210 return; 209 211 applyCommandToComposite(RemoveNodeCommand::create(node)); 210 212 }
Note: See TracChangeset
for help on using the changeset viewer.