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