Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index 17680fb568c943022b1296e3bf08c7893a8f51ad..bac91e47042a4fae8a4db4324f19d7f4d99e8b91 100644 |
--- a/Source/core/page/EventHandler.cpp |
+++ b/Source/core/page/EventHandler.cpp |
@@ -2054,10 +2054,14 @@ bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targeted |
// mouseup will set a selection inside it, which will call |
// FrameSelection::setFocusedNodeIfNeeded. |
if (element |
- && m_frame->selection().isRange() |
- && m_frame->selection().toNormalizedRange()->compareNode(element, IGNORE_EXCEPTION) == Range::NODE_INSIDE |
- && element->isDescendantOf(m_frame->document()->focusedElement())) |
- return false; |
+ && m_frame->selection().isRange()) { |
+ RefPtrWillBeRawPtr<Range> selectedRange = m_frame->selection().toNormalizedRange(); |
+ bool nodeFullySelected = Range::compareBoundaryPoints(element->parentNode(), element->nodeIndex(), selectedRange->startContainer(), selectedRange->startOffset(), IGNORE_EXCEPTION) >= 0 |
+ && Range::compareBoundaryPoints(element->parentNode(), element->nodeIndex() + 1, selectedRange->endContainer(), selectedRange->endOffset(), IGNORE_EXCEPTION) <= 0; |
+ if (nodeFullySelected && element->isDescendantOf(m_frame->document()->focusedElement())) |
+ return false; |
+ } |
+ |
// Only change the focus when clicking scrollbars if it can transfered to a |
// mouse focusable node. |