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_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/view_type.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DevToolsAgentHost;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstance;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionHost;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages dynamic state of running Chromium extensions. There is one instance
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of this class per Profile. OTR Profiles have a separate instance that keeps
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// track of split-mode extensions only.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionProcessManager : public content::NotificationObserver {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<extensions::ExtensionHost*> ExtensionHostSet;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ExtensionHostSet::const_iterator const_iterator;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionProcessManager* Create(Profile* profile);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionProcessManager();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ExtensionHostSet& background_hosts() const {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return background_hosts_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<content::RenderViewHost*> ViewSet;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ViewSet GetAllViews() const;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new ExtensionHost with its associated view, grouping it in the
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // appropriate SiteInstance (and therefore process) based on the URL and
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual extensions::ExtensionHost* CreateViewHost(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions::ViewType view_type);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* CreateViewHost(const GURL& url,
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            Browser* browser,
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            extensions::ViewType view_type);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* CreatePopupHost(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* CreatePopupHost(const GURL& url, Browser* browser);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* CreateDialogHost(const GURL& url);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* CreateInfobarHost(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* CreateInfobarHost(const GURL& url,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               Browser* browser);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new UI-less extension instance.  Like CreateViewHost, but not
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // displayed anywhere.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateBackgroundHost(const extensions::Extension* extension,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const GURL& url);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the ExtensionHost for the background page for an extension, or NULL if
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension isn't running or doesn't have a background page.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionHost* GetBackgroundHostForExtension(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the SiteInstance that the given URL belongs to.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(aa): This only returns correct results for extensions and packaged
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // apps, not hosted apps.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual content::SiteInstance* GetSiteInstanceForURL(const GURL& url);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregisters a RenderViewHost as hosting any extension.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnregisterRenderViewHost(content::RenderViewHost* render_view_host);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns all RenderViewHosts that are registered for the specified
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<content::RenderViewHost*> GetRenderViewHostsForExtension(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the extension associated with the specified RenderViewHost, or
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* GetExtensionForRenderViewHost(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the (lazy) background host for the given extension has
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // already been sent the unload event and is shutting down.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsBackgroundHostClosing(const std::string& extension_id);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter and setter for the lazy background page's keepalive count. This is
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the count of how many outstanding "things" are keeping the page alive.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When this reaches 0, we will begin the process of shutting down the page.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Things" include pending events, resource loads, and API calls.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetLazyKeepaliveCount(const extensions::Extension* extension);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int IncrementLazyKeepaliveCount(const extensions::Extension* extension);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int DecrementLazyKeepaliveCount(const extensions::Extension* extension);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncrementLazyKeepaliveCountForView(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handles a response to the ShouldSuspend message, used for lazy background
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pages.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnShouldSuspendAck(const std::string& extension_id, int sequence_id);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as above, for the Suspend message.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSuspendAck(const std::string& extension_id);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tracks network requests for a given RenderViewHost, used to know
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when network activity is idle for lazy background pages.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNetworkRequestStarted(content::RenderViewHost* render_view_host);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNetworkRequestDone(content::RenderViewHost* render_view_host);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prevents |extension|'s background page from being closed and sends the
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // onSuspendCanceled() event to it.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelSuspend(const extensions::Extension* extension);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ExtensionProcessManager(Profile* profile);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called just after |host| is created so it can be registered in our lists.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionHostCreated(extensions::ExtensionHost* host,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool is_background);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on browser shutdown to close our extension hosts.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseBackgroundHosts();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load all background pages once the profile data is ready and the pages
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should be loaded.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateBackgroundHostsForProfileStartup();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the profile associated with site_instance_ and all other
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // related SiteInstances.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* GetProfile() const;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of ExtensionHosts running viewless background extensions.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionHostSet background_hosts_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A SiteInstance related to the SiteInstance for all extensions in
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this profile.  We create it in such a way that a new
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browsing instance is created.  This controls process grouping.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<content::SiteInstance> site_instance_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extra information we keep for each extension's background page.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct BackgroundPageData;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::string ExtensionId;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<ExtensionId, BackgroundPageData> BackgroundPageDataMap;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<content::RenderViewHost*,
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions::ViewType> ExtensionRenderViews;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the given |host| iff it's a background page.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseBackgroundHost(extensions::ExtensionHost* host);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure browser object is not null except for certain situations.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnsureBrowserWhenRequired(Browser* browser,
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 extensions::ViewType view_type);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are called when the extension transitions between idle and active.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // They control the process of closing the background page when idle.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLazyBackgroundPageIdle(const std::string& extension_id,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int sequence_id);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLazyBackgroundPageActive(const std::string& extension_id);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseLazyBackgroundPageNow(const std::string& extension_id,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int sequence_id);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Potentially registers a RenderViewHost, if it is associated with an
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension. Does nothing if this is not an extension renderer.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RegisterRenderViewHost(content::RenderViewHost* render_view_host);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears background page data for this extension.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearBackgroundPageData(const std::string& extension_id);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if loading background pages should be deferred. This is
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // true if there are no browser windows open and the browser process was
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // started to show the app launcher.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DeferLoadingBackgroundHosts() const;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached);
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Contains all active extension-related RenderViewHost instances for all
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extensions. We also keep a cache of the host's view type, because that
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information is not accessible at registration/deregistration time.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionRenderViews all_extension_views_;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundPageDataMap background_page_data_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time to delay between an extension becoming idle and
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sending a ShouldSuspend message; read from command-line switch.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta event_page_idle_time_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The time to delay between sending a ShouldSuspend message and
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sending a Suspend message; read from command-line switch.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta event_page_suspending_time_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<ExtensionProcessManager> weak_ptr_factory_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionProcessManager);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_
230