1db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block/* 2db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Apple Inc. All rights reserved. 3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 4db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Redistribution and use in source and binary forms, with or without 5db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * modification, are permitted provided that the following conditions 6db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * are met: 7db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 1. Redistributions of source code must retain the above copyright 8db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * notice, this list of conditions and the following disclaimer. 9db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 2. Redistributions in binary form must reproduce the above copyright 10db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * notice, this list of conditions and the following disclaimer in the 11db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * documentation and/or other materials provided with the distribution. 12db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 13db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THE POSSIBILITY OF SUCH DAMAGE. 24db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block */ 25db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 26db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "PluginTest.h" 27db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "PluginObject.h" 29db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <assert.h> 30e14391e94c850b8bd03680c23b38978db68687a8John Reck#include <string.h> 31db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 32db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockusing namespace std; 33db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockextern NPNetscapeFuncs *browser; 34db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 352bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic void (*shutdownFunction)(); 362bde8e466a4451c7319e3a072d118917957d6554Steve Block 37db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPluginTest* PluginTest::create(NPP npp, const string& identifier) 38db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (identifier.empty()) 402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return new PluginTest(npp, identifier); 412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 42db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block CreateTestFunction createTestFunction = createTestFunctions()[identifier]; 43db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block if (createTestFunction) 44db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return createTestFunction(npp, identifier); 45db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 47db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 48db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 49db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPluginTest::PluginTest(NPP npp, const string& identifier) 50db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block : m_npp(npp) 51db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block , m_identifier(identifier) 52db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 532bde8e466a4451c7319e3a072d118917957d6554Steve Block // Reset the shutdown function. 542bde8e466a4451c7319e3a072d118917957d6554Steve Block shutdownFunction = 0; 55db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 56db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 57db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPluginTest::~PluginTest() 58db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 59db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 60db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 612bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid PluginTest::NP_Shutdown() 622bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 632bde8e466a4451c7319e3a072d118917957d6554Steve Block if (shutdownFunction) 642bde8e466a4451c7319e3a072d118917957d6554Steve Block shutdownFunction(); 652bde8e466a4451c7319e3a072d118917957d6554Steve Block} 662bde8e466a4451c7319e3a072d118917957d6554Steve Block 672bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid PluginTest::registerNPShutdownFunction(void (*func)()) 682bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 692bde8e466a4451c7319e3a072d118917957d6554Steve Block assert(!shutdownFunction); 702bde8e466a4451c7319e3a072d118917957d6554Steve Block shutdownFunction = func; 712bde8e466a4451c7319e3a072d118917957d6554Steve Block} 722bde8e466a4451c7319e3a072d118917957d6554Steve Block 732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid PluginTest::indicateTestFailure() 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // This should really be an assert, but there's no way for the test framework 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // to know that the plug-in process crashed, so we'll just sleep for a while 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // to ensure that the test times out. 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(XP_WIN) 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ::Sleep(100000); 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch sleep(1000); 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 85f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochNPError PluginTest::NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved) 86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return NPERR_NO_ERROR; 88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 90e14391e94c850b8bd03680c23b38978db68687a8John ReckNPError PluginTest::NPP_Destroy(NPSavedData**) 91e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 92e14391e94c850b8bd03680c23b38978db68687a8John Reck return NPERR_NO_ERROR; 93e14391e94c850b8bd03680c23b38978db68687a8John Reck} 94e14391e94c850b8bd03680c23b38978db68687a8John Reck 95db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockNPError PluginTest::NPP_DestroyStream(NPStream *stream, NPReason reason) 96db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 97db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return NPERR_NO_ERROR; 98db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 99db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 100db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockNPError PluginTest::NPP_GetValue(NPPVariable variable, void *value) 101db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 102db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block // We don't know anything about plug-in values so just return NPERR_GENERIC_ERROR. 103db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return NPERR_GENERIC_ERROR; 104db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 105db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenNPError PluginTest::NPP_SetWindow(NPP, NPWindow*) 107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return NPERR_NO_ERROR; 109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochint16_t PluginTest::NPP_HandleEvent(void*) 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 116e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid PluginTest::NPN_InvalidateRect(NPRect* invalidRect) 117e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 118e14391e94c850b8bd03680c23b38978db68687a8John Reck browser->invalidaterect(m_npp, invalidRect); 119e14391e94c850b8bd03680c23b38978db68687a8John Reck} 120e14391e94c850b8bd03680c23b38978db68687a8John Reck 12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochNPError PluginTest::NPN_GetURL(const char* url, const char* target) 12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return browser->geturl(m_npp, url, target); 12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 126db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockNPIdentifier PluginTest::NPN_GetStringIdentifier(const NPUTF8 *name) 127db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 128db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return browser->getstringidentifier(name); 129db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 130db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 131db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockNPIdentifier PluginTest::NPN_GetIntIdentifier(int32_t intid) 132db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 133db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return browser->getintidentifier(intid); 134db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 135db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 136a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochNPError PluginTest::NPN_GetValue(NPNVariable variable, void* value) 137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 138a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return browser->getvalue(m_npp, variable, value); 139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 140a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 141db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockNPObject* PluginTest::NPN_CreateObject(NPClass* npClass) 142db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 143db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return browser->createobject(m_npp, npClass); 144db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 145db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 146db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockbool PluginTest::NPN_RemoveProperty(NPObject* npObject, NPIdentifier propertyName) 147db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 148db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return browser->removeproperty(m_npp, npObject, propertyName); 149db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 150db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifdef XP_MACOSX 1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool PluginTest::NPN_ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace) 1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return browser->convertpoint(m_npp, sourceX, sourceY, sourceSpace, destX, destY, destSpace); 1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid PluginTest::executeScript(const char* script) 159e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 160e14391e94c850b8bd03680c23b38978db68687a8John Reck NPObject* windowScriptObject; 16128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu browser->getvalue(m_npp, NPNVWindowNPObject, &windowScriptObject); 162e14391e94c850b8bd03680c23b38978db68687a8John Reck 163e14391e94c850b8bd03680c23b38978db68687a8John Reck NPString npScript; 164e14391e94c850b8bd03680c23b38978db68687a8John Reck npScript.UTF8Characters = script; 165e14391e94c850b8bd03680c23b38978db68687a8John Reck npScript.UTF8Length = strlen(script); 166e14391e94c850b8bd03680c23b38978db68687a8John Reck 167e14391e94c850b8bd03680c23b38978db68687a8John Reck NPVariant browserResult; 16828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu browser->evaluate(m_npp, windowScriptObject, &npScript, &browserResult); 169e14391e94c850b8bd03680c23b38978db68687a8John Reck browser->releasevariantvalue(&browserResult); 170e14391e94c850b8bd03680c23b38978db68687a8John Reck} 171e14391e94c850b8bd03680c23b38978db68687a8John Reck 1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid PluginTest::log(const char* format, ...) 1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch va_list args; 1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch va_start(args, format); 1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch pluginLogWithArguments(m_npp, format, args); 1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch va_end(args); 1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 180e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid PluginTest::waitUntilDone() 181e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 18228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu executeScript("layoutTestController.waitUntilDone()"); 183e14391e94c850b8bd03680c23b38978db68687a8John Reck} 184e14391e94c850b8bd03680c23b38978db68687a8John Reck 185e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid PluginTest::notifyDone() 186e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 18728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu executeScript("layoutTestController.notifyDone()"); 188e14391e94c850b8bd03680c23b38978db68687a8John Reck} 189e14391e94c850b8bd03680c23b38978db68687a8John Reck 190db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PluginTest::registerCreateTestFunction(const string& identifier, CreateTestFunction createTestFunction) 191db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 192db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block assert(!createTestFunctions().count(identifier)); 193db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 194db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block createTestFunctions()[identifier] = createTestFunction; 195db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 196db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 197db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockstd::map<std::string, PluginTest::CreateTestFunction>& PluginTest::createTestFunctions() 198db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 199db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block static std::map<std::string, CreateTestFunction> testFunctions; 200db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 201db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return testFunctions; 202db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 203