diff options
Diffstat (limited to 'Source/WebCore/bridge/NP_jsobject.cpp')
-rw-r--r-- | Source/WebCore/bridge/NP_jsobject.cpp | 145 |
1 files changed, 93 insertions, 52 deletions
diff --git a/Source/WebCore/bridge/NP_jsobject.cpp b/Source/WebCore/bridge/NP_jsobject.cpp index 34dd14696..343b468f8 100644 --- a/Source/WebCore/bridge/NP_jsobject.cpp +++ b/Source/WebCore/bridge/NP_jsobject.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2004, 2006 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,10 +10,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -29,12 +29,10 @@ #include "NP_jsobject.h" -#include "PluginView.h" #include "c_utility.h" #include "c_instance.h" #include "IdentifierRep.h" #include "JSDOMBinding.h" -#include "npruntime_impl.h" #include "npruntime_priv.h" #include "runtime_root.h" #include <runtime/Error.h> @@ -43,8 +41,13 @@ #include <runtime/PropertyNameArray.h> #include <parser/SourceCode.h> #include <runtime/Completion.h> +#include <wtf/NeverDestroyed.h> #include <wtf/text/WTFString.h> +#pragma GCC visibility push(default) +#include "npruntime_impl.h" +#pragma GCC visibility pop + using namespace JSC; using namespace JSC::Bindings; using namespace WebCore; @@ -85,7 +88,7 @@ public: private: struct RootObjectInvalidationCallback : public RootObject::InvalidationCallback { - virtual void operator()(RootObject*); + void operator()(RootObject*) override; }; RootObjectInvalidationCallback m_invalidationCallback; @@ -97,7 +100,7 @@ private: static ObjectMap& objectMap() { - DEFINE_STATIC_LOCAL(ObjectMap, map, ()); + static NeverDestroyed<ObjectMap> map; return map; } @@ -138,7 +141,7 @@ static NPClass noScriptClass = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; NPClass* NPScriptObjectClass = &javascriptClass; static NPClass* NPNoScriptObjectClass = &noScriptClass; -NPObject* _NPN_CreateScriptObject(NPP npp, JSObject* imp, PassRefPtr<RootObject> rootObject) +NPObject* _NPN_CreateScriptObject(NPP npp, JSObject* imp, RefPtr<RootObject>&& rootObject) { if (NPObject* object = objectMap().get(rootObject.get(), imp)) return _NPN_RetainObject(object); @@ -174,14 +177,18 @@ bool _NPN_InvokeDefault(NPP, NPObject* o, const NPVariant* args, uint32_t argCou if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); // Call the function object. JSValue function = obj->imp; CallData callData; CallType callType = getCallData(function, callData); - if (callType == CallTypeNone) + if (callType == CallType::None) return false; MarkedArgumentBuffer argList; @@ -190,7 +197,7 @@ bool _NPN_InvokeDefault(NPP, NPObject* o, const NPVariant* args, uint32_t argCou // Convert and return the result of the function call. convertValueToNPVariant(exec, resultV, result); - exec->clearException(); + scope.clearException(); return true; } @@ -222,12 +229,17 @@ bool _NPN_Invoke(NPP npp, NPObject* o, NPIdentifier methodName, const NPVariant* RootObject* rootObject = obj->rootObject; if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); + + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); JSValue function = obj->imp->get(exec, identifierFromNPIdentifier(exec, i->string())); CallData callData; CallType callType = getCallData(function, callData); - if (callType == CallTypeNone) + if (callType == CallType::None) return false; // Call the function object. @@ -237,7 +249,7 @@ bool _NPN_Invoke(NPP npp, NPObject* o, NPIdentifier methodName, const NPVariant* // Convert and return the result of the function call. convertValueToNPVariant(exec, resultV, result); - exec->clearException(); + scope.clearException(); return true; } @@ -248,7 +260,7 @@ bool _NPN_Invoke(NPP npp, NPObject* o, NPIdentifier methodName, const NPVariant* return true; } -bool _NPN_Evaluate(NPP instance, NPObject* o, NPString* s, NPVariant* variant) +bool _NPN_Evaluate(NPP, NPObject* o, NPString* s, NPVariant* variant) { if (o->_class == NPScriptObjectClass) { JavaScriptObject* obj = reinterpret_cast<JavaScriptObject*>(o); @@ -257,18 +269,18 @@ bool _NPN_Evaluate(NPP instance, NPObject* o, NPString* s, NPVariant* variant) if (!rootObject || !rootObject->isValid()) return false; - // There is a crash in Flash when evaluating a script that destroys the - // PluginView, so we destroy it asynchronously. - PluginView::keepAlive(instance); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); + ExecState* exec = globalObject->globalExec(); String scriptString = convertNPStringToUTF16(s); - JSValue returnValue = JSC::evaluate(rootObject->globalObject()->globalExec(), makeSource(scriptString), JSC::JSValue()); + JSValue returnValue = JSC::evaluate(exec, JSC::makeSource(scriptString, { }), JSC::JSValue()); convertValueToNPVariant(exec, returnValue, variant); - exec->clearException(); + scope.clearException(); return true; } @@ -285,10 +297,14 @@ bool _NPN_GetProperty(NPP, NPObject* o, NPIdentifier propertyName, NPVariant* va if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); IdentifierRep* i = static_cast<IdentifierRep*>(propertyName); - JSLockHolder lock(exec); JSValue result; if (i->isString()) result = obj->imp->get(exec, identifierFromNPIdentifier(exec, i->string())); @@ -296,7 +312,7 @@ bool _NPN_GetProperty(NPP, NPObject* o, NPIdentifier propertyName, NPVariant* va result = obj->imp->get(exec, i->number()); convertValueToNPVariant(exec, result, variant); - exec->clearException(); + scope.clearException(); return true; } @@ -319,8 +335,12 @@ bool _NPN_SetProperty(NPP, NPObject* o, NPIdentifier propertyName, const NPVaria if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); IdentifierRep* i = static_cast<IdentifierRep*>(propertyName); if (i->isString()) { @@ -328,7 +348,7 @@ bool _NPN_SetProperty(NPP, NPObject* o, NPIdentifier propertyName, const NPVaria obj->imp->methodTable()->put(obj->imp, exec, identifierFromNPIdentifier(exec, i->string()), convertNPVariantToValue(exec, variant, rootObject), slot); } else obj->imp->methodTable()->putByIndex(obj->imp, exec, i->number(), convertNPVariantToValue(exec, variant, rootObject), false); - exec->clearException(); + scope.clearException(); return true; } @@ -347,27 +367,32 @@ bool _NPN_RemoveProperty(NPP, NPObject* o, NPIdentifier propertyName) if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); + IdentifierRep* i = static_cast<IdentifierRep*>(propertyName); if (i->isString()) { if (!obj->imp->hasProperty(exec, identifierFromNPIdentifier(exec, i->string()))) { - exec->clearException(); + scope.clearException(); return false; } } else { if (!obj->imp->hasProperty(exec, i->number())) { - exec->clearException(); + scope.clearException(); return false; } } - JSLockHolder lock(exec); if (i->isString()) obj->imp->methodTable()->deleteProperty(obj->imp, exec, identifierFromNPIdentifier(exec, i->string())); else obj->imp->methodTable()->deletePropertyByIndex(obj->imp, exec, i->number()); - exec->clearException(); + scope.clearException(); return true; } return false; @@ -382,17 +407,21 @@ bool _NPN_HasProperty(NPP, NPObject* o, NPIdentifier propertyName) if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); IdentifierRep* i = static_cast<IdentifierRep*>(propertyName); - JSLockHolder lock(exec); if (i->isString()) { bool result = obj->imp->hasProperty(exec, identifierFromNPIdentifier(exec, i->string())); - exec->clearException(); + scope.clearException(); return result; } bool result = obj->imp->hasProperty(exec, i->number()); - exec->clearException(); + scope.clearException(); return result; } @@ -415,10 +444,14 @@ bool _NPN_HasMethod(NPP, NPObject* o, NPIdentifier methodName) if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); JSValue func = obj->imp->get(exec, identifierFromNPIdentifier(exec, i->string())); - exec->clearException(); + scope.clearException(); return !func.isUndefined(); } @@ -444,11 +477,15 @@ bool _NPN_Enumerate(NPP, NPObject* o, NPIdentifier** identifier, uint32_t* count if (!rootObject || !rootObject->isValid()) return false; - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); - PropertyNameArray propertyNames(exec); + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); - obj->imp->methodTable()->getPropertyNames(obj->imp, exec, propertyNames, ExcludeDontEnumProperties); + ExecState* exec = globalObject->globalExec(); + PropertyNameArray propertyNames(exec, PropertyNameMode::Strings); + + obj->imp->methodTable()->getPropertyNames(obj->imp, exec, propertyNames, EnumerationMode()); unsigned size = static_cast<unsigned>(propertyNames.size()); // FIXME: This should really call NPN_MemAlloc but that's in WebKit NPIdentifier* identifiers = static_cast<NPIdentifier*>(malloc(sizeof(NPIdentifier) * size)); @@ -459,7 +496,7 @@ bool _NPN_Enumerate(NPP, NPObject* o, NPIdentifier** identifier, uint32_t* count *identifier = identifiers; *count = size; - exec->clearException(); + scope.clearException(); return true; } @@ -480,15 +517,19 @@ bool _NPN_Construct(NPP, NPObject* o, const NPVariant* args, uint32_t argCount, RootObject* rootObject = obj->rootObject; if (!rootObject || !rootObject->isValid()) return false; - - ExecState* exec = rootObject->globalObject()->globalExec(); - JSLockHolder lock(exec); + + auto globalObject = rootObject->globalObject(); + VM& vm = globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_CATCH_SCOPE(vm); + + ExecState* exec = globalObject->globalExec(); // Call the constructor object. JSValue constructor = obj->imp; ConstructData constructData; ConstructType constructType = getConstructData(constructor, constructData); - if (constructType == ConstructTypeNone) + if (constructType == ConstructType::None) return false; MarkedArgumentBuffer argList; @@ -497,7 +538,7 @@ bool _NPN_Construct(NPP, NPObject* o, const NPVariant* args, uint32_t argCount, // Convert and return the result. convertValueToNPVariant(exec, resultV, result); - exec->clearException(); + scope.clearException(); return true; } |