165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcess.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "AuthenticationManager.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DownloadManager.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedBundle.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedBundleMessageKinds.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedBundleUserMessageCoders.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "RunLoop.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "SandboxExtension.h"
3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebApplicationCacheManager.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContextMessages.h"
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebCookieManager.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h"
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebDatabaseManager.h"
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFrame.h"
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebGeolocationManagerMessages.h"
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebKeyValueStorageManager.h"
442bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebMediaCacheManager.h"
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebMemorySampler.h"
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPage.h"
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageCreationParameters.h"
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPlatformStrategies.h"
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPreferencesStore.h"
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessCreationParameters.h"
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessMessages.h"
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessProxyMessages.h"
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebResourceCacheManager.h"
542bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/AXObjectCache.h>
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/ApplicationCacheStorage.h>
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/CrossOriginPreflightResultCache.h>
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Font.h>
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Language.h>
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/Logging.h>
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/MemoryCache.h>
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Page.h>
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <WebCore/PageCache.h>
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/PageGroup.h>
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/ResourceHandle.h>
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/SchemeRegistry.h>
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/SecurityOrigin.h>
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Settings.h>
682bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/StorageTracker.h>
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h>
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RandomNumber.h>
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/GCController.h>
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !OS(WINDOWS)
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <unistd.h>
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if !ENABLE(PLUGIN_PROCESS)
8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "NetscapePluginModule.h"
8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if OS(WINDOWS)
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void sleep(unsigned seconds)
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::Sleep(seconds * 1000);
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void* randomCrashThread(void*)
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This delay was chosen semi-arbitrarily. We want the crash to happen somewhat quickly to
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // enable useful stress testing, but not so quickly that the web process will always crash soon
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // after launch.
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static const unsigned maximumRandomCrashDelay = 180;
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    sleep(randomNumber() * maximumRandomCrashDelay);
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CRASH();
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void startRandomCrashThreadIfRequested()
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!getenv("WEBKIT2_CRASH_WEB_PROCESS_RANDOMLY"))
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    createThread(randomCrashThread, 0, "WebKit2: Random Crash Thread");
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebProcess& WebProcess::shared()
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static WebProcess& process = *new WebProcess;
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return process;
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic const double shutdownTimeout = 60;
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebProcess::WebProcess()
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : ChildProcess(shutdownTimeout)
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_inDidClose(false)
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_hasSetCacheModel(false)
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_cacheModel(CacheModelDocumentViewer)
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC)
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_compositingRenderServerPort(MACH_PORT_NULL)
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(QT)
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_networkAccessManager(0)
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_textCheckerState()
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_geolocationManager(this)
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_iconDatabaseProxy(this)
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(PLATFORM_STRATEGIES)
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Initialize our platform strategies.
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPlatformStrategies::initialize();
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // USE(PLATFORM_STRATEGIES)
14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    WebCore::InitializeLoggingChannelsIfNecessary();
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::initialize(CoreIPC::Connection::Identifier serverIdentifier, RunLoop* runLoop)
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_connection);
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = CoreIPC::Connection::createClientConnection(serverIdentifier, this, runLoop);
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_connection->setDidCloseOnConnectionWorkQueueCallback(didCloseOnConnectionWorkQueue);
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_connection->setShouldExitOnSyncMessageSendFailure(true);
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->open();
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_runLoop = runLoop;
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    startRandomCrashThreadIfRequested();
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::initializeWebProcess(const WebProcessCreationParameters& parameters, CoreIPC::ArgumentDecoder* arguments)
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_pageMap.isEmpty());
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    platformInitializeWebProcess(parameters, arguments);
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<APIObject> injectedBundleInitializationUserData;
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    InjectedBundleUserMessageDecoder messageDecoder(injectedBundleInitializationUserData);
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!arguments->decode(messageDecoder))
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parameters.injectedBundlePath.isEmpty()) {
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_injectedBundle = InjectedBundle::create(parameters.injectedBundlePath);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_injectedBundle->setSandboxExtension(SandboxExtension::create(parameters.injectedBundlePathExtensionHandle));
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_injectedBundle->load(injectedBundleInitializationUserData.get())) {
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Don't keep around the InjectedBundle reference if the load fails.
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_injectedBundle.clear();
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(DATABASE)
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Make sure the WebDatabaseManager is initialized so that the Database directory is set.
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WebDatabaseManager::initialize(parameters.databaseDirectory);
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(ICONDATABASE)
1872bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_iconDatabaseProxy.setEnabled(parameters.iconDatabaseEnabled);
1882bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block
1902bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DOM_STORAGE)
1912bde8e466a4451c7319e3a072d118917957d6554Steve Block    StorageTracker::initializeTracker(parameters.localStorageDirectory);
1922bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_localStorageDirectory = parameters.localStorageDirectory;
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parameters.applicationCacheDirectory.isEmpty())
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheStorage().setCacheDirectory(parameters.applicationCacheDirectory);
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setShouldTrackVisitedLinks(parameters.shouldTrackVisitedLinks);
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setCacheModel(static_cast<uint32_t>(parameters.cacheModel));
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parameters.languageCode.isEmpty())
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        overrideDefaultLanguage(parameters.languageCode);
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_textCheckerState = parameters.textCheckerState;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.urlSchemesRegistererdAsEmptyDocument.size(); ++i)
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        registerURLSchemeAsEmptyDocument(parameters.urlSchemesRegistererdAsEmptyDocument[i]);
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.urlSchemesRegisteredAsSecure.size(); ++i)
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        registerURLSchemeAsSecure(parameters.urlSchemesRegisteredAsSecure[i]);
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.urlSchemesForWhichDomainRelaxationIsForbidden.size(); ++i)
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        setDomainRelaxationForbiddenForURLScheme(parameters.urlSchemesForWhichDomainRelaxationIsForbidden[i]);
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setDefaultRequestTimeoutInterval(parameters.defaultRequestTimeoutInterval);
21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.mimeTypesWithCustomRepresentation.size(); ++i)
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_mimeTypesWithCustomRepresentations.add(parameters.mimeTypesWithCustomRepresentation[i]);
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_presenterApplicationPid = parameters.presenterApplicationPid;
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (parameters.shouldAlwaysUseComplexTextCodePath)
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        setAlwaysUsesComplexTextCodePath(true);
22881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
22981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS)
23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    WebCore::ResourceHandle::setPrivateBrowsingStorageSessionIdentifierBase(parameters.uiProcessBundleIdentifier);
23181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setShouldTrackVisitedLinks(bool shouldTrackVisitedLinks)
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PageGroup::setShouldTrackVisitedLinks(shouldTrackVisitedLinks);
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::registerURLSchemeAsEmptyDocument(const String& urlScheme)
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SchemeRegistry::registerURLSchemeAsEmptyDocument(urlScheme);
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::registerURLSchemeAsSecure(const String& urlScheme) const
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SchemeRegistry::registerURLSchemeAsSecure(urlScheme);
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setDomainRelaxationForbiddenForURLScheme(const String& urlScheme) const
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SecurityOrigin::setDomainRelaxationForbiddenForURLScheme(true, urlScheme);
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebProcess::setDefaultRequestTimeoutInterval(double timeoutInterval)
25581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
25681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ResourceRequest::setDefaultTimeoutInterval(timeoutInterval);
25781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
25881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setAlwaysUsesComplexTextCodePath(bool alwaysUseComplexText)
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    WebCore::Font::setCodePath(alwaysUseComplexText ? WebCore::Font::Complex : WebCore::Font::Auto);
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::languageChanged(const String& language) const
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    overrideDefaultLanguage(language);
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setVisitedLinkTable(const SharedMemory::Handle& handle)
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<SharedMemory> sharedMemory = SharedMemory::create(handle, SharedMemory::ReadOnly);
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!sharedMemory)
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_visitedLinkTable.setSharedMemory(sharedMemory.release());
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::visitedLinkStateChanged(const Vector<WebCore::LinkHash>& linkHashes)
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: We may want to track visited links per WebPageGroup rather than per WebContext.
2812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (size_t i = 0; i < linkHashes.size(); ++i) {
2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        HashMap<uint64_t, RefPtr<WebPageGroupProxy> >::const_iterator it = m_pageGroupMap.begin();
2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        HashMap<uint64_t, RefPtr<WebPageGroupProxy> >::const_iterator end = m_pageGroupMap.end();
2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (; it != end; ++it)
2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Page::visitedStateChanged(PageGroup::pageGroup(it->second->identifier()), linkHashes[i]);
2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    pageCache()->markPagesForVistedLinkStyleRecalc();
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::allVisitedLinkStateChanged()
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: We may want to track visited links per WebPageGroup rather than per WebContext.
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HashMap<uint64_t, RefPtr<WebPageGroupProxy> >::const_iterator it = m_pageGroupMap.begin();
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HashMap<uint64_t, RefPtr<WebPageGroupProxy> >::const_iterator end = m_pageGroupMap.end();
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (; it != end; ++it)
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        Page::allVisitedStateChanged(PageGroup::pageGroup(it->second->identifier()));
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    pageCache()->markPagesForVistedLinkStyleRecalc();
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebProcess::isLinkVisited(LinkHash linkHash) const
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_visitedLinkTable.isLinkVisited(linkHash);
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::addVisitedLink(WebCore::LinkHash linkHash)
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (isLinkVisited(linkHash))
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->send(Messages::WebContext::AddVisitedLinkHash(linkHash), 0);
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if !PLATFORM(MAC)
31581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool WebProcess::fullKeyboardAccessEnabled()
31681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
31781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
31881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
31981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
32081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setCacheModel(uint32_t cm)
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CacheModel cacheModel = static_cast<CacheModel>(cm);
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_hasSetCacheModel || cacheModel != m_cacheModel) {
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_hasSetCacheModel = true;
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_cacheModel = cacheModel;
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        platformSetCacheModel(cacheModel);
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::calculateCacheSizes(CacheModel cacheModel, uint64_t memorySize, uint64_t diskFreeSize,
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned& cacheTotalCapacity, unsigned& cacheMinDeadCapacity, unsigned& cacheMaxDeadCapacity, double& deadDecodedDataDeletionInterval,
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned& pageCacheCapacity, unsigned long& urlCacheMemoryCapacity, unsigned long& urlCacheDiskCapacity)
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (cacheModel) {
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case CacheModelDocumentViewer: {
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Page cache capacity (in pages)
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pageCacheCapacity = 0;
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Object cache capacities (in bytes)
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 96 * 1024 * 1024;
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1536)
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 64 * 1024 * 1024;
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 32 * 1024 * 1024;
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 16 * 1024 * 1024;
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMinDeadCapacity = 0;
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = 0;
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation memory cache capacity (in bytes)
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        urlCacheMemoryCapacity = 0;
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation disk cache capacity (in bytes)
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        urlCacheDiskCapacity = 0;
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case CacheModelDocumentBrowser: {
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Page cache capacity (in pages)
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 1024)
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 3;
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 2;
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 256)
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 1;
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 0;
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Object cache capacities (in bytes)
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 96 * 1024 * 1024;
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1536)
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 64 * 1024 * 1024;
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 32 * 1024 * 1024;
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 16 * 1024 * 1024;
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMinDeadCapacity = cacheTotalCapacity / 8;
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = cacheTotalCapacity / 4;
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation memory cache capacity (in bytes)
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 4 * 1024 * 1024;
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 2 * 1024 * 1024;
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 1 * 1024 * 1024;
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity =      512 * 1024;
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation disk cache capacity (in bytes)
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (diskFreeSize >= 16384)
39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 50 * 1024 * 1024;
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 8192)
40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 40 * 1024 * 1024;
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 4096)
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 30 * 1024 * 1024;
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 20 * 1024 * 1024;
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case CacheModelPrimaryWebBrowser: {
40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Page cache capacity (in pages)
41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // (Research indicates that value / page drops substantially after 3 pages.)
41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 5;
41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 4;
41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 3;
41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 256)
41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 2;
41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 1;
42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Object cache capacities (in bytes)
42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // (Testing indicates that value / MB depends heavily on content and
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // browsing pattern. Even growth above 128MB can have substantial
42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // value / MB for some content / browsing patterns.)
42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 128 * 1024 * 1024;
42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1536)
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 96 * 1024 * 1024;
43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 64 * 1024 * 1024;
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 32 * 1024 * 1024;
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMinDeadCapacity = cacheTotalCapacity / 4;
43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = cacheTotalCapacity / 2;
43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // This code is here to avoid a PLT regression. We can remove it if we
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // can prove that the overall system gain would justify the regression.
44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = std::max(24u, cacheMaxDeadCapacity);
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        deadDecodedDataDeletionInterval = 60;
44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation memory cache capacity (in bytes)
44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // (These values are small because WebCore does most caching itself.)
44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 1024)
44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 4 * 1024 * 1024;
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 2 * 1024 * 1024;
45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 256)
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 1 * 1024 * 1024;
45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity =      512 * 1024;
45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation disk cache capacity (in bytes)
45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (diskFreeSize >= 16384)
45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 175 * 1024 * 1024;
45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 8192)
45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 150 * 1024 * 1024;
46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 4096)
46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 125 * 1024 * 1024;
46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 2048)
46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 100 * 1024 * 1024;
46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 1024)
46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 75 * 1024 * 1024;
46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 50 * 1024 * 1024;
46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
47165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
47265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4762bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebPage* WebProcess::focusedWebPage() const
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block    HashMap<uint64_t, RefPtr<WebPage> >::const_iterator end = m_pageMap.end();
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (HashMap<uint64_t, RefPtr<WebPage> >::const_iterator it = m_pageMap.begin(); it != end; ++it) {
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block        WebPage* page = (*it).second.get();
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (page->windowIsFocused())
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block            return page;
4832bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block
48765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPage* WebProcess::webPage(uint64_t pageID) const
48865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
48965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_pageMap.get(pageID).get();
49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
49165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::createWebPage(uint64_t pageID, const WebPageCreationParameters& parameters)
49365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
49465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // It is necessary to check for page existence here since during a window.open() (or targeted
49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // link) the WebPage gets created both in the synchronous handler and through the normal way.
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    std::pair<HashMap<uint64_t, RefPtr<WebPage> >::iterator, bool> result = m_pageMap.add(pageID, 0);
49765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (result.second) {
49865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!result.first->second);
49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result.first->second = WebPage::create(pageID, parameters);
5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Balanced by an enableTermination in removeWebPage.
5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        disableTermination();
50365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
50465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
50565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(result.first->second);
50665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
50765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
50865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::removeWebPage(uint64_t pageID)
50965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(m_pageMap.contains(pageID));
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
51265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pageMap.remove(pageID);
5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    enableTermination();
51565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
51665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebProcess::isSeparateProcess() const
51865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If we're running on the main run loop, we assume that we're in a separate process.
52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_runLoop == RunLoop::main();
52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool WebProcess::shouldTerminate()
52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
52565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Keep running forever if we're running in the same process.
52665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!isSeparateProcess())
5272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
5282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(m_pageMap.isEmpty());
5302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(!DownloadManager::shared().isDownloading());
53165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: the ShouldTerminate message should also send termination parameters, such as any session cookies that need to be preserved.
53381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool shouldTerminate = false;
53481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_connection->sendSync(Messages::WebProcessProxy::ShouldTerminate(), Messages::WebProcessProxy::ShouldTerminate::Reply(shouldTerminate), 0)
53581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        && !shouldTerminate)
5362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
5392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebProcess::terminate()
5422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    gcController().garbageCollectNow();
54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memoryCache()->setDisabled(true);
54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Invalidate our connection.
54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->invalidate();
55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = nullptr;
55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    platformTerminate();
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_runLoop->stop();
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochCoreIPC::SyncReplyMode WebProcess::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t pageID = arguments->destinationID();
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pageID)
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return CoreIPC::AutomaticReply;
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPage* page = webPage(pageID);
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!page)
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return CoreIPC::AutomaticReply;
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    page->didReceiveSyncMessage(connection, messageID, arguments, reply);
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return CoreIPC::AutomaticReply;
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassWebProcess>()) {
57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        didReceiveWebProcessMessage(connection, messageID, arguments);
57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassAuthenticationManager>()) {
57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        AuthenticationManager::shared().didReceiveMessage(connection, messageID, arguments);
57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (messageID.is<CoreIPC::MessageClassWebApplicationCacheManager>()) {
58381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WebApplicationCacheManager::shared().didReceiveMessage(connection, messageID, arguments);
58481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
58581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
58681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
58781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (messageID.is<CoreIPC::MessageClassWebCookieManager>()) {
58881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WebCookieManager::shared().didReceiveMessage(connection, messageID, arguments);
58981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
59081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
59181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
59265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassWebDatabaseManager>()) {
59365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WebDatabaseManager::shared().didReceiveMessage(connection, messageID, arguments);
59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassWebGeolocationManager>()) {
59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_geolocationManager.didReceiveMessage(connection, messageID, arguments);
59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6022bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (messageID.is<CoreIPC::MessageClassWebIconDatabaseProxy>()) {
6032bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_iconDatabaseProxy.didReceiveMessage(connection, messageID, arguments);
6042bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
6052bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
6062bde8e466a4451c7319e3a072d118917957d6554Steve Block
60781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (messageID.is<CoreIPC::MessageClassWebKeyValueStorageManager>()) {
60881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WebKeyValueStorageManager::shared().didReceiveMessage(connection, messageID, arguments);
60981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
61081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
61181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6122bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (messageID.is<CoreIPC::MessageClassWebMediaCacheManager>()) {
6132bde8e466a4451c7319e3a072d118917957d6554Steve Block        WebMediaCacheManager::shared().didReceiveMessage(connection, messageID, arguments);
6142bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
6152bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
6162bde8e466a4451c7319e3a072d118917957d6554Steve Block
61781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (messageID.is<CoreIPC::MessageClassWebResourceCacheManager>()) {
61881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WebResourceCacheManager::shared().didReceiveMessage(connection, messageID, arguments);
61981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
62081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
62181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassInjectedBundle>()) {
62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_injectedBundle)
62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_injectedBundle->didReceiveMessage(connection, messageID, arguments);
62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t pageID = arguments->destinationID();
63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pageID)
63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPage* page = webPage(pageID);
63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!page)
63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    page->didReceiveMessage(connection, messageID, arguments);
63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::didClose(CoreIPC::Connection*)
64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // When running in the same process the connection will never be closed.
64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(isSeparateProcess());
64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inDidClose = true;
64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Close all the live pages.
64965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<RefPtr<WebPage> > pages;
65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    copyValuesToVector(m_pageMap, pages);
65165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < pages.size(); ++i)
65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pages[i]->close();
65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    pages.clear();
65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    gcController().garbageCollectNow();
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memoryCache()->setDisabled(true);
65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The UI process closed this connection, shut down.
66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_runLoop->stop();
66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
66265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::MessageID)
66465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
66565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We received an invalid message, but since this is from the UI process (which we trust),
66665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // we'll let it slide.
66765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebProcess::syncMessageSendTimedOut(CoreIPC::Connection*)
6702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebFrame* WebProcess::webFrame(uint64_t frameID) const
67465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_frameMap.get(frameID);
67665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
67765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::addWebFrame(uint64_t frameID, WebFrame* frame)
67965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
68065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_frameMap.set(frameID, frame);
68165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
68265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::removeWebFrame(uint64_t frameID)
68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_frameMap.remove(frameID);
68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We can end up here after our connection has closed when WebCore's frame life-support timer
68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // fires when the application is shutting down. There's no need (and no way) to update the UI
68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // process in this case.
69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection)
69165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->send(Messages::WebProcessProxy::DidDestroyFrame(frameID), 0);
69465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
69565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageGroupProxy* WebProcess::webPageGroup(uint64_t pageGroupID)
69765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
69865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_pageGroupMap.get(pageGroupID).get();
69965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
70065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageGroupProxy* WebProcess::webPageGroup(const WebPageGroupData& pageGroupData)
70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    std::pair<HashMap<uint64_t, RefPtr<WebPageGroupProxy> >::iterator, bool> result = m_pageGroupMap.add(pageGroupData.pageGroupID, 0);
70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (result.second) {
70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!result.first->second);
70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result.first->second = WebPageGroupProxy::create(pageGroupData);
70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result.first->second.get();
71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebProcess::clearResourceCaches(ResourceCachesToClear resourceCachesToClear)
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7142bde8e466a4451c7319e3a072d118917957d6554Steve Block    platformClearResourceCaches(resourceCachesToClear);
71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Toggling the cache model like this forces the cache to evict all its in-memory resources.
71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: We need a better way to do this.
71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CacheModel cacheModel = m_cacheModel;
71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setCacheModel(CacheModelDocumentViewer);
72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setCacheModel(cacheModel);
72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    memoryCache()->evictResources();
72381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Empty the cross-origin preflight cache.
72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CrossOriginPreflightResultCache::shared().empty();
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::clearApplicationCache()
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Empty the application cache.
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    cacheStorage().empty();
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if !ENABLE(PLUGIN_PROCESS)
73781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebProcess::getSitesWithPluginData(const Vector<String>& pluginPaths, uint64_t callbackID)
73881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
7392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LocalTerminationDisabler terminationDisabler(*this);
7402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
74181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    HashSet<String> sitesSet;
74281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
74381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (size_t i = 0; i < pluginPaths.size(); ++i) {
74481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<NetscapePluginModule> netscapePluginModule = NetscapePluginModule::getOrCreate(pluginPaths[i]);
74581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!netscapePluginModule)
74681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            continue;
74781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
74881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        Vector<String> sites = netscapePluginModule->sitesWithData();
74981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        for (size_t i = 0; i < sites.size(); ++i)
75081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            sitesSet.add(sites[i]);
75181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
75281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
75381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Vector<String> sites;
75481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    copyToVector(sitesSet, sites);
75581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
75681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_connection->send(Messages::WebContext::DidGetSitesWithPluginData(sites, callbackID), 0);
75781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
75881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
75981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebProcess::clearPluginSiteData(const Vector<String>& pluginPaths, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID)
76081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
7612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    LocalTerminationDisabler terminationDisabler(*this);
7622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
76381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (size_t i = 0; i < pluginPaths.size(); ++i) {
76481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        RefPtr<NetscapePluginModule> netscapePluginModule = NetscapePluginModule::getOrCreate(pluginPaths[i]);
76581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!netscapePluginModule)
76681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            continue;
76781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
76881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (sites.isEmpty()) {
76981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Clear everything.
77081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            netscapePluginModule->clearSiteData(String(), flags, maxAgeInSeconds);
77181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            continue;
77281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
77381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
77481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        for (size_t i = 0; i < sites.size(); ++i)
77581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            netscapePluginModule->clearSiteData(sites[i], flags, maxAgeInSeconds);
77681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
77781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
77881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_connection->send(Messages::WebContext::DidClearPluginSiteData(callbackID), 0);
77981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
78081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
78181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::downloadRequest(uint64_t downloadID, uint64_t initiatingPageID, const ResourceRequest& request)
78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPage* initiatingPage = initiatingPageID ? webPage(initiatingPageID) : 0;
78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DownloadManager::shared().startDownload(downloadID, initiatingPage, request);
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::cancelDownload(uint64_t downloadID)
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DownloadManager::shared().cancelDownload(downloadID);
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7942bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebProcess::setEnhancedAccessibility(bool flag)
7952bde8e466a4451c7319e3a072d118917957d6554Steve Block{
7962bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebCore::AXObjectCache::setEnhancedUserInterfaceAccessibility(flag);
7972bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7982bde8e466a4451c7319e3a072d118917957d6554Steve Block
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::startMemorySampler(const SandboxExtension::Handle& sampleLogFileHandle, const String& sampleLogFilePath, const double interval)
80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(MEMORY_SAMPLER)
80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebMemorySampler::shared()->start(sampleLogFileHandle, sampleLogFilePath, interval);
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::stopMemorySampler()
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(MEMORY_SAMPLER)
80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebMemorySampler::shared()->stop();
81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setTextCheckerState(const TextCheckerState& textCheckerState)
81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool continuousSpellCheckingTurnedOff = !textCheckerState.isContinuousSpellCheckingEnabled && m_textCheckerState.isContinuousSpellCheckingEnabled;
8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool grammarCheckingTurnedOff = !textCheckerState.isGrammarCheckingEnabled && m_textCheckerState.isGrammarCheckingEnabled;
8172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_textCheckerState = textCheckerState;
8192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!continuousSpellCheckingTurnedOff && !grammarCheckingTurnedOff)
8212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
8222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HashMap<uint64_t, RefPtr<WebPage> >::iterator end = m_pageMap.end();
8242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (HashMap<uint64_t, RefPtr<WebPage> >::iterator it = m_pageMap.begin(); it != end; ++it) {
8252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        WebPage* page = (*it).second.get();
8262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (continuousSpellCheckingTurnedOff)
8272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            page->unmarkAllMisspellings();
8282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (grammarCheckingTurnedOff)
8292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            page->unmarkAllBadGrammar();
8302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
834