15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/plugin_data_remover_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/plugin_process_host.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/plugin_service_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_flash_file_message_filter.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/child_process_host_impl.h" 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/plugin_process_messages.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/common/content_constants.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/pepper_plugin_info.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The minimum Flash Player version that implements NPP_ClearSiteData. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMinFlashVersion[] = "10.3"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kRemovalTimeoutMs = 10000; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint64 kClearAllData = 0; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginDataRemover* PluginDataRemover::Create(BrowserContext* browser_context) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new PluginDataRemoverImpl(browser_context); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginDataRemover::GetSupportedPlugins( 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<WebPluginInfo>* supported_plugins) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_wildcard = false; 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<WebPluginInfo> plugins; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginService::GetInstance()->GetPluginInfoArray( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), kFlashPluginSwfMimeType, allow_wildcard, &plugins, NULL); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version min_version(kMinFlashVersion); 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (std::vector<WebPluginInfo>::iterator it = plugins.begin(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != plugins.end(); ++it) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version; 53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebPluginInfo::CreateVersionFromString(it->version, &version); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version.IsValid() && min_version.CompareTo(version) == -1) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supported_plugins->push_back(*it); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginDataRemoverImpl::Context 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public PluginProcessHost::Client, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public PpapiPluginProcessHost::BrokerClient, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IPC::Listener, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::RefCountedThreadSafe<Context, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::DeleteOnIOThread> { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Context(base::Time begin_time, BrowserContext* browser_context) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : event_(new base::WaitableEvent(true, false)), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) begin_time_(begin_time), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_removing_(false), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context_path_(browser_context->GetPath()), 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) resource_context_(browser_context->GetResourceContext()) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(const std::string& mime_type) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&Context::InitOnIOThread, this, mime_type)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostDelayedTask( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&Context::OnTimeout, this), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kRemovalTimeoutMs)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitOnIOThread(const std::string& mime_type) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginServiceImpl* plugin_service = PluginServiceImpl::GetInstance(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the plugin file path. 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<WebPluginInfo> plugins; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_service->GetPluginInfoArray( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), mime_type, false, &plugins, NULL); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath plugin_path; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugins.empty()) // May be empty for some tests. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_path = plugins[0].path; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_start_time_ = base::Time::Now(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_removing_ = true; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balanced in On[Ppapi]ChannelOpened or OnError. Exactly one them will 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // eventually be called, so we need to keep this object around until then. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PepperPluginInfo* pepper_info = 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_service->GetRegisteredPpapiPluginInfo(plugin_path); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pepper_info) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_name_ = pepper_info->name; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the broker since we run this function outside the sandbox. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_service->OpenChannelToPpapiBroker(0, plugin_path, this); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_service->OpenChannelToNpapiPlugin( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, GURL(), GURL(), mime_type, this); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a timeout happens in order not to block the client 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indefinitely. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnTimeout() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG_IF(ERROR, is_removing_) << "Timed out"; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalDone(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginProcessHost::Client methods. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int ID() OVERRIDE { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate a unique identifier for this PluginProcessHostClient. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ChildProcessHostImpl::GenerateChildProcessUniqueId(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OffTheRecord() OVERRIDE { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ResourceContext* GetResourceContext() OVERRIDE { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return resource_context_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void SetPluginInfo(const WebPluginInfo& info) OVERRIDE {} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFoundPluginProcessHost(PluginProcessHost* host) OVERRIDE {} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSentPluginChannelRequest() OVERRIDE {} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelOpened(const IPC::ChannelHandle& handle) OVERRIDE { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConnectToChannel(handle, false); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balancing the AddRef call. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnError() OVERRIDE { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Couldn't open plugin channel"; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalDone(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balancing the AddRef call. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PpapiPluginProcessHost::BrokerClient implementation. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetPpapiChannelInfo(base::ProcessHandle* renderer_handle, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* renderer_id) OVERRIDE { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *renderer_handle = base::kNullProcessHandle; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *renderer_id = 0; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPpapiChannelOpened( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::ChannelHandle& channel_handle, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId /* peer_pid */, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int /* child_id */) OVERRIDE { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!channel_handle.name.empty()) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConnectToChannel(channel_handle, true); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balancing the AddRef call. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener methods. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(Context, message) 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IPC_MESSAGE_HANDLER(PluginProcessHostMsg_ClearSiteDataResult, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnClearSiteDataResult) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiHostMsg_ClearSiteDataResult, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPpapiClearSiteDataResult) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED_ERROR() 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelError() OVERRIDE { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_removing_) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Channel error"; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalDone(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* event() { return event_.get(); } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::DeleteHelper<Context>; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Context() {} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::Message* CreatePpapiClearSiteDataMsg(uint64 max_age) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_path = 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperFlashFileMessageFilter::GetDataDirName(browser_context_path_); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(vtl): This "duplicates" logic in webkit/plugins/ppapi/file_path.cc 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (which prepends the plugin name to the relative part of the path 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // instead, with the absolute, profile-dependent part being enforced by 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser). 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath plugin_data_path = 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_path.Append(base::FilePath(base::UTF8ToUTF16(plugin_name_))); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath plugin_data_path = 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_path.Append(base::FilePath(plugin_name_)); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_WIN) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new PpapiMsg_ClearSiteData(0u, plugin_data_path, std::string(), 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kClearAllData, max_age); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connects the client side of a newly opened plug-in channel. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConnectToChannel(const IPC::ChannelHandle& handle, bool is_ppapi) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we timed out, don't bother connecting. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_removing_) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!channel_.get()); 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_ = IPC::Channel::CreateClient(handle, this); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!channel_->Connect()) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Couldn't connect to plugin"; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalDone(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 max_age = begin_time_.is_null() ? 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::numeric_limits<uint64>::max() : 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (base::Time::Now() - begin_time_).InSeconds(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* msg; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_ppapi) { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg = CreatePpapiClearSiteDataMsg(max_age); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) msg = new PluginProcessMsg_ClearSiteData( 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string(), kClearAllData, max_age); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!channel_->Send(msg)) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Couldn't send ClearSiteData message"; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalDone(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the PpapiHostMsg_ClearSiteDataResult message by delegating to the 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // PluginProcessHostMsg_ClearSiteDataResult handler. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPpapiClearSiteDataResult(uint32 request_id, bool success) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(0u, request_id); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnClearSiteDataResult(success); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Handles the PluginProcessHostMsg_ClearSiteDataResult message. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnClearSiteDataResult(bool success) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG_IF(ERROR, !success) << "ClearSiteData returned error"; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("ClearPluginData.time", 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - remove_start_time_); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalDone(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals that we are finished with removing data (successful or not). This 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method is safe to call multiple times. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SignalDone() { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_removing_) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_removing_ = false; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_->Signal(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::WaitableEvent> event_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The point in time when we start removing data. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time remove_start_time_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The point in time from which on we remove data. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time begin_time_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_removing_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Path for the current profile. Must be retrieved on the UI thread from the 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser context when we start so we can use it later on the I/O thread. 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath browser_context_path_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resource context for the profile. Use only on the I/O thread. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceContext* resource_context_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The name of the plugin. Use only on the I/O thread. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string plugin_name_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The channel is NULL until we have opened a connection to the plug-in 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IPC::Channel> channel_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginDataRemoverImpl::PluginDataRemoverImpl(BrowserContext* browser_context) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : mime_type_(kFlashPluginSwfMimeType), 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context_(browser_context) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginDataRemoverImpl::~PluginDataRemoverImpl() { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::WaitableEvent* PluginDataRemoverImpl::StartRemoving( 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time begin_time) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!context_.get()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_ = new Context(begin_time, browser_context_); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_->Init(mime_type_); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_->event(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 319