Chromium Code Reviews| Index: chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc |
| diff --git a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc |
| index 43dd6ece4ffa9838c37835fdbea1597e6e8b1404..7579b6b0fa7b38fe0bf211ec01eadabed116ce05 100644 |
| --- a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc |
| +++ b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc |
| @@ -6,6 +6,8 @@ |
| #include "base/bind.h" |
| #include "base/macros.h" |
| +#include "base/memory/weak_ptr.h" |
| +#include "base/stl_util.h" |
| #include "chrome/browser/task_manager/providers/web_contents/subframe_task.h" |
| #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_manager.h" |
| #include "content/public/browser/navigation_handle.h" |
| @@ -51,6 +53,7 @@ class WebContentsEntry : public content::WebContentsObserver { |
| void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; |
| void RenderFrameHostChanged(RenderFrameHost* old_host, |
| RenderFrameHost* new_host) override; |
| + void RenderFrameCreated(RenderFrameHost*) override; |
| void RenderViewReady() override; |
| void WebContentsDestroyed() override; |
| void RenderProcessGone(base::TerminationStatus status) override; |
| @@ -59,6 +62,8 @@ class WebContentsEntry : public content::WebContentsObserver { |
| content::NavigationHandle* navigation_handle) override; |
| void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override; |
| + void RenderFrameReady(int process_routing_id, int frame_routing_id); |
| + |
| private: |
| // Defines a callback for WebContents::ForEachFrame() to create a |
| // corresponding task for the given |render_frame_host| and notifying the |
| @@ -87,6 +92,8 @@ class WebContentsEntry : public content::WebContentsObserver { |
| // States whether we did record a main frame for this entry. |
| SiteInstance* main_frame_site_instance_; |
| + base::WeakPtrFactory<WebContentsEntry> weak_factory_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(WebContentsEntry); |
| }; |
| @@ -96,8 +103,8 @@ WebContentsEntry::WebContentsEntry(content::WebContents* web_contents, |
| WebContentsTaskProvider* provider) |
| : WebContentsObserver(web_contents), |
| provider_(provider), |
| - main_frame_site_instance_(nullptr) { |
| -} |
| + main_frame_site_instance_(nullptr), |
| + weak_factory_(this) {} |
| WebContentsEntry::~WebContentsEntry() { |
| ClearAllTasks(false); |
| @@ -146,6 +153,22 @@ void WebContentsEntry::RenderFrameHostChanged(RenderFrameHost* old_host, |
| CreateTaskForFrame(new_host); |
| } |
| +void WebContentsEntry::RenderFrameCreated(RenderFrameHost* render_frame_host) { |
| + // Postpone processing |render_frame_host| until its process has a PID. |
| + render_frame_host->GetProcess()->PostTaskWhenProcessIsReady(base::Bind( |
|
ncarter (slow)
2017/05/12 21:56:02
When we show the task manager, this means we will
Łukasz Anforowicz
2017/05/16 16:37:25
In the most recent patchset, I am returning early
|
| + &WebContentsEntry::RenderFrameReady, weak_factory_.GetWeakPtr(), |
| + render_frame_host->GetProcess()->GetID(), |
| + render_frame_host->GetRoutingID())); |
| +} |
| + |
| +void WebContentsEntry::RenderFrameReady(int render_process_id, |
| + int render_frame_id) { |
| + content::RenderFrameHost* render_frame_host = |
| + content::RenderFrameHost::FromID(render_process_id, render_frame_id); |
| + if (render_frame_host) |
|
ncarter (slow)
2017/05/12 21:56:02
This would need to be:
render_frame_host && rende
Łukasz Anforowicz
2017/05/16 16:37:25
RE: IsRenderFrameLive
Wouldn't this be redundant
|
| + CreateTaskForFrame(render_frame_host); |
| +} |
| + |
| void WebContentsEntry::RenderViewReady() { |
| ClearAllTasks(true); |
| CreateAllTasks(); |
| @@ -213,7 +236,8 @@ void WebContentsEntry::TitleWasSet(content::NavigationEntry* entry, |
| } |
| void WebContentsEntry::CreateTaskForFrame(RenderFrameHost* render_frame_host) { |
|
ncarter (slow)
2017/05/12 21:56:02
This function is implemented assuming that |render
Łukasz Anforowicz
2017/05/16 16:37:25
I am not sure if this is still needed?
|
| - DCHECK(!tasks_by_frames_.count(render_frame_host)); |
| + if (base::ContainsKey(tasks_by_frames_, render_frame_host)) |
| + ClearTaskForFrame(render_frame_host); |
|
ncarter (slow)
2017/05/12 21:56:02
When does this happen?
If |render_frame_host| is
Łukasz Anforowicz
2017/05/16 16:37:25
This would happen when CreateTaskForFrame would be
|
| content::SiteInstance* site_instance = render_frame_host->GetSiteInstance(); |
| if (!site_instance->GetProcess()->HasConnection()) |
|
ncarter (slow)
2017/05/12 21:56:02
Should probably be IsReady()
Łukasz Anforowicz
2017/05/16 16:37:25
Changing this makes PrintPreviewDialogControllerBr
|