Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / browser / media / capture / web_contents_tracker.cc
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
3 // found in the LICENSE file.
4
5 #include "content/browser/media/capture/web_contents_tracker.h"
6
7 #include "base/message_loop/message_loop_proxy.h"
8 #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_view_host.h"
12 #include "content/public/browser/web_contents.h"
13
14 namespace content {
15
16 WebContentsTracker::WebContentsTracker() {}
17
18 WebContentsTracker::~WebContentsTracker() {
19   DCHECK(!web_contents()) << "BUG: Still observering!";
20 }
21
22 void WebContentsTracker::Start(int render_process_id, int main_render_frame_id,
23                                const ChangeCallback& callback) {
24   DCHECK(!message_loop_.get() || message_loop_->BelongsToCurrentThread());
25
26   message_loop_ = base::MessageLoopProxy::current();
27   DCHECK(message_loop_.get());
28   callback_ = callback;
29
30   BrowserThread::PostTask(
31       BrowserThread::UI, FROM_HERE,
32       base::Bind(&WebContentsTracker::LookUpAndObserveWebContents, this,
33                  render_process_id, main_render_frame_id));
34 }
35
36 void WebContentsTracker::Stop() {
37   DCHECK(message_loop_->BelongsToCurrentThread());
38
39   callback_.Reset();
40
41   BrowserThread::PostTask(
42       BrowserThread::UI, FROM_HERE,
43       base::Bind(&WebContentsTracker::Observe, this,
44                  static_cast<WebContents*>(NULL)));
45 }
46
47 void WebContentsTracker::OnWebContentsChangeEvent() {
48   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
49
50   WebContents* const wc = web_contents();
51   RenderViewHost* const rvh = wc ? wc->GetRenderViewHost() : NULL;
52   RenderProcessHost* const rph = rvh ? rvh->GetProcess() : NULL;
53
54   const int render_process_id = rph ? rph->GetID() : MSG_ROUTING_NONE;
55   const int render_view_id = rvh ? rvh->GetRoutingID() : MSG_ROUTING_NONE;
56
57   message_loop_->PostTask(FROM_HERE,
58       base::Bind(&WebContentsTracker::MaybeDoCallback, this,
59                  render_process_id, render_view_id));
60 }
61
62 void WebContentsTracker::MaybeDoCallback(int render_process_id,
63                                          int render_view_id) {
64   DCHECK(message_loop_->BelongsToCurrentThread());
65
66   if (!callback_.is_null())
67     callback_.Run(render_process_id, render_view_id);
68 }
69
70 void WebContentsTracker::LookUpAndObserveWebContents(int render_process_id,
71                                                      int main_render_frame_id) {
72   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
73
74   Observe(WebContents::FromRenderFrameHost(RenderFrameHost::FromID(
75       render_process_id, main_render_frame_id)));
76   DVLOG_IF(1, !web_contents())
77       << "Could not find WebContents associated with main RenderFrameHost "
78       << "referenced by render_process_id=" << render_process_id
79       << ", routing_id=" << main_render_frame_id;
80
81   OnWebContentsChangeEvent();
82 }
83
84 void WebContentsTracker::RenderViewReady() {
85   OnWebContentsChangeEvent();
86 }
87
88 void WebContentsTracker::AboutToNavigateRenderView(RenderViewHost* rvh) {
89   OnWebContentsChangeEvent();
90 }
91
92 void WebContentsTracker::DidNavigateMainFrame(
93     const LoadCommittedDetails& details, const FrameNavigateParams& params) {
94   OnWebContentsChangeEvent();
95 }
96
97 void WebContentsTracker::WebContentsDestroyed() {
98   OnWebContentsChangeEvent();
99 }
100
101 }  // namespace content