15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/* 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * modification, are permitted provided that the following conditions 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * are met: 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "PluginObject.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "PluginTest.h" 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <cstdlib> 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <cstring> 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_UNIX 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <X11/Xlib.h> 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <X11/Xutil.h> 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NP_NO_CARBON) && defined(QD_HEADERS_ARE_PRIVATE) && QD_HEADERS_ARE_PRIVATE 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" void GlobalToLocal(Point*); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using namespace std; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CRASH() do { \ 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *(int *)(uintptr_t)0xbbadbeef = 0; \ 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ((void(*)())0)(); /* More reliable, but doesn't say BBADBEEF */ \ 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} while(false) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static bool getEntryPointsWasCalled = false; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static bool initializeWasCalled = false; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static NPClass* pluginObjectClass = 0; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(XP_WIN) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define STDCALL __stdcall 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static inline int strcasecmp(const char* s1, const char* s2) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return _stricmp(s1, s2); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define STDCALL 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError STDCALL NP_GetEntryPoints(NPPluginFuncs *pluginFuncs); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Entry points 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError STDCALL NP_Initialize(NPNetscapeFuncs *browserFuncs 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_UNIX 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) , NPPluginFuncs *pluginFuncs 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Create a copy of the PluginObject NPClass that we can trash on shutdown. 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginObjectClass = createPluginClass(); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) initializeWasCalled = true; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(XP_WIN) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Simulate Flash and QuickTime's behavior of crashing when NP_Initialize is called before NP_GetEntryPoints. 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!getEntryPointsWasCalled) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CRASH(); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser = browserFuncs; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_UNIX 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NP_GetEntryPoints(pluginFuncs); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError STDCALL NP_GetEntryPoints(NPPluginFuncs *pluginFuncs) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) getEntryPointsWasCalled = true; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Simulate Silverlight's behavior of crashing when NP_GetEntryPoints is called before NP_Initialize. 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!initializeWasCalled) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CRASH(); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFunctions = pluginFuncs; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->size = sizeof(pluginFuncs); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->newp = NPP_New; 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->destroy = NPP_Destroy; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->setwindow = NPP_SetWindow; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->newstream = NPP_NewStream; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->destroystream = NPP_DestroyStream; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->asfile = NPP_StreamAsFile; 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->writeready = NPP_WriteReady; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->print = NPP_Print; 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->event = NPP_HandleEvent; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->urlnotify = NPP_URLNotify; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->getvalue = NPP_GetValue; 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginFuncs->setvalue = NPP_SetValue; 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void STDCALL NP_Shutdown(void) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Trash the PluginObject NPClass so that the process will deterministically 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // crash if Blink tries to call into the plugin's NPObjects after unloading 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // it, rather than relying on OS-specific DLL unload behaviour. 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note that we leak the NPClass copy, to act as a guard for the lifetime of 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the process. 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memset(pluginObjectClass, 0xf00dbeef, sizeof(NPClass)); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginTest::NP_Shutdown(); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void executeScript(const PluginObject* obj, const char* script); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved) 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPEventModel eventModel; 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Always turn on the CG model 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPBool supportsCoreGraphics; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser->getvalue(instance, NPNVsupportsCoreGraphicsBool, &supportsCoreGraphics) != NPERR_NO_ERROR) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supportsCoreGraphics = false; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!supportsCoreGraphics) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_INCOMPATIBLE_VERSION_ERROR; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPDrawingModel drawingModelToUse = NPDrawingModelCoreGraphics; 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPBool supportsCoreAnimation; 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser->getvalue(instance, NPNVsupportsCoreAnimationBool, &supportsCoreAnimation) != NPERR_NO_ERROR) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supportsCoreAnimation = false; 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NP_NO_CARBON 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPBool supportsCarbon = false; 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPBool supportsCocoa = false; 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NP_NO_CARBON 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A browser that doesn't know about NPNVsupportsCarbonBool is one that only supports Carbon event model. 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser->getvalue(instance, NPNVsupportsCarbonBool, &supportsCarbon) != NPERR_NO_ERROR) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supportsCarbon = true; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser->getvalue(instance, NPNVsupportsCocoaBool, &supportsCocoa) != NPERR_NO_ERROR) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supportsCocoa = false; 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (supportsCocoa) { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) eventModel = NPEventModelCocoa; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NP_NO_CARBON 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (supportsCarbon) { 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) eventModel = NPEventModelCarbon; 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_INCOMPATIBLE_VERSION_ERROR; 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->setvalue(instance, NPPVpluginEventModel, (void *)eventModel); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // XP_MACOSX 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = (PluginObject*)browser->createobject(instance, pluginObjectClass); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) instance->pdata = obj; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventModel = eventModel; 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->coreAnimationLayer = 0; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // XP_MACOSX 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) obj->alwaysFilterEvents = false; 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string testIdentifier; 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* onNewScript = 0; 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < argc; i++) { 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (strcasecmp(argn[i], "test") == 0) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) testIdentifier = argv[i]; 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (strcasecmp(argn[i], "onstreamload") == 0 && !obj->onStreamLoad) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->onStreamLoad = base::strdup(argv[i]); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "onStreamDestroy") == 0 && !obj->onStreamDestroy) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->onStreamDestroy = base::strdup(argv[i]); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "onURLNotify") == 0 && !obj->onURLNotify) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->onURLNotify = base::strdup(argv[i]); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "src") == 0 && 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) strcasecmp(argv[i], "data:application/x-webkit-test-netscape,returnerrorfromnewstream") == 0) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->returnErrorFromNewStream = true; 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "src") == 0 && 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) strcasecmp(argv[i], "data:application/x-webkit-test-netscape,alertwhenloaded") == 0) 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "alert('Plugin Loaded!')"); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "src") == 0 && 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) strcasecmp(argv[i], "data:application/x-webkit-test-netscape,logifloaded") == 0) { 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int j = 0; j < argc; j++) { 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (strcasecmp(argn[j], "log") == 0) { 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int length = 26 + strlen(argv[j]) + 1; 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char* buffer = (char*) malloc(length); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) snprintf(buffer, length, "xWebkitTestNetscapeLog('%s')", argv[j]); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, buffer); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(buffer); 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (strcasecmp(argn[i], "onSetWindow") == 0 && !obj->onSetWindow) 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->onSetWindow = base::strdup(argv[i]); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "onNew") == 0 && !onNewScript) 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) onNewScript = argv[i]; 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "onPaintEvent") == 0 && !obj->onPaintEvent) 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->onPaintEvent = base::strdup(argv[i]); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "logfirstsetwindow") == 0) 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->logSetWindow = true; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "testnpruntime") == 0) 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) testNPRuntime(instance); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "logSrc") == 0) { 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < argc; i++) 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (strcasecmp(argn[i], "src") == 0) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "src: %s", argv[i]); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (strcasecmp(argn[i], "cleardocumentduringnew") == 0) 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "document.body.innerHTML = ''"); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (!strcasecmp(argn[i], "ondestroy")) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->onDestroy = base::strdup(argv[i]); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "testwindowopen") == 0) 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testWindowOpen = true; 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (strcasecmp(argn[i], "drawingmodel") == 0) { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* value = argv[i]; 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (strcasecmp(value, "coreanimation") == 0) { 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (supportsCoreAnimation) 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drawingModelToUse = NPDrawingModelCoreAnimation; 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_INCOMPATIBLE_VERSION_ERROR; 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (strcasecmp(value, "coregraphics") == 0) { 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (supportsCoreGraphics) 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drawingModelToUse = NPDrawingModelCoreGraphics; 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_INCOMPATIBLE_VERSION_ERROR; 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_INCOMPATIBLE_VERSION_ERROR; 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (strcasecmp(argn[i], "testGetURLOnDestroy") == 0) { 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(XP_WIN) 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: When https://bugs.webkit.org/show_bug.cgi?id=41831 is fixed, this #ifdef can be removed. 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testGetURLOnDestroy = TRUE; 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!strcasecmp(argn[i], "src") && strstr(argv[i], "plugin-document-has-focus.pl")) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testKeyboardFocusForPlugins = true; 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (!strcasecmp(argn[i], "evaluatescript")) { 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char* script = argv[i]; 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (script == strstr(script, "mouse::")) { 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->mouseDownForEvaluateScript = true; 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->evaluateScriptOnMouseDownOrKeyDown = base::strdup(script + sizeof("mouse::") - 1); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (script == strstr(script, "key::")) { 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->evaluateScriptOnMouseDownOrKeyDown = base::strdup(script + sizeof("key::") - 1); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // When testing evaluate script on mouse-down or key-down, allow event logging to handle events. 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventLogging = true; 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!strcasecmp(argn[i], "windowedPlugin")) { 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void* windowed = 0; 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!strcasecmp(argv[i], "false") || !strcasecmp(argv[i], "0")) 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) windowed = 0; 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (!strcasecmp(argv[i], "true") || !strcasecmp(argv[i], "1")) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) windowed = reinterpret_cast<void*>(1); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->setvalue(instance, NPPVpluginWindowBool, windowed); 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if (!strcasecmp(argn[i], "alwaysFilterEvents")) { 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) obj->alwaysFilterEvents = true; 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->setvalue(instance, NPPVpluginDrawingModel, (void *)drawingModelToUse); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (drawingModelToUse == NPDrawingModelCoreAnimation) 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->coreAnimationLayer = createCoreAnimationLayer(); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->pluginTest = PluginTest::create(instance, testIdentifier); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!obj->pluginTest) { 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "NPP_New: Could not find a test named \"%s\", maybe its .cpp file wasn't added to the build system?", testIdentifier.c_str()); 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_GENERIC_ERROR; 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (onNewScript) 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, onNewScript); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_New(pluginType, mode, argc, argn, argv, saved); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_Destroy(NPP instance, NPSavedData **save) 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj) { 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testGetURLOnDestroy) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->geturlnotify(obj->npp, "about:blank", "", 0); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onDestroy) { 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onDestroy); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->onDestroy); 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onStreamLoad) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->onStreamLoad); 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onStreamDestroy) 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->onStreamDestroy); 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onURLNotify) 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->onURLNotify); 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onSetWindow) 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->onSetWindow); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onPaintEvent) 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->onPaintEvent); 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown) 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) free(obj->evaluateScriptOnMouseDownOrKeyDown); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->logDestroy) 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "NPP_Destroy"); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->coreAnimationLayer) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CFRelease(obj->coreAnimationLayer); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->pluginTest) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->pluginTest->NPP_Destroy(save); 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->releaseobject(&obj->header); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_SetWindow(NPP instance, NPWindow *window) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj) { 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->lastWindow = *window; 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->logSetWindow) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "NPP_SetWindow: %d %d", (int)window->width, (int)window->height); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->logSetWindow = false; 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "testRunner.notifyDone();"); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onSetWindow) 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onSetWindow); 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testWindowOpen) { 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) testWindowOpen(instance); 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testWindowOpen = false; 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testKeyboardFocusForPlugins) { 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventLogging = true; 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "eventSender.keyDown('A');"); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_SetWindow(window); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void executeScript(const PluginObject* obj, const char* script) 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPObject *windowScriptObject; 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPString npScript; 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) npScript.UTF8Characters = script; 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) npScript.UTF8Length = strlen(script); 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant browserResult; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->evaluate(obj->npp, windowScriptObject, &npScript, &browserResult); 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->releasevariantvalue(&browserResult); 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream, NPBool seekable, uint16_t *stype) 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->stream = stream; 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *stype = NP_NORMAL; 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->returnErrorFromNewStream) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_GENERIC_ERROR; 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser->version >= NPVERS_HAS_RESPONSE_HEADERS) 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) notifyStream(obj, stream->url, stream->headers); 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onStreamLoad) 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onStreamLoad); 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_NewStream(type, stream, seekable, stype); 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_DestroyStream(NPP instance, NPStream *stream, NPReason reason) 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = (PluginObject*)instance->pdata; 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onStreamDestroy) { 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPObject* windowObject = 0; 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPError error = browser->getvalue(instance, NPNVWindowNPObject, &windowObject); 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error == NPERR_NO_ERROR) { 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant onStreamDestroyVariant; 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser->getproperty(instance, windowObject, browser->getstringidentifier(obj->onStreamDestroy), &onStreamDestroyVariant)) { 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (NPVARIANT_IS_OBJECT(onStreamDestroyVariant)) { 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPObject* onStreamDestroyFunction = NPVARIANT_TO_OBJECT(onStreamDestroyVariant); 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant reasonVariant; 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INT32_TO_NPVARIANT(reason, reasonVariant); 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant result; 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->invokeDefault(instance, onStreamDestroyFunction, &reasonVariant, 1, &result); 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->releasevariantvalue(&result); 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->releasevariantvalue(&onStreamDestroyVariant); 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->releaseobject(windowObject); 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_DestroyStream(stream, reason); 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t NPP_WriteReady(NPP instance, NPStream *stream) 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = (PluginObject*)instance->pdata; 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_WriteReady(stream); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t NPP_Write(NPP instance, NPStream *stream, int32_t offset, int32_t len, void *buffer) 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = (PluginObject*)instance->pdata; 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->returnNegativeOneFromWrite) 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return -1; 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_Write(stream, offset, len, buffer); 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NPP_StreamAsFile(NPP instance, NPStream *stream, const char *fname) 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NPP_Print(NPP instance, NPPrint *platformPrint) 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NP_NO_CARBON 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int16_t handleEventCarbon(NPP instance, PluginObject* obj, EventRecord* event) 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Point pt = { event->where.v, event->where.h }; 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (event->what) { 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case nullEvent: 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // these are delivered non-deterministically, don't log. 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case mouseDown: 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) { 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if __clang__ 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#pragma clang diagnostic push 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#pragma clang diagnostic ignored "-Wdeprecated-declarations" 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GlobalToLocal(&pt); 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if __clang__ 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#pragma clang diagnostic pop 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseDown at (%d, %d)", pt.h, pt.v); 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && obj->mouseDownForEvaluateScript) 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case mouseUp: 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) { 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if __clang__ 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#pragma clang diagnostic push 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#pragma clang diagnostic ignored "-Wdeprecated-declarations" 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GlobalToLocal(&pt); 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if __clang__ 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#pragma clang diagnostic pop 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseUp at (%d, %d)", pt.h, pt.v); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case keyDown: 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyDown '%c'", (char)(event->message & 0xFF)); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && !obj->mouseDownForEvaluateScript) 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case keyUp: 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyUp '%c'", (char)(event->message & 0xFF)); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testKeyboardFocusForPlugins) { 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventLogging = false; 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testKeyboardFocusForPlugins = FALSE; 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "testRunner.notifyDone();"); 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case autoKey: 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "autoKey '%c'", (char)(event->message & 0xFF)); 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case updateEvt: 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "updateEvt"); 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case diskEvt: 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "diskEvt"); 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case activateEvt: 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "activateEvt"); 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case osEvt: 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!obj->eventLogging) 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printf("PLUGIN: osEvt - "); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch ((event->message & 0xFF000000) >> 24) { 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case suspendResumeMessage: 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printf("%s\n", (event->message & 0x1) ? "resume" : "suspend"); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case mouseMovedMessage: 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printf("mouseMoved\n"); 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printf("%08lX\n", event->message); 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case kHighLevelEvent: 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "kHighLevelEvent"); 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NPAPI events 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPEventType_GetFocusEvent: 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "getFocusEvent"); 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPEventType_LoseFocusEvent: 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "loseFocusEvent"); 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPEventType_AdjustCursorEvent: 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "adjustCursorEvent"); 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "event %d", event->what); 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int16_t handleEventCocoa(NPP instance, PluginObject* obj, NPCocoaEvent* event) 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (event->type) { 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventWindowFocusChanged: 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventFocusChanged: 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) { 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (event->data.focus.hasFocus) 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "getFocusEvent"); 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "loseFocusEvent"); 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventDrawRect: { 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onPaintEvent) 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onPaintEvent); 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventKeyDown: 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging && event->data.key.characters) 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyDown '%c'", CFStringGetCharacterAtIndex(reinterpret_cast<CFStringRef>(event->data.key.characters), 0)); 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && !obj->mouseDownForEvaluateScript) 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventKeyUp: 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging && event->data.key.characters) { 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyUp '%c'", CFStringGetCharacterAtIndex(reinterpret_cast<CFStringRef>(event->data.key.characters), 0)); 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testKeyboardFocusForPlugins) { 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventLogging = false; 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testKeyboardFocusForPlugins = FALSE; 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "testRunner.notifyDone();"); 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventFlagsChanged: 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventMouseDown: 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) { 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseDown at (%d, %d)", 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (int)event->data.mouse.pluginX, 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (int)event->data.mouse.pluginY); 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && obj->mouseDownForEvaluateScript) 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventMouseUp: 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) { 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseUp at (%d, %d)", 6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (int)event->data.mouse.pluginX, 6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (int)event->data.mouse.pluginY); 6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventMouseMoved: 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventMouseEntered: 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventMouseExited: 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventMouseDragged: 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventScrollWheel: 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NPCocoaEventTextInput: 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // XP_MACOSX 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_UNIX 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static char keyEventToChar(XKeyEvent* event) 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char c = ' '; 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XLookupString(event, &c, sizeof(c), 0, 0); 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return c; 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int16_t handleEventX11(NPP instance, PluginObject* obj, XEvent* event) 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (event->type) { 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ButtonPress: 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseDown at (%d, %d)", event->xbutton.x, event->xbutton.y); 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && obj->mouseDownForEvaluateScript) 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ButtonRelease: 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseUp at (%d, %d)", event->xbutton.x, event->xbutton.y); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case KeyPress: 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: extract key code 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyDown '%c'", keyEventToChar(&event->xkey)); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && !obj->mouseDownForEvaluateScript) 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case KeyRelease: 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: extract key code 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyUp '%c'", keyEventToChar(&event->xkey)); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testKeyboardFocusForPlugins) { 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventLogging = false; 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testKeyboardFocusForPlugins = false; 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "testRunner.notifyDone();"); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GraphicsExpose: 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "updateEvt"); 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onPaintEvent) 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onPaintEvent); 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NPAPI events 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case FocusIn: 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "getFocusEvent"); 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case FocusOut: 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "loseFocusEvent"); 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case EnterNotify: 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LeaveNotify: 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case MotionNotify: 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "event %d", event->type); 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fflush(stdout); 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // XP_UNIX 7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_WIN 7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int16_t handleEventWin(NPP instance, PluginObject* obj, NPEvent* event) 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (event->event) { 7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_PAINT: 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onPaintEvent) 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onPaintEvent); 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_KEYDOWN: 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyDown '%c'", event->wParam); 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && !obj->mouseDownForEvaluateScript) 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_CHAR: 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_KEYUP: 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "keyUp '%c'", event->wParam); 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->testKeyboardFocusForPlugins) { 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->eventLogging = false; 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) obj->testKeyboardFocusForPlugins = FALSE; 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, "testRunner.notifyDone();"); 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_LBUTTONDOWN: 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_MBUTTONDOWN: 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_RBUTTONDOWN: 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseDown at (%d, %d)", LOWORD(event->lParam), HIWORD(event->lParam)); 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->evaluateScriptOnMouseDownOrKeyDown && obj->mouseDownForEvaluateScript) 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->evaluateScriptOnMouseDownOrKeyDown); 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_LBUTTONUP: 7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_MBUTTONUP: 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_RBUTTONUP: 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "mouseUp at (%d, %d)", LOWORD(event->lParam), HIWORD(event->lParam)); 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_SETFOCUS: 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "getFocusEvent"); 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_KILLFOCUS: 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->eventLogging) 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pluginLog(instance, "loseFocusEvent"); 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // XP_WIN 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int16_t NPP_HandleEvent(NPP instance, void *event) 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->pluginTest->NPP_HandleEvent(event) == 1) 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 1; 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int16_t ret = 0; 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NP_NO_CARBON 795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) assert(obj->eventModel == NPEventModelCarbon || 796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) obj->eventModel == NPEventModelCocoa); 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (obj->eventModel == NPEventModelCocoa) 798effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ret = handleEventCocoa(instance, obj, static_cast<NPCocoaEvent*>(event)); 799effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch else if (obj->eventModel == NPEventModelCarbon) 800effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ret = handleEventCarbon(instance, obj, static_cast<EventRecord*>(event)); 801effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else 802effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch assert(obj->eventModel == NPEventModelCocoa); 803effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ret = handleEventCocoa(instance, obj, static_cast<NPCocoaEvent*>(event)); 804effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#elif defined(XP_UNIX) 806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ret = handleEventX11(instance, obj, static_cast<XEvent*>(event)); 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#elif defined(XP_WIN) 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ret = handleEventWin(instance, obj, static_cast<NPEvent*>(event)); 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: Implement for other platforms. 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return obj->alwaysFilterEvents; 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // XP_MACOSX 813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (ret == 0 && obj->alwaysFilterEvents) 815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return 1; 816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return ret; 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NPP_URLNotify(NPP instance, const char *url, NPReason reason, void *notifyData) 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->pluginTest->NPP_URLNotify(url, reason, notifyData)) 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->onURLNotify) 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) executeScript(obj, obj->onURLNotify); 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handleCallback(obj, url, reason, notifyData); 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_UNIX 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (variable == NPPVpluginNameString) { 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *((char **)value) = const_cast<char*>("WebKit Test PlugIn"); 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (variable == NPPVpluginDescriptionString) { 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *((char **)value) = const_cast<char*>("Simple Netscape® plug-in that handles test content for WebKit"); 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (variable == NPPVpluginNeedsXEmbed) { 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *((NPBool *)value) = true; 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!instance) 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_GENERIC_ERROR; 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First, check if the PluginTest object supports getting this value. 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (obj->pluginTest->NPP_GetValue(variable, value) == NPERR_NO_ERROR) 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (variable == NPPVpluginScriptableNPObject) { 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void **v = (void **)value; 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Return value is expected to be retained 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser->retainobject((NPObject *)obj); 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *v = obj; 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (variable == NPPVpluginCoreAnimationLayer) { 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!obj->coreAnimationLayer) 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_GENERIC_ERROR; 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void **v = (void **)value; 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *v = (void*)CFRetain(obj->coreAnimationLayer); 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_NO_ERROR; 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPERR_GENERIC_ERROR; 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginObject* obj = static_cast<PluginObject*>(instance->pdata); 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return obj->pluginTest->NPP_SetValue(variable, value); 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_UNIX 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* NP_GetMIMEDescription(void) 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "application/x-webkit-test-netscape:testnetscape:test netscape content;image/png:png:PNG image"; 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern "C" 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NPError NP_GetValue(NPP instance, NPPVariable variable, void* value) 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NPP_GetValue(instance, variable, value); 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 897