// Copyright 2014 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. /* * Copyright (C) 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "PluginTest.h" #include "PluginObject.h" #include #if defined(XP_UNIX) || defined(ANDROID) #include #endif using namespace std; extern NPNetscapeFuncs *browser; static void (*shutdownFunction)(); PluginTest* PluginTest::create(NPP npp, const string& identifier) { if (identifier.empty()) return new PluginTest(npp, identifier); CreateTestFunction createTestFunction = createTestFunctions()[identifier]; if (createTestFunction) return createTestFunction(npp, identifier); return 0; } PluginTest::PluginTest(NPP npp, const string& identifier) : m_npp(npp), m_identifier(identifier) { // Reset the shutdown function. shutdownFunction = 0; } PluginTest::~PluginTest() {} void PluginTest::NP_Shutdown() { if (shutdownFunction) shutdownFunction(); } void PluginTest::registerNPShutdownFunction(void (*func)()) { assert(!shutdownFunction); shutdownFunction = func; } void PluginTest::indicateTestFailure() { // This should really be an assert, but there's no way for the test framework // to know that the plug-in process crashed, so we'll just sleep for a while // to ensure that the test times out. #if defined(XP_WIN) ::Sleep(100000); #else sleep(1000); #endif } NPError PluginTest::NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved) { return NPERR_NO_ERROR; } NPError PluginTest::NPP_Destroy(NPSavedData**) { return NPERR_NO_ERROR; } NPError PluginTest::NPP_SetWindow(NPWindow*) { return NPERR_NO_ERROR; } NPError PluginTest::NPP_NewStream(NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype) { return NPERR_NO_ERROR; } NPError PluginTest::NPP_DestroyStream(NPStream* stream, NPReason reason) { return NPERR_NO_ERROR; } int32_t PluginTest::NPP_WriteReady(NPStream*) { return 4096; } int32_t PluginTest::NPP_Write(NPStream*, int32_t offset, int32_t len, void* buffer) { return len; } int16_t PluginTest::NPP_HandleEvent(void*) { return 0; } bool PluginTest::NPP_URLNotify(const char* url, NPReason, void* notifyData) { // FIXME: Port the code from NPP_URLNotify in main.cpp over to always using // PluginTest, so we don't have to use a return value to indicate whether the // "default" NPP_URLNotify implementation should be invoked. return false; } NPError PluginTest::NPP_GetValue(NPPVariable variable, void* value) { // We don't know anything about plug-in values so just return // NPERR_GENERIC_ERROR. return NPERR_GENERIC_ERROR; } NPError PluginTest::NPP_SetValue(NPNVariable, void* value) { return NPERR_GENERIC_ERROR; } // NPN functions. NPError PluginTest::NPN_GetURL(const char* url, const char* target) { return browser->geturl(m_npp, url, target); } NPError PluginTest::NPN_GetURLNotify(const char* url, const char* target, void* notifyData) { return browser->geturlnotify(m_npp, url, target, notifyData); } NPError PluginTest::NPN_GetValue(NPNVariable variable, void* value) { return browser->getvalue(m_npp, variable, value); } void PluginTest::NPN_InvalidateRect(NPRect* invalidRect) { browser->invalidaterect(m_npp, invalidRect); } bool PluginTest::NPN_Invoke(NPObject* npobj, NPIdentifier methodName, const NPVariant* args, uint32_t argCount, NPVariant* result) { return browser->invoke(m_npp, npobj, methodName, args, argCount, result); } void* PluginTest::NPN_MemAlloc(uint32_t size) { return browser->memalloc(size); } // NPRuntime NPN functions. NPIdentifier PluginTest::NPN_GetStringIdentifier(const NPUTF8* name) { return browser->getstringidentifier(name); } NPIdentifier PluginTest::NPN_GetIntIdentifier(int32_t intid) { return browser->getintidentifier(intid); } bool PluginTest::NPN_IdentifierIsString(NPIdentifier npIdentifier) { return browser->identifierisstring(npIdentifier); } NPUTF8* PluginTest::NPN_UTF8FromIdentifier(NPIdentifier npIdentifier) { return browser->utf8fromidentifier(npIdentifier); } int32_t PluginTest::NPN_IntFromIdentifier(NPIdentifier npIdentifier) { return browser->intfromidentifier(npIdentifier); } NPObject* PluginTest::NPN_CreateObject(NPClass* npClass) { return browser->createobject(m_npp, npClass); } NPObject* PluginTest::NPN_RetainObject(NPObject* npObject) { return browser->retainobject(npObject); } void PluginTest::NPN_ReleaseObject(NPObject* npObject) { browser->releaseobject(npObject); } bool PluginTest::NPN_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* value) { return browser->getproperty(m_npp, npObject, propertyName, value); } bool PluginTest::NPN_RemoveProperty(NPObject* npObject, NPIdentifier propertyName) { return browser->removeproperty(m_npp, npObject, propertyName); } void PluginTest::NPN_ReleaseVariantValue(NPVariant* variant) { browser->releasevariantvalue(variant); } #ifdef XP_MACOSX bool PluginTest::NPN_ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double* destX, double* destY, NPCoordinateSpace destSpace) { return browser->convertpoint( m_npp, sourceX, sourceY, sourceSpace, destX, destY, destSpace); } #endif bool PluginTest::executeScript(const NPString* script, NPVariant* result) { NPObject* windowScriptObject; browser->getvalue(m_npp, NPNVWindowNPObject, &windowScriptObject); return browser->evaluate( m_npp, windowScriptObject, const_cast(script), result); } void PluginTest::executeScript(const char* script) { NPString npScript; npScript.UTF8Characters = script; npScript.UTF8Length = strlen(script); NPVariant browserResult; executeScript(&npScript, &browserResult); browser->releasevariantvalue(&browserResult); } void PluginTest::log(const char* format, ...) { va_list args; va_start(args, format); pluginLogWithArguments(m_npp, format, args); va_end(args); } NPNetscapeFuncs* PluginTest::netscapeFuncs() { return browser; } void PluginTest::waitUntilDone() { executeScript("testRunner.waitUntilDone()"); } void PluginTest::notifyDone() { executeScript("testRunner.notifyDone()"); } void PluginTest::registerCreateTestFunction( const string& identifier, CreateTestFunction createTestFunction) { assert(!createTestFunctions().count(identifier)); createTestFunctions()[identifier] = createTestFunction; } std::map& PluginTest::createTestFunctions() { static std::map testFunctions; return testFunctions; }