| Index: third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| index 122e8f483060e4dc74f512b344219e87473ea384..10d6059cadd19b56ead63c3b513900676ca9e6fb 100644
|
| --- a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| +++ b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| @@ -104,8 +104,7 @@ v8::Local<v8::Value> ToV8(const IDBKey* key,
|
| case IDBKey::StringType:
|
| return v8String(isolate, key->string());
|
| case IDBKey::BinaryType:
|
| - // Experimental feature: binary keys
|
| - // https://w3c.github.io/IndexedDB/#steps-to-convert-a-key-to-a-value
|
| + // https://w3c.github.io/IndexedDB/#convert-a-value-to-a-key
|
| return ToV8(DOMArrayBuffer::create(reinterpret_cast<const unsigned char*>(
|
| key->binary()->data()),
|
| key->binary()->size()),
|
| @@ -177,40 +176,37 @@ static const size_t maximumDepth = 2000;
|
| static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate,
|
| v8::Local<v8::Value> value,
|
| Vector<v8::Local<v8::Array>>& stack,
|
| - ExceptionState& exceptionState,
|
| - bool allowExperimentalTypes = false) {
|
| + ExceptionState& exceptionState) {
|
| if (value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value()))
|
| return IDBKey::createNumber(value.As<v8::Number>()->Value());
|
| if (value->IsString())
|
| return IDBKey::createString(toCoreString(value.As<v8::String>()));
|
| if (value->IsDate() && !std::isnan(value.As<v8::Date>()->ValueOf()))
|
| return IDBKey::createDate(value.As<v8::Date>()->ValueOf());
|
| - if (allowExperimentalTypes ||
|
| - RuntimeEnabledFeatures::indexedDBExperimentalEnabled()) {
|
| - // Experimental feature: binary keys
|
| - // https://w3c.github.io/IndexedDB/#dfn-convert-a-value-to-a-key
|
| - if (value->IsArrayBuffer()) {
|
| - DOMArrayBuffer* buffer = V8ArrayBuffer::toImpl(value.As<v8::Object>());
|
| - if (buffer->isNeutered()) {
|
| - exceptionState.throwTypeError("The ArrayBuffer is neutered.");
|
| - return nullptr;
|
| - }
|
| - const char* start = static_cast<const char*>(buffer->data());
|
| - size_t length = buffer->byteLength();
|
| - return IDBKey::createBinary(SharedBuffer::create(start, length));
|
| +
|
| + // https://w3c.github.io/IndexedDB/#convert-a-key-to-a-value
|
| + if (value->IsArrayBuffer()) {
|
| + DOMArrayBuffer* buffer = V8ArrayBuffer::toImpl(value.As<v8::Object>());
|
| + if (buffer->isNeutered()) {
|
| + exceptionState.throwTypeError("The ArrayBuffer is neutered.");
|
| + return nullptr;
|
| }
|
| - if (value->IsArrayBufferView()) {
|
| - DOMArrayBufferView* view =
|
| - V8ArrayBufferView::toImpl(value.As<v8::Object>());
|
| - if (view->buffer()->isNeutered()) {
|
| - exceptionState.throwTypeError("The viewed ArrayBuffer is neutered.");
|
| - return nullptr;
|
| - }
|
| - const char* start = static_cast<const char*>(view->baseAddress());
|
| - size_t length = view->byteLength();
|
| - return IDBKey::createBinary(SharedBuffer::create(start, length));
|
| + const char* start = static_cast<const char*>(buffer->data());
|
| + size_t length = buffer->byteLength();
|
| + return IDBKey::createBinary(SharedBuffer::create(start, length));
|
| + }
|
| + if (value->IsArrayBufferView()) {
|
| + DOMArrayBufferView* view =
|
| + V8ArrayBufferView::toImpl(value.As<v8::Object>());
|
| + if (view->buffer()->isNeutered()) {
|
| + exceptionState.throwTypeError("The viewed ArrayBuffer is neutered.");
|
| + return nullptr;
|
| }
|
| + const char* start = static_cast<const char*>(view->baseAddress());
|
| + size_t length = view->byteLength();
|
| + return IDBKey::createBinary(SharedBuffer::create(start, length));
|
| }
|
| +
|
| if (value->IsArray()) {
|
| v8::Local<v8::Array> array = value.As<v8::Array>();
|
|
|
| @@ -232,8 +228,8 @@ static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate,
|
| exceptionState.rethrowV8Exception(block.Exception());
|
| return nullptr;
|
| }
|
| - IDBKey* subkey = createIDBKeyFromValue(
|
| - isolate, item, stack, exceptionState, allowExperimentalTypes);
|
| + IDBKey* subkey =
|
| + createIDBKeyFromValue(isolate, item, stack, exceptionState);
|
| if (!subkey)
|
| subkeys.push_back(IDBKey::createInvalid());
|
| else
|
| @@ -248,11 +244,10 @@ static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate,
|
|
|
| static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate,
|
| v8::Local<v8::Value> value,
|
| - ExceptionState& exceptionState,
|
| - bool allowExperimentalTypes = false) {
|
| + ExceptionState& exceptionState) {
|
| Vector<v8::Local<v8::Array>> stack;
|
| - if (IDBKey* key = createIDBKeyFromValue(isolate, value, stack, exceptionState,
|
| - allowExperimentalTypes))
|
| + if (IDBKey* key =
|
| + createIDBKeyFromValue(isolate, value, stack, exceptionState))
|
| return key;
|
| return IDBKey::createInvalid();
|
| }
|
| @@ -287,8 +282,7 @@ static Vector<String> parseKeyPath(const String& keyPath) {
|
| static IDBKey* createIDBKeyFromValueAndKeyPath(v8::Isolate* isolate,
|
| v8::Local<v8::Value> v8Value,
|
| const String& keyPath,
|
| - ExceptionState& exceptionState,
|
| - bool allowExperimentalTypes) {
|
| + ExceptionState& exceptionState) {
|
| Vector<String> keyPathElements = parseKeyPath(keyPath);
|
| ASSERT(isolate->InContext());
|
|
|
| @@ -356,24 +350,21 @@ static IDBKey* createIDBKeyFromValueAndKeyPath(v8::Isolate* isolate,
|
| return nullptr;
|
| }
|
| }
|
| - return createIDBKeyFromValue(isolate, v8Value, exceptionState,
|
| - allowExperimentalTypes);
|
| + return createIDBKeyFromValue(isolate, v8Value, exceptionState);
|
| }
|
|
|
| -static IDBKey* createIDBKeyFromValueAndKeyPath(
|
| - v8::Isolate* isolate,
|
| - v8::Local<v8::Value> value,
|
| - const IDBKeyPath& keyPath,
|
| - ExceptionState& exceptionState,
|
| - bool allowExperimentalTypes = false) {
|
| +static IDBKey* createIDBKeyFromValueAndKeyPath(v8::Isolate* isolate,
|
| + v8::Local<v8::Value> value,
|
| + const IDBKeyPath& keyPath,
|
| + ExceptionState& exceptionState) {
|
| ASSERT(!keyPath.isNull());
|
| v8::HandleScope handleScope(isolate);
|
| if (keyPath.getType() == IDBKeyPath::ArrayType) {
|
| IDBKey::KeyArray result;
|
| const Vector<String>& array = keyPath.array();
|
| for (size_t i = 0; i < array.size(); ++i) {
|
| - IDBKey* key = createIDBKeyFromValueAndKeyPath(
|
| - isolate, value, array[i], exceptionState, allowExperimentalTypes);
|
| + IDBKey* key = createIDBKeyFromValueAndKeyPath(isolate, value, array[i],
|
| + exceptionState);
|
| if (!key)
|
| return nullptr;
|
| result.push_back(key);
|
| @@ -382,8 +373,8 @@ static IDBKey* createIDBKeyFromValueAndKeyPath(
|
| }
|
|
|
| ASSERT(keyPath.getType() == IDBKeyPath::StringType);
|
| - return createIDBKeyFromValueAndKeyPath(
|
| - isolate, value, keyPath.string(), exceptionState, allowExperimentalTypes);
|
| + return createIDBKeyFromValueAndKeyPath(isolate, value, keyPath.string(),
|
| + exceptionState);
|
| }
|
|
|
| // Deserialize just the value data & blobInfo from the given IDBValue.
|
| @@ -605,13 +596,9 @@ void assertPrimaryKeyValidOrInjectable(ScriptState* scriptState,
|
| ScriptValue keyValue = ScriptValue::from(scriptState, value->primaryKey());
|
| ScriptValue scriptValue(scriptState, deserializeIDBValueData(isolate, value));
|
|
|
| - // This assertion is about already persisted data, so allow experimental
|
| - // types.
|
| - const bool allowExperimentalTypes = true;
|
| DummyExceptionStateForTesting exceptionState;
|
| IDBKey* expectedKey = createIDBKeyFromValueAndKeyPath(
|
| - isolate, scriptValue.v8Value(), value->keyPath(), exceptionState,
|
| - allowExperimentalTypes);
|
| + isolate, scriptValue.v8Value(), value->keyPath(), exceptionState);
|
| ASSERT(!exceptionState.hadException());
|
| if (expectedKey && expectedKey->isEqual(value->primaryKey()))
|
| return;
|
|
|