172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file. 4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#ifndef CHROME_BROWSER_PLUGIN_DATA_REMOVER_H_ 6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#define CHROME_BROWSER_PLUGIN_DATA_REMOVER_H_ 7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#pragma once 8201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/time.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/plugin_process_host.h" 12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass Task; 14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace base { 16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass MessageLoopProxy; 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass WaitableEvent; 18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass PluginDataRemover : public base::RefCountedThreadSafe<PluginDataRemover>, 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public PluginProcessHost::Client, 22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public IPC::Channel::Listener { 23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public: 24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch PluginDataRemover(); 25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The plug-in whose data should be removed (usually Flash) is specified via 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // its MIME type. This method sets a different MIME type in order to call a 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // different plug-in (for example in tests). 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; } 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Starts removing plug-in data stored since |begin_time|. 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::WaitableEvent* StartRemoving(base::Time begin_time); 33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns whether there is a plug-in installed that supports removing 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // LSO data. Because this method possibly has to load the plug-in list, it 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // should only be called on the FILE thread. 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static bool IsSupported(); 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Indicates whether we are still in the process of removing plug-in data. 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool is_removing() const { return is_removing_; } 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Wait until removing has finished. When the browser is still running (i.e. 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // not during shutdown), you should use a WaitableEventWatcher in combination 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // with the WaitableEvent returned by StartRemoving. 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Wait(); 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // PluginProcessHost::Client methods. 48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual int ID(); 49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual bool OffTheRecord(); 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void SetPluginInfo(const webkit::npapi::WebPluginInfo& info); 51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual void OnChannelOpened(const IPC::ChannelHandle& handle); 52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual void OnError(); 53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // IPC::Channel::Listener methods. 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool OnMessageReceived(const IPC::Message& message); 56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual void OnChannelError(); 57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private: 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen friend class base::RefCountedThreadSafe<PluginDataRemover>; 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen friend class PluginDataRemoverTest; 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ~PluginDataRemover(); 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Signals that we are finished with removing data (successful or not). This 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // method is safe to call multiple times. 65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void SignalDone(); 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Connects the client side of a newly opened plug-in channel. 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void ConnectToChannel(const IPC::ChannelHandle& handle); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Handles the PluginHostMsg_ClearSiteDataResult message. 69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void OnClearSiteDataResult(bool success); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when a timeout happens in order not to block the client 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // indefinitely. 72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void OnTimeout(); 73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string mime_type_; 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool is_removing_; 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The point in time when we start removing data. 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::Time remove_start_time_; 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The point in time from which on we remove data. 79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch base::Time begin_time_; 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<base::WaitableEvent> event_; 81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // We own the channel, but it's used on the IO thread, so it needs to be 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // deleted there. It's NULL until we have opened a connection to the plug-in 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // process. 84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch IPC::Channel* channel_; 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(PluginDataRemover); 87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}; 88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif // CHROME_BROWSER_PLUGIN_DATA_REMOVER_H_ 90