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

Side by Side Diff: third_party/WebKit/Source/core/editing/FrameSelection.cpp

Issue 2616623002: Do not send redundant selectionchange-events (decouple focus) (Closed)
Patch Set: Rebase Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 // "FocusIn", |m_frame| may associate to another document. 243 // "FocusIn", |m_frame| may associate to another document.
244 if (!IsAvailable() || GetDocument() != current_document) { 244 if (!IsAvailable() || GetDocument() != current_document) {
245 // Once we get test case to reach here, we should change this 245 // Once we get test case to reach here, we should change this
246 // if-statement to |DCHECK()|. 246 // if-statement to |DCHECK()|.
247 NOTREACHED(); 247 NOTREACHED();
248 return; 248 return;
249 } 249 }
250 } 250 }
251 251
252 frame_caret_->StopCaretBlinkTimer(); 252 frame_caret_->StopCaretBlinkTimer();
253 UpdateAppearance(); 253 UpdateAppearance(LayoutSelection::PaintHint::kPaint);
254 254
255 // Always clear the x position used for vertical arrow navigation. 255 // Always clear the x position used for vertical arrow navigation.
256 // It will be restored by the vertical arrow navigation code if necessary. 256 // It will be restored by the vertical arrow navigation code if necessary.
257 x_pos_for_vertical_arrow_navigation_ = NoXPosForVerticalArrowNavigation(); 257 x_pos_for_vertical_arrow_navigation_ = NoXPosForVerticalArrowNavigation();
258 258
259 // TODO(yosin): Can we move this to at end of this function? 259 // TODO(yosin): Can we move this to at end of this function?
260 // This may dispatch a synchronous focus-related events. 260 // This may dispatch a synchronous focus-related events.
261 if (!(options & kDoNotSetFocus)) { 261 if (!(options & kDoNotSetFocus)) {
262 SelectFrameElementInParentIfFullySelected(); 262 SelectFrameElementInParentIfFullySelected();
263 if (!IsAvailable() || GetDocument() != current_document) { 263 if (!IsAvailable() || GetDocument() != current_document) {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 // TODO(yosin): We should move to call |TypingCommand::closeTyping()| to 328 // TODO(yosin): We should move to call |TypingCommand::closeTyping()| to
329 // |Editor| class. 329 // |Editor| class.
330 if (!GetDocument().IsRunningExecCommand()) 330 if (!GetDocument().IsRunningExecCommand())
331 TypingCommand::CloseTyping(frame_); 331 TypingCommand::CloseTyping(frame_);
332 } 332 }
333 333
334 void FrameSelection::DidChangeFocus() { 334 void FrameSelection::DidChangeFocus() {
335 // Hits in 335 // Hits in
336 // virtual/gpu/compositedscrolling/scrollbars/scrollbar-miss-mousemove-disable d.html 336 // virtual/gpu/compositedscrolling/scrollbars/scrollbar-miss-mousemove-disable d.html
337 DisableCompositingQueryAsserts disabler; 337 DisableCompositingQueryAsserts disabler;
338 UpdateAppearance(); 338
339 // No focused element means document root has focus.
340 const Element* const focus = GetDocument().FocusedElement()
341 ? GetDocument().FocusedElement()
342 : GetDocument().documentElement();
343
344 // Protection against LayoutTests/editing/selection/selection-crash.html
345 if (!focus) {
346 frame_caret_->ScheduleVisualUpdateForPaintInvalidationIfNeeded();
347 text_control_focused_ = false;
348 return;
349 }
350
351 // Hide the selection when focus goes away from a text-field and into
352 // something that is not a text-field. When focus enters another text-field we
353 // do not need to update appearance; the appearance is updated when the new
354 // selection is set.
355 if (text_control_focused_ && !focus->IsTextControl())
356 UpdateAppearance(LayoutSelection::PaintHint::kHide);
357 text_control_focused_ = focus->IsTextControl();
339 } 358 }
340 359
341 static DispatchEventResult DispatchSelectStart( 360 static DispatchEventResult DispatchSelectStart(
342 const VisibleSelection& selection) { 361 const VisibleSelection& selection) {
343 Node* select_start_target = selection.Extent().ComputeContainerNode(); 362 Node* select_start_target = selection.Extent().ComputeContainerNode();
344 if (!select_start_target) 363 if (!select_start_target)
345 return DispatchEventResult::kNotCanceled; 364 return DispatchEventResult::kNotCanceled;
346 365
347 return select_start_target->DispatchEvent( 366 return select_start_target->DispatchEvent(
348 Event::CreateCancelableBubble(EventTypeNames::selectstart)); 367 Event::CreateCancelableBubble(EventTypeNames::selectstart));
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 785
767 bool FrameSelection::NeedsLayoutSelectionUpdate() const { 786 bool FrameSelection::NeedsLayoutSelectionUpdate() const {
768 return layout_selection_->HasPendingSelection(); 787 return layout_selection_->HasPendingSelection();
769 } 788 }
770 789
771 void FrameSelection::CommitAppearanceIfNeeded(LayoutView& layout_view) { 790 void FrameSelection::CommitAppearanceIfNeeded(LayoutView& layout_view) {
772 return layout_selection_->Commit(layout_view); 791 return layout_selection_->Commit(layout_view);
773 } 792 }
774 793
775 void FrameSelection::DidLayout() { 794 void FrameSelection::DidLayout() {
776 UpdateAppearance(); 795 // Upon relayout, a hidden selection must be kept hidden and a visible
796 // selection must be kept visible.
797 UpdateAppearance(LayoutSelection::PaintHint::kKeep);
777 } 798 }
778 799
779 void FrameSelection::UpdateAppearance() { 800 void FrameSelection::UpdateAppearance(LayoutSelection::PaintHint hint) {
780 DCHECK(!frame_->ContentLayoutItem().IsNull()); 801 DCHECK(!frame_->ContentLayoutItem().IsNull());
781 frame_caret_->ScheduleVisualUpdateForPaintInvalidationIfNeeded(); 802 frame_caret_->ScheduleVisualUpdateForPaintInvalidationIfNeeded();
782 layout_selection_->SetHasPendingSelection(); 803 layout_selection_->SetHasPendingSelection(hint);
783 } 804 }
784 805
785 void FrameSelection::NotifyLayoutObjectOfSelectionChange( 806 void FrameSelection::NotifyLayoutObjectOfSelectionChange(
786 EUserTriggered user_triggered) { 807 EUserTriggered user_triggered) {
787 TextControlElement* text_control = 808 TextControlElement* text_control =
788 EnclosingTextControl(GetSelectionInDOMTree().Base()); 809 EnclosingTextControl(GetSelectionInDOMTree().Base());
789 if (!text_control) 810 if (!text_control)
790 return; 811 return;
791 text_control->SelectionChanged(user_triggered == kUserTriggered); 812 text_control->SelectionChanged(user_triggered == kUserTriggered);
792 } 813 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 982
962 Position start = ComputeVisibleSelectionInDOMTreeDeprecated().Start(); 983 Position start = ComputeVisibleSelectionInDOMTreeDeprecated().Start();
963 DCHECK(start.AnchorNode()); 984 DCHECK(start.AnchorNode());
964 if (start.AnchorNode() && start.AnchorNode()->GetLayoutObject()) { 985 if (start.AnchorNode() && start.AnchorNode()->GetLayoutObject()) {
965 // FIXME: This code only handles scrolling the startContainer's layer, but 986 // FIXME: This code only handles scrolling the startContainer's layer, but
966 // the selection rect could intersect more than just that. 987 // the selection rect could intersect more than just that.
967 if (DocumentLoader* document_loader = frame_->Loader().GetDocumentLoader()) 988 if (DocumentLoader* document_loader = frame_->Loader().GetDocumentLoader())
968 document_loader->GetInitialScrollState().was_scrolled_by_user = true; 989 document_loader->GetInitialScrollState().was_scrolled_by_user = true;
969 if (start.AnchorNode()->GetLayoutObject()->ScrollRectToVisible( 990 if (start.AnchorNode()->GetLayoutObject()->ScrollRectToVisible(
970 rect, alignment, alignment)) 991 rect, alignment, alignment))
971 UpdateAppearance(); 992 UpdateAppearance(LayoutSelection::PaintHint::kPaint);
972 } 993 }
973 } 994 }
974 995
975 void FrameSelection::SetSelectionFromNone() { 996 void FrameSelection::SetSelectionFromNone() {
976 // Put a caret inside the body if the entire frame is editable (either the 997 // Put a caret inside the body if the entire frame is editable (either the
977 // entire WebView is editable or designMode is on for this document). 998 // entire WebView is editable or designMode is on for this document).
978 999
979 Document* document = frame_->GetDocument(); 1000 Document* document = frame_->GetDocument();
980 if (!ComputeVisibleSelectionInDOMTreeDeprecated().IsNone() || 1001 if (!ComputeVisibleSelectionInDOMTreeDeprecated().IsNone() ||
981 !(blink::HasEditableStyle(*document))) 1002 !(blink::HasEditableStyle(*document)))
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 } 1181 }
1161 1182
1162 void showTree(const blink::FrameSelection* sel) { 1183 void showTree(const blink::FrameSelection* sel) {
1163 if (sel) 1184 if (sel)
1164 sel->ShowTreeForThis(); 1185 sel->ShowTreeForThis();
1165 else 1186 else
1166 LOG(INFO) << "Cannot showTree for <null> FrameSelection."; 1187 LOG(INFO) << "Cannot showTree for <null> FrameSelection.";
1167 } 1188 }
1168 1189
1169 #endif 1190 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/FrameSelection.h ('k') | third_party/WebKit/Source/core/editing/LayoutSelection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698