Index: Source/core/editing/FrameSelection.cpp |
diff --git a/Source/core/editing/FrameSelection.cpp b/Source/core/editing/FrameSelection.cpp |
index 090959156e4ed8647cd256049c840e4fdbdfa09c..bf2225d66de5c321daa6d7a96662e9fe09721a7a 100644 |
--- a/Source/core/editing/FrameSelection.cpp |
+++ b/Source/core/editing/FrameSelection.cpp |
@@ -223,7 +223,7 @@ void FrameSelection::setSelection(const VisibleSelection& newSelection, SetSelec |
bool shouldClearTypingStyle = options & ClearTypingStyle; |
EUserTriggered userTriggered = selectionOptionsToUserTriggered(options); |
- VisibleSelection s = newSelection; |
+ VisibleSelection s = validateSelection(newSelection); |
if (shouldAlwaysUseDirectionalSelection(m_frame)) |
s.setIsDirectional(true); |
@@ -1838,6 +1838,31 @@ void FrameSelection::didChangeVisibleSelection() |
m_observingVisibleSelection = false; |
} |
+VisibleSelection FrameSelection::validateSelection(const VisibleSelection& selection) |
+{ |
+ if (!m_frame || selection.isNone()) |
+ return selection; |
+ |
+ Position base = selection.base(); |
+ Position extent = selection.extent(); |
+ bool isBaseValid = base.document() == m_frame->document(); |
+ bool isExtentValid = extent.document() == m_frame->document(); |
+ |
+ if (isBaseValid && isExtentValid) |
+ return selection; |
+ |
+ VisibleSelection newSelection; |
+ if (isBaseValid) { |
+ newSelection.setWithoutValidation(base, base); |
+ return newSelection; |
+ } |
+ if (isExtentValid) { |
+ newSelection.setWithoutValidation(extent, extent); |
+ return newSelection; |
+ } |
+ return newSelection; |
+} |
+ |
void FrameSelection::startObservingVisibleSelectionChange() |
{ |
ASSERT(!m_observingVisibleSelection); |