Changeset 185838 in webkit
- Timestamp:
- Jun 22, 2015, 12:35:19 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 3 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/regions/crash-when-renderer-is-in-multiple-selection-subtrees-expected.txt (added)
-
LayoutTests/fast/regions/crash-when-renderer-is-in-multiple-selection-subtrees.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/rendering/SelectionSubtreeRoot.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r185828 r185838 1 2015-06-22 Zalan Bujtas <zalan@apple.com> 2 3 REGRESSION(r169105) Dangling renderer pointer in SelectionSubtreeRoot::SelectionSubtreeData. 4 https://bugs.webkit.org/show_bug.cgi?id=146116 5 rdar://problem/20959369 6 7 Reviewed by Brent Fulgham. 8 9 This patch ensures that we don't adjust the selection unless the visual selection still matches this subtree root. 10 11 When multiple selection roots are present we need to ensure that a RenderObject 12 only shows up in one of them. 13 RenderView::splitSelectionBetweenSubtrees(), as the name implies, splits the 14 selection and sets the selection range (start/end) on each selection root. 15 However, SelectionSubtreeRoot::adjustForVisibleSelection() later recomputes the range 16 based on visible selection and that could end up collecting renderers as selection start/end 17 from another selection subtree. 18 RenderObject's holds the last selection state (RenderObject::setSelectionState). 19 If we set a renderer first as "on selection border" and later "inside" using multiple selection roots, 20 we can't clean up selections properly when this object gets destroyed. 21 One of the roots ends up with a dangling RenderObject pointer. 22 23 * fast/regions/crash-when-renderer-is-in-multiple-selection-subtrees-expected.txt: Added. 24 * fast/regions/crash-when-renderer-is-in-multiple-selection-subtrees.html: Added. 25 1 26 2015-06-22 Daniel Bates <dabates@apple.com> 2 27 -
trunk/Source/WebCore/ChangeLog
r185834 r185838 1 2015-06-22 Zalan Bujtas <zalan@apple.com> 2 3 REGRESSION(r169105) Dangling renderer pointer in SelectionSubtreeRoot::SelectionSubtreeData. 4 https://bugs.webkit.org/show_bug.cgi?id=146116 5 rdar://problem/20959369 6 7 Reviewed by Brent Fulgham. 8 9 This patch ensures that we don't adjust the selection unless the visual selection still matches this subtree root. 10 11 When multiple selection roots are present we need to ensure that a RenderObject 12 only shows up in one of them. 13 RenderView::splitSelectionBetweenSubtrees(), as the name implies, splits the 14 selection and sets the selection range (start/end) on each selection root. 15 However, SelectionSubtreeRoot::adjustForVisibleSelection() later recomputes the range 16 based on visible selection and that could end up collecting renderers as selection start/end 17 from another selection subtree. 18 RenderObject's holds the last selection state (RenderObject::setSelectionState). 19 If we set a renderer first as "on selection border" and later "inside" using multiple selection roots, 20 we can't clean up selections properly when this object gets destroyed. 21 One of the roots ends up with a dangling RenderObject pointer. 22 23 Test: fast/regions/crash-when-renderer-is-in-multiple-selection-subtrees.html 24 25 * rendering/SelectionSubtreeRoot.cpp: 26 (WebCore::SelectionSubtreeRoot::adjustForVisibleSelection): 27 1 28 2015-06-22 Jeremy Jones <jeremyj@apple.com> 2 29 -
trunk/Source/WebCore/rendering/SelectionSubtreeRoot.cpp
r183158 r185838 71 71 m_selectionSubtreeData.clearSelection(); 72 72 73 if (startPos.isNotNull() 74 && endPos.isNotNull() 75 && selection.visibleStart() != selection.visibleEnd() 76 && startPos.deprecatedNode()->renderer()->flowThreadContainingBlock() == endPos.deprecatedNode()->renderer()->flowThreadContainingBlock()) { 77 m_selectionSubtreeData.setSelectionStart(startPos.deprecatedNode()->renderer()); 78 m_selectionSubtreeData.setSelectionStartPos(startPos.deprecatedEditingOffset()); 79 m_selectionSubtreeData.setSelectionEnd(endPos.deprecatedNode()->renderer()); 80 m_selectionSubtreeData.setSelectionEndPos(endPos.deprecatedEditingOffset()); 81 } 73 if (startPos.isNull() || endPos.isNull()) 74 return; 75 76 if (selection.visibleStart() == selection.visibleEnd()) 77 return; 78 79 if (startPos.deprecatedNode()->renderer()->flowThreadContainingBlock() != endPos.deprecatedNode()->renderer()->flowThreadContainingBlock()) 80 return; 81 82 if (&startPos.deprecatedNode()->renderer()->selectionRoot() != this) 83 return; 84 85 m_selectionSubtreeData.setSelectionStart(startPos.deprecatedNode()->renderer()); 86 m_selectionSubtreeData.setSelectionStartPos(startPos.deprecatedEditingOffset()); 87 m_selectionSubtreeData.setSelectionEnd(endPos.deprecatedNode()->renderer()); 88 m_selectionSubtreeData.setSelectionEndPos(endPos.deprecatedEditingOffset()); 82 89 } 83 90
Note:
See TracChangeset
for help on using the changeset viewer.