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

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

Issue 2678683002: Delay instantiating InputDeviceCapabilities until accessed. (Closed)
Patch Set: rebased 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 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 toHTMLSlotElement(parent)->assignedNodes().isEmpty()) 331 toHTMLSlotElement(parent)->assignedNodes().isEmpty())
332 return !SlotScopedTraversal::isSlotScoped(current) && 332 return !SlotScopedTraversal::isSlotScoped(current) &&
333 toHTMLSlotElement(parent) == slot; 333 toHTMLSlotElement(parent) == slot;
334 parent = parent->parentElement(); 334 parent = parent->parentElement();
335 } 335 }
336 return false; 336 return false;
337 } 337 }
338 338
339 inline void dispatchBlurEvent(const Document& document, 339 inline void dispatchBlurEvent(const Document& document,
340 Element& focusedElement) { 340 Element& focusedElement) {
341 focusedElement.dispatchBlurEvent(nullptr, WebFocusTypePage); 341 focusedElement.dispatchBlurEvent(nullptr, WebFocusTypePage,
342 InputDeviceCapabilities::Null);
342 if (focusedElement == document.focusedElement()) { 343 if (focusedElement == document.focusedElement()) {
343 focusedElement.dispatchFocusOutEvent(EventTypeNames::focusout, nullptr); 344 focusedElement.dispatchFocusOutEvent(EventTypeNames::focusout, nullptr,
344 if (focusedElement == document.focusedElement()) 345 InputDeviceCapabilities::Null);
345 focusedElement.dispatchFocusOutEvent(EventTypeNames::DOMFocusOut, 346 if (focusedElement == document.focusedElement()) {
346 nullptr); 347 focusedElement.dispatchFocusOutEvent(EventTypeNames::DOMFocusOut, nullptr,
348 InputDeviceCapabilities::Null);
349 }
347 } 350 }
348 } 351 }
349 352
350 inline void dispatchFocusEvent(const Document& document, 353 inline void dispatchFocusEvent(const Document& document,
351 Element& focusedElement) { 354 Element& focusedElement) {
352 focusedElement.dispatchFocusEvent(0, WebFocusTypePage); 355 focusedElement.dispatchFocusEvent(0, WebFocusTypePage,
356 InputDeviceCapabilities::Null);
353 if (focusedElement == document.focusedElement()) { 357 if (focusedElement == document.focusedElement()) {
354 focusedElement.dispatchFocusInEvent(EventTypeNames::focusin, nullptr, 358 focusedElement.dispatchFocusInEvent(EventTypeNames::focusin, nullptr,
355 WebFocusTypePage); 359 WebFocusTypePage,
356 if (focusedElement == document.focusedElement()) 360 InputDeviceCapabilities::Null);
361 if (focusedElement == document.focusedElement()) {
357 focusedElement.dispatchFocusInEvent(EventTypeNames::DOMFocusIn, nullptr, 362 focusedElement.dispatchFocusInEvent(EventTypeNames::DOMFocusIn, nullptr,
358 WebFocusTypePage); 363 WebFocusTypePage,
364 InputDeviceCapabilities::Null);
365 }
359 } 366 }
360 } 367 }
361 368
362 inline void dispatchEventsOnWindowAndFocusedElement(Document* document, 369 inline void dispatchEventsOnWindowAndFocusedElement(Document* document,
363 bool focused) { 370 bool focused) {
364 DCHECK(document); 371 DCHECK(document);
365 // If we have a focused element we should dispatch blur on it before we blur 372 // If we have a focused element we should dispatch blur on it before we blur
366 // the window. If we have a focused element we should dispatch focus on it 373 // the window. If we have a focused element we should dispatch focus on it
367 // after we focus the window. https://bugs.webkit.org/show_bug.cgi?id=27105 374 // after we focus the window. https://bugs.webkit.org/show_bug.cgi?id=27105
368 375
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 toLocalFrame(m_focusedFrame.get())->view()) { 877 toLocalFrame(m_focusedFrame.get())->view()) {
871 toLocalFrame(m_focusedFrame.get())->selection().setFocused(focused); 878 toLocalFrame(m_focusedFrame.get())->selection().setFocused(focused);
872 dispatchEventsOnWindowAndFocusedElement( 879 dispatchEventsOnWindowAndFocusedElement(
873 toLocalFrame(m_focusedFrame.get())->document(), focused); 880 toLocalFrame(m_focusedFrame.get())->document(), focused);
874 } 881 }
875 882
876 notifyFocusChangedObservers(); 883 notifyFocusChangedObservers();
877 } 884 }
878 885
879 bool FocusController::setInitialFocus(WebFocusType type) { 886 bool FocusController::setInitialFocus(WebFocusType type) {
880 bool didAdvanceFocus = advanceFocus(type, true); 887 bool didAdvanceFocus =
888 advanceFocus(type, true, InputDeviceCapabilities::Null);
881 889
882 // If focus is being set initially, accessibility needs to be informed that 890 // If focus is being set initially, accessibility needs to be informed that
883 // system focus has moved into the web area again, even if focus did not 891 // system focus has moved into the web area again, even if focus did not
884 // change within WebCore. PostNotification is called instead of 892 // change within WebCore. PostNotification is called instead of
885 // handleFocusedUIElementChanged, because this will send the notification even 893 // handleFocusedUIElementChanged, because this will send the notification even
886 // if the element is the same. 894 // if the element is the same.
887 if (focusedOrMainFrame()->isLocalFrame()) { 895 if (focusedOrMainFrame()->isLocalFrame()) {
888 Document* document = toLocalFrame(focusedOrMainFrame())->document(); 896 Document* document = toLocalFrame(focusedOrMainFrame())->document();
889 if (AXObjectCache* cache = document->existingAXObjectCache()) 897 if (AXObjectCache* cache = document->existingAXObjectCache())
890 cache->handleInitialFocus(); 898 cache->handleInitialFocus();
891 } 899 }
892 900
893 return didAdvanceFocus; 901 return didAdvanceFocus;
894 } 902 }
895 903
896 bool FocusController::advanceFocus( 904 bool FocusController::advanceFocus(
897 WebFocusType type, 905 WebFocusType type,
898 bool initialFocus, 906 bool initialFocus,
899 InputDeviceCapabilities* sourceCapabilities) { 907 const InputDeviceCapabilitiesValue& sourceCapabilities) {
900 switch (type) { 908 switch (type) {
901 case WebFocusTypeForward: 909 case WebFocusTypeForward:
902 case WebFocusTypeBackward: { 910 case WebFocusTypeBackward: {
903 // We should never hit this when a RemoteFrame is focused, since the key 911 // We should never hit this when a RemoteFrame is focused, since the key
904 // event that initiated focus advancement should've been routed to that 912 // event that initiated focus advancement should've been routed to that
905 // frame's process from the beginning. 913 // frame's process from the beginning.
906 LocalFrame* startingFrame = toLocalFrame(focusedOrMainFrame()); 914 LocalFrame* startingFrame = toLocalFrame(focusedOrMainFrame());
907 return advanceFocusInDocumentOrder(startingFrame, nullptr, type, 915 return advanceFocusInDocumentOrder(startingFrame, nullptr, type,
908 initialFocus, sourceCapabilities); 916 initialFocus, sourceCapabilities);
909 } 917 }
910 case WebFocusTypeLeft: 918 case WebFocusTypeLeft:
911 case WebFocusTypeRight: 919 case WebFocusTypeRight:
912 case WebFocusTypeUp: 920 case WebFocusTypeUp:
913 case WebFocusTypeDown: 921 case WebFocusTypeDown:
914 return advanceFocusDirectionally(type); 922 return advanceFocusDirectionally(type);
915 default: 923 default:
916 NOTREACHED(); 924 NOTREACHED();
917 } 925 }
918 926
919 return false; 927 return false;
920 } 928 }
921 929
922 bool FocusController::advanceFocusAcrossFrames( 930 bool FocusController::advanceFocusAcrossFrames(
923 WebFocusType type, 931 WebFocusType type,
924 RemoteFrame* from, 932 RemoteFrame* from,
925 LocalFrame* to, 933 LocalFrame* to,
926 InputDeviceCapabilities* sourceCapabilities) { 934 const InputDeviceCapabilitiesValue& sourceCapabilities) {
927 // If we are shifting focus from a child frame to its parent, the 935 // If we are shifting focus from a child frame to its parent, the
928 // child frame has no more focusable elements, and we should continue 936 // child frame has no more focusable elements, and we should continue
929 // looking for focusable elements in the parent, starting from the <iframe> 937 // looking for focusable elements in the parent, starting from the <iframe>
930 // element of the child frame. 938 // element of the child frame.
931 Element* start = nullptr; 939 Element* start = nullptr;
932 if (from->tree().parent() == to) { 940 if (from->tree().parent() == to) {
933 DCHECK(from->owner()->isLocal()); 941 DCHECK(from->owner()->isLocal());
934 start = toHTMLFrameOwnerElement(from->owner()); 942 start = toHTMLFrameOwnerElement(from->owner());
935 } 943 }
936 944
937 return advanceFocusInDocumentOrder(to, start, type, false, 945 return advanceFocusInDocumentOrder(to, start, type, false,
938 sourceCapabilities); 946 sourceCapabilities);
939 } 947 }
940 948
941 #if DCHECK_IS_ON() 949 #if DCHECK_IS_ON()
942 inline bool isNonFocusableShadowHost(const Element& element) { 950 inline bool isNonFocusableShadowHost(const Element& element) {
943 return isShadowHostWithoutCustomFocusLogic(element) && !element.isFocusable(); 951 return isShadowHostWithoutCustomFocusLogic(element) && !element.isFocusable();
944 } 952 }
945 #endif 953 #endif
946 954
947 bool FocusController::advanceFocusInDocumentOrder( 955 bool FocusController::advanceFocusInDocumentOrder(
948 LocalFrame* frame, 956 LocalFrame* frame,
949 Element* start, 957 Element* start,
950 WebFocusType type, 958 WebFocusType type,
951 bool initialFocus, 959 bool initialFocus,
952 InputDeviceCapabilities* sourceCapabilities) { 960 const InputDeviceCapabilitiesValue& sourceCapabilities) {
953 DCHECK(frame); 961 DCHECK(frame);
954 Document* document = frame->document(); 962 Document* document = frame->document();
955 document->updateDistribution(); 963 document->updateDistribution();
956 964
957 Element* current = start; 965 Element* current = start;
958 #if DCHECK_IS_ON() 966 #if DCHECK_IS_ON()
959 DCHECK(!current || !isNonFocusableShadowHost(*current)); 967 DCHECK(!current || !isNonFocusableShadowHost(*current));
960 #endif 968 #endif
961 if (!current && !initialFocus) 969 if (!current && !initialFocus)
962 current = document->sequentialFocusNavigationStartingPoint(type); 970 current = document->sequentialFocusNavigationStartingPoint(type);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 selectionStartNode->ownerShadowHost() == newFocusedElement) 1099 selectionStartNode->ownerShadowHost() == newFocusedElement)
1092 return; 1100 return;
1093 1101
1094 selection.clear(); 1102 selection.clear();
1095 } 1103 }
1096 1104
1097 bool FocusController::setFocusedElement(Element* element, 1105 bool FocusController::setFocusedElement(Element* element,
1098 Frame* newFocusedFrame) { 1106 Frame* newFocusedFrame) {
1099 return setFocusedElement( 1107 return setFocusedElement(
1100 element, newFocusedFrame, 1108 element, newFocusedFrame,
1101 FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr)); 1109 FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone,
1110 InputDeviceCapabilities::Null));
1102 } 1111 }
1103 1112
1104 bool FocusController::setFocusedElement(Element* element, 1113 bool FocusController::setFocusedElement(Element* element,
1105 Frame* newFocusedFrame, 1114 Frame* newFocusedFrame,
1106 const FocusParams& params) { 1115 const FocusParams& params) {
1107 LocalFrame* oldFocusedFrame = focusedFrame(); 1116 LocalFrame* oldFocusedFrame = focusedFrame();
1108 Document* oldDocument = 1117 Document* oldDocument =
1109 oldFocusedFrame ? oldFocusedFrame->document() : nullptr; 1118 oldFocusedFrame ? oldFocusedFrame->document() : nullptr;
1110 1119
1111 Element* oldFocusedElement = 1120 Element* oldFocusedElement =
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
1343 if (focusCandidate.isOffscreenAfterScrolling) { 1352 if (focusCandidate.isOffscreenAfterScrolling) {
1344 Node* container = focusCandidate.enclosingScrollableBox; 1353 Node* container = focusCandidate.enclosingScrollableBox;
1345 scrollInDirection(container, type); 1354 scrollInDirection(container, type);
1346 return true; 1355 return true;
1347 } 1356 }
1348 1357
1349 // We found a new focus node, navigate to it. 1358 // We found a new focus node, navigate to it.
1350 Element* element = toElement(focusCandidate.focusableNode); 1359 Element* element = toElement(focusCandidate.focusableNode);
1351 DCHECK(element); 1360 DCHECK(element);
1352 1361
1353 element->focus(FocusParams(SelectionBehaviorOnFocus::Reset, type, nullptr)); 1362 element->focus(FocusParams(SelectionBehaviorOnFocus::Reset, type,
1363 InputDeviceCapabilities::Null));
1354 return true; 1364 return true;
1355 } 1365 }
1356 1366
1357 bool FocusController::advanceFocusDirectionally(WebFocusType type) { 1367 bool FocusController::advanceFocusDirectionally(WebFocusType type) {
1358 // FIXME: Directional focus changes don't yet work with RemoteFrames. 1368 // FIXME: Directional focus changes don't yet work with RemoteFrames.
1359 if (!focusedOrMainFrame()->isLocalFrame()) 1369 if (!focusedOrMainFrame()->isLocalFrame())
1360 return false; 1370 return false;
1361 LocalFrame* curFrame = toLocalFrame(focusedOrMainFrame()); 1371 LocalFrame* curFrame = toLocalFrame(focusedOrMainFrame());
1362 DCHECK(curFrame); 1372 DCHECK(curFrame);
1363 1373
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 it->focusedFrameChanged(); 1424 it->focusedFrameChanged();
1415 } 1425 }
1416 1426
1417 DEFINE_TRACE(FocusController) { 1427 DEFINE_TRACE(FocusController) {
1418 visitor->trace(m_page); 1428 visitor->trace(m_page);
1419 visitor->trace(m_focusedFrame); 1429 visitor->trace(m_focusedFrame);
1420 visitor->trace(m_focusChangedObservers); 1430 visitor->trace(m_focusChangedObservers);
1421 } 1431 }
1422 1432
1423 } // namespace blink 1433 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/page/FocusController.h ('k') | third_party/WebKit/Source/core/svg/SVGAElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698