blob: eb0c9b7f3c746cb43cb9201028bcbb523687732c [file] [log] [blame]
[email protected]46a32b92012-03-22 13:04:481// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]398206c2010-06-21 01:46:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]a07676b22011-06-17 16:36:535#ifndef CHROME_BROWSER_BACKGROUND_BACKGROUND_CONTENTS_SERVICE_H_
6#define CHROME_BROWSER_BACKGROUND_BACKGROUND_CONTENTS_SERVICE_H_
[email protected]398206c2010-06-21 01:46:087
avie4d7b6f2015-12-26 00:59:188#include <stdint.h>
9
[email protected]398206c2010-06-21 01:46:0810#include <map>
[email protected]bb95acab2011-11-16 22:22:2711#include <string>
[email protected]da58f5b12010-11-10 19:31:1212#include <vector>
[email protected]398206c2010-06-21 01:46:0813
[email protected]19118d52010-07-26 22:13:4214#include "base/gtest_prod_util.h"
avie4d7b6f2015-12-26 00:59:1815#include "base/macros.h"
[email protected]2c4fb7b2011-04-02 06:33:2916#include "base/memory/ref_counted.h"
apacible1c2329112016-09-08 16:49:4417#include "base/memory/weak_ptr.h"
[email protected]7cf82862014-07-25 18:52:5218#include "base/scoped_observer.h"
avi71d0f762014-12-15 16:08:4719#include "chrome/browser/background/background_contents.h"
[email protected]95003d522014-03-13 20:22:3120#include "components/keyed_service/core/keyed_service.h"
[email protected]6c2381d2011-10-19 02:52:5321#include "content/public/browser/notification_observer.h"
22#include "content/public/browser/notification_registrar.h"
Jose Dapena Paz56b99b402019-07-18 14:13:1423#include "extensions/browser/extension_registry.h"
[email protected]7cf82862014-07-25 18:52:5224#include "extensions/browser/extension_registry_observer.h"
apaciblefb3b9fa2016-08-31 04:28:1525#include "net/base/backoff_entry.h"
[email protected]f47621b2013-01-22 20:50:3326#include "ui/base/window_open_disposition.h"
[email protected]761fa4702013-07-02 15:25:1527#include "url/gurl.h"
[email protected]398206c2010-06-21 01:46:0828
[email protected]398206c2010-06-21 01:46:0829class PrefService;
30class Profile;
[email protected]bc093872010-08-16 21:49:0831
[email protected]f3a1c642011-07-12 19:15:0332namespace base {
[email protected]2f3b1cc2014-03-17 23:07:1533class CommandLine;
[email protected]f3a1c642011-07-12 19:15:0334class DictionaryValue;
Nigel Tao28338b82018-11-27 21:40:3735} // namespace base
[email protected]f3a1c642011-07-12 19:15:0336
[email protected]dd6730412013-08-14 15:03:3737namespace content {
38class SessionStorageNamespace;
39}
40
[email protected]cca7d542013-09-20 07:16:4141namespace extensions {
42class Extension;
Nigel Tao28338b82018-11-27 21:40:3743} // namespace extensions
[email protected]cca7d542013-09-20 07:16:4144
[email protected]bc093872010-08-16 21:49:0845namespace gfx {
46class Rect;
47}
48
Evan Stade6670c332019-06-18 20:56:1249class BackgroundContentsServiceObserver;
[email protected]398206c2010-06-21 01:46:0850
51// BackgroundContentsService is owned by the profile, and is responsible for
52// managing the lifetime of BackgroundContents (tracking the set of background
53// urls, loading them at startup, and keeping the browser process alive as long
54// as there are BackgroundContents loaded).
55//
56// It is also responsible for tracking the association between
57// BackgroundContents and their parent app, and shutting them down when the
58// parent app is unloaded.
[email protected]6c2381d2011-10-19 02:52:5359class BackgroundContentsService : private content::NotificationObserver,
[email protected]7cf82862014-07-25 18:52:5260 public extensions::ExtensionRegistryObserver,
[email protected]d2fad142011-04-15 10:18:4461 public BackgroundContents::Delegate,
[email protected]95003d522014-03-13 20:22:3162 public KeyedService {
[email protected]398206c2010-06-21 01:46:0863 public:
[email protected]2f3b1cc2014-03-17 23:07:1564 BackgroundContentsService(Profile* profile,
65 const base::CommandLine* command_line);
Daniel Chenga542fca2014-10-21 09:51:2966 ~BackgroundContentsService() override;
[email protected]398206c2010-06-21 01:46:0867
[email protected]6b9dafc2013-08-30 15:41:5968 // Allows tests to reduce the time between a force-installed app/extension
[email protected]cca7d542013-09-20 07:16:4169 // crashing and when we reload it.
70 static void SetRestartDelayForForceInstalledAppsAndExtensionsForTesting(
71 int restart_delay_in_ms);
[email protected]6b9dafc2013-08-30 15:41:5972
juyik048931af2014-10-06 17:56:3073 // Get the crash notification's delegate id for the extension.
74 static std::string GetNotificationDelegateIdForExtensionForTesting(
[email protected]84695f22014-02-18 02:29:3275 const std::string& extension_id);
76
77 // Show a popup notification balloon with a crash message for a given app/
78 // extension.
79 static void ShowBalloonForTesting(const extensions::Extension* extension,
80 Profile* profile);
81
skyostil0becb332015-04-27 17:59:3782 // Disable closing the crash notification balloon for tests.
83 static void DisableCloseBalloonForTesting(
84 bool disable_close_balloon_for_testing);
85
Evan Stade6670c332019-06-18 20:56:1286 void AddObserver(BackgroundContentsServiceObserver* observer);
87 void RemoveObserver(BackgroundContentsServiceObserver* observer);
88
[email protected]398206c2010-06-21 01:46:0889 // Returns the BackgroundContents associated with the passed application id,
90 // or NULL if none.
Evan Stade092530b2017-11-21 17:17:0591 BackgroundContents* GetAppBackgroundContents(const std::string& appid);
[email protected]398206c2010-06-21 01:46:0892
[email protected]88ea00f2012-05-04 01:17:2793 // Returns true if there's a registered BackgroundContents for this app. It
94 // is possible for this routine to return true when GetAppBackgroundContents()
95 // returns false, if the BackgroundContents closed due to the render process
96 // crashing.
Evan Stade092530b2017-11-21 17:17:0597 bool HasRegisteredBackgroundContents(const std::string& appid);
[email protected]88ea00f2012-05-04 01:17:2798
[email protected]da58f5b12010-11-10 19:31:1299 // Returns all currently opened BackgroundContents (used by the task manager).
100 std::vector<BackgroundContents*> GetBackgroundContents() const;
101
[email protected]bc093872010-08-16 21:49:08102 // BackgroundContents::Delegate implementation.
erikchenbee5c9622018-04-27 19:30:25103 void AddWebContents(std::unique_ptr<content::WebContents> new_contents,
Joel Hockey891e88062020-04-30 05:38:44104 const GURL& target_url,
Daniel Chenga542fca2014-10-21 09:51:29105 WindowOpenDisposition disposition,
bokan107a47f2015-02-03 23:23:39106 const gfx::Rect& initial_rect,
Daniel Chenga542fca2014-10-21 09:51:29107 bool* was_blocked) override;
Evan Stade6670c332019-06-18 20:56:12108 void OnBackgroundContentsNavigated(BackgroundContents* contents) override;
109 void OnBackgroundContentsTerminated(BackgroundContents* contents) override;
110 void OnBackgroundContentsClosed(BackgroundContents* contents) override;
Evan Stadece3af4f2019-10-07 17:04:20111
112 // KeyedService implementation.
113 void Shutdown() override;
[email protected]bc093872010-08-16 21:49:08114
[email protected]da58f5b12010-11-10 19:31:12115 // Gets the parent application id for the passed BackgroundContents. Returns
116 // an empty string if no parent application found (e.g. passed
117 // BackgroundContents has already shut down).
Evan Stade092530b2017-11-21 17:17:05118 const std::string& GetParentApplicationId(BackgroundContents* contents) const;
[email protected]da58f5b12010-11-10 19:31:12119
120 // Creates a new BackgroundContents using the passed |site| and
Albert J. Wong1ceccef92019-10-08 08:25:20121 // begins tracking the object internally so it can be shutdown if the parent
122 // application is uninstalled.
Evan Stadeae2652f2019-10-01 14:53:50123 // Observers will receive a OnBackgroundContentsOpened call.
[email protected]dd6730412013-08-14 15:03:37124 BackgroundContents* CreateBackgroundContents(
dchengbccd6b82016-03-30 16:24:19125 scoped_refptr<content::SiteInstance> site,
lukasza6f8ac622017-06-06 03:10:20126 content::RenderFrameHost* opener,
Albert J. Wong1ceccef92019-10-08 08:25:20127 bool is_new_browsing_instance,
nasko48321ca32015-07-02 20:44:12128 const std::string& frame_name,
Evan Stade092530b2017-11-21 17:17:05129 const std::string& application_id,
[email protected]dd6730412013-08-14 15:03:37130 const std::string& partition_id,
131 content::SessionStorageNamespace* session_storage_namespace);
[email protected]da58f5b12010-11-10 19:31:12132
Evan Stadece3af4f2019-10-07 17:04:20133 // Removes |contents| from |contents_map_|, deleting it.
134 void DeleteBackgroundContents(BackgroundContents* contents);
135
[email protected]41619a9a2011-04-13 20:07:32136 // Load the manifest-specified background page for the specified hosted app.
137 // If the manifest doesn't specify one, then load the BackgroundContents
138 // registered in the pref. This is typically used to reload a crashed
139 // background page.
Evan Stadeae2652f2019-10-01 14:53:50140 void LoadBackgroundContentsForExtension(const std::string& extension_id);
[email protected]2c4fb7b2011-04-02 06:33:29141
[email protected]398206c2010-06-21 01:46:08142 private:
143 friend class BackgroundContentsServiceTest;
[email protected]da58f5b12010-11-10 19:31:12144 friend class MockBackgroundContents;
[email protected]2c4fb7b2011-04-02 06:33:29145
[email protected]19118d52010-07-26 22:13:42146 FRIEND_TEST_ALL_PREFIXES(BackgroundContentsServiceTest,
147 BackgroundContentsCreateDestroy);
148 FRIEND_TEST_ALL_PREFIXES(BackgroundContentsServiceTest,
149 TestApplicationIDLinkage);
[email protected]398206c2010-06-21 01:46:08150
151 // Registers for various notifications.
Evan Stade6670c332019-06-18 20:56:12152 void StartObserving();
[email protected]398206c2010-06-21 01:46:08153
[email protected]6c2381d2011-10-19 02:52:53154 // content::NotificationObserver implementation.
Daniel Chenga542fca2014-10-21 09:51:29155 void Observe(int type,
156 const content::NotificationSource& source,
157 const content::NotificationDetails& details) override;
[email protected]398206c2010-06-21 01:46:08158
limasdfa845ec32016-11-01 03:33:27159 // Called when ExtensionSystem is ready.
Evan Stade6670c332019-06-18 20:56:12160 void OnExtensionSystemReady();
limasdfa845ec32016-11-01 03:33:27161
[email protected]7cf82862014-07-25 18:52:52162 // extensions::ExtensionRegistryObserver implementation.
Daniel Chenga542fca2014-10-21 09:51:29163 void OnExtensionLoaded(content::BrowserContext* browser_context,
164 const extensions::Extension* extension) override;
limasdf0deef2042017-05-03 19:17:17165 void OnExtensionUnloaded(content::BrowserContext* browser_context,
166 const extensions::Extension* extension,
167 extensions::UnloadedExtensionReason reason) override;
Daniel Chenga542fca2014-10-21 09:51:29168 void OnExtensionUninstalled(content::BrowserContext* browser_context,
169 const extensions::Extension* extension,
170 extensions::UninstallReason reason) override;
[email protected]7cf82862014-07-25 18:52:52171
[email protected]cca7d542013-09-20 07:16:41172 // Restarts a force-installed app/extension after a crash.
[email protected]6b9dafc2013-08-30 15:41:59173 void RestartForceInstalledExtensionOnCrash(
Evan Stadeae2652f2019-10-01 14:53:50174 const extensions::Extension* extension);
[email protected]6b9dafc2013-08-30 15:41:59175
[email protected]398206c2010-06-21 01:46:08176 // Loads all registered BackgroundContents at startup.
Evan Stadeae2652f2019-10-01 14:53:50177 void LoadBackgroundContentsFromPrefs();
[email protected]398206c2010-06-21 01:46:08178
[email protected]2c4fb7b2011-04-02 06:33:29179 // Load a BackgroundContent; the settings are read from the provided
180 // dictionary.
[email protected]f3a1c642011-07-12 19:15:03181 void LoadBackgroundContentsFromDictionary(
[email protected]f3a1c642011-07-12 19:15:03182 const std::string& extension_id,
183 const base::DictionaryValue* contents);
[email protected]2c4fb7b2011-04-02 06:33:29184
[email protected]41619a9a2011-04-13 20:07:32185 // Load the manifest-specified BackgroundContents for all apps for the
186 // profile.
Evan Stadeae2652f2019-10-01 14:53:50187 void LoadBackgroundContentsFromManifests();
[email protected]41619a9a2011-04-13 20:07:32188
[email protected]da58f5b12010-11-10 19:31:12189 // Creates a single BackgroundContents associated with the specified |appid|,
190 // creates an associated RenderView with the name specified by |frame_name|,
191 // and navigates to the passed |url|.
Evan Stadeae2652f2019-10-01 14:53:50192 void LoadBackgroundContents(const GURL& url,
nasko48321ca32015-07-02 20:44:12193 const std::string& frame_name,
Evan Stade092530b2017-11-21 17:17:05194 const std::string& appid);
[email protected]398206c2010-06-21 01:46:08195
196 // Invoked when a new BackgroundContents is opened.
Evan Stadece3af4f2019-10-07 17:04:20197 void AddBackgroundContents(std::unique_ptr<BackgroundContents> contents,
198 const std::string& application_id,
199 const std::string& frame_name);
[email protected]398206c2010-06-21 01:46:08200
[email protected]398206c2010-06-21 01:46:08201 // Registers the |contents->GetURL()| to be run at startup. Only happens for
202 // the first navigation after window.open() (future calls to
203 // RegisterBackgroundContents() for the same BackgroundContents will do
204 // nothing).
205 void RegisterBackgroundContents(BackgroundContents* contents);
206
207 // Stops loading the passed BackgroundContents on startup.
208 void UnregisterBackgroundContents(BackgroundContents* contents);
209
210 // Unregisters and deletes the BackgroundContents associated with the
211 // passed extension.
Evan Stade092530b2017-11-21 17:17:05212 void ShutdownAssociatedBackgroundContents(const std::string& appid);
[email protected]398206c2010-06-21 01:46:08213
214 // Returns true if this BackgroundContents is in the contents_list_.
215 bool IsTracked(BackgroundContents* contents) const;
216
[email protected]88ea00f2012-05-04 01:17:27217 // Sends out a notification when our association of background contents with
218 // apps may have changed (used by BackgroundApplicationListModel to update the
219 // set of background apps as new background contents are opened/closed).
Evan Stade6670c332019-06-18 20:56:12220 void SendChangeNotification();
[email protected]88ea00f2012-05-04 01:17:27221
apacible1c2329112016-09-08 16:49:44222 // Checks whether there has been additional |extension_id| failures. If not,
223 // delete the BackoffEntry corresponding to |extension_id|, if exists.
224 void MaybeClearBackoffEntry(const std::string extension_id,
225 int expected_failure_count);
226
Evan Stade6670c332019-06-18 20:56:12227 void HandleExtensionCrashed(const extensions::Extension* extension);
228
[email protected]6b9dafc2013-08-30 15:41:59229 // Delay (in ms) before restarting a force-installed extension that crashed.
230 static int restart_delay_in_ms_;
231
Evan Stade6670c332019-06-18 20:56:12232 Profile* profile_;
233
234 base::ObserverList<BackgroundContentsServiceObserver> observers_;
235
[email protected]398206c2010-06-21 01:46:08236 // PrefService used to store list of background pages (or NULL if this is
[email protected]2c910b72011-03-08 21:16:32237 // running under an incognito profile).
Evan Stade6670c332019-06-18 20:56:12238 PrefService* prefs_ = nullptr;
[email protected]6c2381d2011-10-19 02:52:53239 content::NotificationRegistrar registrar_;
[email protected]398206c2010-06-21 01:46:08240
241 // Information we track about each BackgroundContents.
242 struct BackgroundContentsInfo {
Evan Stadece3af4f2019-10-07 17:04:20243 BackgroundContentsInfo();
244 ~BackgroundContentsInfo();
245
[email protected]398206c2010-06-21 01:46:08246 // The BackgroundContents whose information we are tracking.
Evan Stadece3af4f2019-10-07 17:04:20247 std::unique_ptr<BackgroundContents> contents;
[email protected]398206c2010-06-21 01:46:08248 // The name of the top level frame for this BackgroundContents.
nasko48321ca32015-07-02 20:44:12249 std::string frame_name;
[email protected]398206c2010-06-21 01:46:08250 };
251
252 // Map associating currently loaded BackgroundContents with their parent
253 // applications.
254 // Key: application id
255 // Value: BackgroundContentsInfo for the BC associated with that application
Evan Stade092530b2017-11-21 17:17:05256 typedef std::map<std::string, BackgroundContentsInfo> BackgroundContentsMap;
[email protected]398206c2010-06-21 01:46:08257 BackgroundContentsMap contents_map_;
258
apaciblefb3b9fa2016-08-31 04:28:15259 // Map associating component extensions that have attempted to reload with a
260 // BackoffEntry keeping track of retry timing.
261 typedef std::map<extensions::ExtensionId, std::unique_ptr<net::BackoffEntry>>
apacible1c2329112016-09-08 16:49:44262 ComponentExtensionBackoffEntryMap;
263 ComponentExtensionBackoffEntryMap component_backoff_map_;
apaciblefb3b9fa2016-08-31 04:28:15264
[email protected]7cf82862014-07-25 18:52:52265 ScopedObserver<extensions::ExtensionRegistry,
266 extensions::ExtensionRegistryObserver>
Evan Stade6670c332019-06-18 20:56:12267 extension_registry_observer_{this};
[email protected]7cf82862014-07-25 18:52:52268
Evan Stade6670c332019-06-18 20:56:12269 base::WeakPtrFactory<BackgroundContentsService> weak_ptr_factory_{this};
apacible1c2329112016-09-08 16:49:44270
[email protected]398206c2010-06-21 01:46:08271 DISALLOW_COPY_AND_ASSIGN(BackgroundContentsService);
272};
273
[email protected]a07676b22011-06-17 16:36:53274#endif // CHROME_BROWSER_BACKGROUND_BACKGROUND_CONTENTS_SERVICE_H_