| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "content/test/barrier_builder.h" | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/callback_helpers.h" | 
 |  | 
 | namespace content { | 
 |  | 
 | // The callbacks returned by |AddClosure| can get called after destruction of | 
 | // BarrierBuilder, so there needs to be an internal class to hold the final | 
 | // callback. | 
 | class BarrierBuilder::InternalBarrierBuilder | 
 |     : public base::RefCountedThreadSafe< | 
 |           BarrierBuilder::InternalBarrierBuilder> { | 
 |  public: | 
 |   InternalBarrierBuilder(base::OnceClosure done_closure) | 
 |       : done_runner_(std::move(done_closure)) {} | 
 |  | 
 |  private: | 
 |   friend class base::RefCountedThreadSafe< | 
 |       BarrierBuilder::InternalBarrierBuilder>; | 
 |  | 
 |   ~InternalBarrierBuilder() = default; | 
 |  | 
 |   base::ScopedClosureRunner done_runner_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(InternalBarrierBuilder); | 
 | }; | 
 |  | 
 | BarrierBuilder::BarrierBuilder(base::OnceClosure done_closure) | 
 |     : internal_barrier_( | 
 |           new BarrierBuilder::InternalBarrierBuilder(std::move(done_closure))) { | 
 | } | 
 |  | 
 | BarrierBuilder::~BarrierBuilder() = default; | 
 |  | 
 | base::OnceClosure BarrierBuilder::AddClosure() { | 
 |   return base::BindOnce( | 
 |       [](scoped_refptr<BarrierBuilder::InternalBarrierBuilder>) {}, | 
 |       internal_barrier_); | 
 | } | 
 |  | 
 | }  // namespace content |