context.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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 "base/command_line.h"
8#include "mojo/embedder/embedder.h"
9#include "mojo/gles2/gles2_support_impl.h"
10#include "mojo/service_manager/service_loader.h"
11#include "mojo/service_manager/service_manager.h"
12#include "mojo/services/native_viewport/native_viewport_service.h"
13#include "mojo/shell/dynamic_service_loader.h"
14#include "mojo/shell/in_process_dynamic_service_runner.h"
15#include "mojo/shell/network_delegate.h"
16#include "mojo/shell/out_of_process_dynamic_service_runner.h"
17#include "mojo/shell/switches.h"
18#include "mojo/spy/spy.h"
19
20namespace mojo {
21namespace shell {
22
23class Context::NativeViewportServiceLoader : public ServiceLoader {
24 public:
25  explicit NativeViewportServiceLoader(Context* context) : context_(context) {}
26  virtual ~NativeViewportServiceLoader() {}
27
28 private:
29  virtual void LoadService(ServiceManager* manager,
30                           const GURL& url,
31                           ScopedShellHandle service_handle) OVERRIDE {
32    app_.reset(::CreateNativeViewportService(context_, service_handle.Pass()));
33  }
34
35  virtual void OnServiceError(ServiceManager* manager,
36                              const GURL& url) OVERRIDE {
37  }
38
39  Context* context_;
40  scoped_ptr<Application> app_;
41  DISALLOW_COPY_AND_ASSIGN(NativeViewportServiceLoader);
42};
43
44Context::Context()
45    : task_runners_(base::MessageLoop::current()->message_loop_proxy()),
46      storage_(),
47      loader_(task_runners_.io_runner(),
48              task_runners_.file_runner(),
49              task_runners_.cache_runner(),
50              scoped_ptr<net::NetworkDelegate>(new NetworkDelegate()),
51              storage_.profile_path()) {
52  embedder::Init();
53  gles2::GLES2SupportImpl::Init();
54
55  CommandLine* cmdline = CommandLine::ForCurrentProcess();
56  scoped_ptr<DynamicServiceRunnerFactory> runner_factory;
57  if (cmdline->HasSwitch(switches::kEnableMultiprocess))
58    runner_factory.reset(new OutOfProcessDynamicServiceRunnerFactory());
59  else
60    runner_factory.reset(new InProcessDynamicServiceRunnerFactory());
61
62  dynamic_service_loader_.reset(
63      new DynamicServiceLoader(this, runner_factory.Pass()));
64  service_manager_.set_default_loader(dynamic_service_loader_.get());
65  native_viewport_service_loader_.reset(new NativeViewportServiceLoader(this));
66  service_manager_.SetLoaderForURL(native_viewport_service_loader_.get(),
67                                    GURL("mojo:mojo_native_viewport_service"));
68
69  if (cmdline->HasSwitch(switches::kSpy)) {
70    spy_.reset(new mojo::Spy(&service_manager_,
71                             cmdline->GetSwitchValueASCII(switches::kSpy)));
72  }
73}
74
75Context::~Context() {
76  service_manager_.set_default_loader(NULL);
77}
78
79}  // namespace shell
80}  // namespace mojo
81