Chromium Code Reviews| Index: content/browser/renderer_host/media/web_contents_capture_util.cc |
| diff --git a/content/browser/renderer_host/media/web_contents_capture_util.cc b/content/browser/renderer_host/media/web_contents_capture_util.cc |
| index ed36cb2f80d887e81f1065b6c246c5c8ce86b9c5..b84aefa62d204fffc00fc214daa4d6cb483f3a43 100644 |
| --- a/content/browser/renderer_host/media/web_contents_capture_util.cc |
| +++ b/content/browser/renderer_host/media/web_contents_capture_util.cc |
| @@ -6,9 +6,14 @@ |
| #include "base/string_number_conversions.h" |
| #include "base/string_piece.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/render_process_host.h" |
| +#include "content/public/browser/render_view_host.h" |
| +#include "content/public/browser/web_contents.h" |
| namespace content { |
| +// static |
| bool WebContentsCaptureUtil::ExtractTabCaptureTarget( |
| const std::string& device_id, |
| int* render_process_id, |
| @@ -25,4 +30,75 @@ bool WebContentsCaptureUtil::ExtractTabCaptureTarget( |
| base::StringToInt(component2, render_view_id)); |
| } |
| +WebContentsCaptureUtil::RenderViewTracker::RenderViewTracker() {} |
| + |
| +WebContentsCaptureUtil::RenderViewTracker::~RenderViewTracker() { |
| + DCHECK(!web_contents()) << "BUG: Still observering!"; |
| +} |
| + |
| +void WebContentsCaptureUtil::RenderViewTracker::Start( |
| + int render_process_id, int render_view_id, |
| + const ChangeCallback& callback) { |
| + { |
|
Alpha Left Google
2012/11/28 20:02:25
I would like to keep things simple for this patch.
|
| + base::AutoLock guard(lock_); |
| + callback_ = callback; |
| + } |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&RenderViewTracker::LookUpAndObserveWebContents, this, |
| + render_process_id, render_view_id)); |
| +} |
| + |
| +void WebContentsCaptureUtil::RenderViewTracker::Stop() { |
| + { |
|
Alpha Left Google
2012/11/28 20:02:25
As suggested I think we don't need to use lock for
miu
2012/11/28 22:05:50
Done.
|
| + base::AutoLock guard(lock_); |
| + callback_.Reset(); |
| + } |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&RenderViewTracker::Observe, this, |
| + static_cast<WebContents*>(NULL))); |
| +} |
| + |
| +void WebContentsCaptureUtil::RenderViewTracker::OnWebContentsChangeEvent() { |
| + DCHECK(BrowserThread::CurrentlyOn(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; |
| + |
| + base::AutoLock guard(lock_); |
| + if (!callback_.is_null()) { |
| + callback_.Run(render_process_id, render_view_id); |
| + } |
| +} |
| + |
| +void WebContentsCaptureUtil::RenderViewTracker::LookUpAndObserveWebContents( |
| + int render_process_id, int render_view_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + RenderViewHost* const rvh = |
| + RenderViewHost::FromID(render_process_id, render_view_id); |
| + DVLOG_IF(1, !rvh) << "RenderViewHost::FromID(" |
| + << render_process_id << ", " << render_view_id |
| + << ") returned NULL."; |
| + Observe(rvh ? WebContents::FromRenderViewHost(rvh) : NULL); |
| + DVLOG_IF(1, !web_contents()) |
| + << "WebContents::FromRenderViewHost(" << rvh << ") returned NULL."; |
| + |
| + OnWebContentsChangeEvent(); |
| +} |
| + |
| +void WebContentsCaptureUtil::RenderViewTracker::RenderViewReady() { |
| + OnWebContentsChangeEvent(); |
| +} |
| + |
| +void WebContentsCaptureUtil::RenderViewTracker::WebContentsDestroyed( |
| + WebContents* web_contents) { |
| + OnWebContentsChangeEvent(); |
| +} |
| + |
| } // namespace content |