OLD | NEW |
---|---|
(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 | |
OLD | NEW |