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 "mojo/examples/pepper_container_app/plugin_instance.h"
6
7#include "base/logging.h"
8#include "mojo/examples/pepper_container_app/graphics_3d_resource.h"
9#include "mojo/examples/pepper_container_app/mojo_ppapi_globals.h"
10#include "ppapi/c/pp_errors.h"
11#include "ppapi/c/pp_var.h"
12#include "ppapi/c/ppp_graphics_3d.h"
13#include "ppapi/c/ppp_instance.h"
14#include "ppapi/shared_impl/ppb_view_shared.h"
15#include "ppapi/shared_impl/proxy_lock.h"
16#include "ppapi/shared_impl/tracked_callback.h"
17#include "ppapi/thunk/enter.h"
18#include "ppapi/thunk/ppb_graphics_3d_api.h"
19
20namespace mojo {
21namespace examples {
22
23PluginInstance::PluginInstance(scoped_refptr<PluginModule> plugin_module)
24    : pp_instance_(0),
25      plugin_module_(plugin_module) {
26  pp_instance_ = MojoPpapiGlobals::Get()->AddInstance(this);
27}
28
29PluginInstance::~PluginInstance() {
30  MojoPpapiGlobals::Get()->InstanceDeleted(pp_instance_);
31}
32
33bool PluginInstance::DidCreate() {
34  ppapi::ProxyAutoUnlock unlock;
35  const PPP_Instance_1_1* instance_interface =
36      static_cast<const PPP_Instance_1_1*>(plugin_module_->GetPluginInterface(
37          PPP_INSTANCE_INTERFACE_1_1));
38  return !!instance_interface->DidCreate(pp_instance(), 0, NULL, NULL);
39}
40
41void PluginInstance::DidDestroy() {
42  ppapi::ProxyAutoUnlock unlock;
43  const PPP_Instance_1_1* instance_interface =
44      static_cast<const PPP_Instance_1_1*>(plugin_module_->GetPluginInterface(
45          PPP_INSTANCE_INTERFACE_1_1));
46  instance_interface->DidDestroy(pp_instance());
47}
48
49void PluginInstance::DidChangeView(const PP_Rect& bounds) {
50  ppapi::ViewData view_data;
51  view_data.rect = bounds;
52  view_data.is_fullscreen = false;
53  view_data.is_page_visible = true;
54  view_data.clip_rect = bounds;
55  view_data.device_scale = 1.0f;
56  view_data.css_scale = 1.0f;
57
58  ppapi::ScopedPPResource resource(ppapi::ScopedPPResource::PassRef(),
59      (new ppapi::PPB_View_Shared(
60          ppapi::OBJECT_IS_IMPL, pp_instance(), view_data))->GetReference());
61  {
62    ppapi::ProxyAutoUnlock unlock;
63    const PPP_Instance_1_1* instance_interface =
64        static_cast<const PPP_Instance_1_1*>(plugin_module_->GetPluginInterface(
65            PPP_INSTANCE_INTERFACE_1_1));
66    instance_interface->DidChangeView(pp_instance(), resource);
67  }
68}
69
70void PluginInstance::Graphics3DContextLost() {
71  ppapi::ProxyAutoUnlock unlock;
72  const PPP_Graphics3D_1_0* graphic_3d_interface =
73      static_cast<const PPP_Graphics3D_1_0*>(plugin_module_->GetPluginInterface(
74          PPP_GRAPHICS_3D_INTERFACE_1_0));
75  // TODO(yzshen): Maybe we only need to notify for the bound graphics context?
76  graphic_3d_interface->Graphics3DContextLost(pp_instance());
77}
78
79bool PluginInstance::IsBoundGraphics(PP_Resource device) const {
80  return device != 0 && device == bound_graphics_.get();
81}
82
83PP_Bool PluginInstance::BindGraphics(PP_Instance instance, PP_Resource device) {
84  if (bound_graphics_.get() == device)
85    return PP_TRUE;
86
87  ppapi::thunk::EnterResourceNoLock<ppapi::thunk::PPB_Graphics3D_API>
88      enter(device, false);
89  if (enter.failed())
90    return PP_FALSE;
91
92  bound_graphics_ = device;
93  static_cast<Graphics3DResource*>(enter.object())->BindGraphics();
94
95  return PP_TRUE;
96}
97
98PP_Bool PluginInstance::IsFullFrame(PP_Instance instance) {
99  NOTIMPLEMENTED();
100  return PP_FALSE;
101}
102
103const ppapi::ViewData* PluginInstance::GetViewData(PP_Instance instance) {
104  NOTIMPLEMENTED();
105  return NULL;
106}
107
108PP_Bool PluginInstance::FlashIsFullscreen(PP_Instance instance) {
109  NOTIMPLEMENTED();
110  return PP_FALSE;
111}
112
113PP_Var PluginInstance::GetWindowObject(PP_Instance instance) {
114  NOTIMPLEMENTED();
115  return PP_MakeUndefined();
116}
117
118PP_Var PluginInstance::GetOwnerElementObject(PP_Instance instance) {
119  NOTIMPLEMENTED();
120  return PP_MakeUndefined();
121}
122
123PP_Var PluginInstance::ExecuteScript(PP_Instance instance,
124                                     PP_Var script,
125                                     PP_Var* exception) {
126  NOTIMPLEMENTED();
127  return PP_MakeUndefined();
128}
129
130uint32_t PluginInstance::GetAudioHardwareOutputSampleRate(
131    PP_Instance instance) {
132  NOTIMPLEMENTED();
133  return 0;
134}
135
136uint32_t PluginInstance::GetAudioHardwareOutputBufferSize(
137    PP_Instance instance) {
138  NOTIMPLEMENTED();
139  return 0;
140}
141
142PP_Var PluginInstance::GetDefaultCharSet(PP_Instance instance) {
143  NOTIMPLEMENTED();
144  return PP_MakeUndefined();
145}
146
147void PluginInstance::Log(PP_Instance instance,
148                         PP_LogLevel log_level,
149                         PP_Var value) {
150  NOTIMPLEMENTED();
151}
152
153void PluginInstance::LogWithSource(PP_Instance instance,
154                                   PP_LogLevel log_level,
155                                   PP_Var source,
156                                   PP_Var value) {
157  NOTIMPLEMENTED();
158}
159
160void PluginInstance::SetPluginToHandleFindRequests(PP_Instance instance) {
161  NOTIMPLEMENTED();
162}
163
164void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance,
165                                                int32_t total,
166                                                PP_Bool final_result) {
167  NOTIMPLEMENTED();
168}
169
170void PluginInstance::SelectedFindResultChanged(PP_Instance instance,
171                                               int32_t index) {
172  NOTIMPLEMENTED();
173}
174
175void PluginInstance::SetTickmarks(PP_Instance instance,
176                                  const PP_Rect* tickmarks,
177                                  uint32_t count) {
178  NOTIMPLEMENTED();
179}
180
181PP_Bool PluginInstance::IsFullscreen(PP_Instance instance) {
182  NOTIMPLEMENTED();
183  return PP_FALSE;
184}
185
186PP_Bool PluginInstance::SetFullscreen(PP_Instance instance,
187                                      PP_Bool fullscreen) {
188  NOTIMPLEMENTED();
189  return PP_FALSE;
190}
191
192PP_Bool PluginInstance::GetScreenSize(PP_Instance instance, PP_Size* size) {
193  NOTIMPLEMENTED();
194  return PP_FALSE;
195}
196
197ppapi::Resource* PluginInstance::GetSingletonResource(
198    PP_Instance instance,
199    ppapi::SingletonResourceID id) {
200  NOTIMPLEMENTED();
201  return NULL;
202}
203
204int32_t PluginInstance::RequestInputEvents(PP_Instance instance,
205                                           uint32_t event_classes) {
206  NOTIMPLEMENTED();
207  return PP_ERROR_FAILED;
208}
209
210int32_t PluginInstance::RequestFilteringInputEvents(PP_Instance instance,
211                                                    uint32_t event_classes) {
212  NOTIMPLEMENTED();
213  return PP_ERROR_FAILED;
214}
215
216void PluginInstance::ClearInputEventRequest(PP_Instance instance,
217                                            uint32_t event_classes) {
218  NOTIMPLEMENTED();
219}
220
221void PluginInstance::StartTrackingLatency(PP_Instance instance) {
222  NOTIMPLEMENTED();
223}
224
225void PluginInstance::PostMessage(PP_Instance instance, PP_Var message) {
226  NOTIMPLEMENTED();
227}
228
229int32_t PluginInstance::RegisterMessageHandler(
230    PP_Instance instance,
231    void* user_data,
232    const PPP_MessageHandler_0_2* handler,
233    PP_Resource message_loop) {
234  NOTIMPLEMENTED();
235  return PP_ERROR_FAILED;
236}
237
238// TODO(dmichael): Remove this. crbug.com/414398
239int32_t PluginInstance::RegisterMessageHandler_1_1_Deprecated(
240    PP_Instance instance,
241    void* user_data,
242    const PPP_MessageHandler_0_1_Deprecated* handler,
243    PP_Resource message_loop) {
244  NOTIMPLEMENTED();
245  return PP_ERROR_FAILED;
246}
247
248void PluginInstance::UnregisterMessageHandler(PP_Instance instance) {
249  NOTIMPLEMENTED();
250}
251
252PP_Bool PluginInstance::SetCursor(PP_Instance instance,
253                                  PP_MouseCursor_Type type,
254                                  PP_Resource image,
255                                  const PP_Point* hot_spot) {
256  NOTIMPLEMENTED();
257  return PP_FALSE;
258}
259
260int32_t PluginInstance::LockMouse(
261    PP_Instance instance,
262    scoped_refptr<ppapi::TrackedCallback> callback) {
263  NOTIMPLEMENTED();
264  return PP_ERROR_FAILED;
265}
266
267void PluginInstance::UnlockMouse(PP_Instance instance) {
268  NOTIMPLEMENTED();
269}
270
271void PluginInstance::SetTextInputType(PP_Instance instance,
272                                      PP_TextInput_Type type) {
273  NOTIMPLEMENTED();
274}
275
276void PluginInstance::UpdateCaretPosition(PP_Instance instance,
277                                         const PP_Rect& caret,
278                                         const PP_Rect& bounding_box) {
279  NOTIMPLEMENTED();
280}
281
282void PluginInstance::CancelCompositionText(PP_Instance instance) {
283  NOTIMPLEMENTED();
284}
285
286void PluginInstance::SelectionChanged(PP_Instance instance) {
287  NOTIMPLEMENTED();
288}
289
290void PluginInstance::UpdateSurroundingText(PP_Instance instance,
291                                           const char* text,
292                                           uint32_t caret,
293                                           uint32_t anchor) {
294  NOTIMPLEMENTED();
295}
296
297void PluginInstance::ZoomChanged(PP_Instance instance, double factor) {
298  NOTIMPLEMENTED();
299}
300
301void PluginInstance::ZoomLimitsChanged(PP_Instance instance,
302                                       double minimum_factor,
303                                       double maximum_factor) {
304  NOTIMPLEMENTED();
305}
306
307PP_Var PluginInstance::GetDocumentURL(PP_Instance instance,
308                                      PP_URLComponents_Dev* components) {
309  NOTIMPLEMENTED();
310  return PP_MakeUndefined();
311}
312
313void PluginInstance::PromiseResolved(PP_Instance instance, uint32 promise_id) {
314  NOTIMPLEMENTED();
315}
316
317void PluginInstance::PromiseResolvedWithSession(PP_Instance instance,
318                                                uint32 promise_id,
319                                                PP_Var web_session_id_var) {
320  NOTIMPLEMENTED();
321}
322
323void PluginInstance::PromiseResolvedWithKeyIds(PP_Instance instance,
324                                               uint32 promise_id,
325                                               PP_Var key_ids_var) {
326  NOTIMPLEMENTED();
327}
328
329void PluginInstance::PromiseRejected(PP_Instance instance,
330                                     uint32 promise_id,
331                                     PP_CdmExceptionCode exception_code,
332                                     uint32 system_code,
333                                     PP_Var error_description_var) {
334  NOTIMPLEMENTED();
335}
336
337void PluginInstance::SessionMessage(PP_Instance instance,
338                                    PP_Var web_session_id_var,
339                                    PP_Var message_var,
340                                    PP_Var destination_url_var) {
341  NOTIMPLEMENTED();
342}
343
344void PluginInstance::SessionKeysChange(PP_Instance instance,
345                                       PP_Var web_session_id_var,
346                                       PP_Bool has_additional_usable_key) {
347  NOTIMPLEMENTED();
348}
349
350void PluginInstance::SessionExpirationChange(PP_Instance instance,
351                                             PP_Var web_session_id_var,
352                                             PP_Time new_expiry_time) {
353  NOTIMPLEMENTED();
354}
355
356void PluginInstance::SessionReady(PP_Instance instance,
357                                  PP_Var web_session_id_var) {
358  NOTIMPLEMENTED();
359}
360
361void PluginInstance::SessionClosed(PP_Instance instance,
362                                   PP_Var web_session_id_var) {
363  NOTIMPLEMENTED();
364}
365
366void PluginInstance::SessionError(PP_Instance instance,
367                                  PP_Var web_session_id_var,
368                                  PP_CdmExceptionCode exception_code,
369                                  uint32 system_code,
370                                  PP_Var error_description_var) {
371  NOTIMPLEMENTED();
372}
373
374void PluginInstance::DeliverBlock(PP_Instance instance,
375                                  PP_Resource decrypted_block,
376                                  const PP_DecryptedBlockInfo* block_info) {
377  NOTIMPLEMENTED();
378}
379
380void PluginInstance::DecoderInitializeDone(PP_Instance instance,
381                                           PP_DecryptorStreamType decoder_type,
382                                           uint32_t request_id,
383                                           PP_Bool success) {
384  NOTIMPLEMENTED();
385}
386
387void PluginInstance::DecoderDeinitializeDone(
388    PP_Instance instance,
389    PP_DecryptorStreamType decoder_type,
390    uint32_t request_id) {
391  NOTIMPLEMENTED();
392}
393
394void PluginInstance::DecoderResetDone(PP_Instance instance,
395                                      PP_DecryptorStreamType decoder_type,
396                                      uint32_t request_id) {
397  NOTIMPLEMENTED();
398}
399
400void PluginInstance::DeliverFrame(PP_Instance instance,
401                                  PP_Resource decrypted_frame,
402                                  const PP_DecryptedFrameInfo* frame_info) {
403  NOTIMPLEMENTED();
404}
405
406void PluginInstance::DeliverSamples(PP_Instance instance,
407                                    PP_Resource audio_frames,
408                                    const PP_DecryptedSampleInfo* sample_info) {
409  NOTIMPLEMENTED();
410}
411
412PP_Var PluginInstance::ResolveRelativeToDocument(
413    PP_Instance instance,
414    PP_Var relative,
415    PP_URLComponents_Dev* components) {
416  NOTIMPLEMENTED();
417  return PP_MakeUndefined();
418}
419
420PP_Bool PluginInstance::DocumentCanRequest(PP_Instance instance, PP_Var url) {
421  NOTIMPLEMENTED();
422  return PP_FALSE;
423}
424
425PP_Bool PluginInstance::DocumentCanAccessDocument(PP_Instance instance,
426                                                  PP_Instance target) {
427  NOTIMPLEMENTED();
428  return PP_FALSE;
429}
430
431PP_Var PluginInstance::GetPluginInstanceURL(PP_Instance instance,
432                                            PP_URLComponents_Dev* components) {
433  NOTIMPLEMENTED();
434  return PP_MakeUndefined();
435}
436
437PP_Var PluginInstance::GetPluginReferrerURL(PP_Instance instance,
438                                            PP_URLComponents_Dev* components) {
439  NOTIMPLEMENTED();
440  return PP_MakeUndefined();
441}
442
443}  // namespace examples
444}  // namespace mojo
445