summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-25 22:11:20 +0000
committernick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-25 22:11:20 +0000
commit7d5304251b0e8b4e14fc9c349587e9e619569eff (patch)
tree29164474702570b9543f26420af369bf01fcf103
parentb2e3459b4cf865f7114b254986cb30335742017d (diff)
downloadchromium_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.h35
-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.h67
-rw-r--r--chrome/browser/task_manager/task_manager.cc8
-rw-r--r--chrome/chrome_browser.gypi4
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',