hung_plugin_tab_helper.h revision 868fa2fe829687343ffae624259930155e16dbd8
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)#ifndef CHROME_BROWSER_UI_HUNG_PLUGIN_TAB_HELPER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_HUNG_PLUGIN_TAB_HELPER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/timer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InfoBarDelegate;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages per-tab state with regard to hung plugins. This only handles
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pepper plugins which we know are windowless. Hung NPAPI plugins (which
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// may have native windows) can not be handled with infobars and have a
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// separate OS-specific hang monitoring.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Our job is:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Pop up an infobar when a plugin is hung.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Terminate the plugin process if the user so chooses.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Periodically re-show the hung plugin infobar if the user closes it without
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   terminating the plugin.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Hide the infobar if the plugin starts responding again.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Keep track of all of this for any number of plugins.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HungPluginTabHelper
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::WebContentsObserver,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::NotificationObserver,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::WebContentsUserData<HungPluginTabHelper> {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HungPluginTabHelper();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // content::WebContentsObserver:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void PluginCrashed(const base::FilePath& plugin_path,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::ProcessId plugin_pid) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PluginHungStatusChanged(int plugin_child_id,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const base::FilePath& plugin_path,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool is_hung) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // content::NotificationObserver:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by an infobar when the user selects to kill the plugin.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void KillPlugin(int child_id);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class content::WebContentsUserData<HungPluginTabHelper>;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct PluginState;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int, linked_ptr<PluginState> > PluginStateMap;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit HungPluginTabHelper(content::WebContents* contents);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on a timer for a hung plugin to re-show the bar.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnReshowTimer(int child_id);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shows the bar for the plugin identified by the given state, updating the
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state accordingly. The plugin must not have an infobar already.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowBar(int child_id, PluginState* state);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes the infobar associated with the given state. Note that this can
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called even if the bar is not opened, in which case it will do nothing.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseBar(PluginState* state);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All currently hung plugins.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginStateMap hung_plugins_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HungPluginTabHelper);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_HUNG_PLUGIN_TAB_HELPER_H_
87