context.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "mojo/shell/context.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "build/build_config.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/lazy_instance.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/scoped_vector.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "mojo/embedder/embedder.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "mojo/gles2/gles2_support_impl.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/public/cpp/application/application.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/service_manager/background_service_loader.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "mojo/service_manager/service_loader.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "mojo/service_manager/service_manager.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "mojo/services/native_viewport/native_viewport_service.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "mojo/shell/dynamic_service_loader.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/in_process_dynamic_service_runner.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/out_of_process_dynamic_service_runner.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "mojo/shell/switches.h"
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "mojo/spy/spy.h"
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_LINUX)
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/shell/dbus_service_loader_linux.h"
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // defined(OS_LINUX)
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(USE_AURA)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/shell/view_manager_loader.h"
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace mojo {
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace shell {
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// These mojo: URLs are loaded directly from the local filesystem. They
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// correspond to shared libraries bundled alongside the mojo_shell.
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char* kLocalMojoURLs[] = {
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  "mojo:mojo_network_service",
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Used to ensure we only init once.
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Setup {
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Setup() {
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    embedder::Init();
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    gles2::GLES2SupportImpl::Init();
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ~Setup() {
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(Setup);
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static base::LazyInstance<Setup>::Leaky setup = LAZY_INSTANCE_INITIALIZER;
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass Context::NativeViewportServiceLoader : public ServiceLoader {
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  explicit NativeViewportServiceLoader(Context* context) : context_(context) {}
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual ~NativeViewportServiceLoader() {}
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void LoadService(ServiceManager* manager,
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                           const GURL& url,
690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)                           ScopedMessagePipeHandle service_handle) OVERRIDE {
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    app_.reset(::CreateNativeViewportService(context_, service_handle.Pass()));
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void OnServiceError(ServiceManager* manager,
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                              const GURL& url) OVERRIDE {
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Context* context_;
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<Application> app_;
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NativeViewportServiceLoader);
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)Context::Context()
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : task_runners_(base::MessageLoop::current()->message_loop_proxy()) {
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  setup.Get();
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kLocalMojoURLs); ++i)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    mojo_url_resolver_.AddLocalFileMapping(GURL(kLocalMojoURLs[i]));
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<DynamicServiceRunnerFactory> runner_factory;
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (cmdline->HasSwitch(switches::kEnableMultiprocess))
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    runner_factory.reset(new OutOfProcessDynamicServiceRunnerFactory());
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  else
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    runner_factory.reset(new InProcessDynamicServiceRunnerFactory());
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  service_manager_.set_default_loader(
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      scoped_ptr<ServiceLoader>(
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          new DynamicServiceLoader(this, runner_factory.Pass())));
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The native viewport service synchronously waits for certain messages. If we
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // don't run it on its own thread we can easily deadlock. Long term native
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // viewport should run its own process so that this isn't an issue.
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  service_manager_.SetLoaderForURL(
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      scoped_ptr<ServiceLoader>(
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          new BackgroundServiceLoader(
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              scoped_ptr<ServiceLoader>(new NativeViewportServiceLoader(this)),
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              "native_viewport",
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              base::MessageLoop::TYPE_UI)),
1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GURL("mojo:mojo_native_viewport_service"));
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(USE_AURA)
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(sky): need a better way to find this. It shouldn't be linked in.
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  service_manager_.SetLoaderForURL(
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      scoped_ptr<ServiceLoader>(new ViewManagerLoader()),
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GURL("mojo:mojo_view_manager"));
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_LINUX)
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  service_manager_.SetLoaderForScheme(
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      scoped_ptr<ServiceLoader>(new DBusServiceLoader(this)),
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "dbus");
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // defined(OS_LINUX)
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (cmdline->HasSwitch(switches::kSpy)) {
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    spy_.reset(new mojo::Spy(&service_manager_,
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             cmdline->GetSwitchValueASCII(switches::kSpy)));
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)Context::~Context() {
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // mojo_view_manager uses native_viewport. Destroy mojo_view_manager first so
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // that there aren't shutdown ordering issues. Once native viewport service is
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // moved into its own process this can likely be nuked.
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_AURA)
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  service_manager_.SetLoaderForURL(
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      scoped_ptr<ServiceLoader>(),
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GURL("mojo:mojo_view_manager"));
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  service_manager_.set_default_loader(scoped_ptr<ServiceLoader>());
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace shell
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace mojo
142