static v8::Handle<v8::Value> toV8(const IDBAny* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) { if (!impl) return v8::Null(isolate); switch (impl->type()) { case IDBAny::UndefinedType: return v8::Undefined(isolate); case IDBAny::NullType: return v8::Null(isolate); case IDBAny::DOMStringListType: return toV8(impl->domStringList(), creationContext, isolate); case IDBAny::IDBCursorType: { // Ensure request wrapper is kept alive at least as long as the cursor wrapper, // so that event listeners are retained. v8::Handle<v8::Value> cursor = toV8(impl->idbCursor(), creationContext, isolate); v8::Handle<v8::Value> request = toV8(impl->idbCursor()->request(), creationContext, isolate); V8HiddenValue::setHiddenValue(isolate, cursor->ToObject(), V8HiddenValue::idbCursorRequest(isolate), request); return cursor; } case IDBAny::IDBCursorWithValueType: { // Ensure request wrapper is kept alive at least as long as the cursor wrapper, // so that event listeners are retained. v8::Handle<v8::Value> cursor = toV8(impl->idbCursorWithValue(), creationContext, isolate); v8::Handle<v8::Value> request = toV8(impl->idbCursorWithValue()->request(), creationContext, isolate); V8HiddenValue::setHiddenValue(isolate, cursor->ToObject(), V8HiddenValue::idbCursorRequest(isolate), request); return cursor; } case IDBAny::IDBDatabaseType: return toV8(impl->idbDatabase(), creationContext, isolate); case IDBAny::IDBIndexType: return toV8(impl->idbIndex(), creationContext, isolate); case IDBAny::IDBObjectStoreType: return toV8(impl->idbObjectStore(), creationContext, isolate); case IDBAny::IDBTransactionType: return toV8(impl->idbTransaction(), creationContext, isolate); case IDBAny::BufferType: return deserializeIDBValueBuffer(isolate, impl->buffer(), impl->blobInfo()); case IDBAny::StringType: return v8String(isolate, impl->string()); case IDBAny::IntegerType: return v8::Number::New(isolate, impl->integer()); case IDBAny::KeyType: return toV8(impl->key(), creationContext, isolate); case IDBAny::KeyPathType: return toV8(impl->keyPath(), creationContext, isolate); case IDBAny::BufferKeyAndKeyPathType: { v8::Handle<v8::Value> value = deserializeIDBValueBuffer(isolate, impl->buffer(), impl->blobInfo()); v8::Handle<v8::Value> key = toV8(impl->key(), creationContext, isolate); bool injected = injectV8KeyIntoV8Value(isolate, key, value, impl->keyPath()); ASSERT_UNUSED(injected, injected); return value; } } ASSERT_NOT_REACHED(); return v8::Undefined(isolate); }
void assertPrimaryKeyValidOrInjectable(ScriptState* scriptState, PassRefPtr<SharedBuffer> buffer, const Vector<blink::WebBlobInfo>* blobInfo, IDBKey* key, const IDBKeyPath& keyPath) { ScriptState::Scope scope(scriptState); v8::Isolate* isolate = scriptState->isolate(); ScriptValue keyValue = idbKeyToScriptValue(scriptState, key); ScriptValue scriptValue(scriptState, deserializeIDBValueBuffer(isolate, buffer.get(), blobInfo)); // This assertion is about already persisted data, so allow experimental types. const bool allowExperimentalTypes = true; IDBKey* expectedKey = createIDBKeyFromScriptValueAndKeyPathInternal(isolate, scriptValue, keyPath, allowExperimentalTypes); ASSERT(!expectedKey || expectedKey->isEqual(key)); bool injected = injectV8KeyIntoV8Value(isolate, keyValue.v8Value(), scriptValue.v8Value(), keyPath); ASSERT_UNUSED(injected, injected); }
void assertPrimaryKeyValidOrInjectable(DOMRequestState* state, PassRefPtr<SharedBuffer> buffer, PassRefPtr<IDBKey> prpKey, const IDBKeyPath& keyPath) { RefPtr<IDBKey> key(prpKey); DOMRequestState::Scope scope(*state); v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate::GetCurrent(); ScriptValue keyValue = idbKeyToScriptValue(state, key); ScriptValue scriptValue(deserializeIDBValueBuffer(buffer.get(), isolate), isolate); RefPtr<IDBKey> expectedKey = createIDBKeyFromScriptValueAndKeyPath(state, scriptValue, keyPath); ASSERT(!expectedKey || expectedKey->isEqual(key.get())); bool injected = injectV8KeyIntoV8Value(keyValue.v8Value(), scriptValue.v8Value(), keyPath, isolate); ASSERT_UNUSED(injected, injected); }
v8::Handle<v8::Value> toV8(const IDBAny* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) { if (!impl) return v8::Null(isolate); switch (impl->type()) { case IDBAny::UndefinedType: return v8::Undefined(isolate); case IDBAny::NullType: return v8::Null(isolate); case IDBAny::DOMStringListType: return toV8(impl->domStringList(), creationContext, isolate); case IDBAny::IDBCursorType: return toV8(impl->idbCursor(), creationContext, isolate); case IDBAny::IDBCursorWithValueType: return toV8(impl->idbCursorWithValue(), creationContext, isolate); case IDBAny::IDBDatabaseType: return toV8(impl->idbDatabase(), creationContext, isolate); case IDBAny::IDBIndexType: return toV8(impl->idbIndex(), creationContext, isolate); case IDBAny::IDBObjectStoreType: return toV8(impl->idbObjectStore(), creationContext, isolate); case IDBAny::IDBTransactionType: return toV8(impl->idbTransaction(), creationContext, isolate); case IDBAny::BufferType: return deserializeIDBValueBuffer(impl->buffer(), isolate); case IDBAny::StringType: return v8String(isolate, impl->string()); case IDBAny::IntegerType: return v8::Number::New(isolate, impl->integer()); case IDBAny::KeyType: return toV8(impl->key(), creationContext, isolate); case IDBAny::KeyPathType: return toV8(impl->keyPath(), creationContext, isolate); case IDBAny::BufferKeyAndKeyPathType: { v8::Handle<v8::Value> value = deserializeIDBValueBuffer(impl->buffer(), isolate); v8::Handle<v8::Value> key = toV8(impl->key(), creationContext, isolate); bool injected = injectV8KeyIntoV8Value(key, value, impl->keyPath(), isolate); ASSERT_UNUSED(injected, injected); return value; } } ASSERT_NOT_REACHED(); return v8::Undefined(isolate); }