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
20 namespace mojo {
21 namespace examples {
22
PluginInstance(scoped_refptr<PluginModule> plugin_module)23 PluginInstance::PluginInstance(scoped_refptr<PluginModule> plugin_module)
24 : pp_instance_(0),
25 plugin_module_(plugin_module) {
26 pp_instance_ = MojoPpapiGlobals::Get()->AddInstance(this);
27 }
28
~PluginInstance()29 PluginInstance::~PluginInstance() {
30 MojoPpapiGlobals::Get()->InstanceDeleted(pp_instance_);
31 }
32
DidCreate()33 bool 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
DidDestroy()41 void 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
DidChangeView(const PP_Rect & bounds)49 void 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
Graphics3DContextLost()70 void 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
IsBoundGraphics(PP_Resource device) const79 bool PluginInstance::IsBoundGraphics(PP_Resource device) const {
80 return device != 0 && device == bound_graphics_.get();
81 }
82
BindGraphics(PP_Instance instance,PP_Resource device)83 PP_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
IsFullFrame(PP_Instance instance)98 PP_Bool PluginInstance::IsFullFrame(PP_Instance instance) {
99 NOTIMPLEMENTED();
100 return PP_FALSE;
101 }
102
GetViewData(PP_Instance instance)103 const ppapi::ViewData* PluginInstance::GetViewData(PP_Instance instance) {
104 NOTIMPLEMENTED();
105 return NULL;
106 }
107
FlashIsFullscreen(PP_Instance instance)108 PP_Bool PluginInstance::FlashIsFullscreen(PP_Instance instance) {
109 NOTIMPLEMENTED();
110 return PP_FALSE;
111 }
112
GetWindowObject(PP_Instance instance)113 PP_Var PluginInstance::GetWindowObject(PP_Instance instance) {
114 NOTIMPLEMENTED();
115 return PP_MakeUndefined();
116 }
117
GetOwnerElementObject(PP_Instance instance)118 PP_Var PluginInstance::GetOwnerElementObject(PP_Instance instance) {
119 NOTIMPLEMENTED();
120 return PP_MakeUndefined();
121 }
122
ExecuteScript(PP_Instance instance,PP_Var script,PP_Var * exception)123 PP_Var PluginInstance::ExecuteScript(PP_Instance instance,
124 PP_Var script,
125 PP_Var* exception) {
126 NOTIMPLEMENTED();
127 return PP_MakeUndefined();
128 }
129
GetAudioHardwareOutputSampleRate(PP_Instance instance)130 uint32_t PluginInstance::GetAudioHardwareOutputSampleRate(
131 PP_Instance instance) {
132 NOTIMPLEMENTED();
133 return 0;
134 }
135
GetAudioHardwareOutputBufferSize(PP_Instance instance)136 uint32_t PluginInstance::GetAudioHardwareOutputBufferSize(
137 PP_Instance instance) {
138 NOTIMPLEMENTED();
139 return 0;
140 }
141
GetDefaultCharSet(PP_Instance instance)142 PP_Var PluginInstance::GetDefaultCharSet(PP_Instance instance) {
143 NOTIMPLEMENTED();
144 return PP_MakeUndefined();
145 }
146
Log(PP_Instance instance,PP_LogLevel log_level,PP_Var value)147 void PluginInstance::Log(PP_Instance instance,
148 PP_LogLevel log_level,
149 PP_Var value) {
150 NOTIMPLEMENTED();
151 }
152
LogWithSource(PP_Instance instance,PP_LogLevel log_level,PP_Var source,PP_Var value)153 void PluginInstance::LogWithSource(PP_Instance instance,
154 PP_LogLevel log_level,
155 PP_Var source,
156 PP_Var value) {
157 NOTIMPLEMENTED();
158 }
159
SetPluginToHandleFindRequests(PP_Instance instance)160 void PluginInstance::SetPluginToHandleFindRequests(PP_Instance instance) {
161 NOTIMPLEMENTED();
162 }
163
NumberOfFindResultsChanged(PP_Instance instance,int32_t total,PP_Bool final_result)164 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance,
165 int32_t total,
166 PP_Bool final_result) {
167 NOTIMPLEMENTED();
168 }
169
SelectedFindResultChanged(PP_Instance instance,int32_t index)170 void PluginInstance::SelectedFindResultChanged(PP_Instance instance,
171 int32_t index) {
172 NOTIMPLEMENTED();
173 }
174
SetTickmarks(PP_Instance instance,const PP_Rect * tickmarks,uint32_t count)175 void PluginInstance::SetTickmarks(PP_Instance instance,
176 const PP_Rect* tickmarks,
177 uint32_t count) {
178 NOTIMPLEMENTED();
179 }
180
IsFullscreen(PP_Instance instance)181 PP_Bool PluginInstance::IsFullscreen(PP_Instance instance) {
182 NOTIMPLEMENTED();
183 return PP_FALSE;
184 }
185
SetFullscreen(PP_Instance instance,PP_Bool fullscreen)186 PP_Bool PluginInstance::SetFullscreen(PP_Instance instance,
187 PP_Bool fullscreen) {
188 NOTIMPLEMENTED();
189 return PP_FALSE;
190 }
191
GetScreenSize(PP_Instance instance,PP_Size * size)192 PP_Bool PluginInstance::GetScreenSize(PP_Instance instance, PP_Size* size) {
193 NOTIMPLEMENTED();
194 return PP_FALSE;
195 }
196
GetSingletonResource(PP_Instance instance,ppapi::SingletonResourceID id)197 ppapi::Resource* PluginInstance::GetSingletonResource(
198 PP_Instance instance,
199 ppapi::SingletonResourceID id) {
200 NOTIMPLEMENTED();
201 return NULL;
202 }
203
RequestInputEvents(PP_Instance instance,uint32_t event_classes)204 int32_t PluginInstance::RequestInputEvents(PP_Instance instance,
205 uint32_t event_classes) {
206 NOTIMPLEMENTED();
207 return PP_ERROR_FAILED;
208 }
209
RequestFilteringInputEvents(PP_Instance instance,uint32_t event_classes)210 int32_t PluginInstance::RequestFilteringInputEvents(PP_Instance instance,
211 uint32_t event_classes) {
212 NOTIMPLEMENTED();
213 return PP_ERROR_FAILED;
214 }
215
ClearInputEventRequest(PP_Instance instance,uint32_t event_classes)216 void PluginInstance::ClearInputEventRequest(PP_Instance instance,
217 uint32_t event_classes) {
218 NOTIMPLEMENTED();
219 }
220
StartTrackingLatency(PP_Instance instance)221 void PluginInstance::StartTrackingLatency(PP_Instance instance) {
222 NOTIMPLEMENTED();
223 }
224
PostMessage(PP_Instance instance,PP_Var message)225 void PluginInstance::PostMessage(PP_Instance instance, PP_Var message) {
226 NOTIMPLEMENTED();
227 }
228
RegisterMessageHandler(PP_Instance instance,void * user_data,const PPP_MessageHandler_0_1 * handler,PP_Resource message_loop)229 int32_t PluginInstance::RegisterMessageHandler(
230 PP_Instance instance,
231 void* user_data,
232 const PPP_MessageHandler_0_1* handler,
233 PP_Resource message_loop) {
234 NOTIMPLEMENTED();
235 return PP_ERROR_FAILED;
236 }
237
UnregisterMessageHandler(PP_Instance instance)238 void PluginInstance::UnregisterMessageHandler(PP_Instance instance) {
239 NOTIMPLEMENTED();
240 }
241
SetCursor(PP_Instance instance,PP_MouseCursor_Type type,PP_Resource image,const PP_Point * hot_spot)242 PP_Bool PluginInstance::SetCursor(PP_Instance instance,
243 PP_MouseCursor_Type type,
244 PP_Resource image,
245 const PP_Point* hot_spot) {
246 NOTIMPLEMENTED();
247 return PP_FALSE;
248 }
249
LockMouse(PP_Instance instance,scoped_refptr<ppapi::TrackedCallback> callback)250 int32_t PluginInstance::LockMouse(
251 PP_Instance instance,
252 scoped_refptr<ppapi::TrackedCallback> callback) {
253 NOTIMPLEMENTED();
254 return PP_ERROR_FAILED;
255 }
256
UnlockMouse(PP_Instance instance)257 void PluginInstance::UnlockMouse(PP_Instance instance) {
258 NOTIMPLEMENTED();
259 }
260
SetTextInputType(PP_Instance instance,PP_TextInput_Type type)261 void PluginInstance::SetTextInputType(PP_Instance instance,
262 PP_TextInput_Type type) {
263 NOTIMPLEMENTED();
264 }
265
UpdateCaretPosition(PP_Instance instance,const PP_Rect & caret,const PP_Rect & bounding_box)266 void PluginInstance::UpdateCaretPosition(PP_Instance instance,
267 const PP_Rect& caret,
268 const PP_Rect& bounding_box) {
269 NOTIMPLEMENTED();
270 }
271
CancelCompositionText(PP_Instance instance)272 void PluginInstance::CancelCompositionText(PP_Instance instance) {
273 NOTIMPLEMENTED();
274 }
275
SelectionChanged(PP_Instance instance)276 void PluginInstance::SelectionChanged(PP_Instance instance) {
277 NOTIMPLEMENTED();
278 }
279
UpdateSurroundingText(PP_Instance instance,const char * text,uint32_t caret,uint32_t anchor)280 void PluginInstance::UpdateSurroundingText(PP_Instance instance,
281 const char* text,
282 uint32_t caret,
283 uint32_t anchor) {
284 NOTIMPLEMENTED();
285 }
286
ZoomChanged(PP_Instance instance,double factor)287 void PluginInstance::ZoomChanged(PP_Instance instance, double factor) {
288 NOTIMPLEMENTED();
289 }
290
ZoomLimitsChanged(PP_Instance instance,double minimum_factor,double maximum_factor)291 void PluginInstance::ZoomLimitsChanged(PP_Instance instance,
292 double minimum_factor,
293 double maximum_factor) {
294 NOTIMPLEMENTED();
295 }
296
GetDocumentURL(PP_Instance instance,PP_URLComponents_Dev * components)297 PP_Var PluginInstance::GetDocumentURL(PP_Instance instance,
298 PP_URLComponents_Dev* components) {
299 NOTIMPLEMENTED();
300 return PP_MakeUndefined();
301 }
302
PromiseResolved(PP_Instance instance,uint32 promise_id)303 void PluginInstance::PromiseResolved(PP_Instance instance, uint32 promise_id) {
304 NOTIMPLEMENTED();
305 }
306
PromiseResolvedWithSession(PP_Instance instance,uint32 promise_id,PP_Var web_session_id_var)307 void PluginInstance::PromiseResolvedWithSession(PP_Instance instance,
308 uint32 promise_id,
309 PP_Var web_session_id_var) {
310 NOTIMPLEMENTED();
311 }
312
PromiseRejected(PP_Instance instance,uint32 promise_id,PP_CdmExceptionCode exception_code,uint32 system_code,PP_Var error_description_var)313 void PluginInstance::PromiseRejected(PP_Instance instance,
314 uint32 promise_id,
315 PP_CdmExceptionCode exception_code,
316 uint32 system_code,
317 PP_Var error_description_var) {
318 NOTIMPLEMENTED();
319 }
320
SessionMessage(PP_Instance instance,PP_Var web_session_id_var,PP_Var message_var,PP_Var destination_url_var)321 void PluginInstance::SessionMessage(PP_Instance instance,
322 PP_Var web_session_id_var,
323 PP_Var message_var,
324 PP_Var destination_url_var) {
325 NOTIMPLEMENTED();
326 }
327
SessionReady(PP_Instance instance,PP_Var web_session_id_var)328 void PluginInstance::SessionReady(PP_Instance instance,
329 PP_Var web_session_id_var) {
330 NOTIMPLEMENTED();
331 }
332
SessionClosed(PP_Instance instance,PP_Var web_session_id_var)333 void PluginInstance::SessionClosed(PP_Instance instance,
334 PP_Var web_session_id_var) {
335 NOTIMPLEMENTED();
336 }
337
SessionError(PP_Instance instance,PP_Var web_session_id_var,PP_CdmExceptionCode exception_code,uint32 system_code,PP_Var error_description_var)338 void PluginInstance::SessionError(PP_Instance instance,
339 PP_Var web_session_id_var,
340 PP_CdmExceptionCode exception_code,
341 uint32 system_code,
342 PP_Var error_description_var) {
343 NOTIMPLEMENTED();
344 }
345
DeliverBlock(PP_Instance instance,PP_Resource decrypted_block,const PP_DecryptedBlockInfo * block_info)346 void PluginInstance::DeliverBlock(PP_Instance instance,
347 PP_Resource decrypted_block,
348 const PP_DecryptedBlockInfo* block_info) {
349 NOTIMPLEMENTED();
350 }
351
DecoderInitializeDone(PP_Instance instance,PP_DecryptorStreamType decoder_type,uint32_t request_id,PP_Bool success)352 void PluginInstance::DecoderInitializeDone(PP_Instance instance,
353 PP_DecryptorStreamType decoder_type,
354 uint32_t request_id,
355 PP_Bool success) {
356 NOTIMPLEMENTED();
357 }
358
DecoderDeinitializeDone(PP_Instance instance,PP_DecryptorStreamType decoder_type,uint32_t request_id)359 void PluginInstance::DecoderDeinitializeDone(
360 PP_Instance instance,
361 PP_DecryptorStreamType decoder_type,
362 uint32_t request_id) {
363 NOTIMPLEMENTED();
364 }
365
DecoderResetDone(PP_Instance instance,PP_DecryptorStreamType decoder_type,uint32_t request_id)366 void PluginInstance::DecoderResetDone(PP_Instance instance,
367 PP_DecryptorStreamType decoder_type,
368 uint32_t request_id) {
369 NOTIMPLEMENTED();
370 }
371
DeliverFrame(PP_Instance instance,PP_Resource decrypted_frame,const PP_DecryptedFrameInfo * frame_info)372 void PluginInstance::DeliverFrame(PP_Instance instance,
373 PP_Resource decrypted_frame,
374 const PP_DecryptedFrameInfo* frame_info) {
375 NOTIMPLEMENTED();
376 }
377
DeliverSamples(PP_Instance instance,PP_Resource audio_frames,const PP_DecryptedSampleInfo * sample_info)378 void PluginInstance::DeliverSamples(PP_Instance instance,
379 PP_Resource audio_frames,
380 const PP_DecryptedSampleInfo* sample_info) {
381 NOTIMPLEMENTED();
382 }
383
ResolveRelativeToDocument(PP_Instance instance,PP_Var relative,PP_URLComponents_Dev * components)384 PP_Var PluginInstance::ResolveRelativeToDocument(
385 PP_Instance instance,
386 PP_Var relative,
387 PP_URLComponents_Dev* components) {
388 NOTIMPLEMENTED();
389 return PP_MakeUndefined();
390 }
391
DocumentCanRequest(PP_Instance instance,PP_Var url)392 PP_Bool PluginInstance::DocumentCanRequest(PP_Instance instance, PP_Var url) {
393 NOTIMPLEMENTED();
394 return PP_FALSE;
395 }
396
DocumentCanAccessDocument(PP_Instance instance,PP_Instance target)397 PP_Bool PluginInstance::DocumentCanAccessDocument(PP_Instance instance,
398 PP_Instance target) {
399 NOTIMPLEMENTED();
400 return PP_FALSE;
401 }
402
GetPluginInstanceURL(PP_Instance instance,PP_URLComponents_Dev * components)403 PP_Var PluginInstance::GetPluginInstanceURL(PP_Instance instance,
404 PP_URLComponents_Dev* components) {
405 NOTIMPLEMENTED();
406 return PP_MakeUndefined();
407 }
408
GetPluginReferrerURL(PP_Instance instance,PP_URLComponents_Dev * components)409 PP_Var PluginInstance::GetPluginReferrerURL(PP_Instance instance,
410 PP_URLComponents_Dev* components) {
411 NOTIMPLEMENTED();
412 return PP_MakeUndefined();
413 }
414
415 } // namespace examples
416 } // namespace mojo
417