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

Side by Side Diff: content/browser/renderer_host/media/web_contents_capture_util.cc

Issue 11413078: Tab Audio Capture: Browser-side connect/disconnect functionality. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor tweaks and added some useful comments. Created 8 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/renderer_host/media/web_contents_capture_util.h" 5 #include "content/browser/renderer_host/media/web_contents_capture_util.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/string_piece.h" 8 #include "base/string_piece.h"
9 #include "content/public/browser/browser_thread.h"
10 #include "content/public/browser/render_process_host.h"
11 #include "content/public/browser/render_view_host.h"
12 #include "content/public/browser/web_contents.h"
9 13
10 namespace content { 14 namespace content {
11 15
16 // static
12 bool WebContentsCaptureUtil::ExtractTabCaptureTarget( 17 bool WebContentsCaptureUtil::ExtractTabCaptureTarget(
13 const std::string& device_id, 18 const std::string& device_id,
14 int* render_process_id, 19 int* render_process_id,
15 int* render_view_id) { 20 int* render_view_id) {
16 const size_t sep_pos = device_id.find(':'); 21 const size_t sep_pos = device_id.find(':');
17 if (sep_pos == std::string::npos) 22 if (sep_pos == std::string::npos)
18 return false; 23 return false;
19 24
20 const base::StringPiece component1(device_id.data(), sep_pos); 25 const base::StringPiece component1(device_id.data(), sep_pos);
21 const base::StringPiece component2(device_id.data() + sep_pos + 1, 26 const base::StringPiece component2(device_id.data() + sep_pos + 1,
22 device_id.length() - sep_pos - 1); 27 device_id.length() - sep_pos - 1);
23 28
24 return (base::StringToInt(component1, render_process_id) && 29 return (base::StringToInt(component1, render_process_id) &&
25 base::StringToInt(component2, render_view_id)); 30 base::StringToInt(component2, render_view_id));
26 } 31 }
27 32
33 WebContentsCaptureUtil::RenderViewTracker::RenderViewTracker() {}
34
35 WebContentsCaptureUtil::RenderViewTracker::~RenderViewTracker() {
36 DCHECK(!web_contents()) << "BUG: Still observering!";
37 }
38
39 void WebContentsCaptureUtil::RenderViewTracker::Start(
40 int render_process_id, int render_view_id,
41 const ChangeCallback& callback) {
42 {
Alpha Left Google 2012/11/28 20:02:25 I would like to keep things simple for this patch.
43 base::AutoLock guard(lock_);
44 callback_ = callback;
45 }
46 BrowserThread::PostTask(
47 BrowserThread::UI, FROM_HERE,
48 base::Bind(&RenderViewTracker::LookUpAndObserveWebContents, this,
49 render_process_id, render_view_id));
50 }
51
52 void WebContentsCaptureUtil::RenderViewTracker::Stop() {
53 {
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.
54 base::AutoLock guard(lock_);
55 callback_.Reset();
56 }
57 BrowserThread::PostTask(
58 BrowserThread::UI, FROM_HERE,
59 base::Bind(&RenderViewTracker::Observe, this,
60 static_cast<WebContents*>(NULL)));
61 }
62
63 void WebContentsCaptureUtil::RenderViewTracker::OnWebContentsChangeEvent() {
64 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
65
66 WebContents* const wc = web_contents();
67 RenderViewHost* const rvh = wc ? wc->GetRenderViewHost() : NULL;
68 RenderProcessHost* const rph = rvh ? rvh->GetProcess() : NULL;
69
70 const int render_process_id = rph ? rph->GetID() : MSG_ROUTING_NONE;
71 const int render_view_id = rvh ? rvh->GetRoutingID() : MSG_ROUTING_NONE;
72
73 base::AutoLock guard(lock_);
74 if (!callback_.is_null()) {
75 callback_.Run(render_process_id, render_view_id);
76 }
77 }
78
79 void WebContentsCaptureUtil::RenderViewTracker::LookUpAndObserveWebContents(
80 int render_process_id, int render_view_id) {
81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
82
83 RenderViewHost* const rvh =
84 RenderViewHost::FromID(render_process_id, render_view_id);
85 DVLOG_IF(1, !rvh) << "RenderViewHost::FromID("
86 << render_process_id << ", " << render_view_id
87 << ") returned NULL.";
88 Observe(rvh ? WebContents::FromRenderViewHost(rvh) : NULL);
89 DVLOG_IF(1, !web_contents())
90 << "WebContents::FromRenderViewHost(" << rvh << ") returned NULL.";
91
92 OnWebContentsChangeEvent();
93 }
94
95 void WebContentsCaptureUtil::RenderViewTracker::RenderViewReady() {
96 OnWebContentsChangeEvent();
97 }
98
99 void WebContentsCaptureUtil::RenderViewTracker::WebContentsDestroyed(
100 WebContents* web_contents) {
101 OnWebContentsChangeEvent();
102 }
103
28 } // namespace content 104 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698