Index: third_party/WebKit/Source/core/editing/SelectionController.cpp |
diff --git a/third_party/WebKit/Source/core/editing/SelectionController.cpp b/third_party/WebKit/Source/core/editing/SelectionController.cpp |
index 2c317f259e65caae5930dd13894feb023c9c87b5..802c200a51c73f386388d02d16b3a59641f9b9df 100644 |
--- a/third_party/WebKit/Source/core/editing/SelectionController.cpp |
+++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp |
@@ -273,7 +273,11 @@ bool SelectionController::updateSelectionForMouseDownDispatchingSelectStart(Node |
if (dispatchSelectStart(targetNode) != DispatchEventResult::NotCanceled) |
return false; |
- if (!selection.isValidFor(*m_frame->document())) |
+ // |dispatchSelectStart()| can change document hosted by |m_frame|. |
+ if (!this->selection().isAvailable()) |
+ return false; |
+ |
+ if (!selection.isValidFor(this->selection().document())) |
return false; |
if (selection.isRange()) { |
@@ -394,6 +398,9 @@ bool SelectionController::handleMousePressEventDoubleClick(const MouseEventWithH |
{ |
TRACE_EVENT0("blink", "SelectionController::handleMousePressEventDoubleClick"); |
+ if (!selection().isAvailable()) |
+ return false; |
+ |
if (!m_mouseDownAllowsMultiClick) |
return handleMousePressEventSingleClick(event); |
@@ -417,6 +424,11 @@ bool SelectionController::handleMousePressEventTripleClick(const MouseEventWithH |
{ |
TRACE_EVENT0("blink", "SelectionController::handleMousePressEventTripleClick"); |
+ if (!selection().isAvailable()) { |
+ // editing/shadow/doubleclick-on-meter-in-shadow-crash.html reach here. |
+ return false; |
+ } |
+ |
if (!m_mouseDownAllowsMultiClick) |
return handleMousePressEventSingleClick(event); |
@@ -444,13 +456,22 @@ void SelectionController::handleMousePressEvent(const MouseEventWithHitTestResul |
m_mouseDownMayStartSelect = (canMouseDownStartSelect(event.innerNode()) || isLinkSelection(event)) |
&& !event.scrollbar(); |
m_mouseDownWasSingleClickInSelection = false; |
+ if (!selection().isAvailable()) { |
+ // "gesture-tap-frame-removed.html" reaches here. |
+ m_mouseDownAllowsMultiClick = !event.event().fromTouch(); |
+ return; |
+ } |
+ |
// Avoid double-tap touch gesture confusion by restricting multi-click side |
// effects, e.g., word selection, to editable regions. |
m_mouseDownAllowsMultiClick = !event.event().fromTouch() || selection().hasEditableStyle(); |
+ |
tkent
2016/06/07 23:41:59
nit: This change is unnecessary.
yosin_UTC9
2016/06/08 04:06:10
Done.
|
} |
void SelectionController::handleMouseDraggedEvent(const MouseEventWithHitTestResults& event, const IntPoint& mouseDownPos, const LayoutPoint& dragStartPos, Node* mousePressNode, const IntPoint& lastKnownMousePosition) |
{ |
+ if (!selection().isAvailable()) |
+ return; |
if (m_selectionState != SelectionState::ExtendedSelection) { |
HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); |
HitTestResult result(request, mouseDownPos); |
@@ -478,6 +499,9 @@ void SelectionController::updateSelectionForMouseDrag(Node* mousePressNode, cons |
bool SelectionController::handleMouseReleaseEvent(const MouseEventWithHitTestResults& event, const LayoutPoint& dragStartPos) |
{ |
+ if (!selection().isAvailable()) |
+ return false; |
+ |
bool handled = false; |
m_mouseDownMayStartSelect = false; |
// Clear the selection if the mouse didn't move after the last mouse |
@@ -546,6 +570,8 @@ bool SelectionController::handlePasteGlobalSelection(const PlatformMouseEvent& m |
bool SelectionController::handleGestureLongPress(const PlatformGestureEvent& gestureEvent, const HitTestResult& hitTestResult) |
{ |
+ if (!selection().isAvailable()) |
+ return false; |
if (hitTestResult.isLiveLink()) |
return false; |
@@ -555,11 +581,18 @@ bool SelectionController::handleGestureLongPress(const PlatformGestureEvent& ges |
return false; |
selectClosestWordFromHitTestResult(hitTestResult, AppendTrailingWhitespace::DontAppend, SelectInputEventType::GestureLongPress); |
+ if (!selection().isAvailable()) { |
+ // "editing/selection/longpress-selection-in-iframe-removed-crash.html" |
+ // reach here. |
+ return false; |
+ } |
return selection().isRange(); |
} |
void SelectionController::sendContextMenuEvent(const MouseEventWithHitTestResults& mev, const LayoutPoint& position) |
{ |
+ if (!selection().isAvailable()) |
+ return; |
if (selection().contains(position) |
|| mev.scrollbar() |
// FIXME: In the editable case, word selection sometimes selects content that isn't underneath the mouse. |