15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef FocusController_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define FocusController_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/page/FocusType.h" 301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/LayoutRect.h" 31f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h" 320019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/Forward.h" 330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/Noncopyable.h" 340019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/RefPtr.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct FocusCandidate; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element; 4007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass Frame; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLFrameOwnerElement; 42c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)class HTMLShadowElement; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Node; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Page; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TreeScope; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FocusNavigationScope { 48f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu STACK_ALLOCATED(); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* rootNode() const; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* owner() const; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static FocusNavigationScope focusNavigationScopeOf(Node*); 53c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) static FocusNavigationScope ownedByNonFocusableFocusScopeOwner(Node*); 54c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) static FocusNavigationScope ownedByShadowHost(Node*); 55c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) static FocusNavigationScope ownedByShadowInsertionPoint(HTMLShadowElement*); 56c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) static FocusNavigationScope ownedByIFrame(HTMLFrameOwnerElement*); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit FocusNavigationScope(TreeScope*); 60f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu RawPtrWillBeMember<TreeScope> m_rootTreeScope; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass FocusController FINAL : public NoBaseWillBeGarbageCollectedFinalized<FocusController> { 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WTF_MAKE_NONCOPYABLE(FocusController); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci static PassOwnPtrWillBeRawPtr<FocusController> create(Page*); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void setFocusedFrame(PassRefPtrWillBeRawPtr<Frame>); 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void focusDocumentView(PassRefPtrWillBeRawPtr<Frame>); 7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* focusedFrame() const { return m_focusedFrame.get(); } 7107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Frame* focusedOrMainFrame() const; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool setInitialFocus(FocusType); 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool advanceFocus(FocusType type) { return advanceFocus(type, false); } 7502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool setFocusedElement(Element*, PassRefPtrWillBeRawPtr<Frame>, FocusType = FocusTypeNone); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setActive(bool); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isActive() const { return m_isActive; } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setFocused(bool); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isFocused() const { return m_isFocused; } 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void trace(Visitor*); 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit FocusController(Page*); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool advanceFocus(FocusType, bool initialFocus); 9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool advanceFocusDirectionally(FocusType); 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool advanceFocusInDocumentOrder(FocusType, bool initialFocus); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* findFocusableNodeAcrossFocusScope(FocusType, FocusNavigationScope startScope, Node* start); 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* findFocusableNodeRecursively(FocusType, FocusNavigationScope, Node* start); 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* findFocusableNodeDecendingDownIntoFrameDocument(FocusType, Node*); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Searches through the given tree scope, starting from start node, for the next/previous selectable element that comes after/before start node. 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The order followed is as specified in section 17.11.1 of the HTML4 spec, which is elements with tab indexes 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // first (from lowest to highest), and then elements without tab indexes (in document order). 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @param start The node from which to start searching. The node after this will be focused. May be null. 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // @return The focus node that comes after/before start node. 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1 10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) inline Node* findFocusableNode(FocusType, FocusNavigationScope, Node* start); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) Node* nextFocusableNode(FocusNavigationScope, Node* start); 109f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) Node* previousFocusableNode(FocusNavigationScope, Node* start); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Node* findNodeWithExactTabIndex(Node* start, int tabIndex, FocusType); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool advanceFocusDirectionallyInContainer(Node* container, const LayoutRect& startingRect, FocusType); 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void findFocusCandidateInContainer(Node& container, const LayoutRect& startingRect, FocusType, FocusCandidate& closest); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RawPtrWillBeMember<Page> m_page; 1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeMember<Frame> m_focusedFrame; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_isActive; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_isFocused; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_isChangingFocusedFrame; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 12402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // FocusController_h 126