context.cc revision 0de6073388f4e2780db8536178b129cd8f6ab386
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "mojo/shell/context.h"
6
7#include "build/build_config.h"
8#include "base/command_line.h"
9#include "base/lazy_instance.h"
10#include "base/memory/scoped_vector.h"
11#include "mojo/embedder/embedder.h"
12#include "mojo/gles2/gles2_support_impl.h"
13#include "mojo/public/cpp/shell/application.h"
14#include "mojo/service_manager/background_service_loader.h"
15#include "mojo/service_manager/service_loader.h"
16#include "mojo/service_manager/service_manager.h"
17#include "mojo/services/native_viewport/native_viewport_service.h"
18#include "mojo/shell/dynamic_service_loader.h"
19#include "mojo/shell/in_process_dynamic_service_runner.h"
20#include "mojo/shell/network_delegate.h"
21#include "mojo/shell/out_of_process_dynamic_service_runner.h"
22#include "mojo/shell/switches.h"
23#include "mojo/spy/spy.h"
24
25#if defined(OS_LINUX)
26#include "mojo/shell/dbus_service_loader_linux.h"
27#endif  // defined(OS_LINUX)
28
29#if defined(USE_AURA)
30#include "mojo/shell/view_manager_loader.h"
31#endif
32
33namespace mojo {
34namespace shell {
35namespace {
36
37// Used to ensure we only init once.
38class Setup {
39 public:
40  Setup() {
41    embedder::Init();
42    gles2::GLES2SupportImpl::Init();
43  }
44
45  ~Setup() {
46  }
47
48 private:
49  DISALLOW_COPY_AND_ASSIGN(Setup);
50};
51
52static base::LazyInstance<Setup> setup = LAZY_INSTANCE_INITIALIZER;
53
54}  // namespace
55
56class Context::NativeViewportServiceLoader : public ServiceLoader {
57 public:
58  explicit NativeViewportServiceLoader(Context* context) : context_(context) {}
59  virtual ~NativeViewportServiceLoader() {}
60
61 private:
62  virtual void LoadService(ServiceManager* manager,
63                           const GURL& url,
64                           ScopedMessagePipeHandle service_handle) OVERRIDE {
65    app_.reset(::CreateNativeViewportService(context_, service_handle.Pass()));
66  }
67
68  virtual void OnServiceError(ServiceManager* manager,
69                              const GURL& url) OVERRIDE {
70  }
71
72  Context* context_;
73  scoped_ptr<Application> app_;
74  DISALLOW_COPY_AND_ASSIGN(NativeViewportServiceLoader);
75};
76
77Context::Context()
78    : task_runners_(base::MessageLoop::current()->message_loop_proxy()),
79      storage_(),
80      loader_(task_runners_.io_runner(),
81              task_runners_.file_runner(),
82              task_runners_.cache_runner(),
83              scoped_ptr<net::NetworkDelegate>(new NetworkDelegate()),
84              storage_.profile_path()) {
85  setup.Get();
86  CommandLine* cmdline = CommandLine::ForCurrentProcess();
87  scoped_ptr<DynamicServiceRunnerFactory> runner_factory;
88  if (cmdline->HasSwitch(switches::kEnableMultiprocess))
89    runner_factory.reset(new OutOfProcessDynamicServiceRunnerFactory());
90  else
91    runner_factory.reset(new InProcessDynamicServiceRunnerFactory());
92
93  service_manager_.set_default_loader(
94      scoped_ptr<ServiceLoader>(
95          new DynamicServiceLoader(this, runner_factory.Pass())));
96  // The native viewport service synchronously waits for certain messages. If we
97  // don't run it on its own thread we can easily deadlock. Long term native
98  // viewport should run its own process so that this isn't an issue.
99  service_manager_.SetLoaderForURL(
100      scoped_ptr<ServiceLoader>(
101          new BackgroundServiceLoader(
102              scoped_ptr<ServiceLoader>(new NativeViewportServiceLoader(this)),
103              "native_viewport")),
104      GURL("mojo:mojo_native_viewport_service"));
105#if defined(USE_AURA)
106  // TODO(sky): need a better way to find this. It shouldn't be linked in.
107  service_manager_.SetLoaderForURL(
108      scoped_ptr<ServiceLoader>(new ViewManagerLoader()),
109      GURL("mojo:mojo_view_manager"));
110#endif
111
112#if defined(OS_LINUX)
113  service_manager_.SetLoaderForScheme(
114      scoped_ptr<ServiceLoader>(new DBusServiceLoader(this)),
115      "dbus");
116#endif  // defined(OS_LINUX)
117
118  if (cmdline->HasSwitch(switches::kSpy)) {
119    spy_.reset(new mojo::Spy(&service_manager_,
120                             cmdline->GetSwitchValueASCII(switches::kSpy)));
121  }
122}
123
124Context::~Context() {
125  // mojo_view_manager uses native_viewport. Destroy mojo_view_manager first so
126  // that there aren't shutdown ordering issues. Once native viewport service is
127  // moved into its own process this can likely be nuked.
128#if defined(USE_AURA)
129  service_manager_.SetLoaderForURL(
130      scoped_ptr<ServiceLoader>(),
131      GURL("mojo:mojo_view_manager"));
132#endif
133  service_manager_.set_default_loader(scoped_ptr<ServiceLoader>());
134}
135
136}  // namespace shell
137}  // namespace mojo
138