Index: third_party/WebKit/Source/core/editing/SelectionEditor.cpp |
diff --git a/third_party/WebKit/Source/core/editing/SelectionEditor.cpp b/third_party/WebKit/Source/core/editing/SelectionEditor.cpp |
index 0dc76f0fef3b9f52cab367db903ee52d1a675f81..e7025cf9d59ec9270904be7eed467078222a9773 100644 |
--- a/third_party/WebKit/Source/core/editing/SelectionEditor.cpp |
+++ b/third_party/WebKit/Source/core/editing/SelectionEditor.cpp |
@@ -36,15 +36,33 @@ SelectionEditor::SelectionEditor(FrameSelection& frameSelection) |
: m_frameSelection(frameSelection) |
, m_observingVisibleSelection(false) |
{ |
+ clearVisibleSelection(); |
} |
SelectionEditor::~SelectionEditor() |
{ |
} |
+void SelectionEditor::clearVisibleSelection() |
+{ |
+ m_selection = VisibleSelection(); |
+ m_selectionInFlatTree = VisibleSelectionInFlatTree(); |
+ if (!shouldAlwaysUseDirectionalSelection()) |
+ return; |
+ m_selection.setIsDirectional(true); |
+ m_selectionInFlatTree.setIsDirectional(true); |
+} |
+ |
void SelectionEditor::dispose() |
{ |
resetLogicalRange(); |
+ clearVisibleSelection(); |
+} |
+ |
+const Document& SelectionEditor::document() const |
+{ |
+ DCHECK(m_document); |
+ return *m_document; |
} |
LocalFrame* SelectionEditor::frame() const |
@@ -55,17 +73,28 @@ LocalFrame* SelectionEditor::frame() const |
template <> |
const VisibleSelection& SelectionEditor::visibleSelection<EditingStrategy>() const |
{ |
+ DCHECK_EQ(frame()->document(), document()); |
+ DCHECK_EQ(frame(), document().frame()); |
+ if (m_selection.isNone()) |
+ return m_selection; |
+ DCHECK_EQ(m_selection.base().document(), document()); |
return m_selection; |
} |
template <> |
const VisibleSelectionInFlatTree& SelectionEditor::visibleSelection<EditingInFlatTreeStrategy>() const |
{ |
+ DCHECK_EQ(frame()->document(), document()); |
+ DCHECK_EQ(frame(), document().frame()); |
+ if (m_selectionInFlatTree.isNone()) |
+ return m_selectionInFlatTree; |
+ DCHECK_EQ(m_selectionInFlatTree.base().document(), document()); |
return m_selectionInFlatTree; |
} |
void SelectionEditor::setVisibleSelection(const VisibleSelection& newSelection, FrameSelection::SetSelectionOptions options) |
{ |
+ DCHECK(newSelection.isValidFor(document())) << newSelection; |
resetLogicalRange(); |
m_selection = newSelection; |
if (options & FrameSelection::DoNotAdjustInFlatTree) { |
@@ -78,25 +107,37 @@ void SelectionEditor::setVisibleSelection(const VisibleSelection& newSelection, |
void SelectionEditor::setVisibleSelection(const VisibleSelectionInFlatTree& newSelection, FrameSelection::SetSelectionOptions options) |
{ |
+ DCHECK(newSelection.isValidFor(document())) << newSelection; |
DCHECK(!(options & FrameSelection::DoNotAdjustInFlatTree)); |
resetLogicalRange(); |
m_selectionInFlatTree = newSelection; |
SelectionAdjuster::adjustSelectionInDOMTree(&m_selection, m_selectionInFlatTree); |
} |
-void SelectionEditor::setIsDirectional(bool isDirectional) |
-{ |
- m_selection.setIsDirectional(isDirectional); |
- m_selectionInFlatTree.setIsDirectional(isDirectional); |
-} |
- |
void SelectionEditor::setWithoutValidation(const Position& base, const Position& extent) |
{ |
resetLogicalRange(); |
+ if (base.isNotNull()) |
+ DCHECK_EQ(base.document(), document()); |
+ if (extent.isNotNull()) |
+ DCHECK_EQ(extent.document(), document()); |
m_selection.setWithoutValidation(base, extent); |
m_selectionInFlatTree.setWithoutValidation(toPositionInFlatTree(base), toPositionInFlatTree(extent)); |
} |
+void SelectionEditor::documentAttached(Document* document) |
+{ |
+ DCHECK(!m_document); |
tkent
2016/06/07 23:41:59
We should have DCHECK(document)
yosin_UTC9
2016/06/08 04:06:10
Done.
|
+ m_document = document; |
+} |
+ |
+void SelectionEditor::documentDetached(const Document& document) |
+{ |
+ DCHECK_EQ(m_document, &document); |
+ dispose(); |
+ m_document = nullptr; |
+} |
+ |
void SelectionEditor::resetLogicalRange() |
{ |
// Non-collapsed ranges are not allowed to start at the end of a line that |
@@ -109,6 +150,7 @@ void SelectionEditor::resetLogicalRange() |
void SelectionEditor::setLogicalRange(Range* range) |
{ |
+ DCHECK_EQ(range->ownerDocument(), document()); |
DCHECK(!m_logicalRange) << "A logical range should be one."; |
m_logicalRange = range; |
} |
@@ -120,14 +162,22 @@ Range* SelectionEditor::firstRange() const |
return firstRangeOf(m_selection); |
} |
+bool SelectionEditor::shouldAlwaysUseDirectionalSelection() const |
+{ |
+ return frame()->editor().behavior().shouldConsiderSelectionAsDirectional(); |
+} |
+ |
void SelectionEditor::updateIfNeeded() |
{ |
+ DCHECK(m_selection.isValidFor(document())) << m_selection; |
+ DCHECK(m_selectionInFlatTree.isValidFor(document())) << m_selection; |
m_selection.updateIfNeeded(); |
m_selectionInFlatTree.updateIfNeeded(); |
} |
DEFINE_TRACE(SelectionEditor) |
{ |
+ visitor->trace(m_document); |
visitor->trace(m_frameSelection); |
visitor->trace(m_selection); |
visitor->trace(m_selectionInFlatTree); |