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

Side by Side Diff: content/browser/presentation/presentation_service_impl.cc

Issue 1073893003: [Presentation API] Implement ondefaultsessionstart in PSImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use RunLoopFor Created 5 years, 8 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 "content/browser/presentation/presentation_service_impl.h" 5 #include "content/browser/presentation/presentation_service_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "content/browser/presentation/presentation_type_converters.h" 10 #include "content/browser/presentation/presentation_type_converters.h"
11 #include "content/public/browser/content_browser_client.h" 11 #include "content/public/browser/content_browser_client.h"
12 #include "content/public/browser/navigation_details.h" 12 #include "content/public/browser/navigation_details.h"
13 #include "content/public/browser/render_frame_host.h" 13 #include "content/public/browser/render_frame_host.h"
14 #include "content/public/browser/render_process_host.h" 14 #include "content/public/browser/render_process_host.h"
15 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
16 #include "content/public/common/content_client.h" 16 #include "content/public/common/content_client.h"
17 #include "content/public/common/frame_navigate_params.h" 17 #include "content/public/common/frame_navigate_params.h"
18 18
19 namespace content { 19 namespace content {
20 20
21 PresentationServiceImpl::PresentationServiceImpl( 21 PresentationServiceImpl::PresentationServiceImpl(
22 RenderFrameHost* render_frame_host, 22 RenderFrameHost* render_frame_host,
23 WebContents* web_contents, 23 WebContents* web_contents,
24 PresentationServiceDelegate* delegate) 24 PresentationServiceDelegate* delegate)
25 : WebContentsObserver(web_contents), 25 : WebContentsObserver(web_contents),
26 render_frame_host_(render_frame_host),
27 delegate_(delegate), 26 delegate_(delegate),
28 is_start_session_pending_(false), 27 is_start_session_pending_(false),
29 next_request_session_id_(0), 28 next_request_session_id_(0),
30 weak_factory_(this) { 29 weak_factory_(this) {
31 DCHECK(render_frame_host_); 30 DCHECK(render_frame_host);
32 DCHECK(web_contents); 31 DCHECK(web_contents);
32
33 render_process_id_ = render_frame_host->GetProcess()->GetID();
34 render_frame_id_ = render_frame_host->GetRoutingID();
33 DVLOG(2) << "PresentationServiceImpl: " 35 DVLOG(2) << "PresentationServiceImpl: "
34 << render_frame_host_->GetProcess()->GetID() << ", " 36 << render_process_id_ << ", " << render_frame_id_;
35 << render_frame_host_->GetRoutingID();
36 if (delegate_) 37 if (delegate_)
37 delegate_->AddObserver(this); 38 delegate_->AddObserver(render_process_id_, render_frame_id_, this);
38 } 39 }
39 40
40 PresentationServiceImpl::~PresentationServiceImpl() { 41 PresentationServiceImpl::~PresentationServiceImpl() {
41 if (delegate_) 42 if (delegate_)
42 delegate_->RemoveObserver(this); 43 delegate_->RemoveObserver(render_process_id_, render_frame_id_);
43 FlushNewSessionCallbacks(); 44 FlushNewSessionCallbacks();
44 } 45 }
45 46
46 // static 47 // static
47 void PresentationServiceImpl::CreateMojoService( 48 void PresentationServiceImpl::CreateMojoService(
48 RenderFrameHost* render_frame_host, 49 RenderFrameHost* render_frame_host,
49 mojo::InterfaceRequest<presentation::PresentationService> request) { 50 mojo::InterfaceRequest<presentation::PresentationService> request) {
50 DVLOG(2) << "CreateMojoService"; 51 DVLOG(2) << "CreateMojoService";
51 WebContents* web_contents = 52 WebContents* web_contents =
52 WebContents::FromRenderFrameHost(render_frame_host); 53 WebContents::FromRenderFrameHost(render_frame_host);
(...skipping 23 matching lines...) Expand all
76 } 77 }
77 78
78 PresentationServiceImpl::ScreenAvailabilityContext* 79 PresentationServiceImpl::ScreenAvailabilityContext*
79 PresentationServiceImpl::GetOrCreateAvailabilityContext( 80 PresentationServiceImpl::GetOrCreateAvailabilityContext(
80 const std::string& presentation_url) { 81 const std::string& presentation_url) {
81 auto it = availability_contexts_.find(presentation_url); 82 auto it = availability_contexts_.find(presentation_url);
82 if (it == availability_contexts_.end()) { 83 if (it == availability_contexts_.end()) {
83 linked_ptr<ScreenAvailabilityContext> context( 84 linked_ptr<ScreenAvailabilityContext> context(
84 new ScreenAvailabilityContext(presentation_url)); 85 new ScreenAvailabilityContext(presentation_url));
85 if (!delegate_->AddScreenAvailabilityListener( 86 if (!delegate_->AddScreenAvailabilityListener(
86 render_frame_host_->GetProcess()->GetID(), 87 render_process_id_, render_frame_id_, context.get())) {
87 render_frame_host_->GetRoutingID(),
88 context.get())) {
89 DVLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request."; 88 DVLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request.";
90 return nullptr; 89 return nullptr;
91 } 90 }
92 it = availability_contexts_.insert( 91 it = availability_contexts_.insert(
93 std::make_pair(context->GetPresentationUrl(), context)).first; 92 std::make_pair(context->GetPresentationUrl(), context)).first;
94 } 93 }
95 return it->second.get(); 94 return it->second.get();
96 } 95 }
97 96
98 void PresentationServiceImpl::ListenForScreenAvailability( 97 void PresentationServiceImpl::ListenForScreenAvailability(
(...skipping 19 matching lines...) Expand all
118 DVLOG(2) << "RemoveScreenAvailabilityListener"; 117 DVLOG(2) << "RemoveScreenAvailabilityListener";
119 if (!delegate_) 118 if (!delegate_)
120 return; 119 return;
121 120
122 const std::string& presentation_url_str = presentation_url.get(); 121 const std::string& presentation_url_str = presentation_url.get();
123 auto it = availability_contexts_.find(presentation_url_str); 122 auto it = availability_contexts_.find(presentation_url_str);
124 if (it == availability_contexts_.end()) 123 if (it == availability_contexts_.end())
125 return; 124 return;
126 125
127 delegate_->RemoveScreenAvailabilityListener( 126 delegate_->RemoveScreenAvailabilityListener(
128 render_frame_host_->GetProcess()->GetID(), 127 render_process_id_, render_frame_id_, it->second.get());
129 render_frame_host_->GetRoutingID(),
130 it->second.get());
131 // Resolve the context's pending callbacks before removing it. 128 // Resolve the context's pending callbacks before removing it.
132 it->second->OnScreenAvailabilityChanged(false); 129 it->second->OnScreenAvailabilityChanged(false);
133 availability_contexts_.erase(it); 130 availability_contexts_.erase(it);
134 } 131 }
135 132
136 void PresentationServiceImpl::ListenForDefaultSessionStart( 133 void PresentationServiceImpl::ListenForDefaultSessionStart(
137 const DefaultSessionMojoCallback& callback) { 134 const DefaultSessionMojoCallback& callback) {
138 NOTIMPLEMENTED(); 135 if (!default_session_start_context_.get())
136 default_session_start_context_.reset(new DefaultSessionStartContext);
137 default_session_start_context_->AddCallback(callback);
139 } 138 }
140 139
141 void PresentationServiceImpl::StartSession( 140 void PresentationServiceImpl::StartSession(
142 const mojo::String& presentation_url, 141 const mojo::String& presentation_url,
143 const mojo::String& presentation_id, 142 const mojo::String& presentation_id,
144 const NewSessionMojoCallback& callback) { 143 const NewSessionMojoCallback& callback) {
145 DVLOG(2) << "StartSession"; 144 DVLOG(2) << "StartSession";
146 if (!delegate_) { 145 if (!delegate_) {
147 InvokeNewSessionMojoCallbackWithError(callback); 146 InvokeNewSessionMojoCallbackWithError(callback);
148 return; 147 return;
(...skipping 13 matching lines...) Expand all
162 const mojo::String& presentation_id, 161 const mojo::String& presentation_id,
163 const NewSessionMojoCallback& callback) { 162 const NewSessionMojoCallback& callback) {
164 DVLOG(2) << "JoinSession"; 163 DVLOG(2) << "JoinSession";
165 if (!delegate_) { 164 if (!delegate_) {
166 InvokeNewSessionMojoCallbackWithError(callback); 165 InvokeNewSessionMojoCallbackWithError(callback);
167 return; 166 return;
168 } 167 }
169 168
170 int request_session_id = RegisterNewSessionCallback(callback); 169 int request_session_id = RegisterNewSessionCallback(callback);
171 delegate_->JoinSession( 170 delegate_->JoinSession(
172 render_frame_host_->GetProcess()->GetID(), 171 render_process_id_,
173 render_frame_host_->GetRoutingID(), 172 render_frame_id_,
174 presentation_url, 173 presentation_url,
175 presentation_id, 174 presentation_id,
176 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded, 175 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded,
177 weak_factory_.GetWeakPtr(), false, request_session_id), 176 weak_factory_.GetWeakPtr(), false, request_session_id),
178 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError, 177 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError,
179 weak_factory_.GetWeakPtr(), false, request_session_id)); 178 weak_factory_.GetWeakPtr(), false, request_session_id));
180 } 179 }
181 180
182 void PresentationServiceImpl::HandleQueuedStartSessionRequests() { 181 void PresentationServiceImpl::HandleQueuedStartSessionRequests() {
183 if (queued_start_session_requests_.empty()) { 182 if (queued_start_session_requests_.empty()) {
(...skipping 23 matching lines...) Expand all
207 pending_session_cbs_.clear(); 206 pending_session_cbs_.clear();
208 } 207 }
209 208
210 void PresentationServiceImpl::DoStartSession( 209 void PresentationServiceImpl::DoStartSession(
211 const std::string& presentation_url, 210 const std::string& presentation_url,
212 const std::string& presentation_id, 211 const std::string& presentation_id,
213 const NewSessionMojoCallback& callback) { 212 const NewSessionMojoCallback& callback) {
214 int request_session_id = RegisterNewSessionCallback(callback); 213 int request_session_id = RegisterNewSessionCallback(callback);
215 is_start_session_pending_ = true; 214 is_start_session_pending_ = true;
216 delegate_->StartSession( 215 delegate_->StartSession(
217 render_frame_host_->GetProcess()->GetID(), 216 render_process_id_,
218 render_frame_host_->GetRoutingID(), 217 render_frame_id_,
219 presentation_url, 218 presentation_url,
220 presentation_id, 219 presentation_id,
221 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded, 220 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded,
222 weak_factory_.GetWeakPtr(), true, request_session_id), 221 weak_factory_.GetWeakPtr(), true, request_session_id),
223 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError, 222 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError,
224 weak_factory_.GetWeakPtr(), true, request_session_id)); 223 weak_factory_.GetWeakPtr(), true, request_session_id));
225 } 224 }
226 225
227 void PresentationServiceImpl::OnStartOrJoinSessionSucceeded( 226 void PresentationServiceImpl::OnStartOrJoinSessionSucceeded(
228 bool is_start_session, 227 bool is_start_session,
(...skipping 30 matching lines...) Expand all
259 DCHECK(it->second.get()); 258 DCHECK(it->second.get());
260 it->second->Run(session.Pass(), error.Pass()); 259 it->second->Run(session.Pass(), error.Pass());
261 pending_session_cbs_.erase(it); 260 pending_session_cbs_.erase(it);
262 } 261 }
263 262
264 void PresentationServiceImpl::DoSetDefaultPresentationUrl( 263 void PresentationServiceImpl::DoSetDefaultPresentationUrl(
265 const std::string& default_presentation_url, 264 const std::string& default_presentation_url,
266 const std::string& default_presentation_id) { 265 const std::string& default_presentation_id) {
267 DCHECK(delegate_); 266 DCHECK(delegate_);
268 delegate_->SetDefaultPresentationUrl( 267 delegate_->SetDefaultPresentationUrl(
269 render_frame_host_->GetProcess()->GetID(), 268 render_process_id_,
270 render_frame_host_->GetRoutingID(), 269 render_frame_id_,
271 default_presentation_url, 270 default_presentation_url,
272 default_presentation_id); 271 default_presentation_id);
273 default_presentation_url_ = default_presentation_url; 272 default_presentation_url_ = default_presentation_url;
274 default_presentation_id_ = default_presentation_id; 273 default_presentation_id_ = default_presentation_id;
275 } 274 }
276 275
277 void PresentationServiceImpl::SetDefaultPresentationURL( 276 void PresentationServiceImpl::SetDefaultPresentationURL(
278 const mojo::String& default_presentation_url, 277 const mojo::String& default_presentation_url,
279 const mojo::String& default_presentation_id) { 278 const mojo::String& default_presentation_id) {
280 DVLOG(2) << "SetDefaultPresentationURL"; 279 DVLOG(2) << "SetDefaultPresentationURL";
(...skipping 19 matching lines...) Expand all
300 // Have already started listening. Create a listener for the new URL and 299 // Have already started listening. Create a listener for the new URL and
301 // transfer the callbacks from the old listener, if any. 300 // transfer the callbacks from the old listener, if any.
302 // This is done so that a listener added before default URL is changed 301 // This is done so that a listener added before default URL is changed
303 // will continue to work. 302 // will continue to work.
304 ScreenAvailabilityContext* context = 303 ScreenAvailabilityContext* context =
305 GetOrCreateAvailabilityContext(new_default_url); 304 GetOrCreateAvailabilityContext(new_default_url);
306 old_it->second->PassPendingCallbacks(context); 305 old_it->second->PassPendingCallbacks(context);
307 306
308 // Remove listener for old default presentation URL. 307 // Remove listener for old default presentation URL.
309 delegate_->RemoveScreenAvailabilityListener( 308 delegate_->RemoveScreenAvailabilityListener(
310 render_frame_host_->GetProcess()->GetID(), 309 render_process_id_,
311 render_frame_host_->GetRoutingID(), 310 render_frame_id_,
312 old_it->second.get()); 311 old_it->second.get());
313 availability_contexts_.erase(old_it); 312 availability_contexts_.erase(old_it);
314 DoSetDefaultPresentationUrl(new_default_url, default_presentation_id); 313 DoSetDefaultPresentationUrl(new_default_url, default_presentation_id);
315 } 314 }
316 315
317 void PresentationServiceImpl::CloseSession( 316 void PresentationServiceImpl::CloseSession(
318 const mojo::String& presentation_url, 317 const mojo::String& presentation_url,
319 const mojo::String& presentation_id) { 318 const mojo::String& presentation_id) {
320 NOTIMPLEMENTED(); 319 NOTIMPLEMENTED();
321 } 320 }
322 321
323 void PresentationServiceImpl::ListenForSessionStateChange( 322 void PresentationServiceImpl::ListenForSessionStateChange(
324 const SessionStateCallback& callback) { 323 const SessionStateCallback& callback) {
325 NOTIMPLEMENTED(); 324 NOTIMPLEMENTED();
326 } 325 }
327 326
327 bool PresentationServiceImpl::FrameMatches(
328 content::RenderFrameHost* render_frame_host) const {
329 if (!render_frame_host)
330 return false;
331
332 return render_frame_host->GetProcess()->GetID() == render_process_id_ &&
333 render_frame_host->GetRoutingID() == render_frame_id_;
334 }
335
328 void PresentationServiceImpl::DidNavigateAnyFrame( 336 void PresentationServiceImpl::DidNavigateAnyFrame(
329 content::RenderFrameHost* render_frame_host, 337 content::RenderFrameHost* render_frame_host,
330 const content::LoadCommittedDetails& details, 338 const content::LoadCommittedDetails& details,
331 const content::FrameNavigateParams& params) { 339 const content::FrameNavigateParams& params) {
332 DVLOG(2) << "PresentationServiceImpl::DidNavigateAnyFrame"; 340 DVLOG(2) << "PresentationServiceImpl::DidNavigateAnyFrame";
333 if (render_frame_host_ != render_frame_host) 341 if (!FrameMatches(render_frame_host))
334 return; 342 return;
335 343
336 std::string prev_url_host = details.previous_url.host(); 344 std::string prev_url_host = details.previous_url.host();
337 std::string curr_url_host = params.url.host(); 345 std::string curr_url_host = params.url.host();
338 346
339 // If a frame navigation is in-page (e.g. navigating to a fragment in 347 // If a frame navigation is in-page (e.g. navigating to a fragment in
340 // same page) then we do not unregister listeners. 348 // same page) then we do not unregister listeners.
341 bool in_page_navigation = details.is_in_page || 349 bool in_page_navigation = details.is_in_page ||
342 details.type == content::NAVIGATION_TYPE_IN_PAGE; 350 details.type == content::NAVIGATION_TYPE_IN_PAGE;
343 351
344 DVLOG(2) << "DidNavigateAnyFrame: " 352 DVLOG(2) << "DidNavigateAnyFrame: "
345 << "prev host: " << prev_url_host << ", curr host: " << curr_url_host 353 << "prev host: " << prev_url_host << ", curr host: " << curr_url_host
346 << ", in_page_navigation: " << in_page_navigation; 354 << ", in_page_navigation: " << in_page_navigation;
347 355
348 if (in_page_navigation) 356 if (in_page_navigation)
349 return; 357 return;
350 358
351 // Reset if the frame actually navigated. 359 // Reset if the frame actually navigated.
352 Reset(); 360 Reset();
353 } 361 }
354 362
355 void PresentationServiceImpl::RenderFrameDeleted( 363 void PresentationServiceImpl::RenderFrameDeleted(
356 content::RenderFrameHost* render_frame_host) { 364 content::RenderFrameHost* render_frame_host) {
357 DVLOG(2) << "PresentationServiceImpl::RenderFrameDeleted"; 365 DVLOG(2) << "PresentationServiceImpl::RenderFrameDeleted";
358 if (render_frame_host_ != render_frame_host) 366 if (!FrameMatches(render_frame_host))
359 return; 367 return;
360 368
361 // RenderFrameDeleted means |render_frame_host_| is going to be deleted soon. 369 // RenderFrameDeleted means the associated RFH is going to be deleted soon.
362 // This object should also be deleted. 370 // This object should also be deleted.
363 Reset(); 371 Reset();
364 render_frame_host_ = nullptr;
365 delete this; 372 delete this;
366 } 373 }
367 374
368 void PresentationServiceImpl::Reset() { 375 void PresentationServiceImpl::Reset() {
369 DVLOG(2) << "PresentationServiceImpl::Reset"; 376 DVLOG(2) << "PresentationServiceImpl::Reset";
370 if (delegate_) { 377 if (delegate_)
371 delegate_->Reset( 378 delegate_->Reset(render_process_id_, render_frame_id_);
372 render_frame_host_->GetProcess()->GetID(),
373 render_frame_host_->GetRoutingID());
374 }
375 379
376 default_presentation_url_.clear(); 380 default_presentation_url_.clear();
377 default_presentation_id_.clear(); 381 default_presentation_id_.clear();
378 availability_contexts_.clear(); 382 availability_contexts_.clear();
379 queued_start_session_requests_.clear(); 383 queued_start_session_requests_.clear();
380 FlushNewSessionCallbacks(); 384 FlushNewSessionCallbacks();
385 default_session_start_context_.reset();
381 } 386 }
382 387
383 // static 388 // static
384 void PresentationServiceImpl::InvokeNewSessionMojoCallbackWithError( 389 void PresentationServiceImpl::InvokeNewSessionMojoCallbackWithError(
385 const NewSessionMojoCallback& callback) { 390 const NewSessionMojoCallback& callback) {
386 callback.Run( 391 callback.Run(
387 presentation::PresentationSessionInfoPtr(), 392 presentation::PresentationSessionInfoPtr(),
388 presentation::PresentationError::From( 393 presentation::PresentationError::From(
389 PresentationError(PRESENTATION_ERROR_UNKNOWN, "Internal error"))); 394 PresentationError(PRESENTATION_ERROR_UNKNOWN, "Internal error")));
390 } 395 }
391 396
392 void PresentationServiceImpl::OnDelegateDestroyed() { 397 void PresentationServiceImpl::OnDelegateDestroyed() {
393 DVLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed"; 398 DVLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed";
394 delegate_ = nullptr; 399 delegate_ = nullptr;
395 Reset(); 400 Reset();
396 } 401 }
397 402
403 void PresentationServiceImpl::OnDefaultPresentationStarted(
404 const PresentationSessionInfo& session) {
405 if (default_session_start_context_.get())
406 default_session_start_context_->set_session(session);
407 }
408
398 PresentationServiceImpl::ScreenAvailabilityContext::ScreenAvailabilityContext( 409 PresentationServiceImpl::ScreenAvailabilityContext::ScreenAvailabilityContext(
399 const std::string& presentation_url) 410 const std::string& presentation_url)
400 : presentation_url_(presentation_url) { 411 : presentation_url_(presentation_url) {
401 } 412 }
402 413
403 PresentationServiceImpl::ScreenAvailabilityContext:: 414 PresentationServiceImpl::ScreenAvailabilityContext::
404 ~ScreenAvailabilityContext() { 415 ~ScreenAvailabilityContext() {
405 // Ensure that pending callbacks are flushed. 416 // Ensure that pending callbacks are flushed.
406 OnScreenAvailabilityChanged(false); 417 OnScreenAvailabilityChanged(false);
407 } 418 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 InvokeNewSessionMojoCallbackWithError(callback_); 482 InvokeNewSessionMojoCallbackWithError(callback_);
472 } 483 }
473 484
474 PresentationServiceImpl::NewSessionMojoCallback 485 PresentationServiceImpl::NewSessionMojoCallback
475 PresentationServiceImpl::StartSessionRequest::PassCallback() { 486 PresentationServiceImpl::StartSessionRequest::PassCallback() {
476 NewSessionMojoCallback callback = callback_; 487 NewSessionMojoCallback callback = callback_;
477 callback_.reset(); 488 callback_.reset();
478 return callback; 489 return callback;
479 } 490 }
480 491
492 PresentationServiceImpl::DefaultSessionStartContext
493 ::DefaultSessionStartContext() {
494 }
495
496 PresentationServiceImpl::DefaultSessionStartContext
497 ::~DefaultSessionStartContext() {
498 Reset();
499 }
500
501 void PresentationServiceImpl::DefaultSessionStartContext::AddCallback(
502 const DefaultSessionMojoCallback& callback) {
503 if (session_.get()) {
504 DCHECK(callbacks_.empty());
505 callback.Run(presentation::PresentationSessionInfo::From(*session_));
506 session_.reset();
507 } else {
508 callbacks_.push_back(new DefaultSessionMojoCallback(callback));
509 }
510 }
511
512 void PresentationServiceImpl::DefaultSessionStartContext::set_session(
513 const PresentationSessionInfo& session) {
514 if (callbacks_.empty()) {
515 session_.reset(new PresentationSessionInfo(session));
516 } else {
517 DCHECK(!session_.get());
518 ScopedVector<DefaultSessionMojoCallback> callbacks;
519 callbacks.swap(callbacks_);
520 for (const auto& callback : callbacks)
521 callback->Run(presentation::PresentationSessionInfo::From(session));
522 }
523 }
524
525 void PresentationServiceImpl::DefaultSessionStartContext::Reset() {
526 ScopedVector<DefaultSessionMojoCallback> callbacks;
527 callbacks.swap(callbacks_);
528 for (const auto& callback : callbacks)
529 callback->Run(presentation::PresentationSessionInfoPtr());
530 session_.reset();
531 }
532
481 } // namespace content 533 } // namespace content
482 534
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698