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/guid.h" | 9 #include "base/guid.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 web_ui->AddMessageHandler(handler_); | 156 web_ui->AddMessageHandler(handler_); |
157 } | 157 } |
158 | 158 |
159 MediaRouterUI::~MediaRouterUI() { | 159 MediaRouterUI::~MediaRouterUI() { |
160 if (issues_observer_) | 160 if (issues_observer_) |
161 issues_observer_->UnregisterObserver(); | 161 issues_observer_->UnregisterObserver(); |
162 | 162 |
163 if (query_result_manager_.get()) | 163 if (query_result_manager_.get()) |
164 query_result_manager_->RemoveObserver(this); | 164 query_result_manager_->RemoveObserver(this); |
165 if (presentation_service_delegate_.get()) | 165 if (presentation_service_delegate_.get()) |
166 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); | 166 presentation_service_delegate_->RemoveDefaultPresentationRequestObserver( |
167 // If |presentation_request_| still exists, then it means presentation route | 167 this); |
168 // If |create_session_request_| still exists, then it means presentation route | |
168 // request was never attempted. | 169 // request was never attempted. |
169 if (presentation_request_) { | 170 if (create_session_request_) { |
170 presentation_request_->InvokeErrorCallback(content::PresentationError( | 171 create_session_request_->InvokeErrorCallback(content::PresentationError( |
171 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, | 172 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
172 "Dialog closed.")); | 173 "Dialog closed.")); |
173 } | 174 } |
174 } | 175 } |
175 | 176 |
176 void MediaRouterUI::InitWithDefaultMediaSource( | 177 void MediaRouterUI::InitWithDefaultMediaSource( |
177 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate) { | 178 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate) { |
178 DCHECK(delegate); | 179 DCHECK(delegate); |
179 DCHECK(!presentation_service_delegate_); | 180 DCHECK(!presentation_service_delegate_); |
180 DCHECK(!query_result_manager_.get()); | 181 DCHECK(!query_result_manager_.get()); |
181 | 182 |
182 presentation_service_delegate_ = delegate; | 183 presentation_service_delegate_ = delegate; |
183 presentation_service_delegate_->AddDefaultMediaSourceObserver(this); | 184 presentation_service_delegate_->AddDefaultPresentationRequestObserver(this); |
184 InitCommon(presentation_service_delegate_->web_contents(), | 185 InitCommon(presentation_service_delegate_->web_contents()); |
185 presentation_service_delegate_->default_source(), | 186 OnDefaultPresentationChanged( |
186 presentation_service_delegate_->default_frame_url()); | 187 presentation_service_delegate_->GetDefaultPresentationRequest()); |
187 } | 188 } |
188 | 189 |
189 void MediaRouterUI::InitWithPresentationSessionRequest( | 190 void MediaRouterUI::InitWithPresentationSessionRequest( |
190 content::WebContents* initiator, | 191 content::WebContents* initiator, |
191 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate, | 192 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate, |
192 scoped_ptr<CreatePresentationSessionRequest> presentation_request) { | 193 scoped_ptr<CreatePresentationSessionRequest> create_session_request) { |
193 DCHECK(initiator); | 194 DCHECK(initiator); |
194 DCHECK(presentation_request); | 195 DCHECK(create_session_request); |
195 DCHECK(!presentation_request_); | 196 DCHECK(!create_session_request_); |
196 DCHECK(!query_result_manager_); | 197 DCHECK(!query_result_manager_); |
197 | 198 |
198 presentation_request_ = presentation_request.Pass(); | 199 create_session_request_ = create_session_request.Pass(); |
199 presentation_service_delegate_ = delegate; | 200 presentation_service_delegate_ = delegate; |
200 InitCommon(initiator, presentation_request_->media_source(), | 201 InitCommon(initiator); |
201 presentation_request_->frame_url()); | 202 OnDefaultPresentationChanged( |
203 &create_session_request_->presentation_request()); | |
202 } | 204 } |
203 | 205 |
204 void MediaRouterUI::InitCommon(content::WebContents* initiator, | 206 void MediaRouterUI::InitCommon(content::WebContents* initiator) { |
205 const MediaSource& default_source, | |
206 const GURL& default_frame_url) { | |
207 DCHECK(initiator); | 207 DCHECK(initiator); |
208 DCHECK(router_); | 208 DCHECK(router_); |
209 | 209 |
210 // Register for MediaRoute updates. | 210 // Register for MediaRoute updates. |
211 routes_observer_.reset(new UIMediaRoutesObserver( | 211 routes_observer_.reset(new UIMediaRoutesObserver( |
212 router_, | 212 router_, |
213 base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this)))); | 213 base::Bind(&MediaRouterUI::OnRoutesUpdated, base::Unretained(this)))); |
214 | 214 |
215 query_result_manager_.reset(new QueryResultManager(router_)); | 215 query_result_manager_.reset(new QueryResultManager(router_)); |
216 query_result_manager_->AddObserver(this); | 216 query_result_manager_->AddObserver(this); |
217 | 217 |
218 // These modes are always available. | 218 // These modes are always available. |
219 query_result_manager_->StartSinksQuery( | 219 query_result_manager_->StartSinksQuery( |
220 MediaCastMode::DESKTOP_MIRROR, MediaSourceForDesktop()); | 220 MediaCastMode::DESKTOP_MIRROR, MediaSourceForDesktop()); |
221 initiator_ = initiator; | 221 initiator_ = initiator; |
222 MediaSource mirroring_source( | 222 MediaSource mirroring_source( |
223 MediaSourceForTab(SessionTabHelper::IdForTab(initiator))); | 223 MediaSourceForTab(SessionTabHelper::IdForTab(initiator))); |
224 query_result_manager_->StartSinksQuery( | 224 query_result_manager_->StartSinksQuery( |
225 MediaCastMode::TAB_MIRROR, mirroring_source); | 225 MediaCastMode::TAB_MIRROR, mirroring_source); |
226 | |
227 OnDefaultMediaSourceChanged(default_source, default_frame_url); | |
228 } | 226 } |
229 | 227 |
230 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, | 228 void MediaRouterUI::OnDefaultPresentationChanged( |
231 const GURL& frame_url) { | 229 const PresentationRequest* presentation_request) { |
232 if (source.Empty()) { | 230 if (!presentation_request) { |
231 presentation_request_.reset(); | |
233 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); | 232 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); |
234 } else { | 233 } else { |
234 presentation_request_.reset(new PresentationRequest(*presentation_request)); | |
235 MediaSource source(MediaSourceForPresentationUrl( | |
236 presentation_request_->presentation_url())); | |
235 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); | 237 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); |
236 } | 238 } |
237 UpdateSourceHostAndCastModes(frame_url); | |
238 } | |
239 | 239 |
240 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { | 240 // Gets updated cast modes from |query_result_manager_| and forwards it to UI. |
241 DCHECK(query_result_manager_); | |
242 frame_url_ = frame_url; | |
243 query_result_manager_->GetSupportedCastModes(&cast_modes_); | 241 query_result_manager_->GetSupportedCastModes(&cast_modes_); |
244 if (ui_initialized_) | 242 if (ui_initialized_) { |
245 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); | 243 handler_->UpdateCastModes( |
244 cast_modes_, presentation_request_ | |
245 ? GetHostFromURL(presentation_request_->frame_url()) | |
mark a. foltz
2015/10/20 20:15:25
Is frame_url a GURL? Can you say presentation_req
imcheng
2015/10/24 00:41:19
There's some additional truncating logic in GetHos
| |
246 : std::string()); | |
247 } | |
246 } | 248 } |
247 | 249 |
248 void MediaRouterUI::Close() { | 250 void MediaRouterUI::Close() { |
249 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); | 251 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); |
250 if (delegate) { | 252 if (delegate) { |
251 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); | 253 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); |
252 delegate->OnDialogCloseFromWebUI(); | 254 delegate->OnDialogCloseFromWebUI(); |
253 } | 255 } |
254 } | 256 } |
255 | 257 |
256 void MediaRouterUI::UIInitialized() { | 258 void MediaRouterUI::UIInitialized() { |
257 ui_initialized_ = true; | 259 ui_initialized_ = true; |
258 | 260 |
259 // Register for Issue updates. | 261 // Register for Issue updates. |
260 if (!issues_observer_) | 262 if (!issues_observer_) |
261 issues_observer_.reset(new UIIssuesObserver(router_, this)); | 263 issues_observer_.reset(new UIIssuesObserver(router_, this)); |
262 issues_observer_->RegisterObserver(); | 264 issues_observer_->RegisterObserver(); |
263 } | 265 } |
264 | 266 |
265 bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, | 267 bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, |
266 MediaCastMode cast_mode) { | 268 MediaCastMode cast_mode) { |
267 DCHECK(query_result_manager_.get()); | 269 DCHECK(query_result_manager_.get()); |
268 DCHECK(initiator_); | 270 DCHECK(initiator_); |
269 | 271 |
270 // Note that there is a rarely-encountered bug, where the MediaCastMode to | 272 // Note that there is a rarely-encountered bug, where the MediaCastMode to |
271 // MediaSource mapping could have been updated, between when the user | 273 // MediaSource mapping could have been updated, between when the user clicked |
272 // clicked on the UI to start a create route request, | 274 // on the UI to start a create route request, and when this function is |
273 // and when this function is called. | 275 // called. However, since the user does not have visibility into the |
274 // However, since the user does not have visibility into the MediaSource, and | 276 // MediaSource, and that it occurs very rarely in practice, we leave it as-is |
275 // that it occurs very rarely in practice, we leave it as-is for now. | 277 // for now. |
276 MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode); | 278 MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode); |
277 if (source.Empty()) { | 279 if (source.Empty()) { |
278 LOG(ERROR) << "No corresponding MediaSource for cast mode " << cast_mode; | 280 LOG(ERROR) << "No corresponding MediaSource for cast mode " << cast_mode; |
279 return false; | 281 return false; |
280 } | 282 } |
281 | 283 |
282 requesting_route_for_default_source_ = cast_mode == MediaCastMode::DEFAULT; | 284 requesting_route_for_default_source_ = cast_mode == MediaCastMode::DEFAULT; |
285 DCHECK_IMPLIES(requesting_route_for_default_source_, presentation_request_); | |
mark a. foltz
2015/10/20 20:15:25
Remove DCHECK since you're handling this below.
imcheng
2015/10/24 00:41:19
Below is how I would handle it in release builds.
| |
286 if (requesting_route_for_default_source_ && !presentation_request_) { | |
287 DLOG(ERROR) << "Requested to create a route for presentation, but " | |
288 << "presentation request is missing."; | |
289 return false; | |
290 } | |
291 | |
283 current_route_request_id_ = ++route_request_counter_; | 292 current_route_request_id_ = ++route_request_counter_; |
284 GURL origin; | 293 GURL origin; |
285 // TODO(imcheng): What is the origin if not creating route in DEFAULT mode? | |
286 if (requesting_route_for_default_source_) { | 294 if (requesting_route_for_default_source_) { |
287 origin = frame_url_.GetOrigin(); | 295 origin = presentation_request_->frame_url().GetOrigin(); |
288 } else { | 296 } else { |
289 // Requesting route for mirroring. Use a placeholder URL as origin. | 297 // Requesting route for mirroring. Use a placeholder URL as origin. |
290 origin = GURL(chrome::kChromeUIMediaRouterURL); | 298 origin = GURL(chrome::kChromeUIMediaRouterURL); |
291 } | 299 } |
292 DCHECK(origin.is_valid()); | 300 DCHECK(origin.is_valid()); |
293 | 301 |
294 DVLOG(1) << "DoCreateRoute: origin: " << origin; | 302 DVLOG(1) << "DoCreateRoute: origin: " << origin; |
295 | 303 |
296 // There are 3 cases. In all cases the MediaRouterUI will need to be notified. | 304 // There are 3 cases. In all cases the MediaRouterUI will need to be notified. |
297 // (1) Non-presentation route request (e.g., mirroring). No additional | 305 // (1) Non-presentation route request (e.g., mirroring). No additional |
298 // notification necessary. | 306 // notification necessary. |
299 // (2) Presentation route request for a Presentation API startSession call. | 307 // (2) Presentation route request for a Presentation API startSession call. |
300 // The startSession (CreatePresentationSessionRequest) will need to be | 308 // The startSession (CreatePresentationSessionRequest) will need to be |
301 // answered with the | 309 // answered with the |
302 // route response. | 310 // route response. |
303 // (3) Browser-initiated presentation route request. If successful, | 311 // (3) Browser-initiated presentation route request. If successful, |
304 // PresentationServiceDelegateImpl will have to be notified. Note that we | 312 // PresentationServiceDelegateImpl will have to be notified. Note that we |
305 // treat subsequent route requests from a Presentation API-initiated dialogs | 313 // treat subsequent route requests from a Presentation API-initiated dialogs |
306 // as browser-initiated. | 314 // as browser-initiated. |
307 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 315 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
308 route_response_callbacks.push_back( | 316 route_response_callbacks.push_back( |
309 base::Bind(&MediaRouterUI::OnRouteResponseReceived, | 317 base::Bind(&MediaRouterUI::OnRouteResponseReceived, |
310 weak_factory_.GetWeakPtr(), current_route_request_id_, | 318 weak_factory_.GetWeakPtr(), current_route_request_id_, |
311 sink_id)); | 319 sink_id)); |
312 if (requesting_route_for_default_source_) { | 320 if (requesting_route_for_default_source_) { |
313 if (presentation_request_) { | 321 if (create_session_request_) { |
314 // |presentation_request_| will be nullptr after this call, as the | 322 // |create_session_request_| will be nullptr after this call, as the |
315 // object will be transferred to the callback. | 323 // object will be transferred to the callback. |
316 route_response_callbacks.push_back( | 324 route_response_callbacks.push_back( |
317 base::Bind(&CreatePresentationSessionRequest::HandleRouteResponse, | 325 base::Bind(&CreatePresentationSessionRequest::HandleRouteResponse, |
318 base::Passed(&presentation_request_))); | 326 base::Passed(&create_session_request_))); |
319 } else if (presentation_service_delegate_) { | 327 } else if (presentation_service_delegate_) { |
320 route_response_callbacks.push_back( | 328 route_response_callbacks.push_back( |
321 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, | 329 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, |
322 presentation_service_delegate_)); | 330 presentation_service_delegate_, *presentation_request_)); |
323 } | 331 } |
324 } | 332 } |
325 | 333 |
326 // Start the timer. | 334 // Start the timer. |
327 route_creation_timer_.Start( | 335 route_creation_timer_.Start( |
328 FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds), | 336 FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds), |
329 this, &MediaRouterUI::RouteCreationTimeout); | 337 this, &MediaRouterUI::RouteCreationTimeout); |
330 | 338 |
331 router_->CreateRoute(source.id(), sink_id, origin, | 339 router_->CreateRoute(source.id(), sink_id, origin, |
332 SessionTabHelper::IdForTab(initiator_), | 340 SessionTabHelper::IdForTab(initiator_), |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
409 | 417 |
410 std::string MediaRouterUI::GetFrameURLHost() const { | 418 std::string MediaRouterUI::GetFrameURLHost() const { |
411 return GetHostFromURL(frame_url_); | 419 return GetHostFromURL(frame_url_); |
412 } | 420 } |
413 | 421 |
414 const std::string& MediaRouterUI::GetRouteProviderExtensionId() const { | 422 const std::string& MediaRouterUI::GetRouteProviderExtensionId() const { |
415 return router_->media_route_provider_extension_id(); | 423 return router_->media_route_provider_extension_id(); |
416 } | 424 } |
417 | 425 |
418 } // namespace media_router | 426 } // namespace media_router |
OLD | NEW |