blob: 3f34a6ec42cfcdd13328686ea1a0723d84dee038 [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"
Sigurdur Asgeirssonc2d58ce2021-05-10 19:13:0218#include "base/scoped_observation.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);
Peter Boström53c6c5952021-09-17 09:41:2666
67 BackgroundContentsService(const BackgroundContentsService&) = delete;
68 BackgroundContentsService& operator=(const BackgroundContentsService&) =
69 delete;
70
Daniel Chenga542fca2014-10-21 09:51:2971 ~BackgroundContentsService() override;
[email protected]398206c2010-06-21 01:46:0872
[email protected]6b9dafc2013-08-30 15:41:5973 // Allows tests to reduce the time between a force-installed app/extension
[email protected]cca7d542013-09-20 07:16:4174 // crashing and when we reload it.
75 static void SetRestartDelayForForceInstalledAppsAndExtensionsForTesting(
76 int restart_delay_in_ms);
[email protected]6b9dafc2013-08-30 15:41:5977
juyik048931af2014-10-06 17:56:3078 // Get the crash notification's delegate id for the extension.
79 static std::string GetNotificationDelegateIdForExtensionForTesting(
[email protected]84695f22014-02-18 02:29:3280 const std::string& extension_id);
81
82 // Show a popup notification balloon with a crash message for a given app/
83 // extension.
84 static void ShowBalloonForTesting(const extensions::Extension* extension,
85 Profile* profile);
86
skyostil0becb332015-04-27 17:59:3787 // Disable closing the crash notification balloon for tests.
88 static void DisableCloseBalloonForTesting(
89 bool disable_close_balloon_for_testing);
90
Evan Stade6670c332019-06-18 20:56:1291 void AddObserver(BackgroundContentsServiceObserver* observer);
92 void RemoveObserver(BackgroundContentsServiceObserver* observer);
93
[email protected]398206c2010-06-21 01:46:0894 // Returns the BackgroundContents associated with the passed application id,
95 // or NULL if none.
Evan Stade092530b2017-11-21 17:17:0596 BackgroundContents* GetAppBackgroundContents(const std::string& appid);
[email protected]398206c2010-06-21 01:46:0897
[email protected]88ea00f2012-05-04 01:17:2798 // Returns true if there's a registered BackgroundContents for this app. It
99 // is possible for this routine to return true when GetAppBackgroundContents()
100 // returns false, if the BackgroundContents closed due to the render process
101 // crashing.
Evan Stade092530b2017-11-21 17:17:05102 bool HasRegisteredBackgroundContents(const std::string& appid);
[email protected]88ea00f2012-05-04 01:17:27103
[email protected]da58f5b12010-11-10 19:31:12104 // Returns all currently opened BackgroundContents (used by the task manager).
105 std::vector<BackgroundContents*> GetBackgroundContents() const;
106
[email protected]bc093872010-08-16 21:49:08107 // BackgroundContents::Delegate implementation.
erikchenbee5c9622018-04-27 19:30:25108 void AddWebContents(std::unique_ptr<content::WebContents> new_contents,
Joel Hockey891e88062020-04-30 05:38:44109 const GURL& target_url,
Daniel Chenga542fca2014-10-21 09:51:29110 WindowOpenDisposition disposition,
bokan107a47f2015-02-03 23:23:39111 const gfx::Rect& initial_rect,
Daniel Chenga542fca2014-10-21 09:51:29112 bool* was_blocked) override;
Evan Stade6670c332019-06-18 20:56:12113 void OnBackgroundContentsNavigated(BackgroundContents* contents) override;
114 void OnBackgroundContentsTerminated(BackgroundContents* contents) override;
115 void OnBackgroundContentsClosed(BackgroundContents* contents) override;
Evan Stadece3af4f2019-10-07 17:04:20116
117 // KeyedService implementation.
118 void Shutdown() override;
[email protected]bc093872010-08-16 21:49:08119
[email protected]da58f5b12010-11-10 19:31:12120 // Gets the parent application id for the passed BackgroundContents. Returns
121 // an empty string if no parent application found (e.g. passed
122 // BackgroundContents has already shut down).
Evan Stade092530b2017-11-21 17:17:05123 const std::string& GetParentApplicationId(BackgroundContents* contents) const;
[email protected]da58f5b12010-11-10 19:31:12124
125 // Creates a new BackgroundContents using the passed |site| and
Albert J. Wong1ceccef92019-10-08 08:25:20126 // begins tracking the object internally so it can be shutdown if the parent
127 // application is uninstalled.
Evan Stadeae2652f2019-10-01 14:53:50128 // Observers will receive a OnBackgroundContentsOpened call.
[email protected]dd6730412013-08-14 15:03:37129 BackgroundContents* CreateBackgroundContents(
dchengbccd6b82016-03-30 16:24:19130 scoped_refptr<content::SiteInstance> site,
lukasza6f8ac622017-06-06 03:10:20131 content::RenderFrameHost* opener,
Albert J. Wong1ceccef92019-10-08 08:25:20132 bool is_new_browsing_instance,
nasko48321ca32015-07-02 20:44:12133 const std::string& frame_name,
Evan Stade092530b2017-11-21 17:17:05134 const std::string& application_id,
Aaron Colwellf3b316e2021-03-11 20:17:05135 const content::StoragePartitionId& partition_id,
[email protected]dd6730412013-08-14 15:03:37136 content::SessionStorageNamespace* session_storage_namespace);
[email protected]da58f5b12010-11-10 19:31:12137
Evan Stadece3af4f2019-10-07 17:04:20138 // Removes |contents| from |contents_map_|, deleting it.
139 void DeleteBackgroundContents(BackgroundContents* contents);
140
[email protected]41619a9a2011-04-13 20:07:32141 // Load the manifest-specified background page for the specified hosted app.
142 // If the manifest doesn't specify one, then load the BackgroundContents
143 // registered in the pref. This is typically used to reload a crashed
144 // background page.
Evan Stadeae2652f2019-10-01 14:53:50145 void LoadBackgroundContentsForExtension(const std::string& extension_id);
[email protected]2c4fb7b2011-04-02 06:33:29146
[email protected]398206c2010-06-21 01:46:08147 private:
148 friend class BackgroundContentsServiceTest;
[email protected]da58f5b12010-11-10 19:31:12149 friend class MockBackgroundContents;
[email protected]2c4fb7b2011-04-02 06:33:29150
[email protected]19118d52010-07-26 22:13:42151 FRIEND_TEST_ALL_PREFIXES(BackgroundContentsServiceTest,
152 BackgroundContentsCreateDestroy);
153 FRIEND_TEST_ALL_PREFIXES(BackgroundContentsServiceTest,
154 TestApplicationIDLinkage);
[email protected]398206c2010-06-21 01:46:08155
156 // Registers for various notifications.
Evan Stade6670c332019-06-18 20:56:12157 void StartObserving();
[email protected]398206c2010-06-21 01:46:08158
[email protected]6c2381d2011-10-19 02:52:53159 // content::NotificationObserver implementation.
Daniel Chenga542fca2014-10-21 09:51:29160 void Observe(int type,
161 const content::NotificationSource& source,
162 const content::NotificationDetails& details) override;
[email protected]398206c2010-06-21 01:46:08163
limasdfa845ec32016-11-01 03:33:27164 // Called when ExtensionSystem is ready.
Evan Stade6670c332019-06-18 20:56:12165 void OnExtensionSystemReady();
limasdfa845ec32016-11-01 03:33:27166
[email protected]7cf82862014-07-25 18:52:52167 // extensions::ExtensionRegistryObserver implementation.
Daniel Chenga542fca2014-10-21 09:51:29168 void OnExtensionLoaded(content::BrowserContext* browser_context,
169 const extensions::Extension* extension) override;
limasdf0deef2042017-05-03 19:17:17170 void OnExtensionUnloaded(content::BrowserContext* browser_context,
171 const extensions::Extension* extension,
172 extensions::UnloadedExtensionReason reason) override;
Daniel Chenga542fca2014-10-21 09:51:29173 void OnExtensionUninstalled(content::BrowserContext* browser_context,
174 const extensions::Extension* extension,
175 extensions::UninstallReason reason) override;
[email protected]7cf82862014-07-25 18:52:52176
[email protected]cca7d542013-09-20 07:16:41177 // Restarts a force-installed app/extension after a crash.
[email protected]6b9dafc2013-08-30 15:41:59178 void RestartForceInstalledExtensionOnCrash(
Evan Stadeae2652f2019-10-01 14:53:50179 const extensions::Extension* extension);
[email protected]6b9dafc2013-08-30 15:41:59180
[email protected]398206c2010-06-21 01:46:08181 // Loads all registered BackgroundContents at startup.
Evan Stadeae2652f2019-10-01 14:53:50182 void LoadBackgroundContentsFromPrefs();
[email protected]398206c2010-06-21 01:46:08183
[email protected]2c4fb7b2011-04-02 06:33:29184 // Load a BackgroundContent; the settings are read from the provided
185 // dictionary.
[email protected]f3a1c642011-07-12 19:15:03186 void LoadBackgroundContentsFromDictionary(
[email protected]f3a1c642011-07-12 19:15:03187 const std::string& extension_id,
188 const base::DictionaryValue* contents);
[email protected]2c4fb7b2011-04-02 06:33:29189
[email protected]41619a9a2011-04-13 20:07:32190 // Load the manifest-specified BackgroundContents for all apps for the
191 // profile.
Evan Stadeae2652f2019-10-01 14:53:50192 void LoadBackgroundContentsFromManifests();
[email protected]41619a9a2011-04-13 20:07:32193
[email protected]da58f5b12010-11-10 19:31:12194 // Creates a single BackgroundContents associated with the specified |appid|,
195 // creates an associated RenderView with the name specified by |frame_name|,
196 // and navigates to the passed |url|.
Evan Stadeae2652f2019-10-01 14:53:50197 void LoadBackgroundContents(const GURL& url,
nasko48321ca32015-07-02 20:44:12198 const std::string& frame_name,
Evan Stade092530b2017-11-21 17:17:05199 const std::string& appid);
[email protected]398206c2010-06-21 01:46:08200
201 // Invoked when a new BackgroundContents is opened.
Evan Stadece3af4f2019-10-07 17:04:20202 void AddBackgroundContents(std::unique_ptr<BackgroundContents> contents,
203 const std::string& application_id,
204 const std::string& frame_name);
[email protected]398206c2010-06-21 01:46:08205
[email protected]398206c2010-06-21 01:46:08206 // Registers the |contents->GetURL()| to be run at startup. Only happens for
207 // the first navigation after window.open() (future calls to
208 // RegisterBackgroundContents() for the same BackgroundContents will do
209 // nothing).
210 void RegisterBackgroundContents(BackgroundContents* contents);
211
212 // Stops loading the passed BackgroundContents on startup.
213 void UnregisterBackgroundContents(BackgroundContents* contents);
214
215 // Unregisters and deletes the BackgroundContents associated with the
216 // passed extension.
Evan Stade092530b2017-11-21 17:17:05217 void ShutdownAssociatedBackgroundContents(const std::string& appid);
[email protected]398206c2010-06-21 01:46:08218
219 // Returns true if this BackgroundContents is in the contents_list_.
220 bool IsTracked(BackgroundContents* contents) const;
221
[email protected]88ea00f2012-05-04 01:17:27222 // Sends out a notification when our association of background contents with
223 // apps may have changed (used by BackgroundApplicationListModel to update the
224 // set of background apps as new background contents are opened/closed).
Evan Stade6670c332019-06-18 20:56:12225 void SendChangeNotification();
[email protected]88ea00f2012-05-04 01:17:27226
apacible1c2329112016-09-08 16:49:44227 // Checks whether there has been additional |extension_id| failures. If not,
228 // delete the BackoffEntry corresponding to |extension_id|, if exists.
229 void MaybeClearBackoffEntry(const std::string extension_id,
230 int expected_failure_count);
231
Evan Stade6670c332019-06-18 20:56:12232 void HandleExtensionCrashed(const extensions::Extension* extension);
233
[email protected]6b9dafc2013-08-30 15:41:59234 // Delay (in ms) before restarting a force-installed extension that crashed.
235 static int restart_delay_in_ms_;
236
Evan Stade6670c332019-06-18 20:56:12237 Profile* profile_;
238
239 base::ObserverList<BackgroundContentsServiceObserver> observers_;
240
[email protected]398206c2010-06-21 01:46:08241 // PrefService used to store list of background pages (or NULL if this is
[email protected]2c910b72011-03-08 21:16:32242 // running under an incognito profile).
Evan Stade6670c332019-06-18 20:56:12243 PrefService* prefs_ = nullptr;
[email protected]6c2381d2011-10-19 02:52:53244 content::NotificationRegistrar registrar_;
[email protected]398206c2010-06-21 01:46:08245
246 // Information we track about each BackgroundContents.
247 struct BackgroundContentsInfo {
Evan Stadece3af4f2019-10-07 17:04:20248 BackgroundContentsInfo();
249 ~BackgroundContentsInfo();
250
[email protected]398206c2010-06-21 01:46:08251 // The BackgroundContents whose information we are tracking.
Evan Stadece3af4f2019-10-07 17:04:20252 std::unique_ptr<BackgroundContents> contents;
[email protected]398206c2010-06-21 01:46:08253 // The name of the top level frame for this BackgroundContents.
nasko48321ca32015-07-02 20:44:12254 std::string frame_name;
[email protected]398206c2010-06-21 01:46:08255 };
256
257 // Map associating currently loaded BackgroundContents with their parent
258 // applications.
259 // Key: application id
260 // Value: BackgroundContentsInfo for the BC associated with that application
Evan Stade092530b2017-11-21 17:17:05261 typedef std::map<std::string, BackgroundContentsInfo> BackgroundContentsMap;
[email protected]398206c2010-06-21 01:46:08262 BackgroundContentsMap contents_map_;
263
apaciblefb3b9fa2016-08-31 04:28:15264 // Map associating component extensions that have attempted to reload with a
265 // BackoffEntry keeping track of retry timing.
266 typedef std::map<extensions::ExtensionId, std::unique_ptr<net::BackoffEntry>>
apacible1c2329112016-09-08 16:49:44267 ComponentExtensionBackoffEntryMap;
268 ComponentExtensionBackoffEntryMap component_backoff_map_;
apaciblefb3b9fa2016-08-31 04:28:15269
Sigurdur Asgeirssonc2d58ce2021-05-10 19:13:02270 base::ScopedObservation<extensions::ExtensionRegistry,
271 extensions::ExtensionRegistryObserver>
272 extension_registry_observation_{this};
[email protected]7cf82862014-07-25 18:52:52273
Evan Stade6670c332019-06-18 20:56:12274 base::WeakPtrFactory<BackgroundContentsService> weak_ptr_factory_{this};
[email protected]398206c2010-06-21 01:46:08275};
276
[email protected]a07676b22011-06-17 16:36:53277#endif // CHROME_BROWSER_BACKGROUND_BACKGROUND_CONTENTS_SERVICE_H_