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 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 29 PluginInstance::~PluginInstance() { 30 MojoPpapiGlobals::Get()->InstanceDeleted(pp_instance_); 31 } 32 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 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 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 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 79 bool PluginInstance::IsBoundGraphics(PP_Resource device) const { 80 return device != 0 && device == bound_graphics_.get(); 81 } 82 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 98 PP_Bool PluginInstance::IsFullFrame(PP_Instance instance) { 99 NOTIMPLEMENTED(); 100 return PP_FALSE; 101 } 102 103 const ppapi::ViewData* PluginInstance::GetViewData(PP_Instance instance) { 104 NOTIMPLEMENTED(); 105 return NULL; 106 } 107 108 PP_Bool PluginInstance::FlashIsFullscreen(PP_Instance instance) { 109 NOTIMPLEMENTED(); 110 return PP_FALSE; 111 } 112 113 PP_Var PluginInstance::GetWindowObject(PP_Instance instance) { 114 NOTIMPLEMENTED(); 115 return PP_MakeUndefined(); 116 } 117 118 PP_Var PluginInstance::GetOwnerElementObject(PP_Instance instance) { 119 NOTIMPLEMENTED(); 120 return PP_MakeUndefined(); 121 } 122 123 PP_Var PluginInstance::ExecuteScript(PP_Instance instance, 124 PP_Var script, 125 PP_Var* exception) { 126 NOTIMPLEMENTED(); 127 return PP_MakeUndefined(); 128 } 129 130 uint32_t PluginInstance::GetAudioHardwareOutputSampleRate( 131 PP_Instance instance) { 132 NOTIMPLEMENTED(); 133 return 0; 134 } 135 136 uint32_t PluginInstance::GetAudioHardwareOutputBufferSize( 137 PP_Instance instance) { 138 NOTIMPLEMENTED(); 139 return 0; 140 } 141 142 PP_Var PluginInstance::GetDefaultCharSet(PP_Instance instance) { 143 NOTIMPLEMENTED(); 144 return PP_MakeUndefined(); 145 } 146 147 void PluginInstance::Log(PP_Instance instance, 148 PP_LogLevel log_level, 149 PP_Var value) { 150 NOTIMPLEMENTED(); 151 } 152 153 void PluginInstance::LogWithSource(PP_Instance instance, 154 PP_LogLevel log_level, 155 PP_Var source, 156 PP_Var value) { 157 NOTIMPLEMENTED(); 158 } 159 160 void PluginInstance::SetPluginToHandleFindRequests(PP_Instance instance) { 161 NOTIMPLEMENTED(); 162 } 163 164 void PluginInstance::NumberOfFindResultsChanged(PP_Instance instance, 165 int32_t total, 166 PP_Bool final_result) { 167 NOTIMPLEMENTED(); 168 } 169 170 void PluginInstance::SelectedFindResultChanged(PP_Instance instance, 171 int32_t index) { 172 NOTIMPLEMENTED(); 173 } 174 175 void PluginInstance::SetTickmarks(PP_Instance instance, 176 const PP_Rect* tickmarks, 177 uint32_t count) { 178 NOTIMPLEMENTED(); 179 } 180 181 PP_Bool PluginInstance::IsFullscreen(PP_Instance instance) { 182 NOTIMPLEMENTED(); 183 return PP_FALSE; 184 } 185 186 PP_Bool PluginInstance::SetFullscreen(PP_Instance instance, 187 PP_Bool fullscreen) { 188 NOTIMPLEMENTED(); 189 return PP_FALSE; 190 } 191 192 PP_Bool PluginInstance::GetScreenSize(PP_Instance instance, PP_Size* size) { 193 NOTIMPLEMENTED(); 194 return PP_FALSE; 195 } 196 197 ppapi::Resource* PluginInstance::GetSingletonResource( 198 PP_Instance instance, 199 ppapi::SingletonResourceID id) { 200 NOTIMPLEMENTED(); 201 return NULL; 202 } 203 204 int32_t PluginInstance::RequestInputEvents(PP_Instance instance, 205 uint32_t event_classes) { 206 NOTIMPLEMENTED(); 207 return PP_ERROR_FAILED; 208 } 209 210 int32_t PluginInstance::RequestFilteringInputEvents(PP_Instance instance, 211 uint32_t event_classes) { 212 NOTIMPLEMENTED(); 213 return PP_ERROR_FAILED; 214 } 215 216 void PluginInstance::ClearInputEventRequest(PP_Instance instance, 217 uint32_t event_classes) { 218 NOTIMPLEMENTED(); 219 } 220 221 void PluginInstance::StartTrackingLatency(PP_Instance instance) { 222 NOTIMPLEMENTED(); 223 } 224 225 void PluginInstance::PostMessage(PP_Instance instance, PP_Var message) { 226 NOTIMPLEMENTED(); 227 } 228 229 int32_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 239 int32_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 248 void PluginInstance::UnregisterMessageHandler(PP_Instance instance) { 249 NOTIMPLEMENTED(); 250 } 251 252 PP_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 260 int32_t PluginInstance::LockMouse( 261 PP_Instance instance, 262 scoped_refptr<ppapi::TrackedCallback> callback) { 263 NOTIMPLEMENTED(); 264 return PP_ERROR_FAILED; 265 } 266 267 void PluginInstance::UnlockMouse(PP_Instance instance) { 268 NOTIMPLEMENTED(); 269 } 270 271 void PluginInstance::SetTextInputType(PP_Instance instance, 272 PP_TextInput_Type type) { 273 NOTIMPLEMENTED(); 274 } 275 276 void PluginInstance::UpdateCaretPosition(PP_Instance instance, 277 const PP_Rect& caret, 278 const PP_Rect& bounding_box) { 279 NOTIMPLEMENTED(); 280 } 281 282 void PluginInstance::CancelCompositionText(PP_Instance instance) { 283 NOTIMPLEMENTED(); 284 } 285 286 void PluginInstance::SelectionChanged(PP_Instance instance) { 287 NOTIMPLEMENTED(); 288 } 289 290 void PluginInstance::UpdateSurroundingText(PP_Instance instance, 291 const char* text, 292 uint32_t caret, 293 uint32_t anchor) { 294 NOTIMPLEMENTED(); 295 } 296 297 void PluginInstance::ZoomChanged(PP_Instance instance, double factor) { 298 NOTIMPLEMENTED(); 299 } 300 301 void PluginInstance::ZoomLimitsChanged(PP_Instance instance, 302 double minimum_factor, 303 double maximum_factor) { 304 NOTIMPLEMENTED(); 305 } 306 307 PP_Var PluginInstance::GetDocumentURL(PP_Instance instance, 308 PP_URLComponents_Dev* components) { 309 NOTIMPLEMENTED(); 310 return PP_MakeUndefined(); 311 } 312 313 void PluginInstance::PromiseResolved(PP_Instance instance, uint32 promise_id) { 314 NOTIMPLEMENTED(); 315 } 316 317 void PluginInstance::PromiseResolvedWithSession(PP_Instance instance, 318 uint32 promise_id, 319 PP_Var web_session_id_var) { 320 NOTIMPLEMENTED(); 321 } 322 323 void PluginInstance::PromiseResolvedWithKeyIds(PP_Instance instance, 324 uint32 promise_id, 325 PP_Var key_ids_var) { 326 NOTIMPLEMENTED(); 327 } 328 329 void 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 337 void 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 344 void PluginInstance::SessionKeysChange(PP_Instance instance, 345 PP_Var web_session_id_var, 346 PP_Bool has_additional_usable_key) { 347 NOTIMPLEMENTED(); 348 } 349 350 void PluginInstance::SessionExpirationChange(PP_Instance instance, 351 PP_Var web_session_id_var, 352 PP_Time new_expiry_time) { 353 NOTIMPLEMENTED(); 354 } 355 356 void PluginInstance::SessionReady(PP_Instance instance, 357 PP_Var web_session_id_var) { 358 NOTIMPLEMENTED(); 359 } 360 361 void PluginInstance::SessionClosed(PP_Instance instance, 362 PP_Var web_session_id_var) { 363 NOTIMPLEMENTED(); 364 } 365 366 void 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 374 void PluginInstance::DeliverBlock(PP_Instance instance, 375 PP_Resource decrypted_block, 376 const PP_DecryptedBlockInfo* block_info) { 377 NOTIMPLEMENTED(); 378 } 379 380 void PluginInstance::DecoderInitializeDone(PP_Instance instance, 381 PP_DecryptorStreamType decoder_type, 382 uint32_t request_id, 383 PP_Bool success) { 384 NOTIMPLEMENTED(); 385 } 386 387 void PluginInstance::DecoderDeinitializeDone( 388 PP_Instance instance, 389 PP_DecryptorStreamType decoder_type, 390 uint32_t request_id) { 391 NOTIMPLEMENTED(); 392 } 393 394 void PluginInstance::DecoderResetDone(PP_Instance instance, 395 PP_DecryptorStreamType decoder_type, 396 uint32_t request_id) { 397 NOTIMPLEMENTED(); 398 } 399 400 void PluginInstance::DeliverFrame(PP_Instance instance, 401 PP_Resource decrypted_frame, 402 const PP_DecryptedFrameInfo* frame_info) { 403 NOTIMPLEMENTED(); 404 } 405 406 void PluginInstance::DeliverSamples(PP_Instance instance, 407 PP_Resource audio_frames, 408 const PP_DecryptedSampleInfo* sample_info) { 409 NOTIMPLEMENTED(); 410 } 411 412 PP_Var PluginInstance::ResolveRelativeToDocument( 413 PP_Instance instance, 414 PP_Var relative, 415 PP_URLComponents_Dev* components) { 416 NOTIMPLEMENTED(); 417 return PP_MakeUndefined(); 418 } 419 420 PP_Bool PluginInstance::DocumentCanRequest(PP_Instance instance, PP_Var url) { 421 NOTIMPLEMENTED(); 422 return PP_FALSE; 423 } 424 425 PP_Bool PluginInstance::DocumentCanAccessDocument(PP_Instance instance, 426 PP_Instance target) { 427 NOTIMPLEMENTED(); 428 return PP_FALSE; 429 } 430 431 PP_Var PluginInstance::GetPluginInstanceURL(PP_Instance instance, 432 PP_URLComponents_Dev* components) { 433 NOTIMPLEMENTED(); 434 return PP_MakeUndefined(); 435 } 436 437 PP_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