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