| Index: mojo/public/cpp/bindings/thread_safe_interface_ptr.h
 | 
| diff --git a/mojo/public/cpp/bindings/thread_safe_interface_ptr.h b/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
 | 
| index 8f0e139ff97e0313001351ae0e3f051828f3238b..d1fc9c4f9e3ae286c7d6beab2a8e7cd22ea9b4e9 100644
 | 
| --- a/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
 | 
| +++ b/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
 | 
| @@ -2,8 +2,8 @@
 | 
|  // Use of this source code is governed by a BSD-style license that can be
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
| -#ifndef MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_BASE_H_
 | 
| -#define MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_BASE_H_
 | 
| +#ifndef MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
 | 
| +#define MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
 | 
|  
 | 
|  #include <memory>
 | 
|  
 | 
| @@ -20,7 +20,7 @@ namespace mojo {
 | 
|  struct ThreadSafeInterfacePtrDeleter;
 | 
|  
 | 
|  // ThreadSafeInterfacePtr and ThreadSafeAssociatedInterfacePtr are versions of
 | 
| -// InterfacePtr and AssociatedInterfacePtr that let caller invoke
 | 
| +// InterfacePtr and AssociatedInterfacePtr that let callers invoke
 | 
|  // interface methods from any threads. Callbacks are received on the thread that
 | 
|  // performed the interface call.
 | 
|  //
 | 
| @@ -36,6 +36,11 @@ struct ThreadSafeInterfacePtrDeleter;
 | 
|  // scoped_refptr<frob::ThreadSafeFrobinatorPtr> thread_safe_frobinator =
 | 
|  //     frob::ThreadSafeFrobinatorPtr::Create(std::move(frobinator));
 | 
|  // (*thread_safe_frobinator)->FrobinateToTheMax();
 | 
| +//
 | 
| +// An alternate way is to create the ThreadSafeInterfacePtr unbound (not
 | 
| +// associated with an InterfacePtr) and call Bind() at a later time when the
 | 
| +// InterfacePtr becomes available. Note that you shouldn't call any interface
 | 
| +// methods on the ThreadSafeInterfacePtr before it is bound.
 | 
|  
 | 
|  template <typename Interface, template <typename> class InterfacePtrType>
 | 
|  class ThreadSafeInterfacePtrBase
 | 
| @@ -48,13 +53,30 @@ class ThreadSafeInterfacePtrBase
 | 
|  
 | 
|    static scoped_refptr<ThreadSafeInterfacePtrBase<Interface, InterfacePtrType>>
 | 
|    Create(InterfacePtrType<Interface> interface_ptr) {
 | 
| +    scoped_refptr<ThreadSafeInterfacePtrBase> ptr(
 | 
| +        new ThreadSafeInterfacePtrBase());
 | 
| +    return ptr->Bind(std::move(interface_ptr)) ? ptr : nullptr;
 | 
| +  }
 | 
| +
 | 
| +  // Creates a ThreadSafeInterfacePtrBase with no associated InterfacePtr.
 | 
| +  // Call Bind() with the InterfacePtr once available.
 | 
| +  static scoped_refptr<ThreadSafeInterfacePtrBase<Interface, InterfacePtrType>>
 | 
| +  CreateUnbound() {
 | 
| +    return new ThreadSafeInterfacePtrBase();
 | 
| +  }
 | 
| +
 | 
| +  // Binds a ThreadSafeInterfacePtrBase previously created with CreateUnbound().
 | 
| +  // This must be called on the thread that |interface_ptr| should be used.
 | 
| +  bool Bind(InterfacePtrType<Interface> interface_ptr) {
 | 
| +    DCHECK(!interface_ptr_task_runner_);
 | 
|      if (!interface_ptr.is_bound()) {
 | 
| -      LOG(ERROR) << "Attempting to create a ThreadSafe[Associated]InterfacePtr "
 | 
| -          "from an unbound InterfacePtr.";
 | 
| -      return nullptr;
 | 
| +      LOG(ERROR) << "Attempting to bind a ThreadSafe[Associated]InterfacePtr "
 | 
| +                    "from an unbound InterfacePtr.";
 | 
| +      return false;
 | 
|      }
 | 
| -    return new ThreadSafeInterfacePtrBase(std::move(interface_ptr),
 | 
| -                                          base::ThreadTaskRunnerHandle::Get());
 | 
| +    interface_ptr_ = std::move(interface_ptr);
 | 
| +    interface_ptr_task_runner_ = base::ThreadTaskRunnerHandle::Get();
 | 
| +    return true;
 | 
|    }
 | 
|  
 | 
|    ~ThreadSafeInterfacePtrBase() override {}
 | 
| @@ -63,22 +85,16 @@ class ThreadSafeInterfacePtrBase
 | 
|    Interface* operator->() { return get(); }
 | 
|    Interface& operator*() { return *get(); }
 | 
|  
 | 
| - protected:
 | 
| -  ThreadSafeInterfacePtrBase(
 | 
| -      InterfacePtrType<Interface> interface_ptr,
 | 
| -      scoped_refptr<base::SingleThreadTaskRunner> task_runner)
 | 
| -      : interface_ptr_task_runner_(task_runner),
 | 
| -        proxy_(this),
 | 
| -        interface_ptr_(std::move(interface_ptr)),
 | 
| -        weak_ptr_factory_(this) {}
 | 
| -
 | 
|   private:
 | 
|    friend class base::RefCountedThreadSafe<
 | 
|        ThreadSafeInterfacePtrBase<Interface, InterfacePtrType>>;
 | 
|    friend struct ThreadSafeInterfacePtrDeleter;
 | 
|  
 | 
| +  ThreadSafeInterfacePtrBase() : proxy_(this), weak_ptr_factory_(this) {}
 | 
| +
 | 
|    void DeleteOnCorrectThread() const {
 | 
| -    if (!interface_ptr_task_runner_->BelongsToCurrentThread() &&
 | 
| +    if (interface_ptr_task_runner_ &&
 | 
| +        !interface_ptr_task_runner_->BelongsToCurrentThread() &&
 | 
|          interface_ptr_task_runner_->DeleteSoon(FROM_HERE, this)) {
 | 
|        return;
 | 
|      }
 | 
| @@ -172,4 +188,4 @@ using ThreadSafeInterfacePtr =
 | 
|  
 | 
|  }  // namespace mojo
 | 
|  
 | 
| -#endif  // MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_BASE_H_
 | 
| +#endif  // MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
 | 
| 
 |