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