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

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

Issue 2817533003: Replace ASSERT, RELEASE_ASSERT, and ASSERT_NOT_REACHED in bindings (Closed)
Patch Set: fixed dcheck build error Created 3 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
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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 v8::Local<v8::Object> creation_context, 66 v8::Local<v8::Object> creation_context,
67 v8::Isolate* isolate) { 67 v8::Isolate* isolate) {
68 switch (value.GetType()) { 68 switch (value.GetType()) {
69 case IDBKeyPath::kNullType: 69 case IDBKeyPath::kNullType:
70 return v8::Null(isolate); 70 return v8::Null(isolate);
71 case IDBKeyPath::kStringType: 71 case IDBKeyPath::kStringType:
72 return V8String(isolate, value.GetString()); 72 return V8String(isolate, value.GetString());
73 case IDBKeyPath::kArrayType: 73 case IDBKeyPath::kArrayType:
74 return ToV8(value.Array(), creation_context, isolate); 74 return ToV8(value.Array(), creation_context, isolate);
75 } 75 }
76 ASSERT_NOT_REACHED(); 76 NOTREACHED();
77 return v8::Undefined(isolate); 77 return v8::Undefined(isolate);
78 } 78 }
79 79
80 v8::Local<v8::Value> ToV8(const IDBKey* key, 80 v8::Local<v8::Value> ToV8(const IDBKey* key,
81 v8::Local<v8::Object> creation_context, 81 v8::Local<v8::Object> creation_context,
82 v8::Isolate* isolate) { 82 v8::Isolate* isolate) {
83 if (!key) { 83 if (!key) {
84 // The IndexedDB spec requires that absent keys appear as attribute 84 // The IndexedDB spec requires that absent keys appear as attribute
85 // values as undefined, rather than the more typical (for DOM) null. 85 // values as undefined, rather than the more typical (for DOM) null.
86 // This appears on the |upper| and |lower| attributes of IDBKeyRange. 86 // This appears on the |upper| and |lower| attributes of IDBKeyRange.
(...skipping 27 matching lines...) Expand all
114 ToV8(key->Array()[i].Get(), creation_context, isolate); 114 ToV8(key->Array()[i].Get(), creation_context, isolate);
115 if (value.IsEmpty()) 115 if (value.IsEmpty())
116 value = v8::Undefined(isolate); 116 value = v8::Undefined(isolate);
117 if (!V8CallBoolean(array->CreateDataProperty(context, i, value))) 117 if (!V8CallBoolean(array->CreateDataProperty(context, i, value)))
118 return V8Undefined(); 118 return V8Undefined();
119 } 119 }
120 return array; 120 return array;
121 } 121 }
122 } 122 }
123 123
124 ASSERT_NOT_REACHED(); 124 NOTREACHED();
125 return V8Undefined(); 125 return V8Undefined();
126 } 126 }
127 127
128 // IDBAny is a variant type used to hold the values produced by the |result| 128 // IDBAny is a variant type used to hold the values produced by the |result|
129 // attribute of IDBRequest and (as a convenience) the |source| attribute of 129 // attribute of IDBRequest and (as a convenience) the |source| attribute of
130 // IDBRequest and IDBCursor. 130 // IDBRequest and IDBCursor.
131 // TODO(jsbell): Replace the use of IDBAny for |source| attributes (which are 131 // TODO(jsbell): Replace the use of IDBAny for |source| attributes (which are
132 // ScriptWrappable types) using unions per IDL. 132 // ScriptWrappable types) using unions per IDL.
133 v8::Local<v8::Value> ToV8(const IDBAny* impl, 133 v8::Local<v8::Value> ToV8(const IDBAny* impl,
134 v8::Local<v8::Object> creation_context, 134 v8::Local<v8::Object> creation_context,
(...skipping 22 matching lines...) Expand all
157 return DeserializeIDBValue(isolate, creation_context, impl->Value()); 157 return DeserializeIDBValue(isolate, creation_context, impl->Value());
158 case IDBAny::kIDBValueArrayType: 158 case IDBAny::kIDBValueArrayType:
159 return DeserializeIDBValueArray(isolate, creation_context, 159 return DeserializeIDBValueArray(isolate, creation_context,
160 impl->Values()); 160 impl->Values());
161 case IDBAny::kIntegerType: 161 case IDBAny::kIntegerType:
162 return v8::Number::New(isolate, impl->Integer()); 162 return v8::Number::New(isolate, impl->Integer());
163 case IDBAny::kKeyType: 163 case IDBAny::kKeyType:
164 return ToV8(impl->Key(), creation_context, isolate); 164 return ToV8(impl->Key(), creation_context, isolate);
165 } 165 }
166 166
167 ASSERT_NOT_REACHED(); 167 NOTREACHED();
168 return v8::Undefined(isolate); 168 return v8::Undefined(isolate);
169 } 169 }
170 170
171 static const size_t kMaximumDepth = 2000; 171 static const size_t kMaximumDepth = 2000;
172 172
173 static IDBKey* CreateIDBKeyFromValue(v8::Isolate* isolate, 173 static IDBKey* CreateIDBKeyFromValue(v8::Isolate* isolate,
174 v8::Local<v8::Value> value, 174 v8::Local<v8::Value> value,
175 Vector<v8::Local<v8::Array>>& stack, 175 Vector<v8::Local<v8::Array>>& stack,
176 ExceptionState& exception_state) { 176 ExceptionState& exception_state) {
177 if (value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value())) 177 if (value->IsNumber() && !std::isnan(value.As<v8::Number>()->Value()))
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 return name == "name" || name == "lastModified" || 265 return name == "name" || name == "lastModified" ||
266 name == "lastModifiedDate"; 266 name == "lastModifiedDate";
267 return false; 267 return false;
268 } 268 }
269 269
270 // Assumes a valid key path. 270 // Assumes a valid key path.
271 static Vector<String> ParseKeyPath(const String& key_path) { 271 static Vector<String> ParseKeyPath(const String& key_path) {
272 Vector<String> elements; 272 Vector<String> elements;
273 IDBKeyPathParseError error; 273 IDBKeyPathParseError error;
274 IDBParseKeyPath(key_path, elements, error); 274 IDBParseKeyPath(key_path, elements, error);
275 ASSERT(error == kIDBKeyPathParseErrorNone); 275 DCHECK_EQ(error, kIDBKeyPathParseErrorNone);
276 return elements; 276 return elements;
277 } 277 }
278 278
279 static IDBKey* CreateIDBKeyFromValueAndKeyPath( 279 static IDBKey* CreateIDBKeyFromValueAndKeyPath(
280 v8::Isolate* isolate, 280 v8::Isolate* isolate,
281 v8::Local<v8::Value> v8_value, 281 v8::Local<v8::Value> v8_value,
282 const String& key_path, 282 const String& key_path,
283 ExceptionState& exception_state) { 283 ExceptionState& exception_state) {
284 Vector<String> key_path_elements = ParseKeyPath(key_path); 284 Vector<String> key_path_elements = ParseKeyPath(key_path);
285 ASSERT(isolate->InContext()); 285 DCHECK(isolate->InContext());
286 286
287 v8::HandleScope handle_scope(isolate); 287 v8::HandleScope handle_scope(isolate);
288 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 288 v8::Local<v8::Context> context = isolate->GetCurrentContext();
289 v8::TryCatch block(isolate); 289 v8::TryCatch block(isolate);
290 for (size_t i = 0; i < key_path_elements.size(); ++i) { 290 for (size_t i = 0; i < key_path_elements.size(); ++i) {
291 const String& element = key_path_elements[i]; 291 const String& element = key_path_elements[i];
292 292
293 // Special cases from https://w3c.github.io/IndexedDB/#key-path-construct 293 // Special cases from https://w3c.github.io/IndexedDB/#key-path-construct
294 // These access special or non-own properties directly, to avoid side 294 // These access special or non-own properties directly, to avoid side
295 // effects. 295 // effects.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 } 349 }
350 } 350 }
351 return CreateIDBKeyFromValue(isolate, v8_value, exception_state); 351 return CreateIDBKeyFromValue(isolate, v8_value, exception_state);
352 } 352 }
353 353
354 static IDBKey* CreateIDBKeyFromValueAndKeyPath( 354 static IDBKey* CreateIDBKeyFromValueAndKeyPath(
355 v8::Isolate* isolate, 355 v8::Isolate* isolate,
356 v8::Local<v8::Value> value, 356 v8::Local<v8::Value> value,
357 const IDBKeyPath& key_path, 357 const IDBKeyPath& key_path,
358 ExceptionState& exception_state) { 358 ExceptionState& exception_state) {
359 ASSERT(!key_path.IsNull()); 359 DCHECK(!key_path.IsNull());
360 v8::HandleScope handle_scope(isolate); 360 v8::HandleScope handle_scope(isolate);
361 if (key_path.GetType() == IDBKeyPath::kArrayType) { 361 if (key_path.GetType() == IDBKeyPath::kArrayType) {
362 IDBKey::KeyArray result; 362 IDBKey::KeyArray result;
363 const Vector<String>& array = key_path.Array(); 363 const Vector<String>& array = key_path.Array();
364 for (size_t i = 0; i < array.size(); ++i) { 364 for (size_t i = 0; i < array.size(); ++i) {
365 IDBKey* key = CreateIDBKeyFromValueAndKeyPath(isolate, value, array[i], 365 IDBKey* key = CreateIDBKeyFromValueAndKeyPath(isolate, value, array[i],
366 exception_state); 366 exception_state);
367 if (!key) 367 if (!key)
368 return nullptr; 368 return nullptr;
369 result.push_back(key); 369 result.push_back(key);
370 } 370 }
371 return IDBKey::CreateArray(result); 371 return IDBKey::CreateArray(result);
372 } 372 }
373 373
374 ASSERT(key_path.GetType() == IDBKeyPath::kStringType); 374 DCHECK_EQ(key_path.GetType(), IDBKeyPath::kStringType);
375 return CreateIDBKeyFromValueAndKeyPath(isolate, value, key_path.GetString(), 375 return CreateIDBKeyFromValueAndKeyPath(isolate, value, key_path.GetString(),
376 exception_state); 376 exception_state);
377 } 377 }
378 378
379 // Deserialize just the value data & blobInfo from the given IDBValue. 379 // Deserialize just the value data & blobInfo from the given IDBValue.
380 // 380 //
381 // Primary key injection is performed in deserializeIDBValue() below. 381 // Primary key injection is performed in deserializeIDBValue() below.
382 static v8::Local<v8::Value> DeserializeIDBValueData(v8::Isolate* isolate, 382 static v8::Local<v8::Value> DeserializeIDBValueData(v8::Isolate* isolate,
383 const IDBValue* value) { 383 const IDBValue* value) {
384 ASSERT(isolate->InContext()); 384 DCHECK(isolate->InContext());
385 if (!value || value->IsNull()) 385 if (!value || value->IsNull())
386 return v8::Null(isolate); 386 return v8::Null(isolate);
387 387
388 RefPtr<SerializedScriptValue> serialized_value = 388 RefPtr<SerializedScriptValue> serialized_value =
389 value->CreateSerializedValue(); 389 value->CreateSerializedValue();
390 SerializedScriptValue::DeserializeOptions options; 390 SerializedScriptValue::DeserializeOptions options;
391 options.blob_info = value->BlobInfo(); 391 options.blob_info = value->BlobInfo();
392 options.read_wasm_from_stream = true; 392 options.read_wasm_from_stream = true;
393 393
394 // deserialize() returns null when serialization fails. This is sub-optimal 394 // deserialize() returns null when serialization fails. This is sub-optimal
395 // because IndexedDB values can be null, so an application cannot distinguish 395 // because IndexedDB values can be null, so an application cannot distinguish
396 // between a de-serialization failure and a legitimately stored null value. 396 // between a de-serialization failure and a legitimately stored null value.
397 // 397 //
398 // TODO(crbug.com/703704): Ideally, SerializedScriptValue should return an 398 // TODO(crbug.com/703704): Ideally, SerializedScriptValue should return an
399 // empty handle on serialization errors, which should be handled by higher 399 // empty handle on serialization errors, which should be handled by higher
400 // layers. For example, IndexedDB could throw an exception, abort the 400 // layers. For example, IndexedDB could throw an exception, abort the
401 // transaction, or close the database connection. 401 // transaction, or close the database connection.
402 return serialized_value->Deserialize(isolate, options); 402 return serialized_value->Deserialize(isolate, options);
403 } 403 }
404 404
405 // Deserialize the entire IDBValue. 405 // Deserialize the entire IDBValue.
406 // 406 //
407 // On top of deserializeIDBValueData(), this handles the special case of having 407 // On top of deserializeIDBValueData(), this handles the special case of having
408 // to inject a key into the de-serialized value. See injectV8KeyIntoV8Value() 408 // to inject a key into the de-serialized value. See injectV8KeyIntoV8Value()
409 // for details. 409 // for details.
410 v8::Local<v8::Value> DeserializeIDBValue(v8::Isolate* isolate, 410 v8::Local<v8::Value> DeserializeIDBValue(v8::Isolate* isolate,
411 v8::Local<v8::Object> creation_context, 411 v8::Local<v8::Object> creation_context,
412 const IDBValue* value) { 412 const IDBValue* value) {
413 ASSERT(isolate->InContext()); 413 DCHECK(isolate->InContext());
414 if (!value || value->IsNull()) 414 if (!value || value->IsNull())
415 return v8::Null(isolate); 415 return v8::Null(isolate);
416 416
417 v8::Local<v8::Value> v8_value = DeserializeIDBValueData(isolate, value); 417 v8::Local<v8::Value> v8_value = DeserializeIDBValueData(isolate, value);
418 if (value->PrimaryKey()) { 418 if (value->PrimaryKey()) {
419 v8::Local<v8::Value> key = 419 v8::Local<v8::Value> key =
420 ToV8(value->PrimaryKey(), creation_context, isolate); 420 ToV8(value->PrimaryKey(), creation_context, isolate);
421 if (key.IsEmpty()) 421 if (key.IsEmpty())
422 return v8::Local<v8::Value>(); 422 return v8::Local<v8::Value>();
423 423
424 InjectV8KeyIntoV8Value(isolate, key, v8_value, value->KeyPath()); 424 InjectV8KeyIntoV8Value(isolate, key, v8_value, value->KeyPath());
425 425
426 // TODO(crbug.com/703704): Throw an error here or at a higher layer if 426 // TODO(crbug.com/703704): Throw an error here or at a higher layer if
427 // injectV8KeyIntoV8Value() returns false, which means that the serialized 427 // injectV8KeyIntoV8Value() returns false, which means that the serialized
428 // value got corrupted while on disk. 428 // value got corrupted while on disk.
429 } 429 }
430 430
431 return v8_value; 431 return v8_value;
432 } 432 }
433 433
434 static v8::Local<v8::Value> DeserializeIDBValueArray( 434 static v8::Local<v8::Value> DeserializeIDBValueArray(
435 v8::Isolate* isolate, 435 v8::Isolate* isolate,
436 v8::Local<v8::Object> creation_context, 436 v8::Local<v8::Object> creation_context,
437 const Vector<RefPtr<IDBValue>>* values) { 437 const Vector<RefPtr<IDBValue>>* values) {
438 ASSERT(isolate->InContext()); 438 DCHECK(isolate->InContext());
439 439
440 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 440 v8::Local<v8::Context> context = isolate->GetCurrentContext();
441 v8::Local<v8::Array> array = v8::Array::New(isolate, values->size()); 441 v8::Local<v8::Array> array = v8::Array::New(isolate, values->size());
442 for (size_t i = 0; i < values->size(); ++i) { 442 for (size_t i = 0; i < values->size(); ++i) {
443 v8::Local<v8::Value> v8_value = 443 v8::Local<v8::Value> v8_value =
444 DeserializeIDBValue(isolate, creation_context, values->at(i).Get()); 444 DeserializeIDBValue(isolate, creation_context, values->at(i).Get());
445 if (v8_value.IsEmpty()) 445 if (v8_value.IsEmpty())
446 v8_value = v8::Undefined(isolate); 446 v8_value = v8::Undefined(isolate);
447 if (!V8CallBoolean(array->CreateDataProperty(context, i, v8_value))) 447 if (!V8CallBoolean(array->CreateDataProperty(context, i, v8_value)))
448 return V8Undefined(); 448 return V8Undefined();
(...skipping 17 matching lines...) Expand all
466 // because this type of code is a likely victim to security exploits. 466 // because this type of code is a likely victim to security exploits.
467 // 467 //
468 // We handle this special case by serializing and writing values without the 468 // We handle this special case by serializing and writing values without the
469 // corresponding keys. At read time, we obtain the keys and the values 469 // corresponding keys. At read time, we obtain the keys and the values
470 // separately, and we inject the keys into values. 470 // separately, and we inject the keys into values.
471 bool InjectV8KeyIntoV8Value(v8::Isolate* isolate, 471 bool InjectV8KeyIntoV8Value(v8::Isolate* isolate,
472 v8::Local<v8::Value> key, 472 v8::Local<v8::Value> key,
473 v8::Local<v8::Value> value, 473 v8::Local<v8::Value> value,
474 const IDBKeyPath& key_path) { 474 const IDBKeyPath& key_path) {
475 IDB_TRACE("injectIDBV8KeyIntoV8Value"); 475 IDB_TRACE("injectIDBV8KeyIntoV8Value");
476 ASSERT(isolate->InContext()); 476 DCHECK(isolate->InContext());
477 477
478 ASSERT(key_path.GetType() == IDBKeyPath::kStringType); 478 DCHECK_EQ(key_path.GetType(), IDBKeyPath::kStringType);
479 Vector<String> key_path_elements = ParseKeyPath(key_path.GetString()); 479 Vector<String> key_path_elements = ParseKeyPath(key_path.GetString());
480 480
481 // The conbination of a key generator and an empty key path is forbidden by 481 // The conbination of a key generator and an empty key path is forbidden by
482 // spec. 482 // spec.
483 if (!key_path_elements.size()) { 483 if (!key_path_elements.size()) {
484 ASSERT_NOT_REACHED(); 484 NOTREACHED();
485 return false; 485 return false;
486 } 486 }
487 487
488 v8::HandleScope handle_scope(isolate); 488 v8::HandleScope handle_scope(isolate);
489 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 489 v8::Local<v8::Context> context = isolate->GetCurrentContext();
490 490
491 // For an object o = {} which should have keypath 'a.b.c' and key k, this 491 // For an object o = {} which should have keypath 'a.b.c' and key k, this
492 // populates o to be {a:{b:{}}}. This is only applied to deserialized 492 // populates o to be {a:{b:{}}}. This is only applied to deserialized
493 // values, so we can assume that there are no getters/setters on the 493 // values, so we can assume that there are no getters/setters on the
494 // object itself (though there might be on the prototype chain). 494 // object itself (though there might be on the prototype chain).
(...skipping 16 matching lines...) Expand all
511 // 511 //
512 // (2) Bugs that write a value which is incompatible with the primary key 512 // (2) Bugs that write a value which is incompatible with the primary key
513 // injection required by the object store. The simplest example is writing 513 // injection required by the object store. The simplest example is writing
514 // numbers or booleans to an object store with an auto-incrementing primary 514 // numbers or booleans to an object store with an auto-incrementing primary
515 // keys. 515 // keys.
516 for (size_t i = 0; i < key_path_elements.size() - 1; ++i) { 516 for (size_t i = 0; i < key_path_elements.size() - 1; ++i) {
517 if (!value->IsObject()) 517 if (!value->IsObject())
518 return false; 518 return false;
519 519
520 const String& key_path_element = key_path_elements[i]; 520 const String& key_path_element = key_path_elements[i];
521 ASSERT(!IsImplicitProperty(isolate, value, key_path_element)); 521 DCHECK(!IsImplicitProperty(isolate, value, key_path_element));
522 v8::Local<v8::Object> object = value.As<v8::Object>(); 522 v8::Local<v8::Object> object = value.As<v8::Object>();
523 v8::Local<v8::String> property = V8String(isolate, key_path_element); 523 v8::Local<v8::String> property = V8String(isolate, key_path_element);
524 bool has_own_property; 524 bool has_own_property;
525 if (!V8Call(object->HasOwnProperty(context, property), has_own_property)) 525 if (!V8Call(object->HasOwnProperty(context, property), has_own_property))
526 return false; 526 return false;
527 if (has_own_property) { 527 if (has_own_property) {
528 if (!object->Get(context, property).ToLocal(&value)) 528 if (!object->Get(context, property).ToLocal(&value))
529 return false; 529 return false;
530 } else { 530 } else {
531 value = v8::Object::New(isolate); 531 value = v8::Object::New(isolate);
(...skipping 22 matching lines...) Expand all
554 return true; 554 return true;
555 } 555 }
556 556
557 // Verify that an value can have an generated key inserted at the location 557 // Verify that an value can have an generated key inserted at the location
558 // specified by the key path (by injectV8KeyIntoV8Value) when the object is 558 // specified by the key path (by injectV8KeyIntoV8Value) when the object is
559 // later deserialized. 559 // later deserialized.
560 bool CanInjectIDBKeyIntoScriptValue(v8::Isolate* isolate, 560 bool CanInjectIDBKeyIntoScriptValue(v8::Isolate* isolate,
561 const ScriptValue& script_value, 561 const ScriptValue& script_value,
562 const IDBKeyPath& key_path) { 562 const IDBKeyPath& key_path) {
563 IDB_TRACE("canInjectIDBKeyIntoScriptValue"); 563 IDB_TRACE("canInjectIDBKeyIntoScriptValue");
564 ASSERT(key_path.GetType() == IDBKeyPath::kStringType); 564 DCHECK_EQ(key_path.GetType(), IDBKeyPath::kStringType);
565 Vector<String> key_path_elements = ParseKeyPath(key_path.GetString()); 565 Vector<String> key_path_elements = ParseKeyPath(key_path.GetString());
566 566
567 if (!key_path_elements.size()) 567 if (!key_path_elements.size())
568 return false; 568 return false;
569 569
570 v8::Local<v8::Value> current(script_value.V8Value()); 570 v8::Local<v8::Value> current(script_value.V8Value());
571 if (!current->IsObject()) 571 if (!current->IsObject())
572 return false; 572 return false;
573 573
574 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 574 v8::Local<v8::Context> context = isolate->GetCurrentContext();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 const IDBValue* value) { 656 const IDBValue* value) {
657 ScriptState::Scope scope(script_state); 657 ScriptState::Scope scope(script_state);
658 v8::Isolate* isolate = script_state->GetIsolate(); 658 v8::Isolate* isolate = script_state->GetIsolate();
659 ScriptValue key_value = ScriptValue::From(script_state, value->PrimaryKey()); 659 ScriptValue key_value = ScriptValue::From(script_state, value->PrimaryKey());
660 ScriptValue script_value(script_state, 660 ScriptValue script_value(script_state,
661 DeserializeIDBValueData(isolate, value)); 661 DeserializeIDBValueData(isolate, value));
662 662
663 DummyExceptionStateForTesting exception_state; 663 DummyExceptionStateForTesting exception_state;
664 IDBKey* expected_key = CreateIDBKeyFromValueAndKeyPath( 664 IDBKey* expected_key = CreateIDBKeyFromValueAndKeyPath(
665 isolate, script_value.V8Value(), value->KeyPath(), exception_state); 665 isolate, script_value.V8Value(), value->KeyPath(), exception_state);
666 ASSERT(!exception_state.HadException()); 666 DCHECK(!exception_state.HadException());
667 if (expected_key && expected_key->IsEqual(value->PrimaryKey())) 667 if (expected_key && expected_key->IsEqual(value->PrimaryKey()))
668 return; 668 return;
669 669
670 bool injected = InjectV8KeyIntoV8Value( 670 bool injected = InjectV8KeyIntoV8Value(
671 isolate, key_value.V8Value(), script_value.V8Value(), value->KeyPath()); 671 isolate, key_value.V8Value(), script_value.V8Value(), value->KeyPath());
672 DCHECK(injected); 672 DCHECK(injected);
673 } 673 }
674 #endif 674 #endif
675 675
676 } // namespace blink 676 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698