1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/macros.h" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/ref_counted.h" 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/message_loop/message_loop.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "build/build_config.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/application/application_runner_chromium.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/mojo_ppapi_globals.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/plugin_instance.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/plugin_module.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/type_converters.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/c/system/main.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_delegate.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/system/core.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/public/interfaces/geometry/geometry.mojom.h" 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/services/public/interfaces/gpu/gpu.mojom.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/interfaces/native_viewport/native_viewport.mojom.h" 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/c/pp_rect.h" 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/shared_impl/proxy_lock.h" 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace mojo { 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace examples { 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass PepperContainerApp: public ApplicationDelegate, 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public NativeViewportClient, 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public MojoPpapiGlobals::Delegate { 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit PepperContainerApp() 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : ppapi_globals_(this), 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_module_(new PluginModule) {} 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~PepperContainerApp() {} 370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch app->ConnectToService("mojo:mojo_native_viewport_service", &viewport_); 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) viewport_.set_client(this); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // TODO(jamesr): Should be mojo:mojo_gpu_service 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) app->ConnectToService("mojo:mojo_native_viewport_service", &gpu_service_); 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SizePtr size(Size::New()); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size->width = 800; 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size->height = 600; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci viewport_->Create(size.Pass()); 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch viewport_->Show(); 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // NativeViewportClient implementation. 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void OnCreated(uint64_t native_viewport_id) OVERRIDE { 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) native_viewport_id_ = native_viewport_id; 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ppapi::ProxyAutoLock lock; 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch plugin_instance_ = plugin_module_->CreateInstance().Pass(); 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!plugin_instance_->DidCreate()) 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch plugin_instance_.reset(); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void OnDestroyed() OVERRIDE { 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ppapi::ProxyAutoLock lock; 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (plugin_instance_) { 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch plugin_instance_->DidDestroy(); 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch plugin_instance_.reset(); 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::MessageLoop::current()->Quit(); 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnBoundsChanged(SizePtr bounds) OVERRIDE { 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ppapi::ProxyAutoLock lock; 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (plugin_instance_) 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_instance_->DidChangeView(bounds.To<PP_Rect>()); 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnEvent(EventPtr event, 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const mojo::Callback<void()>& callback) OVERRIDE { 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!event->location_data.is_null()) { 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ppapi::ProxyAutoLock lock; 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO(yzshen): Handle events. 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch callback.Run(); 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // MojoPpapiGlobals::Delegate implementation. 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual ScopedMessagePipeHandle CreateGLES2Context() OVERRIDE { 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CommandBufferPtr command_buffer; 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SizePtr size = Size::New(); 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) size->width = 800; 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) size->width = 600; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(jamesr): Output a surface to the native viewport instead. 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gpu_service_->CreateOnscreenGLES2Context( 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) native_viewport_id_, size.Pass(), Get(&command_buffer)); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return command_buffer.PassMessagePipe(); 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MojoPpapiGlobals ppapi_globals_; 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint64_t native_viewport_id_; 1060de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) NativeViewportPtr viewport_; 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GpuPtr gpu_service_; 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<PluginModule> plugin_module_; 109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<PluginInstance> plugin_instance_; 110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DISALLOW_COPY_AND_ASSIGN(PepperContainerApp); 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace examples 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace mojo 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)MojoResult MojoMain(MojoHandle shell_handle) { 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) mojo::ApplicationRunnerChromium runner( 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new mojo::examples::PepperContainerApp); 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return runner.Run(shell_handle); 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 123