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

Side by Side Diff: content/browser/media/capture/web_contents_tracker.cc

Issue 2602923002: Tab capture: Tracking continues after renderer crash. (Closed)
Patch Set: Fix assumption about when view is valid. Created 3 years, 11 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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "content/browser/media/capture/web_contents_tracker.h" 5 #include "content/browser/media/capture/web_contents_tracker.h"
6 6
7 #include "base/threading/thread_task_runner_handle.h" 7 #include "base/threading/thread_task_runner_handle.h"
8 #include "content/browser/frame_host/render_frame_host_impl.h"
9 #include "content/browser/renderer_host/render_widget_host_impl.h"
10 #include "content/public/browser/browser_thread.h" 8 #include "content/public/browser/browser_thread.h"
11 #include "content/public/browser/render_process_host.h" 9 #include "content/public/browser/render_frame_host.h"
12 #include "content/public/browser/render_widget_host_view.h" 10 #include "content/public/browser/render_widget_host_view.h"
13 #include "content/public/browser/web_contents.h" 11 #include "content/public/browser/web_contents.h"
14 12
15 namespace content { 13 namespace content {
16 14
17 WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwh) 15 WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwhv)
18 : track_fullscreen_rwh_(track_fullscreen_rwh), 16 : track_fullscreen_rwhv_(track_fullscreen_rwhv),
19 last_target_(NULL) {} 17 last_target_view_(nullptr) {}
20 18
21 WebContentsTracker::~WebContentsTracker() { 19 WebContentsTracker::~WebContentsTracker() {
22 DCHECK(!web_contents()) << "BUG: Still observering!"; 20 // Likely unintentional BUG if Stop() was not called before this point.
21 DCHECK(!web_contents());
23 } 22 }
24 23
25 void WebContentsTracker::Start(int render_process_id, int main_render_frame_id, 24 void WebContentsTracker::Start(int render_process_id, int main_render_frame_id,
26 const ChangeCallback& callback) { 25 const ChangeCallback& callback) {
27 DCHECK(!task_runner_ || task_runner_->BelongsToCurrentThread()); 26 DCHECK(!task_runner_ || task_runner_->BelongsToCurrentThread());
28 27
29 task_runner_ = base::ThreadTaskRunnerHandle::Get(); 28 task_runner_ = base::ThreadTaskRunnerHandle::Get();
30 DCHECK(task_runner_); 29 DCHECK(task_runner_);
31 callback_ = callback; 30 callback_ = callback;
32 31
33 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 32 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
34 StartObservingWebContents(render_process_id, main_render_frame_id); 33 StartObservingWebContents(render_process_id, main_render_frame_id);
35 } else { 34 } else {
36 BrowserThread::PostTask( 35 BrowserThread::PostTask(
37 BrowserThread::UI, FROM_HERE, 36 BrowserThread::UI, FROM_HERE,
38 base::Bind(&WebContentsTracker::StartObservingWebContents, this, 37 base::Bind(&WebContentsTracker::StartObservingWebContents, this,
39 render_process_id, main_render_frame_id)); 38 render_process_id, main_render_frame_id));
40 } 39 }
41 } 40 }
42 41
43 void WebContentsTracker::Stop() { 42 void WebContentsTracker::Stop() {
44 DCHECK(task_runner_->BelongsToCurrentThread()); 43 DCHECK(task_runner_->BelongsToCurrentThread());
45 44
46 callback_.Reset(); 45 callback_.Reset();
47 resize_callback_.Reset(); 46 resize_callback_.Reset();
48 47
49 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 48 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
50 WebContentsObserver::Observe(NULL); 49 WebContentsObserver::Observe(nullptr);
51 } else { 50 } else {
52 BrowserThread::PostTask( 51 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
53 BrowserThread::UI, FROM_HERE, 52 base::Bind(&WebContentsTracker::Observe, this,
54 base::Bind(&WebContentsTracker::Observe, this, 53 static_cast<WebContents*>(nullptr)));
55 static_cast<WebContents*>(NULL)));
56 } 54 }
57 } 55 }
58 56
59 RenderWidgetHost* WebContentsTracker::GetTargetRenderWidgetHost() const { 57 RenderWidgetHostView* WebContentsTracker::GetTargetView() const {
60 DCHECK_CURRENTLY_ON(BrowserThread::UI); 58 DCHECK_CURRENTLY_ON(BrowserThread::UI);
61 59
62 WebContents* const wc = web_contents(); 60 WebContents* const wc = web_contents();
63 if (!wc) 61 if (!wc)
64 return NULL; 62 return nullptr;
65 63
66 RenderWidgetHost* rwh = NULL; 64 if (track_fullscreen_rwhv_) {
67 if (track_fullscreen_rwh_) { 65 if (auto* view = wc->GetFullscreenRenderWidgetHostView())
68 RenderWidgetHostView* const view = wc->GetFullscreenRenderWidgetHostView(); 66 return view;
69 if (view)
70 rwh = view->GetRenderWidgetHost();
71 }
72 if (!rwh) {
73 RenderFrameHostImpl* const rfh =
74 static_cast<RenderFrameHostImpl*>(wc->GetMainFrame());
75 if (rfh)
76 rwh = rfh->GetRenderWidgetHost();
77 } 67 }
78 68
79 return rwh; 69 if (auto* view = wc->GetRenderWidgetHostView()) {
70 // Make sure the RWHV is still associated with a RWH before considering the
71 // view "alive." This is because a null RWH indicates the RWHV has had its
72 // Destroy() method called.
73 if (view->GetRenderWidgetHost())
74 return view;
75 }
76 return nullptr;
80 } 77 }
81 78
82 void WebContentsTracker::SetResizeChangeCallback( 79 void WebContentsTracker::SetResizeChangeCallback(
83 const base::Closure& callback) { 80 const base::Closure& callback) {
84 DCHECK(!task_runner_ || task_runner_->BelongsToCurrentThread()); 81 DCHECK(!task_runner_ || task_runner_->BelongsToCurrentThread());
85 resize_callback_ = callback; 82 resize_callback_ = callback;
86 } 83 }
87 84
88 void WebContentsTracker::OnPossibleTargetChange(bool force_callback_run) { 85 void WebContentsTracker::OnPossibleTargetChange(bool force_callback_run) {
89 DCHECK_CURRENTLY_ON(BrowserThread::UI); 86 DCHECK_CURRENTLY_ON(BrowserThread::UI);
90 87
91 RenderWidgetHost* const rwh = GetTargetRenderWidgetHost(); 88 RenderWidgetHostView* const rwhv = GetTargetView();
92 if (rwh == last_target_ && !force_callback_run) 89 if (rwhv == last_target_view_ && !force_callback_run) {
90 DVLOG(1) << "No target view change (RenderWidgetHostView@" << rwhv << ')';
93 return; 91 return;
94 DVLOG(1) << "Will report target change from RenderWidgetHost@" << last_target_ 92 }
95 << " to RenderWidgetHost@" << rwh; 93 DVLOG(1) << "Will report target change from RenderWidgetHostView@"
96 last_target_ = rwh; 94 << last_target_view_ << " to RenderWidgetHostView@" << rwhv;
95 last_target_view_ = rwhv;
97 96
98 if (task_runner_->BelongsToCurrentThread()) { 97 if (task_runner_->BelongsToCurrentThread()) {
99 MaybeDoCallback(rwh != nullptr); 98 MaybeDoCallback(is_still_tracking());
100 return; 99 return;
101 } 100 }
102 101
103 task_runner_->PostTask( 102 task_runner_->PostTask(FROM_HERE,
104 FROM_HERE, 103 base::Bind(&WebContentsTracker::MaybeDoCallback, this,
105 base::Bind(&WebContentsTracker::MaybeDoCallback, this, rwh != nullptr)); 104 is_still_tracking()));
106 } 105 }
107 106
108 void WebContentsTracker::MaybeDoCallback(bool was_still_tracking) { 107 void WebContentsTracker::MaybeDoCallback(bool was_still_tracking) {
109 DCHECK(task_runner_->BelongsToCurrentThread()); 108 DCHECK(task_runner_->BelongsToCurrentThread());
110 109
111 if (!callback_.is_null()) 110 if (!callback_.is_null())
112 callback_.Run(was_still_tracking); 111 callback_.Run(was_still_tracking);
113 if (was_still_tracking) 112 if (was_still_tracking)
114 MaybeDoResizeCallback(); 113 MaybeDoResizeCallback();
115 } 114 }
(...skipping 12 matching lines...) Expand all
128 Observe(WebContents::FromRenderFrameHost(RenderFrameHost::FromID( 127 Observe(WebContents::FromRenderFrameHost(RenderFrameHost::FromID(
129 render_process_id, main_render_frame_id))); 128 render_process_id, main_render_frame_id)));
130 DVLOG_IF(1, !web_contents()) 129 DVLOG_IF(1, !web_contents())
131 << "Could not find WebContents associated with main RenderFrameHost " 130 << "Could not find WebContents associated with main RenderFrameHost "
132 << "referenced by render_process_id=" << render_process_id 131 << "referenced by render_process_id=" << render_process_id
133 << ", routing_id=" << main_render_frame_id; 132 << ", routing_id=" << main_render_frame_id;
134 133
135 OnPossibleTargetChange(true); 134 OnPossibleTargetChange(true);
136 } 135 }
137 136
137 void WebContentsTracker::RenderFrameCreated(
138 RenderFrameHost* render_frame_host) {
139 DVLOG(1) << "RenderFrameCreated(rfh=" << render_frame_host << ')';
140 OnPossibleTargetChange(false);
141 }
142
138 void WebContentsTracker::RenderFrameDeleted( 143 void WebContentsTracker::RenderFrameDeleted(
139 RenderFrameHost* render_frame_host) { 144 RenderFrameHost* render_frame_host) {
145 DVLOG(1) << "RenderFrameDeleted(rfh=" << render_frame_host << ')';
140 OnPossibleTargetChange(false); 146 OnPossibleTargetChange(false);
141 } 147 }
142 148
143 void WebContentsTracker::RenderFrameHostChanged(RenderFrameHost* old_host, 149 void WebContentsTracker::RenderFrameHostChanged(RenderFrameHost* old_host,
144 RenderFrameHost* new_host) { 150 RenderFrameHost* new_host) {
151 DVLOG(1) << "RenderFrameHostChanged(old=" << old_host << ", new=" << new_host
152 << ')';
145 OnPossibleTargetChange(false); 153 OnPossibleTargetChange(false);
146 } 154 }
147 155
148 void WebContentsTracker::MainFrameWasResized(bool width_changed) { 156 void WebContentsTracker::MainFrameWasResized(bool width_changed) {
149 DCHECK_CURRENTLY_ON(BrowserThread::UI); 157 DCHECK_CURRENTLY_ON(BrowserThread::UI);
150 158
151 if (task_runner_->BelongsToCurrentThread()) { 159 if (task_runner_->BelongsToCurrentThread()) {
152 MaybeDoResizeCallback(); 160 MaybeDoResizeCallback();
153 return; 161 return;
154 } 162 }
155 163
156 task_runner_->PostTask( 164 task_runner_->PostTask(
157 FROM_HERE, 165 FROM_HERE,
158 base::Bind(&WebContentsTracker::MaybeDoResizeCallback, this)); 166 base::Bind(&WebContentsTracker::MaybeDoResizeCallback, this));
159 } 167 }
160 168
161 void WebContentsTracker::WebContentsDestroyed() { 169 void WebContentsTracker::WebContentsDestroyed() {
162 Observe(NULL); 170 DVLOG(1) << "WebContentsDestroyed()";
163 OnPossibleTargetChange(false); 171 Observe(nullptr);
172 OnPossibleTargetChange(true);
xjz 2017/01/03 19:16:40 ooc: Will this cause an error report because Renew
miu 2017/01/03 21:01:28 Yes. WAI. And, it should because the thing being c
164 } 173 }
165 174
166 void WebContentsTracker::DidShowFullscreenWidget() { 175 void WebContentsTracker::DidShowFullscreenWidget() {
176 DVLOG(1) << "DidShowFullscreenWidget()";
167 OnPossibleTargetChange(false); 177 OnPossibleTargetChange(false);
168 } 178 }
169 179
170 void WebContentsTracker::DidDestroyFullscreenWidget() { 180 void WebContentsTracker::DidDestroyFullscreenWidget() {
181 DVLOG(1) << "DidDestroyFullscreenWidget()";
171 OnPossibleTargetChange(false); 182 OnPossibleTargetChange(false);
172 } 183 }
173 184
174 } // namespace content 185 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698