Home | History | Annotate | Download | only in UIProcess
      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 
     45 namespace WebKit {
     46 
     47 class DownloadProxy;
     48 class WebApplicationCacheManagerProxy;
     49 class WebCookieManagerProxy;
     50 class WebDatabaseManagerProxy;
     51 class WebGeolocationManagerProxy;
     52 class WebIconDatabase;
     53 class WebKeyValueStorageManagerProxy;
     54 class WebMediaCacheManagerProxy;
     55 class WebPageGroup;
     56 class WebPageProxy;
     57 class WebResourceCacheManagerProxy;
     58 struct WebProcessCreationParameters;
     59 
     60 class WebContext : public APIObject {
     61 public:
     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 
    178 private:
    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 
    274 template<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 
    282 template<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