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

Side by Side Diff: chrome/browser/media/router/presentation_service_delegate_impl.cc

Issue 1132903002: [MediaRouter] Add implementation of PresentationServiceDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
(Empty)
1 // Copyright 2015 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 "chrome/browser/media/router/presentation_service_delegate_impl.h"
6
7 #include <string>
8
9 #include "base/guid.h"
10 #include "base/strings/string_util.h"
11 #include "base/strings/stringprintf.h"
12 #include "chrome/browser/media/router/create_session_request.h"
13 #include "chrome/browser/media/router/media_route.h"
14 #include "chrome/browser/media/router/media_router.h"
15 #include "chrome/browser/media/router/media_router_impl_factory.h"
16 #include "chrome/browser/media/router/media_sink.h"
17 #include "chrome/browser/media/router/media_source_helper.h"
18 #include "chrome/browser/media/router/presentation_helper.h"
19 #include "chrome/browser/media/router/presentation_media_sinks_observer.h"
20 #include "chrome/browser/sessions/session_tab_helper.h"
21 #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller.h"
22 #include "content/public/browser/presentation_screen_availability_listener.h"
23 #include "content/public/browser/presentation_session.h"
24 #include "content/public/browser/render_frame_host.h"
25 #include "content/public/browser/render_process_host.h"
26
27 DEFINE_WEB_CONTENTS_USER_DATA_KEY(
28 media_router::PresentationServiceDelegateImpl);
29
30 using content::RenderFrameHost;
31
32 namespace {
33
34 using RenderFrameHostId =
35 content::PresentationServiceDelegate::RenderFrameHostId;
36
37 // Helper function to extract ID for a RFH.
38 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* rfh) {
mark a. foltz 2015/05/14 22:20:46 It seems like this should be a ctor for RenderFram
haibinlu 2015/05/15 23:32:29 It is a typedef. typedef std::pair<int, int> Rend
39 int render_process_id = rfh->GetProcess()->GetID();
40 int render_frame_id = rfh->GetRoutingID();
41 return RenderFrameHostId(render_process_id, render_frame_id);
42 }
43
44 // Gets the host name associated with the frame given by |rfh_id|.
45 std::string GetSourceHostForFrame(RenderFrameHostId rfh_id) {
46 RenderFrameHost* rfh = RenderFrameHost::FromID(rfh_id.first, rfh_id.second);
47 DCHECK(rfh);
48 std::string host = rfh->GetLastCommittedURL().host();
mark a. foltz 2015/05/14 22:20:46 Is this guaranteed to be a valid URL? What about
49 if (StartsWithASCII(host, "www.", false))
50 host = host.substr(4);
51 return host;
52 }
53
54 } // namespace
55
56 namespace media_router {
57
58 PresentationServiceDelegateImpl::PresentationServiceDelegateImpl(
59 content::WebContents* web_contents)
60 : web_contents_(web_contents),
61 router_(MediaRouterImplFactory::GetMediaRouterForBrowserContext(
62 web_contents_->GetBrowserContext())),
63 frame_map_(web_contents),
64 weak_factory_(this) {
65 DCHECK(router_);
66 }
67
68 PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() {
69 }
70
71 void PresentationServiceDelegateImpl::AddObserver(
72 int render_process_id,
73 int render_frame_id,
74 content::PresentationServiceDelegate::Observer* observer) {
75 DCHECK(observer);
76 frame_map_.SetDelegateObserver(render_process_id, render_frame_id, observer);
77 }
78
79 void PresentationServiceDelegateImpl::RemoveObserver(int render_process_id,
80 int render_frame_id) {
81 frame_map_.SetDelegateObserver(render_process_id, render_frame_id, NULL);
mark a. foltz 2015/05/14 22:20:46 Please add a method RemoveDelegateObserver() inste
82 }
83
84 bool PresentationServiceDelegateImpl::AddScreenAvailabilityListener(
85 int render_process_id,
86 int render_frame_id,
87 content::PresentationScreenAvailabilityListener* listener) {
88 DCHECK(listener);
89
mark a. foltz 2015/05/14 22:20:46 Extra newline
haibinlu 2015/05/15 23:32:30 Done.
90 return frame_map_.AddScreenAvailabilityListener(render_process_id,
91 render_frame_id, listener);
92 }
93
94 void PresentationServiceDelegateImpl::RemoveScreenAvailabilityListener(
95 int render_process_id,
96 int render_frame_id,
97 content::PresentationScreenAvailabilityListener* listener) {
98 DCHECK(listener);
99 frame_map_.RemoveScreenAvailabilityListener(render_process_id,
100 render_frame_id, listener);
101 }
102
103 void PresentationServiceDelegateImpl::Reset(int render_process_id,
104 int render_frame_id) {
105 frame_map_.Reset(render_process_id, render_frame_id);
106 RenderFrameHostId rfh_id(render_process_id, render_frame_id);
107 if (IsMainFrame(rfh_id))
108 UpdateDefaultMediaSourceAndNotifyObservers(MediaSource(), std::string());
mark a. foltz 2015/05/14 22:20:46 I would prefer an explicit method, RemoveDefaultMe
109 }
110
111 void PresentationServiceDelegateImpl::SetDefaultPresentationUrl(
112 int render_process_id,
113 int render_frame_id,
114 const std::string& default_presentation_url,
115 const std::string& default_presentation_id) {
116 frame_map_.SetDefaultPresentationInfo(render_process_id, render_frame_id,
117 default_presentation_url,
118 default_presentation_id);
119
120 RenderFrameHostId rfh_id(render_process_id, render_frame_id);
121 if (IsMainFrame(rfh_id)) {
122 // This is the main frame, that means tab-level default presentation
123 // might have been updated.
124 MediaSource new_default_source;
125 if (!default_presentation_url.empty())
126 new_default_source = ForPresentationUrl(default_presentation_url);
mark a. foltz 2015/05/14 22:20:46 What about setting |default_presentation_id| on |n
127 std::string new_default_source_host(GetSourceHostForFrame(rfh_id));
mark a. foltz 2015/05/14 22:20:46 Ah, this is not derived from new_default_source, b
128 UpdateDefaultMediaSourceAndNotifyObservers(new_default_source,
129 new_default_source_host);
130 }
131 }
132
133 bool PresentationServiceDelegateImpl::IsMainFrame(
134 RenderFrameHostId rfh_id) const {
135 RenderFrameHost* main_frame = web_contents_->GetMainFrame();
136 return main_frame && GetRenderFrameHostId(main_frame) == rfh_id;
137 }
138
139 void PresentationServiceDelegateImpl::
140 UpdateDefaultMediaSourceAndNotifyObservers(
141 const MediaSource& new_default_source,
142 const std::string& new_default_source_host) {
143 if (!new_default_source.Equals(default_source_) ||
144 new_default_source_host != default_source_host_) {
145 default_source_ = new_default_source;
146 default_source_host_ = new_default_source_host;
147 FOR_EACH_OBSERVER(
148 DefaultMediaSourceObserver, default_media_source_observers_,
149 OnDefaultMediaSourceChanged(default_source_, default_source_host_));
150 }
151 }
152
153 std::string PresentationServiceDelegateImpl::GetOrGeneratePresentationId(
154 RenderFrameHostId rfh_id,
155 const std::string& presentation_id) const {
156 if (!presentation_id.empty())
157 return presentation_id;
158
159 const std::string& default_presentation_id =
160 frame_map_.GetDefaultPresentationId(rfh_id);
161 return default_presentation_id.empty() ? base::GenerateGUID()
162 : default_presentation_id;
163 }
164
165 void PresentationServiceDelegateImpl::StartSession(
166 int render_process_id,
167 int render_frame_id,
168 const std::string& presentation_url,
169 const std::string& presentation_id,
170 const PresentationSessionSuccessCallback& success_cb,
171 const PresentationSessionErrorCallback& error_cb) {
172 NOTIMPLEMENTED();
mark a. foltz 2015/05/14 22:20:46 It seems like this can be implemented now: call in
haibinlu 2015/05/15 23:32:29 router_ can not be not properly set till the next
173 }
174
175 void PresentationServiceDelegateImpl::JoinSession(
176 int render_process_id,
177 int render_frame_id,
178 const std::string& presentation_url,
179 const std::string& presentation_id,
180 const PresentationSessionSuccessCallback& success_cb,
181 const PresentationSessionErrorCallback& error_cb) {
182 NOTIMPLEMENTED();
183 }
184
185 void PresentationServiceDelegateImpl::ListenForSessionMessages(
186 int render_process_id,
187 int render_frame_id,
188 const PresentationSessionMessageCallback& message_cb) {
189 NOTIMPLEMENTED();
mark a. foltz 2015/05/14 22:20:46 Can you elaborate on what is required here? What
haibinlu 2015/05/15 23:32:30 Same here.
190 }
191
192 void PresentationServiceDelegateImpl::OnRouteCreated(const MediaRoute& route) {
193 const MediaSource& source = route.media_source();
194 DCHECK(!source.Empty());
195 if (default_source_.Equals(source)) {
196 RenderFrameHost* main_frame = web_contents_->GetMainFrame();
197 if (main_frame) {
198 RenderFrameHostId rfh_id(GetRenderFrameHostId(main_frame));
199 auto observer = frame_map_.GetDelegateObserver(rfh_id);
200 if (observer) {
201 // TODO(imcheng): Pass in valid default presentation ID once it is
202 // available from MediaRoute URN.
203 observer->OnDefaultPresentationStarted(content::PresentationSessionInfo(
204 GetPresentationUrl(source), std::string()));
205 }
206 }
207 }
mark a. foltz 2015/05/14 22:20:46 We need to instantiate a MediaRouter::Delegate for
208 }
209
210 MediaSource PresentationServiceDelegateImpl::GetDefaultMediaSource() const {
211 return default_source_;
212 }
213
214 void PresentationServiceDelegateImpl::AddDefaultMediaSourceObserver(
215 DefaultMediaSourceObserver* observer) {
216 default_media_source_observers_.AddObserver(observer);
217 }
218
219 void PresentationServiceDelegateImpl::RemoveDefaultMediaSourceObserver(
220 DefaultMediaSourceObserver* observer) {
221 default_media_source_observers_.RemoveObserver(observer);
222 }
223
224 void PresentationServiceDelegateImpl::SetMediaRouterForTest(
225 MediaRouter* router) {
226 router_ = router;
227 }
228
229 base::WeakPtr<PresentationServiceDelegateImpl>
230 PresentationServiceDelegateImpl::GetWeakPtr() {
231 return weak_factory_.GetWeakPtr();
232 }
233
234 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698