diff options
author | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-25 22:11:20 +0000 |
---|---|---|
committer | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-25 22:11:20 +0000 |
commit | 7d5304251b0e8b4e14fc9c349587e9e619569eff (patch) | |
tree | 29164474702570b9543f26420af369bf01fcf103 | |
parent | b2e3459b4cf865f7114b254986cb30335742017d (diff) | |
download | chromium_src-7d5304251b0e8b4e14fc9c349587e9e619569eff.zip chromium_src-7d5304251b0e8b4e14fc9c349587e9e619569eff.tar.gz chromium_src-7d5304251b0e8b4e14fc9c349587e9e619569eff.tar.bz2 |
Revert "Step 2 in unifying the task manager's WebContents-based ResourceProviders."
We're seeing crashes in the field.
BUG=356087,355501,355642
TBR=avi@chromium.org
Review URL: https://codereview.chromium.org/211433004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@259358 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/task_manager/extension_information.h | 35 | ||||
-rw-r--r-- | chrome/browser/task_manager/extension_process_resource_provider.cc (renamed from chrome/browser/task_manager/extension_information.cc) | 157 | ||||
-rw-r--r-- | chrome/browser/task_manager/extension_process_resource_provider.h | 67 | ||||
-rw-r--r-- | chrome/browser/task_manager/task_manager.cc | 8 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 |
5 files changed, 212 insertions, 59 deletions
diff --git a/chrome/browser/task_manager/extension_information.h b/chrome/browser/task_manager/extension_information.h deleted file mode 100644 index 101fbb0..0000000 --- a/chrome/browser/task_manager/extension_information.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_TASK_MANAGER_EXTENSION_INFORMATION_H_ -#define CHROME_BROWSER_TASK_MANAGER_EXTENSION_INFORMATION_H_ - -#include "base/basictypes.h" -#include "chrome/browser/task_manager/web_contents_information.h" - -namespace task_manager { - -class ExtensionProcessResource; - -// WebContentsInformation for WebContentses that are owned by the Extensions -// system. -class ExtensionInformation - : public NotificationObservingWebContentsInformation { - public: - ExtensionInformation(); - virtual ~ExtensionInformation(); - - // WebContentsInformation implementation. - virtual bool CheckOwnership(content::WebContents* web_contents) OVERRIDE; - virtual void GetAll(const NewWebContentsCallback& callback) OVERRIDE; - virtual scoped_ptr<RendererResource> MakeResource( - content::WebContents* web_contents) OVERRIDE; - - private: - DISALLOW_COPY_AND_ASSIGN(ExtensionInformation); -}; - -} // namespace task_manager - -#endif // CHROME_BROWSER_TASK_MANAGER_EXTENSION_INFORMATION_H_ diff --git a/chrome/browser/task_manager/extension_information.cc b/chrome/browser/task_manager/extension_process_resource_provider.cc index 18a3ac2..3505150 100644 --- a/chrome/browser/task_manager/extension_information.cc +++ b/chrome/browser/task_manager/extension_process_resource_provider.cc @@ -2,19 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/task_manager/extension_information.h" +#include "chrome/browser/task_manager/extension_process_resource_provider.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/task_manager/renderer_resource.h" +#include "chrome/browser/task_manager/resource_provider.h" +#include "chrome/browser/task_manager/task_manager.h" #include "chrome/browser/task_manager/task_manager_util.h" +#include "content/public/browser/notification_details.h" +#include "content/public/browser/notification_service.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" +#include "extensions/browser/extension_host.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" @@ -108,14 +114,49 @@ bool ExtensionProcessResource::IsBackground() const { } //////////////////////////////////////////////////////////////////////////////// -// ExtensionInformation class +// ExtensionProcessResourceProvider class //////////////////////////////////////////////////////////////////////////////// -ExtensionInformation::ExtensionInformation() {} +ExtensionProcessResourceProvider:: + ExtensionProcessResourceProvider(TaskManager* task_manager) + : task_manager_(task_manager), + updating_(false) { +} + +ExtensionProcessResourceProvider::~ExtensionProcessResourceProvider() { +} + +Resource* ExtensionProcessResourceProvider::GetResource( + int origin_pid, + int child_id, + int route_id) { + // If an origin PID was specified, the request is from a plugin, not the + // render view host process + if (origin_pid) + return NULL; + + content::RenderFrameHost* rfh = + content::RenderFrameHost::FromID(child_id, route_id); + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(rfh); + + for (ExtensionRenderViewHostMap::iterator i = resources_.begin(); + i != resources_.end(); i++) { + content::WebContents* view_contents = + content::WebContents::FromRenderViewHost(i->first); + if (web_contents == view_contents) + return i->second; + } -ExtensionInformation::~ExtensionInformation() {} + // Can happen if the page went away while a network request was being + // performed. + return NULL; +} + +void ExtensionProcessResourceProvider::StartUpdating() { + DCHECK(!updating_); + updating_ = true; -void ExtensionInformation::GetAll(const NewWebContentsCallback& callback) { // Add all the existing extension views from all Profiles, including those // from incognito split mode. ProfileManager* profile_manager = g_browser_process->profile_manager(); @@ -136,35 +177,117 @@ void ExtensionInformation::GetAll(const NewWebContentsCallback& callback) { extensions::ProcessManager::ViewSet::const_iterator jt = all_views.begin(); for (; jt != all_views.end(); ++jt) { - WebContents* web_contents = WebContents::FromRenderViewHost(*jt); - if (CheckOwnership(web_contents)) - callback.Run(web_contents); + content::RenderViewHost* rvh = *jt; + // Don't add dead extension processes. + if (!rvh->IsRenderViewLive()) + continue; + + AddToTaskManager(rvh); } } } + + // Register for notifications about extension process changes. + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, + content::NotificationService::AllBrowserContextsAndSources()); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, + content::NotificationService::AllBrowserContextsAndSources()); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED, + content::NotificationService::AllBrowserContextsAndSources()); } -bool ExtensionInformation::CheckOwnership(WebContents* web_contents) { +void ExtensionProcessResourceProvider::StopUpdating() { + DCHECK(updating_); + updating_ = false; + + // Unregister for notifications about extension process changes. + registrar_.Remove( + this, chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, + content::NotificationService::AllBrowserContextsAndSources()); + registrar_.Remove( + this, chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED, + content::NotificationService::AllBrowserContextsAndSources()); + registrar_.Remove( + this, chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED, + content::NotificationService::AllBrowserContextsAndSources()); + + // Delete all the resources. + STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); + + resources_.clear(); +} + +void ExtensionProcessResourceProvider::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + switch (type) { + case chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED: + AddToTaskManager( + content::Details<content::RenderViewHost>(details).ptr()); + break; + case chrome::NOTIFICATION_EXTENSION_PROCESS_TERMINATED: + RemoveFromTaskManager( + content::Details<extensions::ExtensionHost>(details).ptr()-> + render_view_host()); + break; + case chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED: + RemoveFromTaskManager( + content::Details<content::RenderViewHost>(details).ptr()); + break; + default: + NOTREACHED() << "Unexpected notification."; + return; + } +} + +bool ExtensionProcessResourceProvider:: + IsHandledByThisProvider(content::RenderViewHost* render_view_host) { + WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); // Don't add WebContents that belong to a guest (those are handled by // GuestInformation). Otherwise they will be added twice. if (web_contents->GetRenderProcessHost()->IsGuest()) return false; - extensions::ViewType view_type = extensions::GetViewType(web_contents); - // Don't add tab contents (those are handled by TabContentsResourceProvider) // or background contents (handled by BackgroundInformation) or panels // (handled by PanelInformation) - return (view_type != extensions::VIEW_TYPE_INVALID && - view_type != extensions::VIEW_TYPE_TAB_CONTENTS && + return (view_type != extensions::VIEW_TYPE_TAB_CONTENTS && view_type != extensions::VIEW_TYPE_BACKGROUND_CONTENTS && view_type != extensions::VIEW_TYPE_PANEL); } -scoped_ptr<RendererResource> ExtensionInformation::MakeResource( - WebContents* web_contents) { - return scoped_ptr<RendererResource>( - new ExtensionProcessResource(web_contents->GetRenderViewHost())); +void ExtensionProcessResourceProvider::AddToTaskManager( + content::RenderViewHost* render_view_host) { + if (!IsHandledByThisProvider(render_view_host)) + return; + + if (resources_.count(render_view_host)) + return; + ExtensionProcessResource* resource = + new ExtensionProcessResource(render_view_host); + resources_[render_view_host] = resource; + task_manager_->AddResource(resource); +} + +void ExtensionProcessResourceProvider::RemoveFromTaskManager( + content::RenderViewHost* render_view_host) { + if (!updating_) + return; + std::map<content::RenderViewHost*, ExtensionProcessResource*> + ::iterator iter = resources_.find(render_view_host); + if (iter == resources_.end()) + return; + + // Remove the resource from the Task Manager. + ExtensionProcessResource* resource = iter->second; + task_manager_->RemoveResource(resource); + + // Remove it from the provider. + resources_.erase(iter); + + // Finally, delete the resource. + delete resource; } } // namespace task_manager diff --git a/chrome/browser/task_manager/extension_process_resource_provider.h b/chrome/browser/task_manager/extension_process_resource_provider.h new file mode 100644 index 0000000..e2d0e7b --- /dev/null +++ b/chrome/browser/task_manager/extension_process_resource_provider.h @@ -0,0 +1,67 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TASK_MANAGER_EXTENSION_PROCESS_RESOURCE_PROVIDER_H_ +#define CHROME_BROWSER_TASK_MANAGER_EXTENSION_PROCESS_RESOURCE_PROVIDER_H_ + +#include <map> + +#include "base/basictypes.h" +#include "chrome/browser/task_manager/resource_provider.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" + +class TaskManager; + +namespace content { +class RenderViewHost; +} + +namespace task_manager { + +class ExtensionProcessResource; + +class ExtensionProcessResourceProvider + : public ResourceProvider, + public content::NotificationObserver { + public: + explicit ExtensionProcessResourceProvider(TaskManager* task_manager); + + virtual Resource* GetResource(int origin_pid, + int child_id, + int route_id) OVERRIDE; + virtual void StartUpdating() OVERRIDE; + virtual void StopUpdating() OVERRIDE; + + // content::NotificationObserver method: + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE; + + private: + virtual ~ExtensionProcessResourceProvider(); + + bool IsHandledByThisProvider(content::RenderViewHost* render_view_host); + void AddToTaskManager(content::RenderViewHost* render_view_host); + void RemoveFromTaskManager(content::RenderViewHost* render_view_host); + + TaskManager* task_manager_; + + // Maps the actual resources (content::RenderViewHost*) to the Task Manager + // resources. + typedef std::map<content::RenderViewHost*, ExtensionProcessResource*> + ExtensionRenderViewHostMap; + ExtensionRenderViewHostMap resources_; + + // A scoped container for notification registries. + content::NotificationRegistrar registrar_; + + bool updating_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionProcessResourceProvider); +}; + +} // namespace task_manager + +#endif // CHROME_BROWSER_TASK_MANAGER_EXTENSION_PROCESS_RESOURCE_PROVIDER_H_ diff --git a/chrome/browser/task_manager/task_manager.cc b/chrome/browser/task_manager/task_manager.cc index c8ea3ca..a2aea08 100644 --- a/chrome/browser/task_manager/task_manager.cc +++ b/chrome/browser/task_manager/task_manager.cc @@ -20,7 +20,7 @@ #include "chrome/browser/task_manager/background_information.h" #include "chrome/browser/task_manager/browser_process_resource_provider.h" #include "chrome/browser/task_manager/child_process_resource_provider.h" -#include "chrome/browser/task_manager/extension_information.h" +#include "chrome/browser/task_manager/extension_process_resource_provider.h" #include "chrome/browser/task_manager/guest_information.h" #include "chrome/browser/task_manager/panel_information.h" #include "chrome/browser/task_manager/resource_provider.h" @@ -260,10 +260,8 @@ TaskManagerModel::TaskManagerModel(TaskManager* task_manager) new task_manager::PanelInformation()))); AddResourceProvider( new task_manager::ChildProcessResourceProvider(task_manager)); - AddResourceProvider(new task_manager::WebContentsResourceProvider( - task_manager, - scoped_ptr<WebContentsInformation>( - new task_manager::ExtensionInformation()))); + AddResourceProvider( + new task_manager::ExtensionProcessResourceProvider(task_manager)); AddResourceProvider(new task_manager::WebContentsResourceProvider( task_manager, scoped_ptr<WebContentsInformation>( diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 7b83c81..af17cb0 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -2513,8 +2513,8 @@ 'browser/task_manager/browser_process_resource_provider.h', 'browser/task_manager/child_process_resource_provider.cc', 'browser/task_manager/child_process_resource_provider.h', - 'browser/task_manager/extension_information.cc', - 'browser/task_manager/extension_information.h', + 'browser/task_manager/extension_process_resource_provider.cc', + 'browser/task_manager/extension_process_resource_provider.h', 'browser/task_manager/guest_information.cc', 'browser/task_manager/guest_information.h', 'browser/task_manager/notification_resource_provider.cc', |