static bool get(v8::Handle<v8::Value>& object, const String& keyPathElement, v8::Handle<v8::Value>& result, v8::Isolate* isolate)
{
    if (object->IsString() && keyPathElement == "length") {
        int32_t length = v8::Handle<v8::String>::Cast(object)->Length();
        result = v8::Number::New(isolate, length);
        return true;
    }
    return object->IsObject() && getValueFrom(v8String(isolate, keyPathElement), result);
}
示例#2
0
PassRefPtr<IDBKey> createIDBKeyFromSerializedValueAndKeyPath(PassRefPtr<SerializedScriptValue> value, const Vector<IDBKeyPathElement>& keyPath)
{
    LocalContext localContext;
    v8::Handle<v8::Value> v8Value(value->deserialize());
    for (size_t i = 0; i < keyPath.size(); ++i) {
        switch (keyPath[i].type) {
        case IDBKeyPathElement::IsIndexed:
            if (!v8Value->IsArray() || !getValueFrom(keyPath[i].index, v8Value))
                return 0;
            break;
        case IDBKeyPathElement::IsNamed:
            if (!v8Value->IsObject() || !getValueFrom(v8String(keyPath[i].identifier), v8Value))
                return 0;
            break;
        default:
            ASSERT_NOT_REACHED();
        }
    }
    return createIDBKeyFromValue(v8Value);
}