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