| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <title>IndexedDB: Verify bindings edge cases</title> | 2 <title>IndexedDB: Verify bindings edge cases</title> |
| 3 <script src="../../resources/testharness.js"></script> | 3 <script src="../../resources/testharness.js"></script> |
| 4 <script src="../../resources/testharnessreport.js"></script> | 4 <script src="../../resources/testharnessreport.js"></script> |
| 5 <script src="resources/testharness-helpers.js"></script> | 5 <script src="resources/testharness-helpers.js"></script> |
| 6 <script> | 6 <script> |
| 7 indexeddb_test( | 7 indexeddb_test( |
| 8 function(t, db) { | 8 function(t, db) { |
| 9 db.createObjectStore('store'); | 9 db.createObjectStore('store'); |
| 10 }, | 10 }, |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 try { | 277 try { |
| 278 f(); | 278 f(); |
| 279 } finally { | 279 } finally { |
| 280 delete Object.prototype['throws']; | 280 delete Object.prototype['throws']; |
| 281 } | 281 } |
| 282 }; | 282 }; |
| 283 } | 283 } |
| 284 | 284 |
| 285 // Value should be cloned before key path is evaluated, | 285 // Value should be cloned before key path is evaluated, |
| 286 // and non-enumerable getter will be ignored. The clone | 286 // and non-enumerable getter will be ignored. The clone |
| 287 // will have no such property, so key path evaluation | 287 // will have no own property, so key path evaluation will |
| 288 // will hit prototype property and rethrow. | 288 // fail and DataError should be thrown. |
| 289 var s1 = db.createObjectStore('s1', | 289 var s1 = db.createObjectStore('s1', |
| 290 {keyPath: 'throws'}); | 290 {keyPath: 'throws'}); |
| 291 assert_throws({name: 'getter'}, with_proto_getter(function() { | 291 assert_throws('DataError', with_proto_getter(function() { |
| 292 s1.put({}); | 292 s1.put({}); |
| 293 }), 'Key path resolving to throwing getter rethrows'); | 293 }), 'Key path resolving to no own property throws DataError'); |
| 294 | 294 |
| 295 // Value should be cloned before key path is evaluated, | 295 // Value should be cloned before key path is evaluated, |
| 296 // and non-enumerable getter will be ignored. The clone | 296 // and non-enumerable getter will be ignored. The clone |
| 297 // will have no such property, so key path evaluation | 297 // will have no own property, so key path evaluation will |
| 298 // will hit prototype property and rethrow. | 298 // fail and DataError should be thrown. |
| 299 var s2 = db.createObjectStore('s2', | 299 var s2 = db.createObjectStore('s2', |
| 300 {keyPath: 'throws.x'}); | 300 {keyPath: 'throws.x'}); |
| 301 assert_throws({name: 'getter'}, with_proto_getter(function() { | 301 assert_throws('DataError', with_proto_getter(function() { |
| 302 s2.put({}); | 302 s2.put({}); |
| 303 }), 'Key path resolving past throwing getter rethrows'); | 303 }), 'Key path resolving past no own property throws DataError'); |
| 304 | 304 |
| 305 // Value should be cloned before key path is evaluated, | 305 // Value should be cloned before key path is evaluated, |
| 306 // and non-enumerable getter will be ignored. The clone | 306 // and non-enumerable getter will be ignored. The clone |
| 307 // will have no such property, so key path evaluation | 307 // will have no own property, so key path evaluation will |
| 308 // will hit prototype property and rethrow. | 308 // fail and injection can succeed. |
| 309 var s3 = db.createObjectStore('s3', | 309 var s3 = db.createObjectStore('s3', |
| 310 {keyPath: 'throws', autoIncrement: true}); | 310 {keyPath: 'throws', autoIncrement: true}); |
| 311 assert_throws({name: 'getter'}, with_proto_getter(function() { | 311 assert_equals(s3.put({}).readyState, 'pending', |
| 312 s3.put({}); | 312 'put should not throw due to inherited property'); |
| 313 }), 'Key injectability test at throwing getter rethrows'); | |
| 314 | 313 |
| 315 // Value should be cloned before key path is evaluated, | 314 // Value should be cloned before key path is evaluated, |
| 316 // and non-enumerable getter will be ignored. The clone | 315 // and non-enumerable getter will be ignored. The clone |
| 317 // will have no such property, so key path evaluation | 316 // will have no own property, so key path evaluation will |
| 318 // will hit prototype property and rethrow. | 317 // fail and injection can succeed. |
| 319 var s4 = db.createObjectStore('s4', | 318 var s4 = db.createObjectStore('s4', |
| 320 {keyPath: 'throws.x', autoIncrement: true}); | 319 {keyPath: 'throws.x', autoIncrement: true}); |
| 321 assert_throws({name: 'getter'}, with_proto_getter(function() { | 320 assert_equals(s4.put({}).readyState, 'pending', |
| 322 s4.put({}); | 321 'put should not throw due to inherited property'); |
| 323 }), 'Key injectability test past throwing getter rethrows'); | |
| 324 }, | 322 }, |
| 325 function(t, db) { | 323 function(t, db) { |
| 326 t.done(); | 324 t.done(); |
| 327 }, | 325 }, |
| 328 'Key path evaluation: Exceptions from non-enumerable getters on prototype' | 326 'Key path evaluation: Exceptions from non-enumerable getters on prototype' |
| 329 ); | 327 ); |
| 330 | 328 |
| 331 indexeddb_test( | 329 indexeddb_test( |
| 332 function(t, db) { | 330 function(t, db) { |
| 333 // Implemented as function wrapper to clean up | 331 // Implemented as function wrapper to clean up |
| 334 // immediately after use, otherwise it may | 332 // immediately after use, otherwise it may |
| 335 // interfere with the test harness. | 333 // interfere with the test harness. |
| 336 function with_proto_getter(f) { | 334 function with_proto_getter(f) { |
| 337 return function() { | 335 return function() { |
| 338 Object.defineProperty(Object.prototype, 'throws', { | 336 Object.defineProperty(Object.prototype, 'throws', { |
| 339 get: throws('getter'), | 337 get: throws('getter'), |
| 340 enumerable: true, configurable: true | 338 enumerable: true, configurable: true |
| 341 }); | 339 }); |
| 342 try { | 340 try { |
| 343 f(); | 341 f(); |
| 344 } finally { | 342 } finally { |
| 345 delete Object.prototype['throws']; | 343 delete Object.prototype['throws']; |
| 346 } | 344 } |
| 347 }; | 345 }; |
| 348 } | 346 } |
| 349 | 347 |
| 350 // Value should be cloned before key path is evaluated, | 348 // Value should be cloned before key path is evaluated. |
| 351 // and enumerable getter will rethrow. | 349 // The clone will have no own property, so key path |
| 350 // evaluation will fail and DataError should be thrown. |
| 352 var s1 = db.createObjectStore('s1', | 351 var s1 = db.createObjectStore('s1', |
| 353 {keyPath: 'throws'}); | 352 {keyPath: 'throws'}); |
| 354 assert_throws({name: 'getter'}, with_proto_getter(function() { | 353 assert_throws('DataError', with_proto_getter(function() { |
| 355 s1.put({}); | 354 s1.put({}); |
| 356 }), 'Key path resolving to throwing getter rethrows'); | 355 }), 'Key path resolving to no own property throws DataError'); |
| 357 | 356 |
| 358 // Value should be cloned before key path is evaluated, | 357 // Value should be cloned before key path is evaluated. |
| 359 // and enumerable getter will rethrow. | 358 // The clone will have no own property, so key path |
| 359 // evaluation will fail and DataError should be thrown. |
| 360 var s2 = db.createObjectStore('s2', | 360 var s2 = db.createObjectStore('s2', |
| 361 {keyPath: 'throws.x'}); | 361 {keyPath: 'throws.x'}); |
| 362 assert_throws({name: 'getter'}, with_proto_getter(function() { | 362 assert_throws('DataError', with_proto_getter(function() { |
| 363 s2.put({}); | 363 s2.put({}); |
| 364 }), 'Key path resolving past throwing getter rethrows'); | 364 }), 'Key path resolving past throwing getter rethrows'); |
| 365 | 365 |
| 366 // Value should be cloned before key path is evaluated, | 366 // Value should be cloned before key path is evaluated. |
| 367 // and enumerable getter will rethrow. | 367 // The clone will have no own property, so key path |
| 368 // evaluation will fail and injection can succeed. |
| 368 var s3 = db.createObjectStore('s3', | 369 var s3 = db.createObjectStore('s3', |
| 369 {keyPath: 'throws', autoIncrement: true}); | 370 {keyPath: 'throws', autoIncrement: true}); |
| 370 assert_throws({name: 'getter'}, with_proto_getter(function() { | 371 assert_equals(s3.put({}).readyState, 'pending', |
| 371 s3.put({}); | 372 'put should not throw due to inherited property'); |
| 372 }), 'Key injectability test at throwing getter rethrows'); | |
| 373 | 373 |
| 374 // Value should be cloned before key path is evaluated, | 374 // Value should be cloned before key path is evaluated. |
| 375 // and enumerable getter will rethrow. | 375 // The clone will have no own property, so key path |
| 376 // evaluation will fail and injection can succeed. |
| 376 var s4 = db.createObjectStore('s4', | 377 var s4 = db.createObjectStore('s4', |
| 377 {keyPath: 'throws.x', autoIncrement: true}); | 378 {keyPath: 'throws.x', autoIncrement: true}); |
| 378 assert_throws({name: 'getter'}, with_proto_getter(function() { | 379 assert_equals(s4.put({}).readyState, 'pending', |
| 379 s4.put({}); | 380 'put should not throw due to inherited property'); |
| 380 }), 'Key injectability test past throwing getter rethrows'); | |
| 381 }, | 381 }, |
| 382 function(t, db) { | 382 function(t, db) { |
| 383 t.done(); | 383 t.done(); |
| 384 }, | 384 }, |
| 385 'Key path evaluation: Exceptions from enumerable getters on prototype' | 385 'Key path evaluation: Exceptions from enumerable getters on prototype' |
| 386 ); | 386 ); |
| 387 </script> | 387 </script> |
| OLD | NEW |