15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Holger Hans Peter Freyther
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Collabora Ltd.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "PluginObject.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "PluginTest.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "TestObject.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <assert.h>
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdio.h>
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdlib.h>
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string.h>
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Helper function which takes in the plugin window object for logging to the console object.
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void pluginLogWithWindowObject(NPObject* windowObject, NPP instance, const char* message)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant consoleVariant;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!browser->getproperty(instance, windowObject, browser->getstringidentifier("console"), &consoleVariant)) {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "Failed to retrieve console object while logging: %s\n", message);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* consoleObject = NPVARIANT_TO_OBJECT(consoleVariant);
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant messageVariant;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT(message, messageVariant);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant result;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!browser->invoke(instance, consoleObject, browser->getstringidentifier("log"), &messageVariant, 1, &result)) {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "Failed to invoke console.log while logging: %s\n", message);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(consoleObject);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releasevariantvalue(&result);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(consoleObject);
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void pluginLogWithArguments(NPP instance, const char* format, va_list args)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const size_t messageBufferSize = 2048;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char message[messageBufferSize] = "PLUGIN: ";
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int messageLength = sizeof("PLUGIN: ") - 1;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    messageLength += vsnprintf(message + messageLength, messageBufferSize - 1 - messageLength, format, args);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    message[messageLength] = '\0';
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowObject = 0;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPError error = browser->getvalue(instance, NPNVWindowNPObject, &windowObject);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (error != NPERR_NO_ERROR) {
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "Failed to retrieve window object while logging: %s\n", message);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginLogWithWindowObject(windowObject, instance, message);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(windowObject);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Helper function to log to the console object.
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void pluginLog(NPP instance, const char* format, ...)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    va_list args;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    va_start(args, format);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginLogWithArguments(instance, format, args);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    va_end(args);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void pluginInvalidate(NPObject*);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginHasProperty(NPObject*, NPIdentifier name);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginHasMethod(NPObject*, NPIdentifier name);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginGetProperty(NPObject*, NPIdentifier name, NPVariant*);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginSetProperty(NPObject*, NPIdentifier name, const NPVariant*);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginInvoke(NPObject*, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPObject* pluginAllocate(NPP npp, NPClass*);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void pluginDeallocate(NPObject*);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NPNetscapeFuncs* browser;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NPPluginFuncs* pluginFunctions;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
102591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic NPClass pluginClass_ = {
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NP_CLASS_STRUCT_VERSION,
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginAllocate,
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginDeallocate,
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginInvalidate,
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginHasMethod,
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginInvoke,
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0, // NPClass::invokeDefault,
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginHasProperty,
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginGetProperty,
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginSetProperty,
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0, // NPClass::removeProperty
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0, // NPClass::enumerate
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0, // NPClass::construct
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
118591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochNPClass* createPluginClass(void)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
120591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NPClass* pluginClass = new NPClass;
121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    *pluginClass = pluginClass_;
122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return pluginClass;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool identifiersInitialized = false;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum {
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_PROPERTY = 0,
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_EVENT_LOGGING,
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_HAS_STREAM,
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_TEST_OBJECT,
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_LOG_DESTROY,
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_RETURN_ERROR_FROM_NEWSTREAM,
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_RETURN_NEGATIVE_ONE_FROM_WRITE,
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_THROW_EXCEPTION_PROPERTY,
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_LAST_SET_WINDOW_ARGUMENTS,
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_WINDOWED_PLUGIN,
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_TEST_OBJECT_COUNT,
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_PROPERTY_DELETE_IN_GET_PROPERTY,
140591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ID_PROPERTY_DELETE_IN_HAS_PROPERTY_RETURN_TRUE,
141591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ID_PROPERTY_DELETE_IN_SET_PROPERTY,
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NUM_PROPERTY_IDENTIFIERS
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPIdentifier pluginPropertyIdentifiers[NUM_PROPERTY_IDENTIFIERS];
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const NPUTF8 *pluginPropertyIdentifierNames[NUM_PROPERTY_IDENTIFIERS] = {
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "property",
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "eventLoggingEnabled",
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "hasStream",
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testObject",
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "logDestroy",
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "returnErrorFromNewStream",
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "returnNegativeOneFromWrite",
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testThrowExceptionProperty",
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "lastSetWindowArguments",
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "windowedPlugin",
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testObjectCount",
158591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    "deletePluginInGetProperty",
159591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    "deletePluginInHasPropertyReturnTrue",
160591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    "deletePluginInSetProperty"
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_CALLBACK_METHOD = 0,
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_CALLBACK_METHOD_RETURN,
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_GETURL,
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_DOM_ACCESS,
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_GET_URL_NOTIFY,
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_INVOKE_DEFAULT,
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_DESTROY_STREAM,
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_ENUMERATE,
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_GETINTIDENTIFIER,
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_GET_PROPERTY,
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_HAS_PROPERTY,
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_HAS_METHOD,
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_EVALUATE,
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_GET_PROPERTY_RETURN_VALUE,
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_IDENTIFIER_TO_STRING,
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_IDENTIFIER_TO_INT,
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_PASS_TEST_OBJECT,
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_POSTURL_FILE,
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_CONSTRUCT,
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_THROW_EXCEPTION_METHOD,
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_FAIL_METHOD,
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_CLONE_OBJECT,
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_SCRIPT_OBJECT_INVOKE,
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_CREATE_TEST_OBJECT,
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_DESTROY_NULL_STREAM,
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_RELOAD_PLUGINS_NO_PAGES,
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_RELOAD_PLUGINS_AND_PAGES,
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_GET_BROWSER_PROPERTY,
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_SET_BROWSER_PROPERTY,
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_REMEMBER,
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_GET_REMEMBERED_OBJECT,
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_GET_AND_FORGET_REMEMBERED_OBJECT,
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_REF_COUNT,
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_SET_STATUS,
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_RESIZE_TO,
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_NORMALIZE,
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_INVALIDATE_RECT,
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_OBJECTS_ARE_SAME,
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ID_TEST_DELETE_WITHIN_INVOKE,
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NUM_METHOD_IDENTIFIERS
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPIdentifier pluginMethodIdentifiers[NUM_METHOD_IDENTIFIERS];
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const NPUTF8 *pluginMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = {
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testCallback",
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testCallbackReturn",
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "getURL",
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testDOMAccess",
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "getURLNotify",
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testInvokeDefault",
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "destroyStream",
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testEnumerate",
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testGetIntIdentifier",
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testGetProperty",
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testHasProperty",
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testHasMethod",
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testEvaluate",
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testGetPropertyReturnValue",
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testIdentifierToString",
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testIdentifierToInt",
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testPassTestObject",
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testPostURLFile",
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testConstruct",
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testThrowException",
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testFail",
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testCloneObject",
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testScriptObjectInvoke",
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testCreateTestObject",
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "destroyNullStream",
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "reloadPluginsNoPages",
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "reloadPluginsAndPages",
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testGetBrowserProperty",
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testSetBrowserProperty",
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "remember",
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "getRememberedObject",
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "getAndForgetRememberedObject",
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "refCount",
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "setStatus",
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "resizeTo",
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "normalize",
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "invalidateRect",
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "objectsAreSame",
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "testDeleteWithinInvoke"
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPUTF8* createCStringFromNPVariant(const NPVariant* variant)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t length = NPVARIANT_TO_STRING(*variant).UTF8Length;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* result = (NPUTF8*)malloc(length + 1);
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    memcpy(result, NPVARIANT_TO_STRING(*variant).UTF8Characters, length);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result[length] = '\0';
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void initializeIdentifiers(void)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getstringidentifiers(pluginPropertyIdentifierNames, NUM_PROPERTY_IDENTIFIERS, pluginPropertyIdentifiers);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getstringidentifiers(pluginMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, pluginMethodIdentifiers);
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool callDeletePlugin(NPObject* obj, NPIdentifier name, NPIdentifier identifierToMatch)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name != identifierToMatch)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* plugin = reinterpret_cast<PluginObject*>(obj);
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(plugin->npp, NPNVWindowNPObject, &windowScriptObject);
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = browser->getstringidentifier("deletePlugin");
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant browserResult;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->invoke(plugin->npp, windowScriptObject, callbackIdentifier, 0, 0, &browserResult))
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&browserResult);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginHasProperty(NPObject *obj, NPIdentifier name)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
282591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (callDeletePlugin(obj, name, browser->getstringidentifier("deletePluginInHasPropertyReturnFalse")))
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    callDeletePlugin(obj, name, pluginPropertyIdentifiers[ID_PROPERTY_DELETE_IN_HAS_PROPERTY_RETURN_TRUE]);
286591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = 0; i < NUM_PROPERTY_IDENTIFIERS; i++)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (name == pluginPropertyIdentifiers[i])
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginHasMethod(NPObject *obj, NPIdentifier name)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (callDeletePlugin(obj, name, browser->getstringidentifier("deletePluginInHasMethod")))
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = 0; i < NUM_METHOD_IDENTIFIERS; i++)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (name == pluginMethodIdentifiers[i])
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginGetProperty(NPObject* obj, NPIdentifier name, NPVariant* result)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* plugin = reinterpret_cast<PluginObject*>(obj);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_PROPERTY]) {
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static const char* originalString = "property";
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char* buf = static_cast<char*>(browser->memalloc(strlen(originalString) + 1));
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strcpy(buf, originalString);
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        STRINGZ_TO_NPVARIANT(buf, *result);
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_EVENT_LOGGING]) {
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BOOLEAN_TO_NPVARIANT(plugin->eventLogging, *result);
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_LOG_DESTROY]) {
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BOOLEAN_TO_NPVARIANT(plugin->logDestroy, *result);
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_HAS_STREAM]) {
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BOOLEAN_TO_NPVARIANT(plugin->stream, *result);
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_TEST_OBJECT]) {
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* testObject = plugin->testObject;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->retainobject(testObject);
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(testObject, *result);
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_RETURN_ERROR_FROM_NEWSTREAM]) {
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BOOLEAN_TO_NPVARIANT(plugin->returnErrorFromNewStream, *result);
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_RETURN_NEGATIVE_ONE_FROM_WRITE]) {
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        BOOLEAN_TO_NPVARIANT(plugin->returnNegativeOneFromWrite, *result);
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_THROW_EXCEPTION_PROPERTY]) {
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->setexception(obj, "plugin object testThrowExceptionProperty SUCCESS");
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_LAST_SET_WINDOW_ARGUMENTS]) {
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char* buf = static_cast<char*>(browser->memalloc(256));
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        snprintf(buf, 256, "x: %d, y: %d, width: %u, height: %u, clipRect: (%u, %u, %u, %u)", (int)plugin->lastWindow.x, (int)plugin->lastWindow.y, (unsigned)plugin->lastWindow.width, (unsigned)plugin->lastWindow.height,
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            plugin->lastWindow.clipRect.left, plugin->lastWindow.clipRect.top, plugin->lastWindow.clipRect.right - plugin->lastWindow.clipRect.left, plugin->lastWindow.clipRect.bottom - plugin->lastWindow.clipRect.top);
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        STRINGZ_TO_NPVARIANT(buf, *result);
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_TEST_OBJECT_COUNT]) {
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        INT32_TO_NPVARIANT(getTestObjectCount(), *result);
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_DELETE_IN_GET_PROPERTY]) {
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->retainobject(obj);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        callDeletePlugin(obj, name, pluginPropertyIdentifiers[ID_PROPERTY_DELETE_IN_GET_PROPERTY]);
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* testObject = plugin->testObject;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->retainobject(testObject);
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(testObject, *result);
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(obj);
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginSetProperty(NPObject* obj, NPIdentifier name, const NPVariant* variant)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* plugin = reinterpret_cast<PluginObject*>(obj);
373591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (callDeletePlugin(obj, name, pluginPropertyIdentifiers[ID_PROPERTY_DELETE_IN_SET_PROPERTY]))
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_EVENT_LOGGING]) {
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plugin->eventLogging = NPVARIANT_TO_BOOLEAN(*variant);
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_LOG_DESTROY]) {
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plugin->logDestroy = NPVARIANT_TO_BOOLEAN(*variant);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_RETURN_ERROR_FROM_NEWSTREAM]) {
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plugin->returnErrorFromNewStream = NPVARIANT_TO_BOOLEAN(*variant);
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_RETURN_NEGATIVE_ONE_FROM_WRITE]) {
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plugin->returnNegativeOneFromWrite = NPVARIANT_TO_BOOLEAN(*variant);
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_THROW_EXCEPTION_PROPERTY]) {
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->setexception(obj, "plugin object testThrowExceptionProperty SUCCESS");
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginPropertyIdentifiers[ID_PROPERTY_WINDOWED_PLUGIN]) {
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->setvalue(plugin->npp, NPPVpluginWindowBool, (void *)NPVARIANT_TO_BOOLEAN(*variant));
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testDOMAccess(PluginObject* obj, const NPVariant*, uint32_t, NPVariant* result)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Get plug-in's DOM element
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* elementObject;
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->getvalue(obj->npp, NPNVPluginElementNPObject, &elementObject) == NPERR_NO_ERROR) {
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Get style
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPVariant styleVariant;
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPIdentifier styleIdentifier = browser->getstringidentifier("style");
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (browser->getproperty(obj->npp, elementObject, styleIdentifier, &styleVariant) && NPVARIANT_IS_OBJECT(styleVariant)) {
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Set style.border
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            NPIdentifier borderIdentifier = browser->getstringidentifier("border");
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            NPVariant borderVariant;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            STRINGZ_TO_NPVARIANT("3px solid red", borderVariant);
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            browser->setproperty(obj->npp, NPVARIANT_TO_OBJECT(styleVariant), borderIdentifier, &borderVariant);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            browser->releasevariantvalue(&styleVariant);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(elementObject);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPIdentifier stringVariantToIdentifier(NPVariant variant)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    assert(NPVARIANT_IS_STRING(variant));
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* utf8String = createCStringFromNPVariant(&variant);
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier identifier = browser->getstringidentifier(utf8String);
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(utf8String);
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return identifier;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPIdentifier int32VariantToIdentifier(NPVariant variant)
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    assert(NPVARIANT_IS_INT32(variant));
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int32_t integer = NPVARIANT_TO_INT32(variant);
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return browser->getintidentifier(integer);
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPIdentifier doubleVariantToIdentifier(NPVariant variant)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    assert(NPVARIANT_IS_DOUBLE(variant));
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double value = NPVARIANT_TO_DOUBLE(variant);
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Sadly there is no "getdoubleidentifier"
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int32_t integer = static_cast<int32_t>(value);
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return browser->getintidentifier(integer);
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPIdentifier variantToIdentifier(NPVariant variant)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPVARIANT_IS_STRING(variant))
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return stringVariantToIdentifier(variant);
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPVARIANT_IS_INT32(variant))
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return int32VariantToIdentifier(variant);
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPVARIANT_IS_DOUBLE(variant))
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return doubleVariantToIdentifier(variant);
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testIdentifierToString(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 1)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier identifier = variantToIdentifier(args[0]);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!identifier)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* utf8String = browser->utf8fromidentifier(identifier);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!utf8String)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT(utf8String, *result);
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testIdentifierToInt(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 1)
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier identifier = variantToIdentifier(args[0]);
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!identifier)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int32_t integer = browser->intfromidentifier(identifier);
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    INT32_TO_NPVARIANT(integer, *result);
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testPassTestObject(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_STRING(args[0]))
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* callbackString = createCStringFromNPVariant(&args[0]);
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString);
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(callbackString);
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant browserResult;
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, &args[1], 1, &browserResult);
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releasevariantvalue(&browserResult);
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testCallback(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!argCount || !NPVARIANT_IS_STRING(args[0]))
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* callbackString = createCStringFromNPVariant(&args[0]);
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString);
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(callbackString);
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant browserResult;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, 0, 0, &browserResult))
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&browserResult);
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(windowScriptObject);
52602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testCallbackReturn(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 1 || !NPVARIANT_IS_STRING(args[0]))
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* callbackString = createCStringFromNPVariant(&args[0]);
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString);
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(callbackString);
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant callbackArgs[1];
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OBJECT_TO_NPVARIANT(windowScriptObject, callbackArgs[0]);
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant browserResult;
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->invoke(obj->npp, windowScriptObject, callbackIdentifier,
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    callbackArgs, 1, &browserResult);
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPVARIANT_IS_OBJECT(browserResult))
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(NPVARIANT_TO_OBJECT(browserResult), *result);
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&browserResult);
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VOID_TO_NPVARIANT(*result);
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool getURL(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount == 2 && NPVARIANT_IS_STRING(args[0]) && NPVARIANT_IS_STRING(args[1])) {
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPUTF8* urlString = createCStringFromNPVariant(&args[0]);
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPUTF8* targetString = createCStringFromNPVariant(&args[1]);
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPError npErr = browser->geturl(obj->npp, urlString, targetString);
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        free(urlString);
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        free(targetString);
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        INT32_TO_NPVARIANT(npErr, *result);
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount == 1 && NPVARIANT_IS_STRING(args[0])) {
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPUTF8* urlString = createCStringFromNPVariant(&args[0]);
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPError npErr = browser->geturl(obj->npp, urlString, 0);
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        free(urlString);
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        INT32_TO_NPVARIANT(npErr, *result);
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool getURLNotify(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 3 || !NPVARIANT_IS_STRING(args[0])
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (!NPVARIANT_IS_STRING(args[1]) && !NPVARIANT_IS_NULL(args[1]))
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !NPVARIANT_IS_STRING(args[2]))
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* urlString = createCStringFromNPVariant(&args[0]);
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* targetString = (NPVARIANT_IS_STRING(args[1]) ? createCStringFromNPVariant(&args[1]) : 0);
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* callbackString = createCStringFromNPVariant(&args[2]);
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->geturlnotify(obj->npp, urlString, targetString, callbackIdentifier);
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(urlString);
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(targetString);
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(callbackString);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testInvokeDefault(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!NPVARIANT_IS_OBJECT(args[0]))
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* callback = NPVARIANT_TO_OBJECT(args[0]);
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant invokeArgs[1];
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant browserResult;
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT("test", invokeArgs[0]);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool retval = browser->invokeDefault(obj->npp, callback, invokeArgs, 1, &browserResult);
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (retval)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&browserResult);
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(retval, *result);
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool destroyStream(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPError npError = browser->destroystream(obj->npp, obj->stream, NPRES_USER_BREAK);
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    INT32_TO_NPVARIANT(npError, *result);
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool destroyNullStream(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPError npError = browser->destroystream(obj->npp, 0, NPRES_USER_BREAK);
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    INT32_TO_NPVARIANT(npError, *result);
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testEnumerate(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_OBJECT(args[1]))
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t count;
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier* identifiers;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->enumerate(obj->npp, NPVARIANT_TO_OBJECT(args[0]), &identifiers, &count)) {
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* outArray = NPVARIANT_TO_OBJECT(args[1]);
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPIdentifier pushIdentifier = browser->getstringidentifier("push");
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (uint32_t i = 0; i < count; i++) {
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            NPUTF8* string = browser->utf8fromidentifier(identifiers[i]);
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!string)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            NPVariant args[1];
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            STRINGZ_TO_NPVARIANT(string, args[0]);
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            NPVariant browserResult;
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (browser->invoke(obj->npp, outArray, pushIdentifier, args, 1, &browserResult))
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                browser->releasevariantvalue(&browserResult);
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            browser->memfree(string);
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->memfree(identifiers);
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testGetIntIdentifier(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result)
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 1 || !NPVARIANT_IS_DOUBLE(args[0]))
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier identifier = browser->getintidentifier((int)NPVARIANT_TO_DOUBLE(args[0]));
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    INT32_TO_NPVARIANT((int32_t)(long long)identifier, *result);
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testGetProperty(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!argCount)
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* object;
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(obj->npp, NPNVWindowNPObject, &object);
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (uint32_t i = 0; i < argCount; i++) {
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(NPVARIANT_IS_STRING(args[i]));
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPUTF8* propertyString = createCStringFromNPVariant(&args[i]);
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString);
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        free(propertyString);
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPVariant variant;
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool retval = browser->getproperty(obj->npp, object, propertyIdentifier, &variant);
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(object);
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!retval)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (i + 1 < argCount) {
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            assert(NPVARIANT_IS_OBJECT(variant));
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            object = NPVARIANT_TO_OBJECT(variant);
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *result = variant;
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testHasProperty(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_STRING(args[1]))
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* propertyString = createCStringFromNPVariant(&args[1]);
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString);
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(propertyString);
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool retval = browser->hasproperty(obj->npp, NPVARIANT_TO_OBJECT(args[0]), propertyIdentifier);
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(retval, *result);
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testHasMethod(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_STRING(args[1]))
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* propertyString = createCStringFromNPVariant(&args[1]);
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString);
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(propertyString);
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool retval = browser->hasmethod(obj->npp, NPVARIANT_TO_OBJECT(args[0]), propertyIdentifier);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(retval, *result);
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testEvaluate(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 1 || !NPVARIANT_IS_STRING(args[0]))
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString s = NPVARIANT_TO_STRING(args[0]);
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool retval = browser->evaluate(obj->npp, windowScriptObject, &s, result);
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(windowScriptObject);
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return retval;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testGetPropertyReturnValue(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_STRING(args[1]))
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* propertyString = createCStringFromNPVariant(&args[1]);
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString);
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(propertyString);
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant variant;
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool retval = browser->getproperty(obj->npp, NPVARIANT_TO_OBJECT(args[0]), propertyIdentifier, &variant);
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (retval)
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&variant);
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(retval, *result);
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static char* toCString(const NPString& string)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char* result = static_cast<char*>(malloc(string.UTF8Length + 1));
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    memcpy(result, string.UTF8Characters, string.UTF8Length);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result[string.UTF8Length] = '\0';
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testPostURLFile(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 4 || !NPVARIANT_IS_STRING(args[0]) || !NPVARIANT_IS_STRING(args[1]) || !NPVARIANT_IS_STRING(args[2]) || !NPVARIANT_IS_STRING(args[3]))
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString urlString = NPVARIANT_TO_STRING(args[0]);
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char* url = toCString(urlString);
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString targetString = NPVARIANT_TO_STRING(args[1]);
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char* target = toCString(targetString);
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString pathString = NPVARIANT_TO_STRING(args[2]);
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char* path = toCString(pathString);
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString contentsString = NPVARIANT_TO_STRING(args[3]);
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FILE* tempFile = fopen(path, "w");
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!tempFile)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
80693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    size_t written = fwrite(contentsString.UTF8Characters, contentsString.UTF8Length, 1, tempFile);
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fclose(tempFile);
80893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!written)
80993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return false;
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8111fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    NPError error = browser->posturl(obj->npp, url, target, pathString.UTF8Length, path, true);
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(path);
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(target);
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(url);
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(error == NPERR_NO_ERROR, *result);
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testConstruct(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!argCount || !NPVARIANT_IS_OBJECT(args[0]))
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
82502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return browser->construct(obj->npp, NPVARIANT_TO_OBJECT(args[0]), args + 1, argCount - 1, result);
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Invoke a script callback to get a script NPObject. Then call a method on the
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// script NPObject passing it a freshly created NPObject.
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testScriptObjectInvoke(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_STRING(args[0]) || !NPVARIANT_IS_STRING(args[1]))
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Arg1 is the name of the callback
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* callbackString = createCStringFromNPVariant(&args[0]);
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString);
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(callbackString);
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invoke a callback that returns a script object
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant object_result;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, &args[1], 1, &object_result);
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Script object returned
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* script_object = object_result.value.objectValue;
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Arg2 is the name of the method to be called on the script object
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPUTF8* object_mehod_string = createCStringFromNPVariant(&args[1]);
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier object_method = browser->getstringidentifier(object_mehod_string);
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(object_mehod_string);
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Create a fresh NPObject to be passed as an argument
856591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    NPObject* object_arg = browser->createobject(obj->npp, obj->header._class);
857591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant invoke_args[1];
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OBJECT_TO_NPVARIANT(object_arg, invoke_args[0]);
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invoke the script method
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant object_method_result;
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->invoke(obj->npp, script_object, object_method, invoke_args, 1, &object_method_result);
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releasevariantvalue(&object_result);
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPVARIANT_IS_OBJECT(object_method_result)) {
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Now return the callbacks return value back to our caller.
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // BUG 897451: This should be the same as the
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // windowScriptObject, but its not (in Chrome) - or at least, it
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // has a different refcount. This means Chrome will delete the
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // object before returning it and the calling JS gets a garbage
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // value.  Firefox handles it fine.
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(NPVARIANT_TO_OBJECT(object_method_result), *result);
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&object_method_result);
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VOID_TO_NPVARIANT(*result);
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(object_arg);
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Helper function to notify the layout test controller that the test completed.
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void notifyTestCompletion(NPP npp, NPObject* object)
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant result;
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPString script;
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    script.UTF8Characters = "javascript:window.testRunner.notifyDone();";
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    script.UTF8Length = strlen("javascript:window.testRunner.notifyDone();");
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->evaluate(npp, object, &script, &result);
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releasevariantvalue(&result);
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool testDocumentOpen(NPP npp)
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier documentId = browser->getstringidentifier("document");
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier openId = browser->getstringidentifier("open");
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowObject = 0;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(npp, NPNVWindowNPObject, &windowObject);
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!windowObject)
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant docVariant;
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getproperty(npp, windowObject, documentId, &docVariant);
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (docVariant.type != NPVariantType_Object) {
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(windowObject);
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* documentObject = NPVARIANT_TO_OBJECT(docVariant);
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant openArgs[2];
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT("text/html", openArgs[0]);
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT("_blank", openArgs[1]);
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant result;
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!browser->invoke(npp, documentObject, openId, openArgs, 2, &result)) {
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(windowObject);
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(documentObject);
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(documentObject);
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.type != NPVariantType_Object) {
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(windowObject);
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&result);
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginLogWithWindowObject(windowObject, npp, "PLUGIN: DOCUMENT OPEN SUCCESS");
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyTestCompletion(npp, result.value.objectValue);
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(result.value.objectValue);
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(windowObject);
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool testWindowOpen(NPP npp)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier openId = browser->getstringidentifier("open");
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowObject = 0;
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(npp, NPNVWindowNPObject, &windowObject);
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!windowObject)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant openArgs[2];
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT("about:blank", openArgs[0]);
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT("_blank", openArgs[1]);
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant result;
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!browser->invoke(npp, windowObject, openId, openArgs, 2, &result)) {
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(windowObject);
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.type != NPVariantType_Object) {
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(windowObject);
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&result);
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluginLogWithWindowObject(windowObject, npp, "PLUGIN: WINDOW OPEN SUCCESS");
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyTestCompletion(npp, result.value.objectValue);
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(result.value.objectValue);
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(windowObject);
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testSetStatus(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char* message = 0;
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount && NPVARIANT_IS_STRING(args[0])) {
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPString statusString = NPVARIANT_TO_STRING(args[0]);
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        message = toCString(statusString);
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
98002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->status(obj->npp, message);
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(message);
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool testResizeTo(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowObject;
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPERR_NO_ERROR != browser->getvalue(obj->npp, NPNVWindowNPObject, &windowObject))
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant callResult;
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->invoke(obj->npp, windowObject, browser->getstringidentifier("resizePlugin"), args, argCount, &callResult))
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&callResult);
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Force layout.
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->getproperty(obj->npp, windowObject, browser->getstringidentifier("pageYOffset"), &callResult))
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&callResult);
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool normalizeOverride(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(*result);
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowObject;
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (NPERR_NO_ERROR != browser->getvalue(obj->npp, NPNVWindowNPObject, &windowObject))
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant callResult;
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->invoke(obj->npp, windowObject, browser->getstringidentifier("pluginCallback"), args, argCount, &callResult))
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&callResult);
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool invalidateRect(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 4)
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPRect rect;
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect.left = static_cast<int>(NPVARIANT_TO_DOUBLE(args[0]));
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect.top = static_cast<int>(NPVARIANT_TO_DOUBLE(args[1]));
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect.right = static_cast<int>(NPVARIANT_TO_DOUBLE(args[2]));
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect.bottom = static_cast<int>(NPVARIANT_TO_DOUBLE(args[3]));
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->invalidaterect(obj->npp, &rect);
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool objectsAreSame(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result)
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (argCount != 2 || !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_OBJECT(args[1]))
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(NPVARIANT_TO_OBJECT(args[0]) == NPVARIANT_TO_OBJECT(args[1]), *result);
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool pluginInvoke(NPObject* header, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result)
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* plugin = reinterpret_cast<PluginObject*>(header);
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_CALLBACK_METHOD])
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testCallback(plugin, args, argCount, result);
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_CALLBACK_METHOD_RETURN])
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testCallbackReturn(plugin, args, argCount, result);
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_GETURL])
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getURL(plugin, args, argCount, result);
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_DOM_ACCESS])
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testDOMAccess(plugin, args, argCount, result);
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_GET_URL_NOTIFY])
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getURLNotify(plugin, args, argCount, result);
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_INVOKE_DEFAULT])
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testInvokeDefault(plugin, args, argCount, result);
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_ENUMERATE])
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testEnumerate(plugin, args, argCount, result);
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_DESTROY_STREAM])
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return destroyStream(plugin, args, argCount, result);
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_GETINTIDENTIFIER])
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testGetIntIdentifier(plugin, args, argCount, result);
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_EVALUATE])
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testEvaluate(plugin, args, argCount, result);
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_GET_PROPERTY])
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testGetProperty(plugin, args, argCount, result);
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_GET_PROPERTY_RETURN_VALUE])
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testGetPropertyReturnValue(plugin, args, argCount, result);
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_HAS_PROPERTY])
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testHasProperty(plugin, args, argCount, result);
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_HAS_METHOD])
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testHasMethod(plugin, args, argCount, result);
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_IDENTIFIER_TO_STRING])
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testIdentifierToString(plugin, args, argCount, result);
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_IDENTIFIER_TO_INT])
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testIdentifierToInt(plugin, args, argCount, result);
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_PASS_TEST_OBJECT])
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testPassTestObject(plugin, args, argCount, result);
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_POSTURL_FILE])
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testPostURLFile(plugin, args, argCount, result);
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_CONSTRUCT])
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testConstruct(plugin, args, argCount, result);
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_SCRIPT_OBJECT_INVOKE])
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testScriptObjectInvoke(plugin, args, argCount, result);
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_THROW_EXCEPTION_METHOD]) {
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->setexception(header, "plugin object testThrowException SUCCESS");
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_FAIL_METHOD]) {
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* windowScriptObject;
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->getvalue(plugin->npp, NPNVWindowNPObject, &windowScriptObject);
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->invoke(plugin->npp, windowScriptObject, name, args, argCount, result);
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_CLONE_OBJECT]) {
1099591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        NPObject* new_object = browser->createobject(plugin->npp, plugin->header._class);
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(new_object->referenceCount == 1);
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(new_object, *result);
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_CREATE_TEST_OBJECT]) {
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NPObject* testObject = browser->createobject(plugin->npp, getTestClass());
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(testObject->referenceCount == 1);
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(testObject, *result);
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_DESTROY_NULL_STREAM])
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return destroyNullStream(plugin, args, argCount, result);
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_RELOAD_PLUGINS_NO_PAGES]) {
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->reloadplugins(false);
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_RELOAD_PLUGINS_AND_PAGES]) {
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->reloadplugins(true);
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_GET_BROWSER_PROPERTY]) {
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->getproperty(plugin->npp, NPVARIANT_TO_OBJECT(args[0]), stringVariantToIdentifier(args[1]), result);
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_SET_BROWSER_PROPERTY]) {
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->setproperty(plugin->npp, NPVARIANT_TO_OBJECT(args[0]), stringVariantToIdentifier(args[1]), &args[2]);
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_REMEMBER]) {
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (plugin->rememberedObject)
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            browser->releaseobject(plugin->rememberedObject);
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plugin->rememberedObject = NPVARIANT_TO_OBJECT(args[0]);
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->retainobject(plugin->rememberedObject);
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        VOID_TO_NPVARIANT(*result);
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_GET_REMEMBERED_OBJECT]) {
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(plugin->rememberedObject);
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->retainobject(plugin->rememberedObject);
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(plugin->rememberedObject, *result);
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_GET_AND_FORGET_REMEMBERED_OBJECT]) {
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(plugin->rememberedObject);
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(plugin->rememberedObject, *result);
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        plugin->rememberedObject = 0;
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_REF_COUNT]) {
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint32_t refCount = NPVARIANT_TO_OBJECT(args[0])->referenceCount;
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        INT32_TO_NPVARIANT(refCount, *result);
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_SET_STATUS])
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testSetStatus(plugin, args, argCount, result);
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_RESIZE_TO])
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return testResizeTo(plugin, args, argCount, result);
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_NORMALIZE])
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return normalizeOverride(plugin, args, argCount, result);
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_INVALIDATE_RECT])
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return invalidateRect(plugin, args, argCount, result);
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_OBJECTS_ARE_SAME])
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return objectsAreSame(plugin, args, argCount, result);
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == pluginMethodIdentifiers[ID_TEST_DELETE_WITHIN_INVOKE]) {
1164591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        NPObject* newObject = browser->createobject(plugin->npp, plugin->header._class);
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        OBJECT_TO_NPVARIANT(newObject, *result);
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        callDeletePlugin(header, name, pluginMethodIdentifiers[ID_TEST_DELETE_WITHIN_INVOKE]);
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void pluginInvalidate(NPObject* header)
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* plugin = reinterpret_cast<PluginObject*>(header);
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    plugin->testObject = 0;
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    plugin->rememberedObject = 0;
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NPObject *pluginAllocate(NPP npp, NPClass *theClass)
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* newInstance = (PluginObject*)malloc(sizeof(PluginObject));
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!identifiersInitialized) {
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        identifiersInitialized = true;
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        initializeIdentifiers();
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->pluginTest = 0;
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->npp = npp;
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->testObject = browser->createobject(npp, getTestClass());
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->rememberedObject = 0;
11921fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->eventLogging = false;
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->onStreamLoad = 0;
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->onStreamDestroy = 0;
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->onDestroy = 0;
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->onURLNotify = 0;
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->onSetWindow = 0;
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->onPaintEvent = 0;
11991fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->logDestroy = false;
12001fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->logSetWindow = false;
12011fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->returnErrorFromNewStream = false;
12021fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->returnNegativeOneFromWrite = false;
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->stream = 0;
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->firstUrl = 0;
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->firstHeaders = 0;
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->lastUrl = 0;
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->lastHeaders = 0;
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12101fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->testGetURLOnDestroy = false;
12111fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->testWindowOpen = false;
12121fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->testKeyboardFocusForPlugins = false;
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12141fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    newInstance->mouseDownForEvaluateScript = false;
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newInstance->evaluateScriptOnMouseDownOrKeyDown = 0;
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (NPObject*)newInstance;
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void pluginDeallocate(NPObject* header)
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PluginObject* plugin = reinterpret_cast<PluginObject*>(header);
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete plugin->pluginTest;
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (plugin->testObject)
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(plugin->testObject);
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (plugin->rememberedObject)
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releaseobject(plugin->rememberedObject);
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(plugin->firstUrl);
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(plugin->firstHeaders);
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(plugin->lastUrl);
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(plugin->lastHeaders);
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(plugin);
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void handleCallback(PluginObject* object, const char *url, NPReason reason, void *notifyData)
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    assert(object);
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant args[2];
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(object->npp, NPNVWindowNPObject, &windowScriptObject);
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier callbackIdentifier = notifyData;
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    INT32_TO_NPVARIANT(reason, args[0]);
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char* strHdr = 0;
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (object->firstUrl && object->firstHeaders && object->lastUrl && object->lastHeaders) {
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Format expected by JavaScript validator: four fields separated by \n\n:
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // First URL; first header block; last URL; last header block.
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Note that header blocks already end with \n due to how NPStream::headers works.
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int len = strlen(object->firstUrl) + 2
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            + strlen(object->firstHeaders) + 1
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            + strlen(object->lastUrl) + 2
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            + strlen(object->lastHeaders) + 1;
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strHdr = (char*)malloc(len + 1);
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        snprintf(strHdr, len + 1, "%s\n\n%s\n%s\n\n%s\n",
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 object->firstUrl, object->firstHeaders, object->lastUrl, object->lastHeaders);
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        STRINGN_TO_NPVARIANT(strHdr, len, args[1]);
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NULL_TO_NPVARIANT(args[1]);
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant browserResult;
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->invoke(object->npp, windowScriptObject, callbackIdentifier, args, 2, &browserResult))
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&browserResult);
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    free(strHdr);
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void notifyStream(PluginObject* object, const char *url, const char *headers)
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!object->firstUrl) {
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (url)
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            object->firstUrl = strdup(url);
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (headers)
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            object->firstHeaders = strdup(headers);
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        free(object->lastUrl);
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        free(object->lastHeaders);
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        object->lastUrl = (url ? strdup(url) : 0);
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        object->lastHeaders = (headers ? strdup(headers) : 0);
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void testNPRuntime(NPP npp)
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPObject* windowScriptObject;
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->getvalue(npp, NPNVWindowNPObject, &windowScriptObject);
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invoke
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPIdentifier testNPInvoke = browser->getstringidentifier("testNPInvoke");
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant args[7];
129502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VOID_TO_NPVARIANT(args[0]);
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NULL_TO_NPVARIANT(args[1]);
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BOOLEAN_TO_NPVARIANT(true, args[2]);
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    INT32_TO_NPVARIANT(242, args[3]);
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOUBLE_TO_NPVARIANT(242.242, args[4]);
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    STRINGZ_TO_NPVARIANT("Hello, World", args[5]);
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OBJECT_TO_NPVARIANT(windowScriptObject, args[6]);
130302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NPVariant result;
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (browser->invoke(npp, windowScriptObject, testNPInvoke, args, 7, &result))
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        browser->releasevariantvalue(&result);
130702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    browser->releaseobject(windowScriptObject);
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1310