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_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 { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
114 | 115 |
115 // Ownership of |handler_| is transferred to |web_ui|. | 116 // Ownership of |handler_| is transferred to |web_ui|. |
116 web_ui->AddMessageHandler(handler_); | 117 web_ui->AddMessageHandler(handler_); |
117 } | 118 } |
118 | 119 |
119 MediaRouterUI::~MediaRouterUI() { | 120 MediaRouterUI::~MediaRouterUI() { |
120 if (query_result_manager_.get()) | 121 if (query_result_manager_.get()) |
121 query_result_manager_->RemoveObserver(this); | 122 query_result_manager_->RemoveObserver(this); |
122 if (presentation_service_delegate_.get()) | 123 if (presentation_service_delegate_.get()) |
123 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); | 124 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); |
125 // If |presentation_request_| still exists, then it means presentation route | |
126 // request was never attempted. | |
127 if (presentation_request_) { | |
128 presentation_request_->MaybeInvokeErrorCallback(content::PresentationError( | |
129 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, | |
130 "Dialog closed.")); | |
131 } | |
124 } | 132 } |
125 | 133 |
126 void MediaRouterUI::InitWithDefaultMediaSource( | 134 void MediaRouterUI::InitWithDefaultMediaSource( |
127 PresentationServiceDelegateImpl* delegate) { | 135 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate) { |
128 DCHECK(delegate); | 136 DCHECK(delegate); |
129 DCHECK(!presentation_service_delegate_); | 137 DCHECK(!presentation_service_delegate_); |
130 DCHECK(!query_result_manager_.get()); | 138 DCHECK(!query_result_manager_.get()); |
131 | 139 |
132 presentation_service_delegate_ = delegate->GetWeakPtr(); | 140 presentation_service_delegate_ = delegate; |
133 presentation_service_delegate_->AddDefaultMediaSourceObserver(this); | 141 presentation_service_delegate_->AddDefaultMediaSourceObserver(this); |
134 InitCommon(presentation_service_delegate_->web_contents(), | 142 InitCommon(presentation_service_delegate_->web_contents(), |
135 presentation_service_delegate_->default_source(), | 143 presentation_service_delegate_->default_source(), |
136 presentation_service_delegate_->default_frame_url()); | 144 presentation_service_delegate_->default_frame_url()); |
137 } | 145 } |
138 | 146 |
139 void MediaRouterUI::InitWithPresentationSessionRequest( | 147 void MediaRouterUI::InitWithPresentationSessionRequest( |
140 const content::WebContents* initiator, | 148 content::WebContents* initiator, |
141 scoped_ptr<CreateSessionRequest> request) { | 149 scoped_ptr<CreateSessionRequest> presentation_request) { |
142 DCHECK(request.get()); | 150 DCHECK(initiator); |
143 DCHECK(!presentation_session_request_.get()); | 151 DCHECK(presentation_request); |
144 DCHECK(!query_result_manager_.get()); | 152 DCHECK(!presentation_request_); |
153 DCHECK(!query_result_manager_); | |
145 | 154 |
146 presentation_session_request_ = request.Pass(); | 155 presentation_request_ = presentation_request.Pass(); |
147 InitCommon(initiator, presentation_session_request_->GetMediaSource(), | 156 InitCommon(initiator, presentation_request_->GetMediaSource(), |
148 presentation_session_request_->frame_url()); | 157 presentation_request_->frame_url()); |
149 } | 158 } |
150 | 159 |
151 void MediaRouterUI::InitCommon(const content::WebContents* initiator, | 160 void MediaRouterUI::InitCommon(content::WebContents* initiator, |
152 const MediaSource& default_source, | 161 const MediaSource& default_source, |
153 const GURL& default_frame_url) { | 162 const GURL& default_frame_url) { |
154 DCHECK(initiator); | 163 DCHECK(initiator); |
155 | 164 |
156 // Register for Issue and MediaRoute updates. | 165 // Register for Issue and MediaRoute updates. |
157 issues_observer_.reset(new UIIssuesObserver(router_, this)); | 166 issues_observer_.reset(new UIIssuesObserver(router_, this)); |
158 routes_observer_.reset(new UIMediaRoutesObserver(router_, this)); | 167 routes_observer_.reset(new UIMediaRoutesObserver(router_, this)); |
159 | 168 |
160 query_result_manager_.reset(new QueryResultManager(router_)); | 169 query_result_manager_.reset(new QueryResultManager(router_)); |
161 query_result_manager_->AddObserver(this); | 170 query_result_manager_->AddObserver(this); |
(...skipping 17 matching lines...) Expand all Loading... | |
179 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, | 188 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, |
180 const GURL& frame_url) { | 189 const GURL& frame_url) { |
181 if (source.Empty()) { | 190 if (source.Empty()) { |
182 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); | 191 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); |
183 } else { | 192 } else { |
184 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); | 193 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); |
185 } | 194 } |
186 UpdateSourceHostAndCastModes(frame_url); | 195 UpdateSourceHostAndCastModes(frame_url); |
187 } | 196 } |
188 | 197 |
189 void MediaRouterUI::HandleRouteResponseForPresentation( | |
190 const MediaRoute* route, | |
191 const std::string& error) { | |
192 if (!route) { | |
193 presentation_session_request_->MaybeInvokeErrorCallback( | |
194 content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error)); | |
195 } else { | |
196 // TODO(imcheng): Presentation ID should come from the response | |
197 // as the IDs might not be the same. | |
198 presentation_session_request_->MaybeInvokeSuccessCallback( | |
199 route->media_route_id()); | |
200 } | |
201 } | |
202 | |
203 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { | 198 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { |
204 DCHECK(query_result_manager_); | 199 DCHECK(query_result_manager_); |
205 frame_url_ = frame_url; | 200 frame_url_ = frame_url; |
206 query_result_manager_->GetSupportedCastModes(&cast_modes_); | 201 query_result_manager_->GetSupportedCastModes(&cast_modes_); |
207 if (ui_initialized_) | 202 if (ui_initialized_) |
208 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); | 203 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); |
209 } | 204 } |
210 | 205 |
211 void MediaRouterUI::Close() { | 206 void MediaRouterUI::Close() { |
212 if (presentation_session_request_.get()) { | |
213 presentation_session_request_->MaybeInvokeErrorCallback( | |
214 content::PresentationError( | |
215 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, | |
216 "Dialog closed.")); | |
217 } | |
218 | |
219 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); | 207 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); |
220 if (delegate) { | 208 if (delegate) { |
221 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); | 209 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); |
222 delegate->OnDialogCloseFromWebUI(); | 210 delegate->OnDialogCloseFromWebUI(); |
223 } | 211 } |
224 } | 212 } |
225 | 213 |
226 void MediaRouterUI::UIInitialized() { | 214 void MediaRouterUI::UIInitialized() { |
227 ui_initialized_ = true; | 215 ui_initialized_ = true; |
228 } | 216 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
275 | 263 |
276 void MediaRouterUI::OnRouteResponseReceived(scoped_ptr<MediaRoute> route, | 264 void MediaRouterUI::OnRouteResponseReceived(scoped_ptr<MediaRoute> route, |
277 const std::string& error) { | 265 const std::string& error) { |
278 DVLOG(1) << "OnRouteResponseReceived"; | 266 DVLOG(1) << "OnRouteResponseReceived"; |
279 // TODO(imcheng): Display error in UI. (crbug.com/490372) | 267 // TODO(imcheng): Display error in UI. (crbug.com/490372) |
280 if (!route) | 268 if (!route) |
281 LOG(ERROR) << "MediaRouteResponse returned error: " << error; | 269 LOG(ERROR) << "MediaRouteResponse returned error: " << error; |
282 else | 270 else |
283 handler_->AddRoute(*route); | 271 handler_->AddRoute(*route); |
284 | 272 |
285 if (requesting_route_for_default_source_) { | |
286 if (presentation_session_request_.get()) { | |
287 HandleRouteResponseForPresentation(route.get(), error); | |
288 } else { | |
289 // Dialog initiated via browser action. Let | |
290 // PresentationServiceDelegateImpl perform the match against the default | |
291 // presentation URL. | |
292 if (route && presentation_service_delegate_.get()) | |
293 presentation_service_delegate_->OnRouteCreated(*route); | |
294 } | |
295 } | |
296 | |
297 has_pending_route_request_ = false; | 273 has_pending_route_request_ = false; |
298 requesting_route_for_default_source_ = false; | 274 requesting_route_for_default_source_ = false; |
299 } | 275 } |
300 | 276 |
301 bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, | 277 bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, |
302 MediaCastMode cast_mode) { | 278 MediaCastMode cast_mode) { |
303 DCHECK(query_result_manager_.get()); | 279 DCHECK(query_result_manager_.get()); |
304 DCHECK(initiator_); | 280 DCHECK(initiator_); |
305 | 281 |
306 // Note that there is a rarely-encountered bug, where the MediaCastMode to | 282 // Note that there is a rarely-encountered bug, where the MediaCastMode to |
(...skipping 15 matching lines...) Expand all Loading... | |
322 if (requesting_route_for_default_source_) { | 298 if (requesting_route_for_default_source_) { |
323 origin = frame_url_.GetOrigin(); | 299 origin = frame_url_.GetOrigin(); |
324 } else { | 300 } else { |
325 // Requesting route for mirroring. Use a placeholder URL as origin. | 301 // Requesting route for mirroring. Use a placeholder URL as origin. |
326 origin = GURL(chrome::kChromeUIMediaRouterURL); | 302 origin = GURL(chrome::kChromeUIMediaRouterURL); |
327 } | 303 } |
328 DCHECK(origin.is_valid()); | 304 DCHECK(origin.is_valid()); |
329 | 305 |
330 DVLOG(1) << "DoCreateRoute: origin: " << origin; | 306 DVLOG(1) << "DoCreateRoute: origin: " << origin; |
331 | 307 |
308 MediaRouteResponseCallback route_response_callback = base::Bind( | |
309 &MediaRouterUI::OnRouteResponseReceived, weak_factory_.GetWeakPtr()); | |
Kevin M
2015/07/13 21:55:26
Assign route_response_callback in an "else" block?
imcheng
2015/07/14 01:00:24
The value here is used inside "if" so I can avoid
| |
310 if (requesting_route_for_default_source_) { | |
311 // For presentation route requests, we need to make sure the route response | |
312 // callback will outlive this dialog in order to propagate presentation | |
313 // API responses correctly. | |
314 MediaRouterDialogController* dialog_controller = | |
315 MediaRouterDialogController::FromWebContents(initiator_); | |
316 DCHECK(dialog_controller); | |
317 route_response_callback = dialog_controller->AddPresentationRouteRequest( | |
318 route_response_callback, presentation_request_.Pass()); | |
319 } | |
320 | |
332 router_->CreateRoute(source.id(), sink_id, origin, | 321 router_->CreateRoute(source.id(), sink_id, origin, |
333 SessionTabHelper::IdForTab(initiator_), | 322 SessionTabHelper::IdForTab(initiator_), |
334 base::Bind(&MediaRouterUI::OnRouteResponseReceived, | 323 route_response_callback); |
335 weak_factory_.GetWeakPtr())); | |
336 return true; | 324 return true; |
337 } | 325 } |
338 | 326 |
339 std::string MediaRouterUI::GetFrameURLHost() const { | 327 std::string MediaRouterUI::GetFrameURLHost() const { |
340 return GetHostFromURL(frame_url_); | 328 return GetHostFromURL(frame_url_); |
341 } | 329 } |
342 | 330 |
343 } // namespace media_router | 331 } // namespace media_router |
OLD | NEW |