Changeset 13455 in webkit for trunk/JavaScriptCore/bindings/NP_jsobject.cpp
- Timestamp:
- Mar 23, 2006, 8:31:32 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/bindings/NP_jsobject.cpp
r13015 r13455 1 1 /* 2 * Copyright (C) 2004 Apple Computer, Inc. All rights reserved.2 * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 23 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 24 */ 25 25 26 #include "config.h" 26 #include <NP_jsobject.h> 27 28 #include <JavaScriptCore/npruntime.h> 29 #include <JavaScriptCore/c_utility.h> 30 #include <JavaScriptCore/npruntime_impl.h> 31 #include <JavaScriptCore/npruntime_priv.h> 27 #include "NP_jsobject.h" 28 29 #include "c_utility.h" 30 #include "identifier.h" 31 #include "interpreter.h" 32 #include "list.h" 33 #include "npruntime.h" 34 #include "npruntime_impl.h" 35 #include "npruntime_priv.h" 36 #include "runtime_root.h" 32 37 33 38 using namespace KJS; 34 39 using namespace KJS::Bindings; 35 40 36 37 static KJS::List listFromVariantArgs(KJS::ExecState *exec, const NPVariant *args, unsigned argCount) 38 { 39 KJS::List aList; 40 unsigned i; 41 const NPVariant *v = args; 42 43 for (i = 0; i < argCount; i++) { 44 aList.append (convertNPVariantToValue (exec, v)); 45 v++; 46 } 47 41 static List listFromVariantArgs(ExecState* exec, const NPVariant* args, unsigned argCount) 42 { 43 List aList; 44 for (unsigned i = 0; i < argCount; i++) 45 aList.append(convertNPVariantToValue(exec, &args[i])); 48 46 return aList; 49 47 } … … 54 52 } 55 53 56 static void jsDeallocate (JavaScriptObject *obj) 57 { 58 free (obj); 59 } 60 61 static NPClass _javascriptClass = { 62 1, 63 jsAllocate, 64 (NPDeallocateFunctionPtr)jsDeallocate, 65 0, 66 0, 67 0, 68 0, 69 0, 70 0, 71 0, 72 0 73 }; 74 75 static NPClass _noScriptClass = { 76 1, 77 0, 78 0, 79 0, 80 0, 81 0, 82 0, 83 0, 84 0, 85 0, 86 0 87 }; 88 89 NPClass *NPScriptObjectClass = &_javascriptClass; 90 NPClass *NPNoScriptObjectClass = &_noScriptClass; 91 92 static Identifier identifierFromNPIdentifier(const NPUTF8 *name) 54 static void jsDeallocate(NPObject* obj) 55 { 56 free(obj); 57 } 58 59 static NPClass javascriptClass = { 1, jsAllocate, jsDeallocate, 0, 0, 0, 0, 0, 0, 0, 0 }; 60 static NPClass noScriptClass = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 61 62 NPClass* NPScriptObjectClass = &javascriptClass; 63 static NPClass* NPNoScriptObjectClass = &noScriptClass; 64 65 static Identifier identifierFromNPIdentifier(const NPUTF8* name) 93 66 { 94 67 NPUTF16 *methodName; 95 unsigned int UTF16Length; 96 97 convertUTF8ToUTF16 (name, -1, &methodName, &UTF16Length); // requires free() of returned memory. 98 Identifier identifier ((const KJS::UChar*)methodName, UTF16Length); 99 free ((void *)methodName); 100 68 unsigned UTF16Length; 69 convertUTF8ToUTF16(name, -1, &methodName, &UTF16Length); // requires free() of returned memory. 70 Identifier identifier((const KJS::UChar*)methodName, UTF16Length); 71 free(methodName); 101 72 return identifier; 102 73 } 103 74 104 static bool _isSafeScript(JavaScriptObject *obj)75 static bool _isSafeScript(JavaScriptObject* obj) 105 76 { 106 77 if (obj->originExecutionContext) { 107 Interpreter *originInterpreter = obj->originExecutionContext->interpreter(); 108 if (originInterpreter) { 109 return originInterpreter->isSafeScript (obj->executionContext->interpreter()); 110 } 78 Interpreter* originInterpreter = obj->originExecutionContext->interpreter(); 79 if (originInterpreter) 80 return originInterpreter->isSafeScript(obj->executionContext->interpreter()); 111 81 } 112 82 return true; 113 83 } 114 84 115 NPObject *_NPN_CreateScriptObject (NPP npp, KJS::JSObject *imp, const KJS::Bindings::RootObject *originExecutionContext, const KJS::Bindings::RootObject *executionContext)116 { 117 JavaScriptObject *obj = (JavaScriptObject*)_NPN_CreateObject(npp, NPScriptObjectClass);85 NPObject *_NPN_CreateScriptObject (NPP npp, JSObject *imp, const RootObject *originExecutionContext, const RootObject *executionContext) 86 { 87 JavaScriptObject* obj = (JavaScriptObject*)_NPN_CreateObject(npp, NPScriptObjectClass); 118 88 119 89 obj->imp = imp; … … 121 91 obj->executionContext = executionContext; 122 92 123 addNativeReference 124 93 addNativeReference(executionContext, imp); 94 125 95 return (NPObject *)obj; 126 96 } … … 131 101 } 132 102 133 bool _NPN_InvokeDefault 134 { 135 if (o->_class == NPScriptObjectClass) {136 // No notion of a default function on JS objects. 103 bool _NPN_InvokeDefault(NPP, NPObject* o, const NPVariant* args, uint32_t argCount, NPVariant* result) 104 { 105 if (o->_class == NPScriptObjectClass) 106 // No notion of a default function on JS objects. Just return false, can't handle. 137 107 return false; 138 } 139 else { 140 if (o->_class->invokeDefault) { 141 return o->_class->invokeDefault (o, args, argCount, result); 142 } 143 } 144 145 NPN_InitializeVariantAsUndefined(result); 108 if (o->_class->invokeDefault) 109 return o->_class->invokeDefault(o, args, argCount, result); 110 VOID_TO_NPVARIANT(*result); 146 111 return true; 147 112 } 148 113 149 bool _NPN_Invoke (NPP npp, NPObject *o, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result) 150 { 151 if (o->_class == NPScriptObjectClass) { 152 JavaScriptObject *obj = (JavaScriptObject *)o; 153 154 if (!_isSafeScript(obj)) 155 return false; 156 157 PrivateIdentifier *i = (PrivateIdentifier *)methodName; 114 bool _NPN_Invoke(NPP npp, NPObject* o, NPIdentifier methodName, const NPVariant* args, uint32_t argCount, NPVariant* result) 115 { 116 if (o->_class == NPScriptObjectClass) { 117 JavaScriptObject* obj = (JavaScriptObject*)o; 118 if (!_isSafeScript(obj)) 119 return false; 120 121 PrivateIdentifier* i = (PrivateIdentifier*)methodName; 158 122 if (!i->isString) 159 123 return false; 160 124 161 125 // Special case the "eval" method. 162 126 if (methodName == _NPN_GetStringIdentifier("eval")) { … … 165 129 if (args[0].type != NPVariantType_String) 166 130 return false; 167 168 return _NPN_Evaluate (npp, o, (NPString *)&args[0].value.stringValue, result); 131 return _NPN_Evaluate(npp, o, (NPString *)&args[0].value.stringValue, result); 169 132 } 170 else { 171 172 ExecState *exec = obj->executionContext->interpreter()->globalExec();173 174 JSValue *func = obj->imp->get(exec, identifierFromNPIdentifier(i->value.string));175 176 if (func->isNull()) { 177 NPN_InitializeVariantAsNull(result);178 return false; 179 } elseif (func->isUndefined()) {180 NPN_InitializeVariantAsUndefined(result);181 182 } else { 183 184 185 186 187 188 189 190 191 192 193 } 194 } elseif (o->_class->invoke)195 return o->_class->invoke 133 134 // Lookup the function object. 135 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 136 JSLock lock; 137 JSValue* func = obj->imp->get(exec, identifierFromNPIdentifier(i->value.string)); 138 if (func->isNull()) { 139 NULL_TO_NPVARIANT(*result); 140 return false; 141 } 142 if (func->isUndefined()) { 143 VOID_TO_NPVARIANT(*result); 144 return false; 145 } 146 // Call the function object. 147 JSObject *funcImp = static_cast<JSObject*>(func); 148 JSObject *thisObj = const_cast<JSObject*>(obj->imp); 149 List argList = listFromVariantArgs(exec, args, argCount); 150 JSValue *resultV = funcImp->call (exec, thisObj, argList); 151 152 // Convert and return the result of the function call. 153 convertValueToNPVariant(exec, resultV, result); 154 return true; 155 } 156 157 if (o->_class->invoke) 158 return o->_class->invoke(o, methodName, args, argCount, result); 196 159 197 NPN_InitializeVariantAsUndefined(result);160 VOID_TO_NPVARIANT(*result); 198 161 return true; 199 162 } … … 208 171 209 172 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 210 JSValue* result;211 173 212 174 JSLock lock; 213 175 NPUTF16* scriptString; 214 176 unsigned int UTF16Length; 215 convertNPStringToUTF16 (s, &scriptString, &UTF16Length); // requires free() of returned memory.177 convertNPStringToUTF16(s, &scriptString, &UTF16Length); // requires free() of returned memory 216 178 Completion completion = obj->executionContext->interpreter()->evaluate(UString(), 0, UString((const UChar*)scriptString,UTF16Length)); 217 179 ComplType type = completion.complType(); 218 180 181 JSValue* result; 219 182 if (type == Normal) { 220 183 result = completion.value(); 221 if (!result) {184 if (!result) 222 185 result = jsUndefined(); 223 } 224 } 225 else 186 } else 226 187 result = jsUndefined(); 227 228 free ((void *)scriptString);229 188 189 free(scriptString); 190 230 191 convertValueToNPVariant(exec, result, variant); 231 192 … … 233 194 } 234 195 235 NPN_InitializeVariantAsUndefined(variant); 236 return false; 237 } 238 239 bool _NPN_GetProperty (NPP, NPObject* o, NPIdentifier propertyName, NPVariant* variant) 240 { 241 if (o->_class == NPScriptObjectClass) { 242 JavaScriptObject *obj = (JavaScriptObject *)o; 243 244 if (!_isSafeScript(obj)) 245 return false; 246 247 ExecState *exec = obj->executionContext->interpreter()->globalExec(); 248 249 PrivateIdentifier *i = (PrivateIdentifier *)propertyName; 196 VOID_TO_NPVARIANT(*variant); 197 return false; 198 } 199 200 bool _NPN_GetProperty(NPP, NPObject* o, NPIdentifier propertyName, NPVariant* variant) 201 { 202 if (o->_class == NPScriptObjectClass) { 203 JavaScriptObject* obj = (JavaScriptObject*)o; 204 if (!_isSafeScript(obj)) 205 return false; 206 207 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 208 PrivateIdentifier* i = (PrivateIdentifier*)propertyName; 250 209 251 210 JSLock lock; 252 211 JSValue *result; 253 if (i->isString) { 254 result = obj->imp->get (exec, identifierFromNPIdentifier(i->value.string)); 255 } else { 256 result = obj->imp->get (exec, i->value.number); 212 if (i->isString) 213 result = obj->imp->get(exec, identifierFromNPIdentifier(i->value.string)); 214 else 215 result = obj->imp->get(exec, i->value.number); 216 217 if (result->isNull()) { 218 NULL_TO_NPVARIANT(*variant); 219 return false; 257 220 } 258 259 if (result->isNull()) { 260 NPN_InitializeVariantAsNull(variant); 221 if (result->isUndefined()) { 222 VOID_TO_NPVARIANT(*variant); 261 223 return false; 262 224 } 263 else if (result->isUndefined()) { 264 NPN_InitializeVariantAsUndefined(variant); 265 return false; 266 } 267 else { 268 convertValueToNPVariant(exec, result, variant); 269 } 270 271 return true; 272 } 273 else if (o->_class->hasProperty && o->_class->getProperty) { 274 if (o->_class->hasProperty (o, propertyName)) { 275 return o->_class->getProperty (o, propertyName, variant); 276 } 277 else { 278 return false; 279 } 280 } 281 282 NPN_InitializeVariantAsUndefined(variant); 283 return false; 284 } 285 286 bool _NPN_SetProperty (NPP, NPObject* o, NPIdentifier propertyName, const NPVariant* variant) 287 { 288 if (o->_class == NPScriptObjectClass) { 289 JavaScriptObject *obj = (JavaScriptObject *)o; 290 291 if (!_isSafeScript(obj)) 292 return false; 293 294 ExecState *exec = obj->executionContext->interpreter()->globalExec(); 295 JSLock lock; 296 PrivateIdentifier *i = (PrivateIdentifier *)propertyName; 225 convertValueToNPVariant(exec, result, variant); 226 return true; 227 } 228 229 if (o->_class->hasProperty && o->_class->getProperty) { 230 if (o->_class->hasProperty(o, propertyName)) 231 return o->_class->getProperty(o, propertyName, variant); 232 return false; 233 } 234 235 VOID_TO_NPVARIANT(*variant); 236 return false; 237 } 238 239 bool _NPN_SetProperty(NPP, NPObject* o, NPIdentifier propertyName, const NPVariant* variant) 240 { 241 if (o->_class == NPScriptObjectClass) { 242 JavaScriptObject* obj = (JavaScriptObject*)o; 243 if (!_isSafeScript(obj)) 244 return false; 245 246 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 247 JSLock lock; 248 PrivateIdentifier* i = (PrivateIdentifier*)propertyName; 297 249 if (i->isString) 298 250 obj->imp->put(exec, identifierFromNPIdentifier(i->value.string), convertNPVariantToValue(exec, variant)); 299 251 else 300 252 obj->imp->put(exec, i->value.number, convertNPVariantToValue(exec, variant)); 253 return true; 254 } 255 256 if (o->_class->setProperty) 257 return o->_class->setProperty(o, propertyName, variant); 258 259 return false; 260 } 261 262 bool _NPN_RemoveProperty(NPP, NPObject* o, NPIdentifier propertyName) 263 { 264 if (o->_class == NPScriptObjectClass) { 265 JavaScriptObject* obj = (JavaScriptObject*)o; 266 if (!_isSafeScript(obj)) 267 return false; 268 269 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 270 PrivateIdentifier* i = (PrivateIdentifier*)propertyName; 271 if (i->isString) { 272 if (!obj->imp->hasProperty(exec, identifierFromNPIdentifier(i->value.string))) 273 return false; 274 } else { 275 if (!obj->imp->hasProperty(exec, i->value.number)) 276 return false; 277 } 278 279 JSLock lock; 280 if (i->isString) 281 obj->imp->deleteProperty(exec, identifierFromNPIdentifier(i->value.string)); 282 else 283 obj->imp->deleteProperty(exec, i->value.number); 301 284 302 285 return true; 303 } else if (o->_class->setProperty)304 return o->_class->setProperty (o, propertyName, variant);305 306 return false;307 }308 309 bool _NPN_RemoveProperty (NPP, NPObject* o, NPIdentifier propertyName)310 {311 if (o->_class == NPScriptObjectClass) {312 JavaScriptObject *obj = (JavaScriptObject *)o;313 314 if (!_isSafeScript(obj))315 return false;316 317 ExecState *exec = obj->executionContext->interpreter()->globalExec();318 319 PrivateIdentifier *i = (PrivateIdentifier *)propertyName;320 if (i->isString) {321 if (!obj->imp->hasProperty (exec, identifierFromNPIdentifier(i->value.string))) {322 return false;323 }324 }325 else {326 if (!obj->imp->hasProperty (exec, i->value.number)) {327 return false;328 }329 }330 331 JSLock lock;332 if (i->isString)333 obj->imp->deleteProperty (exec, identifierFromNPIdentifier(i->value.string));334 else335 obj->imp->deleteProperty (exec, i->value.number);336 337 return true;338 286 } 339 287 return false; … … 343 291 { 344 292 if (o->_class == NPScriptObjectClass) { 345 JavaScriptObject *obj = (JavaScriptObject *)o; 346 347 if (!_isSafeScript(obj)) 348 return false; 349 350 ExecState *exec = obj->executionContext->interpreter()->globalExec(); 351 352 PrivateIdentifier *i = (PrivateIdentifier *)propertyName; 353 JSLock lock; 354 293 JavaScriptObject* obj = (JavaScriptObject*)o; 294 if (!_isSafeScript(obj)) 295 return false; 296 297 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 298 PrivateIdentifier* i = (PrivateIdentifier*)propertyName; 299 JSLock lock; 355 300 if (i->isString) 356 301 return obj->imp->hasProperty(exec, identifierFromNPIdentifier(i->value.string)); 357 358 302 return obj->imp->hasProperty(exec, i->value.number); 359 } else if (o->_class->hasProperty) 360 return o->_class->hasProperty (o, propertyName); 303 } 304 305 if (o->_class->hasProperty) 306 return o->_class->hasProperty(o, propertyName); 307 308 return false; 309 } 310 311 bool _NPN_HasMethod(NPP, NPObject* o, NPIdentifier methodName) 312 { 313 if (o->_class == NPScriptObjectClass) { 314 JavaScriptObject* obj = (JavaScriptObject*)o; 315 if (!_isSafeScript(obj)) 316 return false; 317 318 PrivateIdentifier* i = (PrivateIdentifier*)methodName; 319 if (!i->isString) 320 return false; 321 322 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 323 JSLock lock; 324 JSValue* func = obj->imp->get(exec, identifierFromNPIdentifier(i->value.string)); 325 return !func->isUndefined(); 326 } 361 327 362 return false; 363 } 364 365 bool _NPN_HasMethod(NPP, NPObject* o, NPIdentifier methodName) 366 { 367 if (o->_class == NPScriptObjectClass) { 368 JavaScriptObject *obj = (JavaScriptObject *)o; 369 370 if (!_isSafeScript(obj)) 371 return false; 372 373 PrivateIdentifier *i = (PrivateIdentifier *)methodName; 374 if (!i->isString) 375 return false; 376 377 // Lookup the function object. 378 ExecState *exec = obj->executionContext->interpreter()->globalExec(); 379 380 JSLock lock; 381 JSValue *func = obj->imp->get (exec, identifierFromNPIdentifier(i->value.string)); 382 383 if (func->isUndefined()) { 384 return false; 385 } 386 387 return true; 388 } 328 if (o->_class->hasMethod) 329 return o->_class->hasMethod(o, methodName); 389 330 390 else if (o->_class->hasMethod) { 391 return o->_class->hasMethod (o, methodName); 392 } 393 394 return false; 395 } 396 397 void _NPN_SetException(NPObject *o, const NPUTF8 *message) 398 { 399 if (o->_class == NPScriptObjectClass) { 400 JavaScriptObject *obj = (JavaScriptObject *)o; 401 ExecState *exec = obj->executionContext->interpreter()->globalExec(); 331 return false; 332 } 333 334 void _NPN_SetException(NPObject* o, const NPUTF8* message) 335 { 336 if (o->_class == NPScriptObjectClass) { 337 JavaScriptObject* obj = (JavaScriptObject*)o; 338 ExecState* exec = obj->executionContext->interpreter()->globalExec(); 402 339 JSLock lock; 403 340 throwError(exec, GeneralError, message);
Note:
See TracChangeset
for help on using the changeset viewer.