2011-01-24 Maciej Stachowiak <mjs@apple.com>
[WebKit.git] / Source / WebKit2 / UIProcess / WebContext.h
1 /*
2  * Copyright (C) 2010 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
45 namespace WebKit {
46
47 class DownloadProxy;
48 class WebDatabaseManagerProxy;
49 class WebGeolocationManagerProxy;
50 class WebPageGroup;
51 class WebPageProxy;
52 struct WebProcessCreationParameters;
53
54 class WebContext : public APIObject {
55 public:
56     static const Type APIType = TypeContext;
57
58     static WebContext* sharedProcessContext();
59     static WebContext* sharedThreadContext();
60
61     static PassRefPtr<WebContext> create(const String& injectedBundlePath);
62     virtual ~WebContext();
63
64     void initializeInjectedBundleClient(const WKContextInjectedBundleClient*);
65     void initializeHistoryClient(const WKContextHistoryClient*);
66     void initializeDownloadClient(const WKContextDownloadClient*);
67
68     ProcessModel processModel() const { return m_processModel; }
69     WebProcessProxy* process() const { return m_process.get(); }
70     bool hasValidProcess() const { return m_process && m_process->isValid(); }
71
72     void processDidFinishLaunching(WebProcessProxy*);
73     void processDidClose(WebProcessProxy*);
74
75     WebPageProxy* createWebPage(PageClient*, WebPageGroup*);
76
77     void relaunchProcessIfNecessary();
78
79     const String& injectedBundlePath() const { return m_injectedBundlePath; }
80
81     void download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
82
83     void setInjectedBundleInitializationUserData(PassRefPtr<APIObject> userData) { m_injectedBundleInitializationUserData = userData; }
84     APIObject* injectedBundleInitializationUserData() const { return m_injectedBundleInitializationUserData.get(); }
85
86     void postMessageToInjectedBundle(const String&, APIObject*);
87
88     // InjectedBundle client
89     void didReceiveMessageFromInjectedBundle(const String&, APIObject*);
90     void didReceiveSynchronousMessageFromInjectedBundle(const String&, APIObject*, RefPtr<APIObject>& returnData);
91
92     void populateVisitedLinks();
93     
94     void setAdditionalPluginsDirectory(const String&);
95
96     PluginInfoStore* pluginInfoStore() { return &m_pluginInfoStore; }
97     String applicationCacheDirectory();
98
99     void setAlwaysUsesComplexTextCodePath(bool);
100     
101     void registerURLSchemeAsEmptyDocument(const String&);
102     void registerURLSchemeAsSecure(const String&);
103     void setDomainRelaxationForbiddenForURLScheme(const String&);
104
105     void addVisitedLink(const String&);
106     void addVisitedLinkHash(WebCore::LinkHash);
107
108     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
109     CoreIPC::SyncReplyMode didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
110
111     void setCacheModel(CacheModel);
112     CacheModel cacheModel() const { return m_cacheModel; }
113     void clearResourceCaches();
114     void clearApplicationCache();
115     
116     void startMemorySampler(const double interval);
117     void stopMemorySampler();
118
119 #if PLATFORM(WIN)
120     void setShouldPaintNativeControls(bool);
121 #endif
122
123     // Downloads.
124     uint64_t createDownloadProxy();
125     WebDownloadClient& downloadClient() { return m_downloadClient; }
126     void downloadFinished(DownloadProxy*);
127
128     static HashSet<String, CaseFoldingHash> pdfAndPostScriptMIMETypes();
129
130     WebDatabaseManagerProxy* databaseManagerProxy() const { return m_databaseManagerProxy.get(); }
131     WebGeolocationManagerProxy* geolocationManagerProxy() const { return m_geolocationManagerProxy.get(); }
132
133     struct Statistics {
134         unsigned wkViewCount;
135         unsigned wkPageCount;
136         unsigned wkFrameCount;
137     };
138     static Statistics& statistics();
139
140     void setDatabaseDirectory(const String& dir) { m_overrideDatabaseDirectory = dir; }
141
142 private:
143     WebContext(ProcessModel, const String& injectedBundlePath);
144
145     virtual Type type() const { return APIType; }
146
147     void ensureWebProcess();
148     void platformInitializeWebProcess(WebProcessCreationParameters&);
149
150     // History client
151     void didNavigateWithNavigationData(uint64_t pageID, const WebNavigationDataStore& store, uint64_t frameID);
152     void didPerformClientRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
153     void didPerformServerRedirect(uint64_t pageID, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
154     void didUpdateHistoryTitle(uint64_t pageID, const String& title, const String& url, uint64_t frameID);
155
156     // Plugins
157     void getPlugins(bool refresh, Vector<WebCore::PluginInfo>& plugins);
158     void getPluginPath(const String& mimeType, const String& urlString, String& pluginPath);
159
160     // Implemented in generated WebContextMessageReceiver.cpp
161     void didReceiveWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
162     CoreIPC::SyncReplyMode didReceiveSyncWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, CoreIPC::ArgumentEncoder*);
163
164     static void languageChanged(void* context);
165     void languageChanged();
166
167     String databaseDirectory() const;
168     String platformDefaultDatabaseDirectory() const;
169
170     ProcessModel m_processModel;
171     
172     // FIXME: In the future, this should be one or more WebProcessProxies.
173     RefPtr<WebProcessProxy> m_process;
174
175     RefPtr<WebPageGroup> m_defaultPageGroup;
176
177     RefPtr<APIObject> m_injectedBundleInitializationUserData;
178     String m_injectedBundlePath;
179     WebContextInjectedBundleClient m_injectedBundleClient;
180
181     WebHistoryClient m_historyClient;
182
183     PluginInfoStore m_pluginInfoStore;
184     VisitedLinkProvider m_visitedLinkProvider;
185         
186     HashSet<String> m_schemesToRegisterAsEmptyDocument;
187     HashSet<String> m_schemesToRegisterAsSecure;
188     HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor;
189
190     bool m_alwaysUsesComplexTextCodePath;
191
192     Vector<pair<String, RefPtr<APIObject> > > m_pendingMessagesToPostToInjectedBundle;
193
194     CacheModel m_cacheModel;
195
196     WebDownloadClient m_downloadClient;
197     HashMap<uint64_t, RefPtr<DownloadProxy> > m_downloads;
198
199     bool m_clearResourceCachesForNewWebProcess;
200     bool m_clearApplicationCacheForNewWebProcess;
201     
202     bool m_memorySamplerEnabled;
203     double m_memorySamplerInterval;
204
205     RefPtr<WebDatabaseManagerProxy> m_databaseManagerProxy;
206     RefPtr<WebGeolocationManagerProxy> m_geolocationManagerProxy;
207
208 #if PLATFORM(WIN)
209     bool m_shouldPaintNativeControls;
210 #endif
211
212     String m_overrideDatabaseDirectory;
213 };
214
215 } // namespace WebKit
216
217 #endif // WebContext_h