Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Unified Diff: third_party/WebKit/Source/core/editing/Editor.cpp

Issue 2729313002: Prune layout update calls from Editor::*appliedEditing (Closed)
Patch Set: Prune layout update after applying commands Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/editing/Editor.cpp
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp
index 5d0c85686a345b6edbb41d7c3b46bb40eaa3ee0f..3644833bb635cd8257e69da2971feacb80778056 100644
--- a/third_party/WebKit/Source/core/editing/Editor.cpp
+++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -883,13 +883,15 @@ static void dispatchEditableContentChangedEvents(Element* startRoot,
Event::create(EventTypeNames::webkitEditableContentChanged));
}
-static VisibleSelection correctedVisibleSelection(
- const VisibleSelection& passedSelection) {
+static SelectionInDOMTree correctedSelectionAfterCommand(
+ const VisibleSelection& passedSelection,
yoichio 2017/03/21 06:41:57 Could you use SelectionINDOMTree& passedSelection
Xiaocheng 2017/03/21 20:53:39 It doesn't seem to introduce any benefit, since Ed
yoichio 2017/03/22 01:48:57 Yes, no benefit from a view of semantics. However,
Xiaocheng 2017/03/22 02:12:44 Sorry, I just realized that we can't change it in
+ Document* document) {
if (!passedSelection.base().isConnected() ||
- !passedSelection.extent().isConnected())
- return VisibleSelection();
- DCHECK(!passedSelection.base().document()->needsLayoutTreeUpdate());
- return createVisibleSelection(passedSelection.asSelection());
+ !passedSelection.extent().isConnected() ||
+ passedSelection.base().document() != document ||
+ passedSelection.base().document() != passedSelection.extent().document())
+ return SelectionInDOMTree();
+ return passedSelection.asSelection();
}
void Editor::appliedEditing(CompositeEditCommand* cmd) {
@@ -909,19 +911,12 @@ void Editor::appliedEditing(CompositeEditCommand* cmd) {
undoStep->endingRootEditableElement(), cmd->inputType(),
cmd->textDataForInputEvent(), isComposingFromCommand(cmd));
- // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
- // needs to be audited. See http://crbug.com/590369 for more details.
- // The clean layout is consumed by |mostBackwardCaretPosition|, called through
- // |changeSelectionAfterCommand|. In the long term, we should postpone visible
- // selection canonicalization so that selection update does not need layout.
- frame().document()->updateStyleAndLayoutIgnorePendingStylesheets();
-
- const VisibleSelection& newSelection =
- correctedVisibleSelection(cmd->endingSelection());
+ const SelectionInDOMTree& newSelection = correctedSelectionAfterCommand(
+ cmd->endingSelection(), frame().document());
// Don't clear the typing style with this selection change. We do those things
// elsewhere if necessary.
- changeSelectionAfterCommand(newSelection.asSelection(), 0);
+ changeSelectionAfterCommand(newSelection, 0);
if (!cmd->preservesTypingStyle())
clearTypingStyle();
@@ -943,7 +938,7 @@ void Editor::appliedEditing(CompositeEditCommand* cmd) {
m_undoStack->registerUndoStep(m_lastEditCommand->ensureUndoStep());
}
- respondToChangedContents(newSelection.start());
+ respondToChangedContents(newSelection.base());
}
void Editor::unappliedEditing(UndoStep* cmd) {
@@ -956,22 +951,15 @@ void Editor::unappliedEditing(UndoStep* cmd) {
InputEvent::InputType::HistoryUndo, nullAtom,
InputEvent::EventIsComposing::NotComposing);
- // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
- // needs to be audited. See http://crbug.com/590369 for more details.
- // In the long term, we should stop editing commands from storing
- // VisibleSelections as starting and ending selections.
- frame().document()->updateStyleAndLayoutIgnorePendingStylesheets();
-
- const VisibleSelection& newSelection =
- correctedVisibleSelection(cmd->startingSelection());
- DCHECK(newSelection.isValidFor(*frame().document())) << newSelection;
+ const SelectionInDOMTree& newSelection = correctedSelectionAfterCommand(
+ cmd->startingSelection(), frame().document());
changeSelectionAfterCommand(
- newSelection.asSelection(),
+ newSelection,
FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle);
m_lastEditCommand = nullptr;
m_undoStack->registerRedoStep(cmd);
- respondToChangedContents(newSelection.start());
+ respondToChangedContents(newSelection.base());
}
void Editor::reappliedEditing(UndoStep* cmd) {
@@ -984,21 +972,15 @@ void Editor::reappliedEditing(UndoStep* cmd) {
InputEvent::InputType::HistoryRedo, nullAtom,
InputEvent::EventIsComposing::NotComposing);
- // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
- // needs to be audited. See http://crbug.com/590369 for more details.
- // In the long term, we should stop editing commands from storing
- // VisibleSelections as starting and ending selections.
- frame().document()->updateStyleAndLayoutIgnorePendingStylesheets();
- const VisibleSelection& newSelection =
- correctedVisibleSelection(cmd->endingSelection());
- DCHECK(newSelection.isValidFor(*frame().document())) << newSelection;
+ const SelectionInDOMTree& newSelection = correctedSelectionAfterCommand(
+ cmd->endingSelection(), frame().document());
changeSelectionAfterCommand(
- newSelection.asSelection(),
+ newSelection,
FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle);
m_lastEditCommand = nullptr;
m_undoStack->registerUndoStep(cmd);
- respondToChangedContents(newSelection.start());
+ respondToChangedContents(newSelection.base());
}
Editor* Editor::create(LocalFrame& frame) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698