OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |