| 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 return array; | 67 return array; |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 ASSERT_NOT_REACHED(); | 71 ASSERT_NOT_REACHED(); |
| 72 return v8Undefined(); | 72 return v8Undefined(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 static const size_t maximumDepth = 2000; | 75 static const size_t maximumDepth = 2000; |
| 76 | 76 |
| 77 static PassRefPtr<IDBKey> createIDBKeyFromValue(v8::Handle<v8::Value> value, Vec
tor<v8::Handle<v8::Array> >& stack) | 77 static PassRefPtr<IDBKey> createIDBKeyFromValue(v8::Handle<v8::Value> value, Vec
tor<v8::Handle<v8::Array> >& stack, v8::Isolate* isolate) |
| 78 { | 78 { |
| 79 if (value->IsNumber() && !std::isnan(value->NumberValue())) | 79 if (value->IsNumber() && !std::isnan(value->NumberValue())) |
| 80 return IDBKey::createNumber(value->NumberValue()); | 80 return IDBKey::createNumber(value->NumberValue()); |
| 81 if (value->IsString()) | 81 if (value->IsString()) |
| 82 return IDBKey::createString(toWebCoreString(value)); | 82 return IDBKey::createString(toWebCoreString(value)); |
| 83 if (value->IsDate() && !std::isnan(value->NumberValue())) | 83 if (value->IsDate() && !std::isnan(value->NumberValue())) |
| 84 return IDBKey::createDate(value->NumberValue()); | 84 return IDBKey::createDate(value->NumberValue()); |
| 85 if (value->IsArray()) { | 85 if (value->IsArray()) { |
| 86 v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); | 86 v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); |
| 87 | 87 |
| 88 if (stack.contains(array)) | 88 if (stack.contains(array)) |
| 89 return 0; | 89 return 0; |
| 90 if (stack.size() >= maximumDepth) | 90 if (stack.size() >= maximumDepth) |
| 91 return 0; | 91 return 0; |
| 92 stack.append(array); | 92 stack.append(array); |
| 93 | 93 |
| 94 IDBKey::KeyArray subkeys; | 94 IDBKey::KeyArray subkeys; |
| 95 uint32_t length = array->Length(); | 95 uint32_t length = array->Length(); |
| 96 for (uint32_t i = 0; i < length; ++i) { | 96 for (uint32_t i = 0; i < length; ++i) { |
| 97 v8::Local<v8::Value> item = array->Get(v8::Int32::New(i)); | 97 v8::Local<v8::Value> item = array->Get(v8::Int32::New(i, isolate)); |
| 98 RefPtr<IDBKey> subkey = createIDBKeyFromValue(item, stack); | 98 RefPtr<IDBKey> subkey = createIDBKeyFromValue(item, stack, isolate); |
| 99 if (!subkey) | 99 if (!subkey) |
| 100 subkeys.append(IDBKey::createInvalid()); | 100 subkeys.append(IDBKey::createInvalid()); |
| 101 else | 101 else |
| 102 subkeys.append(subkey); | 102 subkeys.append(subkey); |
| 103 } | 103 } |
| 104 | 104 |
| 105 stack.removeLast(); | 105 stack.removeLast(); |
| 106 return IDBKey::createArray(subkeys); | 106 return IDBKey::createArray(subkeys); |
| 107 } | 107 } |
| 108 return 0; | 108 return 0; |
| 109 } | 109 } |
| 110 | 110 |
| 111 PassRefPtr<IDBKey> createIDBKeyFromValue(v8::Handle<v8::Value> value) | 111 static PassRefPtr<IDBKey> createIDBKeyFromValue(v8::Handle<v8::Value> value, v8:
:Isolate* isolate) |
| 112 { | 112 { |
| 113 Vector<v8::Handle<v8::Array> > stack; | 113 Vector<v8::Handle<v8::Array> > stack; |
| 114 RefPtr<IDBKey> key = createIDBKeyFromValue(value, stack); | 114 RefPtr<IDBKey> key = createIDBKeyFromValue(value, stack, isolate); |
| 115 if (key) | 115 if (key) |
| 116 return key; | 116 return key; |
| 117 return IDBKey::createInvalid(); | 117 return IDBKey::createInvalid(); |
| 118 } | 118 } |
| 119 | 119 |
| 120 template<typename T> | 120 template<typename T> |
| 121 static bool getValueFrom(T indexOrName, v8::Handle<v8::Value>& v8Value) | 121 static bool getValueFrom(T indexOrName, v8::Handle<v8::Value>& v8Value) |
| 122 { | 122 { |
| 123 v8::Local<v8::Object> object = v8Value->ToObject(); | 123 v8::Local<v8::Object> object = v8Value->ToObject(); |
| 124 if (!object->Has(indexOrName)) | 124 if (!object->Has(indexOrName)) |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 IDBKeyPathParseError error; | 210 IDBKeyPathParseError error; |
| 211 IDBParseKeyPath(keyPath, keyPathElements, error); | 211 IDBParseKeyPath(keyPath, keyPathElements, error); |
| 212 ASSERT(error == IDBKeyPathParseErrorNone); | 212 ASSERT(error == IDBKeyPathParseErrorNone); |
| 213 ASSERT(v8::Context::InContext()); | 213 ASSERT(v8::Context::InContext()); |
| 214 | 214 |
| 215 v8::HandleScope handleScope(isolate); | 215 v8::HandleScope handleScope(isolate); |
| 216 v8::Handle<v8::Value> v8Value(value.v8Value()); | 216 v8::Handle<v8::Value> v8Value(value.v8Value()); |
| 217 v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, k
eyPathElements.size(), isolate)); | 217 v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, k
eyPathElements.size(), isolate)); |
| 218 if (v8Key.IsEmpty()) | 218 if (v8Key.IsEmpty()) |
| 219 return 0; | 219 return 0; |
| 220 return createIDBKeyFromValue(v8Key); | 220 return createIDBKeyFromValue(v8Key, isolate); |
| 221 } | 221 } |
| 222 | 222 |
| 223 PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(DOMRequestState* state,
const ScriptValue& value, const IDBKeyPath& keyPath) | 223 PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(DOMRequestState* state,
const ScriptValue& value, const IDBKeyPath& keyPath) |
| 224 { | 224 { |
| 225 IDB_TRACE("createIDBKeyFromScriptValueAndKeyPath"); | 225 IDB_TRACE("createIDBKeyFromScriptValueAndKeyPath"); |
| 226 ASSERT(!keyPath.isNull()); | 226 ASSERT(!keyPath.isNull()); |
| 227 ASSERT(v8::Context::InContext()); | 227 ASSERT(v8::Context::InContext()); |
| 228 | 228 |
| 229 | 229 |
| 230 v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate:
:GetCurrent(); | 230 v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate:
:GetCurrent(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 v8::Handle<v8::Value> v8Value(idbKeyToV8Value(key.get(), state->context()->G
etIsolate())); | 323 v8::Handle<v8::Value> v8Value(idbKeyToV8Value(key.get(), state->context()->G
etIsolate())); |
| 324 return ScriptValue(v8Value); | 324 return ScriptValue(v8Value); |
| 325 } | 325 } |
| 326 | 326 |
| 327 PassRefPtr<IDBKey> scriptValueToIDBKey(DOMRequestState* state, const ScriptValue
& scriptValue) | 327 PassRefPtr<IDBKey> scriptValueToIDBKey(DOMRequestState* state, const ScriptValue
& scriptValue) |
| 328 { | 328 { |
| 329 ASSERT(v8::Context::InContext()); | 329 ASSERT(v8::Context::InContext()); |
| 330 v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate:
:GetCurrent(); | 330 v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate:
:GetCurrent(); |
| 331 v8::HandleScope handleScope(isolate); | 331 v8::HandleScope handleScope(isolate); |
| 332 v8::Handle<v8::Value> v8Value(scriptValue.v8Value()); | 332 v8::Handle<v8::Value> v8Value(scriptValue.v8Value()); |
| 333 return createIDBKeyFromValue(v8Value); | 333 return createIDBKeyFromValue(v8Value, isolate); |
| 334 } | 334 } |
| 335 | 335 |
| 336 PassRefPtr<IDBKeyRange> scriptValueToIDBKeyRange(DOMRequestState* state, const S
criptValue& scriptValue) | 336 PassRefPtr<IDBKeyRange> scriptValueToIDBKeyRange(DOMRequestState* state, const S
criptValue& scriptValue) |
| 337 { | 337 { |
| 338 v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate:
:GetCurrent(); | 338 v8::Isolate* isolate = state ? state->context()->GetIsolate() : v8::Isolate:
:GetCurrent(); |
| 339 v8::HandleScope handleScope(isolate); | 339 v8::HandleScope handleScope(isolate); |
| 340 v8::Handle<v8::Value> value(scriptValue.v8Value()); | 340 v8::Handle<v8::Value> value(scriptValue.v8Value()); |
| 341 if (V8IDBKeyRange::HasInstance(value, isolate, worldType(isolate))) | 341 if (V8IDBKeyRange::HasInstance(value, isolate, worldType(isolate))) |
| 342 return V8IDBKeyRange::toNative(value.As<v8::Object>()); | 342 return V8IDBKeyRange::toNative(value.As<v8::Object>()); |
| 343 return 0; | 343 return 0; |
| 344 } | 344 } |
| 345 | 345 |
| 346 } // namespace WebCore | 346 } // namespace WebCore |
| OLD | NEW |