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