// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "webkit/plugins/ppapi/ppapi_unittest.h" #include "ppapi/c/pp_var.h" #include "ppapi/c/ppp_instance.h" #include "webkit/plugins/ppapi/mock_plugin_delegate.h" #include "webkit/plugins/ppapi/plugin_module.h" #include "webkit/plugins/ppapi/ppapi_interface_factory.h" #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" namespace webkit { namespace ppapi { namespace { PpapiUnittest* current_unittest = NULL; const void* MockGetInterface(const char* interface_name) { return current_unittest->GetMockInterface(interface_name); } int MockInitializeModule(PP_Module, PPB_GetInterface) { return PP_OK; } // PPP_Instance implementation ------------------------------------------------ PP_Bool Instance_DidCreate(PP_Instance pp_instance, uint32_t argc, const char* argn[], const char* argv[]) { return PP_TRUE; } void Instance_DidDestroy(PP_Instance instance) { } void Instance_DidChangeView(PP_Instance pp_instance, PP_Resource view) { } void Instance_DidChangeFocus(PP_Instance pp_instance, PP_Bool has_focus) { } PP_Bool Instance_HandleDocumentLoad(PP_Instance pp_instance, PP_Resource pp_url_loader) { return PP_FALSE; } static PPP_Instance mock_instance_interface = { &Instance_DidCreate, &Instance_DidDestroy, &Instance_DidChangeView, &Instance_DidChangeFocus, &Instance_HandleDocumentLoad }; } // namespace // PpapiUnittest -------------------------------------------------------------- PpapiUnittest::PpapiUnittest() { DCHECK(!current_unittest); current_unittest = this; } PpapiUnittest::~PpapiUnittest() { DCHECK(current_unittest == this); current_unittest = NULL; } void PpapiUnittest::SetUp() { delegate_.reset(NewPluginDelegate()); // Initialize the mock module. module_ = new PluginModule("Mock plugin", FilePath(), this); PluginModule::EntryPoints entry_points; entry_points.get_interface = &MockGetInterface; entry_points.initialize_module = &MockInitializeModule; ASSERT_TRUE(module_->InitAsInternalPlugin(entry_points)); // Initialize the mock instance. instance_ = PluginInstance::Create1_0( delegate_.get(), module(), GetMockInterface(PPP_INSTANCE_INTERFACE_1_0)); } void PpapiUnittest::TearDown() { instance_ = NULL; module_ = NULL; } MockPluginDelegate* PpapiUnittest::NewPluginDelegate() { return new MockPluginDelegate; } const void* PpapiUnittest::GetMockInterface(const char* interface_name) const { if (strcmp(interface_name, PPP_INSTANCE_INTERFACE_1_0) == 0) return &mock_instance_interface; return NULL; } void PpapiUnittest::ShutdownModule() { DCHECK(instance_->HasOneRef()); instance_ = NULL; DCHECK(module_->HasOneRef()); module_ = NULL; } void PpapiUnittest::PluginModuleDead(PluginModule* /* dead_module */) { // Nothing needed (this is necessary to make the module compile). } // Tests whether custom PPAPI interface factories are called when PPAPI // interfaces are requested. class PpapiCustomInterfaceFactoryTest : public testing::Test, public webkit::ppapi::PluginDelegate::ModuleLifetime { public: PpapiCustomInterfaceFactoryTest() {} virtual ~PpapiCustomInterfaceFactoryTest() {} bool result() { return result_; } void reset_result() { result_ = false; } static const void* InterfaceFactory(const std::string& interface_name) { result_ = true; return NULL; } private: static bool result_; // ModuleLifetime implementation. virtual void PluginModuleDead(PluginModule* dead_module) {} }; bool PpapiCustomInterfaceFactoryTest::result_ = false; // This test validates whether custom PPAPI interface factories are invoked in // response to PluginModule::GetPluginInterface calls. TEST_F(PpapiCustomInterfaceFactoryTest, BasicFactoryTest) { PpapiInterfaceFactoryManager::GetInstance()->RegisterFactory( PpapiCustomInterfaceFactoryTest::InterfaceFactory); (*PluginModule::GetLocalGetInterfaceFunc())("DummyInterface"); EXPECT_TRUE(result()); reset_result(); PpapiInterfaceFactoryManager::GetInstance()->UnregisterFactory( PpapiCustomInterfaceFactoryTest::InterfaceFactory); (*PluginModule::GetLocalGetInterfaceFunc())("DummyInterface"); EXPECT_FALSE(result()); } } // namespace ppapi } // namespace webkit