Index: third_party/WebKit/Source/core/editing/FrameSelection.cpp |
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp |
index 6467d40158b462f9ef3272f1b678b2bd85edc4b7..d85af769ad84b284ac3e0f051cb583d43a133543 100644 |
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp |
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp |
@@ -250,7 +250,7 @@ void FrameSelection::DidSetSelectionDeprecated(SetSelectionOptions options, |
} |
frame_caret_->StopCaretBlinkTimer(); |
- UpdateAppearance(); |
+ UpdateAppearance(LayoutSelection::PaintHint::kPaint); |
// Always clear the x position used for vertical arrow navigation. |
// It will be restored by the vertical arrow navigation code if necessary. |
@@ -335,7 +335,21 @@ void FrameSelection::DidChangeFocus() { |
// Hits in |
// virtual/gpu/compositedscrolling/scrollbars/scrollbar-miss-mousemove-disabled.html |
DisableCompositingQueryAsserts disabler; |
- UpdateAppearance(); |
+ |
+ const Element* focus = GetDocument().FocusedElement(); |
yosin_UTC9
2017/04/13 09:31:50
Since Document::FocusedElement() is simple getter.
hugoh_UTC2
2017/04/14 01:34:47
Done. (But the comment must go above the ternary o
|
+ if (!focus) { |
+ // No focused element means document root has focus. |
+ focus = GetDocument().documentElement(); |
+ if (!focus) |
+ return; |
yosin_UTC9
2017/04/13 09:31:50
We still need to call
frame_caret_->ScheduleVisual
hugoh_UTC2
2017/04/14 01:34:47
Done.
|
+ } |
+ // Hide the selection when focus goes away from a text-field and into |
+ // something that is not a text-field. When focus enters another text-field we |
+ // do not need to update appearance; the appearance is updated when the new |
+ // selection is set. |
+ if (text_control_focus_ && !focus->IsTextControl()) |
+ UpdateAppearance(LayoutSelection::PaintHint::kHide); |
+ text_control_focus_ = focus->IsTextControl(); |
} |
static DispatchEventResult DispatchSelectStart( |
@@ -773,13 +787,15 @@ void FrameSelection::CommitAppearanceIfNeeded(LayoutView& layout_view) { |
} |
void FrameSelection::DidLayout() { |
- UpdateAppearance(); |
+ // Upon relayout, a hidden selection must be kept hidden and a visible |
+ // selection must be kept visible. |
+ UpdateAppearance(LayoutSelection::PaintHint::kKeep); |
} |
-void FrameSelection::UpdateAppearance() { |
+void FrameSelection::UpdateAppearance(LayoutSelection::PaintHint hint) { |
DCHECK(!frame_->ContentLayoutItem().IsNull()); |
frame_caret_->ScheduleVisualUpdateForPaintInvalidationIfNeeded(); |
- layout_selection_->SetHasPendingSelection(); |
+ layout_selection_->SetHasPendingSelection(hint); |
} |
void FrameSelection::NotifyLayoutObjectOfSelectionChange( |
@@ -970,7 +986,7 @@ void FrameSelection::RevealSelection(const ScrollAlignment& alignment, |
document_loader->GetInitialScrollState().was_scrolled_by_user = true; |
if (start.AnchorNode()->GetLayoutObject()->ScrollRectToVisible( |
rect, alignment, alignment)) |
- UpdateAppearance(); |
+ UpdateAppearance(LayoutSelection::PaintHint::kPaint); |
} |
} |