Index: content/browser/media/capture/web_contents_tracker.cc |
diff --git a/content/browser/media/capture/web_contents_tracker.cc b/content/browser/media/capture/web_contents_tracker.cc |
index 668eb6d3b6862afd94156d881c316a2b90baf165..770cb1ede548f75d23e4ba55812cb6e440c3c7e2 100644 |
--- a/content/browser/media/capture/web_contents_tracker.cc |
+++ b/content/browser/media/capture/web_contents_tracker.cc |
@@ -5,21 +5,20 @@ |
#include "content/browser/media/capture/web_contents_tracker.h" |
#include "base/threading/thread_task_runner_handle.h" |
-#include "content/browser/frame_host/render_frame_host_impl.h" |
-#include "content/browser/renderer_host/render_widget_host_impl.h" |
#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/web_contents.h" |
namespace content { |
-WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwh) |
- : track_fullscreen_rwh_(track_fullscreen_rwh), |
- last_target_(NULL) {} |
+WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwhv) |
+ : track_fullscreen_rwhv_(track_fullscreen_rwhv), |
+ last_target_view_(nullptr) {} |
WebContentsTracker::~WebContentsTracker() { |
- DCHECK(!web_contents()) << "BUG: Still observering!"; |
+ // Likely unintentional BUG if Stop() was not called before this point. |
+ DCHECK(!web_contents()); |
} |
void WebContentsTracker::Start(int render_process_id, int main_render_frame_id, |
@@ -47,36 +46,34 @@ void WebContentsTracker::Stop() { |
resize_callback_.Reset(); |
if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
- WebContentsObserver::Observe(NULL); |
+ WebContentsObserver::Observe(nullptr); |
} else { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&WebContentsTracker::Observe, this, |
- static_cast<WebContents*>(NULL))); |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ base::Bind(&WebContentsTracker::Observe, this, |
+ static_cast<WebContents*>(nullptr))); |
} |
} |
-RenderWidgetHost* WebContentsTracker::GetTargetRenderWidgetHost() const { |
+RenderWidgetHostView* WebContentsTracker::GetTargetView() const { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
WebContents* const wc = web_contents(); |
if (!wc) |
- return NULL; |
+ return nullptr; |
- RenderWidgetHost* rwh = NULL; |
- if (track_fullscreen_rwh_) { |
- RenderWidgetHostView* const view = wc->GetFullscreenRenderWidgetHostView(); |
- if (view) |
- rwh = view->GetRenderWidgetHost(); |
- } |
- if (!rwh) { |
- RenderFrameHostImpl* const rfh = |
- static_cast<RenderFrameHostImpl*>(wc->GetMainFrame()); |
- if (rfh) |
- rwh = rfh->GetRenderWidgetHost(); |
+ if (track_fullscreen_rwhv_) { |
+ if (auto* view = wc->GetFullscreenRenderWidgetHostView()) |
+ return view; |
} |
- return rwh; |
+ if (auto* view = wc->GetRenderWidgetHostView()) { |
+ // Make sure the RWHV is still associated with a RWH before considering the |
+ // view "alive." This is because a null RWH indicates the RWHV has had its |
+ // Destroy() method called. |
+ if (view->GetRenderWidgetHost()) |
+ return view; |
+ } |
+ return nullptr; |
} |
void WebContentsTracker::SetResizeChangeCallback( |
@@ -88,21 +85,23 @@ void WebContentsTracker::SetResizeChangeCallback( |
void WebContentsTracker::OnPossibleTargetChange(bool force_callback_run) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- RenderWidgetHost* const rwh = GetTargetRenderWidgetHost(); |
- if (rwh == last_target_ && !force_callback_run) |
+ RenderWidgetHostView* const rwhv = GetTargetView(); |
+ if (rwhv == last_target_view_ && !force_callback_run) { |
+ DVLOG(1) << "No target view change (RenderWidgetHostView@" << rwhv << ')'; |
return; |
- DVLOG(1) << "Will report target change from RenderWidgetHost@" << last_target_ |
- << " to RenderWidgetHost@" << rwh; |
- last_target_ = rwh; |
+ } |
+ DVLOG(1) << "Will report target change from RenderWidgetHostView@" |
+ << last_target_view_ << " to RenderWidgetHostView@" << rwhv; |
+ last_target_view_ = rwhv; |
if (task_runner_->BelongsToCurrentThread()) { |
- MaybeDoCallback(rwh != nullptr); |
+ MaybeDoCallback(is_still_tracking()); |
return; |
} |
- task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&WebContentsTracker::MaybeDoCallback, this, rwh != nullptr)); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&WebContentsTracker::MaybeDoCallback, this, |
+ is_still_tracking())); |
} |
void WebContentsTracker::MaybeDoCallback(bool was_still_tracking) { |
@@ -135,13 +134,22 @@ void WebContentsTracker::StartObservingWebContents(int render_process_id, |
OnPossibleTargetChange(true); |
} |
+void WebContentsTracker::RenderFrameCreated( |
+ RenderFrameHost* render_frame_host) { |
+ DVLOG(1) << "RenderFrameCreated(rfh=" << render_frame_host << ')'; |
+ OnPossibleTargetChange(false); |
+} |
+ |
void WebContentsTracker::RenderFrameDeleted( |
RenderFrameHost* render_frame_host) { |
+ DVLOG(1) << "RenderFrameDeleted(rfh=" << render_frame_host << ')'; |
OnPossibleTargetChange(false); |
} |
void WebContentsTracker::RenderFrameHostChanged(RenderFrameHost* old_host, |
RenderFrameHost* new_host) { |
+ DVLOG(1) << "RenderFrameHostChanged(old=" << old_host << ", new=" << new_host |
+ << ')'; |
OnPossibleTargetChange(false); |
} |
@@ -159,15 +167,18 @@ void WebContentsTracker::MainFrameWasResized(bool width_changed) { |
} |
void WebContentsTracker::WebContentsDestroyed() { |
- Observe(NULL); |
- OnPossibleTargetChange(false); |
+ DVLOG(1) << "WebContentsDestroyed()"; |
+ Observe(nullptr); |
+ 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
|
} |
void WebContentsTracker::DidShowFullscreenWidget() { |
+ DVLOG(1) << "DidShowFullscreenWidget()"; |
OnPossibleTargetChange(false); |
} |
void WebContentsTracker::DidDestroyFullscreenWidget() { |
+ DVLOG(1) << "DidDestroyFullscreenWidget()"; |
OnPossibleTargetChange(false); |
} |