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

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: Fix unit test 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
« no previous file with comments | « chrome/browser/ui/webui/media_router/media_router_ui.h ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_presentation_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 {
35 36
36 namespace { 37 namespace {
37 38
39 void HandleRouteResponseForPresentationApi(
40 scoped_ptr<CreatePresentationSessionRequest> presentation_request,
41 const MediaRoute* route,
42 const std::string& error) {
43 DCHECK(presentation_request);
44 if (!route) {
45 presentation_request->MaybeInvokeErrorCallback(
46 content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error));
47 } else {
48 presentation_request->MaybeInvokeSuccessCallback(route->media_route_id());
49 }
50 }
51
38 std::string GetHostFromURL(const GURL& gurl) { 52 std::string GetHostFromURL(const GURL& gurl) {
39 if (gurl.is_empty()) 53 if (gurl.is_empty())
40 return std::string(); 54 return std::string();
41 std::string host = gurl.host(); 55 std::string host = gurl.host();
42 if (base::StartsWith(host, "www.", base::CompareCase::INSENSITIVE_ASCII)) 56 if (base::StartsWith(host, "www.", base::CompareCase::INSENSITIVE_ASCII))
43 host = host.substr(4); 57 host = host.substr(4);
44 return host; 58 return host;
45 } 59 }
46 60
47 } // namespace 61 } // namespace
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 128
115 // Ownership of |handler_| is transferred to |web_ui|. 129 // Ownership of |handler_| is transferred to |web_ui|.
116 web_ui->AddMessageHandler(handler_); 130 web_ui->AddMessageHandler(handler_);
117 } 131 }
118 132
119 MediaRouterUI::~MediaRouterUI() { 133 MediaRouterUI::~MediaRouterUI() {
120 if (query_result_manager_.get()) 134 if (query_result_manager_.get())
121 query_result_manager_->RemoveObserver(this); 135 query_result_manager_->RemoveObserver(this);
122 if (presentation_service_delegate_.get()) 136 if (presentation_service_delegate_.get())
123 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this); 137 presentation_service_delegate_->RemoveDefaultMediaSourceObserver(this);
138 // If |presentation_request_| still exists, then it means presentation route
139 // request was never attempted.
140 if (presentation_request_) {
141 presentation_request_->MaybeInvokeErrorCallback(content::PresentationError(
142 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED,
143 "Dialog closed."));
144 }
124 } 145 }
125 146
126 void MediaRouterUI::InitWithDefaultMediaSource( 147 void MediaRouterUI::InitWithDefaultMediaSource(
127 PresentationServiceDelegateImpl* delegate) { 148 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate) {
128 DCHECK(delegate); 149 DCHECK(delegate);
129 DCHECK(!presentation_service_delegate_); 150 DCHECK(!presentation_service_delegate_);
130 DCHECK(!query_result_manager_.get()); 151 DCHECK(!query_result_manager_.get());
131 152
132 presentation_service_delegate_ = delegate->GetWeakPtr(); 153 presentation_service_delegate_ = delegate;
133 presentation_service_delegate_->AddDefaultMediaSourceObserver(this); 154 presentation_service_delegate_->AddDefaultMediaSourceObserver(this);
134 InitCommon(presentation_service_delegate_->web_contents(), 155 InitCommon(presentation_service_delegate_->web_contents(),
135 presentation_service_delegate_->default_source(), 156 presentation_service_delegate_->default_source(),
136 presentation_service_delegate_->default_frame_url()); 157 presentation_service_delegate_->default_frame_url());
137 } 158 }
138 159
139 void MediaRouterUI::InitWithPresentationSessionRequest( 160 void MediaRouterUI::InitWithPresentationSessionRequest(
140 const content::WebContents* initiator, 161 content::WebContents* initiator,
141 scoped_ptr<CreateSessionRequest> request) { 162 scoped_ptr<CreatePresentationSessionRequest> presentation_request) {
142 DCHECK(request.get()); 163 DCHECK(initiator);
143 DCHECK(!presentation_session_request_.get()); 164 DCHECK(presentation_request);
144 DCHECK(!query_result_manager_.get()); 165 DCHECK(!presentation_request_);
166 DCHECK(!query_result_manager_);
145 167
146 presentation_session_request_ = request.Pass(); 168 presentation_request_ = presentation_request.Pass();
147 InitCommon(initiator, presentation_session_request_->GetMediaSource(), 169 InitCommon(initiator, presentation_request_->GetMediaSource(),
148 presentation_session_request_->frame_url()); 170 presentation_request_->frame_url());
149 } 171 }
150 172
151 void MediaRouterUI::InitCommon(const content::WebContents* initiator, 173 void MediaRouterUI::InitCommon(content::WebContents* initiator,
152 const MediaSource& default_source, 174 const MediaSource& default_source,
153 const GURL& default_frame_url) { 175 const GURL& default_frame_url) {
154 DCHECK(initiator); 176 DCHECK(initiator);
155 177
156 // Register for Issue and MediaRoute updates. 178 // Register for Issue and MediaRoute updates.
157 issues_observer_.reset(new UIIssuesObserver(router_, this)); 179 issues_observer_.reset(new UIIssuesObserver(router_, this));
158 routes_observer_.reset(new UIMediaRoutesObserver(router_, this)); 180 routes_observer_.reset(new UIMediaRoutesObserver(router_, this));
159 181
160 query_result_manager_.reset(new QueryResultManager(router_)); 182 query_result_manager_.reset(new QueryResultManager(router_));
161 query_result_manager_->AddObserver(this); 183 query_result_manager_->AddObserver(this);
(...skipping 13 matching lines...) Expand all
175 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source, 197 void MediaRouterUI::OnDefaultMediaSourceChanged(const MediaSource& source,
176 const GURL& frame_url) { 198 const GURL& frame_url) {
177 if (source.Empty()) { 199 if (source.Empty()) {
178 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT); 200 query_result_manager_->StopSinksQuery(MediaCastMode::DEFAULT);
179 } else { 201 } else {
180 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source); 202 query_result_manager_->StartSinksQuery(MediaCastMode::DEFAULT, source);
181 } 203 }
182 UpdateSourceHostAndCastModes(frame_url); 204 UpdateSourceHostAndCastModes(frame_url);
183 } 205 }
184 206
185 void MediaRouterUI::HandleRouteResponseForPresentation(
186 const MediaRoute* route,
187 const std::string& error) {
188 if (!route) {
189 presentation_session_request_->MaybeInvokeErrorCallback(
190 content::PresentationError(content::PRESENTATION_ERROR_UNKNOWN, error));
191 } else {
192 // TODO(imcheng): Presentation ID should come from the response
193 // as the IDs might not be the same.
194 presentation_session_request_->MaybeInvokeSuccessCallback(
195 route->media_route_id());
196 }
197 }
198
199 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) { 207 void MediaRouterUI::UpdateSourceHostAndCastModes(const GURL& frame_url) {
200 DCHECK(query_result_manager_); 208 DCHECK(query_result_manager_);
201 frame_url_ = frame_url; 209 frame_url_ = frame_url;
202 query_result_manager_->GetSupportedCastModes(&cast_modes_); 210 query_result_manager_->GetSupportedCastModes(&cast_modes_);
203 if (ui_initialized_) 211 if (ui_initialized_)
204 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_)); 212 handler_->UpdateCastModes(cast_modes_, GetHostFromURL(frame_url_));
205 } 213 }
206 214
207 void MediaRouterUI::Close() { 215 void MediaRouterUI::Close() {
208 if (presentation_session_request_.get()) {
209 presentation_session_request_->MaybeInvokeErrorCallback(
210 content::PresentationError(
211 content::PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED,
212 "Dialog closed."));
213 }
214
215 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate(); 216 ConstrainedWebDialogDelegate* delegate = GetConstrainedDelegate();
216 if (delegate) { 217 if (delegate) {
217 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string()); 218 delegate->GetWebDialogDelegate()->OnDialogClosed(std::string());
218 delegate->OnDialogCloseFromWebUI(); 219 delegate->OnDialogCloseFromWebUI();
219 } 220 }
220 } 221 }
221 222
222 void MediaRouterUI::UIInitialized() { 223 void MediaRouterUI::UIInitialized() {
223 ui_initialized_ = true; 224 ui_initialized_ = true;
224 } 225 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 if (ui_initialized_) 263 if (ui_initialized_)
263 handler_->UpdateIssue(issue); 264 handler_->UpdateIssue(issue);
264 } 265 }
265 266
266 void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) { 267 void MediaRouterUI::OnRoutesUpdated(const std::vector<MediaRoute>& routes) {
267 routes_ = routes; 268 routes_ = routes;
268 if (ui_initialized_) 269 if (ui_initialized_)
269 handler_->UpdateRoutes(routes_); 270 handler_->UpdateRoutes(routes_);
270 } 271 }
271 272
272 void MediaRouterUI::OnRouteResponseReceived(scoped_ptr<MediaRoute> route, 273 void MediaRouterUI::OnRouteResponseReceived(const MediaRoute* route,
273 const std::string& error) { 274 const std::string& error) {
274 DVLOG(1) << "OnRouteResponseReceived"; 275 DVLOG(1) << "OnRouteResponseReceived";
275 // TODO(imcheng): Display error in UI. (crbug.com/490372) 276 // TODO(imcheng): Display error in UI. (crbug.com/490372)
276 if (!route) 277 if (!route)
277 LOG(ERROR) << "MediaRouteResponse returned error: " << error; 278 LOG(ERROR) << "MediaRouteResponse returned error: " << error;
278 else 279 else
279 handler_->AddRoute(*route); 280 handler_->AddRoute(*route);
280 281
281 if (requesting_route_for_default_source_) {
282 if (presentation_session_request_.get()) {
283 HandleRouteResponseForPresentation(route.get(), error);
284 } else {
285 // Dialog initiated via browser action. Let
286 // PresentationServiceDelegateImpl perform the match against the default
287 // presentation URL.
288 if (route && presentation_service_delegate_.get())
289 presentation_service_delegate_->OnRouteCreated(*route);
290 }
291 }
292
293 has_pending_route_request_ = false; 282 has_pending_route_request_ = false;
294 requesting_route_for_default_source_ = false; 283 requesting_route_for_default_source_ = false;
295 } 284 }
296 285
297 bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id, 286 bool MediaRouterUI::DoCreateRoute(const MediaSink::Id& sink_id,
298 MediaCastMode cast_mode) { 287 MediaCastMode cast_mode) {
299 DCHECK(query_result_manager_.get()); 288 DCHECK(query_result_manager_.get());
300 DCHECK(initiator_); 289 DCHECK(initiator_);
301 290
302 // Note that there is a rarely-encountered bug, where the MediaCastMode to 291 // Note that there is a rarely-encountered bug, where the MediaCastMode to
(...skipping 15 matching lines...) Expand all
318 if (requesting_route_for_default_source_) { 307 if (requesting_route_for_default_source_) {
319 origin = frame_url_.GetOrigin(); 308 origin = frame_url_.GetOrigin();
320 } else { 309 } else {
321 // Requesting route for mirroring. Use a placeholder URL as origin. 310 // Requesting route for mirroring. Use a placeholder URL as origin.
322 origin = GURL(chrome::kChromeUIMediaRouterURL); 311 origin = GURL(chrome::kChromeUIMediaRouterURL);
323 } 312 }
324 DCHECK(origin.is_valid()); 313 DCHECK(origin.is_valid());
325 314
326 DVLOG(1) << "DoCreateRoute: origin: " << origin; 315 DVLOG(1) << "DoCreateRoute: origin: " << origin;
327 316
317 // There are 3 cases. In all cases the MediaRouterUI will need to be notified.
318 // (1) Non-presentation route request (e.g., mirroring). No additional
319 // notification necessary.
320 // (2) Presentation route request for a Presentation API startSession call.
321 // The startSession (CreatePresentationSessionRequest) will need to be
322 // answered with the
323 // route response.
324 // (3) Browser-initiated presentation route request. If successful,
325 // PresentationServiceDelegateImpl will have to be notified.
326 std::vector<MediaRouteResponseCallback> route_response_callbacks;
327 route_response_callbacks.push_back(base::Bind(
328 &MediaRouterUI::OnRouteResponseReceived, weak_factory_.GetWeakPtr()));
329 if (requesting_route_for_default_source_) {
330 if (presentation_request_) {
331 // |presentation_request_| will be nullptr after this call, as the
332 // object will be transferred to the callback.
333 route_response_callbacks.push_back(
334 base::Bind(&HandleRouteResponseForPresentationApi,
335 base::Passed(&presentation_request_)));
336 } else if (presentation_service_delegate_) {
337 route_response_callbacks.push_back(
338 base::Bind(&PresentationServiceDelegateImpl::OnRouteResponse,
339 presentation_service_delegate_));
340 }
341 }
342
328 router_->CreateRoute(source.id(), sink_id, origin, 343 router_->CreateRoute(source.id(), sink_id, origin,
329 SessionTabHelper::IdForTab(initiator_), 344 SessionTabHelper::IdForTab(initiator_),
330 base::Bind(&MediaRouterUI::OnRouteResponseReceived, 345 route_response_callbacks);
331 weak_factory_.GetWeakPtr()));
332 return true; 346 return true;
333 } 347 }
334 348
335 std::string MediaRouterUI::GetFrameURLHost() const { 349 std::string MediaRouterUI::GetFrameURLHost() const {
336 return GetHostFromURL(frame_url_); 350 return GetHostFromURL(frame_url_);
337 } 351 }
338 352
339 } // namespace media_router 353 } // namespace media_router
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/media_router/media_router_ui.h ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698