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

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

Issue 1141683002: [Presentation API] Limit the number of pending Start/JoinSession (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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/presentation_session_message.h" 13 #include "content/public/browser/presentation_session_message.h"
14 #include "content/public/browser/render_frame_host.h" 14 #include "content/public/browser/render_frame_host.h"
15 #include "content/public/browser/render_process_host.h" 15 #include "content/public/browser/render_process_host.h"
16 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
17 #include "content/public/common/content_client.h" 17 #include "content/public/common/content_client.h"
18 #include "content/public/common/frame_navigate_params.h" 18 #include "content/public/common/frame_navigate_params.h"
19 #include "content/public/common/presentation_constants.h" 19 #include "content/public/common/presentation_constants.h"
20 20
21 namespace content {
22
21 namespace { 23 namespace {
22 24
25 const int kInvalidRequestSessionId = -1;
26
23 // The return value takes ownership of the contents of |input|. 27 // The return value takes ownership of the contents of |input|.
24 presentation::SessionMessagePtr ToMojoSessionMessage( 28 presentation::SessionMessagePtr ToMojoSessionMessage(
25 content::PresentationSessionMessage* input) { 29 content::PresentationSessionMessage* input) {
26 presentation::SessionMessagePtr output(presentation::SessionMessage::New()); 30 presentation::SessionMessagePtr output(presentation::SessionMessage::New());
27 output->presentation_url.Swap(&input->presentation_url); 31 output->presentation_url.Swap(&input->presentation_url);
28 output->presentation_id.Swap(&input->presentation_id); 32 output->presentation_id.Swap(&input->presentation_id);
29 if (input->is_binary()) { 33 if (input->is_binary()) {
30 // binary data 34 // binary data
31 output->type = presentation::PresentationMessageType:: 35 output->type = presentation::PresentationMessageType::
32 PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER; 36 PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 output = content::PresentationSessionMessage::CreateBinaryMessage( 73 output = content::PresentationSessionMessage::CreateBinaryMessage(
70 input->presentation_url, 74 input->presentation_url,
71 input->presentation_id, 75 input->presentation_id,
72 make_scoped_ptr(new std::vector<uint8_t>)); 76 make_scoped_ptr(new std::vector<uint8_t>));
73 input->data.Swap(output->data.get()); 77 input->data.Swap(output->data.get());
74 } 78 }
75 79
76 return output.Pass(); 80 return output.Pass();
77 } 81 }
78 82
83 void InvokeNewSessionMojoCallbackWithError(
84 const NewSessionMojoCallback& callback) {
85 callback.Run(
86 presentation::PresentationSessionInfoPtr(),
87 presentation::PresentationError::From(
88 PresentationError(PRESENTATION_ERROR_UNKNOWN, "Internal error")));
89 }
90
79 } // namespace 91 } // namespace
80 92
81 namespace content {
82
83 PresentationServiceImpl::PresentationServiceImpl( 93 PresentationServiceImpl::PresentationServiceImpl(
84 RenderFrameHost* render_frame_host, 94 RenderFrameHost* render_frame_host,
85 WebContents* web_contents, 95 WebContents* web_contents,
86 PresentationServiceDelegate* delegate) 96 PresentationServiceDelegate* delegate)
87 : WebContentsObserver(web_contents), 97 : WebContentsObserver(web_contents),
88 delegate_(delegate), 98 delegate_(delegate),
89 is_start_session_pending_(false), 99 start_session_request_id_(kInvalidRequestSessionId),
90 next_request_session_id_(0), 100 next_request_session_id_(0),
91 weak_factory_(this) { 101 weak_factory_(this) {
92 DCHECK(render_frame_host); 102 DCHECK(render_frame_host);
93 DCHECK(web_contents); 103 DCHECK(web_contents);
94 104
95 render_process_id_ = render_frame_host->GetProcess()->GetID(); 105 render_process_id_ = render_frame_host->GetProcess()->GetID();
96 render_frame_id_ = render_frame_host->GetRoutingID(); 106 render_frame_id_ = render_frame_host->GetRoutingID();
97 DVLOG(2) << "PresentationServiceImpl: " 107 DVLOG(2) << "PresentationServiceImpl: "
98 << render_process_id_ << ", " << render_frame_id_; 108 << render_process_id_ << ", " << render_frame_id_;
99 if (delegate_) 109 if (delegate_)
100 delegate_->AddObserver(render_process_id_, render_frame_id_, this); 110 delegate_->AddObserver(render_process_id_, render_frame_id_, this);
101 } 111 }
102 112
103 PresentationServiceImpl::~PresentationServiceImpl() { 113 PresentationServiceImpl::~PresentationServiceImpl() {
104 if (delegate_) 114 if (delegate_)
105 delegate_->RemoveObserver(render_process_id_, render_frame_id_); 115 delegate_->RemoveObserver(render_process_id_, render_frame_id_);
106 FlushNewSessionCallbacks();
107 } 116 }
108 117
109 // static 118 // static
110 void PresentationServiceImpl::CreateMojoService( 119 void PresentationServiceImpl::CreateMojoService(
111 RenderFrameHost* render_frame_host, 120 RenderFrameHost* render_frame_host,
112 mojo::InterfaceRequest<presentation::PresentationService> request) { 121 mojo::InterfaceRequest<presentation::PresentationService> request) {
113 DVLOG(2) << "CreateMojoService"; 122 DVLOG(2) << "CreateMojoService";
114 WebContents* web_contents = 123 WebContents* web_contents =
115 WebContents::FromRenderFrameHost(render_frame_host); 124 WebContents::FromRenderFrameHost(render_frame_host);
116 DCHECK(web_contents); 125 DCHECK(web_contents);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 void PresentationServiceImpl::StartSession( 215 void PresentationServiceImpl::StartSession(
207 const mojo::String& presentation_url, 216 const mojo::String& presentation_url,
208 const mojo::String& presentation_id, 217 const mojo::String& presentation_id,
209 const NewSessionMojoCallback& callback) { 218 const NewSessionMojoCallback& callback) {
210 DVLOG(2) << "StartSession"; 219 DVLOG(2) << "StartSession";
211 if (!delegate_) { 220 if (!delegate_) {
212 InvokeNewSessionMojoCallbackWithError(callback); 221 InvokeNewSessionMojoCallbackWithError(callback);
213 return; 222 return;
214 } 223 }
215 224
216 if (is_start_session_pending_) { 225 if (start_session_request_id_ != kInvalidRequestSessionId) {
217 queued_start_session_requests_.push_back(make_linked_ptr( 226 if (queued_start_session_requests_.size() >= kMaxNumQueuedSessionRequests) {
218 new StartSessionRequest(presentation_url, presentation_id, callback))); 227 InvokeNewSessionMojoCallbackWithError(callback);
228 } else {
whywhat 2015/05/13 11:11:32 nit: consider returning after InvokeNewSessionMojo
imcheng (use chromium acct) 2015/05/13 17:07:45 Done.
229 queued_start_session_requests_.push_back(
230 make_linked_ptr(new StartSessionRequest(
231 presentation_url, presentation_id, callback)));
232 }
219 return; 233 return;
220 } 234 }
221 235
222 DoStartSession(presentation_url, presentation_id, callback); 236 DoStartSession(make_scoped_ptr(new StartSessionRequest(
237 presentation_url, presentation_id, callback)));
223 } 238 }
224 239
225 void PresentationServiceImpl::JoinSession( 240 void PresentationServiceImpl::JoinSession(
226 const mojo::String& presentation_url, 241 const mojo::String& presentation_url,
227 const mojo::String& presentation_id, 242 const mojo::String& presentation_id,
228 const NewSessionMojoCallback& callback) { 243 const NewSessionMojoCallback& callback) {
229 DVLOG(2) << "JoinSession"; 244 DVLOG(2) << "JoinSession";
230 if (!delegate_) { 245 if (!delegate_) {
231 InvokeNewSessionMojoCallbackWithError(callback); 246 InvokeNewSessionMojoCallbackWithError(callback);
232 return; 247 return;
233 } 248 }
234 249
235 int request_session_id = RegisterNewSessionCallback(callback); 250 int request_session_id = RegisterJoinSessionCallback(callback);
251 if (request_session_id == kInvalidRequestSessionId) {
252 InvokeNewSessionMojoCallbackWithError(callback);
253 return;
254 }
236 delegate_->JoinSession( 255 delegate_->JoinSession(
237 render_process_id_, 256 render_process_id_,
238 render_frame_id_, 257 render_frame_id_,
239 presentation_url, 258 presentation_url,
240 presentation_id, 259 presentation_id,
241 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded, 260 base::Bind(&PresentationServiceImpl::OnJoinSessionSucceeded,
242 weak_factory_.GetWeakPtr(), false, request_session_id), 261 weak_factory_.GetWeakPtr(), request_session_id),
243 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError, 262 base::Bind(&PresentationServiceImpl::OnJoinSessionError,
244 weak_factory_.GetWeakPtr(), false, request_session_id)); 263 weak_factory_.GetWeakPtr(), request_session_id));
245 } 264 }
246 265
247 void PresentationServiceImpl::HandleQueuedStartSessionRequests() { 266 void PresentationServiceImpl::HandleQueuedStartSessionRequests() {
248 if (queued_start_session_requests_.empty()) { 267 if (queued_start_session_requests_.empty())
249 is_start_session_pending_ = false;
250 return; 268 return;
251 } 269
252 linked_ptr<StartSessionRequest> request = 270 linked_ptr<StartSessionRequest> request =
253 queued_start_session_requests_.front(); 271 queued_start_session_requests_.front();
254 queued_start_session_requests_.pop_front(); 272 queued_start_session_requests_.pop_front();
255 DoStartSession(request->presentation_url(), 273 DoStartSession(make_scoped_ptr(request.release()));
256 request->presentation_id(),
257 request->PassCallback());
258 } 274 }
259 275
260 int PresentationServiceImpl::RegisterNewSessionCallback( 276 int PresentationServiceImpl::GetNextRequestSessionId() {
261 const NewSessionMojoCallback& callback) { 277 return ++next_request_session_id_;
262 ++next_request_session_id_;
263 pending_session_cbs_[next_request_session_id_].reset(
264 new NewSessionMojoCallback(callback));
265 return next_request_session_id_;
266 } 278 }
267 279
268 void PresentationServiceImpl::FlushNewSessionCallbacks() { 280 int PresentationServiceImpl::RegisterJoinSessionCallback(
269 for (auto& pending_entry : pending_session_cbs_) { 281 const NewSessionMojoCallback& callback) {
270 InvokeNewSessionMojoCallbackWithError(*pending_entry.second); 282 if (pending_join_session_cbs_.size() >= kMaxNumQueuedSessionRequests)
271 } 283 return kInvalidRequestSessionId;
272 pending_session_cbs_.clear(); 284
285 int request_id = GetNextRequestSessionId();
286 pending_join_session_cbs_[request_id].reset(
287 new NewSessionMojoCallbackWrapper(callback));
288 return request_id;
273 } 289 }
274 290
275 void PresentationServiceImpl::DoStartSession( 291 void PresentationServiceImpl::DoStartSession(
276 const std::string& presentation_url, 292 scoped_ptr<StartSessionRequest> request) {
277 const std::string& presentation_id, 293 DCHECK_EQ(kInvalidRequestSessionId, start_session_request_id_);
278 const NewSessionMojoCallback& callback) { 294 DCHECK(!pending_start_session_cb_.get());
279 int request_session_id = RegisterNewSessionCallback(callback); 295
280 is_start_session_pending_ = true; 296 int request_session_id = GetNextRequestSessionId();
297 start_session_request_id_ = request_session_id;
298 pending_start_session_cb_ = request->PassCallback();
299
281 delegate_->StartSession( 300 delegate_->StartSession(
282 render_process_id_, 301 render_process_id_,
283 render_frame_id_, 302 render_frame_id_,
284 presentation_url, 303 request->presentation_url(),
285 presentation_id, 304 request->presentation_id(),
286 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded, 305 base::Bind(&PresentationServiceImpl::OnStartSessionSucceeded,
287 weak_factory_.GetWeakPtr(), true, request_session_id), 306 weak_factory_.GetWeakPtr(), request_session_id),
288 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError, 307 base::Bind(&PresentationServiceImpl::OnStartSessionError,
289 weak_factory_.GetWeakPtr(), true, request_session_id)); 308 weak_factory_.GetWeakPtr(), request_session_id));
290 } 309 }
291 310
292 void PresentationServiceImpl::OnStartOrJoinSessionSucceeded( 311 void PresentationServiceImpl::OnStartSessionSucceeded(
293 bool is_start_session,
294 int request_session_id, 312 int request_session_id,
295 const PresentationSessionInfo& session_info) { 313 const PresentationSessionInfo& session_info) {
296 RunAndEraseNewSessionMojoCallback( 314 if (request_session_id == start_session_request_id_) {
315 CHECK(pending_start_session_cb_.get());
316 pending_start_session_cb_->Run(
317 presentation::PresentationSessionInfo::From(session_info),
318 presentation::PresentationErrorPtr());
319 pending_start_session_cb_.reset();
320 start_session_request_id_ = kInvalidRequestSessionId;
321 HandleQueuedStartSessionRequests();
322 }
323 }
324
325 void PresentationServiceImpl::OnStartSessionError(
326 int request_session_id,
327 const PresentationError& error) {
328 if (request_session_id == start_session_request_id_) {
329 CHECK(pending_start_session_cb_.get());
330 pending_start_session_cb_->Run(
331 presentation::PresentationSessionInfoPtr(),
332 presentation::PresentationError::From(error));
333 pending_start_session_cb_.reset();
334 start_session_request_id_ = kInvalidRequestSessionId;
335 HandleQueuedStartSessionRequests();
336 }
337 }
338
339 void PresentationServiceImpl::OnJoinSessionSucceeded(
340 int request_session_id,
341 const PresentationSessionInfo& session_info) {
342 RunAndEraseJoinSessionMojoCallback(
297 request_session_id, 343 request_session_id,
298 presentation::PresentationSessionInfo::From(session_info), 344 presentation::PresentationSessionInfo::From(session_info),
299 presentation::PresentationErrorPtr()); 345 presentation::PresentationErrorPtr());
300 if (is_start_session)
301 HandleQueuedStartSessionRequests();
302 } 346 }
303 347
304 void PresentationServiceImpl::OnStartOrJoinSessionError( 348 void PresentationServiceImpl::OnJoinSessionError(
305 bool is_start_session,
306 int request_session_id, 349 int request_session_id,
307 const PresentationError& error) { 350 const PresentationError& error) {
308 RunAndEraseNewSessionMojoCallback( 351 RunAndEraseJoinSessionMojoCallback(
309 request_session_id, 352 request_session_id,
310 presentation::PresentationSessionInfoPtr(), 353 presentation::PresentationSessionInfoPtr(),
311 presentation::PresentationError::From(error)); 354 presentation::PresentationError::From(error));
312 if (is_start_session)
313 HandleQueuedStartSessionRequests();
314 } 355 }
315 356
316 void PresentationServiceImpl::RunAndEraseNewSessionMojoCallback( 357 void PresentationServiceImpl::RunAndEraseJoinSessionMojoCallback(
317 int request_session_id, 358 int request_session_id,
318 presentation::PresentationSessionInfoPtr session, 359 presentation::PresentationSessionInfoPtr session,
319 presentation::PresentationErrorPtr error) { 360 presentation::PresentationErrorPtr error) {
320 auto it = pending_session_cbs_.find(request_session_id); 361 auto it = pending_join_session_cbs_.find(request_session_id);
321 if (it == pending_session_cbs_.end()) 362 if (it == pending_join_session_cbs_.end())
322 return; 363 return;
323 364
324 DCHECK(it->second.get()); 365 DCHECK(it->second.get());
325 it->second->Run(session.Pass(), error.Pass()); 366 it->second->Run(session.Pass(), error.Pass());
326 pending_session_cbs_.erase(it); 367 pending_join_session_cbs_.erase(it);
327 } 368 }
328 369
329 void PresentationServiceImpl::SetDefaultPresentationURL( 370 void PresentationServiceImpl::SetDefaultPresentationURL(
330 const mojo::String& default_presentation_url, 371 const mojo::String& default_presentation_url,
331 const mojo::String& default_presentation_id) { 372 const mojo::String& default_presentation_id) {
332 DVLOG(2) << "SetDefaultPresentationURL"; 373 DVLOG(2) << "SetDefaultPresentationURL";
333 if (!delegate_) 374 if (!delegate_)
334 return; 375 return;
335 376
336 const std::string& old_default_url = default_presentation_url_; 377 const std::string& old_default_url = default_presentation_url_;
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 delete this; 523 delete this;
483 } 524 }
484 525
485 void PresentationServiceImpl::Reset() { 526 void PresentationServiceImpl::Reset() {
486 DVLOG(2) << "PresentationServiceImpl::Reset"; 527 DVLOG(2) << "PresentationServiceImpl::Reset";
487 if (delegate_) 528 if (delegate_)
488 delegate_->Reset(render_process_id_, render_frame_id_); 529 delegate_->Reset(render_process_id_, render_frame_id_);
489 530
490 default_presentation_url_.clear(); 531 default_presentation_url_.clear();
491 default_presentation_id_.clear(); 532 default_presentation_id_.clear();
533
492 screen_availability_listener_.reset(); 534 screen_availability_listener_.reset();
535
493 queued_start_session_requests_.clear(); 536 queued_start_session_requests_.clear();
494 FlushNewSessionCallbacks(); 537 start_session_request_id_ = kInvalidRequestSessionId;
538 pending_start_session_cb_.reset();
539
540 pending_join_session_cbs_.clear();
541
495 default_session_start_context_.reset(); 542 default_session_start_context_.reset();
543
496 if (on_session_messages_callback_.get()) { 544 if (on_session_messages_callback_.get()) {
497 on_session_messages_callback_->Run( 545 on_session_messages_callback_->Run(
498 mojo::Array<presentation::SessionMessagePtr>()); 546 mojo::Array<presentation::SessionMessagePtr>());
499 on_session_messages_callback_.reset(); 547 on_session_messages_callback_.reset();
500 } 548 }
549
501 if (send_message_callback_) { 550 if (send_message_callback_) {
502 // Run the callback with false, indicating the renderer to stop sending 551 // Run the callback with false, indicating the renderer to stop sending
503 // the requests and invalidate all pending requests. 552 // the requests and invalidate all pending requests.
504 send_message_callback_->Run(false); 553 send_message_callback_->Run(false);
505 send_message_callback_.reset(); 554 send_message_callback_.reset();
506 } 555 }
507 } 556 }
508 557
509 // static
510 void PresentationServiceImpl::InvokeNewSessionMojoCallbackWithError(
511 const NewSessionMojoCallback& callback) {
512 callback.Run(
513 presentation::PresentationSessionInfoPtr(),
514 presentation::PresentationError::From(
515 PresentationError(PRESENTATION_ERROR_UNKNOWN, "Internal error")));
516 }
517
518 void PresentationServiceImpl::OnDelegateDestroyed() { 558 void PresentationServiceImpl::OnDelegateDestroyed() {
519 DVLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed"; 559 DVLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed";
520 delegate_ = nullptr; 560 delegate_ = nullptr;
521 Reset(); 561 Reset();
522 } 562 }
523 563
524 void PresentationServiceImpl::OnDefaultPresentationStarted( 564 void PresentationServiceImpl::OnDefaultPresentationStarted(
525 const PresentationSessionInfo& session) { 565 const PresentationSessionInfo& session) {
526 if (default_session_start_context_.get()) 566 if (default_session_start_context_.get())
527 default_session_start_context_->set_session(session); 567 default_session_start_context_->set_session(session);
(...skipping 16 matching lines...) Expand all
544 std::string PresentationServiceImpl::ScreenAvailabilityListenerImpl 584 std::string PresentationServiceImpl::ScreenAvailabilityListenerImpl
545 ::GetPresentationUrl() const { 585 ::GetPresentationUrl() const {
546 return presentation_url_; 586 return presentation_url_;
547 } 587 }
548 588
549 void PresentationServiceImpl::ScreenAvailabilityListenerImpl 589 void PresentationServiceImpl::ScreenAvailabilityListenerImpl
550 ::OnScreenAvailabilityChanged(bool available) { 590 ::OnScreenAvailabilityChanged(bool available) {
551 service_->client_->OnScreenAvailabilityUpdated(available); 591 service_->client_->OnScreenAvailabilityUpdated(available);
552 } 592 }
553 593
594 PresentationServiceImpl::NewSessionMojoCallbackWrapper
595 ::NewSessionMojoCallbackWrapper(const NewSessionMojoCallback& callback)
596 : callback_(callback) {
597 }
598
599 PresentationServiceImpl::NewSessionMojoCallbackWrapper
600 ::~NewSessionMojoCallbackWrapper() {
601 if (!callback_.is_null())
602 InvokeNewSessionMojoCallbackWithError(callback_);
603 }
604
605 void PresentationServiceImpl::NewSessionMojoCallbackWrapper::Run(
606 presentation::PresentationSessionInfoPtr session,
607 presentation::PresentationErrorPtr error) {
608 DCHECK(!callback_.is_null());
609 callback_.Run(session.Pass(), error.Pass());
610 callback_.reset();
611 }
612
554 PresentationServiceImpl::StartSessionRequest::StartSessionRequest( 613 PresentationServiceImpl::StartSessionRequest::StartSessionRequest(
555 const std::string& presentation_url, 614 const std::string& presentation_url,
556 const std::string& presentation_id, 615 const std::string& presentation_id,
557 const NewSessionMojoCallback& callback) 616 const NewSessionMojoCallback& callback)
558 : presentation_url_(presentation_url), 617 : presentation_url_(presentation_url),
559 presentation_id_(presentation_id), 618 presentation_id_(presentation_id),
560 callback_(callback) { 619 callback_wrapper_(new NewSessionMojoCallbackWrapper(callback)) {
561 } 620 }
562 621
563 PresentationServiceImpl::StartSessionRequest::~StartSessionRequest() { 622 PresentationServiceImpl::StartSessionRequest::~StartSessionRequest() {
564 // Ensure that a pending callback is not dropped.
565 if (!callback_.is_null())
566 InvokeNewSessionMojoCallbackWithError(callback_);
567 } 623 }
568 624
569 PresentationServiceImpl::NewSessionMojoCallback 625 scoped_ptr<PresentationServiceImpl::NewSessionMojoCallbackWrapper>
570 PresentationServiceImpl::StartSessionRequest::PassCallback() { 626 PresentationServiceImpl::StartSessionRequest::PassCallback() {
571 NewSessionMojoCallback callback = callback_; 627 return callback_wrapper_.Pass();
572 callback_.reset();
573 return callback;
574 } 628 }
575 629
576 PresentationServiceImpl::DefaultSessionStartContext 630 PresentationServiceImpl::DefaultSessionStartContext
577 ::DefaultSessionStartContext() { 631 ::DefaultSessionStartContext() {
578 } 632 }
579 633
580 PresentationServiceImpl::DefaultSessionStartContext 634 PresentationServiceImpl::DefaultSessionStartContext
581 ::~DefaultSessionStartContext() { 635 ::~DefaultSessionStartContext() {
582 Reset(); 636 Reset();
583 } 637 }
(...skipping 25 matching lines...) Expand all
609 void PresentationServiceImpl::DefaultSessionStartContext::Reset() { 663 void PresentationServiceImpl::DefaultSessionStartContext::Reset() {
610 ScopedVector<DefaultSessionMojoCallback> callbacks; 664 ScopedVector<DefaultSessionMojoCallback> callbacks;
611 callbacks.swap(callbacks_); 665 callbacks.swap(callbacks_);
612 for (const auto& callback : callbacks) 666 for (const auto& callback : callbacks)
613 callback->Run(presentation::PresentationSessionInfoPtr()); 667 callback->Run(presentation::PresentationSessionInfoPtr());
614 session_.reset(); 668 session_.reset();
615 } 669 }
616 670
617 } // namespace content 671 } // namespace content
618 672
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698