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