Index: chrome/browser/ui/hung_plugin_tab_helper.h |
diff --git a/chrome/browser/ui/hung_plugin_tab_helper.h b/chrome/browser/ui/hung_plugin_tab_helper.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bea4e381924fc63d25c7aa79e1a9adc9fea244f4 |
--- /dev/null |
+++ b/chrome/browser/ui/hung_plugin_tab_helper.h |
@@ -0,0 +1,108 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_UI_HUNG_PLUGIN_TAB_HELPER_H_ |
+#define CHROME_BROWSER_UI_HUNG_PLUGIN_TAB_HELPER_H_ |
+ |
+#include <map> |
+ |
+#include "base/file_path.h" |
+#include "base/memory/linked_ptr.h" |
+#include "base/string16.h" |
+#include "base/time.h" |
+#include "base/timer.h" |
+ |
+class FilePath; |
+class InfoBarTabHelper; |
+ |
+namespace content { |
+class WebContents; |
+} |
+ |
+// Manages per-tab state with regard to hung plugins. This only handles |
+// Pepper plugins which we know are windowless. Hung NPAPI plugins (which |
+// may have native windows) can not be handled with infobars and have a |
+// separate OS-specific hang monitoring. |
+// |
+// Our job is: |
+// - Pop up an infobar when a plugin is hung. |
+// - Terminate the plugin process if the user so chooses. |
+// - Periodically re-show the hung plugin infobar if the user closes it without |
+// terminating the plugin. |
+// - Hide the infobar if the plugin starts responding again. |
+// - Keep track of all of this for any number of plugins. |
+class HungPluginTabHelper { |
+ public: |
+ explicit HungPluginTabHelper(content::WebContents* contents); |
+ ~HungPluginTabHelper(); |
+ |
+ void PluginCrashed(const FilePath& plugin_path); |
+ |
+ void PluginHungStatusChanged(int plugin_child_id, |
+ const FilePath& plugin_path, |
+ bool is_hung); |
+ |
+ private: |
+ class InfoBarDelegate; |
+ friend class InfoBarDelegate; |
+ |
+ // Per-plugin state (since there could be more than one plugin hung). The |
+ // integer key is the child process ID of the plugin process. This maintains |
+ // the state for all plugins on this page that are currently hung, whether or |
+ // not we're currently showing the infobar. |
+ struct PluginState { |
+ // Initializes the plugin state to be a hung plugin. |
+ PluginState(const FilePath& p, const string16& n); |
+ ~PluginState(); |
+ |
+ FilePath path; |
+ string16 name; |
+ |
+ // Possibly-null if we're not showing an infobar right now. |
+ InfoBarDelegate* info_bar; |
+ |
+ // Time to delay before re-showing the infobar for a hung plugin. This is |
+ // increased each time the user cancels it. |
+ base::TimeDelta next_reshow_delay; |
+ |
+ // Handles calling the helper when the infobar should be re-shown. |
+ base::Timer timer; |
+ |
+ private: |
+ // Since the scope of the timer manages our callback, this struct should |
+ // not be copied. |
+ DISALLOW_COPY_AND_ASSIGN(PluginState); |
+ }; |
+ typedef std::map<int, linked_ptr<PluginState> > PluginStateMap; |
+ |
+ // Called by an infobar when the user selects to kill the plugin. |
+ void KillPlugin(int child_id); |
+ |
+ // Called by an infobar when the user presses the close button to dismiss the |
+ // bar without doing anything. |
+ void BarClosed(int child_id); |
+ |
+ // Called on a timer for a hung plugin to re-show the bar. |
+ void OnReshowTimer(int child_id); |
+ |
+ // Shows the bar for the plugin identified by the given state, updating the |
+ // state accordingly. The plugin must not have an infobar already. |
+ void ShowBar(int child_id, PluginState* state); |
+ |
+ // Closes the infobar associated with the given state. Note that this can |
+ // be called even if the bar is not opened, in which case it will do nothing. |
+ void CloseBar(PluginState* state); |
+ |
+ // Possibly returns null. |
+ InfoBarTabHelper* GetInfoBarHelper(); |
+ |
+ content::WebContents* contents_; |
+ |
+ // All currently hung plugins. |
+ PluginStateMap hung_plugins_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(HungPluginTabHelper); |
+}; |
+ |
+#endif // CHROME_BROWSER_UI_HUNG_PLUGIN_TAB_HELPER_H_ |