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

Side by Side Diff: content/browser/media/capture/web_contents_tracker.cc

Issue 542863004: Site Isolation: RenderView-->RenderFrame for WebContentsVideoCaptureDevice and WebContentsAudioInpu… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/media/capture/web_contents_tracker.h" 5 #include "content/browser/media/capture/web_contents_tracker.h"
6 6
7 #include "base/message_loop/message_loop_proxy.h" 7 #include "base/message_loop/message_loop_proxy.h"
8 #include "content/browser/frame_host/render_frame_host_impl.h"
9 #include "content/browser/renderer_host/render_widget_host_impl.h"
8 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
9 #include "content/public/browser/render_frame_host.h"
10 #include "content/public/browser/render_process_host.h" 11 #include "content/public/browser/render_process_host.h"
11 #include "content/public/browser/render_view_host.h" 12 #include "content/public/browser/render_widget_host_view.h"
12 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
13 14
14 namespace content { 15 namespace content {
15 16
16 WebContentsTracker::WebContentsTracker() {} 17 WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwh)
18 : track_fullscreen_rwh_(track_fullscreen_rwh),
19 last_target_(NULL) {}
17 20
18 WebContentsTracker::~WebContentsTracker() { 21 WebContentsTracker::~WebContentsTracker() {
19 DCHECK(!web_contents()) << "BUG: Still observering!"; 22 DCHECK(!web_contents()) << "BUG: Still observering!";
20 } 23 }
21 24
22 void WebContentsTracker::Start(int render_process_id, int main_render_frame_id, 25 void WebContentsTracker::Start(int render_process_id, int main_render_frame_id,
23 const ChangeCallback& callback) { 26 const ChangeCallback& callback) {
24 DCHECK(!message_loop_.get() || message_loop_->BelongsToCurrentThread()); 27 DCHECK(!message_loop_.get() || message_loop_->BelongsToCurrentThread());
25 28
26 message_loop_ = base::MessageLoopProxy::current(); 29 message_loop_ = base::MessageLoopProxy::current();
27 DCHECK(message_loop_.get()); 30 DCHECK(message_loop_.get());
28 callback_ = callback; 31 callback_ = callback;
29 32
30 BrowserThread::PostTask( 33 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
31 BrowserThread::UI, FROM_HERE, 34 StartObservingWebContents(render_process_id, main_render_frame_id);
32 base::Bind(&WebContentsTracker::LookUpAndObserveWebContents, this, 35 } else {
33 render_process_id, main_render_frame_id)); 36 BrowserThread::PostTask(
37 BrowserThread::UI, FROM_HERE,
38 base::Bind(&WebContentsTracker::StartObservingWebContents, this,
39 render_process_id, main_render_frame_id));
40 }
34 } 41 }
35 42
36 void WebContentsTracker::Stop() { 43 void WebContentsTracker::Stop() {
37 DCHECK(message_loop_->BelongsToCurrentThread()); 44 DCHECK(message_loop_->BelongsToCurrentThread());
38 45
39 callback_.Reset(); 46 callback_.Reset();
40 47
41 BrowserThread::PostTask( 48 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
42 BrowserThread::UI, FROM_HERE, 49 WebContentsObserver::Observe(NULL);
43 base::Bind(&WebContentsTracker::Observe, this, 50 } else {
44 static_cast<WebContents*>(NULL))); 51 BrowserThread::PostTask(
52 BrowserThread::UI, FROM_HERE,
53 base::Bind(&WebContentsTracker::Observe, this,
54 static_cast<WebContents*>(NULL)));
55 }
45 } 56 }
46 57
47 void WebContentsTracker::OnWebContentsChangeEvent() { 58 RenderWidgetHost* WebContentsTracker::GetTargetRenderWidgetHost() const {
48 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 59 DCHECK_CURRENTLY_ON(BrowserThread::UI);
49 60
50 WebContents* const wc = web_contents(); 61 WebContents* const wc = web_contents();
51 RenderViewHost* const rvh = wc ? wc->GetRenderViewHost() : NULL; 62 if (!wc)
52 RenderProcessHost* const rph = rvh ? rvh->GetProcess() : NULL; 63 return NULL;
53 64
54 const int render_process_id = rph ? rph->GetID() : MSG_ROUTING_NONE; 65 RenderWidgetHost* rwh = NULL;
55 const int render_view_id = rvh ? rvh->GetRoutingID() : MSG_ROUTING_NONE; 66 if (track_fullscreen_rwh_) {
67 RenderWidgetHostView* const view = wc->GetFullscreenRenderWidgetHostView();
68 if (view)
69 rwh = view->GetRenderWidgetHost();
70 }
71 if (!rwh) {
72 RenderFrameHostImpl* const rfh =
73 static_cast<RenderFrameHostImpl*>(wc->GetMainFrame());
74 if (rfh)
75 rwh = rfh->GetRenderWidgetHost();
76 }
56 77
57 message_loop_->PostTask(FROM_HERE, 78 return rwh;
58 base::Bind(&WebContentsTracker::MaybeDoCallback, this,
59 render_process_id, render_view_id));
60 } 79 }
61 80
62 void WebContentsTracker::MaybeDoCallback(int render_process_id, 81 void WebContentsTracker::OnPossibleTargetChange(bool force_callback_run) {
63 int render_view_id) { 82 DCHECK_CURRENTLY_ON(BrowserThread::UI);
83
84 RenderWidgetHost* const rwh = GetTargetRenderWidgetHost();
85 if (rwh == last_target_ && !force_callback_run)
86 return;
87 DVLOG(1) << "Will report target change from RenderWidgetHost@" << last_target_
88 << " to RenderWidgetHost@" << rwh;
89 last_target_ = rwh;
90
91 if (message_loop_->BelongsToCurrentThread()) {
92 MaybeDoCallback(rwh);
93 } else {
94 message_loop_->PostTask(
95 FROM_HERE,
96 base::Bind(&WebContentsTracker::MaybeDoCallback, this, rwh));
97 }
98 }
99
100 void WebContentsTracker::MaybeDoCallback(RenderWidgetHost* rwh) {
64 DCHECK(message_loop_->BelongsToCurrentThread()); 101 DCHECK(message_loop_->BelongsToCurrentThread());
65 102
66 if (!callback_.is_null()) 103 if (!callback_.is_null())
67 callback_.Run(render_process_id, render_view_id); 104 callback_.Run(rwh);
68 } 105 }
69 106
70 void WebContentsTracker::LookUpAndObserveWebContents(int render_process_id, 107 void WebContentsTracker::StartObservingWebContents(int render_process_id,
71 int main_render_frame_id) { 108 int main_render_frame_id) {
72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 109 DCHECK_CURRENTLY_ON(BrowserThread::UI);
73 110
74 Observe(WebContents::FromRenderFrameHost(RenderFrameHost::FromID( 111 Observe(WebContents::FromRenderFrameHost(RenderFrameHost::FromID(
75 render_process_id, main_render_frame_id))); 112 render_process_id, main_render_frame_id)));
76 DVLOG_IF(1, !web_contents()) 113 DVLOG_IF(1, !web_contents())
77 << "Could not find WebContents associated with main RenderFrameHost " 114 << "Could not find WebContents associated with main RenderFrameHost "
78 << "referenced by render_process_id=" << render_process_id 115 << "referenced by render_process_id=" << render_process_id
79 << ", routing_id=" << main_render_frame_id; 116 << ", routing_id=" << main_render_frame_id;
80 117
81 OnWebContentsChangeEvent(); 118 OnPossibleTargetChange(true);
82 } 119 }
83 120
84 void WebContentsTracker::RenderViewReady() { 121 void WebContentsTracker::RenderFrameDeleted(
85 OnWebContentsChangeEvent(); 122 RenderFrameHost* render_frame_host) {
123 OnPossibleTargetChange(false);
86 } 124 }
87 125
88 void WebContentsTracker::AboutToNavigateRenderView(RenderViewHost* rvh) { 126 void WebContentsTracker::RenderFrameHostChanged(RenderFrameHost* old_host,
89 OnWebContentsChangeEvent(); 127 RenderFrameHost* new_host) {
90 } 128 OnPossibleTargetChange(false);
91
92 void WebContentsTracker::DidNavigateMainFrame(
93 const LoadCommittedDetails& details, const FrameNavigateParams& params) {
94 OnWebContentsChangeEvent();
95 } 129 }
96 130
97 void WebContentsTracker::WebContentsDestroyed() { 131 void WebContentsTracker::WebContentsDestroyed() {
98 OnWebContentsChangeEvent(); 132 Observe(NULL);
133 OnPossibleTargetChange(false);
134 }
135
136 void WebContentsTracker::DidShowFullscreenWidget(int routing_id) {
137 OnPossibleTargetChange(false);
138 }
139
140 void WebContentsTracker::DidDestroyFullscreenWidget(int routing_id) {
141 OnPossibleTargetChange(false);
99 } 142 }
100 143
101 } // namespace content 144 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698