Laying some groundwork to fetch performance statistics from WebProcess.
[WebKit-https.git] / Source / WebKit2 / UIProcess / WebContext.h
1 /*
2  * Copyright (C) 2010, 2011 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 WebContext_h
27 #define WebContext_h
28
29 #include "APIObject.h"
30 #include "GenericCallback.h"
31 #include "PluginInfoStore.h"
32 #include "ProcessModel.h"
33 #include "VisitedLinkProvider.h"
34 #include "WebContextInjectedBundleClient.h"
35 #include "WebDownloadClient.h"
36 #include "WebHistoryClient.h"
37 #include "WebProcessProxy.h"
38 #include <WebCore/LinkHash.h>
39 #include <wtf/Forward.h>
40 #include <wtf/HashSet.h>
41 #include <wtf/PassRefPtr.h>
42 #include <wtf/RefPtr.h>
43 #include <wtf/text/StringHash.h>
44 #include <wtf/text/WTFString.h>
45
46 namespace WebKit {
47
48 class DownloadProxy;
49 class WebApplicationCacheManagerProxy;
50 class WebCookieManagerProxy;
51 class WebDatabaseManagerProxy;
52 class WebGeolocationManagerProxy;
53 class WebIconDatabase;
54 class WebKeyValueStorageManagerProxy;
55 class WebMediaCacheManagerProxy;
56 class WebPageGroup;
57 class WebPageProxy;
58 class WebResourceCacheManagerProxy;
59 struct StatisticsData;
60 struct WebProcessCreationParameters;
61     
62 typedef GenericCallback<WKDictionaryRef> DictionaryCallback;
63
64 class WebContext : public APIObject {
65 public:
66     static const Type APIType = TypeContext;
67
68     static WebContext* sharedProcessContext();
69     static WebContext* sharedThreadContext();
70
71     static PassRefPtr<WebContext> create(const String& injectedBundlePath);
72     virtual ~WebContext();
73
74     static const Vector<WebContext*>& allContexts();
75
76     void initializeInjectedBundleClient(const WKContextInjectedBundleClient*);
77     void initializeHistoryClient(const WKContextHistoryClient*);
78     void initializeDownloadClient(const WKContextDownloadClient*);
79
80     ProcessModel processModel() const { return m_processModel; }
81     WebProcessProxy* process() const { return m_process.get(); }
82
83     template<typename U> bool sendToAllProcesses(const U& message);
84     template<typename U> bool sendToAllProcessesRelaunchingThemIfNecessary(const U& message);
85     
86     void processDidFinishLaunching(WebProcessProxy*);
87
88     // Disconnect the process from the context.
89     void disconnectProcess(WebProcessProxy*);
90
91     PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*);
92
93     WebProcessProxy* relaunchProcessIfNecessary();
94
95     const String& injectedBundlePath() const { return m_injectedBundlePath; }
96
97     DownloadProxy* download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
98
99     void setInjectedBundleInitializationUserData(PassRefPtr<APIObject> userData) { m_injectedBundleInitializationUserData = userData; }
100     APIObject* injectedBundleInitializationUserData() const { return m_injectedBundleInitializationUserData.get(); }
101
102     void postMessageToInjectedBundle(const String&, APIObject*);
103
104     // InjectedBundle client
105     void didReceiveMessageFromInjectedBundle(const String&, APIObject*);
106     void didReceiveSynchronousMessageFromInjectedBundle(const String&, APIObject*, RefPtr<APIObject>& returnData);
107
108     void populateVisitedLinks();
109     
110     void setAdditionalPluginsDirectory(const String&);
111
112     PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
113     String applicationCacheDirectory();
114
115     void setAlwaysUsesComplexTextCodePath(bool);
116     
117     void registerURLSchemeAsEmptyDocument(const String&);
118     void registerURLSchemeAsSecure(const String&);
119     void setDomainRelaxationForbiddenForURLScheme(const String&);
120
121     void addVisitedLink(const String&);
122     void addVisitedLinkHash(WebCore::LinkHash);
123
124     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
125     void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
126
127     void setCacheModel(CacheModel);
128     CacheModel cacheModel() const { return m_cacheModel; }
129
130     void setDefaultRequestTimeoutInterval(double);
131
132     void startMemorySampler(const double interval);
133     void stopMemorySampler();
134
135 #if PLATFORM(WIN)
136     void setShouldPaintNativeControls(bool);
137
138     void setInitialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicy policy) { m_initialHTTPCookieAcceptPolicy = policy; }
139 #endif
140
141     void setEnhancedAccessibility(bool);
142     
143     // Downloads.
144     DownloadProxy* createDownloadProxy();
145     WebDownloadClient& downloadClient() { return m_downloadClient; }
146     void downloadFinished(DownloadProxy*);
147
148     static HashSet<String, CaseFoldingHash> pdfAndPostScriptMIMETypes();
149
150     WebApplicationCacheManagerProxy* applicationCacheManagerProxy() const { return m_applicationCacheManagerProxy.get(); }
151     WebCookieManagerProxy* cookieManagerProxy() const { return m_cookieManagerProxy.get(); }
152     WebDatabaseManagerProxy* databaseManagerProxy() const { return m_databaseManagerProxy.get(); }
153     WebGeolocationManagerProxy* geolocationManagerProxy() const { return m_geolocationManagerProxy.get(); }
154     WebIconDatabase* iconDatabase() const { return m_iconDatabase.get(); }
155     WebKeyValueStorageManagerProxy* keyValueStorageManagerProxy() const { return m_keyValueStorageManagerProxy.get(); }
156     WebMediaCacheManagerProxy* mediaCacheManagerProxy() const { return m_mediaCacheManagerProxy.get(); }
157     WebPluginSiteDataManager* pluginSiteDataManager() const { return m_pluginSiteDataManager.get(); }
158     WebResourceCacheManagerProxy* resourceCacheManagerProxy() const { return m_resourceCacheManagerProxy.get(); }
159
160     struct Statistics {
161         unsigned wkViewCount;
162         unsigned wkPageCount;
163         unsigned wkFrameCount;
164     };
165     static Statistics& statistics();    
166
167     void setDatabaseDirectory(const String& dir) { m_overrideDatabaseDirectory = dir; }
168     void setIconDatabasePath(const String&);
169     void setLocalStorageDirectory(const String& dir) { m_overrideLocalStorageDirectory = dir; }
170
171     void ensureWebProcess();
172     void warmInitialProcess();
173
174     bool shouldTerminate(WebProcessProxy*);
175
176     void disableProcessTermination() { m_processTerminationEnabled = false; }
177     void enableProcessTermination();
178
179     // Defaults to false.
180     void setHTTPPipeliningEnabled(bool);
181     bool httpPipeliningEnabled();
182     
183     void getWebCoreStatistics(PassRefPtr<DictionaryCallback>);
184
185 private:
186     WebContext(ProcessModel, const String& injectedBundlePath);
187
188     virtual Type type() const { return APIType; }
189
190     void platformInitializeWebProcess(WebProcessCreationParameters&);
191     void platformInvalidateContext();
192     
193     // History client
194     void didNavigateWithNavigationData(uint64_t pageID, const WebNavigationDataStore& store, uint64_t frameID);
195     void didPerformClientRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
196     void didPerformServerRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
197     void didUpdateHistoryTitle(uint64_t pageID, const String& title, const String& url, uint64_t frameID);
198
199     // Plugins
200     void getPlugins(bool refresh, Vector<WebCore::PluginInfo>&);
201     void getPluginPath(const String& mimeType, const String& urlString, String& pluginPath);
202 #if !ENABLE(PLUGIN_PROCESS)
203     void didGetSitesWithPluginData(const Vector<String>& sites, uint64_t callbackID);
204     void didClearPluginSiteData(uint64_t callbackID);
205 #endif
206     
207     void didGetWebCoreStatistics(const StatisticsData&, uint64_t callbackID);
208         
209     // Implemented in generated WebContextMessageReceiver.cpp
210     void didReceiveWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
211     void didReceiveSyncWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
212
213     static void languageChanged(void* context);
214     void languageChanged();
215
216     String databaseDirectory() const;
217     String platformDefaultDatabaseDirectory() const;
218
219     String iconDatabasePath() const;
220     String platformDefaultIconDatabasePath() const;
221
222     String localStorageDirectory() const;
223     String platformDefaultLocalStorageDirectory() const;
224
225     ProcessModel m_processModel;
226     
227     // FIXME: In the future, this should be one or more WebProcessProxies.
228     RefPtr<WebProcessProxy> m_process;
229
230     RefPtr<WebPageGroup> m_defaultPageGroup;
231
232     RefPtr<APIObject> m_injectedBundleInitializationUserData;
233     String m_injectedBundlePath;
234     WebContextInjectedBundleClient m_injectedBundleClient;
235
236     WebHistoryClient m_historyClient;
237
238     PluginInfoStore m_pluginInfoStore;
239     VisitedLinkProvider m_visitedLinkProvider;
240         
241     HashSet<String> m_schemesToRegisterAsEmptyDocument;
242     HashSet<String> m_schemesToRegisterAsSecure;
243     HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor;
244
245     bool m_alwaysUsesComplexTextCodePath;
246
247     Vector<pair<String, RefPtr<APIObject> > > m_pendingMessagesToPostToInjectedBundle;
248
249     CacheModel m_cacheModel;
250
251     WebDownloadClient m_downloadClient;
252     HashMap<uint64_t, RefPtr<DownloadProxy> > m_downloads;
253     
254     bool m_memorySamplerEnabled;
255     double m_memorySamplerInterval;
256
257     RefPtr<WebApplicationCacheManagerProxy> m_applicationCacheManagerProxy;
258     RefPtr<WebCookieManagerProxy> m_cookieManagerProxy;
259     RefPtr<WebDatabaseManagerProxy> m_databaseManagerProxy;
260     RefPtr<WebGeolocationManagerProxy> m_geolocationManagerProxy;
261     RefPtr<WebIconDatabase> m_iconDatabase;
262     RefPtr<WebKeyValueStorageManagerProxy> m_keyValueStorageManagerProxy;
263     RefPtr<WebMediaCacheManagerProxy> m_mediaCacheManagerProxy;
264     RefPtr<WebPluginSiteDataManager> m_pluginSiteDataManager;
265     RefPtr<WebResourceCacheManagerProxy> m_resourceCacheManagerProxy;
266
267 #if PLATFORM(WIN)
268     bool m_shouldPaintNativeControls;
269     HTTPCookieAcceptPolicy m_initialHTTPCookieAcceptPolicy;
270 #endif
271
272 #if PLATFORM(MAC)
273     RetainPtr<CFTypeRef> m_enhancedAccessibilityObserver;
274 #endif
275     
276     String m_overrideDatabaseDirectory;
277     String m_overrideIconDatabasePath;
278     String m_overrideLocalStorageDirectory;
279
280     bool m_processTerminationEnabled;
281     
282     HashMap<uint64_t, RefPtr<DictionaryCallback> > m_dictionaryCallbacks;
283 };
284
285 template<typename U> inline bool WebContext::sendToAllProcesses(const U& message)
286 {
287     if (!m_process || !m_process->canSendMessage())
288         return false;
289
290     return m_process->send(message, 0);
291 }
292
293 template<typename U> bool WebContext::sendToAllProcessesRelaunchingThemIfNecessary(const U& message)
294 {
295     relaunchProcessIfNecessary();
296
297     return m_process->send(message, 0);
298 }
299
300 } // namespace WebKit
301
302 #endif // WebContext_h