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