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