summaryrefslogtreecommitdiff
path: root/Source/WebCore/bridge/NP_jsobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/bridge/NP_jsobject.cpp')
-rw-r--r--Source/WebCore/bridge/NP_jsobject.cpp145
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;
}