| Index: chrome/browser/background_contents_service.cc
|
| diff --git a/chrome/browser/background_contents_service.cc b/chrome/browser/background_contents_service.cc
|
| index f35420b30a51df387f18d966d2d3d6de4d890f73..c10d9d21669178f13c683241bfe4946fde7707de 100644
|
| --- a/chrome/browser/background_contents_service.cc
|
| +++ b/chrome/browser/background_contents_service.cc
|
| @@ -9,7 +9,7 @@
|
| #include "base/string_util.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "base/values.h"
|
| -#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/browser_list.h"
|
| #include "chrome/browser/extensions/extensions_service.h"
|
| #include "chrome/browser/pref_service.h"
|
| #include "chrome/browser/profile.h"
|
| @@ -39,7 +39,8 @@ const wchar_t kFrameNameKey[] = L"name";
|
|
|
| BackgroundContentsService::BackgroundContentsService(
|
| Profile* profile, const CommandLine* command_line)
|
| - : prefs_(NULL) {
|
| + : prefs_(NULL),
|
| + always_keep_alive_(command_line->HasSwitch(switches::kKeepAliveForTest)) {
|
| // Don't load/store preferences if the proper switch is not enabled, or if
|
| // the parent profile is off the record.
|
| if (!profile->IsOffTheRecord() &&
|
| @@ -83,6 +84,14 @@ void BackgroundContentsService::StartObserving(Profile* profile) {
|
| // BackgroundContents.
|
| registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
|
| Source<Profile>(profile));
|
| +
|
| + if (always_keep_alive_ && !profile->IsOffTheRecord()) {
|
| + // For testing, keep the browser process alive until there is an explicit
|
| + // shutdown.
|
| + registrar_.Add(this, NotificationType::APP_TERMINATING,
|
| + NotificationService::AllSources());
|
| + BrowserList::StartKeepAlive();
|
| + }
|
| }
|
|
|
| void BackgroundContentsService::Observe(NotificationType type,
|
| @@ -111,6 +120,11 @@ void BackgroundContentsService::Observe(NotificationType type,
|
| ShutdownAssociatedBackgroundContents(
|
| ASCIIToUTF16(Details<Extension>(details)->id()));
|
| break;
|
| + case NotificationType::APP_TERMINATING:
|
| + // Performing an explicit shutdown, so allow the browser process to exit.
|
| + DCHECK(always_keep_alive_);
|
| + BrowserList::EndKeepAlive();
|
| + break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| @@ -172,8 +186,12 @@ void BackgroundContentsService::CreateBackgroundContents(
|
| BackgroundContents* contents = new BackgroundContents(
|
| SiteInstance::CreateSiteInstanceForURL(profile, url), MSG_ROUTING_NONE);
|
|
|
| - contents_map_[application_id].contents = contents;
|
| - contents_map_[application_id].frame_name = frame_name;
|
| + // TODO(atwilson): Change this to send a BACKGROUND_CONTENTS_CREATED
|
| + // notification when we have a listener outside of BackgroundContentsService.
|
| + BackgroundContentsOpenedDetails details = {contents,
|
| + frame_name,
|
| + application_id};
|
| + BackgroundContentsOpened(&details);
|
|
|
| RenderViewHost* render_view_host = contents->render_view_host();
|
| // TODO(atwilson): Create RenderViews asynchronously to avoid increasing
|
| @@ -233,10 +251,8 @@ void BackgroundContentsService::BackgroundContentsOpened(
|
| BackgroundContentsOpenedDetails* details) {
|
| // If this is the first BackgroundContents loaded, kick ourselves into
|
| // persistent mode.
|
| - // TODO(atwilson): Enable this when we support running with no active windows
|
| - // on all platforms (http://crbug.com/45275).
|
| - // if (contents_map_.empty())
|
| - // g_browser_process->AddRefModule();
|
| + if (contents_map_.empty())
|
| + BrowserList::StartKeepAlive();
|
|
|
| // Add the passed object to our list. Should not already be tracked.
|
| DCHECK(!IsTracked(details->contents));
|
| @@ -260,10 +276,8 @@ void BackgroundContentsService::BackgroundContentsShutdown(
|
| contents_map_.erase(appid);
|
| // If we have no more BackgroundContents active, then stop keeping the browser
|
| // process alive.
|
| - // TODO(atwilson): Enable this when we support running with no active windows
|
| - // on all platforms (http://crbug.com/45275).
|
| - // if (contents_map_.empty())
|
| - // g_browser_process->ReleaseModule();
|
| + if (contents_map_.empty())
|
| + BrowserList::EndKeepAlive();
|
| }
|
|
|
| BackgroundContents* BackgroundContentsService::GetAppBackgroundContents(
|
|
|