[iOS] Replace "node assistance" terminology in WebKit with "focused element"
[WebKit-https.git] / Source / WebKit / UIProcess / PageLoadState.h
1 /*
2  * Copyright (C) 2013-2015 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef PageLoadState_h
27 #define PageLoadState_h
28
29 #include "WebCertificateInfo.h"
30 #include <wtf/text/WTFString.h>
31
32 namespace WebKit {
33
34 class WebCertificateInfo;
35 class WebPageProxy;
36
37 class PageLoadState {
38 public:
39     explicit PageLoadState(WebPageProxy&);
40     ~PageLoadState();
41
42     enum class State {
43         Provisional,
44         Committed,
45         Finished
46     };
47
48     class Observer {
49     public:
50         virtual ~Observer() { }
51
52         virtual void willChangeIsLoading() = 0;
53         virtual void didChangeIsLoading() = 0;
54
55         virtual void willChangeTitle() = 0;
56         virtual void didChangeTitle() = 0;
57
58         virtual void willChangeActiveURL() = 0;
59         virtual void didChangeActiveURL() = 0;
60
61         virtual void willChangeHasOnlySecureContent() = 0;
62         virtual void didChangeHasOnlySecureContent() = 0;
63
64         virtual void willChangeEstimatedProgress() = 0;
65         virtual void didChangeEstimatedProgress() = 0;
66
67         virtual void willChangeCanGoBack() = 0;
68         virtual void didChangeCanGoBack() = 0;
69
70         virtual void willChangeCanGoForward() = 0;
71         virtual void didChangeCanGoForward() = 0;
72
73         virtual void willChangeNetworkRequestsInProgress() = 0;
74         virtual void didChangeNetworkRequestsInProgress() = 0;
75
76         virtual void willChangeCertificateInfo() = 0;
77         virtual void didChangeCertificateInfo() = 0;
78
79         virtual void willChangeWebProcessIsResponsive() = 0;
80         virtual void didChangeWebProcessIsResponsive() = 0;
81         
82         virtual void didSwapWebProcesses() = 0;
83     };
84
85     class Transaction {
86         WTF_MAKE_NONCOPYABLE(Transaction);
87     public:
88         Transaction(Transaction&&);
89         ~Transaction();
90
91     private:
92         friend class PageLoadState;
93
94         explicit Transaction(PageLoadState&);
95
96         class Token {
97         public:
98             Token(Transaction& transaction)
99 #if !ASSERT_DISABLED
100                 : m_pageLoadState(*transaction.m_pageLoadState)
101 #endif
102             {
103                 transaction.m_pageLoadState->m_mayHaveUncommittedChanges = true;
104             }
105
106 #if !ASSERT_DISABLED
107             PageLoadState& m_pageLoadState;
108 #endif
109         };
110
111         RefPtr<WebPageProxy> m_webPageProxy;
112         PageLoadState* m_pageLoadState;
113     };
114
115     void addObserver(Observer&);
116     void removeObserver(Observer&);
117
118     Transaction transaction() { return Transaction(*this); }
119     void commitChanges();
120
121     void reset(const Transaction::Token&);
122
123     bool isLoading() const;
124
125     const String& provisionalURL() const { return m_committedState.provisionalURL; }
126     const String& url() const { return m_committedState.url; }
127     const String& unreachableURL() const { return m_committedState.unreachableURL; }
128
129     String activeURL() const;
130
131     bool hasOnlySecureContent() const;
132
133     double estimatedProgress() const;
134     bool networkRequestsInProgress() const { return m_committedState.networkRequestsInProgress; }
135
136     WebCertificateInfo* certificateInfo() const { return m_committedState.certificateInfo.get(); }
137
138     const String& pendingAPIRequestURL() const;
139     void setPendingAPIRequestURL(const Transaction::Token&, const String&);
140     void clearPendingAPIRequestURL(const Transaction::Token&);
141
142     void didStartProvisionalLoad(const Transaction::Token&, const String& url, const String& unreachableURL);
143     void didReceiveServerRedirectForProvisionalLoad(const Transaction::Token&, const String& url);
144     void didFailProvisionalLoad(const Transaction::Token&);
145
146     void didCommitLoad(const Transaction::Token&, WebCertificateInfo&, bool hasInsecureContent);
147     void didFinishLoad(const Transaction::Token&);
148     void didFailLoad(const Transaction::Token&);
149
150     void didSameDocumentNavigation(const Transaction::Token&, const String& url);
151
152     void didDisplayOrRunInsecureContent(const Transaction::Token&);
153
154     void setUnreachableURL(const Transaction::Token&, const String&);
155
156     const String& title() const;
157     void setTitle(const Transaction::Token&, const String&);
158
159     bool canGoBack() const;
160     void setCanGoBack(const Transaction::Token&, bool);
161
162     bool canGoForward() const;
163     void setCanGoForward(const Transaction::Token&, bool);
164
165     void didStartProgress(const Transaction::Token&);
166     void didChangeProgress(const Transaction::Token&, double);
167     void didFinishProgress(const Transaction::Token&);
168     void setNetworkRequestsInProgress(const Transaction::Token&, bool);
169
170     void didSwapWebProcesses();
171
172     bool committedHasInsecureContent() const { return m_committedState.hasInsecureContent; }
173
174     // FIXME: We piggy-back off PageLoadState::Observer so that both WKWebView and WKObservablePageState
175     // can listen for changes. Once we get rid of WKObservablePageState these could just be part of API::NavigationClient.
176     void willChangeProcessIsResponsive();
177     void didChangeProcessIsResponsive();
178
179 private:
180     void beginTransaction() { ++m_outstandingTransactionCount; }
181     void endTransaction();
182
183     void callObserverCallback(void (Observer::*)());
184
185     Vector<Observer*> m_observers;
186
187     struct Data {
188         Data()
189             : state(State::Finished)
190             , hasInsecureContent(false)
191             , canGoBack(false)
192             , canGoForward(false)
193             , estimatedProgress(0)
194             , networkRequestsInProgress(false)
195         {
196         }
197
198         State state;
199         bool hasInsecureContent;
200
201         String pendingAPIRequestURL;
202
203         String provisionalURL;
204         String url;
205
206         String unreachableURL;
207
208         String title;
209
210         bool canGoBack;
211         bool canGoForward;
212
213         double estimatedProgress;
214         bool networkRequestsInProgress;
215
216         RefPtr<WebCertificateInfo> certificateInfo;
217     };
218
219     static bool isLoading(const Data&);
220     static String activeURL(const Data&);
221     static bool hasOnlySecureContent(const Data&);
222     static double estimatedProgress(const Data&);
223
224     WebPageProxy& m_webPageProxy;
225
226     Data m_committedState;
227     Data m_uncommittedState;
228
229     String m_lastUnreachableURL;
230
231     bool m_mayHaveUncommittedChanges;
232     unsigned m_outstandingTransactionCount;
233 };
234
235 } // namespace WebKit
236
237 #endif // PageLoadState_h