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

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: Fix compile again 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 {
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698