12bde8e466a4451c7319e3a072d118917957d6554Steve Block/* 22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved. 32bde8e466a4451c7319e3a072d118917957d6554Steve Block * 42bde8e466a4451c7319e3a072d118917957d6554Steve Block * Redistribution and use in source and binary forms, with or without 52bde8e466a4451c7319e3a072d118917957d6554Steve Block * modification, are permitted provided that the following conditions 62bde8e466a4451c7319e3a072d118917957d6554Steve Block * are met: 72bde8e466a4451c7319e3a072d118917957d6554Steve Block * 1. Redistributions of source code must retain the above copyright 82bde8e466a4451c7319e3a072d118917957d6554Steve Block * notice, this list of conditions and the following disclaimer. 92bde8e466a4451c7319e3a072d118917957d6554Steve Block * 2. Redistributions in binary form must reproduce the above copyright 102bde8e466a4451c7319e3a072d118917957d6554Steve Block * notice, this list of conditions and the following disclaimer in the 112bde8e466a4451c7319e3a072d118917957d6554Steve Block * documentation and/or other materials provided with the distribution. 122bde8e466a4451c7319e3a072d118917957d6554Steve Block * 132bde8e466a4451c7319e3a072d118917957d6554Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 142bde8e466a4451c7319e3a072d118917957d6554Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 152bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 162bde8e466a4451c7319e3a072d118917957d6554Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 172bde8e466a4451c7319e3a072d118917957d6554Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 182bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 192bde8e466a4451c7319e3a072d118917957d6554Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 202bde8e466a4451c7319e3a072d118917957d6554Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 212bde8e466a4451c7319e3a072d118917957d6554Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 222bde8e466a4451c7319e3a072d118917957d6554Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 232bde8e466a4451c7319e3a072d118917957d6554Steve Block * THE POSSIBILITY OF SUCH DAMAGE. 242bde8e466a4451c7319e3a072d118917957d6554Steve Block */ 252bde8e466a4451c7319e3a072d118917957d6554Steve Block 262bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PluginTest.h" 272bde8e466a4451c7319e3a072d118917957d6554Steve Block 282bde8e466a4451c7319e3a072d118917957d6554Steve Blockusing namespace std; 292bde8e466a4451c7319e3a072d118917957d6554Steve Block 302bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic bool wasShutdownCalled = false; 312bde8e466a4451c7319e3a072d118917957d6554Steve Block 322bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass NPDeallocateCalledBeforeNPShutdown : public PluginTest { 332bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic: 342bde8e466a4451c7319e3a072d118917957d6554Steve Block NPDeallocateCalledBeforeNPShutdown(NPP npp, const string& identifier) 352bde8e466a4451c7319e3a072d118917957d6554Steve Block : PluginTest(npp, identifier) 362bde8e466a4451c7319e3a072d118917957d6554Steve Block { 372bde8e466a4451c7319e3a072d118917957d6554Steve Block } 382bde8e466a4451c7319e3a072d118917957d6554Steve Block 392bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate: 402bde8e466a4451c7319e3a072d118917957d6554Steve Block // This is the test object. 412bde8e466a4451c7319e3a072d118917957d6554Steve Block class TestObject : public Object<TestObject> { 422bde8e466a4451c7319e3a072d118917957d6554Steve Block public: 432bde8e466a4451c7319e3a072d118917957d6554Steve Block ~TestObject() 442bde8e466a4451c7319e3a072d118917957d6554Steve Block { 452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (wasShutdownCalled) 462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch indicateTestFailure(); 472bde8e466a4451c7319e3a072d118917957d6554Steve Block } 482bde8e466a4451c7319e3a072d118917957d6554Steve Block }; 492bde8e466a4451c7319e3a072d118917957d6554Steve Block 502bde8e466a4451c7319e3a072d118917957d6554Steve Block // This is the scriptable object. It has a single "testObject" property. 512bde8e466a4451c7319e3a072d118917957d6554Steve Block class ScriptableObject : public Object<ScriptableObject> { 522bde8e466a4451c7319e3a072d118917957d6554Steve Block public: 532bde8e466a4451c7319e3a072d118917957d6554Steve Block bool hasProperty(NPIdentifier propertyName) 542bde8e466a4451c7319e3a072d118917957d6554Steve Block { 552bde8e466a4451c7319e3a072d118917957d6554Steve Block return propertyName == pluginTest()->NPN_GetStringIdentifier("testObject"); 562bde8e466a4451c7319e3a072d118917957d6554Steve Block } 572bde8e466a4451c7319e3a072d118917957d6554Steve Block 582bde8e466a4451c7319e3a072d118917957d6554Steve Block bool getProperty(NPIdentifier propertyName, NPVariant* result) 592bde8e466a4451c7319e3a072d118917957d6554Steve Block { 602bde8e466a4451c7319e3a072d118917957d6554Steve Block if (propertyName != pluginTest()->NPN_GetStringIdentifier("testObject")) 612bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 622bde8e466a4451c7319e3a072d118917957d6554Steve Block 632bde8e466a4451c7319e3a072d118917957d6554Steve Block NPObject* testObject = TestObject::create(pluginTest()); 642bde8e466a4451c7319e3a072d118917957d6554Steve Block OBJECT_TO_NPVARIANT(testObject, *result); 652bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 662bde8e466a4451c7319e3a072d118917957d6554Steve Block } 672bde8e466a4451c7319e3a072d118917957d6554Steve Block }; 682bde8e466a4451c7319e3a072d118917957d6554Steve Block 692bde8e466a4451c7319e3a072d118917957d6554Steve Block virtual NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved) 702bde8e466a4451c7319e3a072d118917957d6554Steve Block { 712bde8e466a4451c7319e3a072d118917957d6554Steve Block registerNPShutdownFunction(shutdown); 722bde8e466a4451c7319e3a072d118917957d6554Steve Block 732bde8e466a4451c7319e3a072d118917957d6554Steve Block return NPERR_NO_ERROR; 742bde8e466a4451c7319e3a072d118917957d6554Steve Block } 752bde8e466a4451c7319e3a072d118917957d6554Steve Block 762bde8e466a4451c7319e3a072d118917957d6554Steve Block virtual NPError NPP_GetValue(NPPVariable variable, void *value) 772bde8e466a4451c7319e3a072d118917957d6554Steve Block { 782bde8e466a4451c7319e3a072d118917957d6554Steve Block if (variable != NPPVpluginScriptableNPObject) 792bde8e466a4451c7319e3a072d118917957d6554Steve Block return NPERR_GENERIC_ERROR; 802bde8e466a4451c7319e3a072d118917957d6554Steve Block 812bde8e466a4451c7319e3a072d118917957d6554Steve Block *(NPObject**)value = ScriptableObject::create(this); 822bde8e466a4451c7319e3a072d118917957d6554Steve Block 832bde8e466a4451c7319e3a072d118917957d6554Steve Block return NPERR_NO_ERROR; 842bde8e466a4451c7319e3a072d118917957d6554Steve Block } 852bde8e466a4451c7319e3a072d118917957d6554Steve Block 862bde8e466a4451c7319e3a072d118917957d6554Steve Block static void shutdown() 872bde8e466a4451c7319e3a072d118917957d6554Steve Block { 882bde8e466a4451c7319e3a072d118917957d6554Steve Block wasShutdownCalled = true; 892bde8e466a4451c7319e3a072d118917957d6554Steve Block } 902bde8e466a4451c7319e3a072d118917957d6554Steve Block 912bde8e466a4451c7319e3a072d118917957d6554Steve Block}; 922bde8e466a4451c7319e3a072d118917957d6554Steve Block 932bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic PluginTest::Register<NPDeallocateCalledBeforeNPShutdown> npRuntimeObjectFromDestroyedPlugin("np-deallocate-called-before-np-shutdown"); 942bde8e466a4451c7319e3a072d118917957d6554Steve Block 95