Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(600)

Side by Side Diff: Source/bindings/modules/v8/V8BindingForModules.cpp

Issue 1087923003: Indexed DB: Adopt BufferSource model for binary keys (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 10 matching lines...) Expand all
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "config.h" 26 #include "config.h"
27 #include "bindings/modules/v8/V8BindingForModules.h" 27 #include "bindings/modules/v8/V8BindingForModules.h"
28 28
29 #include "bindings/core/v8/SerializedScriptValue.h" 29 #include "bindings/core/v8/SerializedScriptValue.h"
30 #include "bindings/core/v8/SerializedScriptValueFactory.h" 30 #include "bindings/core/v8/SerializedScriptValueFactory.h"
31 #include "bindings/core/v8/V8ArrayBuffer.h"
31 #include "bindings/core/v8/V8ArrayBufferView.h" 32 #include "bindings/core/v8/V8ArrayBufferView.h"
32 #include "bindings/core/v8/V8Binding.h" 33 #include "bindings/core/v8/V8Binding.h"
33 #include "bindings/core/v8/V8DOMStringList.h" 34 #include "bindings/core/v8/V8DOMStringList.h"
34 #include "bindings/core/v8/V8HiddenValue.h" 35 #include "bindings/core/v8/V8HiddenValue.h"
35 #include "bindings/core/v8/V8Uint8Array.h" 36 #include "bindings/core/v8/V8Uint8Array.h"
36 #include "bindings/modules/v8/ToV8ForModules.h" 37 #include "bindings/modules/v8/ToV8ForModules.h"
37 #include "bindings/modules/v8/V8IDBCursor.h" 38 #include "bindings/modules/v8/V8IDBCursor.h"
38 #include "bindings/modules/v8/V8IDBCursorWithValue.h" 39 #include "bindings/modules/v8/V8IDBCursorWithValue.h"
39 #include "bindings/modules/v8/V8IDBDatabase.h" 40 #include "bindings/modules/v8/V8IDBDatabase.h"
40 #include "bindings/modules/v8/V8IDBIndex.h" 41 #include "bindings/modules/v8/V8IDBIndex.h"
41 #include "bindings/modules/v8/V8IDBKeyRange.h" 42 #include "bindings/modules/v8/V8IDBKeyRange.h"
42 #include "bindings/modules/v8/V8IDBObjectStore.h" 43 #include "bindings/modules/v8/V8IDBObjectStore.h"
44 #include "core/dom/DOMArrayBuffer.h"
45 #include "core/dom/DOMArrayBufferView.h"
43 #include "modules/indexeddb/IDBKey.h" 46 #include "modules/indexeddb/IDBKey.h"
44 #include "modules/indexeddb/IDBKeyPath.h" 47 #include "modules/indexeddb/IDBKeyPath.h"
45 #include "modules/indexeddb/IDBKeyRange.h" 48 #include "modules/indexeddb/IDBKeyRange.h"
46 #include "modules/indexeddb/IDBTracing.h" 49 #include "modules/indexeddb/IDBTracing.h"
47 #include "modules/indexeddb/IDBValue.h" 50 #include "modules/indexeddb/IDBValue.h"
48 #include "platform/RuntimeEnabledFeatures.h" 51 #include "platform/RuntimeEnabledFeatures.h"
49 #include "platform/SharedBuffer.h" 52 #include "platform/SharedBuffer.h"
50 #include "wtf/MathExtras.h" 53 #include "wtf/MathExtras.h"
51 #include "wtf/Vector.h" 54 #include "wtf/Vector.h"
52 55
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 switch (key->type()) { 87 switch (key->type()) {
85 case IDBKey::InvalidType: 88 case IDBKey::InvalidType:
86 case IDBKey::MinType: 89 case IDBKey::MinType:
87 ASSERT_NOT_REACHED(); 90 ASSERT_NOT_REACHED();
88 return v8Undefined(); 91 return v8Undefined();
89 case IDBKey::NumberType: 92 case IDBKey::NumberType:
90 return v8::Number::New(isolate, key->number()); 93 return v8::Number::New(isolate, key->number());
91 case IDBKey::StringType: 94 case IDBKey::StringType:
92 return v8String(isolate, key->string()); 95 return v8String(isolate, key->string());
93 case IDBKey::BinaryType: 96 case IDBKey::BinaryType:
94 return toV8(DOMUint8Array::create(reinterpret_cast<const unsigned char*> (key->binary()->data()), key->binary()->size()), creationContext, isolate); 97 return toV8(DOMArrayBuffer::create(reinterpret_cast<const unsigned char* >(key->binary()->data()), key->binary()->size()), creationContext, isolate);
95 case IDBKey::DateType: 98 case IDBKey::DateType:
96 return v8::Date::New(isolate->GetCurrentContext(), key->date()).ToLocalC hecked(); 99 return v8::Date::New(isolate->GetCurrentContext(), key->date()).ToLocalC hecked();
97 case IDBKey::ArrayType: 100 case IDBKey::ArrayType:
98 { 101 {
99 v8::Local<v8::Array> array = v8::Array::New(isolate, key->array().si ze()); 102 v8::Local<v8::Array> array = v8::Array::New(isolate, key->array().si ze());
100 for (size_t i = 0; i < key->array().size(); ++i) { 103 for (size_t i = 0; i < key->array().size(); ++i) {
101 v8::Local<v8::Value> value = toV8(key->array()[i].get(), creatio nContext, isolate); 104 v8::Local<v8::Value> value = toV8(key->array()[i].get(), creatio nContext, isolate);
102 if (value.IsEmpty()) 105 if (value.IsEmpty())
103 value = v8::Undefined(isolate); 106 value = v8::Undefined(isolate);
104 array->Set(i, value); 107 array->Set(i, value);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 static const size_t maximumDepth = 2000; 185 static const size_t maximumDepth = 2000;
183 186
184 static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate, v8::Local<v8::Value> value, Vector<v8::Local<v8::Array>>& stack, bool allowExperimentalTypes = false) 187 static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate, v8::Local<v8::Value> value, Vector<v8::Local<v8::Array>>& stack, bool allowExperimentalTypes = false)
185 { 188 {
186 if (value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value())) 189 if (value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value()))
187 return IDBKey::createNumber(value.As<v8::Number>()->Value()); 190 return IDBKey::createNumber(value.As<v8::Number>()->Value());
188 if (value->IsString()) 191 if (value->IsString())
189 return IDBKey::createString(toCoreString(value.As<v8::String>())); 192 return IDBKey::createString(toCoreString(value.As<v8::String>()));
190 if (value->IsDate() && !std::isnan(value.As<v8::Date>()->ValueOf())) 193 if (value->IsDate() && !std::isnan(value.As<v8::Date>()->ValueOf()))
191 return IDBKey::createDate(value.As<v8::Date>()->ValueOf()); 194 return IDBKey::createDate(value.As<v8::Date>()->ValueOf());
192 if (value->IsUint8Array() && (allowExperimentalTypes || RuntimeEnabledFeatur es::indexedDBExperimentalEnabled())) { 195 if (allowExperimentalTypes || RuntimeEnabledFeatures::indexedDBExperimentalE nabled()) {
193 // Per discussion in https://www.w3.org/Bugs/Public/show_bug.cgi?id=2333 2 the 196 // Experimental feature: binary keys
194 // input type is constrained to Uint8Array to match the output type. 197 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=23332
195 DOMArrayBufferView* view = blink::V8ArrayBufferView::toImpl(value.As<v8: :Object>()); 198 if (value->IsArrayBuffer()) {
196 const char* start = static_cast<const char*>(view->baseAddress()); 199 DOMArrayBuffer* buffer = blink::V8ArrayBuffer::toImpl(value.As<v8::O bject>());
197 size_t length = view->byteLength(); 200 const char* start = static_cast<const char*>(buffer->data());
198 return IDBKey::createBinary(SharedBuffer::create(start, length)); 201 size_t length = buffer->byteLength();
202 return IDBKey::createBinary(SharedBuffer::create(start, length));
cmumford 2015/04/27 17:14:23 How much do we care about overflow? length is goin
jsbell 2015/04/27 22:39:47 Covered by the FIXME at: https://code.google.com/
203 }
204 if (value->IsArrayBufferView()) {
205 DOMArrayBufferView* view = blink::V8ArrayBufferView::toImpl(value.As <v8::Object>());
206 const char* start = static_cast<const char*>(view->baseAddress());
207 size_t length = view->byteLength();
208 return IDBKey::createBinary(SharedBuffer::create(start, length));
209 }
199 } 210 }
200 if (value->IsArray()) { 211 if (value->IsArray()) {
201 v8::Local<v8::Array> array = value.As<v8::Array>(); 212 v8::Local<v8::Array> array = value.As<v8::Array>();
202 213
203 if (stack.contains(array)) 214 if (stack.contains(array))
204 return nullptr; 215 return nullptr;
205 if (stack.size() >= maximumDepth) 216 if (stack.size() >= maximumDepth)
206 return nullptr; 217 return nullptr;
207 stack.append(array); 218 stack.append(array);
208 219
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 const bool allowExperimentalTypes = true; 458 const bool allowExperimentalTypes = true;
448 IDBKey* expectedKey = createIDBKeyFromValueAndKeyPath(isolate, scriptValue.v 8Value(), value->keyPath(), allowExperimentalTypes); 459 IDBKey* expectedKey = createIDBKeyFromValueAndKeyPath(isolate, scriptValue.v 8Value(), value->keyPath(), allowExperimentalTypes);
449 ASSERT(!expectedKey || expectedKey->isEqual(value->primaryKey())); 460 ASSERT(!expectedKey || expectedKey->isEqual(value->primaryKey()));
450 461
451 bool injected = injectV8KeyIntoV8Value(isolate, keyValue.v8Value(), scriptVa lue.v8Value(), value->keyPath()); 462 bool injected = injectV8KeyIntoV8Value(isolate, keyValue.v8Value(), scriptVa lue.v8Value(), value->keyPath());
452 ASSERT_UNUSED(injected, injected); 463 ASSERT_UNUSED(injected, injected);
453 } 464 }
454 #endif 465 #endif
455 466
456 } // namespace blink 467 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698