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

Side by Side Diff: third_party/WebKit/Source/core/page/FocusController.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) 2006, 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nuanti Ltd. 3 * Copyright (C) 2008 Nuanti Ltd.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 1048 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 ScopedFocusNavigation scope = 1059 ScopedFocusNavigation scope =
1060 ScopedFocusNavigation::ownedByShadowHost(shadowHost); 1060 ScopedFocusNavigation::ownedByShadowHost(shadowHost);
1061 return findFocusableElementAcrossFocusScopes(WebFocusTypeForward, scope); 1061 return findFocusableElementAcrossFocusScopes(WebFocusTypeForward, scope);
1062 } 1062 }
1063 1063
1064 static bool relinquishesEditingFocus(const Element& element) { 1064 static bool relinquishesEditingFocus(const Element& element) {
1065 DCHECK(hasEditableStyle(element)); 1065 DCHECK(hasEditableStyle(element));
1066 return element.document().frame() && rootEditableElement(element); 1066 return element.document().frame() && rootEditableElement(element);
1067 } 1067 }
1068 1068
1069 static void clearSelectionIfNeeded(LocalFrame* oldFocusedFrame,
1070 LocalFrame* newFocusedFrame,
1071 Element* newFocusedElement) {
1072 if (!oldFocusedFrame || !newFocusedFrame)
1073 return;
1074
1075 if (oldFocusedFrame->document() != newFocusedFrame->document())
1076 return;
1077
1078 FrameSelection& selection = oldFocusedFrame->selection();
1079 if (selection.isNone())
1080 return;
1081
1082 Node* selectionStartNode = selection.selection().start().anchorNode();
1083 if (selectionStartNode == newFocusedElement ||
1084 selectionStartNode->isDescendantOf(newFocusedElement))
1085 return;
1086
1087 if (!enclosingTextControl(selectionStartNode))
1088 return;
1089
1090 if (selectionStartNode->isInShadowTree() &&
1091 selectionStartNode->ownerShadowHost() == newFocusedElement)
1092 return;
1093
1094 selection.clear();
1095 }
1096
1097 bool FocusController::setFocusedElement(Element* element, 1069 bool FocusController::setFocusedElement(Element* element,
1098 Frame* newFocusedFrame) { 1070 Frame* newFocusedFrame) {
1099 return setFocusedElement( 1071 return setFocusedElement(
1100 element, newFocusedFrame, 1072 element, newFocusedFrame,
1101 FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr)); 1073 FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr));
1102 } 1074 }
1103 1075
1104 bool FocusController::setFocusedElement(Element* element, 1076 bool FocusController::setFocusedElement(Element* element,
1105 Frame* newFocusedFrame, 1077 Frame* newFocusedFrame,
1106 const FocusParams& params) { 1078 const FocusParams& params) {
(...skipping 16 matching lines...) Expand all
1123 Document* newDocument = nullptr; 1095 Document* newDocument = nullptr;
1124 if (element) 1096 if (element)
1125 newDocument = &element->document(); 1097 newDocument = &element->document();
1126 else if (newFocusedFrame && newFocusedFrame->isLocalFrame()) 1098 else if (newFocusedFrame && newFocusedFrame->isLocalFrame())
1127 newDocument = toLocalFrame(newFocusedFrame)->document(); 1099 newDocument = toLocalFrame(newFocusedFrame)->document();
1128 1100
1129 if (newDocument && oldDocument == newDocument && 1101 if (newDocument && oldDocument == newDocument &&
1130 newDocument->focusedElement() == element) 1102 newDocument->focusedElement() == element)
1131 return true; 1103 return true;
1132 1104
1133 if (newFocusedFrame && newFocusedFrame->isLocalFrame())
1134 clearSelectionIfNeeded(oldFocusedFrame, toLocalFrame(newFocusedFrame),
1135 element);
1136
1137 if (oldDocument && oldDocument != newDocument) 1105 if (oldDocument && oldDocument != newDocument)
1138 oldDocument->clearFocusedElement(); 1106 oldDocument->clearFocusedElement();
1139 1107
1140 if (newFocusedFrame && !newFocusedFrame->page()) { 1108 if (newFocusedFrame && !newFocusedFrame->page()) {
1141 setFocusedFrame(nullptr); 1109 setFocusedFrame(nullptr);
1142 return false; 1110 return false;
1143 } 1111 }
1144 setFocusedFrame(newFocusedFrame); 1112 setFocusedFrame(newFocusedFrame);
1145 1113
1146 if (newDocument) { 1114 if (newDocument) {
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 it->focusedFrameChanged(); 1382 it->focusedFrameChanged();
1415 } 1383 }
1416 1384
1417 DEFINE_TRACE(FocusController) { 1385 DEFINE_TRACE(FocusController) {
1418 visitor->trace(m_page); 1386 visitor->trace(m_page);
1419 visitor->trace(m_focusedFrame); 1387 visitor->trace(m_focusedFrame);
1420 visitor->trace(m_focusChangedObservers); 1388 visitor->trace(m_focusChangedObservers);
1421 } 1389 }
1422 1390
1423 } // namespace blink 1391 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698