OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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 "chrome/browser/ui/webui/media_router/media_router_ui.h" | 5 #include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "chrome/browser/media/router/create_session_request.h" | 10 #include "chrome/browser/media/router/create_presentation_session_request.h" |
11 #include "chrome/browser/media/router/issue.h" | 11 #include "chrome/browser/media/router/issue.h" |
12 #include "chrome/browser/media/router/issues_observer.h" | 12 #include "chrome/browser/media/router/issues_observer.h" |
13 #include "chrome/browser/media/router/media_route.h" | 13 #include "chrome/browser/media/router/media_route.h" |
14 #include "chrome/browser/media/router/media_router.h" | 14 #include "chrome/browser/media/router/media_router.h" |
15 #include "chrome/browser/media/router/media_router_mojo_impl.h" | 15 #include "chrome/browser/media/router/media_router_mojo_impl.h" |
16 #include "chrome/browser/media/router/media_router_mojo_impl_factory.h" | 16 #include "chrome/browser/media/router/media_router_mojo_impl_factory.h" |
17 #include "chrome/browser/media/router/media_routes_observer.h" | 17 #include "chrome/browser/media/router/media_routes_observer.h" |
18 #include "chrome/browser/media/router/media_sink.h" | 18 #include "chrome/browser/media/router/media_sink.h" |
19 #include "chrome/browser/media/router/media_sinks_observer.h" | 19 #include "chrome/browser/media/router/media_sinks_observer.h" |
20 #include "chrome/browser/media/router/media_source.h" | 20 #include "chrome/browser/media/router/media_source.h" |
21 #include "chrome/browser/media/router/media_source_helper.h" | 21 #include "chrome/browser/media/router/media_source_helper.h" |
22 #include "chrome/browser/media/router/presentation_service_delegate_impl.h" | 22 #include "chrome/browser/media/router/presentation_service_delegate_impl.h" |
23 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
24 #include "chrome/browser/sessions/session_tab_helper.h" | 24 #include "chrome/browser/sessions/session_tab_helper.h" |
| 25 #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller.h" |
25 #include "chrome/browser/ui/webui/media_router/media_router_localized_strings_pr
ovider.h" | 26 #include "chrome/browser/ui/webui/media_router/media_router_localized_strings_pr
ovider.h" |
26 #include "chrome/browser/ui/webui/media_router/media_router_resources_provider.h
" | 27 #include "chrome/browser/ui/webui/media_router/media_router_resources_provider.h
" |
27 #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handle
r.h" | 28 #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handle
r.h" |
28 #include "chrome/common/url_constants.h" | 29 #include "chrome/common/url_constants.h" |
29 #include "content/public/browser/web_contents.h" | 30 #include "content/public/browser/web_contents.h" |
30 #include "content/public/browser/web_ui.h" | 31 #include "content/public/browser/web_ui.h" |
31 #include "content/public/browser/web_ui_data_source.h" | 32 #include "content/public/browser/web_ui_data_source.h" |
32 #include "ui/web_dialogs/web_dialog_delegate.h" | 33 #include "ui/web_dialogs/web_dialog_delegate.h" |
33 | 34 |
34 namespace media_router { | 35 namespace media_router { |
35 | 36 |
36 namespace { | 37 namespace { |
37 | 38 |
| 39 void HandleRouteResponseForPresentationApi( |
| 40 scoped_ptr<CreatePresentationSessionRequest> presentation_request, |
| 41 const MediaRoute* route, |
| 42 const std::string& error) { |
| 43 DCHECK(presentation_request); |
| 44 if (!route) { |
| 45 presentation_request->MaybeInvokeErrorCallback( |
| 46 content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error)); |
| 47 } else { |
| 48 presentation_request->MaybeInvokeSuccessCallback(route->media_route_id()); |
| 49 } |
| 50 } |
| 51 |
38 std::string GetHostFromURL(const GURL& gurl) { | 52 std::string GetHostFromURL(const GURL& gurl) { |
39 if (gurl.is_empty()) | 53 if (gurl.is_empty()) |
40 return std::string(); | 54 return std::string(); |
41 std::string host = gurl.host(); | 55 std::string host = gurl.host(); |
42 if (base::StartsWith(host, "www.", base::CompareCase::INSENSITIVE_ASCII)) | 56 if (base::StartsWith(host, "www.", base::CompareCase::INSENSITIVE_ASCII)) |
43 host = host.substr(4); | 57 host = host.substr(4); |
44 return host; | 58 return host; |
45 } | 59 } |
46 | 60 |
47 } // namespace | 61 } // namespace |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 | 128 |
115 // Ownership of |handler_| is transferred to |web_ui|. | 129 // Ownership of |handler_| is transferred to |web_ui|. |
116 web_ui->AddMessageHandler(handler_); | 130 web_ui->AddMessageHandler(handler_); |
117 } | 131 } |
118 | 132 |
119 MediaRouterUI::~MediaRouterUI() { | 133 MediaRouterUI::~MediaRouterUI() { |
120 if (query_result_manager_.get()) | 134 if (query_result_manager_.get()) |
121 query_result_manager_->RemoveObserver(this); | 135 query_result_manager_->RemoveObserver(this); |
122 if (presentation_service_delegate_.get()) | 136 if (presentation_service_delegate_.get()) |
123 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); | 137 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); |
| 138 // If |presentation_request_| still exists, then it means presentation route |
| 139 // request was never attempted. |
| 140 if (presentation_request_) { |
| 141 presentation_request_->MaybeInvokeErrorCallback(content::PresentationError( |
| 142 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
| 143 "Dialog closed.")); |
| 144 } |
124 } | 145 } |
125 | 146 |
126 void MediaRouterUI::InitWithDefaultMediaSource( | 147 void MediaRouterUI::InitWithDefaultMediaSource( |
127 PresentationServiceDelegateImpl* delegate) { | 148 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate) { |
128 DCHECK(delegate); | 149 DCHECK(delegate); |
129 DCHECK(!presentation_service_delegate_); | 150 DCHECK(!presentation_service_delegate_); |
130 DCHECK(!query_result_manager_.get()); | 151 DCHECK(!query_result_manager_.get()); |
131 | 152 |
132 presentation_service_delegate_ = delegate->GetWeakPtr(); | 153 presentation_service_delegate_ = delegate; |
133 presentation_service_delegate_->AddDefaultMediaSourceObserver(this); | 154 presentation_service_delegate_->AddDefaultMediaSourceObserver(this); |
134 InitCommon(presentation_service_delegate_->web_contents(), | 155 InitCommon(presentation_service_delegate_->web_contents(), |
135 presentation_service_delegate_->default_source(), | 156 presentation_service_delegate_->default_source(), |
136 presentation_service_delegate_->default_frame_url()); | 157 presentation_service_delegate_->default_frame_url()); |
137 } | 158 } |
138 | 159 |
139 void MediaRouterUI::InitWithPresentationSessionRequest( | 160 void MediaRouterUI::InitWithPresentationSessionRequest( |
140 const content::WebContents* initiator, | 161 content::WebContents* initiator, |
141 scoped_ptr<CreateSessionRequest> request) { | 162 scoped_ptr<CreatePresentationSessionRequest> presentation_request) { |
142 DCHECK(request.get()); | 163 DCHECK(initiator); |
143 DCHECK(!presentation_session_request_.get()); | 164 DCHECK(presentation_request); |
144 DCHECK(!query_result_manager_.get()); | 165 DCHECK(!presentation_request_); |
| 166 DCHECK(!query_result_manager_); |
145 | 167 |
146 presentation_session_request_ = request.Pass(); | 168 presentation_request_ = presentation_request.Pass(); |
147 InitCommon(initiator, presentation_session_request_->GetMediaSource(), | 169 InitCommon(initiator, presentation_request_->GetMediaSource(), |
148 presentation_session_request_->frame_url()); | 170 presentation_request_->frame_url()); |
149 } | 171 } |
150 | 172 |
151 void MediaRouterUI::InitCommon(const content::WebContents* initiator, | 173 void MediaRouterUI::InitCommon(content::WebContents* initiator, |
152 const MediaSource& default_source, | 174 const MediaSource& default_source, |
153 const GURL& default_frame_url) { | 175 const GURL& default_frame_url) { |
154 DCHECK(initiator); | 176 DCHECK(initiator); |
155 | 177 |
156 // Register for Issue and MediaRoute updates. | 178 // Register for Issue and MediaRoute updates. |
157 issues_observer_.reset(new UIIssuesObserver(router_, this)); | 179 issues_observer_.reset(new UIIssuesObserver(router_, this)); |
158 routes_observer_.reset(new UIMediaRoutesObserver(router_, this)); | 180 routes_observer_.reset(new UIMediaRoutesObserver(router_, this)); |
159 | 181 |
160 query_result_manager_.reset(new QueryResultManager(router_)); | 182 query_result_manager_.reset(new QueryResultManager(router_)); |
161 query_result_manager_->AddObserver(this); | 183 query_result_manager_->AddObserver(this); |
(...skipping 13 matching lines...) Expand all Loading... |
175 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, | 197 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, |
176 const GURL& frame_url) { | 198 const GURL& frame_url) { |
177 if (source.Empty()) { | 199 if (source.Empty()) { |
178 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); | 200 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); |
179 } else { | 201 } else { |
180 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); | 202 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); |
181 } | 203 } |
182 UpdateSourceHostAndCastModes(frame_url); | 204 UpdateSourceHostAndCastModes(frame_url); |
183 } | 205 } |
184 | 206 |
185 void MediaRouterUI::HandleRouteResponseForPresentation( | |
186 const MediaRoute* route, | |
187 const std::string& error) { | |
188 if (!route) { | |
189 presentation_session_request_->MaybeInvokeErrorCallback( | |
190 content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error)); | |
191 } else { | |
192 // TODO(imcheng): Presentation ID should come from the response | |
193 // as the IDs might not be the same. | |
194 presentation_session_request_->MaybeInvokeSuccessCallback( | |
195 route->media_route_id()); | |
196 } | |
197 } | |
198 | |
199 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { | 207 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { |
200 DCHECK(query_result_manager_); | 208 DCHECK(query_result_manager_); |
201 frame_url_ = frame_url; | 209 frame_url_ = frame_url; |
202 query_result_manager_->GetSupportedCastModes(&cast_modes_); | 210 query_result_manager_->GetSupportedCastModes(&cast_modes_); |
203 if (ui_initialized_) | 211 if (ui_initialized_) |
204 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); | 212 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); |
205 } | 213 } |
206 | 214 |
207 void MediaRouterUI::Close() { | 215 void MediaRouterUI::Close() { |
208 if (presentation_session_request_.get()) { | |
209 presentation_session_request_->MaybeInvokeErrorCallback( | |
210 content::PresentationError( | |
211 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, | |
212 "Dialog closed.")); | |
213 } | |
214 | |
215 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); | 216 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); |
216 if (delegate) { | 217 if (delegate) { |
217 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); | 218 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); |
218 delegate->OnDialogCloseFromWebUI(); | 219 delegate->OnDialogCloseFromWebUI(); |
219 } | 220 } |
220 } | 221 } |
221 | 222 |
222 void MediaRouterUI::UIInitialized() { | 223 void MediaRouterUI::UIInitialized() { |
223 ui_initialized_ = true; | 224 ui_initialized_ = true; |
224 } | 225 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 if (ui_initialized_) | 263 if (ui_initialized_) |
263 handler_->UpdateIssue(issue); | 264 handler_->UpdateIssue(issue); |
264 } | 265 } |
265 | 266 |
266 void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) { | 267 void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) { |
267 routes_ = routes; | 268 routes_ = routes; |
268 if (ui_initialized_) | 269 if (ui_initialized_) |
269 handler_->UpdateRoutes(routes_); | 270 handler_->UpdateRoutes(routes_); |
270 } | 271 } |
271 | 272 |
272 void MediaRouterUI::OnRouteResponseReceived(scoped_ptr<MediaRoute> route, | 273 void MediaRouterUI::OnRouteResponseReceived(const MediaRoute* route, |
273 const std::string& error) { | 274 const std::string& error) { |
274 DVLOG(1) << "OnRouteResponseReceived"; | 275 DVLOG(1) << "OnRouteResponseReceived"; |
275 // TODO(imcheng): Display error in UI. (crbug.com/490372) | 276 // TODO(imcheng): Display error in UI. (crbug.com/490372) |
276 if (!route) | 277 if (!route) |
277 LOG(ERROR) << "MediaRouteResponse returned error: " << error; | 278 LOG(ERROR) << "MediaRouteResponse returned error: " << error; |
278 else | 279 else |
279 handler_->AddRoute(*route); | 280 handler_->AddRoute(*route); |
280 | 281 |
281 if (requesting_route_for_default_source_) { | |
282 if (presentation_session_request_.get()) { | |
283 HandleRouteResponseForPresentation(route.get(), error); | |
284 } else { | |
285 // Dialog initiated via browser action. Let | |
286 // PresentationServiceDelegateImpl perform the match against the default | |
287 // presentation URL. | |
288 if (route && presentation_service_delegate_.get()) | |
289 presentation_service_delegate_->OnRouteCreated(*route); | |
290 } | |
291 } | |
292 | |
293 has_pending_route_request_ = false; | 282 has_pending_route_request_ = false; |
294 requesting_route_for_default_source_ = false; | 283 requesting_route_for_default_source_ = false; |
295 } | 284 } |
296 | 285 |
297 bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, | 286 bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, |
298 MediaCastMode cast_mode) { | 287 MediaCastMode cast_mode) { |
299 DCHECK(query_result_manager_.get()); | 288 DCHECK(query_result_manager_.get()); |
300 DCHECK(initiator_); | 289 DCHECK(initiator_); |
301 | 290 |
302 // Note that there is a rarely-encountered bug, where the MediaCastMode to | 291 // Note that there is a rarely-encountered bug, where the MediaCastMode to |
(...skipping 15 matching lines...) Expand all Loading... |
318 if (requesting_route_for_default_source_) { | 307 if (requesting_route_for_default_source_) { |
319 origin = frame_url_.GetOrigin(); | 308 origin = frame_url_.GetOrigin(); |
320 } else { | 309 } else { |
321 // Requesting route for mirroring. Use a placeholder URL as origin. | 310 // Requesting route for mirroring. Use a placeholder URL as origin. |
322 origin = GURL(chrome::kChromeUIMediaRouterURL); | 311 origin = GURL(chrome::kChromeUIMediaRouterURL); |
323 } | 312 } |
324 DCHECK(origin.is_valid()); | 313 DCHECK(origin.is_valid()); |
325 | 314 |
326 DVLOG(1) << "DoCreateRoute: origin: " << origin; | 315 DVLOG(1) << "DoCreateRoute: origin: " << origin; |
327 | 316 |
| 317 // There are 3 cases. In all cases the MediaRouterUI will need to be notified. |
| 318 // (1) Non-presentation route request (e.g., mirroring). No additional |
| 319 // notification necessary. |
| 320 // (2) Presentation route request for a Presentation API startSession call. |
| 321 // The startSession (CreatePresentationSessionRequest) will need to be |
| 322 // answered with the |
| 323 // route response. |
| 324 // (3) Browser-initiated presentation route request. If successful, |
| 325 // PresentationServiceDelegateImpl will have to be notified. |
| 326 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
| 327 route_response_callbacks.push_back(base::Bind( |
| 328 &MediaRouterUI::OnRouteResponseReceived, weak_factory_.GetWeakPtr())); |
| 329 if (requesting_route_for_default_source_) { |
| 330 if (presentation_request_) { |
| 331 // |presentation_request_| will be nullptr after this call, as the |
| 332 // object will be transferred to the callback. |
| 333 route_response_callbacks.push_back( |
| 334 base::Bind(&HandleRouteResponseForPresentationApi, |
| 335 base::Passed(&presentation_request_))); |
| 336 } else if (presentation_service_delegate_) { |
| 337 route_response_callbacks.push_back( |
| 338 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, |
| 339 presentation_service_delegate_)); |
| 340 } |
| 341 } |
| 342 |
328 router_->CreateRoute(source.id(), sink_id, origin, | 343 router_->CreateRoute(source.id(), sink_id, origin, |
329 SessionTabHelper::IdForTab(initiator_), | 344 SessionTabHelper::IdForTab(initiator_), |
330 base::Bind(&MediaRouterUI::OnRouteResponseReceived, | 345 route_response_callbacks); |
331 weak_factory_.GetWeakPtr())); | |
332 return true; | 346 return true; |
333 } | 347 } |
334 | 348 |
335 std::string MediaRouterUI::GetFrameURLHost() const { | 349 std::string MediaRouterUI::GetFrameURLHost() const { |
336 return GetHostFromURL(frame_url_); | 350 return GetHostFromURL(frame_url_); |
337 } | 351 } |
338 | 352 |
339 } // namespace media_router | 353 } // namespace media_router |
OLD | NEW |