1// Copyright 2014 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 "base/message_loop/message_loop.h"
6#include "base/threading/thread.h"
7#include "mojo/application/application_runner_chromium.h"
8#include "mojo/public/c/system/main.h"
9#include "mojo/public/cpp/application/application_connection.h"
10#include "mojo/public/cpp/application/application_delegate.h"
11#include "mojo/public/cpp/application/application_impl.h"
12#include "mojo/public/cpp/application/interface_factory_impl.h"
13#include "mojo/services/html_viewer/blink_platform_impl.h"
14#include "mojo/services/html_viewer/html_document_view.h"
15#include "mojo/services/html_viewer/webmediaplayer_factory.h"
16#include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h"
17#include "third_party/WebKit/public/web/WebKit.h"
18
19#if !defined(COMPONENT_BUILD)
20#include "base/i18n/icu_util.h"
21#include "base/path_service.h"
22#include "ui/base/resource/resource_bundle.h"
23#include "ui/base/ui_base_paths.h"
24#endif
25
26namespace mojo {
27
28class HTMLViewer;
29
30class ContentHandlerImpl : public InterfaceImpl<ContentHandler> {
31 public:
32  ContentHandlerImpl(Shell* shell,
33                     scoped_refptr<base::MessageLoopProxy> compositor_thread,
34                     WebMediaPlayerFactory* web_media_player_factory)
35      : shell_(shell),
36        compositor_thread_(compositor_thread),
37        web_media_player_factory_(web_media_player_factory) {}
38  virtual ~ContentHandlerImpl() {}
39
40 private:
41  // Overridden from ContentHandler:
42  virtual void OnConnect(
43      const mojo::String& url,
44      URLResponsePtr response,
45      InterfaceRequest<ServiceProvider> service_provider_request) OVERRIDE {
46    new HTMLDocumentView(response.Pass(),
47                         service_provider_request.Pass(),
48                         shell_,
49                         compositor_thread_,
50                         web_media_player_factory_);
51  }
52
53  Shell* shell_;
54  scoped_refptr<base::MessageLoopProxy> compositor_thread_;
55  WebMediaPlayerFactory* web_media_player_factory_;
56
57  DISALLOW_COPY_AND_ASSIGN(ContentHandlerImpl);
58};
59
60class HTMLViewer : public ApplicationDelegate,
61                   public InterfaceFactory<ContentHandler> {
62 public:
63  HTMLViewer() : compositor_thread_("compositor thread") {}
64
65  virtual ~HTMLViewer() { blink::shutdown(); }
66
67 private:
68  // Overridden from ApplicationDelegate:
69  virtual void Initialize(ApplicationImpl* app) OVERRIDE {
70    shell_ = app->shell();
71    blink_platform_impl_.reset(new BlinkPlatformImpl(app));
72    blink::initialize(blink_platform_impl_.get());
73#if !defined(COMPONENT_BUILD)
74  base::i18n::InitializeICU();
75
76  ui::RegisterPathProvider();
77
78  base::FilePath ui_test_pak_path;
79  CHECK(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path));
80  ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
81#endif
82
83    compositor_thread_.Start();
84    web_media_player_factory_.reset(new WebMediaPlayerFactory(
85        compositor_thread_.message_loop_proxy()));
86  }
87
88  virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
89      OVERRIDE {
90    connection->AddService(this);
91    return true;
92  }
93
94  // Overridden from InterfaceFactory<ContentHandler>
95  virtual void Create(ApplicationConnection* connection,
96                      InterfaceRequest<ContentHandler> request) OVERRIDE {
97    BindToRequest(
98        new ContentHandlerImpl(shell_, compositor_thread_.message_loop_proxy(),
99                               web_media_player_factory_.get()),
100        &request);
101  }
102
103  scoped_ptr<BlinkPlatformImpl> blink_platform_impl_;
104  Shell* shell_;
105  base::Thread compositor_thread_;
106  scoped_ptr<WebMediaPlayerFactory> web_media_player_factory_;
107
108  DISALLOW_COPY_AND_ASSIGN(HTMLViewer);
109};
110
111}  // namespace mojo
112
113MojoResult MojoMain(MojoHandle shell_handle) {
114  mojo::ApplicationRunnerChromium runner(new mojo::HTMLViewer);
115  return runner.Run(shell_handle);
116}
117