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