ad1fff9ed186be30de39bb467c210e6173f57d86
[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 "WebContextConnectionClient.h"
36 #include "WebDownloadClient.h"
37 #include "WebHistoryClient.h"
38 #include "WebProcessProxy.h"
39 #include <WebCore/LinkHash.h>
40 #include <wtf/Forward.h>
41 #include <wtf/HashSet.h>
42 #include <wtf/PassRefPtr.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/text/StringHash.h>
45 #include <wtf/text/WTFString.h>
46
47 namespace WebKit {
48
49 class DownloadProxy;
50 class WebApplicationCacheManagerProxy;
51 #if ENABLE(BATTERY_STATUS)
52 class WebBatteryManagerProxy;
53 #endif
54 class WebCookieManagerProxy;
55 class WebDatabaseManagerProxy;
56 class WebGeolocationManagerProxy;
57 class WebIconDatabase;
58 class WebKeyValueStorageManagerProxy;
59 class WebMediaCacheManagerProxy;
60 #if ENABLE(NETWORK_INFO)
61 class WebNetworkInfoManagerProxy;
62 #endif
63 class WebNotificationManagerProxy;
64 class WebPageGroup;
65 class WebPageProxy;
66 class WebResourceCacheManagerProxy;
67 #if USE(SOUP)
68 class WebSoupRequestManagerProxy;
69 #endif
70 #if ENABLE(VIBRATION)
71 class WebVibrationProxy;
72 #endif
73 struct StatisticsData;
74 struct WebProcessCreationParameters;
75     
76 typedef GenericCallback<WKDictionaryRef> DictionaryCallback;
77
78 class WebContext : public APIObject {
79 public:
80     static const Type APIType = TypeContext;
81
82     static PassRefPtr<WebContext> create(const String& injectedBundlePath);
83     virtual ~WebContext();
84
85     static const Vector<WebContext*>& allContexts();
86
87     void initializeInjectedBundleClient(const WKContextInjectedBundleClient*);
88     void initializeConnectionClient(const WKContextConnectionClient*);
89     void initializeHistoryClient(const WKContextHistoryClient*);
90     void initializeDownloadClient(const WKContextDownloadClient*);
91
92     void setProcessModel(ProcessModel); // Can only be called when there are no processes running.
93     ProcessModel processModel() const { return m_processModel; }
94
95     // FIXME (Multi-WebProcess): Remove. No code should assume that there is a shared process.
96     WebProcessProxy* deprecatedSharedProcess();
97
98     template<typename U> void sendToAllProcesses(const U& message);
99     template<typename U> void sendToAllProcessesRelaunchingThemIfNecessary(const U& message);
100     
101     void processDidFinishLaunching(WebProcessProxy*);
102
103     // Disconnect the process from the context.
104     void disconnectProcess(WebProcessProxy*);
105
106     PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*, WebPageProxy* relatedPage = 0);
107
108     WebProcessProxy* relaunchProcessIfNecessary();
109
110     const String& injectedBundlePath() const { return m_injectedBundlePath; }
111
112     DownloadProxy* download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
113
114     void setInjectedBundleInitializationUserData(PassRefPtr<APIObject> userData) { m_injectedBundleInitializationUserData = userData; }
115
116     void postMessageToInjectedBundle(const String&, APIObject*);
117
118     // InjectedBundle client
119     void didReceiveMessageFromInjectedBundle(const String&, APIObject*);
120     void didReceiveSynchronousMessageFromInjectedBundle(const String&, APIObject*, RefPtr<APIObject>& returnData);
121
122     void populateVisitedLinks();
123     
124     void setAdditionalPluginsDirectory(const String&);
125
126     PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
127     String applicationCacheDirectory();
128
129     void setAlwaysUsesComplexTextCodePath(bool);
130     void setShouldUseFontSmoothing(bool);
131     
132     void registerURLSchemeAsEmptyDocument(const String&);
133     void registerURLSchemeAsSecure(const String&);
134     void setDomainRelaxationForbiddenForURLScheme(const String&);
135     void registerURLSchemeAsLocal(const String&);
136     void registerURLSchemeAsNoAccess(const String&);
137     void registerURLSchemeAsDisplayIsolated(const String&);
138     void registerURLSchemeAsCORSEnabled(const String&);
139
140     void addVisitedLink(const String&);
141     void addVisitedLinkHash(WebCore::LinkHash);
142
143     void didReceiveMessage(WebProcessProxy*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
144     void didReceiveSyncMessage(WebProcessProxy*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
145
146     void setCacheModel(CacheModel);
147     CacheModel cacheModel() const { return m_cacheModel; }
148
149     void setDefaultRequestTimeoutInterval(double);
150
151     void startMemorySampler(const double interval);
152     void stopMemorySampler();
153
154 #if PLATFORM(WIN)
155     void setShouldPaintNativeControls(bool);
156
157     void setInitialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicy policy) { m_initialHTTPCookieAcceptPolicy = policy; }
158 #endif
159
160     void setEnhancedAccessibility(bool);
161     
162     // Downloads.
163     DownloadProxy* createDownloadProxy();
164     WebDownloadClient& downloadClient() { return m_downloadClient; }
165     void downloadFinished(DownloadProxy*);
166
167     WebHistoryClient& historyClient() { return m_historyClient; }
168
169     static HashSet<String, CaseFoldingHash> pdfAndPostScriptMIMETypes();
170
171     WebApplicationCacheManagerProxy* applicationCacheManagerProxy() const { return m_applicationCacheManagerProxy.get(); }
172 #if ENABLE(BATTERY_STATUS)
173     WebBatteryManagerProxy* batteryManagerProxy() const { return m_batteryManagerProxy.get(); }
174 #endif
175     WebCookieManagerProxy* cookieManagerProxy() const { return m_cookieManagerProxy.get(); }
176 #if ENABLE(SQL_DATABASE)
177     WebDatabaseManagerProxy* databaseManagerProxy() const { return m_databaseManagerProxy.get(); }
178 #endif
179     WebGeolocationManagerProxy* geolocationManagerProxy() const { return m_geolocationManagerProxy.get(); }
180     WebIconDatabase* iconDatabase() const { return m_iconDatabase.get(); }
181     WebKeyValueStorageManagerProxy* keyValueStorageManagerProxy() const { return m_keyValueStorageManagerProxy.get(); }
182     WebMediaCacheManagerProxy* mediaCacheManagerProxy() const { return m_mediaCacheManagerProxy.get(); }
183 #if ENABLE(NETWORK_INFO)
184     WebNetworkInfoManagerProxy* networkInfoManagerProxy() const { return m_networkInfoManagerProxy.get(); }
185 #endif
186     WebNotificationManagerProxy* notificationManagerProxy() const { return m_notificationManagerProxy.get(); }
187     WebPluginSiteDataManager* pluginSiteDataManager() const { return m_pluginSiteDataManager.get(); }
188     WebResourceCacheManagerProxy* resourceCacheManagerProxy() const { return m_resourceCacheManagerProxy.get(); }
189 #if USE(SOUP)
190     WebSoupRequestManagerProxy* soupRequestManagerProxy() const { return m_soupRequestManagerProxy.get(); }
191 #endif
192 #if ENABLE(VIBRATION)
193     WebVibrationProxy* vibrationProxy() const { return m_vibrationProxy.get(); }
194 #endif
195
196     struct Statistics {
197         unsigned wkViewCount;
198         unsigned wkPageCount;
199         unsigned wkFrameCount;
200     };
201     static Statistics& statistics();    
202
203     void setDatabaseDirectory(const String& dir) { m_overrideDatabaseDirectory = dir; }
204     void setIconDatabasePath(const String&);
205     String iconDatabasePath() const;
206     void setLocalStorageDirectory(const String& dir) { m_overrideLocalStorageDirectory = dir; }
207
208     void ensureSharedWebProcess();
209     PassRefPtr<WebProcessProxy> createNewWebProcess();
210     void warmInitialProcess();
211
212     bool shouldTerminate(WebProcessProxy*);
213
214     void disableProcessTermination() { m_processTerminationEnabled = false; }
215     void enableProcessTermination();
216
217     // Defaults to false.
218     void setHTTPPipeliningEnabled(bool);
219     bool httpPipeliningEnabled() const;
220     
221     void getWebCoreStatistics(PassRefPtr<DictionaryCallback>);
222     void garbageCollectJavaScriptObjects();
223     void setJavaScriptGarbageCollectorTimerEnabled(bool flag);
224
225 #if PLATFORM(MAC)
226     static bool omitPDFSupport();
227 #endif
228
229     void fullKeyboardAccessModeChanged(bool fullKeyboardAccessEnabled);
230
231     void textCheckerStateChanged();
232
233 private:
234     WebContext(ProcessModel, const String& injectedBundlePath);
235
236     virtual Type type() const { return APIType; }
237
238     void platformInitializeWebProcess(WebProcessCreationParameters&);
239     void platformInvalidateContext();
240     
241 #if PLATFORM(MAC)
242     void getPasteboardTypes(const String& pasteboardName, Vector<String>& pasteboardTypes);
243     void getPasteboardPathnamesForType(const String& pasteboardName, const String& pasteboardType, Vector<String>& pathnames);
244     void getPasteboardStringForType(const String& pasteboardName, const String& pasteboardType, String&);
245     void getPasteboardBufferForType(const String& pasteboardName, const String& pasteboardType, SharedMemory::Handle&, uint64_t& size);
246     void pasteboardCopy(const String& fromPasteboard, const String& toPasteboard);
247     void getPasteboardChangeCount(const String& pasteboardName, uint64_t& changeCount);
248     void getPasteboardUniqueName(String& pasteboardName);
249     void getPasteboardColor(const String& pasteboardName, WebCore::Color&);
250     void getPasteboardURL(const String& pasteboardName, WTF::String&);
251     void addPasteboardTypes(const String& pasteboardName, const Vector<String>& pasteboardTypes);
252     void setPasteboardTypes(const String& pasteboardName, const Vector<String>& pasteboardTypes);
253     void setPasteboardPathnamesForType(const String& pasteboardName, const String& pasteboardType, const Vector<String>& pathnames);
254     void setPasteboardStringForType(const String& pasteboardName, const String& pasteboardType, const String&);
255     void setPasteboardBufferForType(const String& pasteboardName, const String& pasteboardType, const SharedMemory::Handle&, uint64_t size);
256 #endif
257
258 #if !PLATFORM(MAC)
259     // FIXME: This a dummy message, to avoid breaking the build for platforms that don't require
260     // any synchronous messages, and should be removed when <rdar://problem/8775115> is fixed.
261     void dummy(bool&);
262 #endif
263
264     void didGetWebCoreStatistics(const StatisticsData&, uint64_t callbackID);
265         
266     // Implemented in generated WebContextMessageReceiver.cpp
267     void didReceiveWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
268     void didReceiveSyncWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
269
270     static void languageChanged(void* context);
271     void languageChanged();
272
273     String databaseDirectory() const;
274     String platformDefaultDatabaseDirectory() const;
275
276     String platformDefaultIconDatabasePath() const;
277
278     String localStorageDirectory() const;
279     String platformDefaultLocalStorageDirectory() const;
280
281     ProcessModel m_processModel;
282     
283     Vector<RefPtr<WebProcessProxy> > m_processes;
284     bool m_haveInitialEmptyProcess;
285
286     RefPtr<WebPageGroup> m_defaultPageGroup;
287
288     RefPtr<APIObject> m_injectedBundleInitializationUserData;
289     String m_injectedBundlePath;
290     WebContextInjectedBundleClient m_injectedBundleClient;
291
292     WebContextConnectionClient m_connectionClient;
293     
294     WebHistoryClient m_historyClient;
295
296     PluginInfoStore m_pluginInfoStore;
297     VisitedLinkProvider m_visitedLinkProvider;
298         
299     HashSet<String> m_schemesToRegisterAsEmptyDocument;
300     HashSet<String> m_schemesToRegisterAsSecure;
301     HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor;
302     HashSet<String> m_schemesToRegisterAsLocal;
303     HashSet<String> m_schemesToRegisterAsNoAccess;
304     HashSet<String> m_schemesToRegisterAsDisplayIsolated;
305     HashSet<String> m_schemesToRegisterAsCORSEnabled;
306
307     bool m_alwaysUsesComplexTextCodePath;
308     bool m_shouldUseFontSmoothing;
309
310     // Messages that were posted before any pages were created.
311     // The client should use initialization messages instead, so that a restarted process would get the same state.
312     Vector<pair<String, RefPtr<APIObject> > > m_messagesToInjectedBundlePostedToEmptyContext;
313
314     CacheModel m_cacheModel;
315
316     WebDownloadClient m_downloadClient;
317     HashMap<uint64_t, RefPtr<DownloadProxy> > m_downloads;
318     
319     bool m_memorySamplerEnabled;
320     double m_memorySamplerInterval;
321
322     RefPtr<WebApplicationCacheManagerProxy> m_applicationCacheManagerProxy;
323 #if ENABLE(BATTERY_STATUS)
324     RefPtr<WebBatteryManagerProxy> m_batteryManagerProxy;
325 #endif
326     RefPtr<WebCookieManagerProxy> m_cookieManagerProxy;
327 #if ENABLE(SQL_DATABASE)
328     RefPtr<WebDatabaseManagerProxy> m_databaseManagerProxy;
329 #endif
330     RefPtr<WebGeolocationManagerProxy> m_geolocationManagerProxy;
331     RefPtr<WebIconDatabase> m_iconDatabase;
332     RefPtr<WebKeyValueStorageManagerProxy> m_keyValueStorageManagerProxy;
333     RefPtr<WebMediaCacheManagerProxy> m_mediaCacheManagerProxy;
334 #if ENABLE(NETWORK_INFO)
335     RefPtr<WebNetworkInfoManagerProxy> m_networkInfoManagerProxy;
336 #endif
337     RefPtr<WebNotificationManagerProxy> m_notificationManagerProxy;
338     RefPtr<WebPluginSiteDataManager> m_pluginSiteDataManager;
339     RefPtr<WebResourceCacheManagerProxy> m_resourceCacheManagerProxy;
340 #if USE(SOUP)
341     RefPtr<WebSoupRequestManagerProxy> m_soupRequestManagerProxy;
342 #endif
343 #if ENABLE(VIBRATION)
344     RefPtr<WebVibrationProxy> m_vibrationProxy;
345 #endif
346
347 #if PLATFORM(WIN)
348     bool m_shouldPaintNativeControls;
349     HTTPCookieAcceptPolicy m_initialHTTPCookieAcceptPolicy;
350 #endif
351
352 #if PLATFORM(MAC)
353     RetainPtr<CFTypeRef> m_enhancedAccessibilityObserver;
354 #endif
355
356     String m_overrideDatabaseDirectory;
357     String m_overrideIconDatabasePath;
358     String m_overrideLocalStorageDirectory;
359
360     bool m_processTerminationEnabled;
361     
362     HashMap<uint64_t, RefPtr<DictionaryCallback> > m_dictionaryCallbacks;
363 };
364
365 template<typename U> inline void WebContext::sendToAllProcesses(const U& message)
366 {
367     size_t processCount = m_processes.size();
368     for (size_t i = 0; i < processCount; ++i) {
369         WebProcessProxy* process = m_processes[i].get();
370         if (process->canSendMessage())
371             process->send(message, 0);
372     }
373 }
374
375 template<typename U> void WebContext::sendToAllProcessesRelaunchingThemIfNecessary(const U& message)
376 {
377 // FIXME (Multi-WebProcess): WebContext doesn't track processes that have exited, so it cannot relaunch these. Perhaps this functionality won't be needed in this mode.
378     if (m_processModel == ProcessModelSharedSecondaryProcess)
379         relaunchProcessIfNecessary();
380     sendToAllProcesses(message);
381 }
382
383 } // namespace WebKit
384
385 #endif // WebContext_h