OLD | NEW |
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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 // input type is constrained to Uint8Array to match the output type. | 180 // input type is constrained to Uint8Array to match the output type. |
181 ArrayBufferView* view = WebCore::V8ArrayBufferView::toNative(value->ToOb
ject()); | 181 ArrayBufferView* view = WebCore::V8ArrayBufferView::toNative(value->ToOb
ject()); |
182 const char* start = static_cast<const char*>(view->baseAddress()); | 182 const char* start = static_cast<const char*>(view->baseAddress()); |
183 size_t length = view->byteLength(); | 183 size_t length = view->byteLength(); |
184 return IDBKey::createBinary(SharedBuffer::create(start, length)); | 184 return IDBKey::createBinary(SharedBuffer::create(start, length)); |
185 } | 185 } |
186 if (value->IsArray()) { | 186 if (value->IsArray()) { |
187 v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); | 187 v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); |
188 | 188 |
189 if (stack.contains(array)) | 189 if (stack.contains(array)) |
190 return 0; | 190 return nullptr; |
191 if (stack.size() >= maximumDepth) | 191 if (stack.size() >= maximumDepth) |
192 return 0; | 192 return nullptr; |
193 stack.append(array); | 193 stack.append(array); |
194 | 194 |
195 IDBKey::KeyArray subkeys; | 195 IDBKey::KeyArray subkeys; |
196 uint32_t length = array->Length(); | 196 uint32_t length = array->Length(); |
197 for (uint32_t i = 0; i < length; ++i) { | 197 for (uint32_t i = 0; i < length; ++i) { |
198 v8::Local<v8::Value> item = array->Get(v8::Int32::New(isolate, i)); | 198 v8::Local<v8::Value> item = array->Get(v8::Int32::New(isolate, i)); |
199 RefPtr<IDBKey> subkey = createIDBKeyFromValue(item, stack, isolate,
allowExperimentalTypes); | 199 RefPtr<IDBKey> subkey = createIDBKeyFromValue(item, stack, isolate,
allowExperimentalTypes); |
200 if (!subkey) | 200 if (!subkey) |
201 subkeys.append(IDBKey::createInvalid()); | 201 subkeys.append(IDBKey::createInvalid()); |
202 else | 202 else |
203 subkeys.append(subkey); | 203 subkeys.append(subkey); |
204 } | 204 } |
205 | 205 |
206 stack.removeLast(); | 206 stack.removeLast(); |
207 return IDBKey::createArray(subkeys); | 207 return IDBKey::createArray(subkeys); |
208 } | 208 } |
209 return 0; | 209 return nullptr; |
210 } | 210 } |
211 | 211 |
212 static PassRefPtr<IDBKey> createIDBKeyFromValue(v8::Handle<v8::Value> value, v8:
:Isolate* isolate, bool allowExperimentalTypes = false) | 212 static PassRefPtr<IDBKey> createIDBKeyFromValue(v8::Handle<v8::Value> value, v8:
:Isolate* isolate, bool allowExperimentalTypes = false) |
213 { | 213 { |
214 Vector<v8::Handle<v8::Array> > stack; | 214 Vector<v8::Handle<v8::Array> > stack; |
215 RefPtr<IDBKey> key = createIDBKeyFromValue(value, stack, isolate, allowExper
imentalTypes); | 215 RefPtr<IDBKey> key = createIDBKeyFromValue(value, stack, isolate, allowExper
imentalTypes); |
216 if (key) | 216 if (key) |
217 return key; | 217 return key; |
218 return IDBKey::createInvalid(); | 218 return IDBKey::createInvalid(); |
219 } | 219 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 Vector<String> keyPathElements; | 310 Vector<String> keyPathElements; |
311 IDBKeyPathParseError error; | 311 IDBKeyPathParseError error; |
312 IDBParseKeyPath(keyPath, keyPathElements, error); | 312 IDBParseKeyPath(keyPath, keyPathElements, error); |
313 ASSERT(error == IDBKeyPathParseErrorNone); | 313 ASSERT(error == IDBKeyPathParseErrorNone); |
314 ASSERT(isolate->InContext()); | 314 ASSERT(isolate->InContext()); |
315 | 315 |
316 v8::HandleScope handleScope(isolate); | 316 v8::HandleScope handleScope(isolate); |
317 v8::Handle<v8::Value> v8Value(value.v8Value()); | 317 v8::Handle<v8::Value> v8Value(value.v8Value()); |
318 v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, k
eyPathElements.size(), isolate)); | 318 v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, k
eyPathElements.size(), isolate)); |
319 if (v8Key.IsEmpty()) | 319 if (v8Key.IsEmpty()) |
320 return 0; | 320 return nullptr; |
321 return createIDBKeyFromValue(v8Key, isolate, allowExperimentalTypes); | 321 return createIDBKeyFromValue(v8Key, isolate, allowExperimentalTypes); |
322 } | 322 } |
323 | 323 |
324 static PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(const ScriptValu
e& value, const IDBKeyPath& keyPath, v8::Isolate* isolate, bool allowExperimenta
lTypes = false) | 324 static PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(const ScriptValu
e& value, const IDBKeyPath& keyPath, v8::Isolate* isolate, bool allowExperimenta
lTypes = false) |
325 { | 325 { |
326 ASSERT(!keyPath.isNull()); | 326 ASSERT(!keyPath.isNull()); |
327 v8::HandleScope handleScope(isolate); | 327 v8::HandleScope handleScope(isolate); |
328 if (keyPath.type() == IDBKeyPath::ArrayType) { | 328 if (keyPath.type() == IDBKeyPath::ArrayType) { |
329 IDBKey::KeyArray result; | 329 IDBKey::KeyArray result; |
330 const Vector<String>& array = keyPath.array(); | 330 const Vector<String>& array = keyPath.array(); |
331 for (size_t i = 0; i < array.size(); ++i) { | 331 for (size_t i = 0; i < array.size(); ++i) { |
332 RefPtr<IDBKey> key = createIDBKeyFromScriptValueAndKeyPath(value, ar
ray[i], isolate, allowExperimentalTypes); | 332 RefPtr<IDBKey> key = createIDBKeyFromScriptValueAndKeyPath(value, ar
ray[i], isolate, allowExperimentalTypes); |
333 if (!key) | 333 if (!key) |
334 return 0; | 334 return nullptr; |
335 result.append(key); | 335 result.append(key); |
336 } | 336 } |
337 return IDBKey::createArray(result); | 337 return IDBKey::createArray(result); |
338 } | 338 } |
339 | 339 |
340 ASSERT(keyPath.type() == IDBKeyPath::StringType); | 340 ASSERT(keyPath.type() == IDBKeyPath::StringType); |
341 return createIDBKeyFromScriptValueAndKeyPath(value, keyPath.string(), isolat
e, allowExperimentalTypes); | 341 return createIDBKeyFromScriptValueAndKeyPath(value, keyPath.string(), isolat
e, allowExperimentalTypes); |
342 } | 342 } |
343 | 343 |
344 PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(DOMRequestState* state,
const ScriptValue& value, const IDBKeyPath& keyPath) | 344 PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(DOMRequestState* state,
const ScriptValue& value, const IDBKeyPath& keyPath) |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 const bool allowExperimentalTypes = true; | 454 const bool allowExperimentalTypes = true; |
455 RefPtr<IDBKey> expectedKey = createIDBKeyFromScriptValueAndKeyPath(scriptVal
ue, keyPath, isolate, allowExperimentalTypes); | 455 RefPtr<IDBKey> expectedKey = createIDBKeyFromScriptValueAndKeyPath(scriptVal
ue, keyPath, isolate, allowExperimentalTypes); |
456 ASSERT(!expectedKey || expectedKey->isEqual(key.get())); | 456 ASSERT(!expectedKey || expectedKey->isEqual(key.get())); |
457 | 457 |
458 bool injected = injectV8KeyIntoV8Value(keyValue.v8Value(), scriptValue.v8Val
ue(), keyPath, isolate); | 458 bool injected = injectV8KeyIntoV8Value(keyValue.v8Value(), scriptValue.v8Val
ue(), keyPath, isolate); |
459 ASSERT_UNUSED(injected, injected); | 459 ASSERT_UNUSED(injected, injected); |
460 } | 460 } |
461 #endif | 461 #endif |
462 | 462 |
463 } // namespace WebCore | 463 } // namespace WebCore |
OLD | NEW |