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 IDBRequest::onSuccess(PassRefPtr<SharedBuffer> valueBuffer, PassRefPtr<IDBKey> prpPrimaryKey, const IDBKeyPath& keyPath) { LOG(StorageAPI, "IDBRequest::onSuccess(SharedBuffer, IDBKey, IDBKeyPath)"); if (!shouldEnqueueEvent()) return; #ifndef NDEBUG ASSERT(keyPath == effectiveObjectStore(m_source)->keyPath()); #endif DOMRequestState::Scope scope(m_requestState); // FIXME: By not knowing whether or not the key is defined here, we don't know // if a null valueBuffer means the value is null or the value is undefined. Deprecated::ScriptValue value = deserializeIDBValueBuffer(requestState(), valueBuffer, true); RefPtr<IDBKey> primaryKey = prpPrimaryKey; if (!keyPath.isNull()) { #ifndef NDEBUG RefPtr<IDBKey> expectedKey = createIDBKeyFromScriptValueAndKeyPath(requestState()->exec(), value, keyPath); ASSERT(!expectedKey || expectedKey->isEqual(primaryKey.get())); #endif bool injected = injectIDBKeyIntoScriptValue(requestState(), primaryKey, value, keyPath); ASSERT_UNUSED(injected, injected); } onSuccessInternal(value); }
void IDBRequest::onSuccess(PassRefPtr<IDBCursorBackend> prpBackend) { LOG(StorageAPI, "IDBRequest::onSuccess(IDBCursor)"); if (!shouldEnqueueEvent()) return; DOMRequestState::Scope scope(m_requestState); RefPtr<IDBCursorBackend> backend = prpBackend; RefPtr<IDBKey> key = backend->key(); RefPtr<IDBKey> primaryKey = backend->primaryKey(); Deprecated::ScriptValue value = deserializeIDBValueBuffer(requestState(), backend->valueBuffer(), !!key); ASSERT(!m_pendingCursor); RefPtr<IDBCursor> cursor; switch (m_cursorType) { case IndexedDB::CursorType::KeyOnly: cursor = IDBCursor::create(backend.release(), m_cursorDirection, this, m_source.get(), m_transaction.get()); break; case IndexedDB::CursorType::KeyAndValue: cursor = IDBCursorWithValue::create(backend.release(), m_cursorDirection, this, m_source.get(), m_transaction.get()); break; default: ASSERT_NOT_REACHED(); } setResultCursor(cursor, key.release(), primaryKey.release(), value); enqueueEvent(createSuccessEvent()); }
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); }
void IDBRequest::onSuccess(PassRefPtr<SharedBuffer> valueBuffer) { IDB_TRACE("IDBRequest::onSuccess(SharedBuffer)"); if (!shouldEnqueueEvent()) return; DOMRequestState::Scope scope(m_requestState); ScriptValue value = deserializeIDBValueBuffer(requestState(), valueBuffer); onSuccessInternal(value); }
Deprecated::ScriptValue deserializeIDBValueBuffer(DOMRequestState* requestState, PassRefPtr<SharedBuffer> prpBuffer, bool keyIsDefined) { if (prpBuffer) { Vector<uint8_t> value; value.append(prpBuffer->data(), prpBuffer->size()); return deserializeIDBValueBuffer(requestState->exec(), value, keyIsDefined); } return Deprecated::ScriptValue(requestState->exec()->vm(), jsNull()); }
void IDBRequest::onSuccess(PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SharedBuffer> buffer) { IDB_TRACE("IDBRequest::onSuccess(key, primaryKey, value)"); if (!shouldEnqueueEvent()) return; DOMRequestState::Scope scope(m_requestState); ScriptValue value = deserializeIDBValueBuffer(requestState(), buffer); ASSERT(m_pendingCursor); setResultCursor(m_pendingCursor.release(), key, primaryKey, value); enqueueEvent(createSuccessEvent()); }
void IDBRequest::onSuccess(PassRefPtr<SharedBuffer> valueBuffer) { LOG(StorageAPI, "IDBRequest::onSuccess(SharedBuffer)"); if (!shouldEnqueueEvent()) return; DOMRequestState::Scope scope(m_requestState); // FIXME: By not knowing whether or not the key is defined here, we don't know // if a null valueBuffer means the value is null or the value is undefined. Deprecated::ScriptValue value = deserializeIDBValueBuffer(requestState(), valueBuffer, true); onSuccessInternal(value); }
void LegacyRequest::onSuccess(PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SharedBuffer> buffer) { LOG(StorageAPI, "LegacyRequest::onSuccess(key, primaryKey, valueBuffer)"); if (!shouldEnqueueEvent()) return; DOMRequestState::Scope scope(m_requestState); Deprecated::ScriptValue value = deserializeIDBValueBuffer(requestState(), buffer, !!key); ASSERT(m_pendingCursor); setResultCursor(m_pendingCursor.release(), key, primaryKey, value); enqueueEvent(createSuccessEvent()); }
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); }
void IDBRequest::onSuccess(PassRefPtr<SharedBuffer> valueBuffer, PassRefPtr<IDBKey> prpPrimaryKey, const IDBKeyPath& keyPath) { IDB_TRACE("IDBRequest::onSuccess(SharedBuffer, IDBKey, IDBKeyPath)"); if (!shouldEnqueueEvent()) return; #ifndef NDEBUG ASSERT(keyPath == effectiveObjectStore(m_source)->keyPath()); #endif DOMRequestState::Scope scope(m_requestState); ScriptValue value = deserializeIDBValueBuffer(requestState(), valueBuffer); RefPtr<IDBKey> primaryKey = prpPrimaryKey; #ifndef NDEBUG RefPtr<IDBKey> expectedKey = createIDBKeyFromScriptValueAndKeyPath(requestState(), value, keyPath); ASSERT(!expectedKey || expectedKey->isEqual(primaryKey.get())); #endif bool injected = injectIDBKeyIntoScriptValue(requestState(), primaryKey, value, keyPath); ASSERT_UNUSED(injected, injected); onSuccessInternal(value); }
void IDBRequest::onSuccess(PassRefPtr<IDBCursorBackendInterface> backend, PassRefPtr<IDBKey> key, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SharedBuffer> buffer) { IDB_TRACE("IDBRequest::onSuccess(IDBCursor)"); if (!shouldEnqueueEvent()) return; DOMRequestState::Scope scope(m_requestState); ScriptValue value = deserializeIDBValueBuffer(requestState(), buffer); ASSERT(!m_pendingCursor); RefPtr<IDBCursor> cursor; switch (m_cursorType) { case IndexedDB::CursorKeyOnly: cursor = IDBCursor::create(backend, m_cursorDirection, this, m_source.get(), m_transaction.get()); break; case IndexedDB::CursorKeyAndValue: cursor = IDBCursorWithValue::create(backend, m_cursorDirection, this, m_source.get(), m_transaction.get()); break; default: ASSERT_NOT_REACHED(); } setResultCursor(cursor, key, primaryKey, value); enqueueEvent(createSuccessEvent()); }