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

Side by Side Diff: third_party/WebKit/Source/core/dom/Element.cpp

Issue 2616623002: Do not send redundant selectionchange-events (decouple focus) (Closed)
Patch Set: Fix spatnav tests (clear selection when focus goes to non editable element). Remove now invalid keeā€¦ Created 3 years, 10 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * (C) 2007 David Smith (catfish.man@gmail.com) 6 * (C) 2007 David Smith (catfish.man@gmail.com)
7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
8 * All rights reserved. 8 * All rights reserved.
9 * (C) 2007 Eric Seidel (eric@webkit.org) 9 * (C) 2007 Eric Seidel (eric@webkit.org)
10 * 10 *
(...skipping 2663 matching lines...) Expand 10 before | Expand all | Expand 10 after
2674 // animations) is difficult, for now we match IE's heuristic and bring 2674 // animations) is difficult, for now we match IE's heuristic and bring
2675 // up the keyboard if there's been any gesture since load. 2675 // up the keyboard if there's been any gesture since load.
2676 document().page()->chromeClient().showVirtualKeyboardOnElementFocus(); 2676 document().page()->chromeClient().showVirtualKeyboardOnElementFocus();
2677 } 2677 }
2678 } 2678 }
2679 2679
2680 void Element::updateFocusAppearance( 2680 void Element::updateFocusAppearance(
2681 SelectionBehaviorOnFocus selectionBehavior) { 2681 SelectionBehaviorOnFocus selectionBehavior) {
2682 if (selectionBehavior == SelectionBehaviorOnFocus::None) 2682 if (selectionBehavior == SelectionBehaviorOnFocus::None)
2683 return; 2683 return;
2684
2685 LocalFrame* frame = document().frame();
yosin_UTC9 2017/02/09 13:02:17 We can early return here if |!frame|. Let's hoist
2684 if (isRootEditableElement(*this)) { 2686 if (isRootEditableElement(*this)) {
2685 LocalFrame* frame = document().frame();
2686 if (!frame) 2687 if (!frame)
2687 return; 2688 return;
2688 2689
2689 // When focusing an editable element in an iframe, don't reset the selection 2690 // When focusing an editable element in an iframe, don't reset the selection
2690 // if it already contains a selection. 2691 // if it already contains a selection.
2691 if (this == frame->selection().rootEditableElement()) 2692 if (this == frame->selection().rootEditableElement())
2692 return; 2693 return;
2693 2694
2694 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets 2695 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
2695 // needs to be audited. See http://crbug.com/590369 for more details. 2696 // needs to be audited. See http://crbug.com/590369 for more details.
2696 document().updateStyleAndLayoutIgnorePendingStylesheets(); 2697 document().updateStyleAndLayoutIgnorePendingStylesheets();
2697 2698
2698 // FIXME: We should restore the previous selection if there is one. 2699 // FIXME: We should restore the previous selection if there is one.
2699 // Passing DoNotSetFocus as this function is called after 2700 // Passing DoNotSetFocus as this function is called after
2700 // FocusController::setFocusedElement() and we don't want to change the 2701 // FocusController::setFocusedElement() and we don't want to change the
2701 // focus to a new Element. 2702 // focus to a new Element.
2702 frame->selection().setSelection( 2703 frame->selection().setSelection(
2703 SelectionInDOMTree::Builder() 2704 SelectionInDOMTree::Builder()
2704 .collapse(firstPositionInOrBeforeNode(this)) 2705 .collapse(firstPositionInOrBeforeNode(this))
2705 .build(), 2706 .build(),
2706 FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle | 2707 FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle |
2707 FrameSelection::DoNotSetFocus); 2708 FrameSelection::DoNotSetFocus);
2708 frame->selection().revealSelection(); 2709 frame->selection().revealSelection();
2709 } else if (layoutObject() && !layoutObject()->isLayoutPart()) { 2710 } else {
2710 layoutObject()->scrollRectToVisible(boundingBox()); 2711 // This element is non editable.
2712 if (frame)
2713 frame->selection().clear();
yosin_UTC9 2017/02/09 13:02:17 Focus and selection are individual identity. We do
hugoh_UTC2 2017/02/11 03:42:22 True, here we would clear() too often. Let's put t
2714
2715 if (layoutObject() && !layoutObject()->isLayoutPart())
2716 layoutObject()->scrollRectToVisible(boundingBox());
2711 } 2717 }
2712 } 2718 }
2713 2719
2714 void Element::blur() { 2720 void Element::blur() {
2715 cancelFocusAppearanceUpdate(); 2721 cancelFocusAppearanceUpdate();
2716 if (adjustedFocusedElementInTreeScope() == this) { 2722 if (adjustedFocusedElementInTreeScope() == this) {
2717 Document& doc = document(); 2723 Document& doc = document();
2718 if (doc.page()) 2724 if (doc.page())
2719 doc.page()->focusController().setFocusedElement(0, doc.frame()); 2725 doc.page()->focusController().setFocusedElement(0, doc.frame());
2720 else 2726 else
(...skipping 1413 matching lines...) Expand 10 before | Expand all | Expand 10 after
4134 } 4140 }
4135 4141
4136 DEFINE_TRACE_WRAPPERS(Element) { 4142 DEFINE_TRACE_WRAPPERS(Element) {
4137 if (hasRareData()) { 4143 if (hasRareData()) {
4138 visitor->traceWrappers(elementRareData()); 4144 visitor->traceWrappers(elementRareData());
4139 } 4145 }
4140 ContainerNode::traceWrappers(visitor); 4146 ContainerNode::traceWrappers(visitor);
4141 } 4147 }
4142 4148
4143 } // namespace blink 4149 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698