diff options
Diffstat (limited to 'Source/WebKit2/WebProcess/WebProcess.h')
-rw-r--r-- | Source/WebKit2/WebProcess/WebProcess.h | 305 |
1 files changed, 198 insertions, 107 deletions
diff --git a/Source/WebKit2/WebProcess/WebProcess.h b/Source/WebKit2/WebProcess/WebProcess.h index 3d46e4e07..b0ce00398 100644 --- a/Source/WebKit2/WebProcess/WebProcess.h +++ b/Source/WebKit2/WebProcess/WebProcess.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010-2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -23,29 +23,36 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef WebProcess_h -#define WebProcess_h +#pragma once #include "CacheModel.h" #include "ChildProcess.h" -#include "DownloadManager.h" +#include "DrawingArea.h" +#include "LibWebRTCNetwork.h" #include "PluginProcessConnectionManager.h" #include "ResourceCachesToClear.h" #include "SandboxExtension.h" #include "SharedMemory.h" #include "TextCheckerState.h" +#include "ViewUpdateDispatcher.h" #include "VisitedLinkTable.h" -#include <WebCore/LinkHash.h> +#include <WebCore/HysteresisActivity.h> +#include <WebCore/ResourceLoadStatisticsStore.h> +#include <WebCore/SessionID.h> #include <WebCore/Timer.h> #include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/HashSet.h> -#include <wtf/NeverDestroyed.h> #include <wtf/text/AtomicString.h> #include <wtf/text/AtomicStringHash.h> -#if PLATFORM(MAC) +#if PLATFORM(COCOA) #include <dispatch/dispatch.h> +#include <WebCore/MachSendRight.h> +#endif + +#if PLATFORM(IOS) +#include "WebSQLiteDatabaseTracker.h" #endif namespace API { @@ -53,41 +60,47 @@ class Object; } namespace WebCore { +class ApplicationCacheStorage; class CertificateInfo; class PageGroup; class ResourceRequest; +class SessionID; +class UserGestureToken; struct PluginInfo; +struct SecurityOriginData; +struct SoupNetworkProxySettings; } namespace WebKit { -class DownloadManager; class EventDispatcher; +class GamepadData; class InjectedBundle; +class NetworkProcessConnection; +class ObjCObjectGraph; +class UserData; +class WebAutomationSessionProxy; class WebConnectionToUIProcess; class WebFrame; class WebIconDatabaseProxy; +class WebLoaderStrategy; class WebPage; class WebPageGroupProxy; class WebProcessSupplement; +enum class WebsiteDataType; struct WebPageCreationParameters; struct WebPageGroupData; struct WebPreferencesStore; struct WebProcessCreationParameters; - -#if ENABLE(NETWORK_PROCESS) -class NetworkProcessConnection; -class WebResourceLoadScheduler; -#endif +struct WebsiteData; #if ENABLE(DATABASE_PROCESS) class WebToDatabaseProcessConnection; #endif -class WebProcess : public ChildProcess, private DownloadManager::Client { - friend class NeverDestroyed<DownloadManager>; +class WebProcess : public ChildProcess { public: - static WebProcess& shared(); + static WebProcess& singleton(); template <typename T> T* supplement() @@ -98,31 +111,28 @@ public: template <typename T> void addSupplement() { - m_supplements.add(T::supplementName(), adoptPtr<WebProcessSupplement>(new T(this))); + m_supplements.add(T::supplementName(), std::make_unique<T>(this)); } WebConnectionToUIProcess* webConnectionToUIProcess() const { return m_webConnection.get(); } WebPage* webPage(uint64_t pageID) const; - void createWebPage(uint64_t pageID, const WebPageCreationParameters&); + void createWebPage(uint64_t pageID, WebPageCreationParameters&&); void removeWebPage(uint64_t pageID); WebPage* focusedWebPage() const; InjectedBundle* injectedBundle() const { return m_injectedBundle.get(); } -#if PLATFORM(MAC) -#if USE(ACCELERATED_COMPOSITING) - mach_port_t compositingRenderServerPort() const { return m_compositingRenderServerPort; } +#if PLATFORM(COCOA) + const WebCore::MachSendRight& compositingRenderServerPort() const { return m_compositingRenderServerPort; } #endif -#endif - - void setShouldTrackVisitedLinks(bool); - void addVisitedLink(WebCore::LinkHash); - bool isLinkVisited(WebCore::LinkHash) const; - bool shouldPlugInAutoStartFromOrigin(const WebPage*, const String& pageOrigin, const String& pluginOrigin, const String& mimeType); - void plugInDidStartFromOrigin(const String& pageOrigin, const String& pluginOrigin, const String& mimeType); - void plugInDidReceiveUserInteraction(const String& pageOrigin, const String& pluginOrigin, const String& mimeType); + bool shouldPlugInAutoStartFromOrigin(WebPage&, const String& pageOrigin, const String& pluginOrigin, const String& mimeType); + void plugInDidStartFromOrigin(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID); + void plugInDidReceiveUserInteraction(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID); + void setPluginLoadClientPolicy(uint8_t policy, const String& host, const String& bundleIdentifier, const String& versionString); + void clearPluginClientPolicies(); + void refreshPlugins(); bool fullKeyboardAccessEnabled() const { return m_fullKeyboardAccessEnabled; } @@ -134,13 +144,15 @@ public: WebPageGroupProxy* webPageGroup(uint64_t pageGroupID); WebPageGroupProxy* webPageGroup(const WebPageGroupData&); -#if PLATFORM(MAC) + uint64_t userGestureTokenIdentifier(RefPtr<WebCore::UserGestureToken>); + void userGestureTokenDestroyed(WebCore::UserGestureToken&); + +#if PLATFORM(COCOA) pid_t presenterApplicationPid() const { return m_presenterApplicationPid; } - bool shouldForceScreenFontSubstitution() const { return m_shouldForceScreenFontSubstitution; } #endif const TextCheckerState& textCheckerState() const { return m_textCheckerState; } - DownloadManager& downloadManager(); + void setTextCheckerState(const TextCheckerState&); void clearResourceCaches(ResourceCachesToClear = AllResourceCaches); @@ -150,12 +162,12 @@ public: EventDispatcher& eventDispatcher() { return *m_eventDispatcher; } - bool usesNetworkProcess() const; - -#if ENABLE(NETWORK_PROCESS) - NetworkProcessConnection* networkConnection(); + NetworkProcessConnection& networkConnection(); void networkProcessConnectionClosed(NetworkProcessConnection*); - WebResourceLoadScheduler& webResourceLoadScheduler(); + WebLoaderStrategy& webLoaderStrategy(); + +#if USE(LIBWEBRTC) + LibWebRTCNetwork& libWebRTCNetwork(); #endif #if ENABLE(DATABASE_PROCESS) @@ -165,111 +177,169 @@ public: void setCacheModel(uint32_t); - void ensurePrivateBrowsingSession(uint64_t sessionID); - void destroyPrivateBrowsingSession(uint64_t sessionID); + void ensurePrivateBrowsingSession(WebCore::SessionID); + void destroyPrivateBrowsingSession(WebCore::SessionID); + void ensureLegacyPrivateBrowsingSessionInNetworkProcess(); void pageDidEnterWindow(uint64_t pageID); void pageWillLeaveWindow(uint64_t pageID); - void nonVisibleProcessCleanupTimerFired(WebCore::Timer<WebProcess>*); + void nonVisibleProcessCleanupTimerFired(); + void statisticsChangedTimerFired(); + +#if PLATFORM(COCOA) + RetainPtr<CFDataRef> sourceApplicationAuditData() const; + void destroyRenderingResources(); +#endif void updateActivePages(); -#if USE(SOUP) - void allowSpecificHTTPSCertificateForHost(const WebCore::CertificateInfo&, const String& host); -#endif + void setHiddenPageTimerThrottlingIncreaseLimit(int milliseconds); + + void processWillSuspendImminently(bool& handled); + void prepareToSuspend(); + void cancelPrepareToSuspend(); + void processDidResume(); #if PLATFORM(IOS) void resetAllGeolocationPermissions(); -#endif // PLATFORM(IOS) +#endif + +#if PLATFORM(WAYLAND) + String waylandCompositorDisplayName() const { return m_waylandCompositorDisplayName; } +#endif + + RefPtr<API::Object> transformHandlesToObjects(API::Object*); + static RefPtr<API::Object> transformObjectsToHandles(API::Object*); + +#if PLATFORM(COCOA) + RefPtr<ObjCObjectGraph> transformHandlesToObjects(ObjCObjectGraph&); + static RefPtr<ObjCObjectGraph> transformObjectsToHandles(ObjCObjectGraph&); +#endif + +#if ENABLE(SERVICE_CONTROLS) + bool hasImageServices() const { return m_hasImageServices; } + bool hasSelectionServices() const { return m_hasSelectionServices; } + bool hasRichContentServices() const { return m_hasRichContentServices; } +#endif + + WebCore::ApplicationCacheStorage& applicationCacheStorage() { return *m_applicationCacheStorage; } - RefPtr<API::Object> apiObjectByConvertingFromHandles(API::Object*); + void prefetchDNS(const String&); + + WebAutomationSessionProxy* automationSessionProxy() { return m_automationSessionProxy.get(); } private: WebProcess(); + ~WebProcess(); + + void initializeWebProcess(WebProcessCreationParameters&&); + void platformInitializeWebProcess(WebProcessCreationParameters&&); - // DownloadManager::Client. - virtual void didCreateDownload() override; - virtual void didDestroyDownload() override; - virtual IPC::Connection* downloadProxyConnection() override; - virtual AuthenticationManager& downloadsAuthenticationManager() override; +#if USE(OS_STATE) + void registerWithStateDumper(); +#endif + + void markAllLayersVolatile(std::function<void()> completionHandler); + void cancelMarkAllLayersVolatile(); + void setAllLayerTreeStatesFrozen(bool); + void processSuspensionCleanupTimerFired(); - void initializeWebProcess(const WebProcessCreationParameters&, IPC::MessageDecoder&); - void platformInitializeWebProcess(const WebProcessCreationParameters&, IPC::MessageDecoder&); + void clearCachedCredentials(); void platformTerminate(); void registerURLSchemeAsEmptyDocument(const String&); void registerURLSchemeAsSecure(const String&) const; + void registerURLSchemeAsBypassingContentSecurityPolicy(const String&) const; void setDomainRelaxationForbiddenForURLScheme(const String&) const; void registerURLSchemeAsLocal(const String&) const; void registerURLSchemeAsNoAccess(const String&) const; void registerURLSchemeAsDisplayIsolated(const String&) const; void registerURLSchemeAsCORSEnabled(const String&) const; + void registerURLSchemeAsAlwaysRevalidated(const String&) const; + void registerURLSchemeAsCachePartitioned(const String&) const; void setDefaultRequestTimeoutInterval(double); void setAlwaysUsesComplexTextCodePath(bool); void setShouldUseFontSmoothing(bool); + void setResourceLoadStatisticsEnabled(bool); void userPreferredLanguagesChanged(const Vector<String>&) const; void fullKeyboardAccessModeChanged(bool fullKeyboardAccessEnabled); - void setVisitedLinkTable(const SharedMemory::Handle&); - void visitedLinkStateChanged(const Vector<WebCore::LinkHash>& linkHashes); - void allVisitedLinkStateChanged(); - - bool isPlugInAutoStartOriginHash(unsigned plugInOriginHash); - void didAddPlugInAutoStartOriginHash(unsigned plugInOriginHash, double expirationTime); - void resetPlugInAutoStartOriginHashes(const HashMap<unsigned, double>& hashes); + bool isPlugInAutoStartOriginHash(unsigned plugInOriginHash, WebCore::SessionID); + void didAddPlugInAutoStartOriginHash(unsigned plugInOriginHash, double expirationTime, WebCore::SessionID); + void resetPlugInAutoStartOriginDefaultHashes(const HashMap<unsigned, double>& hashes); + void resetPlugInAutoStartOriginHashes(const HashMap<WebCore::SessionID, HashMap<unsigned, double>>& hashes); void platformSetCacheModel(CacheModel); - void platformClearResourceCaches(ResourceCachesToClear); - void clearApplicationCache(); void setEnhancedAccessibility(bool); void startMemorySampler(const SandboxExtension::Handle&, const String&, const double); void stopMemorySampler(); - - void downloadRequest(uint64_t downloadID, uint64_t initiatingPageID, const WebCore::ResourceRequest&); - void cancelDownload(uint64_t downloadID); - - void setTextCheckerState(const TextCheckerState&); void getWebCoreStatistics(uint64_t callbackID); void garbageCollectJavaScriptObjects(); void setJavaScriptGarbageCollectorTimerEnabled(bool flag); - void releasePageCache(); + void mainThreadPing(); + +#if ENABLE(GAMEPAD) + void setInitialGamepads(const Vector<GamepadData>&); + void gamepadConnected(const GamepadData&); + void gamepadDisconnected(unsigned index); +#endif #if USE(SOUP) - void setIgnoreTLSErrors(bool); + void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&); #endif + void releasePageCache(); + + void fetchWebsiteData(WebCore::SessionID, OptionSet<WebsiteDataType>, WebsiteData&); + void deleteWebsiteData(WebCore::SessionID, OptionSet<WebsiteDataType>, std::chrono::system_clock::time_point modifiedSince); + void deleteWebsiteDataForOrigins(WebCore::SessionID, OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins); + void setMemoryCacheDisabled(bool); - void postInjectedBundleMessage(const IPC::DataReference& messageData); +#if ENABLE(SERVICE_CONTROLS) + void setEnabledServices(bool hasImageServices, bool hasSelectionServices, bool hasRichContentServices); +#endif + + void handleInjectedBundleMessage(const String& messageName, const UserData& messageBody); + void setInjectedBundleParameter(const String& key, const IPC::DataReference&); + void setInjectedBundleParameters(const IPC::DataReference&); + + enum class ShouldAcknowledgeWhenReadyToSuspend { No, Yes }; + void actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend); + + void ensureAutomationSessionProxy(const String& sessionIdentifier); + void destroyAutomationSessionProxy(); + + void logDiagnosticMessageForNetworkProcessCrash(); // ChildProcess - virtual void initializeProcess(const ChildProcessInitializationParameters&) override; - virtual void initializeProcessName(const ChildProcessInitializationParameters&) override; - virtual void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) override; - virtual void initializeConnection(IPC::Connection*) override; - virtual bool shouldTerminate() override; - virtual void terminate() override; - -#if PLATFORM(MAC) && !PLATFORM(IOS) - virtual void stopRunLoop() override; + void initializeProcess(const ChildProcessInitializationParameters&) override; + void initializeProcessName(const ChildProcessInitializationParameters&) override; + void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) override; + void initializeConnection(IPC::Connection*) override; + bool shouldTerminate() override; + void terminate() override; + +#if USE(APPKIT) + void stopRunLoop() override; #endif void platformInitializeProcess(const ChildProcessInitializationParameters&); // IPC::Connection::Client friend class WebConnectionToUIProcess; - virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&); - virtual void didReceiveSyncMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&); - virtual void didClose(IPC::Connection*); - virtual void didReceiveInvalidMessage(IPC::Connection*, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override; + void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; + void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override; + void didClose(IPC::Connection&) override; // Implemented in generated WebProcessMessageReceiver.cpp - void didReceiveWebProcessMessage(IPC::Connection*, IPC::MessageDecoder&); + void didReceiveWebProcessMessage(IPC::Connection&, IPC::Decoder&); + void didReceiveSyncWebProcessMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&); RefPtr<WebConnectionToUIProcess> m_webConnection; @@ -278,46 +348,45 @@ private: RefPtr<InjectedBundle> m_injectedBundle; RefPtr<EventDispatcher> m_eventDispatcher; +#if PLATFORM(IOS) + RefPtr<ViewUpdateDispatcher> m_viewUpdateDispatcher; +#endif - bool m_inDidClose; - - // FIXME: The visited link table should not be per process. - VisitedLinkTable m_visitedLinkTable; - bool m_shouldTrackVisitedLinks; - - HashMap<unsigned, double> m_plugInAutoStartOriginHashes; + HashMap<WebCore::SessionID, HashMap<unsigned, double>> m_plugInAutoStartOriginHashes; HashSet<String> m_plugInAutoStartOrigins; - bool m_hasSetCacheModel; - CacheModel m_cacheModel; + bool m_hasSetCacheModel { false }; + CacheModel m_cacheModel { CacheModelDocumentViewer }; -#if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC) - mach_port_t m_compositingRenderServerPort; -#endif -#if PLATFORM(MAC) +#if PLATFORM(COCOA) + WebCore::MachSendRight m_compositingRenderServerPort; pid_t m_presenterApplicationPid; - dispatch_group_t m_clearResourceCachesDispatchGroup; - bool m_shouldForceScreenFontSubstitution; #endif - bool m_fullKeyboardAccessEnabled; + bool m_fullKeyboardAccessEnabled { false }; HashMap<uint64_t, WebFrame*> m_frameMap; - typedef HashMap<const char*, OwnPtr<WebProcessSupplement>, PtrHash<const char*>> WebProcessSupplementMap; + typedef HashMap<const char*, std::unique_ptr<WebProcessSupplement>, PtrHash<const char*>> WebProcessSupplementMap; WebProcessSupplementMap m_supplements; TextCheckerState m_textCheckerState; - WebIconDatabaseProxy* m_iconDatabaseProxy; + WebIconDatabaseProxy& m_iconDatabaseProxy; -#if ENABLE(NETWORK_PROCESS) void ensureNetworkProcessConnection(); RefPtr<NetworkProcessConnection> m_networkProcessConnection; - bool m_usesNetworkProcess; - WebResourceLoadScheduler* m_webResourceLoadScheduler; + WebLoaderStrategy& m_webLoaderStrategy; + +#if USE(LIBWEBRTC) + std::unique_ptr<LibWebRTCNetwork> m_libWebRTCNetwork; #endif + HashSet<String> m_dnsPrefetchedHosts; + WebCore::HysteresisActivity m_dnsPrefetchHystereris; + + std::unique_ptr<WebAutomationSessionProxy> m_automationSessionProxy; + #if ENABLE(DATABASE_PROCESS) void ensureWebToDatabaseProcessConnection(); RefPtr<WebToDatabaseProcessConnection> m_webToDatabaseProcessConnection; @@ -327,10 +396,32 @@ private: RefPtr<PluginProcessConnectionManager> m_pluginProcessConnectionManager; #endif +#if ENABLE(SERVICE_CONTROLS) + bool m_hasImageServices { false }; + bool m_hasSelectionServices { false }; + bool m_hasRichContentServices { false }; +#endif + HashSet<uint64_t> m_pagesInWindows; - WebCore::Timer<WebProcess> m_nonVisibleProcessCleanupTimer; + WebCore::Timer m_nonVisibleProcessCleanupTimer; + WebCore::Timer m_statisticsChangedTimer; + + RefPtr<WebCore::ApplicationCacheStorage> m_applicationCacheStorage; + +#if PLATFORM(IOS) + WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker; +#endif + + Ref<WebCore::ResourceLoadStatisticsStore> m_resourceLoadStatisticsStore; + + unsigned m_pagesMarkingLayersAsVolatile { 0 }; + bool m_suppressMemoryPressureHandler { false }; + + HashMap<WebCore::UserGestureToken *, uint64_t> m_userGestureTokens; + +#if PLATFORM(WAYLAND) + String m_waylandCompositorDisplayName; +#endif }; } // namespace WebKit - -#endif // WebProcess_h |