Update ANGLE
[WebKit-https.git] / Source / WebCore / page / FocusController.h
1 /*
2  * Copyright (C) 2006-2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #include "ActivityState.h"
29 #include "FocusDirection.h"
30 #include "LayoutRect.h"
31 #include "Timer.h"
32 #include <wtf/Forward.h>
33 #include <wtf/RefPtr.h>
34
35 namespace WebCore {
36
37 class ContainerNode;
38 class Document;
39 class Element;
40 class FocusNavigationScope;
41 class Frame;
42 class IntRect;
43 class KeyboardEvent;
44 class Node;
45 class Page;
46 class TreeScope;
47
48 struct FocusCandidate;
49
50 class FocusController {
51     WTF_MAKE_FAST_ALLOCATED;
52 public:
53     explicit FocusController(Page&, OptionSet<ActivityState::Flag>);
54
55     WEBCORE_EXPORT void setFocusedFrame(Frame*);
56     Frame* focusedFrame() const { return m_focusedFrame.get(); }
57     WEBCORE_EXPORT Frame& focusedOrMainFrame() const;
58
59     WEBCORE_EXPORT bool setInitialFocus(FocusDirection, KeyboardEvent*);
60     bool advanceFocus(FocusDirection, KeyboardEvent*, bool initialFocus = false);
61
62     WEBCORE_EXPORT bool setFocusedElement(Element*, Frame&, FocusDirection = FocusDirectionNone);
63
64     void setActivityState(OptionSet<ActivityState::Flag>);
65
66     WEBCORE_EXPORT void setActive(bool);
67     bool isActive() const { return m_activityState.contains(ActivityState::WindowIsActive); }
68
69     WEBCORE_EXPORT void setFocused(bool);
70     bool isFocused() const { return m_activityState.contains(ActivityState::IsFocused); }
71
72     bool contentIsVisible() const { return m_activityState.contains(ActivityState::IsVisible); }
73
74     // These methods are used in WebCore/bindings/objc/DOM.mm.
75     WEBCORE_EXPORT Element* nextFocusableElement(Node&);
76     WEBCORE_EXPORT Element* previousFocusableElement(Node&);
77
78     void setFocusedElementNeedsRepaint();
79     Seconds timeSinceFocusWasSet() const;
80
81 private:
82     void setActiveInternal(bool);
83     void setFocusedInternal(bool);
84     void setIsVisibleAndActiveInternal(bool);
85
86     bool advanceFocusDirectionally(FocusDirection, KeyboardEvent*);
87     bool advanceFocusInDocumentOrder(FocusDirection, KeyboardEvent*, bool initialFocus);
88
89     Element* findFocusableElementAcrossFocusScope(FocusDirection, const FocusNavigationScope& startScope, Node* start, KeyboardEvent*);
90
91     Element* findFocusableElementWithinScope(FocusDirection, const FocusNavigationScope&, Node* start, KeyboardEvent*);
92     Element* nextFocusableElementWithinScope(const FocusNavigationScope&, Node* start, KeyboardEvent*);
93     Element* previousFocusableElementWithinScope(const FocusNavigationScope&, Node* start, KeyboardEvent*);
94
95     Element* findFocusableElementDescendingIntoSubframes(FocusDirection, Element*, KeyboardEvent*);
96
97     // Searches through the given tree scope, starting from start node, for the next/previous selectable element that comes after/before start node.
98     // The order followed is as specified in section 17.11.1 of the HTML4 spec, which is elements with tab indexes
99     // first (from lowest to highest), and then elements without tab indexes (in document order).
100     //
101     // @param start The node from which to start searching. The node after this will be focused. May be null.
102     //
103     // @return The focus node that comes after/before start node.
104     //
105     // See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1
106     Element* findFocusableElementOrScopeOwner(FocusDirection, const FocusNavigationScope&, Node* start, KeyboardEvent*);
107
108     Element* findElementWithExactTabIndex(const FocusNavigationScope&, Node* start, int tabIndex, KeyboardEvent*, FocusDirection);
109     
110     Element* nextFocusableElementOrScopeOwner(const FocusNavigationScope&, Node* start, KeyboardEvent*);
111     Element* previousFocusableElementOrScopeOwner(const FocusNavigationScope&, Node* start, KeyboardEvent*);
112
113     bool advanceFocusDirectionallyInContainer(Node* container, const LayoutRect& startingRect, FocusDirection, KeyboardEvent*);
114     void findFocusCandidateInContainer(Node& container, const LayoutRect& startingRect, FocusDirection, KeyboardEvent*, FocusCandidate& closest);
115
116     void focusRepaintTimerFired();
117
118     Page& m_page;
119     RefPtr<Frame> m_focusedFrame;
120     bool m_isChangingFocusedFrame;
121     OptionSet<ActivityState::Flag> m_activityState;
122
123     Timer m_focusRepaintTimer;
124     MonotonicTime m_focusSetTime;
125 };
126
127 } // namespace WebCore