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