JSStorageCustom.cpp [plain text]
#include "config.h"
#include "JSStorage.h"
#include "JSDOMBinding.h"
#include <runtime/IdentifierInlines.h>
#include <runtime/PropertyNameArray.h>
#include <wtf/text/WTFString.h>
using namespace JSC;
namespace WebCore {
bool JSStorage::nameGetter(ExecState* state, PropertyName propertyName, JSValue& value)
{
if (propertyName.isSymbol())
return false;
auto item = wrapped().getItem(propertyNameToString(propertyName));
if (item.hasException()) {
auto& vm = state->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
propagateException(*state, scope, item.releaseException());
return false;
}
auto string = item.releaseReturnValue();
if (string.isNull())
return false;
value = jsStringWithCache(state, string);
return true;
}
bool JSStorage::deleteProperty(JSCell* cell, ExecState* state, PropertyName propertyName)
{
auto& thisObject = *jsCast<JSStorage*>(cell);
PropertySlot slot(&thisObject, PropertySlot::InternalMethodType::GetOwnProperty);
JSValue prototype = thisObject.getPrototypeDirect();
if (prototype.isObject() && asObject(prototype)->getPropertySlot(state, propertyName, slot))
return Base::deleteProperty(&thisObject, state, propertyName);
if (propertyName.isSymbol())
return Base::deleteProperty(&thisObject, state, propertyName);
VM& vm = state->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
propagateException(*state, scope, thisObject.wrapped().removeItem(propertyNameToString(propertyName)));
return true;
}
bool JSStorage::deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned propertyName)
{
return deleteProperty(cell, exec, Identifier::from(exec, propertyName));
}
void JSStorage::getOwnPropertyNames(JSObject* object, ExecState* state, PropertyNameArray& propertyNames, EnumerationMode mode)
{
VM& vm = state->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
auto& thisObject = *jsCast<JSStorage*>(object);
auto lengthResult = thisObject.wrapped().length();
if (lengthResult.hasException()) {
propagateException(*state, scope, lengthResult.releaseException());
return;
}
unsigned length = lengthResult.releaseReturnValue();
for (unsigned i = 0; i < length; ++i) {
auto keyResult = thisObject.wrapped().key(i);
if (keyResult.hasException()) {
propagateException(*state, scope, lengthResult.releaseException());
return;
}
propertyNames.add(Identifier::fromString(state, keyResult.releaseReturnValue()));
}
Base::getOwnPropertyNames(&thisObject, state, propertyNames, mode);
}
bool JSStorage::putDelegate(ExecState* state, PropertyName propertyName, JSValue value, PutPropertySlot&, bool& putResult)
{
VM& vm = state->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
PropertySlot slot { this, PropertySlot::InternalMethodType::GetOwnProperty };
JSValue prototype = this->getPrototypeDirect();
if (prototype.isObject() && asObject(prototype)->getPropertySlot(state, propertyName, slot))
return false;
if (propertyName.isSymbol())
return false;
String stringValue = value.toWTFString(state);
RETURN_IF_EXCEPTION(scope, true);
auto setItemResult = wrapped().setItem(propertyNameToString(propertyName), stringValue);
if (setItemResult.hasException()) {
propagateException(*state, scope, setItemResult.releaseException());
return true;
}
putResult = true;
return true;
}
}