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 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 winningTabIndex = currentTabIndex; | 434 winningTabIndex = currentTabIndex; |
435 } | 435 } |
436 } | 436 } |
437 return winner; | 437 return winner; |
438 } | 438 } |
439 | 439 |
440 Element* nextFocusableElement(ScopedFocusNavigation& scope) | 440 Element* nextFocusableElement(ScopedFocusNavigation& scope) |
441 { | 441 { |
442 Element* current = scope.currentElement(); | 442 Element* current = scope.currentElement(); |
443 if (current) { | 443 if (current) { |
| 444 LOG(ERROR) << "XXX nextFocusable: " << current->outerHTML(); |
444 int tabIndex = adjustedTabIndex(*current); | 445 int tabIndex = adjustedTabIndex(*current); |
445 // If an element is excluded from the normal tabbing cycle, the next foc
usable element is determined by tree order | 446 // If an element is excluded from the normal tabbing cycle, the next foc
usable element is determined by tree order |
| 447 LOG(ERROR) << "XXX nextFocusable: " << tabIndex; |
446 if (tabIndex < 0) { | 448 if (tabIndex < 0) { |
447 for (scope.moveToNext(); scope.currentElement(); scope.moveToNext())
{ | 449 for (scope.moveToNext(); scope.currentElement(); scope.moveToNext())
{ |
448 current = scope.currentElement(); | 450 current = scope.currentElement(); |
449 if (shouldVisit(*current) && adjustedTabIndex(*current) >= 0) | 451 if (shouldVisit(*current) && adjustedTabIndex(*current) >= 0) |
450 return current; | 452 return current; |
451 } | 453 } |
452 } else { | 454 } else { |
453 // First try to find an element with the same tabindex as start that
comes after start in the scope. | 455 // First try to find an element with the same tabindex as start that
comes after start in the scope. |
454 scope.moveToNext(); | 456 scope.moveToNext(); |
455 if (Element* winner = findElementWithExactTabIndex(scope, tabIndex,
WebFocusTypeForward)) | 457 if (Element* winner = findElementWithExactTabIndex(scope, tabIndex,
WebFocusTypeForward)) |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 { | 528 { |
527 Element* found = (type == WebFocusTypeForward) ? nextFocusableElement(scope)
: previousFocusableElement(scope); | 529 Element* found = (type == WebFocusTypeForward) ? nextFocusableElement(scope)
: previousFocusableElement(scope); |
528 return found; | 530 return found; |
529 } | 531 } |
530 | 532 |
531 Element* findFocusableElementRecursivelyForward(ScopedFocusNavigation& scope) | 533 Element* findFocusableElementRecursivelyForward(ScopedFocusNavigation& scope) |
532 { | 534 { |
533 // Starting element is exclusive. | 535 // Starting element is exclusive. |
534 Element* found = findFocusableElementInternal(WebFocusTypeForward, scope); | 536 Element* found = findFocusableElementInternal(WebFocusTypeForward, scope); |
535 while (found) { | 537 while (found) { |
| 538 LOG(ERROR) << "XXX findFocusable: " << found->outerHTML(); |
536 if (isShadowHostDelegatesFocus(*found)) { | 539 if (isShadowHostDelegatesFocus(*found)) { |
537 // If tabindex is positive, find focusable element inside its shadow
tree. | 540 // If tabindex is positive, find focusable element inside its shadow
tree. |
538 if (found->tabIndex() >= 0 && isShadowHostWithoutCustomFocusLogic(*f
ound)) { | 541 if (found->tabIndex() >= 0 && isShadowHostWithoutCustomFocusLogic(*f
ound)) { |
539 ScopedFocusNavigation innerScope = ScopedFocusNavigation::ownedB
yShadowHost(*found); | 542 ScopedFocusNavigation innerScope = ScopedFocusNavigation::ownedB
yShadowHost(*found); |
540 if (Element* foundInInnerFocusScope = findFocusableElementRecurs
ivelyForward(innerScope)) | 543 if (Element* foundInInnerFocusScope = findFocusableElementRecurs
ivelyForward(innerScope)) |
541 return foundInInnerFocusScope; | 544 return foundInInnerFocusScope; |
542 } | 545 } |
543 // Skip to the next element in the same scope. | 546 // Skip to the next element in the same scope. |
544 found = findFocusableElementInternal(WebFocusTypeForward, scope); | 547 found = findFocusableElementInternal(WebFocusTypeForward, scope); |
545 continue; | 548 continue; |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 // of handleFocusedUIElementChanged, because this will send the notification
even if the element is the same. | 859 // of handleFocusedUIElementChanged, because this will send the notification
even if the element is the same. |
857 if (focusedOrMainFrame()->isLocalFrame()) { | 860 if (focusedOrMainFrame()->isLocalFrame()) { |
858 Document* document = toLocalFrame(focusedOrMainFrame())->document(); | 861 Document* document = toLocalFrame(focusedOrMainFrame())->document(); |
859 if (AXObjectCache* cache = document->existingAXObjectCache()) | 862 if (AXObjectCache* cache = document->existingAXObjectCache()) |
860 cache->handleInitialFocus(); | 863 cache->handleInitialFocus(); |
861 } | 864 } |
862 | 865 |
863 return didAdvanceFocus; | 866 return didAdvanceFocus; |
864 } | 867 } |
865 | 868 |
| 869 Element* FocusController::getCurrentElementForFocusNavigation(WebFocusType type)
{ |
| 870 LocalFrame* frame = toLocalFrame(focusedOrMainFrame()); |
| 871 Document* document = frame->document(); |
| 872 document->updateStyleAndLayoutIgnorePendingStylesheets(); |
| 873 |
| 874 Element* current = document->sequentialFocusNavigationStartingPoint(type); |
| 875 |
| 876 // FIXME: Not quite correct when it comes to focus transitions leaving/enter
ing the WebView itself |
| 877 bool caretBrowsing = frame->settings() && frame->settings()->caretBrowsingEn
abled(); |
| 878 |
| 879 if (caretBrowsing && !current) |
| 880 current = adjustToElement(frame->selection().start().anchorNode(), type)
; |
| 881 return current; |
| 882 } |
| 883 |
| 884 Element* FocusController::findNextFocusableElementInDocumentOrder() { |
| 885 LocalFrame* frame = toLocalFrame(focusedOrMainFrame()); |
| 886 Document* document = frame->document(); |
| 887 document->updateStyleAndLayoutIgnorePendingStylesheets(); |
| 888 WebFocusType type = WebFocusTypeForward; |
| 889 Element* current = getCurrentElementForFocusNavigation(type); |
| 890 ScopedFocusNavigation scope = current ? ScopedFocusNavigation::createFor(*cu
rrent) : ScopedFocusNavigation::createForDocument(*document); |
| 891 return findFocusableElementAcrossFocusScopes(type, scope); |
| 892 } |
| 893 |
866 bool FocusController::advanceFocus(WebFocusType type, bool initialFocus, InputDe
viceCapabilities* sourceCapabilities) | 894 bool FocusController::advanceFocus(WebFocusType type, bool initialFocus, InputDe
viceCapabilities* sourceCapabilities) |
867 { | 895 { |
868 switch (type) { | 896 switch (type) { |
869 case WebFocusTypeForward: | 897 case WebFocusTypeForward: |
870 case WebFocusTypeBackward: { | 898 case WebFocusTypeBackward: { |
871 // We should never hit this when a RemoteFrame is focused, since the key | 899 // We should never hit this when a RemoteFrame is focused, since the key |
872 // event that initiated focus advancement should've been routed to that | 900 // event that initiated focus advancement should've been routed to that |
873 // frame's process from the beginning. | 901 // frame's process from the beginning. |
874 LocalFrame* startingFrame = toLocalFrame(focusedOrMainFrame()); | 902 LocalFrame* startingFrame = toLocalFrame(focusedOrMainFrame()); |
875 return advanceFocusInDocumentOrder(startingFrame, nullptr, type, initial
Focus, sourceCapabilities); | 903 return advanceFocusInDocumentOrder(startingFrame, nullptr, type, initial
Focus, sourceCapabilities); |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 return consumed; | 1342 return consumed; |
1315 } | 1343 } |
1316 | 1344 |
1317 DEFINE_TRACE(FocusController) | 1345 DEFINE_TRACE(FocusController) |
1318 { | 1346 { |
1319 visitor->trace(m_page); | 1347 visitor->trace(m_page); |
1320 visitor->trace(m_focusedFrame); | 1348 visitor->trace(m_focusedFrame); |
1321 } | 1349 } |
1322 | 1350 |
1323 } // namespace blink | 1351 } // namespace blink |
OLD | NEW |