• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 #include "PluginProcessManager.h"
28 
29 #if ENABLE(PLUGIN_PROCESS)
30 
31 #include "PluginProcessProxy.h"
32 #include "WebContext.h"
33 #include <wtf/StdLibExtras.h>
34 #include <wtf/text/WTFString.h>
35 
36 namespace WebKit {
37 
shared()38 PluginProcessManager& PluginProcessManager::shared()
39 {
40     DEFINE_STATIC_LOCAL(PluginProcessManager, pluginProcessManager, ());
41     return pluginProcessManager;
42 }
43 
PluginProcessManager()44 PluginProcessManager::PluginProcessManager()
45 {
46 }
47 
getPluginProcessConnection(PluginInfoStore * pluginInfoStore,const String & pluginPath,PassRefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply> reply)48 void PluginProcessManager::getPluginProcessConnection(PluginInfoStore* pluginInfoStore, const String& pluginPath, PassRefPtr<Messages::WebProcessProxy::GetPluginProcessConnection::DelayedReply> reply)
49 {
50     ASSERT(!pluginPath.isNull());
51 
52     PluginInfoStore::Plugin plugin = pluginInfoStore->infoForPluginWithPath(pluginPath);
53     PluginProcessProxy* pluginProcess = getOrCreatePluginProcess(plugin);
54     pluginProcess->getPluginProcessConnection(reply);
55 }
56 
removePluginProcessProxy(PluginProcessProxy * pluginProcessProxy)57 void PluginProcessManager::removePluginProcessProxy(PluginProcessProxy* pluginProcessProxy)
58 {
59     size_t vectorIndex = m_pluginProcesses.find(pluginProcessProxy);
60     ASSERT(vectorIndex != notFound);
61 
62     m_pluginProcesses.remove(vectorIndex);
63 }
64 
getSitesWithData(const PluginInfoStore::Plugin & plugin,WebPluginSiteDataManager * webPluginSiteDataManager,uint64_t callbackID)65 void PluginProcessManager::getSitesWithData(const PluginInfoStore::Plugin& plugin, WebPluginSiteDataManager* webPluginSiteDataManager, uint64_t callbackID)
66 {
67     PluginProcessProxy* pluginProcess = getOrCreatePluginProcess(plugin);
68     pluginProcess->getSitesWithData(webPluginSiteDataManager, callbackID);
69 }
70 
clearSiteData(const PluginInfoStore::Plugin & plugin,WebPluginSiteDataManager * webPluginSiteDataManager,const Vector<String> & sites,uint64_t flags,uint64_t maxAgeInSeconds,uint64_t callbackID)71 void PluginProcessManager::clearSiteData(const PluginInfoStore::Plugin& plugin, WebPluginSiteDataManager* webPluginSiteDataManager, const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID)
72 {
73     PluginProcessProxy* pluginProcess = getOrCreatePluginProcess(plugin);
74     pluginProcess->clearSiteData(webPluginSiteDataManager, sites, flags, maxAgeInSeconds, callbackID);
75 }
76 
pluginSyncMessageSendTimedOut(const String & pluginPath)77 void PluginProcessManager::pluginSyncMessageSendTimedOut(const String& pluginPath)
78 {
79     PluginProcessProxy* pluginProcess = pluginProcessWithPath(pluginPath);
80     if (!pluginProcess)
81         return;
82 
83     pluginProcess->terminate();
84 }
85 
pluginProcessWithPath(const String & pluginPath)86 PluginProcessProxy* PluginProcessManager::pluginProcessWithPath(const String& pluginPath)
87 {
88     for (size_t i = 0; i < m_pluginProcesses.size(); ++i) {
89         if (m_pluginProcesses[i]->pluginInfo().path == pluginPath)
90             return m_pluginProcesses[i];
91     }
92     return 0;
93 }
94 
getOrCreatePluginProcess(const PluginInfoStore::Plugin & plugin)95 PluginProcessProxy* PluginProcessManager::getOrCreatePluginProcess(const PluginInfoStore::Plugin& plugin)
96 {
97     if (PluginProcessProxy* pluginProcess = pluginProcessWithPath(plugin.path))
98         return pluginProcess;
99 
100     PluginProcessProxy* pluginProcess = PluginProcessProxy::create(this, plugin).leakPtr();
101     m_pluginProcesses.append(pluginProcess);
102 
103     return pluginProcess;
104 }
105 
106 } // namespace WebKit
107 
108 #endif // ENABLE(PLUGIN_PROCESS)
109