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 5bfdf4e86d013f403cf51a671f75f022a1a30936..6810ac097aac4b44ae976d439c1112d2ea611436 100644 |
--- a/content/browser/media/capture/web_contents_tracker.cc |
+++ b/content/browser/media/capture/web_contents_tracker.cc |
@@ -5,15 +5,18 @@ |
#include "content/browser/media/capture/web_contents_tracker.h" |
#include "base/message_loop/message_loop_proxy.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_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/render_view_host.h" |
+#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/web_contents.h" |
namespace content { |
-WebContentsTracker::WebContentsTracker() {} |
+WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwh) |
+ : track_fullscreen_rwh_(track_fullscreen_rwh), |
+ last_target_(NULL) {} |
WebContentsTracker::~WebContentsTracker() { |
DCHECK(!web_contents()) << "BUG: Still observering!"; |
@@ -27,10 +30,14 @@ void WebContentsTracker::Start(int render_process_id, int main_render_frame_id, |
DCHECK(message_loop_.get()); |
callback_ = callback; |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&WebContentsTracker::LookUpAndObserveWebContents, this, |
- render_process_id, main_render_frame_id)); |
+ if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ StartObservingWebContents(render_process_id, main_render_frame_id); |
+ } else { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&WebContentsTracker::StartObservingWebContents, this, |
+ render_process_id, main_render_frame_id)); |
+ } |
} |
void WebContentsTracker::Stop() { |
@@ -38,38 +45,68 @@ void WebContentsTracker::Stop() { |
callback_.Reset(); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&WebContentsTracker::Observe, this, |
- static_cast<WebContents*>(NULL))); |
+ if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ WebContentsObserver::Observe(NULL); |
+ } else { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&WebContentsTracker::Observe, this, |
+ static_cast<WebContents*>(NULL))); |
+ } |
} |
-void WebContentsTracker::OnWebContentsChangeEvent() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+RenderWidgetHost* WebContentsTracker::GetTargetRenderWidgetHost() const { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
WebContents* const wc = web_contents(); |
- RenderViewHost* const rvh = wc ? wc->GetRenderViewHost() : NULL; |
- RenderProcessHost* const rph = rvh ? rvh->GetProcess() : NULL; |
- |
- const int render_process_id = rph ? rph->GetID() : MSG_ROUTING_NONE; |
- const int render_view_id = rvh ? rvh->GetRoutingID() : MSG_ROUTING_NONE; |
+ if (!wc) |
+ return NULL; |
+ |
+ 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(); |
+ } |
+ |
+ return rwh; |
+} |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&WebContentsTracker::MaybeDoCallback, this, |
- render_process_id, render_view_id)); |
+void WebContentsTracker::OnPossibleTargetChange(bool force_callback_run) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ RenderWidgetHost* const rwh = GetTargetRenderWidgetHost(); |
+ if (rwh == last_target_ && !force_callback_run) |
+ return; |
+ DVLOG(1) << "Will report target change from RenderWidgetHost@" << last_target_ |
+ << " to RenderWidgetHost@" << rwh; |
+ last_target_ = rwh; |
+ |
+ if (message_loop_->BelongsToCurrentThread()) { |
+ MaybeDoCallback(rwh); |
+ } else { |
+ message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebContentsTracker::MaybeDoCallback, this, rwh)); |
+ } |
} |
-void WebContentsTracker::MaybeDoCallback(int render_process_id, |
- int render_view_id) { |
+void WebContentsTracker::MaybeDoCallback(RenderWidgetHost* rwh) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
if (!callback_.is_null()) |
- callback_.Run(render_process_id, render_view_id); |
+ callback_.Run(rwh); |
} |
-void WebContentsTracker::LookUpAndObserveWebContents(int render_process_id, |
- int main_render_frame_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+void WebContentsTracker::StartObservingWebContents(int render_process_id, |
+ int main_render_frame_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
Observe(WebContents::FromRenderFrameHost(RenderFrameHost::FromID( |
render_process_id, main_render_frame_id))); |
@@ -78,24 +115,30 @@ void WebContentsTracker::LookUpAndObserveWebContents(int render_process_id, |
<< "referenced by render_process_id=" << render_process_id |
<< ", routing_id=" << main_render_frame_id; |
- OnWebContentsChangeEvent(); |
+ OnPossibleTargetChange(true); |
+} |
+ |
+void WebContentsTracker::RenderFrameDeleted( |
+ RenderFrameHost* render_frame_host) { |
+ OnPossibleTargetChange(false); |
} |
-void WebContentsTracker::RenderViewReady() { |
- OnWebContentsChangeEvent(); |
+void WebContentsTracker::RenderFrameHostChanged(RenderFrameHost* old_host, |
+ RenderFrameHost* new_host) { |
+ OnPossibleTargetChange(false); |
} |
-void WebContentsTracker::AboutToNavigateRenderView(RenderViewHost* rvh) { |
- OnWebContentsChangeEvent(); |
+void WebContentsTracker::WebContentsDestroyed() { |
+ Observe(NULL); |
+ OnPossibleTargetChange(false); |
} |
-void WebContentsTracker::DidNavigateMainFrame( |
- const LoadCommittedDetails& details, const FrameNavigateParams& params) { |
- OnWebContentsChangeEvent(); |
+void WebContentsTracker::DidShowFullscreenWidget(int routing_id) { |
+ OnPossibleTargetChange(false); |
} |
-void WebContentsTracker::WebContentsDestroyed() { |
- OnWebContentsChangeEvent(); |
+void WebContentsTracker::DidDestroyFullscreenWidget(int routing_id) { |
+ OnPossibleTargetChange(false); |
} |
} // namespace content |