| Index: mojo/shell/out_of_process_native_runner.cc
 | 
| diff --git a/mojo/shell/out_of_process_native_runner.cc b/mojo/shell/out_of_process_native_runner.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..4c87271c059c943f4f859f07a2e82bf1c93b9f1d
 | 
| --- /dev/null
 | 
| +++ b/mojo/shell/out_of_process_native_runner.cc
 | 
| @@ -0,0 +1,72 @@
 | 
| +// Copyright 2014 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 "mojo/shell/out_of_process_native_runner.h"
 | 
| +
 | 
| +#include "base/bind.h"
 | 
| +#include "base/callback_helpers.h"
 | 
| +#include "base/files/file_util.h"
 | 
| +#include "base/logging.h"
 | 
| +#include "mojo/shell/app_child_process.mojom.h"
 | 
| +#include "mojo/shell/app_child_process_host.h"
 | 
| +#include "mojo/shell/in_process_native_runner.h"
 | 
| +
 | 
| +namespace mojo {
 | 
| +namespace shell {
 | 
| +
 | 
| +OutOfProcessNativeRunner::OutOfProcessNativeRunner(Context* context)
 | 
| +    : context_(context) {
 | 
| +}
 | 
| +
 | 
| +OutOfProcessNativeRunner::~OutOfProcessNativeRunner() {
 | 
| +  if (app_child_process_host_) {
 | 
| +    // TODO(vtl): Race condition: If |AppChildProcessHost::DidStart()| hasn't
 | 
| +    // been called yet, we shouldn't call |Join()| here. (Until |DidStart()|, we
 | 
| +    // may not have a child process to wait on.) Probably we should fix
 | 
| +    // |Join()|.
 | 
| +    app_child_process_host_->Join();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void OutOfProcessNativeRunner::Start(
 | 
| +    const base::FilePath& app_path,
 | 
| +    NativeApplicationCleanup cleanup,
 | 
| +    InterfaceRequest<Application> application_request,
 | 
| +    const base::Closure& app_completed_callback) {
 | 
| +  app_path_ = app_path;
 | 
| +
 | 
| +  DCHECK(app_completed_callback_.is_null());
 | 
| +  app_completed_callback_ = app_completed_callback;
 | 
| +
 | 
| +  app_child_process_host_.reset(new AppChildProcessHost(context_));
 | 
| +  app_child_process_host_->Start();
 | 
| +
 | 
| +  // TODO(vtl): |app_path.AsUTF8Unsafe()| is unsafe.
 | 
| +  app_child_process_host_->StartApp(
 | 
| +      app_path.AsUTF8Unsafe(), cleanup == NativeApplicationCleanup::DELETE,
 | 
| +      application_request.Pass(),
 | 
| +      base::Bind(&OutOfProcessNativeRunner::AppCompleted,
 | 
| +                 base::Unretained(this)));
 | 
| +}
 | 
| +
 | 
| +void OutOfProcessNativeRunner::AppCompleted(int32_t result) {
 | 
| +  DVLOG(2) << "OutOfProcessNativeRunner::AppCompleted(" << result << ")";
 | 
| +
 | 
| +  app_child_process_host_.reset();
 | 
| +  // This object may be deleted by this callback.
 | 
| +  base::Closure app_completed_callback = app_completed_callback_;
 | 
| +  app_completed_callback_.Reset();
 | 
| +  app_completed_callback.Run();
 | 
| +}
 | 
| +
 | 
| +scoped_ptr<NativeRunner> OutOfProcessNativeRunnerFactory::Create(
 | 
| +    const Options& options) {
 | 
| +  if (options.force_in_process)
 | 
| +    return make_scoped_ptr(new InProcessNativeRunner(context_));
 | 
| +
 | 
| +  return make_scoped_ptr(new OutOfProcessNativeRunner(context_));
 | 
| +}
 | 
| +
 | 
| +}  // namespace shell
 | 
| +}  // namespace mojo
 | 
| 
 |