context.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe// Copyright 2013 The Chromium Authors. All rights reserved.
2969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe// Use of this source code is governed by a BSD-style license that can be
3969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe// found in the LICENSE file.
4969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
5969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/context.h"
6969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
7969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "build/build_config.h"
8969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "base/command_line.h"
9969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "base/lazy_instance.h"
10969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "base/memory/scoped_vector.h"
11969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/embedder/embedder.h"
12969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/gles2/gles2_support_impl.h"
13969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/public/cpp/shell/application.h"
14969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/service_manager/service_loader.h"
15969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/service_manager/service_manager.h"
16969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/services/native_viewport/native_viewport_service.h"
17969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/dynamic_service_loader.h"
18969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/in_process_dynamic_service_runner.h"
19969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/network_delegate.h"
20969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/out_of_process_dynamic_service_runner.h"
21969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/switches.h"
22969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/spy/spy.h"
23969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
24969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#if defined(OS_LINUX)
25969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/shell/dbus_service_loader_linux.h"
26969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#endif  // defined(OS_LINUX)
27969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
28969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#if defined(USE_AURA)
29969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/services/view_manager/root_node_manager.h"
30969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#include "mojo/services/view_manager/view_manager_connection.h"
31969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#endif
32969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
33969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboenamespace mojo {
34969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboenamespace shell {
35969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboenamespace {
36969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
37969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe// Used to ensure we only init once.
38969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboeclass Setup {
39969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe public:
40969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe  Setup() {
41969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe    embedder::Init();
42969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe    gles2::GLES2SupportImpl::Init();
43969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe  }
44969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
45969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe  ~Setup() {
4625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe  }
47969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
483095ffa9747a679e4f655388c782e4b201047fd3Jens Axboe private:
49969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe  DISALLOW_COPY_AND_ASSIGN(Setup);
50969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe};
51969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
523095ffa9747a679e4f655388c782e4b201047fd3Jens Axboestatic base::LazyInstance<Setup> setup = LAZY_INSTANCE_INITIALIZER;
53969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
54969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe#if defined(USE_AURA)
55class ViewManagerLoader : public ServiceLoader {
56 public:
57  ViewManagerLoader() {}
58  virtual ~ViewManagerLoader() {}
59
60 private:
61  virtual void LoadService(ServiceManager* manager,
62                           const GURL& url,
63                           ScopedShellHandle shell_handle) OVERRIDE {
64    scoped_ptr<Application> app(new Application(shell_handle.Pass()));
65    app->AddServiceConnector(
66        new ServiceConnector<services::view_manager::ViewManagerConnection,
67                             services::view_manager::RootNodeManager>(
68                                 &root_node_manager_));
69    apps_.push_back(app.release());
70  }
71
72  virtual void OnServiceError(ServiceManager* manager,
73                              const GURL& url) OVERRIDE {
74  }
75
76  services::view_manager::RootNodeManager root_node_manager_;
77  ScopedVector<Application> apps_;
78
79  DISALLOW_COPY_AND_ASSIGN(ViewManagerLoader);
80};
81#endif
82
83}  // namespace
84
85class Context::NativeViewportServiceLoader : public ServiceLoader {
86 public:
87  explicit NativeViewportServiceLoader(Context* context) : context_(context) {}
88  virtual ~NativeViewportServiceLoader() {}
89
90 private:
91  virtual void LoadService(ServiceManager* manager,
92                           const GURL& url,
93                           ScopedShellHandle service_handle) OVERRIDE {
94    app_.reset(::CreateNativeViewportService(context_, service_handle.Pass()));
95  }
96
97  virtual void OnServiceError(ServiceManager* manager,
98                              const GURL& url) OVERRIDE {
99  }
100
101  Context* context_;
102  scoped_ptr<Application> app_;
103  DISALLOW_COPY_AND_ASSIGN(NativeViewportServiceLoader);
104};
105
106Context::Context()
107    : task_runners_(base::MessageLoop::current()->message_loop_proxy()),
108      storage_(),
109      loader_(task_runners_.io_runner(),
110              task_runners_.file_runner(),
111              task_runners_.cache_runner(),
112              scoped_ptr<net::NetworkDelegate>(new NetworkDelegate()),
113              storage_.profile_path()) {
114  setup.Get();
115  CommandLine* cmdline = CommandLine::ForCurrentProcess();
116  scoped_ptr<DynamicServiceRunnerFactory> runner_factory;
117  if (cmdline->HasSwitch(switches::kEnableMultiprocess))
118    runner_factory.reset(new OutOfProcessDynamicServiceRunnerFactory());
119  else
120    runner_factory.reset(new InProcessDynamicServiceRunnerFactory());
121
122  service_manager_.set_default_loader(
123      scoped_ptr<ServiceLoader>(
124          new DynamicServiceLoader(this, runner_factory.Pass())));
125  service_manager_.SetLoaderForURL(
126      scoped_ptr<ServiceLoader>(new NativeViewportServiceLoader(this)),
127      GURL("mojo:mojo_native_viewport_service"));
128#if defined(USE_AURA)
129  // TODO(sky): need a better way to find this. It shouldn't be linked in.
130  service_manager_.SetLoaderForURL(
131      scoped_ptr<ServiceLoader>(new ViewManagerLoader()),
132      GURL("mojo:mojo_view_manager"));
133#endif
134
135#if defined(OS_LINUX)
136  service_manager_.SetLoaderForScheme(
137      scoped_ptr<ServiceLoader>(new DBusServiceLoader(this)),
138      "dbus");
139#endif  // defined(OS_LINUX)
140
141  if (cmdline->HasSwitch(switches::kSpy)) {
142    spy_.reset(new mojo::Spy(&service_manager_,
143                             cmdline->GetSwitchValueASCII(switches::kSpy)));
144  }
145}
146
147Context::~Context() {
148  service_manager_.set_default_loader(scoped_ptr<ServiceLoader>());
149}
150
151}  // namespace shell
152}  // namespace mojo
153