| Index: webkit/tools/npapi_layout_test_plugin/PluginObject.cpp
|
| ===================================================================
|
| --- webkit/tools/npapi_layout_test_plugin/PluginObject.cpp (revision 31913)
|
| +++ webkit/tools/npapi_layout_test_plugin/PluginObject.cpp (working copy)
|
| @@ -33,6 +33,60 @@
|
| #define snprintf sprintf_s
|
| #endif
|
|
|
| +static void logWithWindowObject(NPObject* windowObject, NPP instance, const char* message)
|
| +{
|
| + NPVariant consoleVariant;
|
| + if (!browser->getproperty(instance, windowObject, browser->getstringidentifier("console"), &consoleVariant)) {
|
| + fprintf(stderr, "Failed to retrieve console object while logging: %s\n", message);
|
| + return;
|
| + }
|
| +
|
| + NPObject* consoleObject = NPVARIANT_TO_OBJECT(consoleVariant);
|
| +
|
| + NPVariant messageVariant;
|
| + STRINGZ_TO_NPVARIANT(message, messageVariant);
|
| +
|
| + NPVariant result;
|
| + if (!browser->invoke(instance, consoleObject, browser->getstringidentifier("log"), &messageVariant, 1, &result)) {
|
| + fprintf(stderr, "Failed to invoke console.log while logging: %s\n", message);
|
| + browser->releaseobject(consoleObject);
|
| + return;
|
| + }
|
| +
|
| + browser->releasevariantvalue(&result);
|
| + browser->releaseobject(consoleObject);
|
| +}
|
| +
|
| +static void logWithWindowObjectVariableArgs(NPObject* windowObject, NPP instance, const char* format, ...)
|
| +{
|
| + va_list args;
|
| + va_start(args, format);
|
| + char message[2048] = "PLUGIN: ";
|
| + vsprintf(message + strlen(message), format, args);
|
| + va_end(args);
|
| +
|
| + logWithWindowObject(windowObject, instance, message);
|
| +}
|
| +
|
| +void log(NPP instance, const char* format, ...)
|
| +{
|
| + va_list args;
|
| + va_start(args, format);
|
| + char message[2048] = "PLUGIN: ";
|
| + vsprintf(message + strlen(message), format, args);
|
| + va_end(args);
|
| +
|
| + NPObject* windowObject = 0;
|
| + NPError error = browser->getvalue(instance, NPNVWindowNPObject, &windowObject);
|
| + if (error != NPERR_NO_ERROR) {
|
| + fprintf(stderr, "Failed to retrieve window object while logging: %s\n", message);
|
| + return;
|
| + }
|
| +
|
| + logWithWindowObject(windowObject, instance, message);
|
| + browser->releaseobject(windowObject);
|
| +}
|
| +
|
| static void pluginInvalidate(NPObject*);
|
| static bool pluginHasProperty(NPObject*, NPIdentifier name);
|
| static bool pluginHasMethod(NPObject*, NPIdentifier name);
|
| @@ -629,6 +683,76 @@
|
| return browser->construct(obj->npp, NPVARIANT_TO_OBJECT(args[0]), args + 1, argCount - 1, result);
|
| }
|
|
|
| +// Helper function to notify the layout test controller that the test completed.
|
| +void notifyTestCompletion(NPP npp, NPObject* object)
|
| +{
|
| + NPVariant result;
|
| + NPString script;
|
| + script.UTF8Characters = "javascript:window.layoutTestController.notifyDone();";
|
| + script.UTF8Length = strlen("javascript:window.layoutTestController.notifyDone();");
|
| + browser->evaluate(npp, object, &script, &result);
|
| + browser->releasevariantvalue(&result);
|
| +}
|
| +
|
| +bool testDocumentOpen(NPP npp)
|
| +{
|
| + NPIdentifier documentId = browser->getstringidentifier("document");
|
| + NPIdentifier openId = browser->getstringidentifier("open");
|
| +
|
| + NPObject *windowObject = NULL;
|
| + browser->getvalue(npp, NPNVWindowNPObject, &windowObject);
|
| + if (!windowObject)
|
| + return false;
|
| +
|
| + NPVariant docVariant;
|
| + browser->getproperty(npp, windowObject, documentId, &docVariant);
|
| + if (docVariant.type != NPVariantType_Object)
|
| + return false;
|
| +
|
| + NPObject *documentObject = NPVARIANT_TO_OBJECT(docVariant);
|
| +
|
| + NPVariant openArgs[2];
|
| + STRINGZ_TO_NPVARIANT("text/html", openArgs[0]);
|
| + STRINGZ_TO_NPVARIANT("_blank", openArgs[1]);
|
| +
|
| + NPVariant result;
|
| + browser->invoke(npp, documentObject, openId, openArgs, 2, &result);
|
| + browser->releaseobject(documentObject);
|
| +
|
| + if (result.type == NPVariantType_Object) {
|
| + logWithWindowObjectVariableArgs(windowObject, npp, "DOCUMENT OPEN SUCCESS");
|
| + notifyTestCompletion(npp, result.value.objectValue);
|
| + browser->releaseobject(result.value.objectValue);
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +bool testWindowOpen(NPP npp)
|
| +{
|
| + NPIdentifier openId = browser->getstringidentifier("open");
|
| +
|
| + NPObject *windowObject = NULL;
|
| + browser->getvalue(npp, NPNVWindowNPObject, &windowObject);
|
| + if (!windowObject)
|
| + return false;
|
| +
|
| + NPVariant openArgs[2];
|
| + STRINGZ_TO_NPVARIANT("about:blank", openArgs[0]);
|
| + STRINGZ_TO_NPVARIANT("_blank", openArgs[1]);
|
| +
|
| + NPVariant result;
|
| + browser->invoke(npp, windowObject, openId, openArgs, 2, &result);
|
| + if (result.type == NPVariantType_Object) {
|
| + logWithWindowObjectVariableArgs(windowObject, npp, "WINDOW OPEN SUCCESS");
|
| + notifyTestCompletion(npp, result.value.objectValue);
|
| + browser->releaseobject(result.value.objectValue);
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| static bool pluginInvoke(NPObject* header, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result)
|
| {
|
| PluginObject* plugin = reinterpret_cast<PluginObject*>(header);
|
| @@ -838,6 +962,9 @@
|
| newInstance->lastUrl = NULL;
|
| newInstance->lastHeaders = NULL;
|
|
|
| + newInstance->testDocumentOpenInDestroyStream = FALSE;
|
| + newInstance->testWindowOpen = FALSE;
|
| +
|
| return (NPObject*)newInstance;
|
| }
|
|
|
|
|