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 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 } | 736 } |
737 | 737 |
738 bool FocusController::advanceFocusInDocumentOrder(LocalFrame* frame, Element* st
art, WebFocusType type, bool initialFocus, InputDeviceCapabilities* sourceCapabi
lities) | 738 bool FocusController::advanceFocusInDocumentOrder(LocalFrame* frame, Element* st
art, WebFocusType type, bool initialFocus, InputDeviceCapabilities* sourceCapabi
lities) |
739 { | 739 { |
740 ASSERT(frame); | 740 ASSERT(frame); |
741 Document* document = frame->document(); | 741 Document* document = frame->document(); |
742 ASSERT(document->documentElement()); | 742 ASSERT(document->documentElement()); |
743 | 743 |
744 Element* current = start; | 744 Element* current = start; |
745 if (!current) | 745 if (!current) |
746 current = document->focusedElement(); | 746 current = document->sequentialFocusNavigationStartingPoint(type); |
747 | 747 |
748 // FIXME: Not quite correct when it comes to focus transitions leaving/enter
ing the WebView itself | 748 // FIXME: Not quite correct when it comes to focus transitions leaving/enter
ing the WebView itself |
749 bool caretBrowsing = frame->settings() && frame->settings()->caretBrowsingEn
abled(); | 749 bool caretBrowsing = frame->settings() && frame->settings()->caretBrowsingEn
abled(); |
750 | 750 |
751 if (caretBrowsing && !current) | 751 if (caretBrowsing && !current) |
752 current = adjustToElement(frame->selection().start().anchorNode(), type)
; | 752 current = adjustToElement(frame->selection().start().anchorNode(), type)
; |
753 | 753 |
754 document->updateLayoutIgnorePendingStylesheets(); | 754 document->updateLayoutIgnorePendingStylesheets(); |
755 | 755 |
756 RefPtrWillBeRawPtr<Element> element = findFocusableElementAcrossFocusScopes(
type, FocusNavigationScope::focusNavigationScopeOf(current ? *current : *documen
t->documentElement()), current); | 756 RefPtrWillBeRawPtr<Element> element = findFocusableElementAcrossFocusScopes(
type, FocusNavigationScope::focusNavigationScopeOf(current ? *current : *documen
t->documentElement()), current); |
757 | 757 |
758 if (!element) { | 758 if (!element) { |
759 // If there's a RemoteFrame on the ancestor chain, we need to continue | 759 // If there's a RemoteFrame on the ancestor chain, we need to continue |
760 // searching for focusable elements there. | 760 // searching for focusable elements there. |
761 if (frame->localFrameRoot() != frame->tree().top()) { | 761 if (frame->localFrameRoot() != frame->tree().top()) { |
762 document->clearFocusedElement(); | 762 document->clearFocusedElement(); |
| 763 document->setSequentialFocusNavigationStartingPoint(nullptr); |
763 toRemoteFrame(frame->localFrameRoot()->tree().parent())->advanceFocu
s(type, frame->localFrameRoot()); | 764 toRemoteFrame(frame->localFrameRoot()->tree().parent())->advanceFocu
s(type, frame->localFrameRoot()); |
764 return true; | 765 return true; |
765 } | 766 } |
766 | 767 |
767 // We didn't find an element to focus, so we should try to pass focus to
Chrome. | 768 // We didn't find an element to focus, so we should try to pass focus to
Chrome. |
768 if (!initialFocus && m_page->chromeClient().canTakeFocus(type)) { | 769 if (!initialFocus && m_page->chromeClient().canTakeFocus(type)) { |
769 document->clearFocusedElement(); | 770 document->clearFocusedElement(); |
| 771 document->setSequentialFocusNavigationStartingPoint(nullptr); |
770 setFocusedFrame(nullptr); | 772 setFocusedFrame(nullptr); |
771 m_page->chromeClient().takeFocus(type); | 773 m_page->chromeClient().takeFocus(type); |
772 return true; | 774 return true; |
773 } | 775 } |
774 | 776 |
775 // Chrome doesn't want focus, so we should wrap focus. | 777 // Chrome doesn't want focus, so we should wrap focus. |
776 element = findFocusableElementRecursively(type, FocusNavigationScope::fo
cusNavigationScopeOf(*toLocalFrame(m_page->mainFrame())->document()->documentEle
ment()), nullptr); | 778 element = findFocusableElementRecursively(type, FocusNavigationScope::fo
cusNavigationScopeOf(*toLocalFrame(m_page->mainFrame())->document()->documentEle
ment()), nullptr); |
777 element = findFocusableElementDescendingDownIntoFrameDocument(type, elem
ent.get()); | 779 element = findFocusableElementDescendingDownIntoFrameDocument(type, elem
ent.get()); |
778 | 780 |
779 if (!element) | 781 if (!element) |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 return consumed; | 1137 return consumed; |
1136 } | 1138 } |
1137 | 1139 |
1138 DEFINE_TRACE(FocusController) | 1140 DEFINE_TRACE(FocusController) |
1139 { | 1141 { |
1140 visitor->trace(m_page); | 1142 visitor->trace(m_page); |
1141 visitor->trace(m_focusedFrame); | 1143 visitor->trace(m_focusedFrame); |
1142 } | 1144 } |
1143 | 1145 |
1144 } // namespace blink | 1146 } // namespace blink |
OLD | NEW |