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

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

Issue 1224093004: [Media Router] 2nd take on fix route response callback lifetime in UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Kevin's comments Created 5 years, 5 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/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
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
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
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
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());
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(
haibinlu 2015/07/14 01:44:55 AddPresentationRouteRequest --> AddCreateRouteRequ
imcheng 2015/07/14 16:45:37 ditto
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698