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

Unified Diff: content/browser/renderer_host/media/web_contents_capture_util.cc

Issue 11416350: Tab Audio Mirroring: WebContentsAudioInputStream is a new implementation which represents the lifet… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Destructors hate ASSERT() in unit tests. Created 7 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 side-by-side diff with in-line comments
Download patch
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 46b73766e0a7f43adddf7a47e2e61268fc21b3cc..59947cd7cb951195e1f39d5619a69573ac24bfb2 100644
--- a/content/browser/renderer_host/media/web_contents_capture_util.cc
+++ b/content/browser/renderer_host/media/web_contents_capture_util.cc
@@ -5,9 +5,16 @@
#include "content/browser/renderer_host/media/web_contents_capture_util.h"
#include "base/basictypes.h"
+#include "base/message_loop_proxy.h"
#include "base/string_number_conversions.h"
#include "base/string_piece.h"
#include "base/string_util.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 {
namespace {
@@ -15,13 +22,13 @@ const char kVirtualDeviceScheme[] = "virtual-media-stream://";
} // namespace
-namespace content {
-
+// static
std::string WebContentsCaptureUtil::AppendWebContentsDeviceScheme(
const std::string& device_id) {
return kVirtualDeviceScheme + device_id;
}
+// static
std::string WebContentsCaptureUtil::StripWebContentsDeviceScheme(
const std::string& device_id) {
return (IsWebContentsDeviceId(device_id) ?
@@ -29,11 +36,13 @@ std::string WebContentsCaptureUtil::StripWebContentsDeviceScheme(
device_id);
}
+// static
bool WebContentsCaptureUtil::IsWebContentsDeviceId(
const std::string& device_id) {
return StartsWithASCII(device_id, kVirtualDeviceScheme, true);
}
+// static
bool WebContentsCaptureUtil::ExtractTabCaptureTarget(
const std::string& device_id_param,
int* render_process_id,
@@ -56,4 +65,91 @@ bool WebContentsCaptureUtil::ExtractTabCaptureTarget(
base::StringToInt(component2, render_view_id));
}
+WebContentsTracker::WebContentsTracker() {}
+
+WebContentsTracker::~WebContentsTracker() {
+ DCHECK(!web_contents()) << "BUG: Still observering!";
+}
+
+void WebContentsTracker::Start(int render_process_id, int render_view_id,
+ const ChangeCallback& callback) {
+ DCHECK(!message_loop_ || message_loop_->BelongsToCurrentThread());
+
+ message_loop_ = base::MessageLoopProxy::current();
+ DCHECK(message_loop_);
+ callback_ = callback;
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&WebContentsTracker::LookUpAndObserveWebContents, this,
+ render_process_id, render_view_id));
+}
+
+void WebContentsTracker::Stop() {
+ DCHECK(message_loop_->BelongsToCurrentThread());
+
+ callback_.Reset();
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&WebContentsTracker::Observe, this,
+ static_cast<WebContents*>(NULL)));
+}
+
+void WebContentsTracker::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;
+
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&WebContentsTracker::MaybeDoCallback, this,
+ render_process_id, render_view_id));
+}
+
+void WebContentsTracker::MaybeDoCallback(int render_process_id,
+ int render_view_id) {
+ DCHECK(message_loop_->BelongsToCurrentThread());
+
+ if (!callback_.is_null())
+ callback_.Run(render_process_id, render_view_id);
+}
+
+void WebContentsTracker::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 WebContentsTracker::RenderViewReady() {
+ OnWebContentsChangeEvent();
+}
+
+void WebContentsTracker::AboutToNavigateRenderView(RenderViewHost* rvh) {
+ OnWebContentsChangeEvent();
+}
+
+void WebContentsTracker::DidNavigateMainFrame(
+ const LoadCommittedDetails& details, const FrameNavigateParams& params) {
+ OnWebContentsChangeEvent();
+}
+
+void WebContentsTracker::WebContentsDestroyed(WebContents* web_contents) {
+ OnWebContentsChangeEvent();
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698