diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-21 20:57:26 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-21 20:57:26 +0000 |
commit | d2aa06b4b5f2be4a76a895e3c6e4e041218af42a (patch) | |
tree | 810ef408dad702eb5f0c59f125e2cd31e81df7a6 /chrome | |
parent | cfb09c2d58ecb16b14192619695ea54570344ca7 (diff) | |
download | chromium_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.cc | 7 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 6 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.h | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_message_service.cc | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_process_manager.cc | 44 | ||||
-rw-r--r-- | chrome/browser/extensions/lazy_background_task_queue.cc | 4 | ||||
-rw-r--r-- | chrome/common/extensions/extension.h | 6 | ||||
-rw-r--r-- | chrome/renderer/extensions/event_bindings.cc | 2 | ||||
-rw-r--r-- | chrome/renderer/extensions/extension_dispatcher.cc | 3 |
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)); |