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

Side by Side Diff: third_party/WebKit/Source/core/page/FocusController.cpp

Issue 2784653002: Revert of Do not send redundant selectionchange-events (Closed)
Patch Set: 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) 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 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 Document& newDocument = element->document(); 1033 Document& newDocument = element->document();
1034 1034
1035 if (&newDocument != document) { 1035 if (&newDocument != document) {
1036 // Focus is going away from this document, so clear the focused element. 1036 // Focus is going away from this document, so clear the focused element.
1037 document->clearFocusedElement(); 1037 document->clearFocusedElement();
1038 document->setSequentialFocusNavigationStartingPoint(nullptr); 1038 document->setSequentialFocusNavigationStartingPoint(nullptr);
1039 } 1039 }
1040 1040
1041 setFocusedFrame(newDocument.frame()); 1041 setFocusedFrame(newDocument.frame());
1042 1042
1043 if (!element->isTextControl() && !hasEditableStyle(*element->toNode())) {
1044 // TODO(editing-dev): Remove this clear(), crbug.com/692898.
1045 focusedFrame()->selection().clear();
1046 }
1047 element->focus( 1043 element->focus(
1048 FocusParams(SelectionBehaviorOnFocus::Reset, type, sourceCapabilities)); 1044 FocusParams(SelectionBehaviorOnFocus::Reset, type, sourceCapabilities));
1049 return true; 1045 return true;
1050 } 1046 }
1051 1047
1052 Element* FocusController::findFocusableElement(WebFocusType type, 1048 Element* FocusController::findFocusableElement(WebFocusType type,
1053 Element& element) { 1049 Element& element) {
1054 // FIXME: No spacial navigation code yet. 1050 // FIXME: No spacial navigation code yet.
1055 DCHECK(type == WebFocusTypeForward || type == WebFocusTypeBackward); 1051 DCHECK(type == WebFocusTypeForward || type == WebFocusTypeBackward);
1056 ScopedFocusNavigation scope = ScopedFocusNavigation::createFor(element); 1052 ScopedFocusNavigation scope = ScopedFocusNavigation::createFor(element);
1057 return findFocusableElementAcrossFocusScopes(type, scope); 1053 return findFocusableElementAcrossFocusScopes(type, scope);
1058 } 1054 }
1059 1055
1060 Element* FocusController::findFocusableElementInShadowHost( 1056 Element* FocusController::findFocusableElementInShadowHost(
1061 const Element& shadowHost) { 1057 const Element& shadowHost) {
1062 DCHECK(shadowHost.authorShadowRoot()); 1058 DCHECK(shadowHost.authorShadowRoot());
1063 ScopedFocusNavigation scope = 1059 ScopedFocusNavigation scope =
1064 ScopedFocusNavigation::ownedByShadowHost(shadowHost); 1060 ScopedFocusNavigation::ownedByShadowHost(shadowHost);
1065 return findFocusableElementAcrossFocusScopes(WebFocusTypeForward, scope); 1061 return findFocusableElementAcrossFocusScopes(WebFocusTypeForward, scope);
1066 } 1062 }
1067 1063
1068 static bool relinquishesEditingFocus(const Element& element) { 1064 static bool relinquishesEditingFocus(const Element& element) {
1069 DCHECK(hasEditableStyle(element)); 1065 DCHECK(hasEditableStyle(element));
1070 return element.document().frame() && rootEditableElement(element); 1066 return element.document().frame() && rootEditableElement(element);
1071 } 1067 }
1072 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 const SelectionInDOMTree& selectionInDOMTree = selection.selectionInDOMTree();
1080 if (selectionInDOMTree.isNone())
1081 return;
1082
1083 Node* selectionStartNode = selectionInDOMTree.base().anchorNode();
1084 if (selectionStartNode == newFocusedElement ||
1085 selectionStartNode->isDescendantOf(newFocusedElement))
1086 return;
1087
1088 if (!enclosingTextControl(selectionStartNode))
1089 return;
1090
1091 if (selectionStartNode->isInShadowTree() &&
1092 selectionStartNode->ownerShadowHost() == newFocusedElement)
1093 return;
1094
1095 selection.clear();
1096 }
1097
1073 bool FocusController::setFocusedElement(Element* element, 1098 bool FocusController::setFocusedElement(Element* element,
1074 Frame* newFocusedFrame) { 1099 Frame* newFocusedFrame) {
1075 return setFocusedElement( 1100 return setFocusedElement(
1076 element, newFocusedFrame, 1101 element, newFocusedFrame,
1077 FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr)); 1102 FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr));
1078 } 1103 }
1079 1104
1080 bool FocusController::setFocusedElement(Element* element, 1105 bool FocusController::setFocusedElement(Element* element,
1081 Frame* newFocusedFrame, 1106 Frame* newFocusedFrame,
1082 const FocusParams& params) { 1107 const FocusParams& params) {
(...skipping 16 matching lines...) Expand all
1099 Document* newDocument = nullptr; 1124 Document* newDocument = nullptr;
1100 if (element) 1125 if (element)
1101 newDocument = &element->document(); 1126 newDocument = &element->document();
1102 else if (newFocusedFrame && newFocusedFrame->isLocalFrame()) 1127 else if (newFocusedFrame && newFocusedFrame->isLocalFrame())
1103 newDocument = toLocalFrame(newFocusedFrame)->document(); 1128 newDocument = toLocalFrame(newFocusedFrame)->document();
1104 1129
1105 if (newDocument && oldDocument == newDocument && 1130 if (newDocument && oldDocument == newDocument &&
1106 newDocument->focusedElement() == element) 1131 newDocument->focusedElement() == element)
1107 return true; 1132 return true;
1108 1133
1134 if (newFocusedFrame && newFocusedFrame->isLocalFrame())
1135 clearSelectionIfNeeded(oldFocusedFrame, toLocalFrame(newFocusedFrame),
1136 element);
1137
1109 if (oldDocument && oldDocument != newDocument) 1138 if (oldDocument && oldDocument != newDocument)
1110 oldDocument->clearFocusedElement(); 1139 oldDocument->clearFocusedElement();
1111 1140
1112 if (newFocusedFrame && !newFocusedFrame->page()) { 1141 if (newFocusedFrame && !newFocusedFrame->page()) {
1113 setFocusedFrame(nullptr); 1142 setFocusedFrame(nullptr);
1114 return false; 1143 return false;
1115 } 1144 }
1116 setFocusedFrame(newFocusedFrame); 1145 setFocusedFrame(newFocusedFrame);
1117 1146
1118 if (newDocument) { 1147 if (newDocument) {
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 if (focusCandidate.isOffscreenAfterScrolling) { 1348 if (focusCandidate.isOffscreenAfterScrolling) {
1320 Node* container = focusCandidate.enclosingScrollableBox; 1349 Node* container = focusCandidate.enclosingScrollableBox;
1321 scrollInDirection(container, type); 1350 scrollInDirection(container, type);
1322 return true; 1351 return true;
1323 } 1352 }
1324 1353
1325 // We found a new focus node, navigate to it. 1354 // We found a new focus node, navigate to it.
1326 Element* element = toElement(focusCandidate.focusableNode); 1355 Element* element = toElement(focusCandidate.focusableNode);
1327 DCHECK(element); 1356 DCHECK(element);
1328 1357
1329 if (!element->isTextControl() && !hasEditableStyle(*element->toNode())) {
1330 // TODO(editing-dev): Remove this clear(), crbug.com/692898.
1331 focusedFrame()->selection().clear();
1332 }
1333 element->focus(FocusParams(SelectionBehaviorOnFocus::Reset, type, nullptr)); 1358 element->focus(FocusParams(SelectionBehaviorOnFocus::Reset, type, nullptr));
1334 return true; 1359 return true;
1335 } 1360 }
1336 1361
1337 bool FocusController::advanceFocusDirectionally(WebFocusType type) { 1362 bool FocusController::advanceFocusDirectionally(WebFocusType type) {
1338 // FIXME: Directional focus changes don't yet work with RemoteFrames. 1363 // FIXME: Directional focus changes don't yet work with RemoteFrames.
1339 if (!focusedOrMainFrame()->isLocalFrame()) 1364 if (!focusedOrMainFrame()->isLocalFrame())
1340 return false; 1365 return false;
1341 LocalFrame* curFrame = toLocalFrame(focusedOrMainFrame()); 1366 LocalFrame* curFrame = toLocalFrame(focusedOrMainFrame());
1342 DCHECK(curFrame); 1367 DCHECK(curFrame);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 it->focusedFrameChanged(); 1419 it->focusedFrameChanged();
1395 } 1420 }
1396 1421
1397 DEFINE_TRACE(FocusController) { 1422 DEFINE_TRACE(FocusController) {
1398 visitor->trace(m_page); 1423 visitor->trace(m_page);
1399 visitor->trace(m_focusedFrame); 1424 visitor->trace(m_focusedFrame);
1400 visitor->trace(m_focusChangedObservers); 1425 visitor->trace(m_focusChangedObservers);
1401 } 1426 }
1402 1427
1403 } // namespace blink 1428 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/PendingSelection.cpp ('k') | third_party/WebKit/Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698