| 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 | 
|---|