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