diff -r 000000000000 -r 4f2f89ce4247 WebKit2/UIProcess/WebContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKit2/UIProcess/WebContext.cpp Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "WebContext.h" + +#include "RunLoop.h" +#include "WebCoreArgumentCoders.h" +#include "WebPageNamespace.h" +#include "WebPreferences.h" +#include "WebProcessManager.h" +#include "WebProcessMessageKinds.h" +#include "WebProcessProxy.h" + +#include "WKContextPrivate.h" + +#ifndef NDEBUG +#include +#endif + +using namespace WebCore; + +namespace WebKit { + +#ifndef NDEBUG +static WTF::RefCountedLeakCounter webContextCounter("WebContext"); +#endif + +WebContext* WebContext::sharedProcessContext() +{ + static WebContext* context = adoptRef(new WebContext(ProcessModelSharedSecondaryProcess, String())).leakRef(); + return context; +} + +WebContext* WebContext::sharedThreadContext() +{ + static WebContext* context = adoptRef(new WebContext(ProcessModelSharedSecondaryThread, String())).leakRef(); + return context; +} + +WebContext::WebContext(ProcessModel processModel, const WebCore::String& injectedBundlePath) + : m_processModel(processModel) + , m_injectedBundlePath(injectedBundlePath) +{ + RunLoop::initializeMainRunLoop(); + + m_preferences = WebPreferences::shared(); + m_preferences->addContext(this); + +#ifndef NDEBUG + webContextCounter.increment(); +#endif +} + +WebContext::~WebContext() +{ + ASSERT(m_pageNamespaces.isEmpty()); + m_preferences->removeContext(this); + +#ifndef NDEBUG + webContextCounter.decrement(); +#endif +} + +void WebContext::initializeInjectedBundleClient(WKContextInjectedBundleClient* client) +{ + m_injectedBundleClient.initialize(client); +} + +void WebContext::ensureWebProcess() +{ + if (m_process && m_process->isValid()) + return; + + m_process = WebProcessManager::shared().getWebProcess(this); +} + +WebPageProxy* WebContext::createWebPage(WebPageNamespace* pageNamespace) +{ + ensureWebProcess(); + return m_process->createWebPage(pageNamespace); +} + +void WebContext::reviveIfNecessary() +{ + ensureWebProcess(); +} + +WebPageNamespace* WebContext::createPageNamespace() +{ + RefPtr pageNamespace = WebPageNamespace::create(this); + m_pageNamespaces.add(pageNamespace.get()); + return pageNamespace.release().releaseRef(); +} + +void WebContext::pageNamespaceWasDestroyed(WebPageNamespace* pageNamespace) +{ + ASSERT(m_pageNamespaces.contains(pageNamespace)); + m_pageNamespaces.remove(pageNamespace); +} + +void WebContext::setPreferences(WebPreferences* preferences) +{ + ASSERT(preferences); + + if (preferences == m_preferences) + return; + + m_preferences->removeContext(this); + m_preferences = preferences; + m_preferences->addContext(this); + + // FIXME: Update all Pages/PageNamespace with the new WebPreferences. +} + +WebPreferences* WebContext::preferences() const +{ + return m_preferences.get(); +} + +void WebContext::preferencesDidChange() +{ + for (HashSet::iterator it = m_pageNamespaces.begin(), end = m_pageNamespaces.end(); it != end; ++it) { + WebPageNamespace* pageNamespace = *it; + pageNamespace->preferencesDidChange(); + } +} + +// InjectedBundle client + +void WebContext::didRecieveMessageFromInjectedBundle(const WebCore::String& message) +{ + m_injectedBundleClient.didRecieveMessageFromInjectedBundle(this, message); +} + +void WebContext::postMessageToInjectedBundle(WebCore::StringImpl* message) +{ + if (!m_process) + return; + + m_process->send(WebProcessMessage::PostMessage, 0, CoreIPC::In(String(message))); +} + +void WebContext::getStatistics(WKContextStatistics* statistics) +{ + memset(statistics, 0, sizeof(WKContextStatistics)); + + statistics->numberOfWKPageNamespaces = m_pageNamespaces.size(); + + for (HashSet::iterator it = m_pageNamespaces.begin(), end = m_pageNamespaces.end(); it != end; ++it) + (*it)->getStatistics(statistics); +} + +void WebContext::setAdditionalPluginPath(const WebCore::String& pluginPath) +{ + Vector pluginPaths; + pluginPaths.append(pluginPath); + + m_pluginInfoStore.setAdditionalPluginPaths(pluginPaths); +} + +} // namespace WebKit