Index: chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc |
diff --git a/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc b/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc |
index abed85c140e5ad6026f0a663998565808277b96f..3a6defefc75395116e7343fa7a591417a7ae365a 100644 |
--- a/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc |
+++ b/chrome/browser/ui/webui/memory_internals/memory_internals_proxy.cc |
@@ -4,11 +4,15 @@ |
#include "chrome/browser/ui/webui/memory_internals/memory_internals_proxy.h" |
+#include <map> |
#include <set> |
#include <string> |
+#include <utility> |
#include <vector> |
#include "base/bind.h" |
+#include "base/memory/linked_ptr.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/strings/string16.h" |
#include "base/sys_info.h" |
#include "base/values.h" |
@@ -17,6 +21,7 @@ |
#include "chrome/browser/memory_details.h" |
#include "chrome/browser/prerender/prerender_manager.h" |
#include "chrome/browser/prerender/prerender_manager_factory.h" |
+#include "chrome/browser/process_resource_usage.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
@@ -29,13 +34,11 @@ |
#include "chrome/common/render_messages.h" |
#include "content/public/browser/navigation_controller.h" |
#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "content/public/browser/notification_service.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 "content/public/browser/web_ui.h" |
+#include "content/public/common/service_registry.h" |
#if defined(ENABLE_PRINT_PREVIEW) |
#include "chrome/browser/printing/background_printing_manager.h" |
@@ -118,34 +121,52 @@ void GetAllWebContents(std::set<content::WebContents*>* web_contents) { |
} // namespace |
-class RendererDetails : public content::NotificationObserver { |
+class RendererDetails { |
public: |
typedef base::Callback<void(const base::ProcessId pid, |
const size_t v8_allocated, |
const size_t v8_used)> V8DataCallback; |
explicit RendererDetails(const V8DataCallback& callback) |
- : callback_(callback) { |
- registrar_.Add(this, chrome::NOTIFICATION_RENDERER_V8_HEAP_STATS_COMPUTED, |
- content::NotificationService::AllSources()); |
- } |
- ~RendererDetails() override {} |
+ : callback_(callback), weak_factory_(this) {} |
+ ~RendererDetails() {} |
void Request() { |
for (std::set<content::WebContents*>::iterator iter = web_contents_.begin(); |
- iter != web_contents_.end(); ++iter) |
- (*iter)->GetRenderViewHost()->Send(new ChromeViewMsg_GetV8HeapStats); |
+ iter != web_contents_.end(); ++iter) { |
+ auto rph = (*iter)->GetRenderViewHost()->GetProcess(); |
+ auto resource_usage = resource_usage_reporters_[(*iter)]; |
+ DCHECK(resource_usage.get()); |
+ resource_usage->Refresh(base::Bind(&RendererDetails::OnRefreshDone, |
+ weak_factory_.GetWeakPtr(), *iter, |
+ base::GetProcId(rph->GetHandle()))); |
+ } |
} |
void AddWebContents(content::WebContents* content) { |
web_contents_.insert(content); |
+ |
+ auto rph = content->GetRenderViewHost()->GetProcess(); |
+ content::ServiceRegistry* service_registry = rph->GetServiceRegistry(); |
+ ResourceUsageReporterPtr service; |
+ if (service_registry) |
+ service_registry->ConnectToRemoteService(&service); |
+ resource_usage_reporters_.insert(std::make_pair( |
+ content, make_linked_ptr(new ProcessResourceUsage(service.Pass())))); |
+ DCHECK_EQ(web_contents_.size(), resource_usage_reporters_.size()); |
} |
void Clear() { |
web_contents_.clear(); |
+ resource_usage_reporters_.clear(); |
+ weak_factory_.InvalidateWeakPtrs(); |
} |
void RemoveWebContents(base::ProcessId) { |
+ // This function should only be called once for each WebContents, so this |
+ // should be non-empty every time it's called. |
+ DCHECK(!web_contents_.empty()); |
+ |
// We don't have to detect which content is the caller of this method. |
if (!web_contents_.empty()) |
web_contents_.erase(web_contents_.begin()); |
@@ -156,23 +177,19 @@ class RendererDetails : public content::NotificationObserver { |
} |
private: |
- // NotificationObserver: |
- void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) override { |
- const base::ProcessId* pid = |
- content::Source<const base::ProcessId>(source).ptr(); |
- const ChromeRenderMessageFilter::V8HeapStatsDetails* v8_heap = |
- content::Details<const ChromeRenderMessageFilter::V8HeapStatsDetails>( |
- details).ptr(); |
- callback_.Run(*pid, |
- v8_heap->v8_memory_allocated(), |
- v8_heap->v8_memory_used()); |
+ void OnRefreshDone(content::WebContents* content, const base::ProcessId pid) { |
+ auto iter = resource_usage_reporters_.find(content); |
+ DCHECK(iter != resource_usage_reporters_.end()); |
+ linked_ptr<ProcessResourceUsage> usage = iter->second; |
+ callback_.Run(pid, usage->GetV8MemoryAllocated(), usage->GetV8MemoryUsed()); |
} |
V8DataCallback callback_; |
- content::NotificationRegistrar registrar_; |
std::set<content::WebContents*> web_contents_; // This class does not own |
+ std::map<content::WebContents*, linked_ptr<ProcessResourceUsage>> |
+ resource_usage_reporters_; |
+ |
+ base::WeakPtrFactory<RendererDetails> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(RendererDetails); |
}; |