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 "mojo/examples/pepper_container_app/mojo_ppapi_globals.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/message_loop/message_loop_proxy.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/time/time.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/plugin_instance.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/c/pp_errors.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/shared_impl/ppb_message_loop_shared.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace mojo {
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace examples {
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst PP_Instance kInstanceId = 1;
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A non-abstract subclass of ppapi::MessageLoopShared that represents the
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// message loop of the main thread.
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// TODO(yzshen): Build a more general ppapi::MessageLoopShared subclass to fully
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// support PPB_MessageLoop.
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MojoPpapiGlobals::MainThreadMessageLoopResource
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : public ppapi::MessageLoopShared {
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  explicit MainThreadMessageLoopResource(
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::MessageLoopProxy* main_thread_message_loop)
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      : MessageLoopShared(ForMainThread()),
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        main_thread_message_loop_(main_thread_message_loop) {}
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // ppapi::MessageLoopShared implementation.
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void PostClosure(const tracked_objects::Location& from_here,
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           const base::Closure& closure,
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           int64 delay_ms) OVERRIDE {
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    main_thread_message_loop_->PostDelayedTask(
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        from_here, closure, base::TimeDelta::FromMilliseconds(delay_ms));
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual base::MessageLoopProxy* GetMessageLoopProxy() OVERRIDE {
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return main_thread_message_loop_.get();
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool CurrentlyHandlingBlockingMessage() OVERRIDE {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // ppapi::thunk::PPB_MessageLoop_API implementation.
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual int32_t AttachToCurrentThread() OVERRIDE {
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NOTIMPLEMENTED();
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return PP_ERROR_FAILED;
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual int32_t Run() OVERRIDE {
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NOTIMPLEMENTED();
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return PP_ERROR_FAILED;
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual int32_t PostWork(PP_CompletionCallback callback,
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           int64_t delay_ms) OVERRIDE {
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NOTIMPLEMENTED();
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return PP_ERROR_FAILED;
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual int32_t PostQuit(PP_Bool should_destroy) OVERRIDE {
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NOTIMPLEMENTED();
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return PP_ERROR_FAILED;
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~MainThreadMessageLoopResource() {}
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<base::MessageLoopProxy> main_thread_message_loop_;
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MainThreadMessageLoopResource);
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
80effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochMojoPpapiGlobals::MojoPpapiGlobals(Delegate* delegate)
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : delegate_(delegate),
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      plugin_instance_(NULL),
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      resource_tracker_(ppapi::ResourceTracker::THREAD_SAFE) {}
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
85effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochMojoPpapiGlobals::~MojoPpapiGlobals() {}
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
87effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPP_Instance MojoPpapiGlobals::AddInstance(PluginInstance* instance) {
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(!plugin_instance_);
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  plugin_instance_ = instance;
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  resource_tracker_.DidCreateInstance(kInstanceId);
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return kInstanceId;
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MojoPpapiGlobals::InstanceDeleted(PP_Instance instance) {
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_EQ(instance, kInstanceId);
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(plugin_instance_);
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  resource_tracker_.DidDeleteInstance(instance);
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  plugin_instance_ = NULL;
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
101effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPluginInstance* MojoPpapiGlobals::GetInstance(PP_Instance instance) {
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (instance == kInstanceId)
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return plugin_instance_;
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
107effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochScopedMessagePipeHandle MojoPpapiGlobals::CreateGLES2Context() {
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return delegate_->CreateGLES2Context();
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochppapi::ResourceTracker* MojoPpapiGlobals::GetResourceTracker() {
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return &resource_tracker_;
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochppapi::VarTracker* MojoPpapiGlobals::GetVarTracker() {
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochppapi::CallbackTracker* MojoPpapiGlobals::GetCallbackTrackerForInstance(
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PP_Instance instance) {
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (instance == kInstanceId && plugin_instance_)
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return plugin_instance_->plugin_module()->callback_tracker();
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MojoPpapiGlobals::LogWithSource(PP_Instance instance,
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     PP_LogLevel level,
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     const std::string& source,
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     const std::string& value) {
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MojoPpapiGlobals::BroadcastLogWithSource(PP_Module module,
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              PP_LogLevel level,
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              const std::string& source,
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              const std::string& value) {
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochppapi::thunk::PPB_Instance_API* MojoPpapiGlobals::GetInstanceAPI(
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PP_Instance instance) {
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (instance == kInstanceId && plugin_instance_)
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return plugin_instance_;
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochppapi::thunk::ResourceCreationAPI* MojoPpapiGlobals::GetResourceCreationAPI(
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PP_Instance instance) {
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (instance == kInstanceId && plugin_instance_)
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return plugin_instance_->resource_creation();
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
155effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPP_Module MojoPpapiGlobals::GetModuleForInstance(PP_Instance instance) {
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return 0;
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochppapi::MessageLoopShared* MojoPpapiGlobals::GetCurrentMessageLoop() {
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (base::MessageLoopProxy::current().get() == GetMainThreadMessageLoop()) {
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!main_thread_message_loop_resource_.get()) {
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      main_thread_message_loop_resource_ = new MainThreadMessageLoopResource(
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          GetMainThreadMessageLoop());
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return main_thread_message_loop_resource_.get();
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::TaskRunner* MojoPpapiGlobals::GetFileTaskRunner() {
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstd::string MojoPpapiGlobals::GetCmdLine() {
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return std::string();
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MojoPpapiGlobals::PreCacheFontForFlash(const void* logfontw) {
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NOTIMPLEMENTED();
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace examples
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace mojo
189