| Index: Source/bindings/modules/v8/V8BindingForModules.cpp
|
| diff --git a/Source/bindings/modules/v8/V8BindingForModules.cpp b/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| index a1e28358b638742e3139624a5e297adb831d1754..f3da17f0aadd45b946f1a237dbfe9adca5e12d81 100644
|
| --- a/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| +++ b/Source/bindings/modules/v8/V8BindingForModules.cpp
|
| @@ -28,6 +28,7 @@
|
|
|
| #include "bindings/core/v8/SerializedScriptValue.h"
|
| #include "bindings/core/v8/SerializedScriptValueFactory.h"
|
| +#include "bindings/core/v8/V8ArrayBuffer.h"
|
| #include "bindings/core/v8/V8ArrayBufferView.h"
|
| #include "bindings/core/v8/V8Binding.h"
|
| #include "bindings/core/v8/V8Blob.h"
|
| @@ -42,6 +43,8 @@
|
| #include "bindings/modules/v8/V8IDBIndex.h"
|
| #include "bindings/modules/v8/V8IDBKeyRange.h"
|
| #include "bindings/modules/v8/V8IDBObjectStore.h"
|
| +#include "core/dom/DOMArrayBuffer.h"
|
| +#include "core/dom/DOMArrayBufferView.h"
|
| #include "modules/indexeddb/IDBKey.h"
|
| #include "modules/indexeddb/IDBKeyPath.h"
|
| #include "modules/indexeddb/IDBKeyRange.h"
|
| @@ -97,7 +100,9 @@ v8::Local<v8::Value> toV8(const IDBKey* key, v8::Local<v8::Object> creationConte
|
| case IDBKey::StringType:
|
| return v8String(isolate, key->string());
|
| case IDBKey::BinaryType:
|
| - return toV8(DOMUint8Array::create(reinterpret_cast<const unsigned char*>(key->binary()->data()), key->binary()->size()), creationContext, isolate);
|
| + // Experimental feature: binary keys
|
| + // https://w3c.github.io/IndexedDB/#steps-to-convert-a-key-to-a-value
|
| + return toV8(DOMArrayBuffer::create(reinterpret_cast<const unsigned char*>(key->binary()->data()), key->binary()->size()), creationContext, isolate);
|
| case IDBKey::DateType:
|
| return v8::Date::New(context, key->date()).ToLocalChecked();
|
| case IDBKey::ArrayType:
|
| @@ -190,13 +195,21 @@ static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate, v8::Local<v8::Value>
|
| 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 (value->IsUint8Array() && (allowExperimentalTypes || RuntimeEnabledFeatures::indexedDBExperimentalEnabled())) {
|
| - // Per discussion in https://www.w3.org/Bugs/Public/show_bug.cgi?id=23332 the
|
| - // input type is constrained to Uint8Array to match the output type.
|
| - DOMArrayBufferView* view = V8ArrayBufferView::toImpl(value.As<v8::Object>());
|
| - const char* start = static_cast<const char*>(view->baseAddress());
|
| - size_t length = view->byteLength();
|
| - return IDBKey::createBinary(SharedBuffer::create(start, length));
|
| + 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>());
|
| + 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>());
|
| + 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>();
|
|
|