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.
5 #include "mojo/examples/pepper_container_app/plugin_instance.h"
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"
23 PluginInstance::PluginInstance(scoped_refptr<PluginModule> plugin_module)
25 plugin_module_(plugin_module) {
26 pp_instance_ = MojoPpapiGlobals::Get()->AddInstance(this);
29 PluginInstance::~PluginInstance() {
30 MojoPpapiGlobals::Get()->InstanceDeleted(pp_instance_);
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);
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());
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;
58 ppapi::ScopedPPResource resource(ppapi::ScopedPPResource::PassRef(),
59 (new ppapi::PPB_View_Shared(
60 ppapi::OBJECT_IS_IMPL, pp_instance(), view_data))->GetReference());
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);
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());
79 bool PluginInstance::IsBoundGraphics(PP_Resource device) const {
80 return device != 0 && device == bound_graphics_.get();
83 PP_Bool PluginInstance::BindGraphics(PP_Instance instance, PP_Resource device) {
84 if (bound_graphics_.get() == device)
87 ppapi::thunk::EnterResourceNoLock<ppapi::thunk::PPB_Graphics3D_API>
92 bound_graphics_ = device;
93 static_cast<Graphics3DResource*>(enter.object())->BindGraphics();
98 PP_Bool PluginInstance::IsFullFrame(PP_Instance instance) {
103 const ppapi::ViewData* PluginInstance::GetViewData(PP_Instance instance) {
108 PP_Bool PluginInstance::FlashIsFullscreen(PP_Instance instance) {
113 PP_Var PluginInstance::GetWindowObject(PP_Instance instance) {
115 return PP_MakeUndefined();
118 PP_Var PluginInstance::GetOwnerElementObject(PP_Instance instance) {
120 return PP_MakeUndefined();
123 PP_Var PluginInstance::ExecuteScript(PP_Instance instance,
127 return PP_MakeUndefined();
130 uint32_t PluginInstance::GetAudioHardwareOutputSampleRate(
131 PP_Instance instance) {
136 uint32_t PluginInstance::GetAudioHardwareOutputBufferSize(
137 PP_Instance instance) {
142 PP_Var PluginInstance::GetDefaultCharSet(PP_Instance instance) {
144 return PP_MakeUndefined();
147 void PluginInstance::Log(PP_Instance instance,
148 PP_LogLevel log_level,
153 void PluginInstance::LogWithSource(PP_Instance instance,
154 PP_LogLevel log_level,
160 void PluginInstance::SetPluginToHandleFindRequests(PP_Instance instance) {
164 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance,
166 PP_Bool final_result) {
170 void PluginInstance::SelectedFindResultChanged(PP_Instance instance,
175 void PluginInstance::SetTickmarks(PP_Instance instance,
176 const PP_Rect* tickmarks,
181 PP_Bool PluginInstance::IsFullscreen(PP_Instance instance) {
186 PP_Bool PluginInstance::SetFullscreen(PP_Instance instance,
187 PP_Bool fullscreen) {
192 PP_Bool PluginInstance::GetScreenSize(PP_Instance instance, PP_Size* size) {
197 ppapi::Resource* PluginInstance::GetSingletonResource(
198 PP_Instance instance,
199 ppapi::SingletonResourceID id) {
204 int32_t PluginInstance::RequestInputEvents(PP_Instance instance,
205 uint32_t event_classes) {
207 return PP_ERROR_FAILED;
210 int32_t PluginInstance::RequestFilteringInputEvents(PP_Instance instance,
211 uint32_t event_classes) {
213 return PP_ERROR_FAILED;
216 void PluginInstance::ClearInputEventRequest(PP_Instance instance,
217 uint32_t event_classes) {
221 void PluginInstance::StartTrackingLatency(PP_Instance instance) {
225 void PluginInstance::PostMessage(PP_Instance instance, PP_Var message) {
229 int32_t PluginInstance::RegisterMessageHandler(
230 PP_Instance instance,
232 const PPP_MessageHandler_0_2* handler,
233 PP_Resource message_loop) {
235 return PP_ERROR_FAILED;
238 // TODO(dmichael): Remove this. crbug.com/414398
239 int32_t PluginInstance::RegisterMessageHandler_1_1_Deprecated(
240 PP_Instance instance,
242 const PPP_MessageHandler_0_1_Deprecated* handler,
243 PP_Resource message_loop) {
245 return PP_ERROR_FAILED;
248 void PluginInstance::UnregisterMessageHandler(PP_Instance instance) {
252 PP_Bool PluginInstance::SetCursor(PP_Instance instance,
253 PP_MouseCursor_Type type,
255 const PP_Point* hot_spot) {
260 int32_t PluginInstance::LockMouse(
261 PP_Instance instance,
262 scoped_refptr<ppapi::TrackedCallback> callback) {
264 return PP_ERROR_FAILED;
267 void PluginInstance::UnlockMouse(PP_Instance instance) {
271 void PluginInstance::SetTextInputType(PP_Instance instance,
272 PP_TextInput_Type type) {
276 void PluginInstance::UpdateCaretPosition(PP_Instance instance,
277 const PP_Rect& caret,
278 const PP_Rect& bounding_box) {
282 void PluginInstance::CancelCompositionText(PP_Instance instance) {
286 void PluginInstance::SelectionChanged(PP_Instance instance) {
290 void PluginInstance::UpdateSurroundingText(PP_Instance instance,
297 void PluginInstance::ZoomChanged(PP_Instance instance, double factor) {
301 void PluginInstance::ZoomLimitsChanged(PP_Instance instance,
302 double minimum_factor,
303 double maximum_factor) {
307 PP_Var PluginInstance::GetDocumentURL(PP_Instance instance,
308 PP_URLComponents_Dev* components) {
310 return PP_MakeUndefined();
313 void PluginInstance::PromiseResolved(PP_Instance instance, uint32 promise_id) {
317 void PluginInstance::PromiseResolvedWithSession(PP_Instance instance,
319 PP_Var web_session_id_var) {
323 void PluginInstance::PromiseResolvedWithKeyIds(PP_Instance instance,
325 PP_Var key_ids_var) {
329 void PluginInstance::PromiseRejected(PP_Instance instance,
331 PP_CdmExceptionCode exception_code,
333 PP_Var error_description_var) {
337 void PluginInstance::SessionMessage(PP_Instance instance,
338 PP_Var web_session_id_var,
340 PP_Var destination_url_var) {
344 void PluginInstance::SessionKeysChange(PP_Instance instance,
345 PP_Var web_session_id_var,
346 PP_Bool has_additional_usable_key) {
350 void PluginInstance::SessionExpirationChange(PP_Instance instance,
351 PP_Var web_session_id_var,
352 PP_Time new_expiry_time) {
356 void PluginInstance::SessionReady(PP_Instance instance,
357 PP_Var web_session_id_var) {
361 void PluginInstance::SessionClosed(PP_Instance instance,
362 PP_Var web_session_id_var) {
366 void PluginInstance::SessionError(PP_Instance instance,
367 PP_Var web_session_id_var,
368 PP_CdmExceptionCode exception_code,
370 PP_Var error_description_var) {
374 void PluginInstance::DeliverBlock(PP_Instance instance,
375 PP_Resource decrypted_block,
376 const PP_DecryptedBlockInfo* block_info) {
380 void PluginInstance::DecoderInitializeDone(PP_Instance instance,
381 PP_DecryptorStreamType decoder_type,
387 void PluginInstance::DecoderDeinitializeDone(
388 PP_Instance instance,
389 PP_DecryptorStreamType decoder_type,
390 uint32_t request_id) {
394 void PluginInstance::DecoderResetDone(PP_Instance instance,
395 PP_DecryptorStreamType decoder_type,
396 uint32_t request_id) {
400 void PluginInstance::DeliverFrame(PP_Instance instance,
401 PP_Resource decrypted_frame,
402 const PP_DecryptedFrameInfo* frame_info) {
406 void PluginInstance::DeliverSamples(PP_Instance instance,
407 PP_Resource audio_frames,
408 const PP_DecryptedSampleInfo* sample_info) {
412 PP_Var PluginInstance::ResolveRelativeToDocument(
413 PP_Instance instance,
415 PP_URLComponents_Dev* components) {
417 return PP_MakeUndefined();
420 PP_Bool PluginInstance::DocumentCanRequest(PP_Instance instance, PP_Var url) {
425 PP_Bool PluginInstance::DocumentCanAccessDocument(PP_Instance instance,
426 PP_Instance target) {
431 PP_Var PluginInstance::GetPluginInstanceURL(PP_Instance instance,
432 PP_URLComponents_Dev* components) {
434 return PP_MakeUndefined();
437 PP_Var PluginInstance::GetPluginReferrerURL(PP_Instance instance,
438 PP_URLComponents_Dev* components) {
440 return PP_MakeUndefined();
443 } // namespace examples