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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 | 172 |
173 return currentValue; | 173 return currentValue; |
174 } | 174 } |
175 | 175 |
176 static PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(const ScriptValu
e& value, const String& keyPath) | 176 static PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(const ScriptValu
e& value, const String& keyPath) |
177 { | 177 { |
178 Vector<String> keyPathElements; | 178 Vector<String> keyPathElements; |
179 IDBKeyPathParseError error; | 179 IDBKeyPathParseError error; |
180 IDBParseKeyPath(keyPath, keyPathElements, error); | 180 IDBParseKeyPath(keyPath, keyPathElements, error); |
181 ASSERT(error == IDBKeyPathParseErrorNone); | 181 ASSERT(error == IDBKeyPathParseErrorNone); |
| 182 ASSERT(v8::Context::InContext()); |
182 | 183 |
183 v8::HandleScope handleScope; | 184 v8::HandleScope handleScope; |
184 v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext
()); | |
185 | |
186 v8::Handle<v8::Value> v8Value(value.v8Value()); | 185 v8::Handle<v8::Value> v8Value(value.v8Value()); |
187 v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, k
eyPathElements.size())); | 186 v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, k
eyPathElements.size())); |
188 if (v8Key.IsEmpty()) | 187 if (v8Key.IsEmpty()) |
189 return 0; | 188 return 0; |
190 return createIDBKeyFromValue(v8Key); | 189 return createIDBKeyFromValue(v8Key); |
191 } | 190 } |
192 | 191 |
193 PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(const ScriptValue& valu
e, const IDBKeyPath& keyPath) | 192 PassRefPtr<IDBKey> createIDBKeyFromScriptValueAndKeyPath(const ScriptValue& valu
e, const IDBKeyPath& keyPath) |
194 { | 193 { |
195 IDB_TRACE("createIDBKeyFromScriptValueAndKeyPath"); | 194 IDB_TRACE("createIDBKeyFromScriptValueAndKeyPath"); |
196 ASSERT(!keyPath.isNull()); | 195 ASSERT(!keyPath.isNull()); |
| 196 ASSERT(v8::Context::InContext()); |
197 | 197 |
198 v8::HandleScope scope; | 198 |
| 199 v8::HandleScope handleScope; |
199 if (keyPath.type() == IDBKeyPath::ArrayType) { | 200 if (keyPath.type() == IDBKeyPath::ArrayType) { |
200 IDBKey::KeyArray result; | 201 IDBKey::KeyArray result; |
201 const Vector<String>& array = keyPath.array(); | 202 const Vector<String>& array = keyPath.array(); |
202 for (size_t i = 0; i < array.size(); ++i) { | 203 for (size_t i = 0; i < array.size(); ++i) { |
203 RefPtr<IDBKey> key = createIDBKeyFromScriptValueAndKeyPath(value, ar
ray[i]); | 204 RefPtr<IDBKey> key = createIDBKeyFromScriptValueAndKeyPath(value, ar
ray[i]); |
204 if (!key) | 205 if (!key) |
205 return 0; | 206 return 0; |
206 result.append(key); | 207 result.append(key); |
207 } | 208 } |
208 return IDBKey::createArray(result); | 209 return IDBKey::createArray(result); |
209 } | 210 } |
210 | 211 |
211 ASSERT(keyPath.type() == IDBKeyPath::StringType); | 212 ASSERT(keyPath.type() == IDBKeyPath::StringType); |
212 return createIDBKeyFromScriptValueAndKeyPath(value, keyPath.string()); | 213 return createIDBKeyFromScriptValueAndKeyPath(value, keyPath.string()); |
213 } | 214 } |
214 | 215 |
215 // FIXME: The only reason this exists is because we need a v8::Context and scope
inside a timer. Is there a better / more general way to do this? | |
216 ScriptValue deserializeIDBValue(ScriptExecutionContext* scriptContext, PassRefPt
r<SerializedScriptValue> prpValue) | 216 ScriptValue deserializeIDBValue(ScriptExecutionContext* scriptContext, PassRefPt
r<SerializedScriptValue> prpValue) |
217 { | 217 { |
| 218 ASSERT(v8::Context::InContext()); |
218 v8::HandleScope handleScope; | 219 v8::HandleScope handleScope; |
219 v8::Context::Scope contextScope(toV8Context(scriptContext, UseCurrentWorld))
; | |
220 RefPtr<SerializedScriptValue> serializedValue = prpValue; | 220 RefPtr<SerializedScriptValue> serializedValue = prpValue; |
221 if (serializedValue) | 221 if (serializedValue) |
222 return ScriptValue(serializedValue->deserialize()); | 222 return ScriptValue(serializedValue->deserialize()); |
223 return ScriptValue(v8::Null()); | 223 return ScriptValue(v8::Null()); |
224 } | 224 } |
225 | 225 |
226 bool injectIDBKeyIntoScriptValue(PassRefPtr<IDBKey> key, ScriptValue& value, con
st IDBKeyPath& keyPath) | 226 bool injectIDBKeyIntoScriptValue(PassRefPtr<IDBKey> key, ScriptValue& value, con
st IDBKeyPath& keyPath) |
227 { | 227 { |
228 IDB_TRACE("injectIDBKeyIntoScriptValue"); | 228 IDB_TRACE("injectIDBKeyIntoScriptValue"); |
| 229 ASSERT(v8::Context::InContext()); |
229 | 230 |
230 ASSERT(keyPath.type() == IDBKeyPath::StringType); | 231 ASSERT(keyPath.type() == IDBKeyPath::StringType); |
231 Vector<String> keyPathElements; | 232 Vector<String> keyPathElements; |
232 IDBKeyPathParseError error; | 233 IDBKeyPathParseError error; |
233 IDBParseKeyPath(keyPath.string(), keyPathElements, error); | 234 IDBParseKeyPath(keyPath.string(), keyPathElements, error); |
234 ASSERT(error == IDBKeyPathParseErrorNone); | 235 ASSERT(error == IDBKeyPathParseErrorNone); |
235 | 236 |
236 if (!keyPathElements.size()) | 237 if (!keyPathElements.size()) |
237 return 0; | 238 return 0; |
238 | 239 |
239 v8::HandleScope handleScope; | 240 v8::HandleScope handleScope; |
240 v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext
()); | |
241 | |
242 v8::Handle<v8::Value> v8Value(value.v8Value()); | 241 v8::Handle<v8::Value> v8Value(value.v8Value()); |
243 v8::Handle<v8::Value> parent(ensureNthValueOnKeyPath(v8Value, keyPathElement
s, keyPathElements.size() - 1)); | 242 v8::Handle<v8::Value> parent(ensureNthValueOnKeyPath(v8Value, keyPathElement
s, keyPathElements.size() - 1)); |
244 if (parent.IsEmpty()) | 243 if (parent.IsEmpty()) |
245 return false; | 244 return false; |
246 | 245 |
247 if (!set(parent, keyPathElements.last(), toV8(key.get()))) | 246 if (!set(parent, keyPathElements.last(), toV8(key.get()))) |
248 return false; | 247 return false; |
249 | 248 |
250 return true; | 249 return true; |
251 } | 250 } |
252 | 251 |
253 bool canInjectIDBKeyIntoScriptValue(const ScriptValue& scriptValue, const IDBKey
Path& keyPath) | 252 bool canInjectIDBKeyIntoScriptValue(const ScriptValue& scriptValue, const IDBKey
Path& keyPath) |
254 { | 253 { |
255 IDB_TRACE("canInjectIDBKeyIntoScriptValue"); | 254 IDB_TRACE("canInjectIDBKeyIntoScriptValue"); |
256 ASSERT(keyPath.type() == IDBKeyPath::StringType); | 255 ASSERT(keyPath.type() == IDBKeyPath::StringType); |
257 Vector<String> keyPathElements; | 256 Vector<String> keyPathElements; |
258 IDBKeyPathParseError error; | 257 IDBKeyPathParseError error; |
259 IDBParseKeyPath(keyPath.string(), keyPathElements, error); | 258 IDBParseKeyPath(keyPath.string(), keyPathElements, error); |
260 ASSERT(error == IDBKeyPathParseErrorNone); | 259 ASSERT(error == IDBKeyPathParseErrorNone); |
261 | 260 |
262 if (!keyPathElements.size()) | 261 if (!keyPathElements.size()) |
263 return false; | 262 return false; |
264 | 263 |
265 v8::Handle<v8::Value> v8Value(scriptValue.v8Value()); | 264 v8::Handle<v8::Value> v8Value(scriptValue.v8Value()); |
266 return canInjectNthValueOnKeyPath(v8Value, keyPathElements, keyPathElements.
size() - 1); | 265 return canInjectNthValueOnKeyPath(v8Value, keyPathElements, keyPathElements.
size() - 1); |
267 } | 266 } |
268 | 267 |
269 ScriptValue idbKeyToScriptValue(ScriptExecutionContext* scriptContext, PassRefPt
r<IDBKey> key) | 268 ScriptValue idbKeyToScriptValue(ScriptExecutionContext* scriptContext, PassRefPt
r<IDBKey> key) |
270 { | 269 { |
| 270 ASSERT(v8::Context::InContext()); |
271 v8::HandleScope handleScope; | 271 v8::HandleScope handleScope; |
272 v8::Context::Scope contextScope(toV8Context(scriptContext, UseCurrentWorld))
; | |
273 | |
274 v8::Handle<v8::Value> v8Value(toV8(key.get())); | 272 v8::Handle<v8::Value> v8Value(toV8(key.get())); |
275 return ScriptValue(v8Value); | 273 return ScriptValue(v8Value); |
276 } | 274 } |
277 | 275 |
278 } // namespace WebCore | 276 } // namespace WebCore |
279 | 277 |
280 #endif | 278 #endif |
OLD | NEW |