summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-21 20:57:26 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-21 20:57:26 +0000
commitd2aa06b4b5f2be4a76a895e3c6e4e041218af42a (patch)
tree810ef408dad702eb5f0c59f125e2cd31e81df7a6 /chrome
parentcfb09c2d58ecb16b14192619695ea54570344ca7 (diff)
downloadchromium_src-d2aa06b4b5f2be4a76a895e3c6e4e041218af42a.zip
chromium_src-d2aa06b4b5f2be4a76a895e3c6e4e041218af42a.tar.gz
chromium_src-d2aa06b4b5f2be4a76a895e3c6e4e041218af42a.tar.bz2
Keep lazy background pages open while they're being inspected.
Also add has_{lazy,persistent}_background_page helpers to Extension. BUG=81752 TEST=Inspect a lazy background page; it should remain open until you close the inspector. Review URL: https://chromiumcodereview.appspot.com/9768003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128055 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/extension_event_router.cc7
-rw-r--r--chrome/browser/extensions/extension_host.cc6
-rw-r--r--chrome/browser/extensions/extension_host.h1
-rw-r--r--chrome/browser/extensions/extension_message_service.cc2
-rw-r--r--chrome/browser/extensions/extension_process_manager.cc44
-rw-r--r--chrome/browser/extensions/lazy_background_task_queue.cc4
-rw-r--r--chrome/common/extensions/extension.h6
-rw-r--r--chrome/renderer/extensions/event_bindings.cc2
-rw-r--r--chrome/renderer/extensions/extension_dispatcher.cc3
9 files changed, 56 insertions, 19 deletions
diff --git a/chrome/browser/extensions/extension_event_router.cc b/chrome/browser/extensions/extension_event_router.cc
index 673e86b..7c27f9a 100644
--- a/chrome/browser/extensions/extension_event_router.cc
+++ b/chrome/browser/extensions/extension_event_router.cc
@@ -403,8 +403,7 @@ void ExtensionEventRouter::MaybeLoadLazyBackgroundPage(
bool ExtensionEventRouter::CanDispatchEventNow(
Profile* profile, const Extension* extension) {
DCHECK(extension);
- if (extension->has_background_page() &&
- !extension->background_page_persists()) {
+ if (extension->has_lazy_background_page()) {
ExtensionProcessManager* pm = profile->GetExtensionProcessManager();
ExtensionHost* background_host =
pm->GetBackgroundHostForExtension(extension->id());
@@ -417,7 +416,7 @@ bool ExtensionEventRouter::CanDispatchEventNow(
void ExtensionEventRouter::IncrementInFlightEvents(
Profile* profile, const Extension* extension) {
- if (!extension->background_page_persists()) {
+ if (extension->has_lazy_background_page()) {
profile->GetExtensionProcessManager()->IncrementLazyKeepaliveCount(
extension);
}
@@ -427,7 +426,7 @@ void ExtensionEventRouter::OnExtensionEventAck(
Profile* profile, const std::string& extension_id) {
const Extension* extension =
profile->GetExtensionService()->extensions()->GetByID(extension_id);
- if (extension && !extension->background_page_persists()) {
+ if (extension && extension->has_lazy_background_page()) {
profile->GetExtensionProcessManager()->DecrementLazyKeepaliveCount(
extension);
}
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 803c562..bd0e252 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -217,19 +217,19 @@ void ExtensionHost::CreateRenderViewNow() {
}
void ExtensionHost::SendShouldClose() {
- CHECK(!extension()->background_page_persists());
+ CHECK(extension()->has_lazy_background_page());
render_view_host()->Send(new ExtensionMsg_ShouldClose(
extension()->id(), ++close_sequence_id_));
// TODO(mpcomplete): start timeout
}
void ExtensionHost::CancelShouldClose() {
- CHECK(!extension()->background_page_persists());
+ CHECK(extension()->has_lazy_background_page());
++close_sequence_id_;
}
void ExtensionHost::OnShouldCloseAck(int sequence_id) {
- CHECK(!extension()->background_page_persists());
+ CHECK(extension()->has_lazy_background_page());
if (sequence_id != close_sequence_id_)
return;
Close();
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index e4a177c..00beecd 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -181,7 +181,6 @@ class ExtensionHost : public content::WebContentsDelegate,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
- protected:
private:
friend class ProcessCreationQueue;
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index 6a14c1a..043ae38 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -435,7 +435,7 @@ bool ExtensionMessageService::MaybeAddPendingOpenChannelTask(
ExtensionService* service = profile->GetExtensionService();
const std::string& extension_id = params.target_extension_id;
const Extension* extension = service->extensions()->GetByID(extension_id);
- if (extension && !extension->background_page_persists()) {
+ if (extension && extension->has_lazy_background_page()) {
// If the extension uses spanning incognito mode, make sure we're always
// using the original profile since that is what the extension process
// will use.
diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc
index 47e8990..af6ad45 100644
--- a/chrome/browser/extensions/extension_process_manager.cc
+++ b/chrome/browser/extensions/extension_process_manager.cc
@@ -97,8 +97,7 @@ class IncognitoExtensionProcessManager : public ExtensionProcessManager {
static void CreateBackgroundHostForExtensionLoad(
ExtensionProcessManager* manager, const Extension* extension) {
- if (extension->has_background_page() &&
- extension->background_page_persists()) {
+ if (extension->has_persistent_background_page()) {
manager->CreateBackgroundHost(extension, extension->GetBackgroundURL());
}
}
@@ -141,6 +140,10 @@ ExtensionProcessManager::ExtensionProcessManager(Profile* profile)
content::NotificationService::AllSources());
registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING,
content::NotificationService::AllSources());
+ registrar_.Add(this, content::NOTIFICATION_DEVTOOLS_WINDOW_OPENING,
+ content::Source<content::BrowserContext>(profile));
+ registrar_.Add(this, content::NOTIFICATION_DEVTOOLS_WINDOW_CLOSING,
+ content::Source<content::BrowserContext>(profile));
}
ExtensionProcessManager::~ExtensionProcessManager() {
@@ -359,7 +362,7 @@ bool ExtensionProcessManager::HasExtensionHost(ExtensionHost* host) const {
}
int ExtensionProcessManager::GetLazyKeepaliveCount(const Extension* extension) {
- if (extension->background_page_persists())
+ if (!extension->has_lazy_background_page())
return 0;
return ::GetLazyKeepaliveCount(GetProfile(), extension);
@@ -367,7 +370,7 @@ int ExtensionProcessManager::GetLazyKeepaliveCount(const Extension* extension) {
int ExtensionProcessManager::IncrementLazyKeepaliveCount(
const Extension* extension) {
- if (extension->background_page_persists())
+ if (!extension->has_lazy_background_page())
return 0;
int& count = ::GetLazyKeepaliveCount(GetProfile(), extension);
@@ -379,7 +382,7 @@ int ExtensionProcessManager::IncrementLazyKeepaliveCount(
int ExtensionProcessManager::DecrementLazyKeepaliveCount(
const Extension* extension) {
- if (extension->background_page_persists())
+ if (!extension->has_lazy_background_page())
return 0;
int& count = ::GetLazyKeepaliveCount(GetProfile(), extension);
@@ -495,6 +498,37 @@ void ExtensionProcessManager::Observe(
break;
}
+ case content::NOTIFICATION_DEVTOOLS_WINDOW_OPENING: {
+ RenderViewHost* render_view_host =
+ content::Details<RenderViewHost>(details).ptr();
+ // Keep the lazy background page alive while it's being inspected.
+ // Balanced in response to the CLOSING notification.
+ if (render_view_host->GetDelegate()->GetRenderViewType() ==
+ chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
+ const Extension* extension =
+ GetProfile()->GetExtensionService()->extensions()->GetByID(
+ GetExtensionID(render_view_host));
+ if (extension)
+ IncrementLazyKeepaliveCount(extension);
+ }
+ break;
+ }
+
+ case content::NOTIFICATION_DEVTOOLS_WINDOW_CLOSING: {
+ RenderViewHost* render_view_host =
+ content::Details<RenderViewHost>(details).ptr();
+ // Balanced in response to the OPENING notification.
+ if (render_view_host->GetDelegate()->GetRenderViewType() ==
+ chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
+ const Extension* extension =
+ GetProfile()->GetExtensionService()->extensions()->GetByID(
+ GetExtensionID(render_view_host));
+ if (extension)
+ DecrementLazyKeepaliveCount(extension);
+ }
+ break;
+ }
+
default:
NOTREACHED();
}
diff --git a/chrome/browser/extensions/lazy_background_task_queue.cc b/chrome/browser/extensions/lazy_background_task_queue.cc
index a4a5a2c..718c377 100644
--- a/chrome/browser/extensions/lazy_background_task_queue.cc
+++ b/chrome/browser/extensions/lazy_background_task_queue.cc
@@ -49,7 +49,7 @@ void LazyBackgroundTaskQueue::AddPendingTask(
// is loaded.
const Extension* extension = profile->GetExtensionService()->
extensions()->GetByID(extension_id);
- DCHECK(!extension->background_page_persists());
+ DCHECK(extension->has_lazy_background_page());
ExtensionProcessManager* pm = profile->GetExtensionProcessManager();
pm->IncrementLazyKeepaliveCount(extension);
pm->CreateBackgroundHost(extension, extension->GetBackgroundURL());
@@ -95,7 +95,7 @@ void LazyBackgroundTaskQueue::Observe(
if (host->profile()->IsSameProfile(profile_) &&
host->extension_host_type() ==
chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE &&
- !host->extension()->background_page_persists()) {
+ host->extension()->has_lazy_background_page()) {
CHECK(host->did_stop_loading());
ProcessPendingTasks(host);
}
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h
index 3760b0b..039a446 100644
--- a/chrome/common/extensions/extension.h
+++ b/chrome/common/extensions/extension.h
@@ -564,6 +564,12 @@ class Extension : public base::RefCountedThreadSafe<Extension> {
return background_scripts_;
}
bool background_page_persists() const { return background_page_persists_; }
+ bool has_persistent_background_page() const {
+ return has_background_page() && background_page_persists();
+ }
+ bool has_lazy_background_page() const {
+ return has_background_page() && !background_page_persists();
+ }
const GURL& options_url() const { return options_url_; }
const GURL& devtools_url() const { return devtools_url_; }
const ExtensionPermissionSet* optional_permission_set() const {
diff --git a/chrome/renderer/extensions/event_bindings.cc b/chrome/renderer/extensions/event_bindings.cc
index f187f27..cfaea1a 100644
--- a/chrome/renderer/extensions/event_bindings.cc
+++ b/chrome/renderer/extensions/event_bindings.cc
@@ -145,7 +145,7 @@ class ExtensionImpl : public ChromeV8Extension {
ExtensionHelper* helper = ExtensionHelper::Get(render_view);
const ::Extension* extension =
extension_dispatcher()->extensions()->GetByID(extension_id);
- return (extension && !extension->background_page_persists() &&
+ return (extension && extension->has_lazy_background_page() &&
helper->view_type() == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE);
}
};
diff --git a/chrome/renderer/extensions/extension_dispatcher.cc b/chrome/renderer/extensions/extension_dispatcher.cc
index c489c3a..1833d64 100644
--- a/chrome/renderer/extensions/extension_dispatcher.cc
+++ b/chrome/renderer/extensions/extension_dispatcher.cc
@@ -229,8 +229,7 @@ void ExtensionDispatcher::OnMessageInvoke(const std::string& extension_id,
const Extension* extension = extensions_.GetByID(extension_id);
// Tell the browser process that the event is dispatched and we're idle.
- // TODO(mpcomplete): differentiate between background page and other views.
- if (extension && !extension->background_page_persists() &&
+ if (extension && extension->has_lazy_background_page() &&
function_name == "Event.dispatchJSON") { // may always be true
RenderThread::Get()->Send(
new ExtensionHostMsg_ExtensionEventAck(extension_id));