1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/*
6 * Copyright (C) 2010 Apple Inc. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include "PluginTest.h"
31
32#include <string.h>
33
34using namespace std;
35
36class NPRuntimeRemoveProperty : public PluginTest {
37public:
38    NPRuntimeRemoveProperty(NPP npp, const string& identifier)
39        : PluginTest(npp, identifier)
40    {
41    }
42
43private:
44    struct TestObject : Object<TestObject> {
45    public:
46        TestObject()
47            : m_lastRemovedProperty(0)
48        {
49        }
50
51        bool hasProperty(NPIdentifier propertyName)
52        {
53            if (identifierIs(propertyName, "lastRemovedProperty"))
54                return true;
55
56            return false;
57        }
58
59        bool getProperty(NPIdentifier propertyName, NPVariant* result)
60        {
61            assert(identifierIs(propertyName, "lastRemovedProperty"));
62
63            if (!m_lastRemovedProperty)
64                return false;
65
66            if (pluginTest()->NPN_IdentifierIsString(m_lastRemovedProperty)) {
67                char* lastRemovedPropertyName = pluginTest()->NPN_UTF8FromIdentifier(m_lastRemovedProperty);
68
69                STRINGZ_TO_NPVARIANT(lastRemovedPropertyName, *result);
70                return true;
71            }
72
73            int intIdentifier = pluginTest()->NPN_IntFromIdentifier(m_lastRemovedProperty);
74            DOUBLE_TO_NPVARIANT(intIdentifier, *result);
75            return true;
76        }
77
78        bool removeProperty(NPIdentifier propertyName)
79        {
80            m_lastRemovedProperty = propertyName;
81            return true;
82        }
83
84    private:
85        NPIdentifier m_lastRemovedProperty;
86    };
87
88    struct PluginObject : Object<PluginObject> {
89    public:
90        PluginObject()
91            : m_testObject(0)
92        {
93        }
94
95        virtual ~PluginObject()
96        {
97            if (m_testObject)
98                pluginTest()->NPN_ReleaseObject(m_testObject);
99        }
100
101        bool hasMethod(NPIdentifier methodName)
102        {
103            if (identifierIs(methodName, "testRemoveProperty"))
104                return true;
105
106            return false;
107        }
108
109        bool invoke(NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
110        {
111            assert(identifierIs(methodName, "testRemoveProperty"));
112
113            if (argumentCount != 2)
114                return false;
115
116            if (!NPVARIANT_IS_OBJECT(arguments[0]))
117                return false;
118
119            if (!NPVARIANT_IS_STRING(arguments[1]) && !NPVARIANT_IS_DOUBLE(arguments[1]))
120                return false;
121
122            NPIdentifier propertyName;
123            if (NPVARIANT_IS_STRING(arguments[1])) {
124                string propertyNameString(arguments[1].value.stringValue.UTF8Characters,
125                                          arguments[1].value.stringValue.UTF8Length);
126
127                propertyName = pluginTest()->NPN_GetStringIdentifier(propertyNameString.c_str());
128            } else {
129                int32_t number = static_cast<int32_t>(arguments[1].value.doubleValue);
130                propertyName = pluginTest()->NPN_GetIntIdentifier(number);
131            }
132
133            pluginTest()->NPN_RemoveProperty(NPVARIANT_TO_OBJECT(arguments[0]), propertyName);
134
135            VOID_TO_NPVARIANT(*result);
136            return true;
137        }
138
139        bool hasProperty(NPIdentifier propertyName)
140        {
141            if (identifierIs(propertyName, "testObject"))
142                return true;
143
144            return false;
145        }
146
147        bool getProperty(NPIdentifier propertyName, NPVariant* result)
148        {
149            assert(identifierIs(propertyName, "testObject"));
150
151            if (!m_testObject)
152                m_testObject = TestObject::create(pluginTest());
153
154            OBJECT_TO_NPVARIANT(pluginTest()->NPN_RetainObject(m_testObject), *result);
155            return true;
156        }
157
158    private:
159        NPObject* m_testObject;
160    };
161
162    virtual NPError NPP_GetValue(NPPVariable variable, void* value) OVERRIDE {
163        if (variable != NPPVpluginScriptableNPObject)
164            return NPERR_GENERIC_ERROR;
165
166        *(NPObject**)value = PluginObject::create(this);
167
168        return NPERR_NO_ERROR;
169    }
170
171};
172
173static PluginTest::Register<NPRuntimeRemoveProperty> npRuntimeRemoveProperty("npruntime-remove-property");
174