WebProcess.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcess.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "AuthenticationManager.h"
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DownloadManager.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedBundle.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedBundleMessageKinds.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedBundleUserMessageCoders.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "RunLoop.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "SandboxExtension.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContextMessages.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebDatabaseManager.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFrame.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebGeolocationManagerMessages.h"
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebMemorySampler.h"
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPage.h"
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageCreationParameters.h"
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPlatformStrategies.h"
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPreferencesStore.h"
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessCreationParameters.h"
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessMessages.h"
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessProxyMessages.h"
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/ApplicationCacheStorage.h>
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/CrossOriginPreflightResultCache.h>
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Font.h>
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Language.h>
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Page.h>
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/PageGroup.h>
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/SchemeRegistry.h>
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/SecurityOrigin.h>
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Settings.h>
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h>
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RandomNumber.h>
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/MemoryCache.h>
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/GCController.h>
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !OS(WINDOWS)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <unistd.h>
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if OS(WINDOWS)
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void sleep(unsigned seconds)
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::Sleep(seconds * 1000);
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void* randomCrashThread(void*)
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This delay was chosen semi-arbitrarily. We want the crash to happen somewhat quickly to
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // enable useful stress testing, but not so quickly that the web process will always crash soon
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // after launch.
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static const unsigned maximumRandomCrashDelay = 180;
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    sleep(randomNumber() * maximumRandomCrashDelay);
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CRASH();
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void startRandomCrashThreadIfRequested()
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!getenv("WEBKIT2_CRASH_WEB_PROCESS_RANDOMLY"))
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    createThread(randomCrashThread, 0, "WebKit2: Random Crash Thread");
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebProcess& WebProcess::shared()
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static WebProcess& process = *new WebProcess;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return process;
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebProcess::WebProcess()
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_inDidClose(false)
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_hasSetCacheModel(false)
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_cacheModel(CacheModelDocumentViewer)
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC)
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_compositingRenderServerPort(MACH_PORT_NULL)
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(QT)
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_networkAccessManager(0)
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_textCheckerState()
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_geolocationManager(this)
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(PLATFORM_STRATEGIES)
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Initialize our platform strategies.
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPlatformStrategies::initialize();
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // USE(PLATFORM_STRATEGIES)
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(DATABASE)
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Make sure the WebDatabaseManager is initialized so that the Database directory is set.
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebDatabaseManager::shared();
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::initialize(CoreIPC::Connection::Identifier serverIdentifier, RunLoop* runLoop)
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_connection);
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = CoreIPC::Connection::createClientConnection(serverIdentifier, this, runLoop);
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->open();
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_runLoop = runLoop;
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    startRandomCrashThreadIfRequested();
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::initializeWebProcess(const WebProcessCreationParameters& parameters, CoreIPC::ArgumentDecoder* arguments)
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_pageMap.isEmpty());
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    platformInitializeWebProcess(parameters, arguments);
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<APIObject> injectedBundleInitializationUserData;
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    InjectedBundleUserMessageDecoder messageDecoder(injectedBundleInitializationUserData);
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!arguments->decode(messageDecoder))
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parameters.injectedBundlePath.isEmpty()) {
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_injectedBundle = InjectedBundle::create(parameters.injectedBundlePath);
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_injectedBundle->setSandboxExtension(SandboxExtension::create(parameters.injectedBundlePathExtensionHandle));
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_injectedBundle->load(injectedBundleInitializationUserData.get())) {
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Don't keep around the InjectedBundle reference if the load fails.
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_injectedBundle.clear();
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parameters.applicationCacheDirectory.isEmpty())
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheStorage().setCacheDirectory(parameters.applicationCacheDirectory);
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setShouldTrackVisitedLinks(parameters.shouldTrackVisitedLinks);
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setCacheModel(static_cast<uint32_t>(parameters.cacheModel));
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!parameters.languageCode.isEmpty())
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        overrideDefaultLanguage(parameters.languageCode);
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_textCheckerState = parameters.textCheckerState;
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.urlSchemesRegistererdAsEmptyDocument.size(); ++i)
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        registerURLSchemeAsEmptyDocument(parameters.urlSchemesRegistererdAsEmptyDocument[i]);
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.urlSchemesRegisteredAsSecure.size(); ++i)
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        registerURLSchemeAsSecure(parameters.urlSchemesRegisteredAsSecure[i]);
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.urlSchemesForWhichDomainRelaxationIsForbidden.size(); ++i)
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        setDomainRelaxationForbiddenForURLScheme(parameters.urlSchemesForWhichDomainRelaxationIsForbidden[i]);
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < parameters.mimeTypesWithCustomRepresentation.size(); ++i)
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_mimeTypesWithCustomRepresentations.add(parameters.mimeTypesWithCustomRepresentation[i]);
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (parameters.clearResourceCaches)
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        clearResourceCaches();
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (parameters.clearApplicationCache)
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        clearApplicationCache();
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_presenterApplicationPid = parameters.presenterApplicationPid;
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (parameters.shouldAlwaysUseComplexTextCodePath)
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        setAlwaysUsesComplexTextCodePath(true);
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setShouldTrackVisitedLinks(bool shouldTrackVisitedLinks)
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PageGroup::setShouldTrackVisitedLinks(shouldTrackVisitedLinks);
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::registerURLSchemeAsEmptyDocument(const String& urlScheme)
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SchemeRegistry::registerURLSchemeAsEmptyDocument(urlScheme);
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::registerURLSchemeAsSecure(const String& urlScheme) const
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SchemeRegistry::registerURLSchemeAsSecure(urlScheme);
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setDomainRelaxationForbiddenForURLScheme(const String& urlScheme) const
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SecurityOrigin::setDomainRelaxationForbiddenForURLScheme(true, urlScheme);
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setAlwaysUsesComplexTextCodePath(bool alwaysUseComplexText)
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Font::setCodePath(alwaysUseComplexText ? Font::Complex : Font::Auto);
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::languageChanged(const String& language) const
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    overrideDefaultLanguage(language);
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setVisitedLinkTable(const SharedMemory::Handle& handle)
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<SharedMemory> sharedMemory = SharedMemory::create(handle, SharedMemory::ReadOnly);
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!sharedMemory)
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_visitedLinkTable.setSharedMemory(sharedMemory.release());
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPageGroup* WebProcess::sharedPageGroup()
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return PageGroup::pageGroup("WebKit2Group");
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::visitedLinkStateChanged(const Vector<WebCore::LinkHash>& linkHashes)
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < linkHashes.size(); ++i)
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Page::visitedStateChanged(sharedPageGroup(), linkHashes[i]);
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::allVisitedLinkStateChanged()
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Page::allVisitedStateChanged(sharedPageGroup());
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebProcess::isLinkVisited(LinkHash linkHash) const
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_visitedLinkTable.isLinkVisited(linkHash);
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::addVisitedLink(WebCore::LinkHash linkHash)
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (isLinkVisited(linkHash))
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->send(Messages::WebContext::AddVisitedLinkHash(linkHash), 0);
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setCacheModel(uint32_t cm)
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CacheModel cacheModel = static_cast<CacheModel>(cm);
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_hasSetCacheModel || cacheModel != m_cacheModel) {
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_hasSetCacheModel = true;
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_cacheModel = cacheModel;
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        platformSetCacheModel(cacheModel);
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::calculateCacheSizes(CacheModel cacheModel, uint64_t memorySize, uint64_t diskFreeSize,
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned& cacheTotalCapacity, unsigned& cacheMinDeadCapacity, unsigned& cacheMaxDeadCapacity, double& deadDecodedDataDeletionInterval,
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned& pageCacheCapacity, unsigned long& urlCacheMemoryCapacity, unsigned long& urlCacheDiskCapacity)
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (cacheModel) {
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case CacheModelDocumentViewer: {
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Page cache capacity (in pages)
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pageCacheCapacity = 0;
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Object cache capacities (in bytes)
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 96 * 1024 * 1024;
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1536)
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 64 * 1024 * 1024;
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 32 * 1024 * 1024;
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 16 * 1024 * 1024;
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMinDeadCapacity = 0;
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = 0;
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation memory cache capacity (in bytes)
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        urlCacheMemoryCapacity = 0;
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation disk cache capacity (in bytes)
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        urlCacheDiskCapacity = 0;
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case CacheModelDocumentBrowser: {
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Page cache capacity (in pages)
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 1024)
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 3;
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 2;
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 256)
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 1;
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 0;
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Object cache capacities (in bytes)
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 96 * 1024 * 1024;
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1536)
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 64 * 1024 * 1024;
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 32 * 1024 * 1024;
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 16 * 1024 * 1024;
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMinDeadCapacity = cacheTotalCapacity / 8;
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = cacheTotalCapacity / 4;
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation memory cache capacity (in bytes)
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 4 * 1024 * 1024;
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 2 * 1024 * 1024;
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 1 * 1024 * 1024;
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity =      512 * 1024;
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation disk cache capacity (in bytes)
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (diskFreeSize >= 16384)
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 50 * 1024 * 1024;
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 8192)
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 40 * 1024 * 1024;
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 4096)
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 30 * 1024 * 1024;
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 20 * 1024 * 1024;
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case CacheModelPrimaryWebBrowser: {
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Page cache capacity (in pages)
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // (Research indicates that value / page drops substantially after 3 pages.)
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 5;
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 4;
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 3;
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 256)
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 2;
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            pageCacheCapacity = 1;
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Object cache capacities (in bytes)
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // (Testing indicates that value / MB depends heavily on content and
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // browsing pattern. Even growth above 128MB can have substantial
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // value / MB for some content / browsing patterns.)
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 2048)
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 128 * 1024 * 1024;
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1536)
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 96 * 1024 * 1024;
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 1024)
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 64 * 1024 * 1024;
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            cacheTotalCapacity = 32 * 1024 * 1024;
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMinDeadCapacity = cacheTotalCapacity / 4;
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = cacheTotalCapacity / 2;
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // This code is here to avoid a PLT regression. We can remove it if we
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // can prove that the overall system gain would justify the regression.
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        cacheMaxDeadCapacity = std::max(24u, cacheMaxDeadCapacity);
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        deadDecodedDataDeletionInterval = 60;
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation memory cache capacity (in bytes)
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // (These values are small because WebCore does most caching itself.)
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (memorySize >= 1024)
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 4 * 1024 * 1024;
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 512)
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 2 * 1024 * 1024;
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (memorySize >= 256)
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity = 1 * 1024 * 1024;
39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheMemoryCapacity =      512 * 1024;
40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Foundation disk cache capacity (in bytes)
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (diskFreeSize >= 16384)
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 175 * 1024 * 1024;
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 8192)
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 150 * 1024 * 1024;
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 4096)
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 125 * 1024 * 1024;
40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 2048)
40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 100 * 1024 * 1024;
41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else if (diskFreeSize >= 1024)
41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 75 * 1024 * 1024;
41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            urlCacheDiskCapacity = 50 * 1024 * 1024;
41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPage* WebProcess::webPage(uint64_t pageID) const
42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_pageMap.get(pageID).get();
42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::createWebPage(uint64_t pageID, const WebPageCreationParameters& parameters)
42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // It is necessary to check for page existence here since during a window.open() (or targeted
43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // link) the WebPage gets created both in the synchronous handler and through the normal way.
43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    std::pair<HashMap<uint64_t, RefPtr<WebPage> >::iterator, bool> result = m_pageMap.add(pageID, 0);
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (result.second) {
43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!result.first->second);
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result.first->second = WebPage::create(pageID, parameters);
43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(result.first->second);
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::removeWebPage(uint64_t pageID)
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pageMap.remove(pageID);
44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    shutdownIfPossible();
44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebProcess::isSeparateProcess() const
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If we're running on the main run loop, we assume that we're in a separate process.
45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_runLoop == RunLoop::main();
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::shutdownIfPossible()
45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_pageMap.isEmpty())
45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_inDidClose)
45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (DownloadManager::shared().isDownloading())
46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Keep running forever if we're running in the same process.
46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!isSeparateProcess())
46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Actually shut down the process.
46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
47165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    gcController().garbageCollectNow();
47265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memoryCache()->setDisabled(true);
47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Invalidate our connection.
47665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->invalidate();
47765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection = nullptr;
47865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    platformShutdown();
48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_runLoop->stop();
48265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
48365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochCoreIPC::SyncReplyMode WebProcess::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)
48565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
48665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t pageID = arguments->destinationID();
48765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pageID)
48865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return CoreIPC::AutomaticReply;
48965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPage* page = webPage(pageID);
49165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!page)
49265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return CoreIPC::AutomaticReply;
49365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    page->didReceiveSyncMessage(connection, messageID, arguments, reply);
49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return CoreIPC::AutomaticReply;
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
49765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
50065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassWebProcess>()) {
50165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        didReceiveWebProcessMessage(connection, messageID, arguments);
50265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
50365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
50465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
50565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassAuthenticationManager>()) {
50665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        AuthenticationManager::shared().didReceiveMessage(connection, messageID, arguments);
50765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
50865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
50965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassWebDatabaseManager>()) {
51165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WebDatabaseManager::shared().didReceiveMessage(connection, messageID, arguments);
51265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
51365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
51465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassWebGeolocationManager>()) {
51665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_geolocationManager.didReceiveMessage(connection, messageID, arguments);
51765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
51865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (messageID.is<CoreIPC::MessageClassInjectedBundle>()) {
52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_injectedBundle)
52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
52365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_injectedBundle->didReceiveMessage(connection, messageID, arguments);
52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
52565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
52665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
52765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t pageID = arguments->destinationID();
52865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pageID)
52965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
53065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPage* page = webPage(pageID);
53265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!page)
53365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
53465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    page->didReceiveMessage(connection, messageID, arguments);
53665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
53765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::didClose(CoreIPC::Connection*)
53965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // When running in the same process the connection will never be closed.
54165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(isSeparateProcess());
54265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inDidClose = true;
54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Close all the live pages.
54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<RefPtr<WebPage> > pages;
54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    copyValuesToVector(m_pageMap, pages);
54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < pages.size(); ++i)
55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pages[i]->close();
55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    pages.clear();
55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    gcController().garbageCollectNow();
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memoryCache()->setDisabled(true);
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The UI process closed this connection, shut down.
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_runLoop->stop();
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::didReceiveInvalidMessage(CoreIPC::Connection*, CoreIPC::MessageID)
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We received an invalid message, but since this is from the UI process (which we trust),
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // we'll let it slide.
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebFrame* WebProcess::webFrame(uint64_t frameID) const
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_frameMap.get(frameID);
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::addWebFrame(uint64_t frameID, WebFrame* frame)
57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_frameMap.set(frameID, frame);
57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::removeWebFrame(uint64_t frameID)
57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_frameMap.remove(frameID);
58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We can end up here after our connection has closed when WebCore's frame life-support timer
58265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // fires when the application is shutting down. There's no need (and no way) to update the UI
58365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // process in this case.
58465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_connection)
58565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
58665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_connection->send(Messages::WebProcessProxy::DidDestroyFrame(frameID), 0);
58865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
58965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageGroupProxy* WebProcess::webPageGroup(uint64_t pageGroupID)
59165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
59265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_pageGroupMap.get(pageGroupID).get();
59365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageGroupProxy* WebProcess::webPageGroup(const WebPageGroupData& pageGroupData)
59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    std::pair<HashMap<uint64_t, RefPtr<WebPageGroupProxy> >::iterator, bool> result = m_pageGroupMap.add(pageGroupData.pageGroupID, 0);
59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (result.second) {
59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!result.first->second);
60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result.first->second = WebPageGroupProxy::create(pageGroupData);
60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
60265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result.first->second.get();
60465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
60565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::clearResourceCaches()
60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    platformClearResourceCaches();
60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Toggling the cache model like this forces the cache to evict all its in-memory resources.
61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: We need a better way to do this.
61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CacheModel cacheModel = m_cacheModel;
61365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setCacheModel(CacheModelDocumentViewer);
61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    setCacheModel(cacheModel);
61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Empty the cross-origin preflight cache.
61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CrossOriginPreflightResultCache::shared().empty();
61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
61965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::clearApplicationCache()
62165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(OFFLINE_WEB_APPLICATIONS)
62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Empty the application cache.
62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    cacheStorage().empty();
62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::downloadRequest(uint64_t downloadID, uint64_t initiatingPageID, const ResourceRequest& request)
62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPage* initiatingPage = initiatingPageID ? webPage(initiatingPageID) : 0;
63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DownloadManager::shared().startDownload(downloadID, initiatingPage, request);
63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::cancelDownload(uint64_t downloadID)
63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DownloadManager::shared().cancelDownload(downloadID);
63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::startMemorySampler(const SandboxExtension::Handle& sampleLogFileHandle, const String& sampleLogFilePath, const double interval)
64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(MEMORY_SAMPLER)
64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebMemorySampler::shared()->start(sampleLogFileHandle, sampleLogFilePath, interval);
64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::stopMemorySampler()
64865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
64965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(MEMORY_SAMPLER)
65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebMemorySampler::shared()->stop();
65165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebProcess::setTextCheckerState(const TextCheckerState& textCheckerState)
65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_textCheckerState = textCheckerState;
65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
660