Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(750)

Side by Side Diff: chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc

Issue 2857263003: Task Manager should listen to WebContentsObserver::RenderFrameCreated. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/task_manager/providers/web_contents/web_contents_task_p rovider.h" 5 #include "chrome/browser/task_manager/providers/web_contents/web_contents_task_p rovider.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/weak_ptr.h"
9 #include "chrome/browser/task_manager/providers/web_contents/subframe_task.h" 10 #include "chrome/browser/task_manager/providers/web_contents/subframe_task.h"
10 #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_m anager.h" 11 #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_m anager.h"
11 #include "content/public/browser/render_frame_host.h" 12 #include "content/public/browser/render_frame_host.h"
12 #include "content/public/browser/render_process_host.h" 13 #include "content/public/browser/render_process_host.h"
14 #include "content/public/browser/render_process_host_utils.h"
13 #include "content/public/browser/render_widget_host.h" 15 #include "content/public/browser/render_widget_host.h"
14 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
15 #include "content/public/browser/web_contents_observer.h" 17 #include "content/public/browser/web_contents_observer.h"
16 18
17 using content::RenderFrameHost; 19 using content::RenderFrameHost;
18 using content::RenderWidgetHost; 20 using content::RenderWidgetHost;
19 using content::SiteInstance; 21 using content::SiteInstance;
20 using content::WebContents; 22 using content::WebContents;
21 23
22 namespace task_manager { 24 namespace task_manager {
(...skipping 18 matching lines...) Expand all
41 // notified if |notify_observer| is true. 43 // notified if |notify_observer| is true.
42 void ClearAllTasks(bool notify_observer); 44 void ClearAllTasks(bool notify_observer);
43 45
44 // Returns the |RendererTask| that corresponds to the given 46 // Returns the |RendererTask| that corresponds to the given
45 // |render_frame_host| or |nullptr| if the given frame is not tracked by this 47 // |render_frame_host| or |nullptr| if the given frame is not tracked by this
46 // entry. 48 // entry.
47 RendererTask* GetTaskForFrame(RenderFrameHost* render_frame_host) const; 49 RendererTask* GetTaskForFrame(RenderFrameHost* render_frame_host) const;
48 50
49 // content::WebContentsObserver: 51 // content::WebContentsObserver:
50 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; 52 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
51 void RenderFrameHostChanged(RenderFrameHost* old_host, 53 void RenderFrameCreated(RenderFrameHost*) override;
52 RenderFrameHost* new_host) override;
53 void RenderViewReady() override; 54 void RenderViewReady() override;
54 void WebContentsDestroyed() override; 55 void WebContentsDestroyed() override;
55 void RenderProcessGone(base::TerminationStatus status) override; 56 void RenderProcessGone(base::TerminationStatus status) override;
56 void OnRendererUnresponsive(RenderWidgetHost* render_widget_host) override; 57 void OnRendererUnresponsive(RenderWidgetHost* render_widget_host) override;
57 void DidFinishNavigation( 58 void DidFinishNavigation(
58 content::NavigationHandle* navigation_handle) override; 59 content::NavigationHandle* navigation_handle) override;
59 void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override; 60 void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override;
60 61
62 void RenderFrameReady(int process_routing_id, int frame_routing_id);
63
61 private: 64 private:
62 // Defines a callback for WebContents::ForEachFrame() to create a 65 // Defines a callback for WebContents::ForEachFrame() to create a
63 // corresponding task for the given |render_frame_host| and notifying the 66 // corresponding task for the given |render_frame_host| and notifying the
64 // provider's observer of the new task. 67 // provider's observer of the new task.
65 void CreateTaskForFrame(RenderFrameHost* render_frame_host); 68 void CreateTaskForFrame(RenderFrameHost* render_frame_host);
66 69
67 // Clears the task that corresponds to the given |render_frame_host| and 70 // Clears the task that corresponds to the given |render_frame_host| and
68 // notifies the provider's observer of the tasks removal. 71 // notifies the provider's observer of the tasks removal.
69 void ClearTaskForFrame(RenderFrameHost* render_frame_host); 72 void ClearTaskForFrame(RenderFrameHost* render_frame_host);
70 73
71 // Calls |on_task| for each task managed by this WebContentsEntry. 74 // Calls |on_task| for each task managed by this WebContentsEntry.
72 void ForEachTask(const base::Callback<void(RendererTask*)>& on_task); 75 void ForEachTask(const base::Callback<void(RendererTask*)>& on_task);
73 76
74 // The provider that owns this entry. 77 // The provider that owns this entry.
75 WebContentsTaskProvider* provider_; 78 WebContentsTaskProvider* provider_;
76 79
77 // The RenderFrameHosts associated with this entry's WebContents that we're 80 // The RenderFrameHosts associated with this entry's WebContents that we're
78 // tracking mapped by their SiteInstances. 81 // tracking mapped by their SiteInstances.
79 using FramesList = std::vector<RenderFrameHost*>; 82 using FramesList = std::vector<RenderFrameHost*>;
80 std::map<SiteInstance*, FramesList> frames_by_site_instance_; 83 std::map<SiteInstance*, FramesList> frames_by_site_instance_;
81 84
82 // The RendererTasks that we create for the task manager, mapped by their 85 // The RendererTasks that we create for the task manager, mapped by their
83 // RenderFrameHosts. This owns the RenderTasks. 86 // RenderFrameHosts. This owns the RenderTasks.
84 std::map<RenderFrameHost*, RendererTask*> tasks_by_frames_; 87 std::map<RenderFrameHost*, RendererTask*> tasks_by_frames_;
85 88
86 // States whether we did record a main frame for this entry. 89 // States whether we did record a main frame for this entry.
87 SiteInstance* main_frame_site_instance_; 90 SiteInstance* main_frame_site_instance_;
88 91
92 base::WeakPtrFactory<WebContentsEntry> weak_factory_;
93
89 DISALLOW_COPY_AND_ASSIGN(WebContentsEntry); 94 DISALLOW_COPY_AND_ASSIGN(WebContentsEntry);
90 }; 95 };
91 96
92 //////////////////////////////////////////////////////////////////////////////// 97 ////////////////////////////////////////////////////////////////////////////////
93 98
94 WebContentsEntry::WebContentsEntry(content::WebContents* web_contents, 99 WebContentsEntry::WebContentsEntry(content::WebContents* web_contents,
95 WebContentsTaskProvider* provider) 100 WebContentsTaskProvider* provider)
96 : WebContentsObserver(web_contents), 101 : WebContentsObserver(web_contents),
97 provider_(provider), 102 provider_(provider),
98 main_frame_site_instance_(nullptr) { 103 main_frame_site_instance_(nullptr),
99 } 104 weak_factory_(this) {}
100 105
101 WebContentsEntry::~WebContentsEntry() { 106 WebContentsEntry::~WebContentsEntry() {
102 ClearAllTasks(false); 107 ClearAllTasks(false);
103 } 108 }
104 109
105 void WebContentsEntry::CreateAllTasks() { 110 void WebContentsEntry::CreateAllTasks() {
106 DCHECK(web_contents()->GetMainFrame()); 111 DCHECK(web_contents()->GetMainFrame());
107 web_contents()->ForEachFrame(base::Bind(&WebContentsEntry::CreateTaskForFrame, 112 web_contents()->ForEachFrame(base::Bind(&WebContentsEntry::CreateTaskForFrame,
108 base::Unretained(this))); 113 base::Unretained(this)));
109 } 114 }
(...skipping 22 matching lines...) Expand all
132 if (itr == tasks_by_frames_.end()) 137 if (itr == tasks_by_frames_.end())
133 return nullptr; 138 return nullptr;
134 139
135 return itr->second; 140 return itr->second;
136 } 141 }
137 142
138 void WebContentsEntry::RenderFrameDeleted(RenderFrameHost* render_frame_host) { 143 void WebContentsEntry::RenderFrameDeleted(RenderFrameHost* render_frame_host) {
139 ClearTaskForFrame(render_frame_host); 144 ClearTaskForFrame(render_frame_host);
140 } 145 }
141 146
142 void WebContentsEntry::RenderFrameHostChanged(RenderFrameHost* old_host, 147 void WebContentsEntry::RenderFrameCreated(RenderFrameHost* render_frame_host) {
143 RenderFrameHost* new_host) { 148 // Postpone processing |render_frame_host| until its process has a PID.
144 ClearTaskForFrame(old_host); 149 PostTaskWhenRenderProcessHostIsReady(
145 CreateTaskForFrame(new_host); 150 render_frame_host->GetProcess(),
151 base::Bind(&WebContentsEntry::RenderFrameReady,
152 weak_factory_.GetWeakPtr(),
153 render_frame_host->GetProcess()->GetID(),
154 render_frame_host->GetRoutingID()));
155 }
156
157 void WebContentsEntry::RenderFrameReady(int render_process_id,
158 int render_frame_id) {
159 content::RenderFrameHost* render_frame_host =
160 content::RenderFrameHost::FromID(render_process_id, render_frame_id);
161 if (render_frame_host)
162 CreateTaskForFrame(render_frame_host);
146 } 163 }
147 164
148 void WebContentsEntry::RenderViewReady() { 165 void WebContentsEntry::RenderViewReady() {
149 ClearAllTasks(true); 166 ClearAllTasks(true);
150 CreateAllTasks(); 167 CreateAllTasks();
151 } 168 }
152 169
153 void WebContentsEntry::WebContentsDestroyed() { 170 void WebContentsEntry::WebContentsDestroyed() {
154 ClearAllTasks(true); 171 ClearAllTasks(true);
155 provider_->DeleteEntry(web_contents()); 172 provider_->DeleteEntry(web_contents());
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 } 406 }
390 407
391 void WebContentsTaskProvider::DeleteEntry(content::WebContents* web_contents) { 408 void WebContentsTaskProvider::DeleteEntry(content::WebContents* web_contents) {
392 // This erase() will delete the WebContentsEntry, which is actually our 409 // This erase() will delete the WebContentsEntry, which is actually our
393 // caller, but it's expecting us to delete it. 410 // caller, but it's expecting us to delete it.
394 bool success = entries_map_.erase(web_contents) != 0; 411 bool success = entries_map_.erase(web_contents) != 0;
395 DCHECK(success); 412 DCHECK(success);
396 } 413 }
397 414
398 } // namespace task_manager 415 } // namespace task_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698