1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/thread.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/application/application_runner_chromium.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/c/system/main.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_delegate.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/interface_factory_impl.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/html_viewer/blink_platform_impl.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/html_viewer/html_document_view.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/html_viewer/webmediaplayer_factory.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h"
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(COMPONENT_BUILD)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/i18n/icu_util.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/path_service.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/resource/resource_bundle.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/ui_base_paths.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo {
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class HTMLViewer;
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ContentHandlerImpl : public InterfaceImpl<ContentHandler> {
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ContentHandlerImpl(Shell* shell,
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     scoped_refptr<base::MessageLoopProxy> compositor_thread,
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     WebMediaPlayerFactory* web_media_player_factory)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : shell_(shell),
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        compositor_thread_(compositor_thread),
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        web_media_player_factory_(web_media_player_factory) {}
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ContentHandlerImpl() {}
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Overridden from ContentHandler:
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnConnect(
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const mojo::String& url,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      URLResponsePtr response,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      InterfaceRequest<ServiceProvider> service_provider_request) OVERRIDE {
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new HTMLDocumentView(response.Pass(),
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         service_provider_request.Pass(),
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         shell_,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         compositor_thread_,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         web_media_player_factory_);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shell* shell_;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<base::MessageLoopProxy> compositor_thread_;
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebMediaPlayerFactory* web_media_player_factory_;
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ContentHandlerImpl);
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass HTMLViewer : public ApplicationDelegate,
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   public InterfaceFactory<ContentHandler> {
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HTMLViewer() : compositor_thread_("compositor thread") {}
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~HTMLViewer() { blink::shutdown(); }
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from ApplicationDelegate:
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Initialize(ApplicationImpl* app) OVERRIDE {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    shell_ = app->shell();
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    blink_platform_impl_.reset(new BlinkPlatformImpl(app));
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    blink::initialize(blink_platform_impl_.get());
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(COMPONENT_BUILD)
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::i18n::InitializeICU();
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::RegisterPathProvider();
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath ui_test_pak_path;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path));
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    compositor_thread_.Start();
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    web_media_player_factory_.reset(new WebMediaPlayerFactory(
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        compositor_thread_.message_loop_proxy()));
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OVERRIDE {
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connection->AddService(this);
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Overridden from InterfaceFactory<ContentHandler>
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Create(ApplicationConnection* connection,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      InterfaceRequest<ContentHandler> request) OVERRIDE {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BindToRequest(
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ContentHandlerImpl(shell_, compositor_thread_.message_loop_proxy(),
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               web_media_player_factory_.get()),
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &request);
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<BlinkPlatformImpl> blink_platform_impl_;
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shell* shell_;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::Thread compositor_thread_;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WebMediaPlayerFactory> web_media_player_factory_;
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HTMLViewer);
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace mojo
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)MojoResult MojoMain(MojoHandle shell_handle) {
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mojo::ApplicationRunnerChromium runner(new mojo::HTMLViewer);
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return runner.Run(shell_handle);
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
117