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

Side by Side Diff: chrome/browser/ui/webui/media_router/media_router_ui.cc

Issue 1406013003: [Presentation API / Media Router] Clean up default pres URL logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed mfoltz's comments Created 5 years, 2 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
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
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 {
235 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); 234 presentation_request_.reset(new PresentationRequest(*presentation_request));
235 query_result_manager_->StartSinksQuery(
236 MediaCastMode::DEFAULT, presentation_request_->GetMediaSource());
236 } 237 }
237 UpdateSourceHostAndCastModes(frame_url);
238 }
239 238
240 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { 239 // 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_); 240 query_result_manager_->GetSupportedCastModes(&cast_modes_);
244 if (ui_initialized_) 241 if (ui_initialized_) {
245 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); 242 handler_->UpdateCastModes(
243 cast_modes_, presentation_request_
244 ? GetHostFromURL(presentation_request_->frame_url())
245 : std::string());
246 }
246 } 247 }
247 248
248 void MediaRouterUI::Close() { 249 void MediaRouterUI::Close() {
249 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); 250 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate();
250 if (delegate) { 251 if (delegate) {
251 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); 252 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string());
252 delegate->OnDialogCloseFromWebUI(); 253 delegate->OnDialogCloseFromWebUI();
253 } 254 }
254 } 255 }
255 256
256 void MediaRouterUI::UIInitialized() { 257 void MediaRouterUI::UIInitialized() {
257 ui_initialized_ = true; 258 ui_initialized_ = true;
258 259
259 // Register for Issue updates. 260 // Register for Issue updates.
260 if (!issues_observer_) 261 if (!issues_observer_)
261 issues_observer_.reset(new UIIssuesObserver(router_, this)); 262 issues_observer_.reset(new UIIssuesObserver(router_, this));
262 issues_observer_->RegisterObserver(); 263 issues_observer_->RegisterObserver();
263 } 264 }
264 265
265 bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id, 266 bool MediaRouterUI::CreateRoute(const MediaSink::Id& sink_id,
266 MediaCastMode cast_mode) { 267 MediaCastMode cast_mode) {
267 DCHECK(query_result_manager_.get()); 268 DCHECK(query_result_manager_.get());
268 DCHECK(initiator_); 269 DCHECK(initiator_);
269 270
270 // Note that there is a rarely-encountered bug, where the MediaCastMode to 271 // Note that there is a rarely-encountered bug, where the MediaCastMode to
271 // MediaSource mapping could have been updated, between when the user 272 // MediaSource mapping could have been updated, between when the user clicked
272 // clicked on the UI to start a create route request, 273 // on the UI to start a create route request, and when this function is
273 // and when this function is called. 274 // called. However, since the user does not have visibility into the
274 // However, since the user does not have visibility into the MediaSource, and 275 // 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. 276 // for now.
276 MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode); 277 MediaSource source = query_result_manager_->GetSourceForCastMode(cast_mode);
277 if (source.Empty()) { 278 if (source.Empty()) {
278 LOG(ERROR) << "No corresponding MediaSource for cast mode " << cast_mode; 279 LOG(ERROR) << "No corresponding MediaSource for cast mode " << cast_mode;
279 return false; 280 return false;
280 } 281 }
281 282
282 requesting_route_for_default_source_ = cast_mode == MediaCastMode::DEFAULT; 283 requesting_route_for_default_source_ = cast_mode == MediaCastMode::DEFAULT;
284 DCHECK_IMPLIES(requesting_route_for_default_source_, presentation_request_);
285 if (requesting_route_for_default_source_ && !presentation_request_) {
286 DLOG(ERROR) << "Requested to create a route for presentation, but "
287 << "presentation request is missing.";
288 return false;
289 }
290
283 current_route_request_id_ = ++route_request_counter_; 291 current_route_request_id_ = ++route_request_counter_;
284 GURL origin; 292 GURL origin;
285 // TODO(imcheng): What is the origin if not creating route in DEFAULT mode?
286 if (requesting_route_for_default_source_) { 293 if (requesting_route_for_default_source_) {
287 origin = frame_url_.GetOrigin(); 294 origin = presentation_request_->frame_url().GetOrigin();
288 } else { 295 } else {
289 // Requesting route for mirroring. Use a placeholder URL as origin. 296 // Requesting route for mirroring. Use a placeholder URL as origin.
290 origin = GURL(chrome::kChromeUIMediaRouterURL); 297 origin = GURL(chrome::kChromeUIMediaRouterURL);
291 } 298 }
292 DCHECK(origin.is_valid()); 299 DCHECK(origin.is_valid());
293 300
294 DVLOG(1) << "DoCreateRoute: origin: " << origin; 301 DVLOG(1) << "DoCreateRoute: origin: " << origin;
295 302
296 // There are 3 cases. In all cases the MediaRouterUI will need to be notified. 303 // 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 304 // (1) Non-presentation route request (e.g., mirroring). No additional
298 // notification necessary. 305 // notification necessary.
299 // (2) Presentation route request for a Presentation API startSession call. 306 // (2) Presentation route request for a Presentation API startSession call.
300 // The startSession (CreatePresentationSessionRequest) will need to be 307 // The startSession (CreatePresentationSessionRequest) will need to be
301 // answered with the 308 // answered with the
302 // route response. 309 // route response.
303 // (3) Browser-initiated presentation route request. If successful, 310 // (3) Browser-initiated presentation route request. If successful,
304 // PresentationServiceDelegateImpl will have to be notified. Note that we 311 // PresentationServiceDelegateImpl will have to be notified. Note that we
305 // treat subsequent route requests from a Presentation API-initiated dialogs 312 // treat subsequent route requests from a Presentation API-initiated dialogs
306 // as browser-initiated. 313 // as browser-initiated.
307 std::vector<MediaRouteResponseCallback> route_response_callbacks; 314 std::vector<MediaRouteResponseCallback> route_response_callbacks;
308 route_response_callbacks.push_back( 315 route_response_callbacks.push_back(
309 base::Bind(&MediaRouterUI::OnRouteResponseReceived, 316 base::Bind(&MediaRouterUI::OnRouteResponseReceived,
310 weak_factory_.GetWeakPtr(), current_route_request_id_, 317 weak_factory_.GetWeakPtr(), current_route_request_id_,
311 sink_id)); 318 sink_id));
312 if (requesting_route_for_default_source_) { 319 if (requesting_route_for_default_source_) {
313 if (presentation_request_) { 320 if (create_session_request_) {
314 // |presentation_request_| will be nullptr after this call, as the 321 // |create_session_request_| will be nullptr after this call, as the
315 // object will be transferred to the callback. 322 // object will be transferred to the callback.
316 route_response_callbacks.push_back( 323 route_response_callbacks.push_back(
317 base::Bind(&CreatePresentationSessionRequest::HandleRouteResponse, 324 base::Bind(&CreatePresentationSessionRequest::HandleRouteResponse,
318 base::Passed(&presentation_request_))); 325 base::Passed(&create_session_request_)));
319 } else if (presentation_service_delegate_) { 326 } else if (presentation_service_delegate_) {
320 route_response_callbacks.push_back( 327 route_response_callbacks.push_back(
321 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse, 328 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse,
322 presentation_service_delegate_)); 329 presentation_service_delegate_, *presentation_request_));
323 } 330 }
324 } 331 }
325 332
326 // Start the timer. 333 // Start the timer.
327 route_creation_timer_.Start( 334 route_creation_timer_.Start(
328 FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds), 335 FROM_HERE, base::TimeDelta::FromSeconds(kCreateRouteTimeoutSeconds),
329 this, &MediaRouterUI::RouteCreationTimeout); 336 this, &MediaRouterUI::RouteCreationTimeout);
330 337
331 router_->CreateRoute(source.id(), sink_id, origin, 338 router_->CreateRoute(source.id(), sink_id, origin,
332 SessionTabHelper::IdForTab(initiator_), 339 SessionTabHelper::IdForTab(initiator_),
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 416
410 std::string MediaRouterUI::GetFrameURLHost() const { 417 std::string MediaRouterUI::GetFrameURLHost() const {
411 return GetHostFromURL(frame_url_); 418 return GetHostFromURL(frame_url_);
412 } 419 }
413 420
414 const std::string& MediaRouterUI::GetRouteProviderExtensionId() const { 421 const std::string& MediaRouterUI::GetRouteProviderExtensionId() const {
415 return router_->media_route_provider_extension_id(); 422 return router_->media_route_provider_extension_id();
416 } 423 }
417 424
418 } // namespace media_router 425 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698