| 1 | /* |
| 2 | * Copyright (C) 2010-2016 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 | #pragma once |
| 27 | |
| 28 | #include "APIDictionary.h" |
| 29 | #include "APIObject.h" |
| 30 | #include "APIProcessPoolConfiguration.h" |
| 31 | #include "APIWebsiteDataStore.h" |
| 32 | #include "DownloadProxyMap.h" |
| 33 | #include "GenericCallback.h" |
| 34 | #include "HiddenPageThrottlingAutoIncreasesCounter.h" |
| 35 | #include "MessageReceiver.h" |
| 36 | #include "MessageReceiverMap.h" |
| 37 | #include "NetworkProcessProxy.h" |
| 38 | #include "PlugInAutoStartProvider.h" |
| 39 | #include "PluginInfoStore.h" |
| 40 | #include "ProcessThrottler.h" |
| 41 | #include "ServiceWorkerProcessProxy.h" |
| 42 | #include "StatisticsRequest.h" |
| 43 | #include "VisitedLinkStore.h" |
| 44 | #include "WebContextClient.h" |
| 45 | #include "WebContextConnectionClient.h" |
| 46 | #include "WebProcessProxy.h" |
| 47 | #include <WebCore/ProcessIdentifier.h> |
| 48 | #include <WebCore/RegistrableDomain.h> |
| 49 | #include <WebCore/SecurityOriginHash.h> |
| 50 | #include <WebCore/SharedStringHash.h> |
| 51 | #include <pal/SessionID.h> |
| 52 | #include <wtf/Forward.h> |
| 53 | #include <wtf/HashMap.h> |
| 54 | #include <wtf/HashSet.h> |
| 55 | #include <wtf/MemoryPressureHandler.h> |
| 56 | #include <wtf/RefCounter.h> |
| 57 | #include <wtf/RefPtr.h> |
| 58 | #include <wtf/text/StringHash.h> |
| 59 | #include <wtf/text/WTFString.h> |
| 60 | |
| 61 | #if ENABLE(MEDIA_SESSION) |
| 62 | #include "WebMediaSessionFocusManager.h" |
| 63 | #endif |
| 64 | |
| 65 | #if USE(SOUP) |
| 66 | #include <WebCore/SoupNetworkProxySettings.h> |
| 67 | #endif |
| 68 | |
| 69 | #if PLATFORM(COCOA) |
| 70 | OBJC_CLASS NSMutableDictionary; |
| 71 | OBJC_CLASS NSObject; |
| 72 | OBJC_CLASS NSString; |
| 73 | #endif |
| 74 | |
| 75 | #if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) |
| 76 | #include "DisplayLink.h" |
| 77 | #endif |
| 78 | |
| 79 | namespace API { |
| 80 | class AutomationClient; |
| 81 | class CustomProtocolManagerClient; |
| 82 | class DownloadClient; |
| 83 | class HTTPCookieStore; |
| 84 | class InjectedBundleClient; |
| 85 | class LegacyContextHistoryClient; |
| 86 | class Navigation; |
| 87 | class PageConfiguration; |
| 88 | } |
| 89 | |
| 90 | namespace WebCore { |
| 91 | struct MockMediaDevice; |
| 92 | } |
| 93 | |
| 94 | namespace WebKit { |
| 95 | |
| 96 | class DownloadProxy; |
| 97 | class HighPerformanceGraphicsUsageSampler; |
| 98 | class UIGamepad; |
| 99 | class PerActivityStateCPUUsageSampler; |
| 100 | class ServiceWorkerProcessProxy; |
| 101 | class WebAutomationSession; |
| 102 | class WebContextSupplement; |
| 103 | class WebPageGroup; |
| 104 | class WebPageProxy; |
| 105 | class WebProcessCache; |
| 106 | struct NetworkProcessCreationParameters; |
| 107 | struct StatisticsData; |
| 108 | struct WebProcessCreationParameters; |
| 109 | struct WebProcessDataStoreParameters; |
| 110 | |
| 111 | typedef GenericCallback<API::Dictionary*> DictionaryCallback; |
| 112 | |
| 113 | #if PLATFORM(COCOA) |
| 114 | int networkProcessLatencyQOS(); |
| 115 | int networkProcessThroughputQOS(); |
| 116 | int webProcessLatencyQOS(); |
| 117 | int webProcessThroughputQOS(); |
| 118 | #endif |
| 119 | |
| 120 | enum class ProcessSwapRequestedByClient; |
| 121 | |
| 122 | class WebProcessPool final : public API::ObjectImpl<API::Object::Type::ProcessPool>, public CanMakeWeakPtr<WebProcessPool>, private IPC::MessageReceiver { |
| 123 | public: |
| 124 | static Ref<WebProcessPool> create(API::ProcessPoolConfiguration&); |
| 125 | |
| 126 | explicit WebProcessPool(API::ProcessPoolConfiguration&); |
| 127 | virtual ~WebProcessPool(); |
| 128 | |
| 129 | void notifyThisWebProcessPoolWasCreated(); |
| 130 | |
| 131 | API::ProcessPoolConfiguration& configuration() { return m_configuration.get(); } |
| 132 | |
| 133 | static const Vector<WebProcessPool*>& allProcessPools(); |
| 134 | |
| 135 | template <typename T> |
| 136 | T* supplement() |
| 137 | { |
| 138 | return static_cast<T*>(m_supplements.get(T::supplementName())); |
| 139 | } |
| 140 | |
| 141 | template <typename T> |
| 142 | void addSupplement() |
| 143 | { |
| 144 | m_supplements.add(T::supplementName(), T::create(this)); |
| 145 | } |
| 146 | |
| 147 | void addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver&); |
| 148 | void addMessageReceiver(IPC::StringReference messageReceiverName, uint64_t destinationID, IPC::MessageReceiver&); |
| 149 | void removeMessageReceiver(IPC::StringReference messageReceiverName); |
| 150 | void removeMessageReceiver(IPC::StringReference messageReceiverName, uint64_t destinationID); |
| 151 | |
| 152 | bool dispatchMessage(IPC::Connection&, IPC::Decoder&); |
| 153 | bool dispatchSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&); |
| 154 | |
| 155 | void initializeClient(const WKContextClientBase*); |
| 156 | void setInjectedBundleClient(std::unique_ptr<API::InjectedBundleClient>&&); |
| 157 | void initializeConnectionClient(const WKContextConnectionClientBase*); |
| 158 | void setHistoryClient(std::unique_ptr<API::LegacyContextHistoryClient>&&); |
| 159 | void setDownloadClient(std::unique_ptr<API::DownloadClient>&&); |
| 160 | void setAutomationClient(std::unique_ptr<API::AutomationClient>&&); |
| 161 | void setLegacyCustomProtocolManagerClient(std::unique_ptr<API::CustomProtocolManagerClient>&&); |
| 162 | |
| 163 | void setCustomWebContentServiceBundleIdentifier(const String&); |
| 164 | const String& customWebContentServiceBundleIdentifier() { return m_configuration->customWebContentServiceBundleIdentifier(); } |
| 165 | |
| 166 | const Vector<RefPtr<WebProcessProxy>>& processes() const { return m_processes; } |
| 167 | |
| 168 | // WebProcessProxy object which does not have a running process which is used for convenience, to avoid |
| 169 | // null checks in WebPageProxy. |
| 170 | WebProcessProxy* dummyProcessProxy() const { return m_dummyProcessProxy; } |
| 171 | |
| 172 | // WebProcess or NetworkProcess as approporiate for current process model. The connection must be non-null. |
| 173 | IPC::Connection* networkingProcessConnection(); |
| 174 | |
| 175 | template<typename T> void sendToAllProcesses(const T& message); |
| 176 | template<typename T> void sendToAllProcessesRelaunchingThemIfNecessary(const T& message); |
| 177 | template<typename T> void sendToOneProcess(T&& message); |
| 178 | |
| 179 | // Sends the message to WebProcess or NetworkProcess as approporiate for current process model. |
| 180 | template<typename T> void sendToNetworkingProcess(T&& message); |
| 181 | template<typename T, typename U> void sendSyncToNetworkingProcess(T&& message, U&& reply); |
| 182 | template<typename T> void sendToNetworkingProcessRelaunchingIfNecessary(T&& message); |
| 183 | |
| 184 | void processDidFinishLaunching(WebProcessProxy*); |
| 185 | |
| 186 | WebProcessCache& webProcessCache() { return m_webProcessCache.get(); } |
| 187 | |
| 188 | // Disconnect the process from the context. |
| 189 | void disconnectProcess(WebProcessProxy*); |
| 190 | |
| 191 | API::WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); } |
| 192 | void setPrimaryDataStore(API::WebsiteDataStore& dataStore) { m_websiteDataStore = &dataStore; } |
| 193 | |
| 194 | Ref<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&); |
| 195 | |
| 196 | void pageBeginUsingWebsiteDataStore(uint64_t pageID, WebsiteDataStore&); |
| 197 | void pageEndUsingWebsiteDataStore(uint64_t pageID, WebsiteDataStore&); |
| 198 | bool hasPagesUsingWebsiteDataStore(WebsiteDataStore&) const; |
| 199 | |
| 200 | const String& injectedBundlePath() const { return m_configuration->injectedBundlePath(); } |
| 201 | |
| 202 | DownloadProxy& download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&, const String& suggestedFilename = { }); |
| 203 | DownloadProxy& resumeDownload(WebPageProxy* initiatingPage, const API::Data* resumeData, const String& path); |
| 204 | |
| 205 | void setInjectedBundleInitializationUserData(RefPtr<API::Object>&& userData) { m_injectedBundleInitializationUserData = WTFMove(userData); } |
| 206 | |
| 207 | void postMessageToInjectedBundle(const String&, API::Object*); |
| 208 | |
| 209 | void populateVisitedLinks(); |
| 210 | |
| 211 | void handleMemoryPressureWarning(Critical); |
| 212 | |
| 213 | #if ENABLE(NETSCAPE_PLUGIN_API) |
| 214 | void setAdditionalPluginsDirectory(const String&); |
| 215 | void refreshPlugins(); |
| 216 | |
| 217 | PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; } |
| 218 | |
| 219 | void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString); |
| 220 | void resetPluginLoadClientPolicies(HashMap<String, HashMap<String, HashMap<String, uint8_t>>>&&); |
| 221 | void clearPluginClientPolicies(); |
| 222 | const HashMap<String, HashMap<String, HashMap<String, uint8_t>>>& pluginLoadClientPolicies() const { return m_pluginLoadClientPolicies; } |
| 223 | #endif |
| 224 | |
| 225 | #if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) |
| 226 | void startDisplayLink(IPC::Connection&, unsigned observerID, uint32_t displayID); |
| 227 | void stopDisplayLink(IPC::Connection&, unsigned observerID, uint32_t displayID); |
| 228 | void stopDisplayLinks(IPC::Connection&); |
| 229 | #endif |
| 230 | |
| 231 | void addSupportedPlugin(String&& matchingDomain, String&& name, HashSet<String>&& mimeTypes, HashSet<String> extensions); |
| 232 | void clearSupportedPlugins(); |
| 233 | |
| 234 | ProcessID networkProcessIdentifier(); |
| 235 | ProcessID prewarmedProcessIdentifier(); |
| 236 | void activePagesOriginsInWebProcessForTesting(ProcessID, CompletionHandler<void(Vector<String>&&)>&&); |
| 237 | bool networkProcessHasEntitlementForTesting(const String&); |
| 238 | |
| 239 | WebPageGroup& defaultPageGroup() { return m_defaultPageGroup.get(); } |
| 240 | |
| 241 | void setAlwaysUsesComplexTextCodePath(bool); |
| 242 | void setShouldUseFontSmoothing(bool); |
| 243 | |
| 244 | void registerURLSchemeAsEmptyDocument(const String&); |
| 245 | void registerURLSchemeAsSecure(const String&); |
| 246 | void registerURLSchemeAsBypassingContentSecurityPolicy(const String&); |
| 247 | void setDomainRelaxationForbiddenForURLScheme(const String&); |
| 248 | void setCanHandleHTTPSServerTrustEvaluation(bool); |
| 249 | void registerURLSchemeAsLocal(const String&); |
| 250 | void registerURLSchemeAsNoAccess(const String&); |
| 251 | void registerURLSchemeAsDisplayIsolated(const String&); |
| 252 | void registerURLSchemeAsCORSEnabled(const String&); |
| 253 | void registerURLSchemeAsCachePartitioned(const String&); |
| 254 | void registerURLSchemeServiceWorkersCanHandle(const String&); |
| 255 | void registerURLSchemeAsCanDisplayOnlyIfCanRequest(const String&); |
| 256 | |
| 257 | void preconnectToServer(const URL&); |
| 258 | |
| 259 | VisitedLinkStore& visitedLinkStore() { return m_visitedLinkStore.get(); } |
| 260 | |
| 261 | void setCacheModel(CacheModel); |
| 262 | CacheModel cacheModel() const { return m_configuration->cacheModel(); } |
| 263 | |
| 264 | void setDefaultRequestTimeoutInterval(double); |
| 265 | |
| 266 | void startMemorySampler(const double interval); |
| 267 | void stopMemorySampler(); |
| 268 | |
| 269 | #if USE(SOUP) |
| 270 | void setInitialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicy policy) { m_initialHTTPCookieAcceptPolicy = policy; } |
| 271 | void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&); |
| 272 | #endif |
| 273 | void setEnhancedAccessibility(bool); |
| 274 | |
| 275 | // Downloads. |
| 276 | DownloadProxy& createDownloadProxy(const WebCore::ResourceRequest&, WebPageProxy* originatingPage); |
| 277 | API::DownloadClient& downloadClient() { return *m_downloadClient; } |
| 278 | |
| 279 | API::LegacyContextHistoryClient& historyClient() { return *m_historyClient; } |
| 280 | WebContextClient& client() { return m_client; } |
| 281 | |
| 282 | API::CustomProtocolManagerClient& customProtocolManagerClient() const { return *m_customProtocolManagerClient; } |
| 283 | |
| 284 | struct Statistics { |
| 285 | unsigned wkViewCount; |
| 286 | unsigned wkPageCount; |
| 287 | unsigned wkFrameCount; |
| 288 | }; |
| 289 | static Statistics& statistics(); |
| 290 | |
| 291 | void useTestingNetworkSession(); |
| 292 | bool isUsingTestingNetworkSession() const { return m_shouldUseTestingNetworkSession; } |
| 293 | |
| 294 | void setAllowsAnySSLCertificateForWebSocket(bool); |
| 295 | |
| 296 | void clearCachedCredentials(); |
| 297 | void terminateNetworkProcess(); |
| 298 | void sendNetworkProcessWillSuspendImminently(); |
| 299 | void sendNetworkProcessDidResume(); |
| 300 | void terminateServiceWorkerProcesses(); |
| 301 | void disableServiceWorkerProcessTerminationDelay(); |
| 302 | |
| 303 | void syncNetworkProcessCookies(); |
| 304 | |
| 305 | void setIDBPerOriginQuota(uint64_t); |
| 306 | |
| 307 | void setShouldMakeNextWebProcessLaunchFailForTesting(bool value) { m_shouldMakeNextWebProcessLaunchFailForTesting = value; } |
| 308 | bool shouldMakeNextWebProcessLaunchFailForTesting() const { return m_shouldMakeNextWebProcessLaunchFailForTesting; } |
| 309 | void setShouldMakeNextNetworkProcessLaunchFailForTesting(bool value) { m_shouldMakeNextNetworkProcessLaunchFailForTesting = value; } |
| 310 | bool shouldMakeNextNetworkProcessLaunchFailForTesting() const { return m_shouldMakeNextNetworkProcessLaunchFailForTesting; } |
| 311 | |
| 312 | void reportWebContentCPUTime(Seconds cpuTime, uint64_t activityState); |
| 313 | |
| 314 | void allowSpecificHTTPSCertificateForHost(const WebCertificateInfo*, const String& host); |
| 315 | |
| 316 | WebProcessProxy& processForRegistrableDomain(WebsiteDataStore&, WebPageProxy*, const WebCore::RegistrableDomain&); // Will return an existing one if limit is met or due to caching. |
| 317 | |
| 318 | void prewarmProcess(); |
| 319 | |
| 320 | bool shouldTerminate(WebProcessProxy*); |
| 321 | |
| 322 | void disableProcessTermination() { m_processTerminationEnabled = false; } |
| 323 | void enableProcessTermination(); |
| 324 | |
| 325 | void updateAutomationCapabilities() const; |
| 326 | void setAutomationSession(RefPtr<WebAutomationSession>&&); |
| 327 | WebAutomationSession* automationSession() const { return m_automationSession.get(); } |
| 328 | |
| 329 | // Defaults to false. |
| 330 | void setHTTPPipeliningEnabled(bool); |
| 331 | bool httpPipeliningEnabled() const; |
| 332 | |
| 333 | void getStatistics(uint32_t statisticsMask, Function<void (API::Dictionary*, CallbackBase::Error)>&&); |
| 334 | |
| 335 | bool javaScriptConfigurationFileEnabled() { return m_javaScriptConfigurationFileEnabled; } |
| 336 | void setJavaScriptConfigurationFileEnabled(bool flag); |
| 337 | #if PLATFORM(IOS_FAMILY) |
| 338 | void setJavaScriptConfigurationFileEnabledFromDefaults(); |
| 339 | #endif |
| 340 | |
| 341 | void garbageCollectJavaScriptObjects(); |
| 342 | void setJavaScriptGarbageCollectorTimerEnabled(bool flag); |
| 343 | |
| 344 | #if PLATFORM(COCOA) |
| 345 | static bool omitPDFSupport(); |
| 346 | #endif |
| 347 | |
| 348 | void fullKeyboardAccessModeChanged(bool fullKeyboardAccessEnabled); |
| 349 | #if OS(LINUX) |
| 350 | void sendMemoryPressureEvent(bool isCritical); |
| 351 | #endif |
| 352 | void textCheckerStateChanged(); |
| 353 | |
| 354 | Ref<API::Dictionary> plugInAutoStartOriginHashes() const; |
| 355 | void setPlugInAutoStartOriginHashes(API::Dictionary&); |
| 356 | void setPlugInAutoStartOrigins(API::Array&); |
| 357 | void setPlugInAutoStartOriginsFilteringOutEntriesAddedAfterTime(API::Dictionary&, WallTime); |
| 358 | |
| 359 | // Network Process Management |
| 360 | NetworkProcessProxy& ensureNetworkProcess(WebsiteDataStore* withWebsiteDataStore = nullptr); |
| 361 | NetworkProcessProxy* networkProcess() { return m_networkProcess.get(); } |
| 362 | void networkProcessCrashed(NetworkProcessProxy&, Vector<std::pair<RefPtr<WebProcessProxy>, Messages::WebProcessProxy::GetNetworkProcessConnection::DelayedReply>>&&); |
| 363 | |
| 364 | void getNetworkProcessConnection(WebProcessProxy&, Messages::WebProcessProxy::GetNetworkProcessConnection::DelayedReply&&); |
| 365 | |
| 366 | #if ENABLE(SERVICE_WORKER) |
| 367 | void establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy&, WebCore::RegistrableDomain&&, Optional<PAL::SessionID>); |
| 368 | ServiceWorkerProcessProxy* serviceWorkerProcessProxyFromPageID(uint64_t pageID) const; |
| 369 | const HashMap<WebCore::RegistrableDomain, ServiceWorkerProcessProxy*>& serviceWorkerProxies() const { return m_serviceWorkerProcesses; } |
| 370 | void setAllowsAnySSLCertificateForServiceWorker(bool allows) { m_allowsAnySSLCertificateForServiceWorker = allows; } |
| 371 | bool allowsAnySSLCertificateForServiceWorker() const { return m_allowsAnySSLCertificateForServiceWorker; } |
| 372 | void updateServiceWorkerUserAgent(const String& userAgent); |
| 373 | bool mayHaveRegisteredServiceWorkers(const WebsiteDataStore&); |
| 374 | #endif |
| 375 | |
| 376 | #if PLATFORM(COCOA) |
| 377 | bool processSuppressionEnabled() const; |
| 378 | #endif |
| 379 | |
| 380 | void windowServerConnectionStateChanged(); |
| 381 | |
| 382 | static void willStartUsingPrivateBrowsing(); |
| 383 | static void willStopUsingPrivateBrowsing(); |
| 384 | |
| 385 | #if USE(SOUP) |
| 386 | void setIgnoreTLSErrors(bool); |
| 387 | bool ignoreTLSErrors() const { return m_ignoreTLSErrors; } |
| 388 | #endif |
| 389 | |
| 390 | static void setInvalidMessageCallback(void (*)(WKStringRef)); |
| 391 | static void didReceiveInvalidMessage(const IPC::StringReference& messageReceiverName, const IPC::StringReference& messageName); |
| 392 | |
| 393 | void processDidCachePage(WebProcessProxy*); |
| 394 | |
| 395 | bool isURLKnownHSTSHost(const String& urlString, bool privateBrowsingEnabled) const; |
| 396 | void resetHSTSHosts(); |
| 397 | void resetHSTSHostsAddedAfterDate(double startDateIntervalSince1970); |
| 398 | |
| 399 | void registerSchemeForCustomProtocol(const String&); |
| 400 | void unregisterSchemeForCustomProtocol(const String&); |
| 401 | |
| 402 | static void registerGlobalURLSchemeAsHavingCustomProtocolHandlers(const String&); |
| 403 | static void unregisterGlobalURLSchemeAsHavingCustomProtocolHandlers(const String&); |
| 404 | |
| 405 | #if PLATFORM(COCOA) |
| 406 | void updateProcessSuppressionState(); |
| 407 | |
| 408 | NSMutableDictionary *ensureBundleParameters(); |
| 409 | NSMutableDictionary *bundleParameters() { return m_bundleParameters.get(); } |
| 410 | #else |
| 411 | void updateProcessSuppressionState() const { } |
| 412 | #endif |
| 413 | |
| 414 | void updateHiddenPageThrottlingAutoIncreaseLimit(); |
| 415 | |
| 416 | void setMemoryCacheDisabled(bool); |
| 417 | void setFontWhitelist(API::Array*); |
| 418 | |
| 419 | UserObservablePageCounter::Token userObservablePageCount() |
| 420 | { |
| 421 | return m_userObservablePageCounter.count(); |
| 422 | } |
| 423 | |
| 424 | ProcessSuppressionDisabledToken processSuppressionDisabledForPageCount() |
| 425 | { |
| 426 | return m_processSuppressionDisabledForPageCounter.count(); |
| 427 | } |
| 428 | |
| 429 | HiddenPageThrottlingAutoIncreasesCounter::Token hiddenPageThrottlingAutoIncreasesCount() |
| 430 | { |
| 431 | return m_hiddenPageThrottlingAutoIncreasesCounter.count(); |
| 432 | } |
| 433 | |
| 434 | void setResourceLoadStatisticsEnabled(bool); |
| 435 | void clearResourceLoadStatistics(); |
| 436 | |
| 437 | bool alwaysRunsAtBackgroundPriority() const { return m_alwaysRunsAtBackgroundPriority; } |
| 438 | bool shouldTakeUIBackgroundAssertion() const { return m_shouldTakeUIBackgroundAssertion; } |
| 439 | |
| 440 | void synthesizeAppIsBackground(bool background); |
| 441 | |
| 442 | #if ENABLE(GAMEPAD) |
| 443 | void gamepadConnected(const UIGamepad&); |
| 444 | void gamepadDisconnected(const UIGamepad&); |
| 445 | |
| 446 | void setInitialConnectedGamepads(const Vector<std::unique_ptr<UIGamepad>>&); |
| 447 | #endif |
| 448 | |
| 449 | #if PLATFORM(COCOA) |
| 450 | bool cookieStoragePartitioningEnabled() const { return m_cookieStoragePartitioningEnabled; } |
| 451 | void setCookieStoragePartitioningEnabled(bool); |
| 452 | bool storageAccessAPIEnabled() const { return m_storageAccessAPIEnabled; } |
| 453 | void setStorageAccessAPIEnabled(bool); |
| 454 | #endif |
| 455 | |
| 456 | #if ENABLE(SERVICE_WORKER) |
| 457 | void postMessageToServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier& destinationIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerIdentifier sourceIdentifier, const String& sourceOrigin); |
| 458 | void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destination, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source, WebCore::SWServerConnectionIdentifier); |
| 459 | #endif |
| 460 | |
| 461 | static uint64_t registerProcessPoolCreationListener(Function<void(WebProcessPool&)>&&); |
| 462 | static void unregisterProcessPoolCreationListener(uint64_t identifier); |
| 463 | |
| 464 | #if PLATFORM(IOS_FAMILY) |
| 465 | ForegroundWebProcessToken foregroundWebProcessToken() const { return ForegroundWebProcessToken(m_foregroundWebProcessCounter.count()); } |
| 466 | BackgroundWebProcessToken backgroundWebProcessToken() const { return BackgroundWebProcessToken(m_backgroundWebProcessCounter.count()); } |
| 467 | #endif |
| 468 | |
| 469 | void processForNavigation(WebPageProxy&, const API::Navigation&, Ref<WebProcessProxy>&& sourceProcess, const URL& sourceURL, ProcessSwapRequestedByClient, Ref<WebsiteDataStore>&&, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&&); |
| 470 | |
| 471 | // SuspendedPageProxy management. |
| 472 | void addSuspendedPage(std::unique_ptr<SuspendedPageProxy>&&); |
| 473 | void removeAllSuspendedPagesForPage(WebPageProxy&, WebProcessProxy* = nullptr); |
| 474 | std::unique_ptr<SuspendedPageProxy> takeSuspendedPage(SuspendedPageProxy&); |
| 475 | void removeSuspendedPage(SuspendedPageProxy&); |
| 476 | bool hasSuspendedPageFor(WebProcessProxy&, WebPageProxy&) const; |
| 477 | unsigned maxSuspendedPageCount() const { return m_maxSuspendedPageCount; } |
| 478 | RefPtr<WebProcessProxy> findReusableSuspendedPageProcess(const WebCore::RegistrableDomain&, WebPageProxy&, WebsiteDataStore&); |
| 479 | |
| 480 | void clearSuspendedPages(AllowProcessCaching); |
| 481 | |
| 482 | void didReachGoodTimeToPrewarm(); |
| 483 | |
| 484 | void didCollectPrewarmInformation(const WebCore::RegistrableDomain&, const WebCore::PrewarmInformation&); |
| 485 | |
| 486 | void screenPropertiesStateChanged(); |
| 487 | |
| 488 | void addMockMediaDevice(const WebCore::MockMediaDevice&); |
| 489 | void clearMockMediaDevices(); |
| 490 | void removeMockMediaDevice(const String& persistentId); |
| 491 | void resetMockMediaDevices(); |
| 492 | |
| 493 | void sendDisplayConfigurationChangedMessageForTesting(); |
| 494 | void clearCurrentModifierStateForTesting(); |
| 495 | |
| 496 | void committedCrossSiteLoadWithLinkDecoration(PAL::SessionID, const WebCore::RegistrableDomain& fromDomain, const WebCore::RegistrableDomain& toDomain, uint64_t pageID); |
| 497 | |
| 498 | #if PLATFORM(GTK) || PLATFORM(WPE) |
| 499 | void setSandboxEnabled(bool enabled) { m_sandboxEnabled = enabled; }; |
| 500 | void addSandboxPath(const CString& path, SandboxPermission permission) { m_extraSandboxPaths.add(path, permission); }; |
| 501 | const HashMap<CString, SandboxPermission>& sandboxPaths() const { return m_extraSandboxPaths; }; |
| 502 | bool sandboxEnabled() const { return m_sandboxEnabled; }; |
| 503 | #endif |
| 504 | |
| 505 | void setWebProcessHasUploads(WebCore::ProcessIdentifier); |
| 506 | void clearWebProcessHasUploads(WebCore::ProcessIdentifier); |
| 507 | |
| 508 | void setWebProcessIsPlayingAudibleMedia(WebCore::ProcessIdentifier); |
| 509 | void clearWebProcessIsPlayingAudibleMedia(WebCore::ProcessIdentifier); |
| 510 | |
| 511 | void disableDelayedWebProcessLaunch() { m_isDelayedWebProcessLaunchDisabled = true; } |
| 512 | |
| 513 | private: |
| 514 | void platformInitialize(); |
| 515 | |
| 516 | void platformInitializeWebProcess(WebProcessCreationParameters&); |
| 517 | void platformInvalidateContext(); |
| 518 | |
| 519 | void processForNavigationInternal(WebPageProxy&, const API::Navigation&, Ref<WebProcessProxy>&& sourceProcess, const URL& sourceURL, ProcessSwapRequestedByClient, Ref<WebsiteDataStore>&&, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&&); |
| 520 | |
| 521 | RefPtr<WebProcessProxy> tryTakePrewarmedProcess(WebsiteDataStore&); |
| 522 | |
| 523 | WebProcessProxy& createNewWebProcess(WebsiteDataStore*, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No); |
| 524 | void initializeNewWebProcess(WebProcessProxy&, WebsiteDataStore*, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No); |
| 525 | void sendWebProcessDataStoreParameters(WebProcessProxy&, WebsiteDataStore&); |
| 526 | |
| 527 | void requestWebContentStatistics(StatisticsRequest&); |
| 528 | void requestNetworkingStatistics(StatisticsRequest&); |
| 529 | |
| 530 | void platformInitializeNetworkProcess(NetworkProcessCreationParameters&); |
| 531 | |
| 532 | void handleMessage(IPC::Connection&, const String& messageName, const UserData& messageBody); |
| 533 | void handleSynchronousMessage(IPC::Connection&, const String& messageName, const UserData& messageBody, CompletionHandler<void(UserData&&)>&&); |
| 534 | |
| 535 | void didGetStatistics(const StatisticsData&, uint64_t callbackID); |
| 536 | |
| 537 | #if ENABLE(GAMEPAD) |
| 538 | void startedUsingGamepads(IPC::Connection&); |
| 539 | void stoppedUsingGamepads(IPC::Connection&); |
| 540 | |
| 541 | void processStoppedUsingGamepads(WebProcessProxy&); |
| 542 | #endif |
| 543 | |
| 544 | void reinstateNetworkProcessAssertionState(NetworkProcessProxy&); |
| 545 | void updateProcessAssertions(); |
| 546 | |
| 547 | // IPC::MessageReceiver. |
| 548 | // Implemented in generated WebProcessPoolMessageReceiver.cpp |
| 549 | void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; |
| 550 | void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override; |
| 551 | |
| 552 | static void languageChanged(void* context); |
| 553 | void languageChanged(); |
| 554 | |
| 555 | bool usesSingleWebProcess() const { return m_configuration->usesSingleWebProcess(); } |
| 556 | |
| 557 | #if PLATFORM(IOS_FAMILY) |
| 558 | String cookieStorageDirectory() const; |
| 559 | #endif |
| 560 | |
| 561 | #if PLATFORM(IOS_FAMILY) |
| 562 | String parentBundleDirectory() const; |
| 563 | String networkingCachesDirectory() const; |
| 564 | String webContentCachesDirectory() const; |
| 565 | String containerTemporaryDirectory() const; |
| 566 | #endif |
| 567 | |
| 568 | #if PLATFORM(COCOA) |
| 569 | void registerNotificationObservers(); |
| 570 | void unregisterNotificationObservers(); |
| 571 | #endif |
| 572 | |
| 573 | void setApplicationIsActive(bool); |
| 574 | |
| 575 | void addPlugInAutoStartOriginHash(const String& pageOrigin, unsigned plugInOriginHash, PAL::SessionID); |
| 576 | void plugInDidReceiveUserInteraction(unsigned plugInOriginHash, PAL::SessionID); |
| 577 | |
| 578 | void setAnyPageGroupMightHavePrivateBrowsingEnabled(bool); |
| 579 | |
| 580 | void resolvePathsForSandboxExtensions(); |
| 581 | void platformResolvePathsForSandboxExtensions(); |
| 582 | |
| 583 | void addProcessToOriginCacheSet(WebProcessProxy&, const URL&); |
| 584 | void removeProcessFromOriginCacheSet(WebProcessProxy&); |
| 585 | |
| 586 | void tryPrewarmWithDomainInformation(WebProcessProxy&, const WebCore::RegistrableDomain&); |
| 587 | |
| 588 | void updateMaxSuspendedPageCount(); |
| 589 | |
| 590 | #if PLATFORM(IOS) |
| 591 | static float displayBrightness(); |
| 592 | static void backlightLevelDidChangeCallback(CFNotificationCenterRef, void *observer, CFStringRef name, const void *, CFDictionaryRef userInfo); |
| 593 | #endif |
| 594 | |
| 595 | Ref<API::ProcessPoolConfiguration> m_configuration; |
| 596 | |
| 597 | IPC::MessageReceiverMap m_messageReceiverMap; |
| 598 | |
| 599 | Vector<RefPtr<WebProcessProxy>> m_processes; |
| 600 | WebProcessProxy* m_prewarmedProcess { nullptr }; |
| 601 | WebProcessProxy* m_dummyProcessProxy { nullptr }; // A lightweight WebProcessProxy without backing process. |
| 602 | |
| 603 | WebProcessProxy* m_processWithPageCache { nullptr }; |
| 604 | #if ENABLE(SERVICE_WORKER) |
| 605 | HashMap<WebCore::RegistrableDomain, ServiceWorkerProcessProxy*> m_serviceWorkerProcesses; |
| 606 | bool m_waitingForWorkerContextProcessConnection { false }; |
| 607 | bool m_allowsAnySSLCertificateForServiceWorker { false }; |
| 608 | bool m_shouldDisableServiceWorkerProcessTerminationDelay { false }; |
| 609 | String m_serviceWorkerUserAgent; |
| 610 | Optional<WebPreferencesStore> m_serviceWorkerPreferences; |
| 611 | HashMap<String, bool> m_mayHaveRegisteredServiceWorkers; |
| 612 | #endif |
| 613 | |
| 614 | Ref<WebPageGroup> m_defaultPageGroup; |
| 615 | |
| 616 | RefPtr<API::Object> m_injectedBundleInitializationUserData; |
| 617 | std::unique_ptr<API::InjectedBundleClient> m_injectedBundleClient; |
| 618 | |
| 619 | WebContextClient m_client; |
| 620 | WebContextConnectionClient m_connectionClient; |
| 621 | std::unique_ptr<API::AutomationClient> m_automationClient; |
| 622 | std::unique_ptr<API::DownloadClient> m_downloadClient; |
| 623 | std::unique_ptr<API::LegacyContextHistoryClient> m_historyClient; |
| 624 | std::unique_ptr<API::CustomProtocolManagerClient> m_customProtocolManagerClient; |
| 625 | |
| 626 | RefPtr<WebAutomationSession> m_automationSession; |
| 627 | |
| 628 | #if ENABLE(NETSCAPE_PLUGIN_API) |
| 629 | PluginInfoStore m_pluginInfoStore; |
| 630 | #endif |
| 631 | Ref<VisitedLinkStore> m_visitedLinkStore; |
| 632 | bool m_visitedLinksPopulated { false }; |
| 633 | |
| 634 | PlugInAutoStartProvider m_plugInAutoStartProvider { this }; |
| 635 | |
| 636 | HashSet<String> m_schemesToRegisterAsEmptyDocument; |
| 637 | HashSet<String> m_schemesToRegisterAsSecure; |
| 638 | HashSet<String> m_schemesToRegisterAsBypassingContentSecurityPolicy; |
| 639 | HashSet<String> m_schemesToSetDomainRelaxationForbiddenFor; |
| 640 | HashSet<String> m_schemesToRegisterAsLocal; |
| 641 | HashSet<String> m_schemesToRegisterAsNoAccess; |
| 642 | HashSet<String> m_schemesToRegisterAsDisplayIsolated; |
| 643 | HashSet<String> m_schemesToRegisterAsCORSEnabled; |
| 644 | HashSet<String> m_schemesToRegisterAsAlwaysRevalidated; |
| 645 | HashSet<String> m_schemesToRegisterAsCachePartitioned; |
| 646 | HashSet<String> m_schemesServiceWorkersCanHandle; |
| 647 | HashSet<String> m_schemesToRegisterAsCanDisplayOnlyIfCanRequest; |
| 648 | |
| 649 | bool m_alwaysUsesComplexTextCodePath { false }; |
| 650 | bool m_shouldUseFontSmoothing { true }; |
| 651 | |
| 652 | Vector<String> m_fontWhitelist; |
| 653 | |
| 654 | // Messages that were posted before any pages were created. |
| 655 | // The client should use initialization messages instead, so that a restarted process would get the same state. |
| 656 | Vector<std::pair<String, RefPtr<API::Object>>> m_messagesToInjectedBundlePostedToEmptyContext; |
| 657 | |
| 658 | bool m_memorySamplerEnabled { false }; |
| 659 | double m_memorySamplerInterval { 1400.0 }; |
| 660 | |
| 661 | RefPtr<API::WebsiteDataStore> m_websiteDataStore; |
| 662 | |
| 663 | typedef HashMap<const char*, RefPtr<WebContextSupplement>, PtrHash<const char*>> WebContextSupplementMap; |
| 664 | WebContextSupplementMap m_supplements; |
| 665 | |
| 666 | #if USE(SOUP) |
| 667 | HTTPCookieAcceptPolicy m_initialHTTPCookieAcceptPolicy { HTTPCookieAcceptPolicyOnlyFromMainDocumentDomain }; |
| 668 | WebCore::SoupNetworkProxySettings m_networkProxySettings; |
| 669 | #endif |
| 670 | HashSet<String, ASCIICaseInsensitiveHash> m_urlSchemesRegisteredForCustomProtocols; |
| 671 | |
| 672 | #if PLATFORM(MAC) |
| 673 | RetainPtr<NSObject> m_enhancedAccessibilityObserver; |
| 674 | RetainPtr<NSObject> m_automaticTextReplacementNotificationObserver; |
| 675 | RetainPtr<NSObject> m_automaticSpellingCorrectionNotificationObserver; |
| 676 | RetainPtr<NSObject> m_automaticQuoteSubstitutionNotificationObserver; |
| 677 | RetainPtr<NSObject> m_automaticDashSubstitutionNotificationObserver; |
| 678 | RetainPtr<NSObject> m_accessibilityDisplayOptionsNotificationObserver; |
| 679 | #if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) |
| 680 | RetainPtr<NSObject> m_scrollerStyleNotificationObserver; |
| 681 | #endif |
| 682 | RetainPtr<NSObject> m_activationObserver; |
| 683 | RetainPtr<NSObject> m_deactivationObserver; |
| 684 | |
| 685 | std::unique_ptr<HighPerformanceGraphicsUsageSampler> m_highPerformanceGraphicsUsageSampler; |
| 686 | std::unique_ptr<PerActivityStateCPUUsageSampler> m_perActivityStateCPUUsageSampler; |
| 687 | #endif |
| 688 | |
| 689 | #if PLATFORM(IOS_FAMILY) |
| 690 | RetainPtr<NSObject> m_accessibilityEnabledObserver; |
| 691 | #endif |
| 692 | |
| 693 | bool m_shouldUseTestingNetworkSession { false }; |
| 694 | |
| 695 | bool m_processTerminationEnabled { true }; |
| 696 | |
| 697 | bool m_canHandleHTTPSServerTrustEvaluation { true }; |
| 698 | bool m_didNetworkProcessCrash { false }; |
| 699 | std::unique_ptr<NetworkProcessProxy> m_networkProcess; |
| 700 | |
| 701 | HashMap<uint64_t, RefPtr<DictionaryCallback>> m_dictionaryCallbacks; |
| 702 | HashMap<uint64_t, RefPtr<StatisticsRequest>> m_statisticsRequests; |
| 703 | |
| 704 | #if USE(SOUP) |
| 705 | bool m_ignoreTLSErrors { true }; |
| 706 | #endif |
| 707 | |
| 708 | bool m_memoryCacheDisabled { false }; |
| 709 | bool m_javaScriptConfigurationFileEnabled { false }; |
| 710 | bool m_alwaysRunsAtBackgroundPriority; |
| 711 | bool m_shouldTakeUIBackgroundAssertion; |
| 712 | bool m_shouldMakeNextWebProcessLaunchFailForTesting { false }; |
| 713 | bool m_shouldMakeNextNetworkProcessLaunchFailForTesting { false }; |
| 714 | |
| 715 | UserObservablePageCounter m_userObservablePageCounter; |
| 716 | ProcessSuppressionDisabledCounter m_processSuppressionDisabledForPageCounter; |
| 717 | HiddenPageThrottlingAutoIncreasesCounter m_hiddenPageThrottlingAutoIncreasesCounter; |
| 718 | RunLoop::Timer<WebProcessPool> m_hiddenPageThrottlingTimer; |
| 719 | |
| 720 | #if PLATFORM(COCOA) |
| 721 | RetainPtr<NSMutableDictionary> m_bundleParameters; |
| 722 | ProcessSuppressionDisabledToken m_pluginProcessManagerProcessSuppressionDisabledToken; |
| 723 | #endif |
| 724 | |
| 725 | #if ENABLE(CONTENT_EXTENSIONS) |
| 726 | HashMap<String, String> m_encodedContentExtensions; |
| 727 | #endif |
| 728 | |
| 729 | #if ENABLE(NETSCAPE_PLUGIN_API) |
| 730 | HashMap<String, HashMap<String, HashMap<String, uint8_t>>> m_pluginLoadClientPolicies; |
| 731 | #endif |
| 732 | |
| 733 | #if ENABLE(GAMEPAD) |
| 734 | HashSet<WebProcessProxy*> m_processesUsingGamepads; |
| 735 | #endif |
| 736 | |
| 737 | #if PLATFORM(COCOA) |
| 738 | bool m_cookieStoragePartitioningEnabled { false }; |
| 739 | bool m_storageAccessAPIEnabled { false }; |
| 740 | #endif |
| 741 | |
| 742 | struct Paths { |
| 743 | String injectedBundlePath; |
| 744 | String applicationCacheDirectory; |
| 745 | String webSQLDatabaseDirectory; |
| 746 | String mediaCacheDirectory; |
| 747 | String mediaKeyStorageDirectory; |
| 748 | String uiProcessBundleResourcePath; |
| 749 | String indexedDatabaseDirectory; |
| 750 | |
| 751 | #if PLATFORM(IOS_FAMILY) |
| 752 | String cookieStorageDirectory; |
| 753 | String containerCachesDirectory; |
| 754 | String containerTemporaryDirectory; |
| 755 | #endif |
| 756 | |
| 757 | Vector<String> additionalWebProcessSandboxExtensionPaths; |
| 758 | }; |
| 759 | Paths m_resolvedPaths; |
| 760 | |
| 761 | HashMap<PAL::SessionID, HashSet<uint64_t>> m_sessionToPageIDsMap; |
| 762 | RunLoop::Timer<WebProcessPool> m_serviceWorkerProcessesTerminationTimer; |
| 763 | |
| 764 | #if PLATFORM(IOS_FAMILY) |
| 765 | ForegroundWebProcessCounter m_foregroundWebProcessCounter; |
| 766 | BackgroundWebProcessCounter m_backgroundWebProcessCounter; |
| 767 | ProcessThrottler::ForegroundActivityToken m_foregroundTokenForNetworkProcess; |
| 768 | ProcessThrottler::BackgroundActivityToken m_backgroundTokenForNetworkProcess; |
| 769 | #if ENABLE(SERVICE_WORKER) |
| 770 | HashMap<WebCore::RegistrableDomain, ProcessThrottler::ForegroundActivityToken> m_foregroundTokensForServiceWorkerProcesses; |
| 771 | HashMap<WebCore::RegistrableDomain, ProcessThrottler::BackgroundActivityToken> m_backgroundTokensForServiceWorkerProcesses; |
| 772 | #endif |
| 773 | #endif |
| 774 | |
| 775 | Deque<std::unique_ptr<SuspendedPageProxy>> m_suspendedPages; |
| 776 | unsigned m_maxSuspendedPageCount { 0 }; |
| 777 | |
| 778 | UniqueRef<WebProcessCache> m_webProcessCache; |
| 779 | HashMap<WebCore::RegistrableDomain, RefPtr<WebProcessProxy>> m_swappedProcessesPerRegistrableDomain; |
| 780 | |
| 781 | HashMap<WebCore::RegistrableDomain, std::unique_ptr<WebCore::PrewarmInformation>> m_prewarmInformationPerRegistrableDomain; |
| 782 | |
| 783 | #if PLATFORM(MAC) && ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) |
| 784 | Vector<std::unique_ptr<DisplayLink>> m_displayLinks; |
| 785 | #endif |
| 786 | |
| 787 | #if PLATFORM(GTK) || PLATFORM(WPE) |
| 788 | bool m_sandboxEnabled { false }; |
| 789 | HashMap<CString, SandboxPermission> m_extraSandboxPaths; |
| 790 | #endif |
| 791 | |
| 792 | HashMap<WebCore::ProcessIdentifier, std::unique_ptr<ProcessAssertion>> m_processesWithUploads; |
| 793 | std::unique_ptr<ProcessAssertion> m_uiProcessUploadAssertion; |
| 794 | |
| 795 | HashMap<WebCore::ProcessIdentifier, std::unique_ptr<ProcessAssertion>> m_processesPlayingAudibleMedia; |
| 796 | std::unique_ptr<ProcessAssertion> m_uiProcessMediaPlaybackAssertion; |
| 797 | |
| 798 | #if PLATFORM(IOS) |
| 799 | // FIXME: Delayed process launch is currently disabled on iOS for performance reasons (rdar://problem/49074131). |
| 800 | bool m_isDelayedWebProcessLaunchDisabled { true }; |
| 801 | #else |
| 802 | bool m_isDelayedWebProcessLaunchDisabled { false }; |
| 803 | #endif |
| 804 | }; |
| 805 | |
| 806 | template<typename T> |
| 807 | void WebProcessPool::sendToNetworkingProcess(T&& message) |
| 808 | { |
| 809 | if (m_networkProcess && m_networkProcess->canSendMessage()) |
| 810 | m_networkProcess->send(std::forward<T>(message), 0); |
| 811 | } |
| 812 | |
| 813 | template<typename T> |
| 814 | void WebProcessPool::sendToNetworkingProcessRelaunchingIfNecessary(T&& message) |
| 815 | { |
| 816 | ensureNetworkProcess(); |
| 817 | m_networkProcess->send(std::forward<T>(message), 0); |
| 818 | } |
| 819 | |
| 820 | template<typename T> |
| 821 | void WebProcessPool::sendToAllProcesses(const T& message) |
| 822 | { |
| 823 | size_t processCount = m_processes.size(); |
| 824 | for (size_t i = 0; i < processCount; ++i) { |
| 825 | WebProcessProxy* process = m_processes[i].get(); |
| 826 | if (process->canSendMessage()) |
| 827 | process->send(T(message), 0); |
| 828 | } |
| 829 | } |
| 830 | |
| 831 | template<typename T> |
| 832 | void WebProcessPool::sendToAllProcessesRelaunchingThemIfNecessary(const T& message) |
| 833 | { |
| 834 | // FIXME (Multi-WebProcess): WebProcessPool doesn't track processes that have exited, so it cannot relaunch these. Perhaps this functionality won't be needed in this mode. |
| 835 | sendToAllProcesses(message); |
| 836 | } |
| 837 | |
| 838 | template<typename T> |
| 839 | void WebProcessPool::sendToOneProcess(T&& message) |
| 840 | { |
| 841 | bool messageSent = false; |
| 842 | size_t processCount = m_processes.size(); |
| 843 | for (size_t i = 0; i < processCount; ++i) { |
| 844 | WebProcessProxy* process = m_processes[i].get(); |
| 845 | if (process->canSendMessage()) { |
| 846 | process->send(std::forward<T>(message), 0); |
| 847 | messageSent = true; |
| 848 | break; |
| 849 | } |
| 850 | } |
| 851 | |
| 852 | if (!messageSent) { |
| 853 | prewarmProcess(); |
| 854 | RefPtr<WebProcessProxy> process = m_processes.last(); |
| 855 | if (process->canSendMessage()) |
| 856 | process->send(std::forward<T>(message), 0); |
| 857 | } |
| 858 | } |
| 859 | |
| 860 | } // namespace WebKit |
| 861 | |