<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[195247] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/195247">195247</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-01-18 22:02:30 -0800 (Mon, 18 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Modern IDB: Add private-browsing variant for many IDB tests, and enable private browsing in Modern IDB.
https://bugs.webkit.org/show_bug.cgi?id=153179

Reviewed by Darin Adler.

Source/WebCore:

Tests: Many private-browsing copies of existing IDB tests.

* Modules/indexeddb/client/IDBFactoryImpl.cpp:
(WebCore::IDBClient::shouldThrowSecurityException): Allow IDB access in private browsing.

LayoutTests:

Update many expectations files to skip some of the new tests on some platforms:
* TestExpectations:
* platform/mac-wk1/TestExpectations:
* platform/wk2/TestExpectations:

Add a special case for URLs that end with &quot;-private.html&quot; to enable private browsing:
* resources/js-test.js:

Add a whole bunch of -private.html wrappers along with new test expectations, along
with some minor test changes to remove unnecessary ambiguity due to .html filename:
* storage/indexeddb/aborted-versionchange-closes-private-expected.txt: Added.
* storage/indexeddb/aborted-versionchange-closes-private.html: Added.
* storage/indexeddb/basics-private-expected.txt: Added.
* storage/indexeddb/basics-private.html: Added.
* storage/indexeddb/create-and-remove-object-store-private-expected.txt: Added.
* storage/indexeddb/create-and-remove-object-store-private.html: Added.
* storage/indexeddb/create-object-store-options-private-expected.txt: Added.
* storage/indexeddb/create-object-store-options-private.html: Added.
* storage/indexeddb/createIndex-after-failure-private-expected.txt: Added.
* storage/indexeddb/createIndex-after-failure-private.html: Added.
* storage/indexeddb/createObjectStore-name-argument-required-private-expected.txt: Added.
* storage/indexeddb/createObjectStore-name-argument-required-private.html: Added.
* storage/indexeddb/createObjectStore-null-name-private-expected.txt: Added.
* storage/indexeddb/createObjectStore-null-name-private.html: Added.
* storage/indexeddb/cursor-added-bug-private-expected.txt: Added.
* storage/indexeddb/cursor-added-bug-private.html: Added.
* storage/indexeddb/cursor-advance-private-expected.txt: Added.
* storage/indexeddb/cursor-advance-private.html: Added.
* storage/indexeddb/cursor-basics-private-expected.txt: Added.
* storage/indexeddb/cursor-basics-private.html: Added.
* storage/indexeddb/cursor-continue-dir-private-expected.txt: Added.
* storage/indexeddb/cursor-continue-dir-private.html: Added.
* storage/indexeddb/cursor-continue-private-expected.txt: Added.
* storage/indexeddb/cursor-continue-private.html: Added.
* storage/indexeddb/cursor-continue-validity-private-expected.txt: Added.
* storage/indexeddb/cursor-continue-validity-private.html: Added.
* storage/indexeddb/cursor-delete-private-expected.txt: Added.
* storage/indexeddb/cursor-delete-private.html: Added.
* storage/indexeddb/cursor-finished-private-expected.txt: Added.
* storage/indexeddb/cursor-finished-private.html: Added.
* storage/indexeddb/cursor-inconsistency-private-expected.txt: Added.
* storage/indexeddb/cursor-inconsistency-private.html: Added.
* storage/indexeddb/cursor-index-delete-private-expected.txt: Added.
* storage/indexeddb/cursor-index-delete-private.html: Added.
* storage/indexeddb/cursor-key-order-private-expected.txt: Added.
* storage/indexeddb/cursor-key-order-private.html: Added.
* storage/indexeddb/cursor-prev-no-duplicate-private-expected.txt: Added.
* storage/indexeddb/cursor-prev-no-duplicate-private.html: Added.
* storage/indexeddb/cursor-primary-key-order-private-expected.txt: Added.
* storage/indexeddb/cursor-primary-key-order-private.html: Added.
* storage/indexeddb/cursor-properties-private-expected.txt: Added.
* storage/indexeddb/cursor-properties-private.html: Added.
* storage/indexeddb/cursor-reverse-bug-private-expected.txt: Added.
* storage/indexeddb/cursor-reverse-bug-private.html: Added.
* storage/indexeddb/cursor-skip-deleted-private-expected.txt: Added.
* storage/indexeddb/cursor-skip-deleted-private.html: Added.
* storage/indexeddb/cursor-update-private-expected.txt: Added.
* storage/indexeddb/cursor-update-private.html: Added.
* storage/indexeddb/cursor-update-value-argument-required-private-expected.txt: Added.
* storage/indexeddb/cursor-update-value-argument-required-private.html: Added.
* storage/indexeddb/cursor-value-private-expected.txt: Added.
* storage/indexeddb/cursor-value-private.html: Added.
* storage/indexeddb/database-basics-private-expected.txt: Added.
* storage/indexeddb/database-basics-private.html: Added.
* storage/indexeddb/database-close-private-expected.txt: Added.
* storage/indexeddb/database-close-private.html: Added.
* storage/indexeddb/database-closepending-flag-private-expected.txt: Added.
* storage/indexeddb/database-closepending-flag-private.html: Added.
* storage/indexeddb/database-deletepending-flag-private-expected.txt: Added.
* storage/indexeddb/database-deletepending-flag-private.html: Added.
* storage/indexeddb/database-name-undefined-private-expected.txt: Added.
* storage/indexeddb/database-name-undefined-private.html: Added.
* storage/indexeddb/database-odd-names-private-expected.txt: Added.
* storage/indexeddb/database-odd-names-private.html: Added.
* storage/indexeddb/database-quota-private-expected.txt: Added.
* storage/indexeddb/database-quota-private.html: Added.
* storage/indexeddb/database-wrapper-private-expected.txt: Added.
* storage/indexeddb/database-wrapper-private.html: Added.
* storage/indexeddb/delete-closed-database-object-private-expected.txt: Added.
* storage/indexeddb/delete-closed-database-object-private.html: Added.
* storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private-expected.txt: Added.
* storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html: Added.
* storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private-expected.txt: Added.
* storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html: Added.
* storage/indexeddb/delete-range-private-expected.txt: Added.
* storage/indexeddb/delete-range-private.html: Added.
* storage/indexeddb/deleteIndex-private-expected.txt: Added.
* storage/indexeddb/deleteIndex-private.html: Added.
* storage/indexeddb/deleteObjectStore-name-argument-required-private-expected.txt: Added.
* storage/indexeddb/deleteObjectStore-name-argument-required-private.html: Added.
* storage/indexeddb/deleteObjectStore-null-name-private-expected.txt: Added.
* storage/indexeddb/deleteObjectStore-null-name-private.html: Added.
* storage/indexeddb/deleted-objects-private-expected.txt: Added.
* storage/indexeddb/deleted-objects-private.html: Added.
* storage/indexeddb/deletedatabase-blocked-private-expected.txt: Added.
* storage/indexeddb/deletedatabase-blocked-private.html: Added.
* storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private-expected.txt: Added.
* storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html: Added.
* storage/indexeddb/deletedatabase-delayed-by-versionchange-private-expected.txt: Added.
* storage/indexeddb/deletedatabase-not-blocked-private-expected.txt: Added.
* storage/indexeddb/deletedatabase-not-blocked-private.html: Added.
* storage/indexeddb/dont-wedge-private-expected.txt: Added.
* storage/indexeddb/dont-wedge-private.html: Added.
* storage/indexeddb/duplicates-private-expected.txt: Added.
* storage/indexeddb/duplicates-private.html: Added.
* storage/indexeddb/error-causes-abort-by-default-private-expected.txt: Added.
* storage/indexeddb/error-causes-abort-by-default-private.html: Added.
* storage/indexeddb/events-private-expected.txt: Added.
* storage/indexeddb/events-private.html: Added.
* storage/indexeddb/exception-in-event-aborts-private-expected.txt: Added.
* storage/indexeddb/exception-in-event-aborts-private.html: Added.
* storage/indexeddb/exceptions-private-expected.txt: Added.
* storage/indexeddb/exceptions-private.html: Added.
* storage/indexeddb/factory-cmp-private-expected.txt: Added.
* storage/indexeddb/factory-cmp-private.html: Added.
* storage/indexeddb/factory-deletedatabase-private-expected.txt: Added.
* storage/indexeddb/factory-deletedatabase-private.html: Added.
* storage/indexeddb/get-keyrange-private-expected.txt: Added.
* storage/indexeddb/get-keyrange-private.html: Added.
* storage/indexeddb/index-basics-private-expected.txt: Added.
* storage/indexeddb/index-basics-private.html: Added.
* storage/indexeddb/index-count-private-expected.txt: Added.
* storage/indexeddb/index-count-private.html: Added.
* storage/indexeddb/index-cursor-private-expected.txt: Added.
* storage/indexeddb/index-cursor-private.html: Added.
* storage/indexeddb/index-duplicate-keypaths-private-expected.txt: Added.
* storage/indexeddb/index-duplicate-keypaths-private.html: Added.
* storage/indexeddb/index-get-key-argument-required-private-expected.txt: Added.
* storage/indexeddb/index-get-key-argument-required-private.html: Added.
* storage/indexeddb/index-multientry-private-expected.txt: Added.
* storage/indexeddb/index-multientry-private.html: Added.
* storage/indexeddb/index-population-private-expected.txt: Added.
* storage/indexeddb/index-population-private.html: Added.
* storage/indexeddb/index-unique-private-expected.txt: Added.
* storage/indexeddb/index-unique-private.html: Added.
* storage/indexeddb/interfaces-private-expected.txt: Added.
* storage/indexeddb/interfaces-private.html: Added.
* storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private-expected.txt: Added.
* storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html: Added.
* storage/indexeddb/intversion-bad-parameters-private-expected.txt: Added.
* storage/indexeddb/intversion-bad-parameters-private.html: Added.
* storage/indexeddb/intversion-blocked-private-expected.txt: Added.
* storage/indexeddb/intversion-blocked-private.html: Added.
* storage/indexeddb/intversion-close-between-events-private-expected.txt: Added.
* storage/indexeddb/intversion-close-between-events-private.html: Added.
* storage/indexeddb/intversion-close-in-oncomplete-private-expected.txt: Added.
* storage/indexeddb/intversion-close-in-oncomplete-private.html: Added.
* storage/indexeddb/intversion-close-in-upgradeneeded-private-expected.txt: Added.
* storage/indexeddb/intversion-close-in-upgradeneeded-private.html: Added.
* storage/indexeddb/intversion-encoding-private-expected.txt: Added.
* storage/indexeddb/intversion-encoding-private.html: Added.
* storage/indexeddb/intversion-gated-on-delete-private-expected.txt: Added.
* storage/indexeddb/intversion-gated-on-delete-private.html: Added.
* storage/indexeddb/intversion-long-queue-private-expected.txt: Added.
* storage/indexeddb/intversion-long-queue-private.html: Added.
* storage/indexeddb/intversion-omit-parameter-private-expected.txt: Added.
* storage/indexeddb/intversion-omit-parameter-private.html: Added.
* storage/indexeddb/intversion-open-in-upgradeneeded-private-expected.txt: Added.
* storage/indexeddb/intversion-open-in-upgradeneeded-private.html: Added.
* storage/indexeddb/intversion-open-with-version-private-expected.txt: Added.
* storage/indexeddb/intversion-open-with-version-private.html: Added.
* storage/indexeddb/intversion-pending-version-changes-ascending-private-expected.txt: Added.
* storage/indexeddb/intversion-pending-version-changes-ascending-private.html: Added.
* storage/indexeddb/intversion-pending-version-changes-descending-private-expected.txt: Added.
* storage/indexeddb/intversion-pending-version-changes-descending-private.html: Added.
* storage/indexeddb/intversion-pending-version-changes-same-private-expected.txt: Added.
* storage/indexeddb/intversion-pending-version-changes-same-private.html: Added.
* storage/indexeddb/intversion-persistence-private-expected.txt: Added.
* storage/indexeddb/intversion-persistence-private.html: Added.
* storage/indexeddb/intversion-revert-on-abort-private-expected.txt: Added.
* storage/indexeddb/intversion-revert-on-abort-private.html: Added.
* storage/indexeddb/intversion-two-opens-no-versions-private-expected.txt: Added.
* storage/indexeddb/intversion-two-opens-no-versions-private.html: Added.
* storage/indexeddb/intversion-upgrades-private-expected.txt: Added.
* storage/indexeddb/intversion-upgrades-private.html: Added.
* storage/indexeddb/invalid-keys-private-expected.txt: Added.
* storage/indexeddb/invalid-keys-private.html: Added.
* storage/indexeddb/key-generator-private-expected.txt: Added.
* storage/indexeddb/key-generator-private.html: Added.
* storage/indexeddb/key-sort-order-across-types-private-expected.txt: Added.
* storage/indexeddb/key-sort-order-across-types-private.html: Added.
* storage/indexeddb/key-sort-order-date-private-expected.txt: Added.
* storage/indexeddb/key-sort-order-date-private.html: Added.
* storage/indexeddb/key-type-array-private-expected.txt: Added.
* storage/indexeddb/key-type-array-private.html: Added.
* storage/indexeddb/key-type-binary-private-expected.txt: Added.
* storage/indexeddb/key-type-binary-private.html: Added.
* storage/indexeddb/key-type-infinity-private-expected.txt: Added.
* storage/indexeddb/key-type-infinity-private.html: Added.
* storage/indexeddb/keypath-arrays-private-expected.txt: Added.
* storage/indexeddb/keypath-arrays-private.html: Added.
* storage/indexeddb/keypath-basics-private-expected.txt: Added.
* storage/indexeddb/keypath-basics-private.html: Added.
* storage/indexeddb/keypath-edges-private-expected.txt: Added.
* storage/indexeddb/keypath-edges-private.html: Added.
* storage/indexeddb/keypath-fetch-key-private-expected.txt: Added.
* storage/indexeddb/keypath-fetch-key-private.html: Added.
* storage/indexeddb/keypath-intrinsic-properties-private-expected.txt: Added.
* storage/indexeddb/keypath-intrinsic-properties-private.html: Added.
* storage/indexeddb/keyrange-private-expected.txt: Added.
* storage/indexeddb/keyrange-private.html: Added.
* storage/indexeddb/keyrange-required-arguments-private-expected.txt: Added.
* storage/indexeddb/keyrange-required-arguments-private.html: Added.
* storage/indexeddb/lazy-index-types-private-expected.txt: Added.
* storage/indexeddb/lazy-index-types-private.html: Added.
* storage/indexeddb/legacy-constants-private-expected.txt: Added.
* storage/indexeddb/legacy-constants-private.html: Added.
* storage/indexeddb/list-ordering-private-expected.txt: Added.
* storage/indexeddb/list-ordering-private.html: Added.
* storage/indexeddb/metadata-private-expected.txt: Added.
* storage/indexeddb/metadata-private.html: Added.
* storage/indexeddb/mutating-cursor-private-expected.txt: Added.
* storage/indexeddb/mutating-cursor-private.html: Added.
* storage/indexeddb/objectStore-required-arguments-private-expected.txt: Added.
* storage/indexeddb/objectStore-required-arguments-private.html: Added.
* storage/indexeddb/objectstore-autoincrement-private-expected.txt: Added.
* storage/indexeddb/objectstore-autoincrement-private.html: Added.
* storage/indexeddb/objectstore-basics-private-expected.txt: Added.
* storage/indexeddb/objectstore-basics-private.html: Added.
* storage/indexeddb/objectstore-clear-private-expected.txt: Added.
* storage/indexeddb/objectstore-clear-private.html: Added.
* storage/indexeddb/objectstore-count-private-expected.txt: Added.
* storage/indexeddb/objectstore-count-private.html: Added.
* storage/indexeddb/objectstore-cursor-private-expected.txt: Added.
* storage/indexeddb/objectstore-cursor-private.html: Added.
* storage/indexeddb/objectstore-removeobjectstore-private-expected.txt: Added.
* storage/indexeddb/objectstore-removeobjectstore-private.html: Added.
* storage/indexeddb/odd-strings-private-expected.txt: Added.
* storage/indexeddb/odd-strings-private.html: Added.
* storage/indexeddb/open-cursor-private-expected.txt: Added.
* storage/indexeddb/open-cursor-private.html: Added.
* storage/indexeddb/open-during-transaction-private-expected.txt: Added.
* storage/indexeddb/open-during-transaction-private.html: Added.
* storage/indexeddb/open-ordering-private-expected.txt: Added.
* storage/indexeddb/open-ordering-private.html: Added.
* storage/indexeddb/opencursor-key-private-expected.txt: Added.
* storage/indexeddb/opencursor-key-private.html: Added.
* storage/indexeddb/pending-activity-private-expected.txt: Added.
* storage/indexeddb/pending-activity-private.html: Added.
* storage/indexeddb/pending-version-change-on-exit-private-expected.txt: Added.
* storage/indexeddb/pending-version-change-on-exit-private.html: Added.
* storage/indexeddb/pending-version-change-stuck-private-expected.txt: Added.
* storage/indexeddb/pending-version-change-stuck-private.html: Added.
* storage/indexeddb/persistence-expected.txt:
* storage/indexeddb/persistence-private-expected.txt: Copied from LayoutTests/storage/indexeddb/persistence-expected.txt.
* storage/indexeddb/persistence-private.html: Added.
* storage/indexeddb/prefetch-bugfix-108071-private-expected.txt: Added.
* storage/indexeddb/prefetch-bugfix-108071-private.html: Added.
* storage/indexeddb/queued-commands-private-expected.txt: Added.
* storage/indexeddb/queued-commands-private.html: Added.
* storage/indexeddb/readonly-private-expected.txt: Added.
* storage/indexeddb/readonly-private.html: Added.
* storage/indexeddb/readonly-properties-private-expected.txt: Added.
* storage/indexeddb/readonly-properties-private.html: Added.
* storage/indexeddb/removed-private-expected.txt: Added.
* storage/indexeddb/removed-private.html: Added.
* storage/indexeddb/request-continue-abort-private-expected.txt: Added.
* storage/indexeddb/request-continue-abort-private.html: Added.
* storage/indexeddb/request-event-propagation-private-expected.txt: Added.
* storage/indexeddb/request-event-propagation-private.html: Added.
* storage/indexeddb/resources/persistence.js:
* storage/indexeddb/set_version_blocked-private-expected.txt: Added.
* storage/indexeddb/set_version_blocked-private.html: Added.
* storage/indexeddb/setversion-blocked-by-versionchange-close-private-expected.txt: Added.
* storage/indexeddb/setversion-blocked-by-versionchange-close-private.html: Added.
* storage/indexeddb/setversion-not-blocked-private-expected.txt: Added.
* storage/indexeddb/setversion-not-blocked-private.html: Added.
* storage/indexeddb/transaction-abort-private-expected.txt: Added.
* storage/indexeddb/transaction-abort-private.html: Added.
* storage/indexeddb/transaction-active-flag-private-expected.txt: Added.
* storage/indexeddb/transaction-active-flag-private.html: Added.
* storage/indexeddb/transaction-after-close-private-expected.txt: Added.
* storage/indexeddb/transaction-after-close-private.html: Added.
* storage/indexeddb/transaction-and-objectstore-calls-private-expected.txt: Added.
* storage/indexeddb/transaction-and-objectstore-calls-private.html: Added.
* storage/indexeddb/transaction-basics-private-expected.txt: Added.
* storage/indexeddb/transaction-basics-private.html: Added.
* storage/indexeddb/transaction-complete-workers-private-expected.txt: Added.
* storage/indexeddb/transaction-complete-workers-private.html: Added.
* storage/indexeddb/transaction-coordination-across-databases-private-expected.txt: Added.
* storage/indexeddb/transaction-coordination-across-databases-private.html: Added.
* storage/indexeddb/transaction-coordination-within-database-private-expected.txt: Added.
* storage/indexeddb/transaction-coordination-within-database-private.html: Added.
* storage/indexeddb/transaction-crash-on-abort-private-expected.txt: Added.
* storage/indexeddb/transaction-crash-on-abort-private.html: Added.
* storage/indexeddb/transaction-error-private-expected.txt: Added.
* storage/indexeddb/transaction-error-private.html: Added.
* storage/indexeddb/transaction-event-propagation-private-expected.txt: Added.
* storage/indexeddb/transaction-event-propagation-private.html: Added.
* storage/indexeddb/transaction-read-only-private-expected.txt: Added.
* storage/indexeddb/transaction-read-only-private.html: Added.
* storage/indexeddb/transaction-readwrite-exclusive-private-expected.txt: Added.
* storage/indexeddb/transaction-readwrite-exclusive-private.html: Added.
* storage/indexeddb/transaction-rollback-private-expected.txt: Added.
* storage/indexeddb/transaction-rollback-private.html: Added.
* storage/indexeddb/transaction-scope-sequencing-private-expected.txt: Added.
* storage/indexeddb/transaction-scope-sequencing-private.html: Added.
* storage/indexeddb/transaction-starvation-private-expected.txt: Added.
* storage/indexeddb/transaction-storeNames-required-private-expected.txt: Added.
* storage/indexeddb/transaction-storeNames-required-private.html: Added.
* storage/indexeddb/unblocked-version-changes-private-expected.txt: Added.
* storage/indexeddb/unblocked-version-changes-private.html: Added.
* storage/indexeddb/unprefix-private-expected.txt: Added.
* storage/indexeddb/unprefix-private.html: Added.
* storage/indexeddb/value-undefined-private-expected.txt: Added.
* storage/indexeddb/value-undefined-private.html: Added.
* storage/indexeddb/values-odd-types-private-expected.txt: Added.
* storage/indexeddb/values-odd-types-private.html: Added.
* storage/indexeddb/version-change-abort-private-expected.txt: Added.
* storage/indexeddb/version-change-abort-private.html: Added.
* storage/indexeddb/version-change-exclusive-private-expected.txt: Added.
* storage/indexeddb/version-change-exclusive-private.html: Added.
* storage/indexeddb/versionchangerequest-activedomobject-private-expected.txt: Added.
* storage/indexeddb/versionchangerequest-activedomobject-private.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1TestExpectations">trunk/LayoutTests/platform/mac-wk1/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformwk2TestExpectations">trunk/LayoutTests/platform/wk2/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsresourcesjstestjs">trunk/LayoutTests/resources/js-test.js</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpersistenceexpectedtxt">trunk/LayoutTests/storage/indexeddb/persistence-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbresourcespersistencejs">trunk/LayoutTests/storage/indexeddb/resources/persistence.js</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBFactoryImplcpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsstorageindexeddbabortedversionchangeclosesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbabortedversionchangeclosesprivatehtml">trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbbasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbbasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateandremoveobjectstoreprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateandremoveobjectstoreprivatehtml">trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateobjectstoreoptionsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/create-object-store-options-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateobjectstoreoptionsprivatehtml">trunk/LayoutTests/storage/indexeddb/create-object-store-options-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateIndexafterfailureprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateIndexafterfailureprivatehtml">trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateObjectStorenameargumentrequiredprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateObjectStorenameargumentrequiredprivatehtml">trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateObjectStorenullnameprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcreateObjectStorenullnameprivatehtml">trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursoraddedbugprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursoraddedbugprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursoradvanceprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-advance-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursoradvanceprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-advance-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorbasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorbasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinuedirprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinuedirprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinueprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-continue-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinueprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-continue-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinuevalidityprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinuevalidityprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursordeleteprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-delete-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursordeleteprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-delete-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorfinishedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-finished-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorfinishedprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-finished-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorinconsistencyprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorinconsistencyprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorindexdeleteprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorindexdeleteprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorkeyorderprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-key-order-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorkeyorderprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-key-order-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorprevnoduplicateprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorprevnoduplicateprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorprimarykeyorderprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorprimarykeyorderprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorpropertiesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-properties-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorpropertiesprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-properties-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorreversebugprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorreversebugprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorskipdeletedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorskipdeletedprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorupdateprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-update-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorupdateprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-update-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorupdatevalueargumentrequiredprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorupdatevalueargumentrequiredprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorvalueprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-value-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorvalueprivatehtml">trunk/LayoutTests/storage/indexeddb/cursor-value-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasebasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasebasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/database-basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasecloseprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-close-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasecloseprivatehtml">trunk/LayoutTests/storage/indexeddb/database-close-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabaseclosependingflagprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabaseclosependingflagprivatehtml">trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasedeletependingflagprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasedeletependingflagprivatehtml">trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasenameundefinedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-name-undefined-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasenameundefinedprivatehtml">trunk/LayoutTests/storage/indexeddb/database-name-undefined-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabaseoddnamesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-odd-names-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabaseoddnamesprivatehtml">trunk/LayoutTests/storage/indexeddb/database-odd-names-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasequotaprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-quota-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasequotaprivatehtml">trunk/LayoutTests/storage/indexeddb/database-quota-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasewrapperprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/database-wrapper-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdatabasewrapperprivatehtml">trunk/LayoutTests/storage/indexeddb/database-wrapper-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletecloseddatabaseobjectprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletecloseddatabaseobjectprivatehtml">trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinopensuccessprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinopensuccessprivatehtml">trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinversionchangeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinversionchangeprivatehtml">trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleterangeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/delete-range-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleterangeprivatehtml">trunk/LayoutTests/storage/indexeddb/delete-range-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteIndexprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deleteIndex-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteIndexprivatehtml">trunk/LayoutTests/storage/indexeddb/deleteIndex-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteObjectStorenameargumentrequiredprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteObjectStorenameargumentrequiredprivatehtml">trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteObjectStorenullnameprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeleteObjectStorenullnameprivatehtml">trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedobjectsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deleted-objects-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedobjectsprivatehtml">trunk/LayoutTests/storage/indexeddb/deleted-objects-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabaseblockedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabaseblockedprivatehtml">trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabasedelayedbyopenandversionchangeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabasedelayedbyopenandversionchangeprivatehtml">trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabasedelayedbyversionchangeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabasenotblockedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdeletedatabasenotblockedprivatehtml">trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdontwedgeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/dont-wedge-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbdontwedgeprivatehtml">trunk/LayoutTests/storage/indexeddb/dont-wedge-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbduplicatesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/duplicates-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbduplicatesprivatehtml">trunk/LayoutTests/storage/indexeddb/duplicates-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddberrorcausesabortbydefaultprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddberrorcausesabortbydefaultprivatehtml">trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbeventsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/events-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbeventsprivatehtml">trunk/LayoutTests/storage/indexeddb/events-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbexceptionineventabortsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbexceptionineventabortsprivatehtml">trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbexceptionsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/exceptions-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbexceptionsprivatehtml">trunk/LayoutTests/storage/indexeddb/exceptions-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbfactorycmpprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/factory-cmp-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbfactorycmpprivatehtml">trunk/LayoutTests/storage/indexeddb/factory-cmp-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbfactorydeletedatabaseprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbfactorydeletedatabaseprivatehtml">trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbgetkeyrangeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/get-keyrange-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbgetkeyrangeprivatehtml">trunk/LayoutTests/storage/indexeddb/get-keyrange-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexbasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexbasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/index-basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexcountprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-count-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexcountprivatehtml">trunk/LayoutTests/storage/indexeddb/index-count-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexcursorprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-cursor-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexcursorprivatehtml">trunk/LayoutTests/storage/indexeddb/index-cursor-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexduplicatekeypathsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexduplicatekeypathsprivatehtml">trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexgetkeyargumentrequiredprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexgetkeyargumentrequiredprivatehtml">trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexmultientryprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-multientry-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexmultientryprivatehtml">trunk/LayoutTests/storage/indexeddb/index-multientry-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexpopulationprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-population-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexpopulationprivatehtml">trunk/LayoutTests/storage/indexeddb/index-population-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexuniqueprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/index-unique-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbindexuniqueprivatehtml">trunk/LayoutTests/storage/indexeddb/index-unique-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbinterfacesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/interfaces-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbinterfacesprivatehtml">trunk/LayoutTests/storage/indexeddb/interfaces-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionabortininitialupgradeneededprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionabortininitialupgradeneededprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionbadparametersprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionbadparametersprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionblockedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-blocked-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionblockedprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-blocked-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionclosebetweeneventsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionclosebetweeneventsprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversioncloseinoncompleteprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversioncloseinoncompleteprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversioncloseinupgradeneededprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversioncloseinupgradeneededprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionencodingprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-encoding-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionencodingprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-encoding-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversiongatedondeleteprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversiongatedondeleteprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionlongqueueprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionlongqueueprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionomitparameterprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionomitparameterprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionopeninupgradeneededprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionopeninupgradeneededprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionopenwithversionprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionopenwithversionprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpendingversionchangesascendingprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpendingversionchangesascendingprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpendingversionchangesdescendingprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpendingversionchangesdescendingprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpendingversionchangessameprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpendingversionchangessameprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpersistenceprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-persistence-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionpersistenceprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-persistence-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionrevertonabortprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionrevertonabortprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversiontwoopensnoversionsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversiontwoopensnoversionsprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionupgradesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbintversionupgradesprivatehtml">trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbinvalidkeysprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/invalid-keys-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbinvalidkeysprivatehtml">trunk/LayoutTests/storage/indexeddb/invalid-keys-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeygeneratorprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/key-generator-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeygeneratorprivatehtml">trunk/LayoutTests/storage/indexeddb/key-generator-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeysortorderacrosstypesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeysortorderacrosstypesprivatehtml">trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeysortorderdateprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeysortorderdateprivatehtml">trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeytypearrayprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/key-type-array-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeytypearrayprivatehtml">trunk/LayoutTests/storage/indexeddb/key-type-array-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeytypebinaryprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/key-type-binary-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeytypebinaryprivatehtml">trunk/LayoutTests/storage/indexeddb/key-type-binary-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeytypeinfinityprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/key-type-infinity-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeytypeinfinityprivatehtml">trunk/LayoutTests/storage/indexeddb/key-type-infinity-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypatharraysprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keypath-arrays-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypatharraysprivatehtml">trunk/LayoutTests/storage/indexeddb/keypath-arrays-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathbasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keypath-basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathbasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/keypath-basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathedgesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keypath-edges-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathedgesprivatehtml">trunk/LayoutTests/storage/indexeddb/keypath-edges-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathfetchkeyprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathfetchkeyprivatehtml">trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathintrinsicpropertiesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeypathintrinsicpropertiesprivatehtml">trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeyrangeprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keyrange-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeyrangeprivatehtml">trunk/LayoutTests/storage/indexeddb/keyrange-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeyrangerequiredargumentsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbkeyrangerequiredargumentsprivatehtml">trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddblazyindextypesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/lazy-index-types-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddblazyindextypesprivatehtml">trunk/LayoutTests/storage/indexeddb/lazy-index-types-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddblegacyconstantsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/legacy-constants-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddblegacyconstantsprivatehtml">trunk/LayoutTests/storage/indexeddb/legacy-constants-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddblistorderingprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/list-ordering-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddblistorderingprivatehtml">trunk/LayoutTests/storage/indexeddb/list-ordering-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmetadataprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/metadata-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmetadataprivatehtml">trunk/LayoutTests/storage/indexeddb/metadata-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmutatingcursorprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/mutating-cursor-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmutatingcursorprivatehtml">trunk/LayoutTests/storage/indexeddb/mutating-cursor-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectStorerequiredargumentsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectStorerequiredargumentsprivatehtml">trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstoreautoincrementprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstoreautoincrementprivatehtml">trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstorebasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectstore-basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstorebasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/objectstore-basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstoreclearprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectstore-clear-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstoreclearprivatehtml">trunk/LayoutTests/storage/indexeddb/objectstore-clear-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstorecountprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectstore-count-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstorecountprivatehtml">trunk/LayoutTests/storage/indexeddb/objectstore-count-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstorecursorprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstorecursorprivatehtml">trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstoreremoveobjectstoreprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbobjectstoreremoveobjectstoreprivatehtml">trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddboddstringsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/odd-strings-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddboddstringsprivatehtml">trunk/LayoutTests/storage/indexeddb/odd-strings-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopencursorprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/open-cursor-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopencursorprivatehtml">trunk/LayoutTests/storage/indexeddb/open-cursor-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopenduringtransactionprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/open-during-transaction-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopenduringtransactionprivatehtml">trunk/LayoutTests/storage/indexeddb/open-during-transaction-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopenorderingprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/open-ordering-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopenorderingprivatehtml">trunk/LayoutTests/storage/indexeddb/open-ordering-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopencursorkeyprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/opencursor-key-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbopencursorkeyprivatehtml">trunk/LayoutTests/storage/indexeddb/opencursor-key-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpendingactivityprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/pending-activity-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpendingactivityprivatehtml">trunk/LayoutTests/storage/indexeddb/pending-activity-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpendingversionchangeonexitprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpendingversionchangeonexitprivatehtml">trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpendingversionchangestuckprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpendingversionchangestuckprivatehtml">trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpersistenceprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/persistence-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbpersistenceprivatehtml">trunk/LayoutTests/storage/indexeddb/persistence-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbprefetchbugfix108071privateexpectedtxt">trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbprefetchbugfix108071privatehtml">trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbqueuedcommandsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/queued-commands-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbqueuedcommandsprivatehtml">trunk/LayoutTests/storage/indexeddb/queued-commands-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbreadonlyprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/readonly-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbreadonlyprivatehtml">trunk/LayoutTests/storage/indexeddb/readonly-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbreadonlypropertiesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/readonly-properties-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbreadonlypropertiesprivatehtml">trunk/LayoutTests/storage/indexeddb/readonly-properties-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbremovedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/removed-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbremovedprivatehtml">trunk/LayoutTests/storage/indexeddb/removed-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbrequestcontinueabortprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/request-continue-abort-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbrequestcontinueabortprivatehtml">trunk/LayoutTests/storage/indexeddb/request-continue-abort-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbrequesteventpropagationprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/request-event-propagation-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbrequesteventpropagationprivatehtml">trunk/LayoutTests/storage/indexeddb/request-event-propagation-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbset_version_blockedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/set_version_blocked-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbset_version_blockedprivatehtml">trunk/LayoutTests/storage/indexeddb/set_version_blocked-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbsetversionblockedbyversionchangecloseprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbsetversionblockedbyversionchangecloseprivatehtml">trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbsetversionnotblockedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbsetversionnotblockedprivatehtml">trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionabortprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-abort-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionabortprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-abort-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionactiveflagprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionactiveflagprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionaftercloseprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-after-close-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionaftercloseprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-after-close-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionandobjectstorecallsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionandobjectstorecallsprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionbasicsprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-basics-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionbasicsprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-basics-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncompleteworkersprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncompleteworkersprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncoordinationacrossdatabasesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncoordinationacrossdatabasesprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncoordinationwithindatabaseprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncoordinationwithindatabaseprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncrashonabortprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioncrashonabortprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionerrorprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-error-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionerrorprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-error-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioneventpropagationprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactioneventpropagationprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionreadonlyprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-read-only-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionreadonlyprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-read-only-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionreadwriteexclusiveprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionreadwriteexclusiveprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionrollbackprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-rollback-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionrollbackprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-rollback-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionscopesequencingprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionscopesequencingprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionstarvationprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-starvation-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionstoreNamesrequiredprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbtransactionstoreNamesrequiredprivatehtml">trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbunblockedversionchangesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbunblockedversionchangesprivatehtml">trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbunprefixprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/unprefix-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbunprefixprivatehtml">trunk/LayoutTests/storage/indexeddb/unprefix-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbvalueundefinedprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/value-undefined-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbvalueundefinedprivatehtml">trunk/LayoutTests/storage/indexeddb/value-undefined-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbvaluesoddtypesprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/values-odd-types-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbvaluesoddtypesprivatehtml">trunk/LayoutTests/storage/indexeddb/values-odd-types-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbversionchangeabortprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/version-change-abort-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbversionchangeabortprivatehtml">trunk/LayoutTests/storage/indexeddb/version-change-abort-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbversionchangeexclusiveprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbversionchangeexclusiveprivatehtml">trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbversionchangerequestactivedomobjectprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbversionchangerequestactivedomobjectprivatehtml">trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/ChangeLog        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -1,3 +1,325 @@
</span><ins>+2016-01-18  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB: Add private-browsing variant for many IDB tests, and enable private browsing in Modern IDB.
+        https://bugs.webkit.org/show_bug.cgi?id=153179
+
+        Reviewed by Darin Adler.
+
+        Update many expectations files to skip some of the new tests on some platforms:
+        * TestExpectations:
+        * platform/mac-wk1/TestExpectations:
+        * platform/wk2/TestExpectations:
+        
+        Add a special case for URLs that end with &quot;-private.html&quot; to enable private browsing:
+        * resources/js-test.js:
+        
+        Add a whole bunch of -private.html wrappers along with new test expectations, along 
+        with some minor test changes to remove unnecessary ambiguity due to .html filename:
+        * storage/indexeddb/aborted-versionchange-closes-private-expected.txt: Added.
+        * storage/indexeddb/aborted-versionchange-closes-private.html: Added.
+        * storage/indexeddb/basics-private-expected.txt: Added.
+        * storage/indexeddb/basics-private.html: Added.
+        * storage/indexeddb/create-and-remove-object-store-private-expected.txt: Added.
+        * storage/indexeddb/create-and-remove-object-store-private.html: Added.
+        * storage/indexeddb/create-object-store-options-private-expected.txt: Added.
+        * storage/indexeddb/create-object-store-options-private.html: Added.
+        * storage/indexeddb/createIndex-after-failure-private-expected.txt: Added.
+        * storage/indexeddb/createIndex-after-failure-private.html: Added.
+        * storage/indexeddb/createObjectStore-name-argument-required-private-expected.txt: Added.
+        * storage/indexeddb/createObjectStore-name-argument-required-private.html: Added.
+        * storage/indexeddb/createObjectStore-null-name-private-expected.txt: Added.
+        * storage/indexeddb/createObjectStore-null-name-private.html: Added.
+        * storage/indexeddb/cursor-added-bug-private-expected.txt: Added.
+        * storage/indexeddb/cursor-added-bug-private.html: Added.
+        * storage/indexeddb/cursor-advance-private-expected.txt: Added.
+        * storage/indexeddb/cursor-advance-private.html: Added.
+        * storage/indexeddb/cursor-basics-private-expected.txt: Added.
+        * storage/indexeddb/cursor-basics-private.html: Added.
+        * storage/indexeddb/cursor-continue-dir-private-expected.txt: Added.
+        * storage/indexeddb/cursor-continue-dir-private.html: Added.
+        * storage/indexeddb/cursor-continue-private-expected.txt: Added.
+        * storage/indexeddb/cursor-continue-private.html: Added.
+        * storage/indexeddb/cursor-continue-validity-private-expected.txt: Added.
+        * storage/indexeddb/cursor-continue-validity-private.html: Added.
+        * storage/indexeddb/cursor-delete-private-expected.txt: Added.
+        * storage/indexeddb/cursor-delete-private.html: Added.
+        * storage/indexeddb/cursor-finished-private-expected.txt: Added.
+        * storage/indexeddb/cursor-finished-private.html: Added.
+        * storage/indexeddb/cursor-inconsistency-private-expected.txt: Added.
+        * storage/indexeddb/cursor-inconsistency-private.html: Added.
+        * storage/indexeddb/cursor-index-delete-private-expected.txt: Added.
+        * storage/indexeddb/cursor-index-delete-private.html: Added.
+        * storage/indexeddb/cursor-key-order-private-expected.txt: Added.
+        * storage/indexeddb/cursor-key-order-private.html: Added.
+        * storage/indexeddb/cursor-prev-no-duplicate-private-expected.txt: Added.
+        * storage/indexeddb/cursor-prev-no-duplicate-private.html: Added.
+        * storage/indexeddb/cursor-primary-key-order-private-expected.txt: Added.
+        * storage/indexeddb/cursor-primary-key-order-private.html: Added.
+        * storage/indexeddb/cursor-properties-private-expected.txt: Added.
+        * storage/indexeddb/cursor-properties-private.html: Added.
+        * storage/indexeddb/cursor-reverse-bug-private-expected.txt: Added.
+        * storage/indexeddb/cursor-reverse-bug-private.html: Added.
+        * storage/indexeddb/cursor-skip-deleted-private-expected.txt: Added.
+        * storage/indexeddb/cursor-skip-deleted-private.html: Added.
+        * storage/indexeddb/cursor-update-private-expected.txt: Added.
+        * storage/indexeddb/cursor-update-private.html: Added.
+        * storage/indexeddb/cursor-update-value-argument-required-private-expected.txt: Added.
+        * storage/indexeddb/cursor-update-value-argument-required-private.html: Added.
+        * storage/indexeddb/cursor-value-private-expected.txt: Added.
+        * storage/indexeddb/cursor-value-private.html: Added.
+        * storage/indexeddb/database-basics-private-expected.txt: Added.
+        * storage/indexeddb/database-basics-private.html: Added.
+        * storage/indexeddb/database-close-private-expected.txt: Added.
+        * storage/indexeddb/database-close-private.html: Added.
+        * storage/indexeddb/database-closepending-flag-private-expected.txt: Added.
+        * storage/indexeddb/database-closepending-flag-private.html: Added.
+        * storage/indexeddb/database-deletepending-flag-private-expected.txt: Added.
+        * storage/indexeddb/database-deletepending-flag-private.html: Added.
+        * storage/indexeddb/database-name-undefined-private-expected.txt: Added.
+        * storage/indexeddb/database-name-undefined-private.html: Added.
+        * storage/indexeddb/database-odd-names-private-expected.txt: Added.
+        * storage/indexeddb/database-odd-names-private.html: Added.
+        * storage/indexeddb/database-quota-private-expected.txt: Added.
+        * storage/indexeddb/database-quota-private.html: Added.
+        * storage/indexeddb/database-wrapper-private-expected.txt: Added.
+        * storage/indexeddb/database-wrapper-private.html: Added.
+        * storage/indexeddb/delete-closed-database-object-private-expected.txt: Added.
+        * storage/indexeddb/delete-closed-database-object-private.html: Added.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private-expected.txt: Added.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html: Added.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private-expected.txt: Added.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html: Added.
+        * storage/indexeddb/delete-range-private-expected.txt: Added.
+        * storage/indexeddb/delete-range-private.html: Added.
+        * storage/indexeddb/deleteIndex-private-expected.txt: Added.
+        * storage/indexeddb/deleteIndex-private.html: Added.
+        * storage/indexeddb/deleteObjectStore-name-argument-required-private-expected.txt: Added.
+        * storage/indexeddb/deleteObjectStore-name-argument-required-private.html: Added.
+        * storage/indexeddb/deleteObjectStore-null-name-private-expected.txt: Added.
+        * storage/indexeddb/deleteObjectStore-null-name-private.html: Added.
+        * storage/indexeddb/deleted-objects-private-expected.txt: Added.
+        * storage/indexeddb/deleted-objects-private.html: Added.
+        * storage/indexeddb/deletedatabase-blocked-private-expected.txt: Added.
+        * storage/indexeddb/deletedatabase-blocked-private.html: Added.
+        * storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private-expected.txt: Added.
+        * storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html: Added.
+        * storage/indexeddb/deletedatabase-delayed-by-versionchange-private-expected.txt: Added.
+        * storage/indexeddb/deletedatabase-not-blocked-private-expected.txt: Added.
+        * storage/indexeddb/deletedatabase-not-blocked-private.html: Added.
+        * storage/indexeddb/dont-wedge-private-expected.txt: Added.
+        * storage/indexeddb/dont-wedge-private.html: Added.
+        * storage/indexeddb/duplicates-private-expected.txt: Added.
+        * storage/indexeddb/duplicates-private.html: Added.
+        * storage/indexeddb/error-causes-abort-by-default-private-expected.txt: Added.
+        * storage/indexeddb/error-causes-abort-by-default-private.html: Added.
+        * storage/indexeddb/events-private-expected.txt: Added.
+        * storage/indexeddb/events-private.html: Added.
+        * storage/indexeddb/exception-in-event-aborts-private-expected.txt: Added.
+        * storage/indexeddb/exception-in-event-aborts-private.html: Added.
+        * storage/indexeddb/exceptions-private-expected.txt: Added.
+        * storage/indexeddb/exceptions-private.html: Added.
+        * storage/indexeddb/factory-cmp-private-expected.txt: Added.
+        * storage/indexeddb/factory-cmp-private.html: Added.
+        * storage/indexeddb/factory-deletedatabase-private-expected.txt: Added.
+        * storage/indexeddb/factory-deletedatabase-private.html: Added.
+        * storage/indexeddb/get-keyrange-private-expected.txt: Added.
+        * storage/indexeddb/get-keyrange-private.html: Added.
+        * storage/indexeddb/index-basics-private-expected.txt: Added.
+        * storage/indexeddb/index-basics-private.html: Added.
+        * storage/indexeddb/index-count-private-expected.txt: Added.
+        * storage/indexeddb/index-count-private.html: Added.
+        * storage/indexeddb/index-cursor-private-expected.txt: Added.
+        * storage/indexeddb/index-cursor-private.html: Added.
+        * storage/indexeddb/index-duplicate-keypaths-private-expected.txt: Added.
+        * storage/indexeddb/index-duplicate-keypaths-private.html: Added.
+        * storage/indexeddb/index-get-key-argument-required-private-expected.txt: Added.
+        * storage/indexeddb/index-get-key-argument-required-private.html: Added.
+        * storage/indexeddb/index-multientry-private-expected.txt: Added.
+        * storage/indexeddb/index-multientry-private.html: Added.
+        * storage/indexeddb/index-population-private-expected.txt: Added.
+        * storage/indexeddb/index-population-private.html: Added.
+        * storage/indexeddb/index-unique-private-expected.txt: Added.
+        * storage/indexeddb/index-unique-private.html: Added.
+        * storage/indexeddb/interfaces-private-expected.txt: Added.
+        * storage/indexeddb/interfaces-private.html: Added.
+        * storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private-expected.txt: Added.
+        * storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html: Added.
+        * storage/indexeddb/intversion-bad-parameters-private-expected.txt: Added.
+        * storage/indexeddb/intversion-bad-parameters-private.html: Added.
+        * storage/indexeddb/intversion-blocked-private-expected.txt: Added.
+        * storage/indexeddb/intversion-blocked-private.html: Added.
+        * storage/indexeddb/intversion-close-between-events-private-expected.txt: Added.
+        * storage/indexeddb/intversion-close-between-events-private.html: Added.
+        * storage/indexeddb/intversion-close-in-oncomplete-private-expected.txt: Added.
+        * storage/indexeddb/intversion-close-in-oncomplete-private.html: Added.
+        * storage/indexeddb/intversion-close-in-upgradeneeded-private-expected.txt: Added.
+        * storage/indexeddb/intversion-close-in-upgradeneeded-private.html: Added.
+        * storage/indexeddb/intversion-encoding-private-expected.txt: Added.
+        * storage/indexeddb/intversion-encoding-private.html: Added.
+        * storage/indexeddb/intversion-gated-on-delete-private-expected.txt: Added.
+        * storage/indexeddb/intversion-gated-on-delete-private.html: Added.
+        * storage/indexeddb/intversion-long-queue-private-expected.txt: Added.
+        * storage/indexeddb/intversion-long-queue-private.html: Added.
+        * storage/indexeddb/intversion-omit-parameter-private-expected.txt: Added.
+        * storage/indexeddb/intversion-omit-parameter-private.html: Added.
+        * storage/indexeddb/intversion-open-in-upgradeneeded-private-expected.txt: Added.
+        * storage/indexeddb/intversion-open-in-upgradeneeded-private.html: Added.
+        * storage/indexeddb/intversion-open-with-version-private-expected.txt: Added.
+        * storage/indexeddb/intversion-open-with-version-private.html: Added.
+        * storage/indexeddb/intversion-pending-version-changes-ascending-private-expected.txt: Added.
+        * storage/indexeddb/intversion-pending-version-changes-ascending-private.html: Added.
+        * storage/indexeddb/intversion-pending-version-changes-descending-private-expected.txt: Added.
+        * storage/indexeddb/intversion-pending-version-changes-descending-private.html: Added.
+        * storage/indexeddb/intversion-pending-version-changes-same-private-expected.txt: Added.
+        * storage/indexeddb/intversion-pending-version-changes-same-private.html: Added.
+        * storage/indexeddb/intversion-persistence-private-expected.txt: Added.
+        * storage/indexeddb/intversion-persistence-private.html: Added.
+        * storage/indexeddb/intversion-revert-on-abort-private-expected.txt: Added.
+        * storage/indexeddb/intversion-revert-on-abort-private.html: Added.
+        * storage/indexeddb/intversion-two-opens-no-versions-private-expected.txt: Added.
+        * storage/indexeddb/intversion-two-opens-no-versions-private.html: Added.
+        * storage/indexeddb/intversion-upgrades-private-expected.txt: Added.
+        * storage/indexeddb/intversion-upgrades-private.html: Added.
+        * storage/indexeddb/invalid-keys-private-expected.txt: Added.
+        * storage/indexeddb/invalid-keys-private.html: Added.
+        * storage/indexeddb/key-generator-private-expected.txt: Added.
+        * storage/indexeddb/key-generator-private.html: Added.
+        * storage/indexeddb/key-sort-order-across-types-private-expected.txt: Added.
+        * storage/indexeddb/key-sort-order-across-types-private.html: Added.
+        * storage/indexeddb/key-sort-order-date-private-expected.txt: Added.
+        * storage/indexeddb/key-sort-order-date-private.html: Added.
+        * storage/indexeddb/key-type-array-private-expected.txt: Added.
+        * storage/indexeddb/key-type-array-private.html: Added.
+        * storage/indexeddb/key-type-binary-private-expected.txt: Added.
+        * storage/indexeddb/key-type-binary-private.html: Added.
+        * storage/indexeddb/key-type-infinity-private-expected.txt: Added.
+        * storage/indexeddb/key-type-infinity-private.html: Added.
+        * storage/indexeddb/keypath-arrays-private-expected.txt: Added.
+        * storage/indexeddb/keypath-arrays-private.html: Added.
+        * storage/indexeddb/keypath-basics-private-expected.txt: Added.
+        * storage/indexeddb/keypath-basics-private.html: Added.
+        * storage/indexeddb/keypath-edges-private-expected.txt: Added.
+        * storage/indexeddb/keypath-edges-private.html: Added.
+        * storage/indexeddb/keypath-fetch-key-private-expected.txt: Added.
+        * storage/indexeddb/keypath-fetch-key-private.html: Added.
+        * storage/indexeddb/keypath-intrinsic-properties-private-expected.txt: Added.
+        * storage/indexeddb/keypath-intrinsic-properties-private.html: Added.
+        * storage/indexeddb/keyrange-private-expected.txt: Added.
+        * storage/indexeddb/keyrange-private.html: Added.
+        * storage/indexeddb/keyrange-required-arguments-private-expected.txt: Added.
+        * storage/indexeddb/keyrange-required-arguments-private.html: Added.
+        * storage/indexeddb/lazy-index-types-private-expected.txt: Added.
+        * storage/indexeddb/lazy-index-types-private.html: Added.
+        * storage/indexeddb/legacy-constants-private-expected.txt: Added.
+        * storage/indexeddb/legacy-constants-private.html: Added.
+        * storage/indexeddb/list-ordering-private-expected.txt: Added.
+        * storage/indexeddb/list-ordering-private.html: Added.
+        * storage/indexeddb/metadata-private-expected.txt: Added.
+        * storage/indexeddb/metadata-private.html: Added.
+        * storage/indexeddb/mutating-cursor-private-expected.txt: Added.
+        * storage/indexeddb/mutating-cursor-private.html: Added.
+        * storage/indexeddb/objectStore-required-arguments-private-expected.txt: Added.
+        * storage/indexeddb/objectStore-required-arguments-private.html: Added.
+        * storage/indexeddb/objectstore-autoincrement-private-expected.txt: Added.
+        * storage/indexeddb/objectstore-autoincrement-private.html: Added.
+        * storage/indexeddb/objectstore-basics-private-expected.txt: Added.
+        * storage/indexeddb/objectstore-basics-private.html: Added.
+        * storage/indexeddb/objectstore-clear-private-expected.txt: Added.
+        * storage/indexeddb/objectstore-clear-private.html: Added.
+        * storage/indexeddb/objectstore-count-private-expected.txt: Added.
+        * storage/indexeddb/objectstore-count-private.html: Added.
+        * storage/indexeddb/objectstore-cursor-private-expected.txt: Added.
+        * storage/indexeddb/objectstore-cursor-private.html: Added.
+        * storage/indexeddb/objectstore-removeobjectstore-private-expected.txt: Added.
+        * storage/indexeddb/objectstore-removeobjectstore-private.html: Added.
+        * storage/indexeddb/odd-strings-private-expected.txt: Added.
+        * storage/indexeddb/odd-strings-private.html: Added.
+        * storage/indexeddb/open-cursor-private-expected.txt: Added.
+        * storage/indexeddb/open-cursor-private.html: Added.
+        * storage/indexeddb/open-during-transaction-private-expected.txt: Added.
+        * storage/indexeddb/open-during-transaction-private.html: Added.
+        * storage/indexeddb/open-ordering-private-expected.txt: Added.
+        * storage/indexeddb/open-ordering-private.html: Added.
+        * storage/indexeddb/opencursor-key-private-expected.txt: Added.
+        * storage/indexeddb/opencursor-key-private.html: Added.
+        * storage/indexeddb/pending-activity-private-expected.txt: Added.
+        * storage/indexeddb/pending-activity-private.html: Added.
+        * storage/indexeddb/pending-version-change-on-exit-private-expected.txt: Added.
+        * storage/indexeddb/pending-version-change-on-exit-private.html: Added.
+        * storage/indexeddb/pending-version-change-stuck-private-expected.txt: Added.
+        * storage/indexeddb/pending-version-change-stuck-private.html: Added.
+        * storage/indexeddb/persistence-expected.txt:
+        * storage/indexeddb/persistence-private-expected.txt: Copied from LayoutTests/storage/indexeddb/persistence-expected.txt.
+        * storage/indexeddb/persistence-private.html: Added.
+        * storage/indexeddb/prefetch-bugfix-108071-private-expected.txt: Added.
+        * storage/indexeddb/prefetch-bugfix-108071-private.html: Added.
+        * storage/indexeddb/queued-commands-private-expected.txt: Added.
+        * storage/indexeddb/queued-commands-private.html: Added.
+        * storage/indexeddb/readonly-private-expected.txt: Added.
+        * storage/indexeddb/readonly-private.html: Added.
+        * storage/indexeddb/readonly-properties-private-expected.txt: Added.
+        * storage/indexeddb/readonly-properties-private.html: Added.
+        * storage/indexeddb/removed-private-expected.txt: Added.
+        * storage/indexeddb/removed-private.html: Added.
+        * storage/indexeddb/request-continue-abort-private-expected.txt: Added.
+        * storage/indexeddb/request-continue-abort-private.html: Added.
+        * storage/indexeddb/request-event-propagation-private-expected.txt: Added.
+        * storage/indexeddb/request-event-propagation-private.html: Added.
+        * storage/indexeddb/resources/persistence.js:
+        * storage/indexeddb/set_version_blocked-private-expected.txt: Added.
+        * storage/indexeddb/set_version_blocked-private.html: Added.
+        * storage/indexeddb/setversion-blocked-by-versionchange-close-private-expected.txt: Added.
+        * storage/indexeddb/setversion-blocked-by-versionchange-close-private.html: Added.
+        * storage/indexeddb/setversion-not-blocked-private-expected.txt: Added.
+        * storage/indexeddb/setversion-not-blocked-private.html: Added.
+        * storage/indexeddb/transaction-abort-private-expected.txt: Added.
+        * storage/indexeddb/transaction-abort-private.html: Added.
+        * storage/indexeddb/transaction-active-flag-private-expected.txt: Added.
+        * storage/indexeddb/transaction-active-flag-private.html: Added.
+        * storage/indexeddb/transaction-after-close-private-expected.txt: Added.
+        * storage/indexeddb/transaction-after-close-private.html: Added.
+        * storage/indexeddb/transaction-and-objectstore-calls-private-expected.txt: Added.
+        * storage/indexeddb/transaction-and-objectstore-calls-private.html: Added.
+        * storage/indexeddb/transaction-basics-private-expected.txt: Added.
+        * storage/indexeddb/transaction-basics-private.html: Added.
+        * storage/indexeddb/transaction-complete-workers-private-expected.txt: Added.
+        * storage/indexeddb/transaction-complete-workers-private.html: Added.
+        * storage/indexeddb/transaction-coordination-across-databases-private-expected.txt: Added.
+        * storage/indexeddb/transaction-coordination-across-databases-private.html: Added.
+        * storage/indexeddb/transaction-coordination-within-database-private-expected.txt: Added.
+        * storage/indexeddb/transaction-coordination-within-database-private.html: Added.
+        * storage/indexeddb/transaction-crash-on-abort-private-expected.txt: Added.
+        * storage/indexeddb/transaction-crash-on-abort-private.html: Added.
+        * storage/indexeddb/transaction-error-private-expected.txt: Added.
+        * storage/indexeddb/transaction-error-private.html: Added.
+        * storage/indexeddb/transaction-event-propagation-private-expected.txt: Added.
+        * storage/indexeddb/transaction-event-propagation-private.html: Added.
+        * storage/indexeddb/transaction-read-only-private-expected.txt: Added.
+        * storage/indexeddb/transaction-read-only-private.html: Added.
+        * storage/indexeddb/transaction-readwrite-exclusive-private-expected.txt: Added.
+        * storage/indexeddb/transaction-readwrite-exclusive-private.html: Added.
+        * storage/indexeddb/transaction-rollback-private-expected.txt: Added.
+        * storage/indexeddb/transaction-rollback-private.html: Added.
+        * storage/indexeddb/transaction-scope-sequencing-private-expected.txt: Added.
+        * storage/indexeddb/transaction-scope-sequencing-private.html: Added.
+        * storage/indexeddb/transaction-starvation-private-expected.txt: Added.
+        * storage/indexeddb/transaction-storeNames-required-private-expected.txt: Added.
+        * storage/indexeddb/transaction-storeNames-required-private.html: Added.
+        * storage/indexeddb/unblocked-version-changes-private-expected.txt: Added.
+        * storage/indexeddb/unblocked-version-changes-private.html: Added.
+        * storage/indexeddb/unprefix-private-expected.txt: Added.
+        * storage/indexeddb/unprefix-private.html: Added.
+        * storage/indexeddb/value-undefined-private-expected.txt: Added.
+        * storage/indexeddb/value-undefined-private.html: Added.
+        * storage/indexeddb/values-odd-types-private-expected.txt: Added.
+        * storage/indexeddb/values-odd-types-private.html: Added.
+        * storage/indexeddb/version-change-abort-private-expected.txt: Added.
+        * storage/indexeddb/version-change-abort-private.html: Added.
+        * storage/indexeddb/version-change-exclusive-private-expected.txt: Added.
+        * storage/indexeddb/version-change-exclusive-private.html: Added.
+        * storage/indexeddb/versionchangerequest-activedomobject-private-expected.txt: Added.
+        * storage/indexeddb/versionchangerequest-activedomobject-private.html: Added.
+
</ins><span class="cx"> 2016-01-18  Nan Wang  &lt;n_wang@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: [Mac] Implement next/previous text marker functions using TextIterator
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/TestExpectations        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -667,7 +667,9 @@
</span><span class="cx"> # IDBVersionChangeEvent tests need to be rewritten to use event constructors instead of createEvent,
</span><span class="cx"> # after we implement the IDBVersionChangeEvent constructor.
</span><span class="cx"> webkit.org/b/145390 storage/indexeddb/events.html [ Failure ]
</span><ins>+webkit.org/b/145390 storage/indexeddb/events-private.html [ Failure ]
</ins><span class="cx"> webkit.org/b/145390 storage/indexeddb/removed.html [ Failure ]
</span><ins>+webkit.org/b/145390 storage/indexeddb/removed-private.html [ Failure ]
</ins><span class="cx"> 
</span><span class="cx"> webkit.org/b/145390 storage/indexeddb/deleteIndex-bug110792.html [ Pass Failure ]
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/TestExpectations        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -78,6 +78,7 @@
</span><span class="cx"> 
</span><span class="cx"> # Times out for unexplored reasons                                                             
</span><span class="cx"> storage/indexeddb/database-quota.html [ Skip ]
</span><ins>+storage/indexeddb/database-quota-private.html [ Skip ]
</ins><span class="cx"> 
</span><span class="cx"> # Modern IDB page cache interaction not yet sorted out
</span><span class="cx"> fast/history/page-cache-indexed-closed-db.html [ Failure ]
</span><span class="lines">@@ -91,6 +92,7 @@
</span><span class="cx"> storage/indexeddb/cursor-leak.html [ Failure ]
</span><span class="cx"> storage/indexeddb/cursor-request-cycle.html [ Failure ]
</span><span class="cx"> storage/indexeddb/delete-closed-database-object.html [ Skip ]
</span><ins>+storage/indexeddb/delete-closed-database-object-private.html [ Skip ]
</ins><span class="cx"> storage/indexeddb/request-leak.html [ Failure ]
</span><span class="cx"> 
</span><span class="cx"> # No workers support in Modern IDB yet
</span><span class="lines">@@ -106,9 +108,12 @@
</span><span class="cx"> storage/indexeddb/open-twice-workers.html
</span><span class="cx"> storage/indexeddb/pending-activity-workers.html
</span><span class="cx"> storage/indexeddb/pending-version-change-on-exit.html
</span><ins>+storage/indexeddb/pending-version-change-on-exit-private.html
</ins><span class="cx"> storage/indexeddb/pending-version-change-stuck-works-with-terminate.html
</span><span class="cx"> storage/indexeddb/pending-version-change-stuck.html
</span><ins>+storage/indexeddb/pending-version-change-stuck-private.html
</ins><span class="cx"> storage/indexeddb/transaction-complete-workers.html
</span><ins>+storage/indexeddb/transaction-complete-workers-private.html
</ins><span class="cx"> storage/indexeddb/unprefix-workers.html
</span><span class="cx"> 
</span><span class="cx"> # Need a different way to get database names to the web inspector
</span></span></pre></div>
<a id="trunkLayoutTestsplatformwk2TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/wk2/TestExpectations (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/wk2/TestExpectations        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/platform/wk2/TestExpectations        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -719,6 +719,158 @@
</span><span class="cx"> webkit.org/b/115274 http/tests/security/contentSecurityPolicy/report-same-origin-no-cookies-when-private-browsing-toggled.html [ Skip ]
</span><span class="cx"> webkit.org/b/115274 http/tests/security/contentSecurityPolicy/report-same-origin-with-cookies-when-private-browsing-enabled.html [ Skip ]
</span><span class="cx"> 
</span><ins>+# Legacy IndexedDB will never properly support IDB in private browsing
+storage/indexeddb/aborted-versionchange-closes-private.html
+storage/indexeddb/basics-private.html
+storage/indexeddb/create-and-remove-object-store-private.html
+storage/indexeddb/create-object-store-options-private.html
+storage/indexeddb/createIndex-after-failure-private.html
+storage/indexeddb/createObjectStore-name-argument-required-private.html
+storage/indexeddb/createObjectStore-null-name-private.html
+storage/indexeddb/cursor-added-bug-private.html
+storage/indexeddb/cursor-advance-private.html
+storage/indexeddb/cursor-basics-private.html
+storage/indexeddb/cursor-continue-dir-private.html
+storage/indexeddb/cursor-continue-private.html
+storage/indexeddb/cursor-continue-validity-private.html
+storage/indexeddb/cursor-delete-private.html
+storage/indexeddb/cursor-finished-private.html
+storage/indexeddb/cursor-inconsistency-private.html
+storage/indexeddb/cursor-index-delete-private.html
+storage/indexeddb/cursor-key-order-private.html
+storage/indexeddb/cursor-prev-no-duplicate-private.html
+storage/indexeddb/cursor-primary-key-order-private.html
+storage/indexeddb/cursor-properties-private.html
+storage/indexeddb/cursor-reverse-bug-private.html
+storage/indexeddb/cursor-skip-deleted-private.html
+storage/indexeddb/cursor-update-private.html
+storage/indexeddb/cursor-update-value-argument-required-private.html
+storage/indexeddb/cursor-value-private.html
+storage/indexeddb/database-basics-private.html
+storage/indexeddb/database-close-private.html
+storage/indexeddb/database-closepending-flag-private.html
+storage/indexeddb/database-deletepending-flag-private.html
+storage/indexeddb/database-name-undefined-private.html
+storage/indexeddb/database-odd-names-private.html
+storage/indexeddb/database-quota-private.html
+storage/indexeddb/database-wrapper-private.html
+storage/indexeddb/delete-closed-database-object-private.html
+storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html
+storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html
+storage/indexeddb/delete-range-private.html
+storage/indexeddb/deleteIndex-private.html
+storage/indexeddb/deleteObjectStore-name-argument-required-private.html
+storage/indexeddb/deleteObjectStore-null-name-private.html
+storage/indexeddb/deleted-objects-private.html
+storage/indexeddb/deletedatabase-blocked-private.html
+storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html
+storage/indexeddb/deletedatabase-not-blocked-private.html
+storage/indexeddb/dont-wedge-private.html
+storage/indexeddb/duplicates-private.html
+storage/indexeddb/error-causes-abort-by-default-private.html
+storage/indexeddb/events-private.html
+storage/indexeddb/exception-in-event-aborts-private.html
+storage/indexeddb/exceptions-private.html
+storage/indexeddb/factory-cmp-private.html
+storage/indexeddb/factory-deletedatabase-private.html
+storage/indexeddb/get-keyrange-private.html
+storage/indexeddb/index-basics-private.html
+storage/indexeddb/index-count-private.html
+storage/indexeddb/index-cursor-private.html
+storage/indexeddb/index-duplicate-keypaths-private.html
+storage/indexeddb/index-get-key-argument-required-private.html
+storage/indexeddb/index-multientry-private.html
+storage/indexeddb/index-population-private.html
+storage/indexeddb/index-unique-private.html
+storage/indexeddb/interfaces-private.html
+storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html
+storage/indexeddb/intversion-bad-parameters-private.html
+storage/indexeddb/intversion-blocked-private.html
+storage/indexeddb/intversion-close-between-events-private.html
+storage/indexeddb/intversion-close-in-oncomplete-private.html
+storage/indexeddb/intversion-close-in-upgradeneeded-private.html
+storage/indexeddb/intversion-encoding-private.html
+storage/indexeddb/intversion-gated-on-delete-private.html
+storage/indexeddb/intversion-long-queue-private.html
+storage/indexeddb/intversion-omit-parameter-private.html
+storage/indexeddb/intversion-open-in-upgradeneeded-private.html
+storage/indexeddb/intversion-open-with-version-private.html
+storage/indexeddb/intversion-pending-version-changes-ascending-private.html
+storage/indexeddb/intversion-pending-version-changes-descending-private.html
+storage/indexeddb/intversion-pending-version-changes-same-private.html
+storage/indexeddb/intversion-persistence-private.html
+storage/indexeddb/intversion-revert-on-abort-private.html
+storage/indexeddb/intversion-two-opens-no-versions-private.html
+storage/indexeddb/intversion-upgrades-private.html
+storage/indexeddb/invalid-keys-private.html
+storage/indexeddb/key-generator-private.html
+storage/indexeddb/key-sort-order-across-types-private.html
+storage/indexeddb/key-sort-order-date-private.html
+storage/indexeddb/key-type-array-private.html
+storage/indexeddb/key-type-binary-private.html
+storage/indexeddb/key-type-infinity-private.html
+storage/indexeddb/keypath-arrays-private.html
+storage/indexeddb/keypath-basics-private.html
+storage/indexeddb/keypath-edges-private.html
+storage/indexeddb/keypath-fetch-key-private.html
+storage/indexeddb/keypath-intrinsic-properties-private.html
+storage/indexeddb/keyrange-private.html
+storage/indexeddb/keyrange-required-arguments-private.html
+storage/indexeddb/lazy-index-types-private.html
+storage/indexeddb/legacy-constants-private.html
+storage/indexeddb/list-ordering-private.html
+storage/indexeddb/metadata-private.html
+storage/indexeddb/mutating-cursor-private.html
+storage/indexeddb/objectStore-required-arguments-private.html
+storage/indexeddb/objectstore-autoincrement-private.html
+storage/indexeddb/objectstore-basics-private.html
+storage/indexeddb/objectstore-clear-private.html
+storage/indexeddb/objectstore-count-private.html
+storage/indexeddb/objectstore-cursor-private.html
+storage/indexeddb/objectstore-removeobjectstore-private.html
+storage/indexeddb/odd-strings-private.html
+storage/indexeddb/open-cursor-private.html
+storage/indexeddb/open-during-transaction-private.html
+storage/indexeddb/open-ordering-private.html
+storage/indexeddb/opencursor-key-private.html
+storage/indexeddb/pending-activity-private.html
+storage/indexeddb/pending-version-change-on-exit-private.html
+storage/indexeddb/pending-version-change-stuck-private.html
+storage/indexeddb/persistence-private.html
+storage/indexeddb/prefetch-bugfix-108071-private.html
+storage/indexeddb/queued-commands-private.html
+storage/indexeddb/readonly-private.html
+storage/indexeddb/readonly-properties-private.html
+storage/indexeddb/removed-private.html
+storage/indexeddb/request-continue-abort-private.html
+storage/indexeddb/request-event-propagation-private.html
+storage/indexeddb/set_version_blocked-private.html
+storage/indexeddb/setversion-blocked-by-versionchange-close-private.html
+storage/indexeddb/setversion-not-blocked-private.html
+storage/indexeddb/transaction-abort-private.html
+storage/indexeddb/transaction-active-flag-private.html
+storage/indexeddb/transaction-after-close-private.html
+storage/indexeddb/transaction-and-objectstore-calls-private.html
+storage/indexeddb/transaction-basics-private.html
+storage/indexeddb/transaction-complete-workers-private.html
+storage/indexeddb/transaction-coordination-across-databases-private.html
+storage/indexeddb/transaction-coordination-within-database-private.html
+storage/indexeddb/transaction-crash-on-abort-private.html
+storage/indexeddb/transaction-error-private.html
+storage/indexeddb/transaction-event-propagation-private.html
+storage/indexeddb/transaction-read-only-private.html
+storage/indexeddb/transaction-readwrite-exclusive-private.html
+storage/indexeddb/transaction-rollback-private.html
+storage/indexeddb/transaction-scope-sequencing-private.html
+storage/indexeddb/transaction-storeNames-required-private.html
+storage/indexeddb/unblocked-version-changes-private.html
+storage/indexeddb/unprefix-private.html
+storage/indexeddb/value-undefined-private.html
+storage/indexeddb/values-odd-types-private.html
+storage/indexeddb/versionchangerequest-activedomobject-private.html
+storage/indexeddb/version-change-abort-private.html
+storage/indexeddb/version-change-exclusive-private.html
+
</ins><span class="cx"> ### END OF (4) Features that are not supported in WebKit2 and likely never will be
</span><span class="cx"> ########################################
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsresourcesjstestjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/resources/js-test.js (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/resources/js-test.js        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/resources/js-test.js        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -1,9 +1,13 @@
</span><del>-// svg/dynamic-updates tests set enablePixelTesting=true, as we want to dump text + pixel results
</del><span class="cx"> if (self.testRunner) {
</span><ins>+        // svg/dynamic-updates tests set enablePixelTesting=true, as we want to dump text + pixel results
</ins><span class="cx">     if (self.enablePixelTesting)
</span><span class="cx">         testRunner.dumpAsTextWithPixelResults();
</span><span class="cx">     else
</span><span class="cx">         testRunner.dumpAsText();
</span><ins>+
+    // If the test file URL ends in &quot;-private.html&quot;, enable private browsing.
+    if (window.location.href.endsWith(&quot;-private.html&quot;))
+        testRunner.setPrivateBrowsingEnabled(true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> var description, debug, successfullyParsed;
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbabortedversionchangeclosesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,47 @@
</span><ins>+Test that an aborted 'versionchange' transaction closes the connection.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname, 1)
+
+prepareDatabase():
+db = event.target.result
+db.createObjectStore('store')
+
+onOpen():
+db = event.target.result
+db.close()
+
+openAgain():
+request = indexedDB.open(dbname, 2)
+
+onUpgradeNeeded():
+db = event.target.result
+transaction = event.target.transaction
+sawTransactionAbort = false
+
+onTransactionAbort():
+sawTransactionAbort = true
+creating a transaction should fail because connection is closed:
+Expecting exception from db.transaction('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+
+onOpenError():
+PASS sawTransactionAbort is true
+creating a transaction should fail because connection is closed:
+Expecting exception from db.transaction('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbabortedversionchangeclosesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/aborted-versionchange-closes-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/aborted-versionchange-closes.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbbasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+Test IndexedDB's basics.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.open('basics')
+PASS 'result' in request is true
+Expecting exception from request.result
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to read the 'result' property from 'IDBRequest': The request has not finished.
+PASS 'error' in request is true
+Expecting exception from request.error
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to read the 'error' property from 'IDBRequest': The request has not finished.
+PASS 'source' in request is true
+PASS request.source is null
+PASS 'transaction' in request is true
+PASS request.transaction is null
+PASS 'readyState' in request is true
+PASS request.readyState is &quot;pending&quot;
+PASS 'onsuccess' in request is true
+PASS request.onsuccess is null
+PASS 'onerror' in request is true
+PASS request.onerror is null
+PASS 'result' in event.target is true
+PASS !!event.target.result is true
+PASS 'error' in event.target is true
+PASS event.target.error is null
+PASS 'source' in event.target is true
+PASS request.source is null
+PASS 'transaction' in event.target is true
+PASS event.target.transaction is null
+PASS 'readyState' in request is true
+PASS event.target.readyState is &quot;done&quot;
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbbasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateandremoveobjectstoreprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+Test IndexedDB's create and removeObjectStore
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('tmp')
+Expecting exception from db.createObjectStore('tmp')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ConstraintError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': An object store with the specified name already exists.
+trans = db.transaction(['tmp'])
+trans.objectStore('tmp').get(0)
+PASS event.target.result is undefined.
+Trying create
+Expecting exception from db.createObjectStore(&quot;some os&quot;)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+Trying remove
+Expecting exception from db.deleteObjectStore(&quot;some os&quot;)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+Trying create with store that already exists
+Expecting exception from db.createObjectStore('tmp')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+Trying remove with store that already exists
+Expecting exception from db.deleteObjectStore('tmp')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateandremoveobjectstoreprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/create-and-remove-object-store-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/create-and-remove-object-store.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateobjectstoreoptionsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/create-object-store-options-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/create-object-store-options-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/create-object-store-options-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+Test IndexedDB's createObjectStore's various options
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('a', {keyPath: 'a'})
+db.createObjectStore('b')
+db.createObjectStore('c', {autoIncrement: true});
+trans = db.transaction(['a', 'b'], 'readwrite')
+PASS trans.mode is &quot;readwrite&quot;
+trans.objectStore('a').put({'a': 0})
+Expecting TypeError exception from db.createObjectStore('d', 'bar');
+PASS Exception was thrown.
+PASS db.createObjectStore('d', 'bar'); threw TypeError: Not an object.
+Expecting TypeError exception from db.createObjectStore('e', false);
+PASS Exception was thrown.
+PASS db.createObjectStore('e', false); threw TypeError: Not an object.
+trans.objectStore('b').put({'a': 0}, 0)
+trans.objectStore('a').get(0)
+PASS event.target.result.a is {a: 0}
+trans.objectStore('b').get(0)
+PASS event.target.result.a is {a: 0}
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateobjectstoreoptionsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/create-object-store-options-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/create-object-store-options-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/create-object-store-options-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/create-object-store-options.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateIndexafterfailureprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+Test createIndex failing due to a ConstraintError
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore.createIndex('index', 'key', {unique: true})
+objectStore.deleteIndex('index')
+Expecting exception from objectStore.deleteIndex('index')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The specified index was not found.
+Now requesting object2
+now we wait.
+Error function called: (AbortError) undefined
+PASS Abort function called: (ConstraintError) undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateIndexafterfailureprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/createIndex-after-failure-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/createIndex-after-failure.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateObjectStorenameargumentrequiredprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+Test IndexedDB createObjectStore name argument is required
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db = event.target.result
+PASS db.createObjectStore(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateObjectStorenameargumentrequiredprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/createObjectStore-name-argument-required-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/createObjectStore-name-argument-required.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateObjectStorenullnameprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+Test IndexedDB createObjectStore null handling
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore(null);
+PASS objectStore.name is &quot;null&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcreateObjectStorenullnameprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/createObjectStore-null-name-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/createObjectStore-null-name.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursoraddedbugprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+Test IndexedDB cursor iterates correctly over values added during iteration.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+trans = event.target.transaction
+PASS trans is non-null.
+objectStore = db.createObjectStore('test')
+objectStore.add(1, 1)
+objectStore.add(2, 2)
+objectStore.add(3, 3)
+trans = db.transaction(['test'], 'readwrite')
+trans.objectStore('test').openCursor()
+PASS event.target.result.key is 1
+trans.objectStore('test').add(6, 6)
+event.target.result.continue()
+PASS event.target.result.key is 2
+trans.objectStore('test').add(5, 5)
+event.target.result.continue()
+PASS event.target.result.key is 3
+trans.objectStore('test').add(4, 4)
+event.target.result.continue()
+PASS event.target.result.key is 4
+event.target.result.continue()
+PASS event.target.result.key is 5
+event.target.result.continue()
+PASS event.target.result.key is 6
+event.target.result.continue()
+PASS counter is 6
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursoraddedbugprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-added-bug-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-added-bug.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursoradvanceprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-advance-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-advance-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-advance-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,253 @@
</span><ins>+Test IndexedDB cursor.advance().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+objectStore = db.createObjectStore(objectStoreName);
+Now create the indexes.
+objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+trans = db.transaction(objectStoreName, 'readwrite')
+objectStore = trans.objectStore(objectStoreName)
+First, add all our data to the object store.
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+testSimple()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor()
+cursor.advance(1)
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7733\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ann\&quot;,\&quot;height\&quot;:52,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7733\&quot;}&quot;
+testContinueThenAdvance()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor()
+cursor.continue();
+cursor.continue();
+cursor.continue();
+cursor.advance(1)
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7736\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Joe\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:150},\&quot;primaryKey\&quot;:\&quot;237-23-7736\&quot;}&quot;
+testAdvanceMultiple()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor()
+cursor.advance(3)
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7735\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Sue\&quot;,\&quot;height\&quot;:58,\&quot;weight\&quot;:130},\&quot;primaryKey\&quot;:\&quot;237-23-7735\&quot;}&quot;
+testAdvanceIndex()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor()
+cursor.advance(3)
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;Jef\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Jef\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7739\&quot;}&quot;
+testAdvanceIndexNoDupe()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor(null, 'nextunique')
+cursor.advance(3)
+PASS expected is &quot;{\&quot;key\&quot;:130,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Sue\&quot;,\&quot;height\&quot;:58,\&quot;weight\&quot;:130},\&quot;primaryKey\&quot;:\&quot;237-23-7735\&quot;}&quot;
+testAdvanceIndexPrev()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor(null, 'prev')
+cursor.advance(3)
+PASS expected is &quot;{\&quot;key\&quot;:150,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Joe\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:150},\&quot;primaryKey\&quot;:\&quot;237-23-7736\&quot;}&quot;
+testAdvanceIndexPrevNoDupe()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor(null, 'prevunique')
+cursor.advance(3)
+PASS expected is &quot;{\&quot;key\&quot;:120,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Bob\&quot;,\&quot;height\&quot;:60,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7732\&quot;}&quot;
+testAdvanceToEnd()
+trans = db.transaction(objectStoreName)
+store = trans.objectStore(objectStoreName)
+request = store.openCursor()
+cursor.advance(100)
+PASS expected is &quot;null&quot;
+testPrefetchInRange()
+trans = db.transaction(objectStoreName)
+objectStore = trans.objectStore(objectStoreName)
+request = objectStore.openCursor()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7732\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Bob\&quot;,\&quot;height\&quot;:60,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7732\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7733\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ann\&quot;,\&quot;height\&quot;:52,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7733\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7734\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ron\&quot;,\&quot;height\&quot;:73,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7734\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7735\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Sue\&quot;,\&quot;height\&quot;:58,\&quot;weight\&quot;:130},\&quot;primaryKey\&quot;:\&quot;237-23-7735\&quot;}&quot;
+cursor.advance(2)
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7737\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Pat\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:100},\&quot;primaryKey\&quot;:\&quot;237-23-7737\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7738\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Leo\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7738\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7739\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Jef\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7739\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7740\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Sam\&quot;,\&quot;height\&quot;:71,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7740\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7741\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Bug\&quot;,\&quot;height\&quot;:63,\&quot;weight\&quot;:100},\&quot;primaryKey\&quot;:\&quot;237-23-7741\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7742\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Tub\&quot;,\&quot;height\&quot;:69,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7742\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7743\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Rug\&quot;,\&quot;height\&quot;:77,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7743\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7744\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Pug\&quot;,\&quot;height\&quot;:66,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7744\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+testPrefetchOutOfRange()
+trans = db.transaction(objectStoreName)
+objectStore = trans.objectStore(objectStoreName)
+request = objectStore.openCursor()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7732\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Bob\&quot;,\&quot;height\&quot;:60,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7732\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7733\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ann\&quot;,\&quot;height\&quot;:52,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7733\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7734\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ron\&quot;,\&quot;height\&quot;:73,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7734\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7735\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Sue\&quot;,\&quot;height\&quot;:58,\&quot;weight\&quot;:130},\&quot;primaryKey\&quot;:\&quot;237-23-7735\&quot;}&quot;
+cursor.advance(7)
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7742\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Tub\&quot;,\&quot;height\&quot;:69,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7742\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7743\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Rug\&quot;,\&quot;height\&quot;:77,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7743\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7744\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Pug\&quot;,\&quot;height\&quot;:66,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7744\&quot;}&quot;
+cursor.continue()
+
+prefetch():
+testBadAdvance()
+trans = db.transaction(objectStoreName, 'readwrite')
+objectStore = trans.objectStore(objectStoreName)
+request = objectStore.openCursor()
+
+advanceBadly():
+Expecting TypeError exception from cursor.advance(0)
+PASS Exception was thrown.
+PASS cursor.advance(0) threw TypeError: Failed to execute 'advance' on 'IDBCursor': A count argument with value 0 (zero) was supplied, must be greater than 0.
+Expecting TypeError exception from cursor.advance(-1)
+PASS Exception was thrown.
+PASS cursor.advance(-1) threw TypeError: Value -1 is outside the range [0, 4294967295]
+Expecting TypeError exception from cursor.advance(0x100000000)
+PASS Exception was thrown.
+PASS cursor.advance(0x100000000) threw TypeError: Value 4294967296 is outside the range [0, 4294967295]
+Expecting TypeError exception from cursor.advance(0x20000000000000)
+PASS Exception was thrown.
+PASS cursor.advance(0x20000000000000) threw TypeError: Value 9007199254740992 is outside the range [0, 4294967295]
+
+testEdges():
+trans = db.transaction(objectStoreName, 'readonly')
+objectStore = trans.objectStore(objectStoreName)
+request = objectStore.openCursor()
+
+onSuccess():
+cursor = event.target.result
+PASS cursor is non-null.
+cursor.advance(0xffffffff)
+
+onSuccess():
+cursor = event.target.result
+PASS cursor is null
+testDelete()
+trans = db.transaction(objectStoreName, 'readwrite')
+objectStore = trans.objectStore(objectStoreName)
+request = objectStore.openCursor()
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7732\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Bob\&quot;,\&quot;height\&quot;:60,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7732\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7733\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ann\&quot;,\&quot;height\&quot;:52,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7733\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7734\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Ron\&quot;,\&quot;height\&quot;:73,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7734\&quot;}&quot;
+cursor.delete()
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7738\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Leo\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7738\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7739\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Jef\&quot;,\&quot;height\&quot;:65,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7739\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7740\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Sam\&quot;,\&quot;height\&quot;:71,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7740\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7741\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Bug\&quot;,\&quot;height\&quot;:63,\&quot;weight\&quot;:100},\&quot;primaryKey\&quot;:\&quot;237-23-7741\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7742\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Tub\&quot;,\&quot;height\&quot;:69,\&quot;weight\&quot;:180},\&quot;primaryKey\&quot;:\&quot;237-23-7742\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7743\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Rug\&quot;,\&quot;height\&quot;:77,\&quot;weight\&quot;:120},\&quot;primaryKey\&quot;:\&quot;237-23-7743\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS expected is &quot;{\&quot;key\&quot;:\&quot;237-23-7744\&quot;,\&quot;value\&quot;:{\&quot;name\&quot;:\&quot;Pug\&quot;,\&quot;height\&quot;:66,\&quot;weight\&quot;:110},\&quot;primaryKey\&quot;:\&quot;237-23-7744\&quot;}&quot;
+cursor.advance(1)
+
+deleteSecond():
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursoradvanceprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-advance-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-advance-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-advance-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-advance.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorbasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+Test the basics of IndexedDB's IDBCursor objects.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+store = db.createObjectStore('storeName')
+index = store.createIndex('indexName', 'indexOn')
+store.put({indexOn: 'a'}, 0)
+store.openCursor()
+index.openCursor()
+index.openKeyCursor()
+
+onStoreOpenCursor():
+cursor = event.target.result
+PASS cursor is non-null.
+PASS cursor instanceof IDBCursor is true
+PASS 'key' in cursor is true
+PASS 'primaryKey' in cursor is true
+PASS 'continue' in cursor is true
+PASS typeof cursor.continue is &quot;function&quot;
+FAIL 'continuePrimaryKey' in cursor should be true. Was false.
+FAIL typeof cursor.continuePrimaryKey should be function. Was undefined.
+PASS 'advance' in cursor is true
+PASS typeof cursor.advance is &quot;function&quot;
+PASS 'update' in cursor is true
+PASS typeof cursor.update is &quot;function&quot;
+PASS 'delete' in cursor is true
+PASS typeof cursor.delete is &quot;function&quot;
+PASS cursor.key is 0
+PASS cursor.primaryKey is 0
+PASS cursor instanceof IDBCursorWithValue is true
+PASS 'value' in cursor is true
+PASS JSON.stringify(cursor.value) is &quot;{\&quot;indexOn\&quot;:\&quot;a\&quot;}&quot;
+
+onIndexOpenCursor():
+cursor = event.target.result
+PASS cursor is non-null.
+PASS cursor instanceof IDBCursor is true
+PASS 'key' in cursor is true
+PASS 'primaryKey' in cursor is true
+PASS 'continue' in cursor is true
+PASS typeof cursor.continue is &quot;function&quot;
+FAIL 'continuePrimaryKey' in cursor should be true. Was false.
+FAIL typeof cursor.continuePrimaryKey should be function. Was undefined.
+PASS 'advance' in cursor is true
+PASS typeof cursor.advance is &quot;function&quot;
+PASS 'update' in cursor is true
+PASS typeof cursor.update is &quot;function&quot;
+PASS 'delete' in cursor is true
+PASS typeof cursor.delete is &quot;function&quot;
+PASS cursor.key is &quot;a&quot;
+PASS cursor.primaryKey is 0
+PASS cursor instanceof IDBCursorWithValue is true
+PASS 'value' in cursor is true
+PASS JSON.stringify(cursor.value) is &quot;{\&quot;indexOn\&quot;:\&quot;a\&quot;}&quot;
+
+onIndexOpenKeyCursor():
+cursor = event.target.result
+PASS cursor is non-null.
+PASS cursor instanceof IDBCursor is true
+PASS 'key' in cursor is true
+PASS 'primaryKey' in cursor is true
+PASS 'continue' in cursor is true
+PASS typeof cursor.continue is &quot;function&quot;
+FAIL 'continuePrimaryKey' in cursor should be true. Was false.
+FAIL typeof cursor.continuePrimaryKey should be function. Was undefined.
+PASS 'advance' in cursor is true
+PASS typeof cursor.advance is &quot;function&quot;
+PASS 'update' in cursor is true
+PASS typeof cursor.update is &quot;function&quot;
+PASS 'delete' in cursor is true
+PASS typeof cursor.delete is &quot;function&quot;
+PASS cursor.key is &quot;a&quot;
+PASS cursor.primaryKey is 0
+PASS cursor instanceof IDBCursorWithValue is false
+PASS cursor.primaryKey is 0
+PASS 'value' in cursor is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorbasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinuedirprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+Test that continue() calls against cursors are validated by direction.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+store.put(1,1)
+store.put(2,2)
+store.put(3,3)
+store.put(4,4)
+store.put(5,5)
+store.put(6,6)
+store.put(7,7)
+store.put(8,8)
+store.put(9,9)
+store.put(10,10)
+trans = db.transaction('store')
+store = trans.objectStore('store')
+request = store.openCursor(IDBKeyRange.bound(-Infinity, Infinity), 'next')
+cursor = request.result
+PASS cursor is non-null.
+Expect DataError if: The parameter is less than or equal to this cursor's position and this cursor's direction is &quot;next&quot; or &quot;nextunique&quot;.
+PASS cursor.key is 1
+Expecting exception from cursor.continue(-1)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is less than or equal to this cursor's position.
+request = store.openCursor(IDBKeyRange.bound(-Infinity, Infinity), 'prev')
+cursor = request.result
+PASS cursor is non-null.
+Expect DataError if: The parameter is greater than or equal to this cursor's position and this cursor's direction is &quot;prev&quot; or &quot;prevunique&quot;.
+PASS cursor.key is 10
+Expecting exception from cursor.continue(11)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is greater than or equal to this cursor's position.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinuedirprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-dir-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-continue-dir.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinueprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-continue-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,123 @@
</span><ins>+Test IndexedDB's IDBCursor.continue() with a key parameter.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('someObjectStore')
+objectStore.createIndex('someIndex', 'x')
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+
+indexObject.openKeyCursor(null, 'next')
+PASS event.target.result.primaryKey is 0
+event.target.result.continue(3.14159)
+PASS event.target.result.primaryKey is 3
+event.target.result.continue()
+PASS event.target.result.primaryKey is 4
+event.target.result.continue()
+PASS event.target.result.primaryKey is 5
+event.target.result.continue(12)
+PASS event.target.result.primaryKey is 7
+event.target.result.continue(date)
+PASS event.target.result.primaryKey is 9
+event.target.result.continue()
+PASS event.target.result.primaryKey is 10
+event.target.result.continue()
+PASS event.target.result.primaryKey is 11
+event.target.result.continue('A bit1')
+PASS event.target.result.primaryKey is 14
+event.target.result.continue('A bit3')
+PASS event.target.result.primaryKey is 16
+event.target.result.continue('the BIGGEST string')
+PASS event.target.result.primaryKey is 17
+event.target.result.continue()
+PASS event.target.result is null
+
+indexObject.openKeyCursor(null, 'prev')
+PASS event.target.result.primaryKey is 17
+event.target.result.continue('A bit2')
+PASS event.target.result.primaryKey is 15
+event.target.result.continue()
+PASS event.target.result.primaryKey is 14
+event.target.result.continue(date)
+PASS event.target.result.primaryKey is 10
+event.target.result.continue()
+PASS event.target.result.primaryKey is 9
+event.target.result.continue(1)
+PASS event.target.result.primaryKey is 2
+event.target.result.continue()
+PASS event.target.result.primaryKey is 1
+event.target.result.continue()
+PASS event.target.result.primaryKey is 0
+event.target.result.continue()
+PASS event.target.result is null
+
+indexObject.openKeyCursor(null, 'next')
+PASS event.target.result.primaryKey is 0
+event.target.result.continue(3.14159)
+PASS event.target.result.primaryKey is 3
+Expecting exception from event.target.result.continue(1)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is less than or equal to this cursor's position.
+
+indexObject.openKeyCursor(null, 'next')
+PASS event.target.result.primaryKey is 0
+event.target.result.continue(3.14159)
+PASS event.target.result.primaryKey is 3
+Expecting exception from event.target.result.continue(3.14159)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is less than or equal to this cursor's position.
+
+indexObject.openKeyCursor(null, 'prev')
+PASS event.target.result.primaryKey is 17
+event.target.result.continue('A bit2')
+PASS event.target.result.primaryKey is 15
+Expecting exception from event.target.result.continue('A bit3')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is greater than or equal to this cursor's position.
+
+indexObject.openKeyCursor(null, 'prev')
+PASS event.target.result.primaryKey is 17
+event.target.result.continue('A bit2')
+PASS event.target.result.primaryKey is 15
+cursor = event.target.result
+Expecting exception from event.target.result.continue('A bit2')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is greater than or equal to this cursor's position.
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The transaction is inactive or finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinueprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-continue-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-continue.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinuevalidityprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,939 @@
</span><ins>+Test IndexedDB's IDBCursor.continue() behavior when called beyond normal scope.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+trans = event.target.transaction
+PASS trans is non-null.
+db.createObjectStore('someObjectStore')
+objectStore.createIndex('someIndex', 'x')
+objectStore.add({'x': 0 }, 0)
+objectStore.add({'x': 1 }, 1)
+objectStore.add({'x': 2 }, 2)
+objectStore.add({'x': 3 }, 3)
+objectStore.add({'x': 4 }, 4)
+objectStore.add({'x': 5 }, 5)
+objectStore.add({'x': 6 }, 6)
+objectStore.add({'x': 7 }, 7)
+objectStore.add({'x': 8 }, 8)
+objectStore.add({'x': 9 }, 9)
+objectStore.add({'x': 10 }, 10)
+objectStore.add({'x': 11 }, 11)
+objectStore.add({'x': 12 }, 12)
+objectStore.add({'x': 13 }, 13)
+objectStore.add({'x': 14 }, 14)
+objectStore.add({'x': 15 }, 15)
+objectStore.add({'x': 16 }, 16)
+objectStore.add({'x': 17 }, 17)
+objectStore.add({'x': 18 }, 18)
+objectStore.add({'x': 19 }, 19)
+objectStore.add({'x': 20 }, 20)
+objectStore.add({'x': 21 }, 21)
+objectStore.add({'x': 22 }, 22)
+objectStore.add({'x': 23 }, 23)
+objectStore.add({'x': 24 }, 24)
+continueTest()
+
+Checking objectStore
+====================
+indexObject.openCursor(null, 'next')
+self.continueValue = 0
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 0
+PASS cursor.key is 0
+PASS cursor.value.x is 0
+cursor.continue()
+PASS cursor.key is 0
+PASS cursor.value.x is 0
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 0
+PASS cursor.value.x is 0
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 1
+PASS cursor.key is 1
+PASS cursor.value.x is 1
+cursor.continue()
+PASS cursor.key is 1
+PASS cursor.value.x is 1
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 1
+PASS cursor.value.x is 1
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 2
+PASS cursor.key is 2
+PASS cursor.value.x is 2
+cursor.continue()
+PASS cursor.key is 2
+PASS cursor.value.x is 2
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 2
+PASS cursor.value.x is 2
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 3
+PASS cursor.key is 3
+PASS cursor.value.x is 3
+cursor.continue()
+PASS cursor.key is 3
+PASS cursor.value.x is 3
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 3
+PASS cursor.value.x is 3
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 4
+PASS cursor.key is 4
+PASS cursor.value.x is 4
+cursor.continue()
+PASS cursor.key is 4
+PASS cursor.value.x is 4
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 4
+PASS cursor.value.x is 4
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 5
+PASS cursor.key is 5
+PASS cursor.value.x is 5
+cursor.continue()
+PASS cursor.key is 5
+PASS cursor.value.x is 5
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 5
+PASS cursor.value.x is 5
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 6
+PASS cursor.key is 6
+PASS cursor.value.x is 6
+cursor.continue()
+PASS cursor.key is 6
+PASS cursor.value.x is 6
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 6
+PASS cursor.value.x is 6
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 7
+PASS cursor.key is 7
+PASS cursor.value.x is 7
+cursor.continue()
+PASS cursor.key is 7
+PASS cursor.value.x is 7
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 7
+PASS cursor.value.x is 7
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 8
+PASS cursor.key is 8
+PASS cursor.value.x is 8
+cursor.continue()
+PASS cursor.key is 8
+PASS cursor.value.x is 8
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 8
+PASS cursor.value.x is 8
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 9
+PASS cursor.key is 9
+PASS cursor.value.x is 9
+cursor.continue()
+PASS cursor.key is 9
+PASS cursor.value.x is 9
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 9
+PASS cursor.value.x is 9
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 10
+PASS cursor.key is 10
+PASS cursor.value.x is 10
+cursor.continue()
+PASS cursor.key is 10
+PASS cursor.value.x is 10
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 10
+PASS cursor.value.x is 10
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 11
+PASS cursor.key is 11
+PASS cursor.value.x is 11
+cursor.continue()
+PASS cursor.key is 11
+PASS cursor.value.x is 11
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 11
+PASS cursor.value.x is 11
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 12
+PASS cursor.key is 12
+PASS cursor.value.x is 12
+cursor.continue()
+PASS cursor.key is 12
+PASS cursor.value.x is 12
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 12
+PASS cursor.value.x is 12
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 13
+PASS cursor.key is 13
+PASS cursor.value.x is 13
+cursor.continue()
+PASS cursor.key is 13
+PASS cursor.value.x is 13
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 13
+PASS cursor.value.x is 13
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 14
+PASS cursor.key is 14
+PASS cursor.value.x is 14
+cursor.continue()
+PASS cursor.key is 14
+PASS cursor.value.x is 14
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 14
+PASS cursor.value.x is 14
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 15
+PASS cursor.key is 15
+PASS cursor.value.x is 15
+cursor.continue()
+PASS cursor.key is 15
+PASS cursor.value.x is 15
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 15
+PASS cursor.value.x is 15
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 16
+PASS cursor.key is 16
+PASS cursor.value.x is 16
+cursor.continue()
+PASS cursor.key is 16
+PASS cursor.value.x is 16
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 16
+PASS cursor.value.x is 16
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 17
+PASS cursor.key is 17
+PASS cursor.value.x is 17
+cursor.continue()
+PASS cursor.key is 17
+PASS cursor.value.x is 17
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 17
+PASS cursor.value.x is 17
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 18
+PASS cursor.key is 18
+PASS cursor.value.x is 18
+cursor.continue()
+PASS cursor.key is 18
+PASS cursor.value.x is 18
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 18
+PASS cursor.value.x is 18
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 19
+PASS cursor.key is 19
+PASS cursor.value.x is 19
+cursor.continue()
+PASS cursor.key is 19
+PASS cursor.value.x is 19
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 19
+PASS cursor.value.x is 19
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 20
+PASS cursor.key is 20
+PASS cursor.value.x is 20
+cursor.continue()
+PASS cursor.key is 20
+PASS cursor.value.x is 20
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 20
+PASS cursor.value.x is 20
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 21
+PASS cursor.key is 21
+PASS cursor.value.x is 21
+cursor.continue()
+PASS cursor.key is 21
+PASS cursor.value.x is 21
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 21
+PASS cursor.value.x is 21
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 22
+PASS cursor.key is 22
+PASS cursor.value.x is 22
+cursor.continue()
+PASS cursor.key is 22
+PASS cursor.value.x is 22
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 22
+PASS cursor.value.x is 22
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 23
+PASS cursor.key is 23
+PASS cursor.value.x is 23
+cursor.continue()
+PASS cursor.key is 23
+PASS cursor.value.x is 23
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 23
+PASS cursor.value.x is 23
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+Checking value at 24
+PASS cursor.key is 24
+PASS cursor.value.x is 24
+cursor.continue()
+PASS cursor.key is 24
+PASS cursor.value.x is 24
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 24
+PASS cursor.value.x is 24
+self.continueValue++;
+doubleContinueCallback()
+cursor = event.target.result
+continueIndexTest()
+
+Checking index
+==============
+indexObject.openCursor(null, 'next')
+self.continueValue = 0
+cursor = event.target.result
+Checking value at 0
+PASS cursor.key is 0
+PASS cursor.value.x is 0
+cursor.continue()
+PASS cursor.key is 0
+PASS cursor.value.x is 0
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 0
+PASS cursor.value.x is 0
+self.continueValue++;
+cursor = event.target.result
+Checking value at 1
+PASS cursor.key is 1
+PASS cursor.value.x is 1
+cursor.continue()
+PASS cursor.key is 1
+PASS cursor.value.x is 1
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 1
+PASS cursor.value.x is 1
+self.continueValue++;
+cursor = event.target.result
+Checking value at 2
+PASS cursor.key is 2
+PASS cursor.value.x is 2
+cursor.continue()
+PASS cursor.key is 2
+PASS cursor.value.x is 2
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 2
+PASS cursor.value.x is 2
+self.continueValue++;
+cursor = event.target.result
+Checking value at 3
+PASS cursor.key is 3
+PASS cursor.value.x is 3
+cursor.continue()
+PASS cursor.key is 3
+PASS cursor.value.x is 3
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 3
+PASS cursor.value.x is 3
+self.continueValue++;
+cursor = event.target.result
+Checking value at 4
+PASS cursor.key is 4
+PASS cursor.value.x is 4
+cursor.continue()
+PASS cursor.key is 4
+PASS cursor.value.x is 4
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 4
+PASS cursor.value.x is 4
+self.continueValue++;
+cursor = event.target.result
+Checking value at 5
+PASS cursor.key is 5
+PASS cursor.value.x is 5
+cursor.continue()
+PASS cursor.key is 5
+PASS cursor.value.x is 5
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 5
+PASS cursor.value.x is 5
+self.continueValue++;
+cursor = event.target.result
+Checking value at 6
+PASS cursor.key is 6
+PASS cursor.value.x is 6
+cursor.continue()
+PASS cursor.key is 6
+PASS cursor.value.x is 6
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 6
+PASS cursor.value.x is 6
+self.continueValue++;
+cursor = event.target.result
+Checking value at 7
+PASS cursor.key is 7
+PASS cursor.value.x is 7
+cursor.continue()
+PASS cursor.key is 7
+PASS cursor.value.x is 7
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 7
+PASS cursor.value.x is 7
+self.continueValue++;
+cursor = event.target.result
+Checking value at 8
+PASS cursor.key is 8
+PASS cursor.value.x is 8
+cursor.continue()
+PASS cursor.key is 8
+PASS cursor.value.x is 8
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 8
+PASS cursor.value.x is 8
+self.continueValue++;
+cursor = event.target.result
+Checking value at 9
+PASS cursor.key is 9
+PASS cursor.value.x is 9
+cursor.continue()
+PASS cursor.key is 9
+PASS cursor.value.x is 9
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 9
+PASS cursor.value.x is 9
+self.continueValue++;
+cursor = event.target.result
+Checking value at 10
+PASS cursor.key is 10
+PASS cursor.value.x is 10
+cursor.continue()
+PASS cursor.key is 10
+PASS cursor.value.x is 10
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 10
+PASS cursor.value.x is 10
+self.continueValue++;
+cursor = event.target.result
+Checking value at 11
+PASS cursor.key is 11
+PASS cursor.value.x is 11
+cursor.continue()
+PASS cursor.key is 11
+PASS cursor.value.x is 11
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 11
+PASS cursor.value.x is 11
+self.continueValue++;
+cursor = event.target.result
+Checking value at 12
+PASS cursor.key is 12
+PASS cursor.value.x is 12
+cursor.continue()
+PASS cursor.key is 12
+PASS cursor.value.x is 12
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 12
+PASS cursor.value.x is 12
+self.continueValue++;
+cursor = event.target.result
+Checking value at 13
+PASS cursor.key is 13
+PASS cursor.value.x is 13
+cursor.continue()
+PASS cursor.key is 13
+PASS cursor.value.x is 13
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 13
+PASS cursor.value.x is 13
+self.continueValue++;
+cursor = event.target.result
+Checking value at 14
+PASS cursor.key is 14
+PASS cursor.value.x is 14
+cursor.continue()
+PASS cursor.key is 14
+PASS cursor.value.x is 14
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 14
+PASS cursor.value.x is 14
+self.continueValue++;
+cursor = event.target.result
+Checking value at 15
+PASS cursor.key is 15
+PASS cursor.value.x is 15
+cursor.continue()
+PASS cursor.key is 15
+PASS cursor.value.x is 15
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 15
+PASS cursor.value.x is 15
+self.continueValue++;
+cursor = event.target.result
+Checking value at 16
+PASS cursor.key is 16
+PASS cursor.value.x is 16
+cursor.continue()
+PASS cursor.key is 16
+PASS cursor.value.x is 16
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 16
+PASS cursor.value.x is 16
+self.continueValue++;
+cursor = event.target.result
+Checking value at 17
+PASS cursor.key is 17
+PASS cursor.value.x is 17
+cursor.continue()
+PASS cursor.key is 17
+PASS cursor.value.x is 17
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 17
+PASS cursor.value.x is 17
+self.continueValue++;
+cursor = event.target.result
+Checking value at 18
+PASS cursor.key is 18
+PASS cursor.value.x is 18
+cursor.continue()
+PASS cursor.key is 18
+PASS cursor.value.x is 18
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 18
+PASS cursor.value.x is 18
+self.continueValue++;
+cursor = event.target.result
+Checking value at 19
+PASS cursor.key is 19
+PASS cursor.value.x is 19
+cursor.continue()
+PASS cursor.key is 19
+PASS cursor.value.x is 19
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 19
+PASS cursor.value.x is 19
+self.continueValue++;
+cursor = event.target.result
+Checking value at 20
+PASS cursor.key is 20
+PASS cursor.value.x is 20
+cursor.continue()
+PASS cursor.key is 20
+PASS cursor.value.x is 20
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 20
+PASS cursor.value.x is 20
+self.continueValue++;
+cursor = event.target.result
+Checking value at 21
+PASS cursor.key is 21
+PASS cursor.value.x is 21
+cursor.continue()
+PASS cursor.key is 21
+PASS cursor.value.x is 21
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 21
+PASS cursor.value.x is 21
+self.continueValue++;
+cursor = event.target.result
+Checking value at 22
+PASS cursor.key is 22
+PASS cursor.value.x is 22
+cursor.continue()
+PASS cursor.key is 22
+PASS cursor.value.x is 22
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 22
+PASS cursor.value.x is 22
+self.continueValue++;
+cursor = event.target.result
+Checking value at 23
+PASS cursor.key is 23
+PASS cursor.value.x is 23
+cursor.continue()
+PASS cursor.key is 23
+PASS cursor.value.x is 23
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 23
+PASS cursor.value.x is 23
+self.continueValue++;
+cursor = event.target.result
+Checking value at 24
+PASS cursor.key is 24
+PASS cursor.value.x is 24
+cursor.continue()
+PASS cursor.key is 24
+PASS cursor.value.x is 24
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+PASS cursor.key is 24
+PASS cursor.value.x is 24
+self.continueValue++;
+cursor = event.target.result
+testModifyContinueOrder()
+
+Checking modification
+=====================
+indexObject.openCursor(null, 'next')
+self.continueValue = 0
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+Expecting exception from cursor.update({ x: 100 + self.continueValue})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+Expecting exception from cursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+Expecting exception from cursor.update({ x: 100 + self.continueValue})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+Expecting exception from cursor.update({ x: 100 + self.continueValue})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.delete()
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+cursor = event.target.result
+cursor.update({ x: 100 + self.continueValue })
+cursor.continue()
+cursor = event.target.result
+cursor.continue()
+Expecting exception from cursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+cursor = event.target.result
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinuevalidityprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-continue-validity.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursordeleteprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-delete-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-delete-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-delete-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+Test IndexedDB's openCursor.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+setVersionSuccess():
+trans = event.target.result
+PASS trans is non-null.
+objectStore = db.createObjectStore('test')
+objectStore.add('myValue1', 'myKey1')
+objectStore.add('myValue2', 'myKey2')
+objectStore.add('myValue3', 'myKey3')
+objectStore.add('myValue4', 'myKey4')
+openCursor1
+trans = db.transaction(['test'], 'readwrite')
+trans.objectStore('test').openCursor(keyRange)
+event.target.result.delete()
+PASS event.target.result.value is &quot;myValue1&quot;
+event.target.result.continue()
+event.target.result.delete()
+PASS event.target.result.value is &quot;myValue2&quot;
+event.target.result.continue()
+event.target.result.delete()
+PASS event.target.result.value is &quot;myValue3&quot;
+event.target.result.continue()
+event.target.result.delete()
+PASS event.target.result.value is &quot;myValue4&quot;
+event.target.result.continue()
+PASS counter is 5
+trans.objectStore('test').openCursor(keyRange)
+PASS event.target.result is null
+trans = db.transaction(['test'], 'readwrite')
+objectStore = trans.objectStore('test')
+objectStore.add('myValue1', 'myKey1')
+openCursor2
+objectStore.openCursor(keyRange)
+PASS [object IDBCursorWithValue] is non-null.
+event.target.result.delete()
+objectStore.get('myKey1')
+PASS event.target.result is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursordeleteprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-delete-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-delete-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-delete-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-delete.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorfinishedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-finished-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-finished-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-finished-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+Ensure cursor calls behave as expected after cursor has run to the end.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+
+prepareDatabase():
+indexedDB.deleteDatabase(dbname)
+
+onDeleteSuccess():
+indexedDB.open(dbname, 1)
+
+onUpgradeNeeded():
+db = event.target.result
+store = db.createObjectStore('store')
+store.put(1, 1)
+store.put(2, 2)
+
+onOpenSuccess():
+db = event.target.result
+transaction = db.transaction('store', 'readwrite')
+store = transaction.objectStore('store')
+count = 0
+cursorRequest = store.openCursor()
+
+onCursorSuccess():
+cursor = event.target.result
+PASS cursor is non-null.
+count++
+savedCursor = cursor
+cursor.continue()
+
+onCursorSuccess():
+cursor = event.target.result
+PASS cursor is non-null.
+count++
+savedCursor = cursor
+cursor.continue()
+
+onCursorSuccess():
+cursor = event.target.result
+PASS cursor is null
+PASS savedCursor is non-null.
+
+Expecting exception from savedCursor.update('value')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+Expecting exception from savedCursor.advance(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'advance' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+Expecting exception from savedCursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+Expecting exception from savedCursor.continue('key')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+Expecting exception from savedCursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorfinishedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-finished-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-finished-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-finished-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-finished.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorinconsistencyprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+Test consistency of IndexedDB's cursor objects.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+setVersionSuccess():
+trans = event.target.transaction
+PASS trans is non-null.
+objectStore = db.createObjectStore('basicStore')
+objectStore.add('someValue1', 'someKey1').onerror = unexpectedErrorCallback
+objectStore.add('someValue2', 'someKey2').onerror = unexpectedErrorCallback
+objectStore.add('someValue3', 'someKey3').onerror = unexpectedErrorCallback
+objectStore.add('someValue4', 'someKey4').onerror = unexpectedErrorCallback
+openBasicCursor()
+trans = db.transaction(['basicStore'], 'readwrite')
+trans.objectStore('basicStore')
+objectStore.openCursor(keyRange)
+
+checkCursor()
+storedCursor = event.target.result
+PASS storedCursor is event.target.result
+PASS storedCursor.key is &quot;someKey1&quot;
+PASS event.target.result.key is &quot;someKey1&quot;
+PASS storedCursor.value is &quot;someValue1&quot;
+PASS event.target.result.value is &quot;someValue1&quot;
+event.target.result.continue()
+
+checkCursor()
+PASS storedCursor is event.target.result
+PASS storedCursor.key is &quot;someKey2&quot;
+PASS event.target.result.key is &quot;someKey2&quot;
+PASS storedCursor.value is &quot;someValue2&quot;
+PASS event.target.result.value is &quot;someValue2&quot;
+event.target.result.continue()
+
+checkCursor()
+PASS storedCursor is event.target.result
+PASS storedCursor.key is &quot;someKey3&quot;
+PASS event.target.result.key is &quot;someKey3&quot;
+PASS storedCursor.value is &quot;someValue3&quot;
+PASS event.target.result.value is &quot;someValue3&quot;
+event.target.result.continue()
+
+checkCursor()
+PASS storedCursor is event.target.result
+PASS storedCursor.key is &quot;someKey4&quot;
+PASS event.target.result.key is &quot;someKey4&quot;
+PASS storedCursor.value is &quot;someValue4&quot;
+PASS event.target.result.value is &quot;someValue4&quot;
+event.target.result.continue()
+
+checkCursor()
+PASS counter is 5
+transactionComplete()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorinconsistencyprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-inconsistency-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-inconsistency.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorindexdeleteprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+Test IndexedDB's openCursor.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+trans = event.target.transaction
+PASS trans is non-null.
+objectStore = db.createObjectStore('test')
+objectStore.createIndex('testIndex', 'x')
+objectStore.add({x: 1}, 'myKey1')
+objectStore.add({x: 2}, 'myKey2')
+objectStore.add({x: 3}, 'myKey3')
+objectStore.add({x: 4}, 'myKey4')
+openCursor1
+trans = db.transaction(['test'], 'readwrite')
+trans.objectStore('test').index('testIndex').openCursor(keyRange)
+event.target.result.delete()
+PASS event.target.result.key is counter++
+event.target.result.continue()
+event.target.result.delete()
+PASS event.target.result.key is counter++
+event.target.result.continue()
+event.target.result.delete()
+PASS event.target.result.key is counter++
+event.target.result.continue()
+event.target.result.delete()
+PASS event.target.result.key is counter++
+event.target.result.continue()
+PASS counter is 5
+trans.objectStore('test').index('testIndex').openCursor(keyRange)
+PASS event.target.result is null
+trans = db.transaction(['test'], 'readwrite')
+objectStore = trans.objectStore('test')
+objectStore.add({x: 1}, 'myKey1')
+openCursor2
+index = event.target.source.index('testIndex')
+index.openCursor(keyRange)
+PASS [object IDBCursorWithValue] is non-null.
+event.target.result.delete()
+index.get(1)
+PASS event.target.result is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorindexdeleteprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-index-delete-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-index-delete.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorkeyorderprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-key-order-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-key-order-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-key-order-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,902 @@
</span><ins>+Test IndexedDB keys ordering and readback from cursors.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store')
+
+populating store...
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store');
+store.put(0, -Infinity)
+store.put(1, -Number.MAX_VALUE)
+store.put(2, -1)
+store.put(3, -Number.MIN_VALUE)
+store.put(4, 0)
+store.put(5, Number.MIN_VALUE)
+store.put(6, 1)
+store.put(7, Number.MAX_VALUE)
+store.put(8, Infinity)
+store.put(9, new Date(0))
+store.put(10, new Date(1000))
+store.put(11, new Date(1317399931023))
+store.put(12, '')
+store.put(13, '')
+store.put(14, 'a')
+store.put(15, 'aa')
+store.put(16, 'b')
+store.put(17, 'ba')
+store.put(18, '¢')
+store.put(19, '水')
+store.put(20, '𝄞')
+store.put(21, '�')
+store.put(22, [])
+store.put(23, [-Infinity])
+store.put(24, [-Number.MAX_VALUE])
+store.put(25, [-1])
+store.put(26, [-Number.MIN_VALUE])
+store.put(27, [0])
+store.put(28, [Number.MIN_VALUE])
+store.put(29, [1])
+store.put(30, [Number.MAX_VALUE])
+store.put(31, [Infinity])
+store.put(32, [new Date(0)])
+store.put(33, [new Date(1000)])
+store.put(34, [new Date(1317399931023)])
+store.put(35, [''])
+store.put(36, [''])
+store.put(37, ['a'])
+store.put(38, ['aa'])
+store.put(39, ['b'])
+store.put(40, ['ba'])
+store.put(41, ['¢'])
+store.put(42, ['水'])
+store.put(43, ['𝄞'])
+store.put(44, ['�'])
+store.put(45, [[]])
+store.put(46, [[], []])
+store.put(47, [[], [], []])
+store.put(48, [[[]]])
+store.put(49, [[[[]]]])
+
+iterating cursor...
+trans = db.transaction('store', 'readonly')
+store = trans.objectStore('store');
+count = 0
+curreq = store.openCursor()
+cursor = curreq.result
+PASS compare(cursor.key, -Infinity) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, -Number.MAX_VALUE) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, -1) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, -Number.MIN_VALUE) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, 0) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, Number.MIN_VALUE) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, 1) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, Number.MAX_VALUE) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, Infinity) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, new Date(0)) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, new Date(1000)) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, new Date(1317399931023)) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, '') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, '\0') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, 'a') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, 'aa') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, 'b') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, 'ba') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, '¢') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, '水') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, '𝄞') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, '�') is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, []) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [-Infinity]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [-Number.MAX_VALUE]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [-1]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [-Number.MIN_VALUE]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [0]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [Number.MIN_VALUE]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [1]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [Number.MAX_VALUE]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [Infinity]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [new Date(0)]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [new Date(1000)]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [new Date(1317399931023)]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['\0']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['a']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['aa']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['b']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['ba']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['¢']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['水']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['𝄞']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, ['�']) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [[]]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [[], []]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [[], [], []]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [[[]]]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+cursor = curreq.result
+PASS compare(cursor.key, [[[[]]]]) is true
+getreq = store.get(cursor.key)
+PASS getreq.result is count++
+PASS count is keys.length
+
+validate compare function
+PASS compare(undefined, undefined) is true
+PASS compare(undefined, true) is false
+PASS compare(undefined, false) is false
+PASS compare(undefined, 0) is false
+PASS compare(undefined, -0) is false
+PASS compare(undefined, 123) is false
+PASS compare(undefined, Infinity) is false
+PASS compare(undefined, -Infinity) is false
+PASS compare(undefined, NaN) is false
+PASS compare(undefined, '') is false
+PASS compare(undefined, 'abc') is false
+PASS compare(undefined, 'xyz') is false
+PASS compare(undefined, new Date(0)) is false
+PASS compare(undefined, new Date(1e3)) is false
+PASS compare(undefined, new Date(1e9)) is false
+PASS compare(undefined, []) is false
+PASS compare(undefined, [123]) is false
+PASS compare(undefined, ['abc']) is false
+PASS compare(undefined, [123, 'abc']) is false
+PASS compare(undefined, ['abc', 123]) is false
+PASS compare(undefined, [[]]) is false
+PASS compare(undefined, [[123]]) is false
+PASS compare(undefined, [['abc']]) is false
+PASS compare(undefined, [[123], 'abc']) is false
+PASS compare(undefined, [[123], 123]) is false
+PASS compare(true, undefined) is false
+PASS compare(true, true) is true
+PASS compare(true, false) is false
+PASS compare(true, 0) is false
+PASS compare(true, -0) is false
+PASS compare(true, 123) is false
+PASS compare(true, Infinity) is false
+PASS compare(true, -Infinity) is false
+PASS compare(true, NaN) is false
+PASS compare(true, '') is false
+PASS compare(true, 'abc') is false
+PASS compare(true, 'xyz') is false
+PASS compare(true, new Date(0)) is false
+PASS compare(true, new Date(1e3)) is false
+PASS compare(true, new Date(1e9)) is false
+PASS compare(true, []) is false
+PASS compare(true, [123]) is false
+PASS compare(true, ['abc']) is false
+PASS compare(true, [123, 'abc']) is false
+PASS compare(true, ['abc', 123]) is false
+PASS compare(true, [[]]) is false
+PASS compare(true, [[123]]) is false
+PASS compare(true, [['abc']]) is false
+PASS compare(true, [[123], 'abc']) is false
+PASS compare(true, [[123], 123]) is false
+PASS compare(false, undefined) is false
+PASS compare(false, true) is false
+PASS compare(false, false) is true
+PASS compare(false, 0) is false
+PASS compare(false, -0) is false
+PASS compare(false, 123) is false
+PASS compare(false, Infinity) is false
+PASS compare(false, -Infinity) is false
+PASS compare(false, NaN) is false
+PASS compare(false, '') is false
+PASS compare(false, 'abc') is false
+PASS compare(false, 'xyz') is false
+PASS compare(false, new Date(0)) is false
+PASS compare(false, new Date(1e3)) is false
+PASS compare(false, new Date(1e9)) is false
+PASS compare(false, []) is false
+PASS compare(false, [123]) is false
+PASS compare(false, ['abc']) is false
+PASS compare(false, [123, 'abc']) is false
+PASS compare(false, ['abc', 123]) is false
+PASS compare(false, [[]]) is false
+PASS compare(false, [[123]]) is false
+PASS compare(false, [['abc']]) is false
+PASS compare(false, [[123], 'abc']) is false
+PASS compare(false, [[123], 123]) is false
+PASS compare(0, undefined) is false
+PASS compare(0, true) is false
+PASS compare(0, false) is false
+PASS compare(0, 0) is true
+PASS compare(0, -0) is false
+PASS compare(0, 123) is false
+PASS compare(0, Infinity) is false
+PASS compare(0, -Infinity) is false
+PASS compare(0, NaN) is false
+PASS compare(0, '') is false
+PASS compare(0, 'abc') is false
+PASS compare(0, 'xyz') is false
+PASS compare(0, new Date(0)) is false
+PASS compare(0, new Date(1e3)) is false
+PASS compare(0, new Date(1e9)) is false
+PASS compare(0, []) is false
+PASS compare(0, [123]) is false
+PASS compare(0, ['abc']) is false
+PASS compare(0, [123, 'abc']) is false
+PASS compare(0, ['abc', 123]) is false
+PASS compare(0, [[]]) is false
+PASS compare(0, [[123]]) is false
+PASS compare(0, [['abc']]) is false
+PASS compare(0, [[123], 'abc']) is false
+PASS compare(0, [[123], 123]) is false
+PASS compare(-0, undefined) is false
+PASS compare(-0, true) is false
+PASS compare(-0, false) is false
+PASS compare(-0, 0) is false
+PASS compare(-0, -0) is true
+PASS compare(-0, 123) is false
+PASS compare(-0, Infinity) is false
+PASS compare(-0, -Infinity) is false
+PASS compare(-0, NaN) is false
+PASS compare(-0, '') is false
+PASS compare(-0, 'abc') is false
+PASS compare(-0, 'xyz') is false
+PASS compare(-0, new Date(0)) is false
+PASS compare(-0, new Date(1e3)) is false
+PASS compare(-0, new Date(1e9)) is false
+PASS compare(-0, []) is false
+PASS compare(-0, [123]) is false
+PASS compare(-0, ['abc']) is false
+PASS compare(-0, [123, 'abc']) is false
+PASS compare(-0, ['abc', 123]) is false
+PASS compare(-0, [[]]) is false
+PASS compare(-0, [[123]]) is false
+PASS compare(-0, [['abc']]) is false
+PASS compare(-0, [[123], 'abc']) is false
+PASS compare(-0, [[123], 123]) is false
+PASS compare(123, undefined) is false
+PASS compare(123, true) is false
+PASS compare(123, false) is false
+PASS compare(123, 0) is false
+PASS compare(123, -0) is false
+PASS compare(123, 123) is true
+PASS compare(123, Infinity) is false
+PASS compare(123, -Infinity) is false
+PASS compare(123, NaN) is false
+PASS compare(123, '') is false
+PASS compare(123, 'abc') is false
+PASS compare(123, 'xyz') is false
+PASS compare(123, new Date(0)) is false
+PASS compare(123, new Date(1e3)) is false
+PASS compare(123, new Date(1e9)) is false
+PASS compare(123, []) is false
+PASS compare(123, [123]) is false
+PASS compare(123, ['abc']) is false
+PASS compare(123, [123, 'abc']) is false
+PASS compare(123, ['abc', 123]) is false
+PASS compare(123, [[]]) is false
+PASS compare(123, [[123]]) is false
+PASS compare(123, [['abc']]) is false
+PASS compare(123, [[123], 'abc']) is false
+PASS compare(123, [[123], 123]) is false
+PASS compare(Infinity, undefined) is false
+PASS compare(Infinity, true) is false
+PASS compare(Infinity, false) is false
+PASS compare(Infinity, 0) is false
+PASS compare(Infinity, -0) is false
+PASS compare(Infinity, 123) is false
+PASS compare(Infinity, Infinity) is true
+PASS compare(Infinity, -Infinity) is false
+PASS compare(Infinity, NaN) is false
+PASS compare(Infinity, '') is false
+PASS compare(Infinity, 'abc') is false
+PASS compare(Infinity, 'xyz') is false
+PASS compare(Infinity, new Date(0)) is false
+PASS compare(Infinity, new Date(1e3)) is false
+PASS compare(Infinity, new Date(1e9)) is false
+PASS compare(Infinity, []) is false
+PASS compare(Infinity, [123]) is false
+PASS compare(Infinity, ['abc']) is false
+PASS compare(Infinity, [123, 'abc']) is false
+PASS compare(Infinity, ['abc', 123]) is false
+PASS compare(Infinity, [[]]) is false
+PASS compare(Infinity, [[123]]) is false
+PASS compare(Infinity, [['abc']]) is false
+PASS compare(Infinity, [[123], 'abc']) is false
+PASS compare(Infinity, [[123], 123]) is false
+PASS compare(-Infinity, undefined) is false
+PASS compare(-Infinity, true) is false
+PASS compare(-Infinity, false) is false
+PASS compare(-Infinity, 0) is false
+PASS compare(-Infinity, -0) is false
+PASS compare(-Infinity, 123) is false
+PASS compare(-Infinity, Infinity) is false
+PASS compare(-Infinity, -Infinity) is true
+PASS compare(-Infinity, NaN) is false
+PASS compare(-Infinity, '') is false
+PASS compare(-Infinity, 'abc') is false
+PASS compare(-Infinity, 'xyz') is false
+PASS compare(-Infinity, new Date(0)) is false
+PASS compare(-Infinity, new Date(1e3)) is false
+PASS compare(-Infinity, new Date(1e9)) is false
+PASS compare(-Infinity, []) is false
+PASS compare(-Infinity, [123]) is false
+PASS compare(-Infinity, ['abc']) is false
+PASS compare(-Infinity, [123, 'abc']) is false
+PASS compare(-Infinity, ['abc', 123]) is false
+PASS compare(-Infinity, [[]]) is false
+PASS compare(-Infinity, [[123]]) is false
+PASS compare(-Infinity, [['abc']]) is false
+PASS compare(-Infinity, [[123], 'abc']) is false
+PASS compare(-Infinity, [[123], 123]) is false
+PASS compare(NaN, undefined) is false
+PASS compare(NaN, true) is false
+PASS compare(NaN, false) is false
+PASS compare(NaN, 0) is false
+PASS compare(NaN, -0) is false
+PASS compare(NaN, 123) is false
+PASS compare(NaN, Infinity) is false
+PASS compare(NaN, -Infinity) is false
+PASS compare(NaN, NaN) is true
+PASS compare(NaN, '') is false
+PASS compare(NaN, 'abc') is false
+PASS compare(NaN, 'xyz') is false
+PASS compare(NaN, new Date(0)) is false
+PASS compare(NaN, new Date(1e3)) is false
+PASS compare(NaN, new Date(1e9)) is false
+PASS compare(NaN, []) is false
+PASS compare(NaN, [123]) is false
+PASS compare(NaN, ['abc']) is false
+PASS compare(NaN, [123, 'abc']) is false
+PASS compare(NaN, ['abc', 123]) is false
+PASS compare(NaN, [[]]) is false
+PASS compare(NaN, [[123]]) is false
+PASS compare(NaN, [['abc']]) is false
+PASS compare(NaN, [[123], 'abc']) is false
+PASS compare(NaN, [[123], 123]) is false
+PASS compare('', undefined) is false
+PASS compare('', true) is false
+PASS compare('', false) is false
+PASS compare('', 0) is false
+PASS compare('', -0) is false
+PASS compare('', 123) is false
+PASS compare('', Infinity) is false
+PASS compare('', -Infinity) is false
+PASS compare('', NaN) is false
+PASS compare('', '') is true
+PASS compare('', 'abc') is false
+PASS compare('', 'xyz') is false
+PASS compare('', new Date(0)) is false
+PASS compare('', new Date(1e3)) is false
+PASS compare('', new Date(1e9)) is false
+PASS compare('', []) is false
+PASS compare('', [123]) is false
+PASS compare('', ['abc']) is false
+PASS compare('', [123, 'abc']) is false
+PASS compare('', ['abc', 123]) is false
+PASS compare('', [[]]) is false
+PASS compare('', [[123]]) is false
+PASS compare('', [['abc']]) is false
+PASS compare('', [[123], 'abc']) is false
+PASS compare('', [[123], 123]) is false
+PASS compare('abc', undefined) is false
+PASS compare('abc', true) is false
+PASS compare('abc', false) is false
+PASS compare('abc', 0) is false
+PASS compare('abc', -0) is false
+PASS compare('abc', 123) is false
+PASS compare('abc', Infinity) is false
+PASS compare('abc', -Infinity) is false
+PASS compare('abc', NaN) is false
+PASS compare('abc', '') is false
+PASS compare('abc', 'abc') is true
+PASS compare('abc', 'xyz') is false
+PASS compare('abc', new Date(0)) is false
+PASS compare('abc', new Date(1e3)) is false
+PASS compare('abc', new Date(1e9)) is false
+PASS compare('abc', []) is false
+PASS compare('abc', [123]) is false
+PASS compare('abc', ['abc']) is false
+PASS compare('abc', [123, 'abc']) is false
+PASS compare('abc', ['abc', 123]) is false
+PASS compare('abc', [[]]) is false
+PASS compare('abc', [[123]]) is false
+PASS compare('abc', [['abc']]) is false
+PASS compare('abc', [[123], 'abc']) is false
+PASS compare('abc', [[123], 123]) is false
+PASS compare('xyz', undefined) is false
+PASS compare('xyz', true) is false
+PASS compare('xyz', false) is false
+PASS compare('xyz', 0) is false
+PASS compare('xyz', -0) is false
+PASS compare('xyz', 123) is false
+PASS compare('xyz', Infinity) is false
+PASS compare('xyz', -Infinity) is false
+PASS compare('xyz', NaN) is false
+PASS compare('xyz', '') is false
+PASS compare('xyz', 'abc') is false
+PASS compare('xyz', 'xyz') is true
+PASS compare('xyz', new Date(0)) is false
+PASS compare('xyz', new Date(1e3)) is false
+PASS compare('xyz', new Date(1e9)) is false
+PASS compare('xyz', []) is false
+PASS compare('xyz', [123]) is false
+PASS compare('xyz', ['abc']) is false
+PASS compare('xyz', [123, 'abc']) is false
+PASS compare('xyz', ['abc', 123]) is false
+PASS compare('xyz', [[]]) is false
+PASS compare('xyz', [[123]]) is false
+PASS compare('xyz', [['abc']]) is false
+PASS compare('xyz', [[123], 'abc']) is false
+PASS compare('xyz', [[123], 123]) is false
+PASS compare(new Date(0), undefined) is false
+PASS compare(new Date(0), true) is false
+PASS compare(new Date(0), false) is false
+PASS compare(new Date(0), 0) is false
+PASS compare(new Date(0), -0) is false
+PASS compare(new Date(0), 123) is false
+PASS compare(new Date(0), Infinity) is false
+PASS compare(new Date(0), -Infinity) is false
+PASS compare(new Date(0), NaN) is false
+PASS compare(new Date(0), '') is false
+PASS compare(new Date(0), 'abc') is false
+PASS compare(new Date(0), 'xyz') is false
+PASS compare(new Date(0), new Date(0)) is true
+PASS compare(new Date(0), new Date(1e3)) is false
+PASS compare(new Date(0), new Date(1e9)) is false
+PASS compare(new Date(0), []) is false
+PASS compare(new Date(0), [123]) is false
+PASS compare(new Date(0), ['abc']) is false
+PASS compare(new Date(0), [123, 'abc']) is false
+PASS compare(new Date(0), ['abc', 123]) is false
+PASS compare(new Date(0), [[]]) is false
+PASS compare(new Date(0), [[123]]) is false
+PASS compare(new Date(0), [['abc']]) is false
+PASS compare(new Date(0), [[123], 'abc']) is false
+PASS compare(new Date(0), [[123], 123]) is false
+PASS compare(new Date(1e3), undefined) is false
+PASS compare(new Date(1e3), true) is false
+PASS compare(new Date(1e3), false) is false
+PASS compare(new Date(1e3), 0) is false
+PASS compare(new Date(1e3), -0) is false
+PASS compare(new Date(1e3), 123) is false
+PASS compare(new Date(1e3), Infinity) is false
+PASS compare(new Date(1e3), -Infinity) is false
+PASS compare(new Date(1e3), NaN) is false
+PASS compare(new Date(1e3), '') is false
+PASS compare(new Date(1e3), 'abc') is false
+PASS compare(new Date(1e3), 'xyz') is false
+PASS compare(new Date(1e3), new Date(0)) is false
+PASS compare(new Date(1e3), new Date(1e3)) is true
+PASS compare(new Date(1e3), new Date(1e9)) is false
+PASS compare(new Date(1e3), []) is false
+PASS compare(new Date(1e3), [123]) is false
+PASS compare(new Date(1e3), ['abc']) is false
+PASS compare(new Date(1e3), [123, 'abc']) is false
+PASS compare(new Date(1e3), ['abc', 123]) is false
+PASS compare(new Date(1e3), [[]]) is false
+PASS compare(new Date(1e3), [[123]]) is false
+PASS compare(new Date(1e3), [['abc']]) is false
+PASS compare(new Date(1e3), [[123], 'abc']) is false
+PASS compare(new Date(1e3), [[123], 123]) is false
+PASS compare(new Date(1e9), undefined) is false
+PASS compare(new Date(1e9), true) is false
+PASS compare(new Date(1e9), false) is false
+PASS compare(new Date(1e9), 0) is false
+PASS compare(new Date(1e9), -0) is false
+PASS compare(new Date(1e9), 123) is false
+PASS compare(new Date(1e9), Infinity) is false
+PASS compare(new Date(1e9), -Infinity) is false
+PASS compare(new Date(1e9), NaN) is false
+PASS compare(new Date(1e9), '') is false
+PASS compare(new Date(1e9), 'abc') is false
+PASS compare(new Date(1e9), 'xyz') is false
+PASS compare(new Date(1e9), new Date(0)) is false
+PASS compare(new Date(1e9), new Date(1e3)) is false
+PASS compare(new Date(1e9), new Date(1e9)) is true
+PASS compare(new Date(1e9), []) is false
+PASS compare(new Date(1e9), [123]) is false
+PASS compare(new Date(1e9), ['abc']) is false
+PASS compare(new Date(1e9), [123, 'abc']) is false
+PASS compare(new Date(1e9), ['abc', 123]) is false
+PASS compare(new Date(1e9), [[]]) is false
+PASS compare(new Date(1e9), [[123]]) is false
+PASS compare(new Date(1e9), [['abc']]) is false
+PASS compare(new Date(1e9), [[123], 'abc']) is false
+PASS compare(new Date(1e9), [[123], 123]) is false
+PASS compare([], undefined) is false
+PASS compare([], true) is false
+PASS compare([], false) is false
+PASS compare([], 0) is false
+PASS compare([], -0) is false
+PASS compare([], 123) is false
+PASS compare([], Infinity) is false
+PASS compare([], -Infinity) is false
+PASS compare([], NaN) is false
+PASS compare([], '') is false
+PASS compare([], 'abc') is false
+PASS compare([], 'xyz') is false
+PASS compare([], new Date(0)) is false
+PASS compare([], new Date(1e3)) is false
+PASS compare([], new Date(1e9)) is false
+PASS compare([], []) is true
+PASS compare([], [123]) is false
+PASS compare([], ['abc']) is false
+PASS compare([], [123, 'abc']) is false
+PASS compare([], ['abc', 123]) is false
+PASS compare([], [[]]) is false
+PASS compare([], [[123]]) is false
+PASS compare([], [['abc']]) is false
+PASS compare([], [[123], 'abc']) is false
+PASS compare([], [[123], 123]) is false
+PASS compare([123], undefined) is false
+PASS compare([123], true) is false
+PASS compare([123], false) is false
+PASS compare([123], 0) is false
+PASS compare([123], -0) is false
+PASS compare([123], 123) is false
+PASS compare([123], Infinity) is false
+PASS compare([123], -Infinity) is false
+PASS compare([123], NaN) is false
+PASS compare([123], '') is false
+PASS compare([123], 'abc') is false
+PASS compare([123], 'xyz') is false
+PASS compare([123], new Date(0)) is false
+PASS compare([123], new Date(1e3)) is false
+PASS compare([123], new Date(1e9)) is false
+PASS compare([123], []) is false
+PASS compare([123], [123]) is true
+PASS compare([123], ['abc']) is false
+PASS compare([123], [123, 'abc']) is false
+PASS compare([123], ['abc', 123]) is false
+PASS compare([123], [[]]) is false
+PASS compare([123], [[123]]) is false
+PASS compare([123], [['abc']]) is false
+PASS compare([123], [[123], 'abc']) is false
+PASS compare([123], [[123], 123]) is false
+PASS compare(['abc'], undefined) is false
+PASS compare(['abc'], true) is false
+PASS compare(['abc'], false) is false
+PASS compare(['abc'], 0) is false
+PASS compare(['abc'], -0) is false
+PASS compare(['abc'], 123) is false
+PASS compare(['abc'], Infinity) is false
+PASS compare(['abc'], -Infinity) is false
+PASS compare(['abc'], NaN) is false
+PASS compare(['abc'], '') is false
+PASS compare(['abc'], 'abc') is false
+PASS compare(['abc'], 'xyz') is false
+PASS compare(['abc'], new Date(0)) is false
+PASS compare(['abc'], new Date(1e3)) is false
+PASS compare(['abc'], new Date(1e9)) is false
+PASS compare(['abc'], []) is false
+PASS compare(['abc'], [123]) is false
+PASS compare(['abc'], ['abc']) is true
+PASS compare(['abc'], [123, 'abc']) is false
+PASS compare(['abc'], ['abc', 123]) is false
+PASS compare(['abc'], [[]]) is false
+PASS compare(['abc'], [[123]]) is false
+PASS compare(['abc'], [['abc']]) is false
+PASS compare(['abc'], [[123], 'abc']) is false
+PASS compare(['abc'], [[123], 123]) is false
+PASS compare([123, 'abc'], undefined) is false
+PASS compare([123, 'abc'], true) is false
+PASS compare([123, 'abc'], false) is false
+PASS compare([123, 'abc'], 0) is false
+PASS compare([123, 'abc'], -0) is false
+PASS compare([123, 'abc'], 123) is false
+PASS compare([123, 'abc'], Infinity) is false
+PASS compare([123, 'abc'], -Infinity) is false
+PASS compare([123, 'abc'], NaN) is false
+PASS compare([123, 'abc'], '') is false
+PASS compare([123, 'abc'], 'abc') is false
+PASS compare([123, 'abc'], 'xyz') is false
+PASS compare([123, 'abc'], new Date(0)) is false
+PASS compare([123, 'abc'], new Date(1e3)) is false
+PASS compare([123, 'abc'], new Date(1e9)) is false
+PASS compare([123, 'abc'], []) is false
+PASS compare([123, 'abc'], [123]) is false
+PASS compare([123, 'abc'], ['abc']) is false
+PASS compare([123, 'abc'], [123, 'abc']) is true
+PASS compare([123, 'abc'], ['abc', 123]) is false
+PASS compare([123, 'abc'], [[]]) is false
+PASS compare([123, 'abc'], [[123]]) is false
+PASS compare([123, 'abc'], [['abc']]) is false
+PASS compare([123, 'abc'], [[123], 'abc']) is false
+PASS compare([123, 'abc'], [[123], 123]) is false
+PASS compare(['abc', 123], undefined) is false
+PASS compare(['abc', 123], true) is false
+PASS compare(['abc', 123], false) is false
+PASS compare(['abc', 123], 0) is false
+PASS compare(['abc', 123], -0) is false
+PASS compare(['abc', 123], 123) is false
+PASS compare(['abc', 123], Infinity) is false
+PASS compare(['abc', 123], -Infinity) is false
+PASS compare(['abc', 123], NaN) is false
+PASS compare(['abc', 123], '') is false
+PASS compare(['abc', 123], 'abc') is false
+PASS compare(['abc', 123], 'xyz') is false
+PASS compare(['abc', 123], new Date(0)) is false
+PASS compare(['abc', 123], new Date(1e3)) is false
+PASS compare(['abc', 123], new Date(1e9)) is false
+PASS compare(['abc', 123], []) is false
+PASS compare(['abc', 123], [123]) is false
+PASS compare(['abc', 123], ['abc']) is false
+PASS compare(['abc', 123], [123, 'abc']) is false
+PASS compare(['abc', 123], ['abc', 123]) is true
+PASS compare(['abc', 123], [[]]) is false
+PASS compare(['abc', 123], [[123]]) is false
+PASS compare(['abc', 123], [['abc']]) is false
+PASS compare(['abc', 123], [[123], 'abc']) is false
+PASS compare(['abc', 123], [[123], 123]) is false
+PASS compare([[]], undefined) is false
+PASS compare([[]], true) is false
+PASS compare([[]], false) is false
+PASS compare([[]], 0) is false
+PASS compare([[]], -0) is false
+PASS compare([[]], 123) is false
+PASS compare([[]], Infinity) is false
+PASS compare([[]], -Infinity) is false
+PASS compare([[]], NaN) is false
+PASS compare([[]], '') is false
+PASS compare([[]], 'abc') is false
+PASS compare([[]], 'xyz') is false
+PASS compare([[]], new Date(0)) is false
+PASS compare([[]], new Date(1e3)) is false
+PASS compare([[]], new Date(1e9)) is false
+PASS compare([[]], []) is false
+PASS compare([[]], [123]) is false
+PASS compare([[]], ['abc']) is false
+PASS compare([[]], [123, 'abc']) is false
+PASS compare([[]], ['abc', 123]) is false
+PASS compare([[]], [[]]) is true
+PASS compare([[]], [[123]]) is false
+PASS compare([[]], [['abc']]) is false
+PASS compare([[]], [[123], 'abc']) is false
+PASS compare([[]], [[123], 123]) is false
+PASS compare([[123]], undefined) is false
+PASS compare([[123]], true) is false
+PASS compare([[123]], false) is false
+PASS compare([[123]], 0) is false
+PASS compare([[123]], -0) is false
+PASS compare([[123]], 123) is false
+PASS compare([[123]], Infinity) is false
+PASS compare([[123]], -Infinity) is false
+PASS compare([[123]], NaN) is false
+PASS compare([[123]], '') is false
+PASS compare([[123]], 'abc') is false
+PASS compare([[123]], 'xyz') is false
+PASS compare([[123]], new Date(0)) is false
+PASS compare([[123]], new Date(1e3)) is false
+PASS compare([[123]], new Date(1e9)) is false
+PASS compare([[123]], []) is false
+PASS compare([[123]], [123]) is false
+PASS compare([[123]], ['abc']) is false
+PASS compare([[123]], [123, 'abc']) is false
+PASS compare([[123]], ['abc', 123]) is false
+PASS compare([[123]], [[]]) is false
+PASS compare([[123]], [[123]]) is true
+PASS compare([[123]], [['abc']]) is false
+PASS compare([[123]], [[123], 'abc']) is false
+PASS compare([[123]], [[123], 123]) is false
+PASS compare([['abc']], undefined) is false
+PASS compare([['abc']], true) is false
+PASS compare([['abc']], false) is false
+PASS compare([['abc']], 0) is false
+PASS compare([['abc']], -0) is false
+PASS compare([['abc']], 123) is false
+PASS compare([['abc']], Infinity) is false
+PASS compare([['abc']], -Infinity) is false
+PASS compare([['abc']], NaN) is false
+PASS compare([['abc']], '') is false
+PASS compare([['abc']], 'abc') is false
+PASS compare([['abc']], 'xyz') is false
+PASS compare([['abc']], new Date(0)) is false
+PASS compare([['abc']], new Date(1e3)) is false
+PASS compare([['abc']], new Date(1e9)) is false
+PASS compare([['abc']], []) is false
+PASS compare([['abc']], [123]) is false
+PASS compare([['abc']], ['abc']) is false
+PASS compare([['abc']], [123, 'abc']) is false
+PASS compare([['abc']], ['abc', 123]) is false
+PASS compare([['abc']], [[]]) is false
+PASS compare([['abc']], [[123]]) is false
+PASS compare([['abc']], [['abc']]) is true
+PASS compare([['abc']], [[123], 'abc']) is false
+PASS compare([['abc']], [[123], 123]) is false
+PASS compare([[123], 'abc'], undefined) is false
+PASS compare([[123], 'abc'], true) is false
+PASS compare([[123], 'abc'], false) is false
+PASS compare([[123], 'abc'], 0) is false
+PASS compare([[123], 'abc'], -0) is false
+PASS compare([[123], 'abc'], 123) is false
+PASS compare([[123], 'abc'], Infinity) is false
+PASS compare([[123], 'abc'], -Infinity) is false
+PASS compare([[123], 'abc'], NaN) is false
+PASS compare([[123], 'abc'], '') is false
+PASS compare([[123], 'abc'], 'abc') is false
+PASS compare([[123], 'abc'], 'xyz') is false
+PASS compare([[123], 'abc'], new Date(0)) is false
+PASS compare([[123], 'abc'], new Date(1e3)) is false
+PASS compare([[123], 'abc'], new Date(1e9)) is false
+PASS compare([[123], 'abc'], []) is false
+PASS compare([[123], 'abc'], [123]) is false
+PASS compare([[123], 'abc'], ['abc']) is false
+PASS compare([[123], 'abc'], [123, 'abc']) is false
+PASS compare([[123], 'abc'], ['abc', 123]) is false
+PASS compare([[123], 'abc'], [[]]) is false
+PASS compare([[123], 'abc'], [[123]]) is false
+PASS compare([[123], 'abc'], [['abc']]) is false
+PASS compare([[123], 'abc'], [[123], 'abc']) is true
+PASS compare([[123], 'abc'], [[123], 123]) is false
+PASS compare([[123], 123], undefined) is false
+PASS compare([[123], 123], true) is false
+PASS compare([[123], 123], false) is false
+PASS compare([[123], 123], 0) is false
+PASS compare([[123], 123], -0) is false
+PASS compare([[123], 123], 123) is false
+PASS compare([[123], 123], Infinity) is false
+PASS compare([[123], 123], -Infinity) is false
+PASS compare([[123], 123], NaN) is false
+PASS compare([[123], 123], '') is false
+PASS compare([[123], 123], 'abc') is false
+PASS compare([[123], 123], 'xyz') is false
+PASS compare([[123], 123], new Date(0)) is false
+PASS compare([[123], 123], new Date(1e3)) is false
+PASS compare([[123], 123], new Date(1e9)) is false
+PASS compare([[123], 123], []) is false
+PASS compare([[123], 123], [123]) is false
+PASS compare([[123], 123], ['abc']) is false
+PASS compare([[123], 123], [123, 'abc']) is false
+PASS compare([[123], 123], ['abc', 123]) is false
+PASS compare([[123], 123], [[]]) is false
+PASS compare([[123], 123], [[123]]) is false
+PASS compare([[123], 123], [['abc']]) is false
+PASS compare([[123], 123], [[123], 'abc']) is false
+PASS compare([[123], 123], [[123], 123]) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorkeyorderprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-key-order-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-key-order-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-key-order-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-key-order.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorprevnoduplicateprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,109 @@
</span><ins>+Test IndexedDB behavior when iterating backwards with and without NO_DUPLICATE
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+store.createIndex('index', 'sorted')
+
+populating store...
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store');
+store.put({sorted: 3, value: 111}, 1)
+store.put({sorted: 2, value: 222}, 2)
+store.put({sorted: 1, value: 333}, 3)
+store.put({sorted: 10, value: 444}, 17)
+store.put({sorted: 10, value: 555}, 16)
+store.put({sorted: 10, value: 666}, 15)
+
+testFarRangeCursor: upper bound is well out of range, results always the same, whether open or closed
+storeReq = store.openCursor(IDBKeyRange.upperBound(7, false), 'prev')
+PASS cursor.key is 3
+PASS cursor.value.value is 333
+DONE
+
+storeReq = store.openCursor(IDBKeyRange.upperBound(7, true), 'prev')
+PASS cursor.key is 3
+PASS cursor.value.value is 333
+DONE
+
+storeReq = index.openCursor(IDBKeyRange.upperBound(7, false), 'prev')
+PASS cursor.key is 3
+PASS cursor.value.value is 111
+PASS cursor.primaryKey is 1
+DONE
+
+storeReq = index.openCursor(IDBKeyRange.upperBound(7, true), 'prev')
+PASS cursor.key is 3
+PASS cursor.value.value is 111
+PASS cursor.primaryKey is 1
+DONE
+
+storeReq = index.openKeyCursor(IDBKeyRange.upperBound(7, false), 'prev')
+PASS cursor.key is 3
+PASS cursor.primaryKey is 1
+DONE
+
+storeReq = index.openKeyCursor(IDBKeyRange.upperBound(7, true), 'prev')
+PASS cursor.key is 3
+PASS cursor.primaryKey is 1
+DONE
+
+storeReq = store.openCursor(IDBKeyRange.upperBound(3, false), 'prev')
+PASS cursor.key is 3
+PASS cursor.value.value is 333
+DONE
+
+storeReq = store.openCursor(IDBKeyRange.upperBound(3, true), 'prev')
+PASS cursor.key is 2
+PASS cursor.value.value is 222
+DONE
+
+storeReq = index.openCursor(IDBKeyRange.upperBound(3, false), 'prev')
+PASS cursor.key is 3
+PASS cursor.value.value is 111
+PASS cursor.primaryKey is 1
+DONE
+
+storeReq = index.openCursor(IDBKeyRange.upperBound(3, true), 'prev')
+PASS cursor.key is 2
+PASS cursor.value.value is 222
+PASS cursor.primaryKey is 2
+DONE
+
+storeReq = index.openKeyCursor(IDBKeyRange.upperBound(3, false), 'prev')
+PASS cursor.key is 3
+PASS cursor.primaryKey is 1
+DONE
+
+storeReq = index.openKeyCursor(IDBKeyRange.upperBound(3, true), 'prev')
+PASS cursor.key is 2
+PASS cursor.primaryKey is 2
+DONE
+
+testNoDuplicate: there are 3 values, but we should return always the first one
+storeReq = store.openCursor(IDBKeyRange.upperBound(15, false), 'prevunique')
+PASS cursor.key is 15
+PASS cursor.value.value is 666
+PASS cursor.primaryKey is 15
+DONE
+
+storeReq = index.openCursor(IDBKeyRange.upperBound(15, false), 'prevunique')
+PASS cursor.key is 10
+PASS cursor.value.value is 666
+PASS cursor.primaryKey is 15
+DONE
+
+storeReq = index.openKeyCursor(IDBKeyRange.upperBound(15, false), 'prevunique')
+PASS cursor.key is 10
+PASS cursor.primaryKey is 15
+DONE
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorprevnoduplicateprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-prev-no-duplicate-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-prev-no-duplicate.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorprimarykeyorderprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,91 @@
</span><ins>+Test IndexedDB primary key ordering and readback from cursors.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+index = store.createIndex('index', 'indexKey')
+
+populating store...
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store');
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:0}, 'c')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:1}, 'b')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:2}, 'a')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:3}, 'C')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:4}, 'B')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:5}, 'A')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:6}, '2')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:7}, '1')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:8}, '0')
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:9}, Infinity)
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:10}, 2)
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:11}, 1)
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:12}, 0)
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:13}, -1)
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:14}, -2)
+store.put({&quot;indexKey&quot;:0,&quot;count&quot;:15}, -Infinity)
+
+iterating cursor...
+trans = db.transaction('store', 'readonly')
+store = trans.objectStore('store');
+index = store.index('index');
+cursorRequest = index.openCursor()
+count = 0
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is -Infinity
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is -2
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is -1
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 0
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 1
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 2
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is Infinity
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is '0'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is '1'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is '2'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 'A'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 'B'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 'C'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 'a'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 'b'
+cursor = cursorRequest.result
+PASS cursor.key is 0
+PASS cursor.primaryKey is 'c'
+PASS count is keys.length
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorprimarykeyorderprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-primary-key-order-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-primary-key-order.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorpropertiesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-properties-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-properties-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-properties-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+Test that IndexedDB's cursor key/primaryKey/value properties preserve mutations.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname, 1)
+
+onUpgradeNeeded():
+db = event.target.result
+store = db.createObjectStore('store')
+index = store.createIndex('index', 'id')
+store.put({id: ['indexKey']}, ['primaryKey'])
+
+onOpenSuccess():
+db = event.target.result
+trans = db.transaction('store')
+store = trans.objectStore('store')
+index = store.index('index')
+
+request = index.openCursor()
+
+onCursorSuccess():
+cursor = event.target.result
+PASS cursor is non-null.
+PASS areArraysEqual(cursor.key, ['indexKey']) is true
+PASS areArraysEqual(cursor.primaryKey, ['primaryKey']) is true
+
+Check identity:
+v = cursor.key
+PASS v === cursor.key is true
+Check read-only:
+cursor.key = null
+PASS v === cursor.key is true
+Check mutability:
+cursor.key.expando = 123
+PASS cursor.key.expando is 123
+
+Check identity:
+v = cursor.primaryKey
+PASS v === cursor.primaryKey is true
+Check read-only:
+cursor.primaryKey = null
+PASS v === cursor.primaryKey is true
+Check mutability:
+cursor.primaryKey.expando = 123
+PASS cursor.primaryKey.expando is 123
+
+Check identity:
+v = cursor.value
+PASS v === cursor.value is true
+Check read-only:
+cursor.value = null
+PASS v === cursor.value is true
+Check mutability:
+cursor.value.expando = 123
+PASS cursor.value.expando is 123
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorpropertiesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-properties-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-properties-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-properties-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-properties.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorreversebugprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,100 @@
</span><ins>+Test IndexedDB keys ordering and readback from cursors.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+store.createIndex('index', '')
+
+populating store...
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store');
+store.put(1, 1)
+store.put(2, 2)
+store.put(3, 3)
+testCursor()
+trans = db.transaction('store', 'readonly')
+store = trans.objectStore('store');
+index = store.index('index');
+upperBound: 7 open: false expected: 3
+storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.primaryKey is test.expected
+testCursor()
+trans = db.transaction('store', 'readonly')
+store = trans.objectStore('store');
+index = store.index('index');
+upperBound: 7 open: true expected: 3
+storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.primaryKey is test.expected
+testCursor()
+trans = db.transaction('store', 'readonly')
+store = trans.objectStore('store');
+index = store.index('index');
+upperBound: 3 open: false expected: 3
+storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.primaryKey is test.expected
+testCursor()
+trans = db.transaction('store', 'readonly')
+store = trans.objectStore('store');
+index = store.index('index');
+upperBound: 3 open: true expected: 2
+storeReq = store.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexReq = index.openCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+indexKeyReq = index.openKeyCursor(IDBKeyRange.upperBound(test.upperBound, test.open), 'prev')
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.value is test.expected
+PASS cursor.primaryKey is test.expected
+cursor = event.target.result
+PASS cursor.key is test.expected
+PASS cursor.primaryKey is test.expected
+testCursor()
+No more tests.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorreversebugprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-reverse-bug-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-reverse-bug.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorskipdeletedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,137 @@
</span><ins>+Test IndexedDB's cursor skips deleted entries.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+setVersionSuccess():
+trans = event.target.transaction
+PASS trans is non-null.
+objectStore = db.createObjectStore('store', {keyPath: 'id'})
+objectStore.createIndex('nameIndex', 'name')
+
+resetObjectStore():
+
+basicCursorTest()
+trans = db.transaction(['store'], 'readwrite')
+
+testCursor():
+trans.objectStore('store').openCursor(IDBKeyRange.lowerBound(0))
+0: Alpha
+1: Bravo
+request = trans.objectStore('store').delete(0)
+2: Charlie
+request = trans.objectStore('store').delete(25)
+3: Delta
+request = trans.objectStore('store').delete(5)
+request = trans.objectStore('store').delete(6)
+request = trans.objectStore('store').delete(7)
+4: Echo
+8: India
+9: Juliet
+10: Kilo
+request = trans.objectStore('store').delete(10)
+11: Lima
+12: Mike
+request = trans.objectStore('store').delete(13)
+14: Oscar
+15: Papa
+request = trans.objectStore('store').delete(14)
+16: Quebec
+17: Romeo
+18: Sierra
+19: Tango
+20: Uniform
+request = trans.objectStore('store').delete(17)
+request = trans.objectStore('store').delete(18)
+21: Victor
+22: Whiskey
+23: X-ray
+24: Yankee
+
+
+resetObjectStore():
+
+reverseCursorTest():
+
+testCursor():
+trans.objectStore('store').openCursor(IDBKeyRange.lowerBound(0), 'prev')
+25: Zulu
+24: Yankee
+request = trans.objectStore('store').delete(25)
+23: X-ray
+request = trans.objectStore('store').delete(0)
+22: Whiskey
+request = trans.objectStore('store').delete(20)
+request = trans.objectStore('store').delete(19)
+request = trans.objectStore('store').delete(18)
+21: Victor
+17: Romeo
+16: Quebec
+15: Papa
+request = trans.objectStore('store').delete(15)
+14: Oscar
+13: November
+request = trans.objectStore('store').delete(12)
+11: Lima
+10: Kilo
+request = trans.objectStore('store').delete(11)
+9: Juliet
+8: India
+7: Hotel
+6: Golf
+5: Foxtrot
+request = trans.objectStore('store').delete(7)
+request = trans.objectStore('store').delete(8)
+4: Echo
+3: Delta
+2: Charlie
+1: Bravo
+
+
+resetObjectStore():
+
+indexCursorTest():
+
+testCursor():
+trans.objectStore('store').index('nameIndex').openCursor(IDBKeyRange.lowerBound('Alpha'))
+0: Alpha
+1: Bravo
+request = trans.objectStore('store').delete(0)
+2: Charlie
+request = trans.objectStore('store').delete(25)
+3: Delta
+request = trans.objectStore('store').delete(5)
+request = trans.objectStore('store').delete(6)
+request = trans.objectStore('store').delete(7)
+4: Echo
+8: India
+9: Juliet
+10: Kilo
+request = trans.objectStore('store').delete(10)
+11: Lima
+12: Mike
+request = trans.objectStore('store').delete(13)
+14: Oscar
+15: Papa
+request = trans.objectStore('store').delete(14)
+16: Quebec
+17: Romeo
+18: Sierra
+19: Tango
+20: Uniform
+request = trans.objectStore('store').delete(17)
+request = trans.objectStore('store').delete(18)
+21: Victor
+22: Whiskey
+23: X-ray
+24: Yankee
+
+transactionComplete():
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorskipdeletedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-skip-deleted-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-skip-deleted.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorupdateprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-update-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-update-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-update-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,240 @@
</span><ins>+Test IndexedDB's cursor update.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+setVersionSuccess():
+trans = event.target.transaction
+PASS trans is non-null.
+Deleted all object stores.
+objectStore = db.createObjectStore('basicStore')
+objectStore.add('myValue1', 'myKey1').onerror = unexpectedErrorCallback
+objectStore.add('myValue2', 'myKey2').onerror = unexpectedErrorCallback
+objectStore.add('myValue3', 'myKey3').onerror = unexpectedErrorCallback
+objectStore.add('myValue4', 'myKey4').onerror = unexpectedErrorCallback
+objectStore = db.createObjectStore('autoIncrementStore', {autoIncrement: true})
+objectStore.add('foo1').onerror = unexpectedErrorCallback
+objectStore.add('foo2').onerror = unexpectedErrorCallback
+objectStore.add('foo3').onerror = unexpectedErrorCallback
+objectStore.add('foo4').onerror = unexpectedErrorCallback
+objectStore = db.createObjectStore('keyPathStore', {keyPath: 'id'})
+objectStore.createIndex('numberIndex', 'number')
+objectStore.add({number: 1, id: 1}).onerror = unexpectedErrorCallback
+objectStore.add({number: 2, id: 2}).onerror = unexpectedErrorCallback
+objectStore.add({number: 3, id: 3}).onerror = unexpectedErrorCallback
+objectStore.add({number: 4, id: 4}).onerror = unexpectedErrorCallback
+openBasicCursor()
+trans = db.transaction(['basicStore', 'autoIncrementStore', 'keyPathStore'], 'readwrite')
+trans.objectStore('basicStore')
+objectStore.openCursor(keyRange)
+basicUpdateCursor()
+PASS event.target.source is objectStore
+event.target.result.update('myUpdatedValue' + counter++)
+event.target.source.continue()
+basicUpdateCursor()
+PASS event.target.source is objectStore
+event.target.result.update('myUpdatedValue' + counter++)
+event.target.source.continue()
+basicUpdateCursor()
+PASS event.target.source is objectStore
+event.target.result.update('myUpdatedValue' + counter++)
+event.target.source.continue()
+basicUpdateCursor()
+PASS event.target.source is objectStore
+event.target.result.update('myUpdatedValue' + counter++)
+event.target.source.continue()
+basicUpdateCursor()
+PASS event.target.source is objectStore
+PASS counter is 5
+trans.objectStore('basicStore').openCursor(keyRange)
+basicCheckCursor()
+PASS event.target.result.key is &quot;myKey1&quot;
+PASS event.target.result.value is &quot;myUpdatedValue1&quot;
+event.target.result.continue()
+basicCheckCursor()
+PASS event.target.result.key is &quot;myKey2&quot;
+PASS event.target.result.value is &quot;myUpdatedValue2&quot;
+event.target.result.continue()
+basicCheckCursor()
+PASS event.target.result.key is &quot;myKey3&quot;
+PASS event.target.result.value is &quot;myUpdatedValue3&quot;
+event.target.result.continue()
+basicCheckCursor()
+PASS event.target.result.key is &quot;myKey4&quot;
+PASS event.target.result.value is &quot;myUpdatedValue4&quot;
+event.target.result.continue()
+basicCheckCursor()
+PASS counter is 5
+trans.objectStore('autoIncrementStore').openCursor(keyRange)
+autoIncrementUpdateCursor()
+event.target.result.update('myUpdatedFoo' + counter++)
+event.target.source.continue()
+autoIncrementUpdateCursor()
+event.target.result.update('myUpdatedFoo' + counter++)
+event.target.source.continue()
+autoIncrementUpdateCursor()
+event.target.result.update('myUpdatedFoo' + counter++)
+event.target.source.continue()
+autoIncrementUpdateCursor()
+event.target.result.update('myUpdatedFoo' + counter++)
+event.target.source.continue()
+autoIncrementUpdateCursor()
+PASS counter is 5
+trans.objectStore('autoIncrementStore').openCursor(keyRange)
+autoIncrementCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value is &quot;myUpdatedFoo1&quot;
+event.target.result.continue()
+autoIncrementCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value is &quot;myUpdatedFoo2&quot;
+event.target.result.continue()
+autoIncrementCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value is &quot;myUpdatedFoo3&quot;
+event.target.result.continue()
+autoIncrementCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value is &quot;myUpdatedFoo4&quot;
+event.target.result.continue()
+autoIncrementCheckCursor()
+PASS counter is 5
+trans.objectStore('keyPathStore').openCursor(keyRange)
+keyPathUpdateCursor()
+Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key.
+event.target.result.update({id: counter, number: 100 + counter++})
+event.target.source.continue()
+keyPathUpdateCursor()
+Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key.
+event.target.result.update({id: counter, number: 100 + counter++})
+event.target.source.continue()
+keyPathUpdateCursor()
+Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key.
+event.target.result.update({id: counter, number: 100 + counter++})
+event.target.source.continue()
+keyPathUpdateCursor()
+Expecting exception from event.target.result.update({id: 100 + counter, number: 100 + counter})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key.
+event.target.result.update({id: counter, number: 100 + counter++})
+event.target.source.continue()
+keyPathUpdateCursor()
+PASS counter is 5
+trans.objectStore('keyPathStore').openCursor(keyRange)
+keyPathCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value.id is counter
+PASS event.target.result.value.number is 101
+event.target.result.continue()
+keyPathCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value.id is counter
+PASS event.target.result.value.number is 102
+event.target.result.continue()
+keyPathCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value.id is counter
+PASS event.target.result.value.number is 103
+event.target.result.continue()
+keyPathCheckCursor()
+PASS event.target.result.key is counter
+PASS event.target.result.value.id is counter
+PASS event.target.result.value.number is 104
+event.target.result.continue()
+keyPathCheckCursor()
+PASS counter is 5
+trans.objectStore('keyPathStore').index('numberIndex').openKeyCursor(keyRange)
+keyCursor()
+PASS event.target.result.key is counter + 100
+PASS event.target.result.primaryKey is counter
+Expecting exception from event.target.result.update({id: counter, number: counter + 200})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor.
+event.target.result.continue();
+keyCursor()
+PASS event.target.result.key is counter + 100
+PASS event.target.result.primaryKey is counter
+Expecting exception from event.target.result.update({id: counter, number: counter + 200})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor.
+event.target.result.continue();
+keyCursor()
+PASS event.target.result.key is counter + 100
+PASS event.target.result.primaryKey is counter
+Expecting exception from event.target.result.update({id: counter, number: counter + 200})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor.
+event.target.result.continue();
+keyCursor()
+PASS event.target.result.key is counter + 100
+PASS event.target.result.primaryKey is counter
+Expecting exception from event.target.result.update({id: counter, number: counter + 200})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor.
+event.target.result.continue();
+keyCursor()
+PASS counter is 5
+openBasicCursor()
+trans = db.transaction('basicStore')
+trans.objectStore('basicStore')
+objectStore.openCursor(keyRange)
+attemptUpdate()
+Expecting exception from cursor.update('myUpdatedValue')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction.
+cursor.continue()
+attemptUpdate()
+Expecting exception from cursor.update('myUpdatedValue')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction.
+cursor.continue()
+attemptUpdate()
+Expecting exception from cursor.update('myUpdatedValue')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction.
+cursor.continue()
+attemptUpdate()
+Expecting exception from cursor.update('myUpdatedValue')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction.
+cursor.continue()
+attemptUpdate()
+transactionComplete()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorupdateprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-update-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-update-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-update-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-update.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorupdatevalueargumentrequiredprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+Test IndexedDB cursor.update required arguments
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('autoIncrement', { autoIncrement: true });
+request = objectStore.openCursor();
+keys = [1, -1, 0, 10, 2000, 'q', 'z', 'two', 'b', 'a'];
+keyIndex = 0;
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.add('foo', keys[i]);
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.update(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorupdatevalueargumentrequiredprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-update-value-argument-required-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-update-value-argument-required.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorvalueprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-value-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-value-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-value-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,126 @@
</span><ins>+Test IndexedDB's cursor value property.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store')
+
+testCursor():
+transaction = db.transaction('store', 'readwrite')
+store = transaction.objectStore('store')
+store.put({a: 1, b: 10}, 'key1')
+store.put({a: 2, b: 20}, 'key2')
+store.put({a: 3, b: 30}, 'key3')
+store.put({a: 4, b: 40}, 'key4')
+store.put({a: 5, b: 50}, 'key5')
+request = store.openCursor()
+
+----------
+Value at index: 0
+cursor = request.result
+PASS cursor.key is expectedKey
+
+Check expected values:
+PASS cursor.value.a is expectedA
+PASS cursor.value.b is expectedB
+PASS cursor.value.foo is undefined
+
+Modify values:
+cursor.value.a = 3
+delete cursor.value.b
+cursor.value.foo = 'bar'
+
+Ensure modifications are retained:
+PASS cursor.value.a is 3
+PASS cursor.value.b is undefined
+PASS cursor.value.foo is 'bar'
+
+Check object value survives gc
+gc()
+PASS cursor.value.a is 3
+PASS cursor.value.b is undefined
+PASS cursor.value.foo is 'bar'
+
+Check object identity
+localValueRef = cursor.value
+PASS localValueRef is cursor.value
+
+----------
+Value at index: 1
+cursor = request.result
+PASS cursor.key is expectedKey
+
+Check expected values:
+PASS cursor.value.a is expectedA
+PASS cursor.value.b is expectedB
+PASS cursor.value.foo is undefined
+
+Modify values:
+cursor.value.a = 3
+delete cursor.value.b
+cursor.value.foo = 'bar'
+
+Ensure modifications are retained:
+PASS cursor.value.a is 3
+PASS cursor.value.b is undefined
+PASS cursor.value.foo is 'bar'
+
+Check object value survives gc
+gc()
+PASS cursor.value.a is 3
+PASS cursor.value.b is undefined
+PASS cursor.value.foo is 'bar'
+
+Check object identity
+localValueRef = cursor.value
+PASS localValueRef is cursor.value
+
+----------
+Value at index: 3
+cursor = request.result
+PASS cursor.key is expectedKey
+
+Check expected values:
+PASS cursor.value.a is expectedA
+PASS cursor.value.b is expectedB
+PASS cursor.value.foo is undefined
+
+Modify values:
+cursor.value.a = 3
+delete cursor.value.b
+cursor.value.foo = 'bar'
+
+Ensure modifications are retained:
+PASS cursor.value.a is 3
+PASS cursor.value.b is undefined
+PASS cursor.value.foo is 'bar'
+
+Check object value survives gc
+gc()
+PASS cursor.value.a is 3
+PASS cursor.value.b is undefined
+PASS cursor.value.foo is 'bar'
+
+Check object identity
+localValueRef = cursor.value
+PASS localValueRef is cursor.value
+
+ensureModificationsNotPersisted():
+transaction = db.transaction('store', 'readonly')
+store = transaction.objectStore('store')
+request = store.openCursor()
+cursor = request.result
+PASS cursor.key is 'key1'
+
+Check expected values:
+PASS cursor.value.a is 1
+PASS cursor.value.b is 10
+PASS cursor.value.foo is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorvalueprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/cursor-value-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-value-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/cursor-value-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/cursor-value.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasebasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+Test the basics of IndexedDB's IDBDatabase.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+Test that you can't open a transaction while in a versionchange transaction
+Expecting exception from db.transaction(&quot;doesntExist&quot;)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.
+PASS db.version is 1
+PASS db.name is &quot;database-basics-private.html&quot;
+PASS db.objectStoreNames is []
+PASS db.objectStoreNames.length is 0
+PASS db.objectStoreNames.contains('') is false
+PASS db.objectStoreNames[0] is undefined.
+PASS db.objectStoreNames.item(0) is null
+db.createObjectStore(&quot;test123&quot;)
+PASS db.objectStoreNames is ['test123']
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('') is false
+PASS db.objectStoreNames.contains('test456') is false
+PASS db.objectStoreNames.contains('test123') is true
+db.close()
+request = indexedDB.open(dbname, 2)
+db = event.target.result
+PASS db.version is 2
+PASS db.name is &quot;database-basics-private.html&quot;
+PASS db.objectStoreNames is ['test123']
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('') is false
+PASS db.objectStoreNames.contains('test456') is false
+PASS db.objectStoreNames.contains('test123') is true
+db.createObjectStore(&quot;test456&quot;)
+setVersionTrans = event.target.transaction
+PASS setVersionTrans is non-null.
+setVersionTrans.abort()
+PASS db.version is 1
+PASS db.objectStoreNames is ['test123']
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('') is false
+PASS db.objectStoreNames.contains('test456') is false
+PASS db.objectStoreNames.contains('test123') is true
+db.close()
+Now that the connection is closed, transaction creation should fail
+Expecting exception from db.transaction('test123')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+Call twice, make sure it's harmless
+db.close()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasebasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasecloseprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-close-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-close-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-close-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+Test IndexedDB 'steps for closing a database connection'
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = connection.createObjectStore('store')
+store.put('value1', 'key1')
+store.put('value2', 'key2')
+
+testClose():
+Create transactions using connection:
+trans1 = connection.transaction('store')
+trans2 = connection.transaction('store')
+
+Close the connection:
+connection.close()
+Step 1: Set the internal closePending flag of connection to true. [Verified via side effects, below.]
+
+Step 2: Wait for all transactions created using connection to complete. Once they are complete, connection is closed.
+awaiting_transaction_count = 2
+trans1.objectStore('store').get('key1')
+trans2.objectStore('store').get('key2')
+
+NOTE: Once the closePending flag has been set to true no new transactions can be created using connection. All functions that create transactions first check the closePending flag first and throw an exception if it is true.
+
+Expecting exception from trans3 = connection.transaction('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+
+NOTE: Once the connection is closed, this can unblock the steps for deleting a database, which waits for connections to a given database to be closed before continuing.
+
+indexedDB.deleteDatabase(dbname)
+
+transaction #1 request successful
+PASS event.target.result is &quot;value1&quot;
+
+transaction #2 request successful
+PASS event.target.result is &quot;value2&quot;
+
+All transactions completed - database deletes should now be unblocked.
+
+delete database unblocked
+PASS awaiting_transaction_count is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasecloseprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-close-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-close-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-close-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-close.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabaseclosependingflagprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+Test IndexedDB IDBDatabase internal closePending flag
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = connection.createObjectStore('store')
+
+First, verify that the database connection is not closed:
+PASS transaction = connection.transaction('store') did not throw exception.
+
+Database closing steps
+&quot;1. Set the internal closePending flag of connection to true.&quot;
+connection.close()
+Expecting exception from connection.transaction('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+&quot;2. Wait for all transactions created using connection to complete. Once they are complete, connection is closed.&quot;
+transaction.oncomplete = testIDBDatabaseName
+
+IDBDatabase.name:
+&quot;The function must return this name even if the closePending flag is set on the connection.&quot;
+PASS connection.name is dbname
+
+IDBDatabase.objectStoreNames:
+&quot;Once the closePending flag is set on the connection, this function must return a snapshot of the list of names of the object stores taken at the time when the close method was called.&quot;
+request = indexedDB.open(dbname, 2)
+version_change_connection = request.result
+version_change_connection.createObjectStore('new_store')
+PASS version_change_connection.objectStoreNames.contains('new_store') is true
+PASS connection.objectStoreNames.contains('new_store') is false
+version_change_connection.close()
+
+IDBDatabase.transaction():
+&quot;...if this method is called on a IDBDatabase instance where the closePending flag is set, a InvalidStateError exception must be thrown.&quot;
+Expecting exception from connection.transaction('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+
+&quot;versionchange&quot; transaction steps:
+&quot;Fire a versionchange event at each object in openDatabases that is open. The event must not be fired on objects which has the closePending flag set.&quot;
+request = indexedDB.open(dbname)
+connection = request.result
+versionChangeWasFired = false
+connection.onversionchange = function () { versionChangeWasFired = true; }
+transaction = connection.transaction('store')
+connection.close()
+closePending is set, but active transaction will keep connection from closing
+request = indexedDB.open(dbname, 3)
+'blocked' event fired, letting transaction complete and connection close
+version_change_connection = request.result
+PASS versionChangeWasFired is false
+version_change_connection.close()
+
+Database deletion steps:
+&quot;Fire a versionchange event at each object in openDatabases that is open. The event must not be fired on objects which has the closePending flag set.&quot;
+request = indexedDB.open(dbname)
+connection = request.result
+versionChangeWasFired = false
+connection.onversionchange = function () { versionChangeWasFired = true; }
+transaction = connection.transaction('store')
+connection.close()
+closePending is set, but active transaction will keep connection from closing
+request = indexedDB.deleteDatabase(dbname)
+'blocked' event fired, letting transaction complete and connection close
+PASS versionChangeWasFired is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabaseclosependingflagprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-closepending-flag-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-closepending-flag.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasedeletependingflagprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IndexedDB IDBDatabase internal delete pending flag
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname, 5)
+connection.createObjectStore('store')
+PASS connection.objectStoreNames.length is 1
+
+Issue a delete request against the database - should be blocked by the open connection:
+deleteRequest = indexedDB.deleteDatabase(dbname)
+state = 0
+
+Open a second connection - should be delayed:
+openRequest = indexedDB.open(dbname)
+
+connection received versionchange event - ignoring.
+PASS ++state is 1
+
+deleteRequest received blocked event.
+PASS ++state is 2
+connection.close()
+deleteRequest should now be unblocked.
+
+deleteRequest received success event.
+PASS ++state is 3
+openRequest should now be unblocked.
+
+PASS openRequest received success event.
+PASS ++state is 4
+connection2 = openRequest.result
+connection2 should reference a different database:
+PASS connection2.version == connection.version is false
+PASS connection2.objectStoreNames.length is 0
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasedeletependingflagprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-deletepending-flag-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-deletepending-flag.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasenameundefinedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-name-undefined-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-name-undefined-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-name-undefined-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+Test IndexedDB undefined as record value
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS indexedDB.open(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasenameundefinedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-name-undefined-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-name-undefined-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-name-undefined-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-name-undefined.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabaseoddnamesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-odd-names-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-odd-names-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-odd-names-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+Test IndexedDB odd value datatypes
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+opening a database named null
+indexedDB.open(testData[nextToOpen].name)
+opening a database named faihu
+indexedDB.open(testData[nextToOpen].name)
+opening a database named unpaired surrogate
+indexedDB.open(testData[nextToOpen].name)
+opening a database named fffe
+indexedDB.open(testData[nextToOpen].name)
+opening a database named ffff
+indexedDB.open(testData[nextToOpen].name)
+opening a database named line separator
+indexedDB.open(testData[nextToOpen].name)
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabaseoddnamesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-odd-names-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-odd-names-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-odd-names-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-odd-names.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasequotaprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-quota-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-quota-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-quota-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+Tests IndexedDB's quota enforcing mechanism.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.open('database-quota')
+db = event.target.result
+db.setVersion('new version')
+setVersionSuccess():
+trans = event.target.result
+PASS trans !== null is true
+Deleted all object stores.
+PASS db.version is &quot;new version&quot;
+PASS db.name is &quot;database-quota&quot;
+PASS db.objectStoreNames is []
+PASS db.objectStoreNames.length is 0
+PASS db.objectStoreNames.contains('') is false
+db.createObjectStore(&quot;test123&quot;)
+PASS db.objectStoreNames is ['test123']
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('') is false
+PASS db.objectStoreNames.contains('test456') is false
+PASS db.objectStoreNames.contains('test123') is true
+trans = db.transaction(['test123'], 'readwrite')
+Creating 'data' which contains 64K of data
+PASS data.length is 65536
+store = trans.objectStore('test123')
+Error function called: (13) The transaction was aborted, so the request cannot be fulfilled.
+event.preventDefault()
+PASS Adding data failed due to quota error. Data added was about 5 MB
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasequotaprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-quota-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-quota-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-quota-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-quota.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasewrapperprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-wrapper-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-wrapper-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-wrapper-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+Ensure IDBDatabase wrapper isn't prematurely collected.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB.deleteDatabase(dbname)
+
+openDB():
+indexedDB.open(dbname, 1)
+
+onUpgradeNeeded():
+db = event.target.result
+db.createObjectStore('store').createIndex('index', 'keyPath')
+db = null
+
+openSuccess():
+sawVersionChangeEvent = false
+
+collectGarbage():
+self.gc()
+
+openAgain():
+indexedDB.open(dbname, 2)
+
+onVersionChange():
+event.target.close()
+sawVersionChangeEvent = true
+
+openAgainSuccess():
+PASS sawVersionChangeEvent is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdatabasewrapperprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/database-wrapper-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/database-wrapper-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/database-wrapper-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/database-wrapper.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletecloseddatabaseobjectprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+Ensure that IDBDatabase objects are deleted when there are no retaining paths left
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.close()
+indexedDB.open(dbname)
+Dropping references to new connection.
+gc()
+Open request should not receive a blocked event:
+indexedDB.open(dbname, 2)
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletecloseddatabaseobjectprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-closed-database-object-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/delete-closed-database-object.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinopensuccessprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time. The close() call to unblock the delete occurs in the open request's 'success' event handler.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+initiallyDeleted():
+request = indexedDB.open(dbname, 1)
+
+upgradeNeededCallback():
+PASS sawUpgradeNeeded is false
+sawUpgradeNeeded = true
+PASS event.oldVersion is 0
+PASS event.newVersion is 1
+db = event.target.result
+deleteRequest = indexedDB.deleteDatabase(dbname)
+request2.onsuccess = deleteSuccessCallback
+
+versionChangeCallback():
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+sawVersionChange = true
+
+deleteBlockedCallback():
+PASS sawVersionChange is true
+sawDeleteBlocked = true
+
+openSuccess():
+PASS sawUpgradeNeeded is true
+db = event.target.result
+PASS db.version is 1
+db.close()
+
+deleteSuccessCallback():
+PASS sawVersionChange is true
+PASS sawDeleteBlocked is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinopensuccessprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/delete-in-upgradeneeded-close-in-open-success.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinversionchangeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time. The close() call to unblock the delete occurs in the connection's 'versionchange' event handler.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+initiallyDeleted():
+request = indexedDB.open(dbname, 1)
+
+upgradeNeededCallback():
+PASS sawUpgradeNeeded is false
+sawUpgradeNeeded = true
+PASS event.oldVersion is 0
+PASS event.newVersion is 1
+db = event.target.result
+deleteRequest = indexedDB.deleteDatabase(dbname)
+request2.onsuccess = deleteSuccessCallback
+
+versionChangeCallback():
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+sawVersionChange = true
+Closing the connection before the IDBOpenDBRequest's success fires will cause the open to fail.
+db.close()
+
+deleteSuccessCallback():
+PASS sawVersionChange is true
+PASS sawDeleteBlocked is false
+PASS sawUpgradeNeeded is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteinupgradeneededcloseinversionchangeprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/delete-in-upgradeneeded-close-in-versionchange.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleterangeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-range-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-range-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-range-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,86 @@
</span><ins>+Test IndexedDB's IDBObjectStore.delete(IDBKeyRange) method.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store')
+
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+store.put(1,1)
+store.put(2,2)
+store.put(3,3)
+store.put(4,4)
+store.put(5,5)
+store.put(6,6)
+store.put(7,7)
+store.put(8,8)
+store.put(9,9)
+store.put(10,10)
+store.delete(IDBKeyRange.bound(3, 8, false, false))
+getting keys from store...
+expect: [1,2,9,10]
+actual: [1,2,9,10]
+PASS Match!
+
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+store.put(1,1)
+store.put(2,2)
+store.put(3,3)
+store.put(4,4)
+store.put(5,5)
+store.put(6,6)
+store.put(7,7)
+store.put(8,8)
+store.put(9,9)
+store.put(10,10)
+store.delete(IDBKeyRange.bound(3, 8, true, false))
+getting keys from store...
+expect: [1,2,3,9,10]
+actual: [1,2,3,9,10]
+PASS Match!
+
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+store.put(1,1)
+store.put(2,2)
+store.put(3,3)
+store.put(4,4)
+store.put(5,5)
+store.put(6,6)
+store.put(7,7)
+store.put(8,8)
+store.put(9,9)
+store.put(10,10)
+store.delete(IDBKeyRange.bound(3, 8, false, true))
+getting keys from store...
+expect: [1,2,8,9,10]
+actual: [1,2,8,9,10]
+PASS Match!
+
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+store.put(1,1)
+store.put(2,2)
+store.put(3,3)
+store.put(4,4)
+store.put(5,5)
+store.put(6,6)
+store.put(7,7)
+store.put(8,8)
+store.put(9,9)
+store.put(10,10)
+store.delete(IDBKeyRange.bound(3, 8, true, true))
+getting keys from store...
+expect: [1,2,3,8,9,10]
+actual: [1,2,3,8,9,10]
+PASS Match!
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleterangeprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/delete-range-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/delete-range-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-range-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/delete-range.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteIndexprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleteIndex-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleteIndex-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteIndex-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+Test IndexedDB deleteIndex method
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('foo');
+Expecting exception from objectStore.deleteIndex('first')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The specified index was not found.
+PASS objectStore.deleteIndex() threw exception TypeError: Not enough arguments.
+index = objectStore.createIndex('first', 'first');
+Expecting exception from objectStore.deleteIndex('FIRST')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The specified index was not found.
+index = objectStore.createIndex('second', 'second');
+returnValue = objectStore.deleteIndex('first');
+PASS returnValue is undefined
+Expecting exception from db.createObjectStore('bar');
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+Expecting exception from objectStore.deleteIndex('second')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The transaction is inactive or finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteIndexprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleteIndex-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleteIndex-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteIndex-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deleteIndex.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteObjectStorenameargumentrequiredprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+Test IndexedDB deleteObjectStore required argument
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+PASS db.deleteObjectStore(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteObjectStorenameargumentrequiredprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteObjectStore-name-argument-required-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deleteObjectStore-name-argument-required.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteObjectStorenullnameprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+Test IndexedDB deleteObjectStore required argument
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('null');
+db.deleteObjectStore(null);
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeleteObjectStorenullnameprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleteObjectStore-null-name-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deleteObjectStore-null-name.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedobjectsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleted-objects-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleted-objects-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleted-objects-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,378 @@
</span><ins>+Test that IndexedDB objects that have been deleted throw exceptions
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+testStore():
+deletedStore = connection.createObjectStore('deletedStore')
+connection.deleteObjectStore('deletedStore')
+
+Expecting exception from deletedStore.put(0, 0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to store record in an IDBObjectStore: The object store has been deleted.
+Expecting exception from deletedStore.add(0, 0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to store record in an IDBObjectStore: The object store has been deleted.
+Expecting exception from deletedStore.delete(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.delete(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.get(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.get(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.clear()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'clear' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.openCursor()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.openCursor(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.openCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.openCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.openCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.createIndex('name', 'path')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.index('name')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.deleteIndex('name')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.count()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.count(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The object store has been deleted.
+Expecting exception from deletedStore.count(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The object store has been deleted.
+
+testIndex():
+store = connection.createObjectStore('store')
+deletedIndex = store.createIndex('deletedIndex', 'path')
+store.deleteIndex('deletedIndex')
+
+Expecting exception from deletedIndex.openCursor()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openCursor(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openKeyCursor()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openKeyCursor(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openKeyCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openKeyCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.openKeyCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.get(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.get(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.getKey(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.getKey(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.count()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.count(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from deletedIndex.count(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.
+
+testTransitiveDeletion():
+deletedStore = connection.createObjectStore('deletedStore')
+indexOfDeletedStore = deletedStore.createIndex('index', 'path')
+connection.deleteObjectStore('deletedStore')
+
+Expecting exception from indexOfDeletedStore.openCursor()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openCursor(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openKeyCursor()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openKeyCursor(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openKeyCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openKeyCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.openKeyCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.get(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.get(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.getKey(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.getKey(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.count()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.count(0)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.
+Expecting exception from indexOfDeletedStore.count(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The index or its object store has been deleted.
+
+testObjectStoreCursor():
+deletedStore = connection.createObjectStore('deletedStore')
+deletedStore.put(0, 0)
+deletedStore.openCursor()
+cursor = request.result
+PASS cursor.key is 0
+PASS cursor.value is 0
+connection.deleteObjectStore('deletedStore')
+Expecting exception from cursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.update(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.advance(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'advance' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+
+testIndexCursor():
+store.put({id: 123}, 0)
+deletedIndex = store.createIndex('deletedIndex', 'id')
+deletedIndex.openCursor()
+cursor = request.result
+PASS cursor.key is 123
+PASS cursor.primaryKey is 0
+store.deleteIndex('deletedIndex')
+Expecting exception from cursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.update(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.advance(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'advance' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+
+testIndexOfDeletedStoreCursor():
+deletedStore = connection.createObjectStore('deletedStore')
+deletedStore.put({id: 123}, 0)
+index = deletedStore.createIndex('index', 'id')
+index.openCursor()
+cursor = request.result
+PASS cursor.key is 123
+PASS cursor.primaryKey is 0
+connection.deleteObjectStore('deletedStore')
+Expecting exception from cursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.update(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+Expecting exception from cursor.advance(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'advance' on 'IDBCursor': The cursor's source or effective object store has been deleted.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedobjectsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deleted-objects-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deleted-objects-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deleted-objects-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deleted-objects.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabaseblockedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+Test that deleteDatabase is blocked on open connections
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+blockedEventFired = false
+indexedDB.open(dbname)
+
+openOnSuccess():
+h = event.target.result
+indexedDB.deleteDatabase(dbname)
+
+onVersionChange():
+PASS event.target.version is 1
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+
+deleteDatabaseOnBlocked():
+blockedEventFired = true
+h.close()
+
+deleteDatabaseOnSuccess():
+PASS blockedEventFired is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabaseblockedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-blocked-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deletedatabase-blocked.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabasedelayedbyopenandversionchangeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+Test that deleteDatabase is delayed if a VERSION_CHANGE transaction is running
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+versionChangeComplete = false
+h = event.target.result
+indexedDB.deleteDatabase(dbname)
+
+onVersionChange():
+PASS event.target.version is 1
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+
+deleteDatabaseOnBlocked():
+
+transactionOnComplete():
+versionChangeComplete = true
+
+onOpenSuccess():
+h = event.target.result
+h.close()
+
+deleteDatabaseOnSuccess():
+PASS versionChangeComplete is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabasedelayedbyopenandversionchangeprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deletedatabase-delayed-by-open-and-versionchange.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabasedelayedbyversionchangeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+Test the order when there are pending setVersion, delete and open calls.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+h1OpenSuccess():
+setVersionBlockedEventFired = false
+versionChangeComplete = false
+deleteDatabaseBlockedEventFired = false
+deleteDatabaseComplete = false
+h1 = event.target.result
+Open h2:
+indexedDB.open(dbname)
+
+h2OpenSuccess():
+Try to open h3:
+indexedDB.open(dbname, 2)
+indexedDB.deleteDatabase(dbname)
+
+h1OnVersionChange():
+PASS event.target.version is 1
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+
+h2OnVersionChange():
+PASS event.target.version is 1
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+
+h3Blocked():
+setVersionBlockedEventFired = true
+Try to open h4:
+indexedDB.open(dbname)
+h2.close()
+
+h1SecondOnVersionChange():
+PASS event.target.version is 1
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+
+deleteDatabaseOnBlocked():
+deleteDatabaseBlockedEventFired = true
+h1.close()
+
+h3OnUpgradeneeded():
+
+transactionOnComplete():
+versionChangeComplete = true
+
+h3OpenSuccess():
+h3.close()
+
+deleteDatabaseOnSuccess():
+deleteDatabaseComplete = true
+
+h4OpenSuccess():
+PASS setVersionBlockedEventFired is true
+PASS versionChangeComplete is true
+PASS deleteDatabaseBlockedEventFired is true
+PASS deleteDatabaseComplete is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabasenotblockedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,26 @@
</span><ins>+Test that deleteDatabase is not blocked when connections close in on versionchange callback
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+blockedEventFired = false
+indexedDB.open(dbname)
+
+openOnSuccess():
+h = event.target.result
+indexedDB.deleteDatabase(dbname)
+
+onVersionChange():
+PASS event.target.version is 1
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+h.close()
+
+deleteDatabaseOnSuccess():
+PASS blockedEventFired is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdeletedatabasenotblockedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/deletedatabase-not-blocked.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdontwedgeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/dont-wedge-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/dont-wedge-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/dont-wedge-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+Check that a page reloaded during an in-flight upgradeneeded event doesn't hang.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+dbname1 = dbname + '1'
+dbname2 = dbname + '2'
+
+deleteDatabase1():
+indexedDB.deleteDatabase(dbname1)
+In a multi process implementation this deleteDatabase may be blocked temporarily, so we don't check for either the presence or absence of a blocked event.
+
+deleteDatabase2():
+indexedDB.deleteDatabase(dbname2)
+
+openDatabase1():
+indexedDB.open(dbname1, 1)
+
+openOnUpgradeNeeded1():
+db1 = event.target.result
+store1 = db1.createObjectStore('store')
+store1.put(0, 0)
+
+openOnSuccess1():
+PASS isAfterReload() is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbdontwedgeprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/dont-wedge-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/dont-wedge-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/dont-wedge-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/dont-wedge.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbduplicatesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/duplicates-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/duplicates-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/duplicates-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+Verify that you can put the same data in 2 different databases without uniqueness constraints firing.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('storeName', null)
+store.createIndex('indexName', 'x')
+store.add({x: 'value', y: 'zzz'}, 'key')
+event.target.source.add({x: 'value2', y: 'zzz2'}, 'key2')
+indexObject.getKey('value')
+PASS event.target.result is &quot;key&quot;
+indexObject.get('value')
+PASS event.target.result.x is &quot;value&quot;
+PASS event.target.result.y is &quot;zzz&quot;
+indexObject.getKey('does not exist')
+PASS event.target.result is undefined
+indexObject.get('does not exist')
+PASS event.target.result is undefined
+indexObject.openKeyCursor()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value&quot;
+PASS event.target.result.primaryKey is &quot;key&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value2&quot;
+PASS event.target.result.primaryKey is &quot;key2&quot;
+event.target.result.continue()
+PASS event.target.result is null
+indexObject.openCursor()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value&quot;
+PASS event.target.result.value.x is &quot;value&quot;
+PASS event.target.result.value.y is &quot;zzz&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value2&quot;
+PASS event.target.result.value.x is &quot;value2&quot;
+PASS event.target.result.value.y is &quot;zzz2&quot;
+event.target.result.continue()
+PASS event.target.result is null
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('storeName', null)
+store.createIndex('indexName', 'x')
+store.add({x: 'value', y: 'zzz'}, 'key')
+event.target.source.add({x: 'value2', y: 'zzz2'}, 'key2')
+indexObject.getKey('value')
+PASS event.target.result is &quot;key&quot;
+indexObject.get('value')
+PASS event.target.result.x is &quot;value&quot;
+PASS event.target.result.y is &quot;zzz&quot;
+indexObject.getKey('does not exist')
+PASS event.target.result is undefined
+indexObject.get('does not exist')
+PASS event.target.result is undefined
+indexObject.openKeyCursor()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value&quot;
+PASS event.target.result.primaryKey is &quot;key&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value2&quot;
+PASS event.target.result.primaryKey is &quot;key2&quot;
+event.target.result.continue()
+PASS event.target.result is null
+indexObject.openCursor()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value&quot;
+PASS event.target.result.value.x is &quot;value&quot;
+PASS event.target.result.value.y is &quot;zzz&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value2&quot;
+PASS event.target.result.value.x is &quot;value2&quot;
+PASS event.target.result.value.y is &quot;zzz2&quot;
+event.target.result.continue()
+PASS event.target.result is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbduplicatesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/duplicates-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/duplicates-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/duplicates-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/duplicates.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddberrorcausesabortbydefaultprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+Verify that a transaction with an error aborts unless preventDefault() is called.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+setVersionSuccess():
+trans = event.target.transaction
+PASS trans is non-null.
+db.createObjectStore('storeName', null)
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = unexpectedAbortCallback
+trans.oncomplete = transactionCompleted
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+event.target.source.add({x: 'value', y: 'zzz'}, 'key')
+event.preventDefault()
+PASS Transaction completed
+
+
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted1
+trans.oncomplete = unexpectedCompleteCallback
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+Doing nothing to prevent the default action...
+PASS Transaction aborted
+
+
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted2
+trans.oncomplete = unexpectedCompleteCallback
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+Omitting an onerror handler
+PASS Transaction aborted
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddberrorcausesabortbydefaultprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/error-causes-abort-by-default-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/error-causes-abort-by-default.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbeventsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/events-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/events-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/events-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+Test IndexedDB's event interfaces.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS 'IDBVersionChangeEvent' in self is true
+PASS 'oldVersion' in document.createEvent('IDBVersionChangeEvent') is true
+PASS 'newVersion' in document.createEvent('IDBVersionChangeEvent') is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbeventsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/events-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/events-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/events-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/events.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbexceptionineventabortsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,57 @@
</span><ins>+Test exceptions in IDBRequest handlers cause aborts.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.add({x: 'value', y: 'zzz'}, 'key')
+
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted1
+trans.oncomplete = unexpectedCompleteCallback
+store = trans.objectStore('storeName')
+store.add({x: 'value2', y: 'zzz2'}, 'key2')
+
+event.preventDefault()
+Throwing
+
+PASS Got expected error: 'this exception is expected'
+PASS The transaction was aborted.
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted2
+trans.oncomplete = unexpectedCompleteCallback
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+
+event.preventDefault()
+Throwing
+
+PASS Got expected error: 'this exception is expected'
+PASS The transaction was aborted.
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = unexpectedAbortCallback
+trans.oncomplete = transactionCompleted1
+store = trans.objectStore('storeName')
+store.add({x: 'value3', y: 'zzz3'}, 'key3')
+
+event.preventDefault()
+Throwing within a try block
+
+PASS The transaction completed.
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = unexpectedAbortCallback
+trans.oncomplete = transactionCompleted2
+store = trans.objectStore('storeName')
+store.add({x: 'value4', y: 'zzz4'}, 'key4')
+PASS key4 added
+
+PASS The transaction completed.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbexceptionineventabortsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/exception-in-event-aborts-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/exception-in-event-aborts.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbexceptionsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/exceptions-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/exceptions-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/exceptions-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,552 @@
</span><ins>+Test that expected exceptions are thrown per IndexedDB spec.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+index = store.createIndex('index', 'id')
+store.put({id: 'a'}, 1)
+store.put({id: 'b'}, 2)
+store.put({id: 'c'}, 3)
+store.put({id: 'd'}, 4)
+store.put({id: 'e'}, 5)
+store.put({id: 'f'}, 6)
+store.put({id: 'g'}, 7)
+store.put({id: 'h'}, 8)
+store.put({id: 'i'}, 9)
+store.put({id: 'j'}, 10)
+otherStore = db.createObjectStore('otherStore')
+inlineKeyStore = db.createObjectStore('inlineKeyStore', {keyPath: 'id'})
+request = inlineKeyStore.put({id: 0})
+PASS request.readyState is &quot;pending&quot;
+
+3.2.1 The IDBRequest Interface
+
+IDBRequest.error
+When the done flag is false, getting this property must throw a DOMException of type InvalidStateError.
+Expecting exception from request.error
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to read the 'error' property from 'IDBRequest': The request has not finished.
+
+IDBRequest.result
+When the done flag is false, getting this property must throw a DOMException of type InvalidStateError.
+Expecting exception from request.result
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to read the 'result' property from 'IDBRequest': The request has not finished.
+
+3.2.3 Opening a database
+
+IDBFactory.cmp()
+One of the supplied keys was not a valid key.
+Expecting exception from indexedDB.cmp(null, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+db.close()
+
+3.2.4 Database
+indexedDB.open(dbname, 2)
+
+IDBDatabase.createObjectStore()
+If an objectStore with the same name already exists, the implementation must throw a DOMException of type ConstraintError.
+Expecting exception from db.createObjectStore('store')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ConstraintError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': An object store with the specified name already exists.
+If keyPath is not a valid key path then a DOMException of type SyntaxError must be thrown.
+Expecting exception from db.createObjectStore('fail', {keyPath: '-invalid-'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+PASS ename is 'SyntaxError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+If the optionalParameters parameter is specified, and autoIncrement is set to true, and the keyPath parameter is specified to the empty string, or specified to an Array, this function must throw a InvalidAccessError exception.
+Expecting exception from db.createObjectStore('fail', {autoIncrement: true, keyPath: ''})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+PASS ename is 'InvalidAccessError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
+Expecting exception from db.createObjectStore('fail', {autoIncrement: true, keyPath: ['a']})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+PASS ename is 'InvalidAccessError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
+
+IDBDatabase.deleteObjectStore()
+There is no object store with the given name, compared in a case-sensitive manner, in the connected database.
+Expecting exception from db.deleteObjectStore('no-such-store')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'deleteObjectStore' on 'IDBDatabase': The specified object store was not found.
+
+IDBDatabase.transaction()
+If this method is called on IDBDatabase object for which a &quot;versionchange&quot; transaction is still running, a InvalidStateError exception must be thrown.
+Expecting exception from db.transaction('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.
+One of the names provided in the storeNames argument doesn't exist in this database.
+Expecting exception from db.transaction('no-such-store')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+The value for the mode parameter is invalid.
+Expecting TypeError exception from db.transaction('store', 'invalid-mode')
+PASS Exception was thrown.
+PASS db.transaction('store', 'invalid-mode') threw TypeError: Failed to execute 'transaction' on 'IDBDatabase': The mode provided ('invalid-mode') is not one of 'readonly' or 'readwrite'.
+The function was called with an empty list of store names
+Expecting exception from db.transaction([])
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+PASS ename is 'InvalidAccessError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The storeNames parameter was empty.
+
+One more IDBDatabase.createObjectStore() test:
+If this function is called from outside a &quot;versionchange&quot; transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
+Expecting exception from db.createObjectStore('fail')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+
+One more IDBDatabase.deleteObjectStore() test:
+If this function is called from outside a &quot;versionchange&quot; transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
+Expecting exception from db.deleteObjectStore('fail')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteObjectStore' on 'IDBDatabase': The database is not running a version change transaction.
+
+Prepare an object store and index from an inactive transaction for later use.
+finishedTransaction = inactiveTransaction = db.transaction('store')
+storeFromInactiveTransaction = inactiveTransaction.objectStore('store')
+indexFromInactiveTransaction = storeFromInactiveTransaction.index('index')
+request = storeFromInactiveTransaction.openCursor()
+cursorFromInactiveTransaction = request.result
+
+3.2.5 Object Store
+ro_transaction = db.transaction('store', 'readonly')
+storeFromReadOnlyTransaction = ro_transaction.objectStore('store')
+rw_transaction = db.transaction('store', 'readwrite')
+store = rw_transaction.objectStore('store')
+
+IDBObjectStore.add()
+This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to &quot;readonly&quot;.
+Expecting exception from storeFromReadOnlyTransaction.add(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is read-only.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.add(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+The data being stored could not be cloned by the internal structured cloning algorithm.
+Expecting exception from store.add(self, 0)
+PASS Exception was thrown.
+PASS code is DOMException.DATA_CLONE_ERR
+Exception message: Failed to store record in an IDBObjectStore: An object could not be cloned.
+
+IDBObjectStore.clear()
+This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to &quot;readonly&quot;.
+Expecting exception from storeFromReadOnlyTransaction.clear()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is read-only.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.clear()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is inactive or finished.
+
+IDBObjectStore.count()
+If the optional key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from store.count({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The parameter is not a valid key.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.count()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The transaction is inactive or finished.
+
+IDBObjectStore.delete()
+This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to &quot;readonly&quot;.
+Expecting exception from storeFromReadOnlyTransaction.delete(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is read-only.
+If the key parameter is not a valid key or a key range this method throws a DOMException of type DataError.
+Expecting exception from store.delete({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The parameter is not a valid key.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.add(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+
+IDBObjectStore.get()
+If the key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from store.get({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The parameter is not a valid key.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction is inactive or finished.
+
+IDBObjectStore.index()
+There is no index with the given name, compared in a case-sensitive manner, in the connected database.
+Expecting exception from store.index('no-such-index')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The specified index was not found.
+Occurs if a request is made on a source object that has been deleted or removed, or if the transaction the object store belongs to has finished.
+Expecting exception from storeFromInactiveTransaction.index('index')
+PASS Exception was thrown.
+PASS code is 11
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The transaction is finished.
+
+IDBObjectStore.openCursor()
+If the range parameter is specified but is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from store.openCursor({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The parameter is not a valid key.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+The value for the direction parameter is invalid.
+Expecting TypeError exception from store.openCursor(0, 'invalid-direction')
+PASS Exception was thrown.
+PASS store.openCursor(0, 'invalid-direction') threw TypeError: Type error
+
+IDBObjectStore.put()
+This method throws a DOMException of type ReadOnlyError if the transaction which this IDBObjectStore belongs to is has its mode set to &quot;readonly&quot;.
+Expecting exception from storeFromReadOnlyTransaction.put(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is read-only.
+The transaction this IDBObjectStore belongs to is not active.
+Expecting exception from storeFromInactiveTransaction.put(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+The data being stored could not be cloned by the internal structured cloning algorithm.
+Expecting exception from store.put(self, 0)
+PASS Exception was thrown.
+PASS code is DOMException.DATA_CLONE_ERR
+Exception message: Failed to store record in an IDBObjectStore: An object could not be cloned.
+db.close()
+ro_transaction.oncomplete = transactionComplete
+rw_transaction.oncomplete = transactionComplete
+
+transactionComplete():
+First transaction completed
+
+transactionComplete():
+request = indexedDB.open(dbname, 3)
+request.onupgradeneeded = onUpgradeNeeded3
+
+IDBObjectStore.createIndex()
+If an index with the same name already exists, the implementation must throw a DOMException of type ConstraintError. 
+Expecting exception from store.createIndex('index', 'keyPath')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ConstraintError'
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': An index with the specified name already exists.
+If keyPath is not a valid key path then a DOMException of type SyntaxError must be thrown.
+Expecting exception from store.createIndex('fail', '-invalid-')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+PASS ename is 'SyntaxError'
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+If keyPath is an Array and the multiEntry property in the optionalParameters is true, then a DOMException of type InvalidAccessError must be thrown.
+Expecting exception from store.createIndex('fail', ['a'], {multiEntry: true})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+PASS ename is 'InvalidAccessError'
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument was an array and the multiEntry option is true.
+
+IDBObjectStore.deleteIndex()
+There is no index with the given name, compared in a case-sensitive manner, in the connected database.
+Expecting exception from store.deleteIndex('no-such-index')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The specified index was not found.
+
+One more IDBObjectStore.createIndex() test:
+If this function is called from outside a &quot;versionchange&quot; transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
+Expecting exception from db.transaction('store').objectStore('store').createIndex('fail', 'keyPath')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The database is not running a version change transaction.
+
+One more IDBObjectStore.deleteIndex() test:
+If this function is called from outside a &quot;versionchange&quot; transaction callback ... the implementation must throw a DOMException of type InvalidStateError.
+Expecting exception from db.transaction('store').objectStore('store').deleteIndex('fail', 'keyPath')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The database is not running a version change transaction.
+
+3.2.6 Index
+indexFromReadOnlyTransaction = db.transaction('store', 'readonly').objectStore('store').index('index')
+index = db.transaction('store', 'readwrite').objectStore('store').index('index')
+
+IDBIndex.count()
+If the optional key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from index.count({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The parameter is not a valid key.
+The transaction this IDBIndex belongs to is not active.
+Expecting exception from indexFromInactiveTransaction.count()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.
+
+IDBIndex.get()
+If the key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from index.get({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The parameter is not a valid key.
+The transaction this IDBIndex belongs to is not active.
+Expecting exception from indexFromInactiveTransaction.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The transaction is inactive or finished.
+
+IDBIndex.getKey()
+If the key parameter is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from index.getKey({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The parameter is not a valid key.
+The transaction this IDBIndex belongs to is not active.
+Expecting exception from indexFromInactiveTransaction.getKey(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The transaction is inactive or finished.
+
+IDBIndex.openCursor()
+If the range parameter is specified but is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from index.openCursor({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The parameter is not a valid key.
+The transaction this IDBIndex belongs to is not active.
+Expecting exception from indexFromInactiveTransaction.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+The value for the direction parameter is invalid.
+Expecting TypeError exception from index.openCursor(0, 'invalid-direction')
+PASS Exception was thrown.
+PASS index.openCursor(0, 'invalid-direction') threw TypeError: Failed to execute 'openCursor' on 'IDBIndex': The direction provided ('invalid-direction') is not one of 'next', 'nextunique', 'prev', or 'prevunique'.
+
+IDBIndex.openKeyCursor()
+If the range parameter is specified but is not a valid key or a key range, this method throws a DOMException of type DataError.
+Expecting exception from index.openKeyCursor({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The parameter is not a valid key.
+The transaction this IDBIndex belongs to is not active.
+Expecting exception from indexFromInactiveTransaction.openKeyCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+The value for the direction parameter is invalid.
+Expecting TypeError exception from index.openKeyCursor(0, 'invalid-direction')
+PASS Exception was thrown.
+PASS index.openKeyCursor(0, 'invalid-direction') threw TypeError: Failed to execute 'openKeyCursor' on 'IDBIndex': The direction provided ('invalid-direction') is not one of 'next', 'nextunique', 'prev', or 'prevunique'.
+
+3.2.7 Cursor
+transaction = db.transaction(['store', 'inlineKeyStore'], 'readwrite')
+request = transaction.objectStore('store').openCursor()
+cursor = request.result
+request = transaction.objectStore('store').index('index').openKeyCursor()
+keyCursor = request.result
+request = transaction.objectStore('store').openCursor(IDBKeyRange.lowerBound(-Infinity), 'prev')
+reverseCursor = request.result
+request = transaction.objectStore('inlineKeyStore').openCursor()
+inlineCursor = request.result
+
+IDBCursor.advance()
+Calling this method more than once before new cursor data has been loaded is not allowed and results in a DOMException of type InvalidStateError being thrown.
+If the value for count is 0 (zero) or a negative number, this method must throw a JavaScript TypeError exception.
+Expecting TypeError exception from cursor.advance(0)
+PASS Exception was thrown.
+PASS cursor.advance(0) threw TypeError: Failed to execute 'advance' on 'IDBCursor': A count argument with value 0 (zero) was supplied, must be greater than 0.
+cursor.advance(1)
+Expecting exception from cursor.advance(1)
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'advance' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+The transaction this IDBCursor belongs to is not active.
+Expecting exception from cursorFromInactiveTransaction.advance(1)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'advance' on 'IDBCursor': The transaction is inactive or finished.
+
+IDBCursor.continue()
+The parameter is not a valid key.
+Expecting exception from cursor.continue({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is not a valid key.
+The parameter is less than or equal to this cursor's position and this cursor's direction is &quot;next&quot; or &quot;nextunique&quot;.
+Expecting exception from cursor.continue(-Infinity)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is less than or equal to this cursor's position.
+The parameter is greater than or equal to this cursor's position and this cursor's direction is &quot;prev&quot; or &quot;prevunique&quot;.
+Expecting exception from reverseCursor.continue(100)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is greater than or equal to this cursor's position.
+Calling this method more than once before new cursor data has been loaded is not allowed and results in a DOMException of type InvalidStateError being thrown.
+cursor.continue()
+Expecting exception from cursor.continue()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
+The transaction this IDBCursor belongs to is not active.
+Expecting exception from cursorFromInactiveTransaction.continue()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The transaction is inactive or finished.
+
+IDBCursor.delete()
+If this cursor's got value flag is false, or if this cursor was created using openKeyCursor a DOMException of type InvalidStateError is thrown.
+Expecting exception from keyCursor.delete()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is a key cursor.
+The transaction this IDBCursor belongs to is not active.
+Expecting exception from cursorFromInactiveTransaction.delete()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The transaction is inactive or finished.
+
+IDBCursor.update()
+If this cursor's got value flag is false or if this cursor was created using openKeyCursor. This method throws a DOMException of type InvalidStateError.
+Expecting exception from keyCursor.update({})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor.
+If the effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key, this method throws a DOMException of type DataError.
+Expecting exception from inlineCursor.update({id: 1})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key.
+If the structured clone algorithm throws an exception, that exception is rethrown.
+Expecting exception from cursor.update(self)
+PASS Exception was thrown.
+PASS code is DOMException.DATA_CLONE_ERR
+Exception message: Failed to store record in an IDBObjectStore: An object could not be cloned.
+The transaction this IDBCursor belongs to is not active.
+Expecting exception from cursorFromInactiveTransaction.update({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The transaction is inactive or finished.
+readOnlyTransaction = db.transaction('store', 'readonly')
+request = readOnlyTransaction.objectStore('store').openCursor()
+cursorFromReadOnlyTransaction = request.result
+
+One more IDBCursor.delete() test:
+This method throws a DOMException of type ReadOnlyError if the transaction which this IDBCursor belongs to has its mode set to &quot;readonly&quot;.
+Expecting exception from cursorFromReadOnlyTransaction.delete()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The record may not be deleted inside a read-only transaction.
+
+One more IDBCursor.update() test:
+This method throws a DOMException of type ReadOnlyError if the transaction which this IDBCursor belongs to has its mode set to &quot;readonly&quot;.
+Expecting exception from cursorFromReadOnlyTransaction.update({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction.
+
+3.2.8 Transaction
+
+IDBTransaction.abort()
+If this transaction is finished, throw a DOMException of type InvalidStateError. 
+Expecting exception from finishedTransaction.abort()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'abort' on 'IDBTransaction': The transaction is inactive or finished.
+If the requested object store is not in this transaction's scope.
+Expecting exception from db.transaction('store').objectStore('otherStore')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbexceptionsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/exceptions-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/exceptions-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/exceptions-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/exceptions.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbfactorycmpprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/factory-cmp-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/factory-cmp-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/factory-cmp-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,1025 @@
</span><ins>+Test IndexedDB key comparison using IDBFactory.cmp().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS typeof indexedDB.cmp is &quot;function&quot;
+
+compare valid keys
+PASS indexedDB.cmp(-Infinity,-Number.MAX_VALUE) is -1
+PASS indexedDB.cmp(-Number.MAX_VALUE,-Infinity) is 1
+PASS indexedDB.cmp(-Infinity,-Infinity) is 0
+PASS indexedDB.cmp(-Number.MAX_VALUE,-Number.MAX_VALUE) is 0
+PASS indexedDB.cmp(-Number.MAX_VALUE,-1) is -1
+PASS indexedDB.cmp(-1,-Number.MAX_VALUE) is 1
+PASS indexedDB.cmp(-Number.MAX_VALUE,-Number.MAX_VALUE) is 0
+PASS indexedDB.cmp(-1,-1) is 0
+PASS indexedDB.cmp(-1,-Number.MIN_VALUE) is -1
+PASS indexedDB.cmp(-Number.MIN_VALUE,-1) is 1
+PASS indexedDB.cmp(-1,-1) is 0
+PASS indexedDB.cmp(-Number.MIN_VALUE,-Number.MIN_VALUE) is 0
+PASS indexedDB.cmp(-Number.MIN_VALUE,0) is -1
+PASS indexedDB.cmp(0,-Number.MIN_VALUE) is 1
+PASS indexedDB.cmp(-Number.MIN_VALUE,-Number.MIN_VALUE) is 0
+PASS indexedDB.cmp(0,0) is 0
+PASS indexedDB.cmp(0,Number.MIN_VALUE) is -1
+PASS indexedDB.cmp(Number.MIN_VALUE,0) is 1
+PASS indexedDB.cmp(0,0) is 0
+PASS indexedDB.cmp(Number.MIN_VALUE,Number.MIN_VALUE) is 0
+PASS indexedDB.cmp(Number.MIN_VALUE,1) is -1
+PASS indexedDB.cmp(1,Number.MIN_VALUE) is 1
+PASS indexedDB.cmp(Number.MIN_VALUE,Number.MIN_VALUE) is 0
+PASS indexedDB.cmp(1,1) is 0
+PASS indexedDB.cmp(1,Number.MAX_VALUE) is -1
+PASS indexedDB.cmp(Number.MAX_VALUE,1) is 1
+PASS indexedDB.cmp(1,1) is 0
+PASS indexedDB.cmp(Number.MAX_VALUE,Number.MAX_VALUE) is 0
+PASS indexedDB.cmp(Number.MAX_VALUE,Infinity) is -1
+PASS indexedDB.cmp(Infinity,Number.MAX_VALUE) is 1
+PASS indexedDB.cmp(Number.MAX_VALUE,Number.MAX_VALUE) is 0
+PASS indexedDB.cmp(Infinity,Infinity) is 0
+PASS indexedDB.cmp(Infinity,new Date(0)) is -1
+PASS indexedDB.cmp(new Date(0),Infinity) is 1
+PASS indexedDB.cmp(Infinity,Infinity) is 0
+PASS indexedDB.cmp(new Date(0),new Date(0)) is 0
+PASS indexedDB.cmp(new Date(0),new Date(1000)) is -1
+PASS indexedDB.cmp(new Date(1000),new Date(0)) is 1
+PASS indexedDB.cmp(new Date(0),new Date(0)) is 0
+PASS indexedDB.cmp(new Date(1000),new Date(1000)) is 0
+PASS indexedDB.cmp(new Date(1000),new Date(1317399931023)) is -1
+PASS indexedDB.cmp(new Date(1317399931023),new Date(1000)) is 1
+PASS indexedDB.cmp(new Date(1000),new Date(1000)) is 0
+PASS indexedDB.cmp(new Date(1317399931023),new Date(1317399931023)) is 0
+PASS indexedDB.cmp(new Date(1317399931023),'') is -1
+PASS indexedDB.cmp('',new Date(1317399931023)) is 1
+PASS indexedDB.cmp(new Date(1317399931023),new Date(1317399931023)) is 0
+PASS indexedDB.cmp('','') is 0
+PASS indexedDB.cmp('','\0') is -1
+PASS indexedDB.cmp('\0','') is 1
+PASS indexedDB.cmp('','') is 0
+PASS indexedDB.cmp('\0','\0') is 0
+PASS indexedDB.cmp('\0','a') is -1
+PASS indexedDB.cmp('a','\0') is 1
+PASS indexedDB.cmp('\0','\0') is 0
+PASS indexedDB.cmp('a','a') is 0
+PASS indexedDB.cmp('a','aa') is -1
+PASS indexedDB.cmp('aa','a') is 1
+PASS indexedDB.cmp('a','a') is 0
+PASS indexedDB.cmp('aa','aa') is 0
+PASS indexedDB.cmp('aa','b') is -1
+PASS indexedDB.cmp('b','aa') is 1
+PASS indexedDB.cmp('aa','aa') is 0
+PASS indexedDB.cmp('b','b') is 0
+PASS indexedDB.cmp('b','ba') is -1
+PASS indexedDB.cmp('ba','b') is 1
+PASS indexedDB.cmp('b','b') is 0
+PASS indexedDB.cmp('ba','ba') is 0
+PASS indexedDB.cmp('ba','¢') is -1
+PASS indexedDB.cmp('¢','ba') is 1
+PASS indexedDB.cmp('ba','ba') is 0
+PASS indexedDB.cmp('¢','¢') is 0
+PASS indexedDB.cmp('¢','水') is -1
+PASS indexedDB.cmp('水','¢') is 1
+PASS indexedDB.cmp('¢','¢') is 0
+PASS indexedDB.cmp('水','水') is 0
+PASS indexedDB.cmp('水','𝄞') is -1
+PASS indexedDB.cmp('𝄞','水') is 1
+PASS indexedDB.cmp('水','水') is 0
+PASS indexedDB.cmp('𝄞','𝄞') is 0
+PASS indexedDB.cmp('𝄞','�') is -1
+PASS indexedDB.cmp('�','𝄞') is 1
+PASS indexedDB.cmp('𝄞','𝄞') is 0
+PASS indexedDB.cmp('�','�') is 0
+PASS indexedDB.cmp('�',[]) is -1
+PASS indexedDB.cmp([],'�') is 1
+PASS indexedDB.cmp('�','�') is 0
+PASS indexedDB.cmp([],[]) is 0
+PASS indexedDB.cmp([],[-Infinity]) is -1
+PASS indexedDB.cmp([-Infinity],[]) is 1
+PASS indexedDB.cmp([],[]) is 0
+PASS indexedDB.cmp([-Infinity],[-Infinity]) is 0
+PASS indexedDB.cmp([-Infinity],[-Number.MAX_VALUE]) is -1
+PASS indexedDB.cmp([-Number.MAX_VALUE],[-Infinity]) is 1
+PASS indexedDB.cmp([-Infinity],[-Infinity]) is 0
+PASS indexedDB.cmp([-Number.MAX_VALUE],[-Number.MAX_VALUE]) is 0
+PASS indexedDB.cmp([-Number.MAX_VALUE],[-1]) is -1
+PASS indexedDB.cmp([-1],[-Number.MAX_VALUE]) is 1
+PASS indexedDB.cmp([-Number.MAX_VALUE],[-Number.MAX_VALUE]) is 0
+PASS indexedDB.cmp([-1],[-1]) is 0
+PASS indexedDB.cmp([-1],[-Number.MIN_VALUE]) is -1
+PASS indexedDB.cmp([-Number.MIN_VALUE],[-1]) is 1
+PASS indexedDB.cmp([-1],[-1]) is 0
+PASS indexedDB.cmp([-Number.MIN_VALUE],[-Number.MIN_VALUE]) is 0
+PASS indexedDB.cmp([-Number.MIN_VALUE],[0]) is -1
+PASS indexedDB.cmp([0],[-Number.MIN_VALUE]) is 1
+PASS indexedDB.cmp([-Number.MIN_VALUE],[-Number.MIN_VALUE]) is 0
+PASS indexedDB.cmp([0],[0]) is 0
+PASS indexedDB.cmp([0],[Number.MIN_VALUE]) is -1
+PASS indexedDB.cmp([Number.MIN_VALUE],[0]) is 1
+PASS indexedDB.cmp([0],[0]) is 0
+PASS indexedDB.cmp([Number.MIN_VALUE],[Number.MIN_VALUE]) is 0
+PASS indexedDB.cmp([Number.MIN_VALUE],[1]) is -1
+PASS indexedDB.cmp([1],[Number.MIN_VALUE]) is 1
+PASS indexedDB.cmp([Number.MIN_VALUE],[Number.MIN_VALUE]) is 0
+PASS indexedDB.cmp([1],[1]) is 0
+PASS indexedDB.cmp([1],[Number.MAX_VALUE]) is -1
+PASS indexedDB.cmp([Number.MAX_VALUE],[1]) is 1
+PASS indexedDB.cmp([1],[1]) is 0
+PASS indexedDB.cmp([Number.MAX_VALUE],[Number.MAX_VALUE]) is 0
+PASS indexedDB.cmp([Number.MAX_VALUE],[Infinity]) is -1
+PASS indexedDB.cmp([Infinity],[Number.MAX_VALUE]) is 1
+PASS indexedDB.cmp([Number.MAX_VALUE],[Number.MAX_VALUE]) is 0
+PASS indexedDB.cmp([Infinity],[Infinity]) is 0
+PASS indexedDB.cmp([Infinity],[new Date(0)]) is -1
+PASS indexedDB.cmp([new Date(0)],[Infinity]) is 1
+PASS indexedDB.cmp([Infinity],[Infinity]) is 0
+PASS indexedDB.cmp([new Date(0)],[new Date(0)]) is 0
+PASS indexedDB.cmp([new Date(0)],[new Date(1000)]) is -1
+PASS indexedDB.cmp([new Date(1000)],[new Date(0)]) is 1
+PASS indexedDB.cmp([new Date(0)],[new Date(0)]) is 0
+PASS indexedDB.cmp([new Date(1000)],[new Date(1000)]) is 0
+PASS indexedDB.cmp([new Date(1000)],[new Date(1317399931023)]) is -1
+PASS indexedDB.cmp([new Date(1317399931023)],[new Date(1000)]) is 1
+PASS indexedDB.cmp([new Date(1000)],[new Date(1000)]) is 0
+PASS indexedDB.cmp([new Date(1317399931023)],[new Date(1317399931023)]) is 0
+PASS indexedDB.cmp([new Date(1317399931023)],['']) is -1
+PASS indexedDB.cmp([''],[new Date(1317399931023)]) is 1
+PASS indexedDB.cmp([new Date(1317399931023)],[new Date(1317399931023)]) is 0
+PASS indexedDB.cmp([''],['']) is 0
+PASS indexedDB.cmp([''],['\0']) is -1
+PASS indexedDB.cmp(['\0'],['']) is 1
+PASS indexedDB.cmp([''],['']) is 0
+PASS indexedDB.cmp(['\0'],['\0']) is 0
+PASS indexedDB.cmp(['\0'],['a']) is -1
+PASS indexedDB.cmp(['a'],['\0']) is 1
+PASS indexedDB.cmp(['\0'],['\0']) is 0
+PASS indexedDB.cmp(['a'],['a']) is 0
+PASS indexedDB.cmp(['a'],['aa']) is -1
+PASS indexedDB.cmp(['aa'],['a']) is 1
+PASS indexedDB.cmp(['a'],['a']) is 0
+PASS indexedDB.cmp(['aa'],['aa']) is 0
+PASS indexedDB.cmp(['aa'],['b']) is -1
+PASS indexedDB.cmp(['b'],['aa']) is 1
+PASS indexedDB.cmp(['aa'],['aa']) is 0
+PASS indexedDB.cmp(['b'],['b']) is 0
+PASS indexedDB.cmp(['b'],['ba']) is -1
+PASS indexedDB.cmp(['ba'],['b']) is 1
+PASS indexedDB.cmp(['b'],['b']) is 0
+PASS indexedDB.cmp(['ba'],['ba']) is 0
+PASS indexedDB.cmp(['ba'],['¢']) is -1
+PASS indexedDB.cmp(['¢'],['ba']) is 1
+PASS indexedDB.cmp(['ba'],['ba']) is 0
+PASS indexedDB.cmp(['¢'],['¢']) is 0
+PASS indexedDB.cmp(['¢'],['水']) is -1
+PASS indexedDB.cmp(['水'],['¢']) is 1
+PASS indexedDB.cmp(['¢'],['¢']) is 0
+PASS indexedDB.cmp(['水'],['水']) is 0
+PASS indexedDB.cmp(['水'],['𝄞']) is -1
+PASS indexedDB.cmp(['𝄞'],['水']) is 1
+PASS indexedDB.cmp(['水'],['水']) is 0
+PASS indexedDB.cmp(['𝄞'],['𝄞']) is 0
+PASS indexedDB.cmp(['𝄞'],['�']) is -1
+PASS indexedDB.cmp(['�'],['𝄞']) is 1
+PASS indexedDB.cmp(['𝄞'],['𝄞']) is 0
+PASS indexedDB.cmp(['�'],['�']) is 0
+PASS indexedDB.cmp(['�'],[[]]) is -1
+PASS indexedDB.cmp([[]],['�']) is 1
+PASS indexedDB.cmp(['�'],['�']) is 0
+PASS indexedDB.cmp([[]],[[]]) is 0
+PASS indexedDB.cmp([[]],[[], []]) is -1
+PASS indexedDB.cmp([[], []],[[]]) is 1
+PASS indexedDB.cmp([[]],[[]]) is 0
+PASS indexedDB.cmp([[], []],[[], []]) is 0
+PASS indexedDB.cmp([[], []],[[], [], []]) is -1
+PASS indexedDB.cmp([[], [], []],[[], []]) is 1
+PASS indexedDB.cmp([[], []],[[], []]) is 0
+PASS indexedDB.cmp([[], [], []],[[], [], []]) is 0
+PASS indexedDB.cmp([[], [], []],[[[]]]) is -1
+PASS indexedDB.cmp([[[]]],[[], [], []]) is 1
+PASS indexedDB.cmp([[], [], []],[[], [], []]) is 0
+PASS indexedDB.cmp([[[]]],[[[]]]) is 0
+PASS indexedDB.cmp([[[]]],[[[[]]]]) is -1
+PASS indexedDB.cmp([[[[]]]],[[[]]]) is 1
+PASS indexedDB.cmp([[[]]],[[[]]]) is 0
+PASS indexedDB.cmp([[[[]]]],[[[[]]]]) is 0
+
+compare invalid keys
+Expecting exception from indexedDB.cmp(void 0, true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(true, void 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(void 0, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', void 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(true, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(true, false)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(false, true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(true, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(false, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', false)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(false, NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(NaN, false)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(false, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', false)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(NaN, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(NaN, new Date(NaN))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Date(NaN), NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(NaN, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Date(NaN), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Date(NaN))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Date(NaN), null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(null, new Date(NaN))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Date(NaN), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Date(NaN))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(null, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(null, {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp({}, null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(null, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp({}, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp({}, function () {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(function () {}, {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp({}, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(function () {}, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', function () {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(function () {}, /regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(/regex/, function () {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(function () {}, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', function () {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(/regex/, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', /regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(/regex/, self)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self, /regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(/regex/, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', /regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', self)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self, self.document)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document, self)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', self)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', self.document)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document, self.document.body)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document.body, self.document)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', self.document)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document.body, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', self.document.body)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document.body, new Uint8Array())
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array(), self.document.body)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(self.document.body, 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', self.document.body)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array(), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array())
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array(), new Uint8Array([0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0]), new Uint8Array())
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array(), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array())
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0]), new Uint8Array([0, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 0]), new Uint8Array([0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 0]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([0, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 0]), new Uint8Array([0, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 1]), new Uint8Array([0, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 0]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([0, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 1]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([0, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 1]), new Uint8Array([1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1]), new Uint8Array([0, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([0, 1]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([0, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1]), new Uint8Array([1, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 0]), new Uint8Array([1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 0]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([1, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 0]), new Uint8Array([1, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 1]), new Uint8Array([1, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 0]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([1, 0]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 1]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([1, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 1]), new Uint8Array([255]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([255]), new Uint8Array([1, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([1, 1]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([1, 1]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([255]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([255]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([255]), [new Uint8Array()])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array()], new Uint8Array([255]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp(new Uint8Array([255]), 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', new Uint8Array([255]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array()], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array()])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array()], [new Uint8Array([0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0])], [new Uint8Array()])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array()], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array()])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0])], [new Uint8Array([0, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 0])], [new Uint8Array([0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 0])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([0, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 0])], [new Uint8Array([0, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 1])], [new Uint8Array([0, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 0])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([0, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 1])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([0, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 1])], [new Uint8Array([1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1])], [new Uint8Array([0, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([0, 1])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([0, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1])], [new Uint8Array([1, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 0])], [new Uint8Array([1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 0])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([1, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 0])], [new Uint8Array([1, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 1])], [new Uint8Array([1, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 0])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([1, 0])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 1])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([1, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 1])], [new Uint8Array([255])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([255])], [new Uint8Array([1, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([1, 1])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([1, 1])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp([new Uint8Array([255])], 'valid')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+Expecting exception from indexedDB.cmp('valid', [new Uint8Array([255])])
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+
+compare identical keys
+PASS indexedDB.cmp(0, -0) is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbfactorycmpprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/factory-cmp-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/factory-cmp-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/factory-cmp-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/factory-cmp.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbfactorydeletedatabaseprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+Test IndexedDB's webkitIndexedDB.deleteDatabase().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.createIndex('indexName', '')
+PASS store.indexNames.contains('indexName') is true
+store.add('value', 'key')
+db.transaction('storeName', 'readwrite')
+store = transaction.objectStore('storeName')
+store.get('key')
+PASS event.target.result is &quot;value&quot;
+db.close()
+indexedDB.open(dbname, 2)
+db = event.target.result
+request = indexedDB.deleteDatabase(dbname)
+db.close()
+PASS request.result is undefined.
+indexedDB.open(dbname, 3)
+db = event.target.result
+PASS db.objectStoreNames.length is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbfactorydeletedatabaseprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/factory-deletedatabase.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbgetkeyrangeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/get-keyrange-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/get-keyrange-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/get-keyrange-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,92 @@
</span><ins>+Test IndexedDB's IDBObjectStore.get(IDBKeyRange) method.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('someObjectStore')
+objectStore.createIndex('someIndex', 'x')
+objectStore.add({'x': 0 }, 0)
+objectStore.add({'x': 1 }, 1)
+objectStore.add({'x': 2 }, 2)
+objectStore.add({'x': 3 }, 3)
+objectStore.add({'x': 4 }, 4)
+objectStore.add({'x': 5 }, 5)
+objectStore.add({'x': 6 }, 6)
+objectStore.add({'x': 7 }, 7)
+objectStore.add({'x': 8 }, 8)
+objectStore.add({'x': 9 }, 9)
+runObjStoreTests()
+objectStore.get(IDBKeyRange.only(3))
+PASS result.x is 3
+objectStore.get(IDBKeyRange.lowerBound(5))
+PASS result.x is 5
+objectStore.get(IDBKeyRange.lowerBound(5, true))
+PASS result.x is 6
+objectStore.get(IDBKeyRange.upperBound(7))
+PASS result.x is 0
+objectStore.get(IDBKeyRange.upperBound(7, true))
+PASS result.x is 0
+objectStore.get(IDBKeyRange.lowerBound(2.5))
+PASS result.x is 3
+objectStore.get(IDBKeyRange.lowerBound(100))
+PASS result is undefined
+objectStore.get(IDBKeyRange.only(3.3))
+PASS result is undefined
+Expecting exception from objectStore.get(null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+runIndexStoreTests()
+index.get(IDBKeyRange.only(3))
+PASS result.x is 3
+index.get(IDBKeyRange.lowerBound(5))
+PASS result.x is 5
+index.get(IDBKeyRange.lowerBound(5, true))
+PASS result.x is 6
+index.get(IDBKeyRange.upperBound(7))
+PASS result.x is 0
+index.get(IDBKeyRange.upperBound(7, true))
+PASS result.x is 0
+index.get(IDBKeyRange.lowerBound(2.5))
+PASS result.x is 3
+index.get(IDBKeyRange.lowerBound(100))
+PASS result is undefined
+index.get(IDBKeyRange.only(3.3))
+PASS result is undefined
+Expecting exception from index.get(null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+runIndexKeyTests()
+index.getKey(IDBKeyRange.only(3))
+PASS result is 3
+index.getKey(IDBKeyRange.lowerBound(5))
+PASS result is 5
+index.getKey(IDBKeyRange.lowerBound(5, true))
+PASS result is 6
+index.getKey(IDBKeyRange.upperBound(7))
+PASS result is 0
+index.getKey(IDBKeyRange.upperBound(7, true))
+PASS result is 0
+index.getKey(IDBKeyRange.lowerBound(2.5))
+PASS result is 3
+index.getKey(IDBKeyRange.lowerBound(100))
+PASS result is undefined
+index.getKey(IDBKeyRange.only(3.3))
+PASS result is undefined
+Expecting exception from index.getKey(null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+finishJSTest()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbgetkeyrangeprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/get-keyrange-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/get-keyrange-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/get-keyrange-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/get-keyrange.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexbasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,143 @@
</span><ins>+Test the basics of IndexedDB's webkitIDBIndex.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+db.createObjectStore('storeName', null)
+store.createIndex('indexName', 'x')
+store.createIndex('indexName2', 'y', {unique: false})
+store.createIndex('zIndex', 'z', {unique: true})
+PASS store.createIndex('index4', 'path', undefined) did not throw exception.
+PASS indexObject2.unique is false
+PASS indexObject3.unique is true
+Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', true)
+PASS Exception was thrown.
+PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', 'string')
+PASS Exception was thrown.
+PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': No function was found that matched the signature provided.
+PASS 'name' in indexObject is true
+PASS indexObject.name is &quot;indexName&quot;
+PASS 'objectStore' in indexObject is true
+PASS indexObject.objectStore.name is &quot;storeName&quot;
+PASS 'keyPath' in indexObject is true
+PASS indexObject.keyPath is &quot;x&quot;
+PASS 'unique' in indexObject is true
+PASS 'multiEntry' in indexObject is true
+PASS indexObject.unique is false
+PASS indexObject.multiEntry is false
+PASS 'openKeyCursor' in indexObject is true
+PASS typeof indexObject.openKeyCursor is &quot;function&quot;
+PASS 'openCursor' in indexObject is true
+PASS typeof indexObject.openCursor is &quot;function&quot;
+PASS 'getKey' in indexObject is true
+PASS typeof indexObject.getKey is &quot;function&quot;
+PASS 'get' in indexObject is true
+PASS typeof indexObject.get is &quot;function&quot;
+PASS 'count' in indexObject is true
+PASS typeof indexObject.count is &quot;function&quot;
+store.add({x: 'value', y: 'zzz', z: 2.72}, 'key')
+event.target.source.add({x: 'value2', y: 'zzz2', z: 2.71, foobar: 12}, 'key2')
+store.createIndex('indexWhileAddIsInFlight', 'x')
+store.createIndex('indexWithWeirdKeyPath', 'foobar')
+Add data which doesn't have a key in the z index.
+event.target.source.add({x: 'value3', y: '456'}, 'key3')
+Add data which has invalid key for y index, no key for the z index.
+event.target.source.add({x: 'value4', y: null}, 'key4')
+indexObject.getKey('value')
+PASS event.target.result is &quot;key&quot;
+indexObject2.getKey('zzz')
+PASS event.target.result is &quot;key&quot;
+indexObject3.get(2.71)
+PASS event.target.result.x is &quot;value2&quot;
+indexObject.get('value')
+PASS event.target.result.x is &quot;value&quot;
+PASS event.target.result.y is &quot;zzz&quot;
+indexObject.getKey('does not exist')
+PASS event.target.result is undefined
+indexObject.get('does not exist')
+PASS event.target.result is undefined
+indexObject4.getKey('value2')
+PASS event.target.result is &quot;key2&quot;
+
+Verify that specifying an invalid direction raises an exception:
+Expecting TypeError exception from indexObject.openKeyCursor(0, 'invalid-direction')
+PASS Exception was thrown.
+PASS indexObject.openKeyCursor(0, 'invalid-direction') threw TypeError: Failed to execute 'openKeyCursor' on 'IDBIndex': The direction provided ('invalid-direction') is not one of 'next', 'nextunique', 'prev', or 'prevunique'.
+
+indexObject.openKeyCursor()
+PASS event.target.source is indexObject
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value&quot;
+PASS event.target.result.primaryKey is &quot;key&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value2&quot;
+PASS event.target.result.primaryKey is &quot;key2&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value3&quot;
+PASS event.target.result.primaryKey is &quot;key3&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value4&quot;
+PASS event.target.result.primaryKey is &quot;key4&quot;
+event.target.result.continue()
+PASS event.target.result is null
+
+Verify that specifying an invalid direction raises an exception:
+Expecting TypeError exception from indexObject.openCursor(0, 'invalid-direction')
+PASS Exception was thrown.
+PASS indexObject.openCursor(0, 'invalid-direction') threw TypeError: Failed to execute 'openCursor' on 'IDBIndex': The direction provided ('invalid-direction') is not one of 'next', 'nextunique', 'prev', or 'prevunique'.
+
+indexObject.openCursor()
+PASS event.target.source is indexObject
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value&quot;
+PASS event.target.result.value.x is &quot;value&quot;
+PASS event.target.result.value.y is &quot;zzz&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value2&quot;
+PASS event.target.result.value.x is &quot;value2&quot;
+PASS event.target.result.value.y is &quot;zzz2&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value3&quot;
+PASS event.target.result.value.x is &quot;value3&quot;
+PASS event.target.result.value.y is &quot;456&quot;
+event.target.result.continue()
+PASS event.target.result is non-null.
+PASS event.target.result.key is &quot;value4&quot;
+PASS event.target.result.value.x is &quot;value4&quot;
+PASS event.target.result.value.y is null
+event.target.result.continue()
+PASS event.target.result is null
+request = indexObject.count()
+PASS event.target.result is 4
+request = indexObject2.count()
+PASS event.target.result is 3
+request = indexObject3.count()
+PASS event.target.result is 2
+Passing an invalid key into indexObject.get({}).
+Expecting exception from indexObject.get({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The parameter is not a valid key.
+Passing an invalid key into indexObject.getKey({}).
+Expecting exception from indexObject.getKey({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The parameter is not a valid key.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexbasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexcountprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-count-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-count-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-count-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,119 @@
</span><ins>+Test IndexedDB's IDBIndex.count().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.createIndex('indexName', '')
+PASS store.indexNames.contains('indexName') is true
+adding 0 ... 99
+
+verifying count without range
+trans = db.transaction('storeName', 'readonly')
+PASS trans is non-null.
+store = trans.objectStore('storeName')
+PASS store is non-null.
+index = store.index('indexName')
+PASS index is non-null.
+request = index.count()
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+verifying count with range
+trans = db.transaction('storeName', 'readonly')
+PASS trans is non-null.
+store = trans.objectStore('storeName')
+PASS store is non-null.
+index = trans.objectStore('storeName').index('indexName')
+PASS index is non-null.
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:99,&quot;upperOpen&quot;:false,&quot;expected&quot;:100}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:true,&quot;upper&quot;:99,&quot;upperOpen&quot;:false,&quot;expected&quot;:99}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 99
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:99,&quot;upperOpen&quot;:true,&quot;expected&quot;:99}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 99
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:true,&quot;upper&quot;:99,&quot;upperOpen&quot;:true,&quot;expected&quot;:98}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 98
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:100,&quot;upperOpen&quot;:false,&quot;expected&quot;:100}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:100,&quot;upperOpen&quot;:false,&quot;expected&quot;:100}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+test = {&quot;lower&quot;:10,&quot;lowerOpen&quot;:false,&quot;upper&quot;:100,&quot;upperOpen&quot;:false,&quot;expected&quot;:90}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 90
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:0,&quot;upperOpen&quot;:false,&quot;expected&quot;:1}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 1
+
+test = {&quot;lower&quot;:500,&quot;lowerOpen&quot;:false,&quot;upper&quot;:500,&quot;upperOpen&quot;:false,&quot;expected&quot;:0}
+request = index.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 0
+
+verifying count with key
+trans = db.transaction('storeName', 'readonly')
+PASS trans is non-null.
+store = trans.objectStore('storeName')
+PASS store is non-null.
+index = trans.objectStore('storeName').index('indexName')
+PASS index is non-null.
+Expecting exception from index.count(NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The parameter is not a valid key.
+Expecting exception from index.count({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The parameter is not a valid key.
+Expecting exception from index.count(/regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The parameter is not a valid key.
+
+test = {&quot;key&quot;:0,&quot;expected&quot;:1}
+request = index.count(test.key)
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 1
+
+test = {&quot;key&quot;:100,&quot;expected&quot;:0}
+request = index.count(test.key)
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 0
+
+test = {&quot;key&quot;:null,&quot;expected&quot;:100}
+request = index.count(test.key)
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexcountprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-count-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-count-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-count-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-count.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexcursorprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-cursor-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-cursor-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-cursor-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,607 @@
</span><ins>+Test IndexedDB's webkitIDBIndex.openCursor + the cursor it produces in depth.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('someObjectStore')
+objectStore.createIndex('someIndex', 'x')
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+objectStore.add({'x': testData[nextToAdd]}, nextToAdd)
+Scheduling tests...
+Running tests...
+
+Next test: lower open bound is 0; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 0; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 0; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 0; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 0; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 1; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 1; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 1; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 1; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 2; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 2; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 2; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 2; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 3; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 3; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 3; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 3; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 4; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 4; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 4; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 4; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 5; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 5; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 5; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 5; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 6; upper open bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower open bound is 6; upper bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper open bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 6; upper open bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower open bound is 6; upper bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper open bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 6; upper open bound is 7; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower open bound is 6; upper bound is 7; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper open bound is 7; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 6; upper open bound is 7; sorted descending.
+Skipping illegal key range.
+
+Next test: lower open bound is 6; upper bound is 7; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper open bound is 7; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper open bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: upper open bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 7; upper open bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower open bound is 7; upper bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper open bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 7; upper open bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower open bound is 7; upper bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper open bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 7; upper open bound is 7; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower open bound is 7; upper bound is 7; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper open bound is 7; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper bound is 7; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 7; upper open bound is 7; sorted descending.
+Skipping illegal key range.
+
+Next test: lower open bound is 7; upper bound is 7; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper open bound is 7; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 7; upper bound is 7; sorted descending.
+PASS event.target.result is null
+
+Next test: null key path sorted ascending.
+PASS event.target.result is null
+
+Next test: null key path sorted descending.
+PASS event.target.result is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexcursorprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-cursor-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-cursor-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-cursor-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-cursor.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexduplicatekeypathsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+Test the use of identical keypaths between objectstores and indexes
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('collideWithIndex', {keyPath: 'foo'})
+index = store.createIndex('foo', 'foo')
+objectStore.put({foo: 10})
+objectStore.get(10)
+index.get(10)
+PASS JSON.stringify(result) is &quot;{\&quot;foo\&quot;:10}&quot;
+PASS JSON.stringify(result) is &quot;{\&quot;foo\&quot;:10}&quot;
+db.close()
+request = indexedDB.open(dbname, 2)
+Deleted all object stores.
+store = db.createObjectStore('collideWithAutoIncrement', {keyPath: 'foo', autoIncrement: true})
+index = store.createIndex('foo', 'foo')
+objectStore.put({foo:5})
+objectStore.put({foo:6})
+objectStore.put({foo:7})
+objectStore.put({foo:8})
+objectStore.put({foo:9})
+objectStore.put({'bar': 'baz'})
+PASS event.target.result is 10
+objectStore.get(10)
+index.get(10)
+PASS JSON.stringify(result) is &quot;{\&quot;bar\&quot;:\&quot;baz\&quot;,\&quot;foo\&quot;:10}&quot;
+PASS JSON.stringify(result) is &quot;{\&quot;bar\&quot;:\&quot;baz\&quot;,\&quot;foo\&quot;:10}&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexduplicatekeypathsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-duplicate-keypaths-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-duplicate-keypaths.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexgetkeyargumentrequiredprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+Test IndexedDB index .get() required argument
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('foo', { keyPath: 'id', autoIncrement: true });
+index = objectStore.createIndex('first', 'first');
+PASS index.get(); threw exception TypeError: Not enough arguments.
+PASS index.getKey(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexgetkeyargumentrequiredprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-get-key-argument-required-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-get-key-argument-required.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexmultientryprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-multientry-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-multientry-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-multientry-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,179 @@
</span><ins>+Test features of IndexedDB's multiEntry indices.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+store.createIndex('index', 'x', {multiEntry: true})
+store2 = db.createObjectStore('store-unique')
+store2.createIndex('index-unique', 'x', {multiEntry: true, unique: true})
+
+Populating stores (and indexes)
+transaction = db.transaction(['store'], 'readwrite')
+First try some keys that aren't what we're expecting
+transaction.objectStore('store').put({x: [7, 8, 9], y: 'a'}, 'foo')
+Now overwrite them with what we're expecting
+transaction.objectStore('store').put({x: [1, 2, 3], y: 'a'}, 'foo')
+transaction.objectStore('store').put({x: [4, 5, 6], y: 'b'}, 'bar')
+transaction.objectStore('store').put({x: [7, 7, 8, 7], y: 'c'}, 'baz')
+transaction.objectStore('store').put({x: [null, 9, 9], y: 'd'}, 'bloop')
+
+Verifying index: index
+transaction = db.transaction(['store'], 'readonly')
+transaction.objectStore('store').index('index').openCursor()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 1
+PASS cursor.primaryKey is &quot;foo&quot;
+PASS cursor.value.y is &quot;a&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 2
+PASS cursor.primaryKey is &quot;foo&quot;
+PASS cursor.value.y is &quot;a&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 3
+PASS cursor.primaryKey is &quot;foo&quot;
+PASS cursor.value.y is &quot;a&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 4
+PASS cursor.primaryKey is &quot;bar&quot;
+PASS cursor.value.y is &quot;b&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 5
+PASS cursor.primaryKey is &quot;bar&quot;
+PASS cursor.value.y is &quot;b&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 6
+PASS cursor.primaryKey is &quot;bar&quot;
+PASS cursor.value.y is &quot;b&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 7
+PASS cursor.primaryKey is &quot;baz&quot;
+PASS cursor.value.y is &quot;c&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 8
+PASS cursor.primaryKey is &quot;baz&quot;
+PASS cursor.value.y is &quot;c&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 9
+PASS cursor.primaryKey is &quot;bloop&quot;
+PASS cursor.value.y is &quot;d&quot;
+cursor.continue()
+cursor = event.target.result
+PASS expected.length is 0
+transaction = db.transaction(['store'])
+transaction.objectStore('store').index('index')
+index.count()
+PASS event.target.result is 9
+index.count(7)
+PASS event.target.result is 1
+
+Verifying unique constraint on multiEntry index
+transaction = db.transaction(['store-unique'], 'readwrite')
+transaction.objectStore('store-unique').put({x: [1, 2, 3], y: 'a'}, 'foo')
+success!
+Replace an existing record - this should work
+transaction.objectStore('store-unique').put({x: [1, 2, 7], y: 'a'}, 'foo')
+success!
+This should fail the uniqueness constraint on the index, and fail:
+transaction.objectStore('store-unique').put({x: [5, 2], y: 'c'}, 'should fail')
+Request failed, as expected (ConstraintError)
+Transaction aborted as expected
+
+Create an index on a populated store
+db.close()
+indexedDB.open(dbname, 2)
+db = event.target.result
+trans = event.target.transaction
+store = trans.objectStore('store')
+store.createIndex('index-new', 'x', {multiEntry: true})
+
+Verifying index: index-new
+transaction = db.transaction(['store'], 'readonly')
+transaction.objectStore('store').index('index-new').openCursor()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 1
+PASS cursor.primaryKey is &quot;foo&quot;
+PASS cursor.value.y is &quot;a&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 2
+PASS cursor.primaryKey is &quot;foo&quot;
+PASS cursor.value.y is &quot;a&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 3
+PASS cursor.primaryKey is &quot;foo&quot;
+PASS cursor.value.y is &quot;a&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 4
+PASS cursor.primaryKey is &quot;bar&quot;
+PASS cursor.value.y is &quot;b&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 5
+PASS cursor.primaryKey is &quot;bar&quot;
+PASS cursor.value.y is &quot;b&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 6
+PASS cursor.primaryKey is &quot;bar&quot;
+PASS cursor.value.y is &quot;b&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 7
+PASS cursor.primaryKey is &quot;baz&quot;
+PASS cursor.value.y is &quot;c&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 8
+PASS cursor.primaryKey is &quot;baz&quot;
+PASS cursor.value.y is &quot;c&quot;
+cursor.continue()
+cursor = event.target.result
+PASS ex is non-null.
+PASS cursor.key is 9
+PASS cursor.primaryKey is &quot;bloop&quot;
+PASS cursor.value.y is &quot;d&quot;
+cursor.continue()
+cursor = event.target.result
+PASS expected.length is 0
+transaction = db.transaction(['store'])
+transaction.objectStore('store').index('index')
+index.count()
+PASS event.target.result is 9
+index.count(7)
+PASS event.target.result is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexmultientryprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-multientry-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-multientry-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-multientry-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-multientry.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexpopulationprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-population-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-population-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-population-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+Test IndexedDB index population.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+transaction = event.target.transaction
+store = db.createObjectStore('store1')
+store.put({data: 'a', indexKey: 10}, 1)
+store.put({data: 'b', indexKey: 20}, 2)
+store.put({data: 'c', indexKey: 10}, 3)
+store.put({data: 'd', indexKey: 20}, 4)
+index = store.createIndex('index1', 'indexKey')
+PASS index instanceof IDBIndex is true
+PASS index.unique is false
+request = index.count(IDBKeyRange.bound(-Infinity, Infinity))
+PASS request.result is 4
+
+doSetVersion2():
+db.close()
+request = indexedDB.open(dbname, 2)
+
+setVersion2():
+transaction = request.transaction
+store = db.createObjectStore('store2')
+store.put({data: 'a', indexKey: 10}, 1)
+store.put({data: 'b', indexKey: 20}, 2)
+store.put({data: 'c', indexKey: 10}, 3)
+store.put({data: 'd', indexKey: 20}, 4)
+index2 = store.createIndex('index2', 'indexKey', { unique: true })
+PASS index2 instanceof IDBIndex is true
+PASS index2.unique is true
+
+setVersion2Abort():
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames[0] is &quot;store1&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexpopulationprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-population-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-population-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-population-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-population.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexuniqueprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-unique-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-unique-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-unique-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+Test features of IndexedDB's unique indices.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store')
+store.createIndex('index', 'x', {unique: true})
+setVersionCompleted():
+transaction = db.transaction(['store'], 'readwrite')
+transaction.objectStore('store').put({x: 1}, 'foo')
+addMoreData():
+transaction.objectStore('store').put({x: 1}, 'bar')
+addMoreDataFailed():
+event.preventDefault()
+PASS event.target.error.name is 'ConstraintError'
+transaction.objectStore('store').put({x: 0}, 'foo')
+changeDataSuccess():
+transaction.objectStore('store').index('index').openCursor(IDBKeyRange.lowerBound(1))
+cursorSuccess():
+PASS event.target.result is null
+transaction.objectStore('store').index('index').openKeyCursor(IDBKeyRange.lowerBound(1))
+keyCursorSuccess():
+PASS event.target.result is null
+transaction.objectStore('store').put({x: 1}, 'bar')
+addMoreDataSucces():
+transaction.objectStore('store').delete('bar')
+deleteSuccess():
+transaction.objectStore('store').put({x: 1}, 'baz')
+finalAddSuccess():
+transaction.objectStore('store').put({x: 1}, 'baz')
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbindexuniqueprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/index-unique-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/index-unique-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/index-unique-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/index-unique.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbinterfacesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/interfaces-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/interfaces-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/interfaces-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+Test IndexedDB's interfaces.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS 'IDBCursor' in self is true
+PASS 'IDBCursorWithValue' in self is true
+PASS 'IDBDatabase' in self is true
+PASS 'IDBFactory' in self is true
+PASS 'IDBIndex' in self is true
+PASS 'IDBKeyRange' in self is true
+PASS 'IDBObjectStore' in self is true
+PASS 'IDBOpenDBRequest' in self is true
+PASS 'IDBRequest' in self is true
+PASS 'IDBTransaction' in self is true
+PASS 'IDBVersionChangeEvent' in self is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbinterfacesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/interfaces-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/interfaces-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/interfaces-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/interfaces.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionabortininitialupgradeneededprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+Test that an abort in the initial upgradeneeded sets version back to 0
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname, 2)
+request.onupgradeneeded = upgradeNeeded
+request.onerror = onError
+
+upgradeNeeded():
+PASS db.version is 2
+transaction.abort()
+
+onAbort():
+PASS event.target.db.version is 0
+PASS request.transaction is non-null.
+
+onError():
+PASS event.target.result is undefined
+PASS request is event.target
+PASS event.target.error.name is &quot;AbortError&quot;
+PASS request.transaction is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionabortininitialupgradeneededprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-abort-in-initial-upgradeneeded.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionbadparametersprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+Test that bad version parameters cause TypeError
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+deleteSuccess():
+Expecting TypeError exception from indexedDB.open(dbname, 'stringversion')
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, 'stringversion') threw TypeError: Value NaN is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, 0)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, 0) threw TypeError: Type error
+Expecting TypeError exception from indexedDB.open(dbname, -5)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, -5) threw TypeError: Value -5 is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, Infinity)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, Infinity) threw TypeError: Value Infinity is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, -Infinity)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, -Infinity) threw TypeError: Value -Infinity is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, NaN)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, NaN) threw TypeError: Value NaN is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, -1)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, -1) threw TypeError: Value -1 is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, 0x20000000000000)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, 0x20000000000000) threw TypeError: Value 9007199254740992 is outside the range [0, 9007199254740991]
+Expecting TypeError exception from indexedDB.open(dbname, null)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, null) threw TypeError: Type error
+Expecting TypeError exception from indexedDB.open(dbname, undefined)
+PASS Exception was thrown.
+PASS indexedDB.open(dbname, undefined) threw TypeError: Value NaN is outside the range [0, 9007199254740991]
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionbadparametersprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-bad-parameters-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-bad-parameters.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionblockedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-blocked-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-blocked-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-blocked-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+Test that blocked events get delivered properly with the new open api
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+deleteSuccess():
+request = indexedDB.open(dbname, 2)
+
+firstUpgradeNeededCallback():
+gotFirstUpgradeNeededEvent = true
+PASS event.oldVersion is 0
+PASS event.newVersion is 2
+PASS String(event) is &quot;[object IDBVersionChangeEvent]&quot;
+
+firstSuccessEventHandler():
+PASS gotFirstUpgradeNeededEvent is true
+connection1 = event.target.result
+connection1.onversionchange = versionChangeHandler
+PASS String(connection1) is &quot;[object IDBDatabase]&quot;
+request = indexedDB.open(dbname, 3)
+
+versionChangeHandler():
+sawVersionChangeEvent = true
+PASS event.type is &quot;versionchange&quot;
+PASS String(event) is &quot;[object IDBVersionChangeEvent]&quot;
+PASS event.target is connection1
+PASS event.oldVersion is 2
+PASS event.newVersion is 3
+
+blockedEventHandler():
+PASS sawVersionChangeEvent is true
+gotBlockedEvent = true
+PASS String(event) is &quot;[object IDBVersionChangeEvent]&quot;
+PASS event.oldVersion is 2
+PASS event.newVersion is 3
+PASS event.type is &quot;blocked&quot;
+connection1.close()
+
+secondUpgradeNeededEventHandler():
+PASS gotBlockedEvent is true
+gotSecondUpgradeNeededEvent = true
+
+secondSuccessCallback():
+PASS gotSecondUpgradeNeededEvent is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionblockedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-blocked-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-blocked-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-blocked-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-blocked.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionclosebetweeneventsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+Try to call db.close() after upgradeneeded but before the corresponding success event fires
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+deleteSuccess():
+request = indexedDB.open(dbname, 7)
+
+upgradeNeeded():
+db = event.target.result
+PASS event.newVersion is 7
+db.createObjectStore('objectstore')
+transaction = event.target.transaction
+
+transactionComplete():
+sawTransactionComplete = true
+
+Now try and close the database after oncomplete but before onsuccess.
+This will not happen in single process ports. In multi-process ports
+it may and is fine; but flaky crashes would indicate a regression.
+
+setTimeout(closeDB, 0)
+
+checkFinished():
+Not done yet...
+
+checkFinished():
+PASS didCallCloseDB is true
+PASS sawTransactionComplete is true
+PASS db.version is 7
+PASS db.objectStoreNames.length is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionclosebetweeneventsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-close-between-events-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-close-between-events.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversioncloseinoncompleteprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+Call db.close() in the complete handler for a version change transaction, before the success event associated with the open call fires
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+request = indexedDB.open(dbname, 7)
+
+upgradeNeeded():
+db = event.target.result
+PASS event.newVersion is 7
+db.createObjectStore('os')
+transaction = event.target.transaction
+
+transaction.oncomplete:
+sawTransactionComplete = true
+db.close()
+
+openError():
+PASS sawTransactionComplete is true
+PASS event.target.result is undefined.
+PASS event.target.error.name is &quot;AbortError&quot;
+Expecting exception from transaction = db.transaction('os', 'readwrite')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversioncloseinoncompleteprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-close-in-oncomplete-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-close-in-oncomplete.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversioncloseinupgradeneededprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+Test that when db.close is called in upgradeneeded, the db is cleaned up on refresh.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+request = indexedDB.open(dbname, 7)
+
+
+upgradeNeeded():
+db = event.target.result
+PASS event.newVersion is 7
+transaction = event.target.transaction
+db.createObjectStore('os')
+db.close()
+
+transaction.oncomplete:
+sawTransactionComplete = true
+
+openError():
+PASS sawTransactionComplete is true
+PASS event.target.error.name is 'AbortError'
+PASS event.result is undefined
+
+Verify that the old connection is unchanged and was closed:
+PASS db is non-null.
+PASS db.version is 7
+Expecting exception from db.transaction('os')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversioncloseinupgradeneededprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-close-in-upgradeneeded-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-close-in-upgradeneeded.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionencodingprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-encoding-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-encoding-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-encoding-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+Test that integer versions are encoded/decoded consistently.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+openFirstTime():
+version = 1
+upgradeNeededFired = false
+request = indexedDB.open(dbname, version)
+upgradeNeededFired = true
+db = request.result
+PASS db.version is version
+PASS upgradeNeededFired is true
+db = request.result
+PASS db.version is version
+db.close()
+
+openSecondTime():
+request = indexedDB.open(dbname)
+db = request.result
+PASS db.version is version
+db.close()
+
+openFirstTime():
+version = 127
+upgradeNeededFired = false
+request = indexedDB.open(dbname, version)
+upgradeNeededFired = true
+db = request.result
+PASS db.version is version
+PASS upgradeNeededFired is true
+db = request.result
+PASS db.version is version
+db.close()
+
+openSecondTime():
+request = indexedDB.open(dbname)
+db = request.result
+PASS db.version is version
+db.close()
+
+openFirstTime():
+version = 128
+upgradeNeededFired = false
+request = indexedDB.open(dbname, version)
+upgradeNeededFired = true
+db = request.result
+PASS db.version is version
+PASS upgradeNeededFired is true
+db = request.result
+PASS db.version is version
+db.close()
+
+openSecondTime():
+request = indexedDB.open(dbname)
+db = request.result
+PASS db.version is version
+db.close()
+
+openFirstTime():
+version = 2147483648
+upgradeNeededFired = false
+request = indexedDB.open(dbname, version)
+upgradeNeededFired = true
+db = request.result
+PASS db.version is version
+PASS upgradeNeededFired is true
+db = request.result
+PASS db.version is version
+db.close()
+
+openSecondTime():
+request = indexedDB.open(dbname)
+db = request.result
+PASS db.version is version
+db.close()
+
+openFirstTime():
+version = 9007199254740991
+upgradeNeededFired = false
+request = indexedDB.open(dbname, version)
+upgradeNeededFired = true
+db = request.result
+PASS db.version is version
+PASS upgradeNeededFired is true
+db = request.result
+PASS db.version is version
+db.close()
+
+openSecondTime():
+request = indexedDB.open(dbname)
+db = request.result
+PASS db.version is version
+db.close()
+
+openFirstTime():
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionencodingprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-encoding-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-encoding-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-encoding-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-encoding.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversiongatedondeleteprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+Test that a database is recreated correctly when an open-with-version call is queued behind a deleteDatabase call
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+deleteSuccess():
+request = indexedDB.open(dbname)
+request.onsuccess = firstSuccessCallback
+
+firstSuccessCallback():
+connection1 = event.target.result
+connection1.onversionchange = connection1VersionChangeCallback
+request = indexedDB.open(dbname)
+request.onsuccess = secondSuccessCallback
+request = indexedDB.deleteDatabase(dbname)
+request.onblocked = deleteDatabaseBlockedCallback
+request.onsuccess = deleteDatabaseSuccessCallback
+request = indexedDB.open(dbname, 1)
+request.onupgradeneeded = upgradeNeededCallback
+request.onsuccess = openWithVersionSuccessCallback
+
+secondSuccessCallback():
+db = event.target.result
+db.onversionchange = connection2VersionChangeCallback
+
+connection1VersionChangeCallback():
+PASS event.type is &quot;versionchange&quot;
+PASS event.oldVersion is 1
+PASS event.newVersion is null
+
+connection2VersionChangeCallback():
+PASS event.type is &quot;versionchange&quot;
+event.target.close()
+
+deleteDatabaseBlockedCallback():
+connection1.close()
+
+deleteDatabaseSuccessCallback():
+
+upgradeNeededCallback():
+PASS event.newVersion is 1
+PASS event.oldVersion is 0
+
+openWithVersionSuccessCallback():
+PASS event.target.result.objectStoreNames.length is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversiongatedondeleteprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-gated-on-delete.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionlongqueueprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+Test that a database is recreated correctly when an open-with-version call is queued behind both a deleteDatabase and an open-with-version call
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+db = event.target.result
+
+connection1Success():
+connection1 = event.target.result
+PASS db is connection1
+connection1.onversionchange = connection1VersionChangeCallback
+request = indexedDB.open(dbname, 2)
+request.onsuccess = connection2Success
+request.onupgradeneeded = connection2UpgradeNeeded
+request.onblocked = connection2Blocked
+
+connection1VersionChangeCallback():
+PASS event.type is &quot;versionchange&quot;
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+
+connection2Blocked():
+request = indexedDB.deleteDatabase(dbname)
+request.onblocked = deleteDatabaseBlockedCallback
+request.onsuccess = deleteDatabaseSuccessCallback
+request = indexedDB.open(dbname, 3)
+request.onupgradeneeded = connection3UpgradeNeeded
+request.onsuccess = connection3Success
+connection1.close()
+
+connection2UpgradeNeeded():
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+db = event.target.result
+PASS db.objectStoreNames.length is 0
+db.createObjectStore('some object store')
+transaction = event.target.transaction
+transaction.oncomplete = connection2TransactionComplete
+
+deleteDatabaseBlockedCallback():
+PASS event.oldVersion is 2
+PASS event.newVersion is null
+
+connection2TransactionComplete():
+PASS db.version is 2
+
+connection2Success():
+connection2 = event.target.result
+connection2.close()
+
+deleteDatabaseSuccessCallback():
+PASS event.target.result is undefined.
+PASS event.type is &quot;success&quot;
+
+connection3UpgradeNeeded():
+gotUpgradeNeededEvent = true
+PASS event.newVersion is 3
+PASS event.oldVersion is 0
+
+connection3Success():
+PASS gotUpgradeNeededEvent is true
+PASS event.target.result.objectStoreNames.length is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionlongqueueprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-long-queue-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-long-queue.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionomitparameterprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+Test that initial version after a successful open of a non-existent db is 1
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+PASS Got upgradeneeded event
+
+openSuccess():
+db = event.target.result
+Test line from IDBFactory.open: If no version is specified and no database exists, set database version to 1.
+PASS db.version is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionomitparameterprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-omit-parameter-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-omit-parameter.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionopeninupgradeneededprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+Test calling db.open in upgradeneeded.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+request = indexedDB.open(dbname, 1)
+request.onupgradeneeded = upgradeNeeded1
+request.onsuccess = openSuccess1
+
+upgradeNeeded1():
+db = event.target.result
+PASS event.newVersion is 1
+transaction = event.target.transaction
+db.createObjectStore('os')
+db.onversionchange = onVersionChange
+request = indexedDB.open(dbname, 3)
+request.onupgradeneeded = upgradeNeeded2
+request.onsuccess = openSuccess2
+request.onblocked = onBlocked
+
+transactionOnComplete():
+sawTransactionComplete = true
+
+openSuccess1():
+PASS sawTransactionComplete is true
+db = event.target.result
+PASS db.version is 1
+Start a transaction to ensure the connection is still open.
+transaction = db.transaction('os')
+
+onVersionChange():
+db.close()
+
+onBlocked():
+
+upgradeNeeded2():
+db = event.target.result
+PASS event.newVersion is 3
+
+openSuccess2():
+db = event.target.result
+PASS db.version is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionopeninupgradeneededprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-open-in-upgradeneeded-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-open-in-upgradeneeded.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionopenwithversionprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+Test that specifying a version when opening a non-existent db causes an upgradeneeded event and that the version number is set correctly.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+Should trigger:
+4.1.4: If no database with the given name from the origin origin was found, or if it was deleted during the previous step, then create a database with name name, with 0 as version, and with no object stores. Let db be the new database.
+4.1.6: Create a new connection to db and let connection represent it.
+4.1.7: If the version of db is lower than version, then run the steps for running a &quot;versionchange&quot; transaction using connection, version, request and upgrade callback.
+4.1.9: Return connection.
+request = indexedDB.open(dbname, 7)
+PASS String(request) is &quot;[object IDBOpenDBRequest]&quot;
+
+PASS In the upgradeneeded event hander:
+Test 4.8.9.1:
+db = event.target.result
+PASS String(db) is &quot;[object IDBDatabase]&quot;
+Test 4.8.9.3:
+PASS event.oldVersion is 0
+PASS event.newVersion is 7
+PASS event.target.readyState is &quot;done&quot;
+Test 4.1.4:
+PASS db.name is dbname
+PASS db.version is 7
+PASS db.objectStoreNames.length is 0
+transaction = event.target.transaction
+PASS String(transaction) is &quot;[object IDBTransaction]&quot;
+os = db.createObjectStore(&quot;someOS&quot;)
+sawTransactionComplete = true
+
+openSuccess():
+Test 4.1.7, that a versionchange transaction was run.
+PASS sawUpgradeNeeded is true
+PASS sawTransactionComplete is true
+db = event.target.result
+Kind of test 4.1.9:
+PASS String(db) is &quot;[object IDBDatabase]&quot;
+PASS db.version is 7
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionopenwithversionprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-open-with-version-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-open-with-version.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpendingversionchangesascendingprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+Check processing of pending version change requests - increasing versions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+onConnection1Open():
+indexedDB.open(dbname, 2)
+indexedDB.open(dbname, 3)
+
+FIXME: The open call with higher version should execute first.
+
+connection2Blocked():
+db.close()
+
+connection2UpgradeNeeded():
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+
+connection2OpenSuccess():
+db2 = event.target.result
+PASS db2.version is 2
+
+connection3Blocked():
+db2.close()
+
+connection3UpgradeNeeded():
+PASS event.oldVersion is 2
+PASS event.newVersion is 3
+
+connection3OpenSuccess():
+db3 = event.target.result
+PASS db3.version is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpendingversionchangesascendingprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-ascending-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-pending-version-changes-ascending.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpendingversionchangesdescendingprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+Check processing of pending version change requests - descending versions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+onConnection1Open():
+indexedDB.open(dbname, 3)
+indexedDB.open(dbname, 2)
+
+connection2Blocked():
+db.close()
+
+connection2UpgradeNeeded():
+PASS event.oldVersion is 1
+PASS event.newVersion is 3
+
+connection2OpenSuccess():
+event.target.result.close()
+db2 = event.target.result
+PASS db2.version is 3
+
+connection3Error():
+PASS event.target.error.name is &quot;VersionError&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpendingversionchangesdescendingprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-descending-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-pending-version-changes-descending.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpendingversionchangessameprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+Check processing of pending version change requests - same versions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+onConnection1Open():
+indexedDB.open(dbname, 2)
+indexedDB.open(dbname, 2)
+
+connection2Blocked():
+db.close()
+
+connection2UpgradeNeeded():
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+
+connection2OpenSuccess():
+db2 = event.target.result
+PASS db2.version is 2
+
+connection3OpenSuccess():
+db3 = event.target.result
+PASS db3.version is 2
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpendingversionchangessameprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-pending-version-changes-same-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-pending-version-changes-same.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpersistenceprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-persistence-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-persistence-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-persistence-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+Test that integer versions are retained when backing store is opened/closed/re-opened.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+dbname = dbname + Date.now()
+
+openFirstTime():
+indexedDB.open(dbname, 1)
+db = request.result
+upgradeNeededFired = true
+PASS db.version is 1
+PASS db.objectStoreNames.length is 0
+db.createObjectStore('store')
+PASS upgradeNeededFired is true
+db = request.result
+PASS db.version is 1
+PASS db.objectStoreNames.length is 1
+db.close()
+
+openSecondTime():
+indexedDB.open(dbname, 1)
+db = request.result
+PASS db.version is 1
+PASS db.objectStoreNames.length is 1
+db.close()
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionpersistenceprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-persistence-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-persistence-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-persistence-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-persistence.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionrevertonabortprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+Test that integer versions are reverted when their version transactions abort.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+request = indexedDB.open(dbname, 2)
+
+firstUpgradeNeededCallback():
+db = event.target.result
+db.createObjectStore('some os')
+
+openSuccess():
+db = event.target.result
+PASS db.version is 2
+db.close()
+request = indexedDB.open(dbname, 3)
+request.onupgradeneeded = secondUpgradeNeededCallback
+request.onerror = errorAfterAbortCallback
+
+secondUpgradeNeededCallback():
+db = event.target.result
+db.createObjectStore('some os 2')
+event.target.transaction.abort()
+
+errorAfterAbortCallback():
+PASS db.version is 2
+request = indexedDB.open(dbname)
+request.onsuccess = finalSuccessCallback
+
+finalSuccessCallback():
+db = event.target.result
+PASS db.version is 2
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames[0] is &quot;some os&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionrevertonabortprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-revert-on-abort-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-revert-on-abort.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversiontwoopensnoversionsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+Test that only the first open call gets an upgradeneeded
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+request.onsuccess = connection1OpenSuccess
+request.onupgradeneeded = connection1UpgradeNeeded
+indexedDB.open(dbname)
+request.onsuccess = connection2OpenSuccess
+request.onupgradeneeded = connection2UpgradeNeeded
+
+connection1UpgradeNeeded():
+gotFirstUpgradeNeededEvent = true
+PASS event.oldVersion is 0
+PASS event.newVersion is 1
+
+connection1OpenSuccess():
+db = event.target.result
+PASS gotFirstUpgradeNeededEvent is true
+PASS db.version is 1
+
+connection2OpenSuccess():
+db = event.target.result
+PASS gotSecondUpgradeNeededEvent is false
+PASS db.version is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversiontwoopensnoversionsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-two-opens-no-versions-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-two-opens-no-versions.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionupgradesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+Upgrade a database, open a second connection at the same version, ensure specifying a lower version causes an error
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+PASS String(request) is &quot;[object IDBOpenDBRequest]&quot;
+
+Call open with no version parameter:
+indexedDB.open(dbname)
+
+initialUpgradeNeeded():
+
+openSuccess():
+connection1 = event.target.result
+PASS connection1.version is 1
+connection1.onversionchange = connection1VersionChangeCallback
+request = indexedDB.open(dbname, 2)
+
+connection1VersionChangeCallback():
+connection1.close()
+
+connection2UpgradeNeeded():
+connection2 = event.target.result
+PASS String(connection2) is &quot;[object IDBDatabase]&quot;
+PASS String(request.transaction) is &quot;[object IDBTransaction]&quot;
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+request.transaction.oncomplete = transactionCompleted
+
+transactionCompleted():
+didTransactionComplete = true
+
+connection2Success():
+PASS didTransactionComplete is true
+PASS event.target.result is connection2
+The next connection opens the database at the same version so connection2 shouldn't get a versionchange event.
+connection2.onversionchange = unexpectedVersionChangeCallback
+PASS String(connection2) is &quot;[object IDBDatabase]&quot;
+PASS request.transaction is null
+PASS connection2.version is 2
+request = indexedDB.open(dbname, 2)
+request.onsuccess = connection3Success
+request.onblocked = unexpectedBlockedCallback
+
+connection3Success():
+event.target.result.close()
+connection2.close()
+connection3 = event.target.result
+PASS connection3.version is 2
+request = indexedDB.open(dbname, 1)
+request.onerror = errorWhenTryingLowVersion
+
+errorWhenTryingLowVersion():
+request.error.message = undefined
+request = indexedDB.open(dbname, 4)
+request.onupgradeneeded = connection4UpgradeNeeded
+request.onsuccess = connection4Success
+
+connection4UpgradeNeeded():
+gotConnection4UpgradeNeeded = true
+PASS event.oldVersion is 2
+PASS event.newVersion is 4
+
+connection4Success():
+PASS gotConnection4UpgradeNeeded is true
+connection4 = event.target.result
+PASS connection4.version is 4
+connection4.close()
+request = indexedDB.open(dbname)
+request.onsuccess = connection5Success
+
+connection5Success():
+db = event.target.result
+PASS db.version is 4
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbintversionupgradesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/intversion-upgrades-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/intversion-upgrades.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbinvalidkeysprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/invalid-keys-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/invalid-keys-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/invalid-keys-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,94 @@
</span><ins>+Test IndexedDB invalid keys
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('foo');
+Expecting exception from request = objectStore.put('value', void 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+Expecting exception from request = objectStore.put('value', null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', (function() { return arguments; }()))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', false)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', new Error)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', function () {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', JSON)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', Math)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', new Date(NaN))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', /regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', self)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', self.document)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Expecting exception from request = objectStore.put('value', self.document.body)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbinvalidkeysprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/invalid-keys-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/invalid-keys-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/invalid-keys-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/invalid-keys.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeygeneratorprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-generator-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-generator-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-generator-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,186 @@
</span><ins>+Test IndexedDB's key generator behavior.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+
+Verify that each object store has an independent key generator.
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store1 = db.createObjectStore('store1', { autoIncrement: true })
+store1.put('a')
+request = store.get(1)
+store2 = db.createObjectStore('store2', { autoIncrement: true })
+store2.put('a')
+request = store.get(1)
+store1.put('b')
+request = store.get(2)
+store2.put('b')
+request = store.get(2)
+PASS Got &quot;a&quot; for key: 1
+PASS Got &quot;a&quot; for key: 1
+PASS Got &quot;b&quot; for key: 2
+PASS Got &quot;b&quot; for key: 2
+db.close()
+
+Verify that the key generator is not updated if insertion fails
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store1', { autoIncrement: true })
+index = store.createIndex('index1', 'ix', { unique: true })
+store.put({ ix: 'a'})
+request = store.get(1)
+store.put({ ix: 'a'})
+store.put({ ix: 'b'})
+request = store.get(2)
+PASS Got {&quot;ix&quot;:&quot;a&quot;} for key: 1
+PASS Got {&quot;ix&quot;:&quot;b&quot;} for key: 2
+db.close()
+
+Verify that the key generator is not affected by item removal (delete or clear).
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store1', { autoIncrement: true })
+store.put('a')
+request = store.get(1)
+store.delete(1)
+store.put('b')
+request = store.get(2)
+store.clear()
+store.put('c')
+request = store.get(3)
+store.delete(IDBKeyRange.lowerBound(0))
+store.put('d')
+request = store.get(4)
+PASS Got &quot;a&quot; for key: 1
+PASS Got &quot;b&quot; for key: 2
+PASS Got &quot;c&quot; for key: 3
+PASS Got &quot;d&quot; for key: 4
+db.close()
+
+Verify that the key generator is only set if and only if a numeric key greater than the last generated key is used.
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store1', { autoIncrement: true })
+store.put('a')
+request = store.get(1)
+store.put('b', 3)
+request = store.get(3)
+store.put('c')
+request = store.get(4)
+store.put('d', -10)
+request = store.get(-10)
+store.put('e')
+request = store.get(5)
+store.put('f', 6.00001)
+request = store.get(6.00001)
+store.put('g')
+request = store.get(7)
+store.put('f', 8.9999)
+request = store.get(8.9999)
+store.put('g')
+request = store.get(9)
+store.put('h', 'foo')
+request = store.get(&quot;foo&quot;)
+store.put('i')
+request = store.get(10)
+store.put('j', [1000])
+request = store.get([1000])
+store.put('k')
+request = store.get(11)
+PASS Got &quot;a&quot; for key: 1
+PASS Got &quot;b&quot; for key: 3
+PASS Got &quot;c&quot; for key: 4
+PASS Got &quot;d&quot; for key: -10
+PASS Got &quot;e&quot; for key: 5
+PASS Got &quot;f&quot; for key: 6.00001
+PASS Got &quot;g&quot; for key: 7
+PASS Got &quot;f&quot; for key: 8.9999
+PASS Got &quot;g&quot; for key: 9
+PASS Got &quot;h&quot; for key: &quot;foo&quot;
+PASS Got &quot;i&quot; for key: 10
+PASS Got &quot;j&quot; for key: [1000]
+PASS Got &quot;k&quot; for key: 11
+db.close()
+
+Verify that aborting a transaction resets the key generator state.
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+trans1 = db.transaction(['store'], 'readwrite')
+store_t1 = trans1.objectStore('store')
+store_t1.put('a')
+request = store.get(1)
+store_t1.put('b')
+request = store.get(2)
+PASS Got &quot;a&quot; for key: 1
+PASS Got &quot;b&quot; for key: 2
+aborting...
+trans1.abort()
+aborted!
+trans2 = db.transaction(['store'], 'readwrite')
+store_t2 = trans2.objectStore('store')
+store_t2.put('c')
+request = store.get(1)
+store_t2.put('d')
+request = store.get(2)
+PASS Got &quot;c&quot; for key: 1
+PASS Got &quot;d&quot; for key: 2
+db.close()
+
+Verify that keys above 2^53 result in errors.
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+trans1 = db.transaction(['store'], 'readwrite')
+store_t1 = trans1.objectStore('store')
+store_t1.put('a')
+request = store.get(1)
+store_t1.put('b', 9007199254740992)
+request = store.get(9007199254740992)
+store_t1.put('c')
+store_t1.put('d', 2)
+request = store.get(2)
+PASS Got &quot;a&quot; for key: 1
+PASS Got &quot;b&quot; for key: 9007199254740992
+Error event fired auto-incrementing past 2^53 (as expected)
+PASS event.target.error.name is 'ConstraintError'
+event.preventDefault()
+PASS Got &quot;d&quot; for key: 2
+db.close()
+
+Ensure key generator state is maintained across connections:
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store', {autoIncrement: true})
+
+trans = db.transaction('store', 'readwrite')
+request = trans.objectStore('store').put('value1')
+PASS request.result is 1
+trans.objectStore('store').clear()
+db.close()
+
+request = indexedDB.open(dbname)
+db = request.result
+trans = db.transaction('store', 'readwrite')
+request = trans.objectStore('store').put('value2')
+PASS request.result is 2
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeygeneratorprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-generator-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-generator-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-generator-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/key-generator.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeysortorderacrosstypesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IndexedDB key comparison
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('foo');
+request = objectStore.add([], Infinity);
+request = objectStore.add([], -Infinity);
+request = objectStore.add([], 1.0);
+request = objectStore.add([], '');
+request = objectStore.add([], '1.0');
+sortedKey = [-Infinity, 1.0, Infinity, '', '1.0'];
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeysortorderacrosstypesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-sort-order-across-types-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/key-sort-order-across-types.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeysortorderdateprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+Test IndexedDB key comparison
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('foo');
+date1 = new Date(1000);
+request = objectStore.add([], date1);
+date0 = new Date(0);
+request = objectStore.add([], date0);
+date3 = new Date(3000);
+request = objectStore.add([], date3);
+date2 = new Date(2000);
+request = objectStore.add([], date2);
+sortedKeys = [date0.toString(), date1.toString(), date2.toString(), date3.toString()];
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key.toString() is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key.toString() is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key.toString() is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS cursor.key.toString() is sortedKeys[keyIndex]
+cursor.continue();
+keyIndex++;
+cursor = event.target.result;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeysortorderdateprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-sort-order-date-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/key-sort-order-date.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeytypearrayprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-type-array-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-type-array-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-type-array-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,290 @@
</span><ins>+Test IndexedDB key types
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store');
+
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+
+long_array = []; for (i = 0; i &lt; 1000; ++i) { long_array.push('abc', 123, new Date(0), []); }
+
+array that contains non-numeric self-reference
+self_referrential_array = []; self_referrential_array.self = self_referrential_array;
+
+testing array key: []
+store.put('value1', []);
+store.get([]);
+PASS getreq.result is &quot;value1&quot;
+
+testing array key: [-Infinity]
+store.put('value2', [-Infinity]);
+store.get([-Infinity]);
+PASS getreq.result is &quot;value2&quot;
+
+testing array key: [-Number.MAX_VALUE]
+store.put('value3', [-Number.MAX_VALUE]);
+store.get([-Number.MAX_VALUE]);
+PASS getreq.result is &quot;value3&quot;
+
+testing array key: [-1]
+store.put('value4', [-1]);
+store.get([-1]);
+PASS getreq.result is &quot;value4&quot;
+
+testing array key: [-Number.MIN_VALUE]
+store.put('value5', [-Number.MIN_VALUE]);
+store.get([-Number.MIN_VALUE]);
+PASS getreq.result is &quot;value5&quot;
+
+testing array key: [0]
+store.put('value6', [0]);
+store.get([0]);
+PASS getreq.result is &quot;value6&quot;
+
+testing array key: [Number.MIN_VALUE]
+store.put('value7', [Number.MIN_VALUE]);
+store.get([Number.MIN_VALUE]);
+PASS getreq.result is &quot;value7&quot;
+
+testing array key: [1]
+store.put('value8', [1]);
+store.get([1]);
+PASS getreq.result is &quot;value8&quot;
+
+testing array key: [Number.MAX_VALUE]
+store.put('value9', [Number.MAX_VALUE]);
+store.get([Number.MAX_VALUE]);
+PASS getreq.result is &quot;value9&quot;
+
+testing array key: [Infinity]
+store.put('value10', [Infinity]);
+store.get([Infinity]);
+PASS getreq.result is &quot;value10&quot;
+
+testing array key: [1,2,3]
+store.put('value11', [1,2,3]);
+store.get([1,2,3]);
+PASS getreq.result is &quot;value11&quot;
+
+testing array key: [new Date(0)]
+store.put('value12', [new Date(0)]);
+store.get([new Date(0)]);
+PASS getreq.result is &quot;value12&quot;
+
+testing array key: [new Date('2525-01-01T00:00:00Z')]
+store.put('value13', [new Date('2525-01-01T00:00:00Z')]);
+store.get([new Date('2525-01-01T00:00:00Z')]);
+PASS getreq.result is &quot;value13&quot;
+
+testing array key: [new Date(0), new Date('2525-01-01T00:00:00Z')]
+store.put('value14', [new Date(0), new Date('2525-01-01T00:00:00Z')]);
+store.get([new Date(0), new Date('2525-01-01T00:00:00Z')]);
+PASS getreq.result is &quot;value14&quot;
+
+testing array key: ['']
+store.put('value15', ['']);
+store.get(['']);
+PASS getreq.result is &quot;value15&quot;
+
+testing array key: ['']
+store.put('value16', ['']);
+store.get(['']);
+PASS getreq.result is &quot;value16&quot;
+
+testing array key: ['abc123']
+store.put('value17', ['abc123']);
+store.get(['abc123']);
+PASS getreq.result is &quot;value17&quot;
+
+testing array key: ['abc', 123]
+store.put('value18', ['abc', 123]);
+store.get(['abc', 123]);
+PASS getreq.result is &quot;value18&quot;
+
+testing array key: [[]]
+store.put('value19', [[]]);
+store.get([[]]);
+PASS getreq.result is &quot;value19&quot;
+
+testing array key: [[], []]
+store.put('value20', [[], []]);
+store.get([[], []]);
+PASS getreq.result is &quot;value20&quot;
+
+testing array key: [[], [], []]
+store.put('value21', [[], [], []]);
+store.get([[], [], []]);
+PASS getreq.result is &quot;value21&quot;
+
+testing array key: [[[]]]
+store.put('value22', [[[]]]);
+store.get([[[]]]);
+PASS getreq.result is &quot;value22&quot;
+
+testing array key: [[[[]]]]
+store.put('value23', [[[[]]]]);
+store.get([[[[]]]]);
+PASS getreq.result is &quot;value23&quot;
+
+testing array key: [123, 'abc', new Date(0), []]
+store.put('value24', [123, 'abc', new Date(0), []]);
+store.get([123, 'abc', new Date(0), []]);
+PASS getreq.result is &quot;value24&quot;
+
+testing array key: [[123, 'abc', new Date(0), []], [456, 'def', new Date(999), [[]]]]
+store.put('value25', [[123, 'abc', new Date(0), []], [456, 'def', new Date(999), [[]]]]);
+store.get([[123, 'abc', new Date(0), []], [456, 'def', new Date(999), [[]]]]);
+PASS getreq.result is &quot;value25&quot;
+
+testing array key: long_array
+store.put('value26', long_array);
+store.get(long_array);
+PASS getreq.result is &quot;value26&quot;
+
+testing array key: self_referrential_array
+store.put('value27', self_referrential_array);
+store.get(self_referrential_array);
+PASS getreq.result is &quot;value27&quot;
+
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+
+array that contains itself: array = [ array ]
+cyclic_array = []; cyclic_array.push(cyclic_array)
+array that contains itself, one level down: array = [ [ array ] ]
+cyclic_array2 = []; cyclic_array2.push([cyclic_array2])
+array that contains itself, not as first element: array = [1, 'b', [], array]
+cyclic_array3 = [1, 'b', []]; cyclic_array3.push(cyclic_array3)
+array that contains array that contains itself
+cyclic_array4 = [cyclic_array];
+
+testing invalid array key: [ void 0 ]
+Expecting exception from store.put('value', [ void 0 ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ true ]
+Expecting exception from store.put('value', [ true ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ false ]
+Expecting exception from store.put('value', [ false ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ NaN ]
+Expecting exception from store.put('value', [ NaN ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ null ]
+Expecting exception from store.put('value', [ null ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ {} ]
+Expecting exception from store.put('value', [ {} ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ function () {} ]
+Expecting exception from store.put('value', [ function () {} ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ /regex/ ]
+Expecting exception from store.put('value', [ /regex/ ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ self ]
+Expecting exception from store.put('value', [ self ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ self.document ]
+Expecting exception from store.put('value', [ self.document ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: [ self.document.body ]
+Expecting exception from store.put('value', [ self.document.body ]);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: cyclic_array
+Expecting exception from store.put('value', cyclic_array);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: cyclic_array2
+Expecting exception from store.put('value', cyclic_array2);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: cyclic_array3
+Expecting exception from store.put('value', cyclic_array3);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: cyclic_array4
+Expecting exception from store.put('value', cyclic_array4);
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testing invalid array key: Array(1000)
+Expecting exception from store.put('value', Array(1000));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+PASS indexedDB.cmp(makeArrayOfDepth(25), 0) is 1
+PASS indexedDB.cmp(makeArrayOfDepth(250), 0) is 1
+Expecting exception from indexedDB.cmp(makeArrayOfDepth(2500), 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'cmp' on 'IDBFactory': The parameter is not a valid key.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeytypearrayprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-type-array-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-type-array-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-type-array-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/key-type-array.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeytypebinaryprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-type-binary-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-type-binary-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-type-binary-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,131 @@
</span><ins>+Test IndexedDB binary keys
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store');
+
+
+testInvalidBinaryKeys1():
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+
+Expecting exception from store.put(0, new Uint8Array([]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(1, new Uint8Array([0]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(2, new Uint8Array([0, 0]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(3, new Uint8Array([0, 1]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(4, new Uint8Array([1]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(5, new Uint8Array([1, 0]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(6, new Uint8Array([1, 1]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put(7, new Uint8Array([255]));
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testInvalidBinaryKeys2():
+trans = db.transaction('store', 'readwrite')
+store = trans.objectStore('store')
+
+Expecting exception from store.put('value', new Uint8ClampedArray([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Uint16Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Uint32Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Int8Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Int16Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Int32Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Float32Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Float64Array([1,2,3]))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new Uint8Array([1,2,3]).buffer)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+Expecting exception from store.put('value', new DataView(new Uint8Array([1,2,3]).buffer))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeytypebinaryprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-type-binary-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-type-binary-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-type-binary-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/key-type-binary.js&quot;&gt;&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeytypeinfinityprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-type-infinity-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-type-infinity-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-type-infinity-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+Test IndexedDB key types
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('foo');
+test key as infinity
+request = objectStore.add([], Infinity);
+test key as negative infinity
+request = objectStore.add([], -Infinity);
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeytypeinfinityprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/key-type-infinity-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/key-type-infinity-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/key-type-infinity-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/key-type-infinity.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypatharraysprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-arrays-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-arrays-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-arrays-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,57 @@
</span><ins>+Test IndexedDB Array-type keyPaths
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store', {keyPath: ['a', 'b']})
+store.createIndex('index', ['c', 'd'])
+Expecting exception from db.createObjectStore('store-with-generator', {keyPath: ['a', 'b'], autoIncrement: true})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
+Expecting exception from store.createIndex('index-multientry', ['e', 'f'], {multiEntry: true})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument was an array and the multiEntry option is true.
+
+Empty arrays are not valid key paths:
+Expecting exception from db.createObjectStore('store-keypath-empty-array', {keyPath: []})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from store.createIndex('index-keypath-empty-array', [])
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+
+testKeyPaths():
+transaction = db.transaction(['store'], 'readwrite')
+store = transaction.objectStore('store')
+index = store.index('index')
+
+request = store.put({a: 1, b: 2, c: 3, d: 4})
+request = store.put({a: 5, b: 6, c: 7, d: 8})
+request = store.openCursor()
+cursor = request.result
+PASS cursor is non-null.
+PASS JSON.stringify(cursor.key) is &quot;[1,2]&quot;
+cursor = request.result
+PASS cursor is non-null.
+PASS JSON.stringify(cursor.key) is &quot;[5,6]&quot;
+request = index.openCursor()
+cursor = request.result
+PASS cursor is non-null.
+PASS JSON.stringify(cursor.primaryKey) is &quot;[1,2]&quot;
+PASS JSON.stringify(cursor.key) is &quot;[3,4]&quot;
+cursor = request.result
+PASS cursor is non-null.
+PASS JSON.stringify(cursor.primaryKey) is &quot;[5,6]&quot;
+PASS JSON.stringify(cursor.key) is &quot;[7,8]&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypatharraysprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-arrays-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-arrays-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-arrays-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keypath-arrays.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathbasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,668 @@
</span><ins>+Test for valid and invalid keypaths
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('name')
+PASS store.keyPath is null
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: ''})
+PASS store.keyPath is ''
+index = store.createIndex('name', '')
+PASS index.keyPath is ''
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: 'foo'})
+PASS store.keyPath is 'foo'
+index = store.createIndex('name', 'foo')
+PASS index.keyPath is 'foo'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: 'foo.bar.baz'})
+PASS store.keyPath is 'foo.bar.baz'
+index = store.createIndex('name', 'foo.bar.baz')
+PASS index.keyPath is 'foo.bar.baz'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '$'})
+PASS store.keyPath is '$'
+index = store.createIndex('name', '$')
+PASS index.keyPath is '$'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_'})
+PASS store.keyPath is '_'
+index = store.createIndex('name', '_')
+PASS index.keyPath is '_'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '\u0391'})
+PASS store.keyPath is '\u0391'
+index = store.createIndex('name', '\u0391')
+PASS index.keyPath is '\u0391'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '\u0371'})
+PASS store.keyPath is '\u0371'
+index = store.createIndex('name', '\u0371')
+PASS index.keyPath is '\u0371'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '\u01C5'})
+PASS store.keyPath is '\u01C5'
+index = store.createIndex('name', '\u01C5')
+PASS index.keyPath is '\u01C5'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '\u02B0'})
+PASS store.keyPath is '\u02B0'
+index = store.createIndex('name', '\u02B0')
+PASS index.keyPath is '\u02B0'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '\u00AA'})
+PASS store.keyPath is '\u00AA'
+index = store.createIndex('name', '\u00AA')
+PASS index.keyPath is '\u00AA'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '\u16EE'})
+PASS store.keyPath is '\u16EE'
+index = store.createIndex('name', '\u16EE')
+PASS index.keyPath is '\u16EE'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_$'})
+PASS store.keyPath is '_$'
+index = store.createIndex('name', '_$')
+PASS index.keyPath is '_$'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '__'})
+PASS store.keyPath is '__'
+index = store.createIndex('name', '__')
+PASS index.keyPath is '__'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u0391'})
+PASS store.keyPath is '_\u0391'
+index = store.createIndex('name', '_\u0391')
+PASS index.keyPath is '_\u0391'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u0371'})
+PASS store.keyPath is '_\u0371'
+index = store.createIndex('name', '_\u0371')
+PASS index.keyPath is '_\u0371'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u01C5'})
+PASS store.keyPath is '_\u01C5'
+index = store.createIndex('name', '_\u01C5')
+PASS index.keyPath is '_\u01C5'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u02B0'})
+PASS store.keyPath is '_\u02B0'
+index = store.createIndex('name', '_\u02B0')
+PASS index.keyPath is '_\u02B0'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u00AA'})
+PASS store.keyPath is '_\u00AA'
+index = store.createIndex('name', '_\u00AA')
+PASS index.keyPath is '_\u00AA'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u16EE'})
+PASS store.keyPath is '_\u16EE'
+index = store.createIndex('name', '_\u16EE')
+PASS index.keyPath is '_\u16EE'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u0300'})
+PASS store.keyPath is '_\u0300'
+index = store.createIndex('name', '_\u0300')
+PASS index.keyPath is '_\u0300'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u0903'})
+PASS store.keyPath is '_\u0903'
+index = store.createIndex('name', '_\u0903')
+PASS index.keyPath is '_\u0903'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u0300'})
+PASS store.keyPath is '_\u0300'
+index = store.createIndex('name', '_\u0300')
+PASS index.keyPath is '_\u0300'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u203F'})
+PASS store.keyPath is '_\u203F'
+index = store.createIndex('name', '_\u203F')
+PASS index.keyPath is '_\u203F'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u200C'})
+PASS store.keyPath is '_\u200C'
+index = store.createIndex('name', '_\u200C')
+PASS index.keyPath is '_\u200C'
+Deleted all object stores.
+store = db.createObjectStore('name', {keyPath: '_\u200D'})
+PASS store.keyPath is '_\u200D'
+index = store.createIndex('name', '_\u200D')
+PASS index.keyPath is '_\u200D'
+Deleted all object stores.
+
+testInvalidKeyPaths():
+Deleted all object stores.
+
+Object store key path may not be empty or an array if autoIncrement is true
+Expecting exception from store = db.createObjectStore('storeName', {autoIncrement: true, keyPath: ''})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
+Deleted all object stores.
+Expecting exception from store = db.createObjectStore('storeName', {autoIncrement: true, keyPath: ['a']})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
+Deleted all object stores.
+Expecting exception from store = db.createObjectStore('storeName', {autoIncrement: true, keyPath: ['']})
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The autoIncrement option was set but the keyPath option was empty or an array.
+Deleted all object stores.
+
+Key paths which are never valid:
+Expecting exception from db.createObjectStore('name').createIndex('name', null)
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name').createIndex('name', undefined)
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: ' '})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', ' ')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: 'foo '})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', 'foo ')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: 'foo bar'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', 'foo bar')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: 'foo. bar'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', 'foo. bar')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: 'foo .bar'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', 'foo .bar')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: 'foo..bar'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', 'foo..bar')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '+foo'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '+foo')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: 'foo%'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', 'foo%')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '1'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '1')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '1.0'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '1.0')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: []})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', [])
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0300'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0300')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0903'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0903')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0300'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0300')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u203F'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u203F')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u200C'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u200C')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u200D'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u200D')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u002D'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u002D')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0028'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0028')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0029'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0029')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u00AB'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u00AB')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u00BB'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u00BB')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0021'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0021')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u002B'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u002B')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u00A2'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u00A2')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u005E'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u005E')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u00A6'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u00A6')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u00A0'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u00A0')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u2028'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u2028')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u2029'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u2029')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u0000'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u0000')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\u00AD'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\u00AD')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\uD800'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\uD800')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\uE000'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\uE000')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\uFFFE'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\uFFFE')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '\uFFFF'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '\uFFFF')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u002D'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u002D')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u0028'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u0028')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u0029'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u0029')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u00AB'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u00AB')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u00BB'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u00BB')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u0021'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u0021')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u002B'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u002B')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u00A2'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u00A2')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u005E'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u005E')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u00A6'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u00A6')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u00A0'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u00A0')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u2028'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u2028')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u2029'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u2029')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u0000'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u0000')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\u00AD'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\u00AD')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\uD800'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\uD800')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\uE000'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\uE000')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\uFFFE'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\uFFFE')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+Expecting exception from db.createObjectStore('name', {keyPath: '_\uFFFF'})
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path.
+Expecting exception from db.createObjectStore('name').createIndex('name', '_\uFFFF')
+PASS Exception was thrown.
+PASS code is DOMException.SYNTAX_ERR
+Exception message: Failed to execute 'createIndex' on 'IDBObjectStore': The keyPath argument contains an invalid key path.
+Deleted all object stores.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathbasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keypath-basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathedgesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-edges-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-edges-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-edges-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+Test IndexedDB keyPath edge cases
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store-with-path', {keyPath: 'foo'})
+db.createObjectStore('store-with-path-and-generator', {keyPath: 'foo', autoIncrement: true})
+
+testKeyPaths():
+transaction = db.transaction(['store-with-path'], 'readwrite')
+store = transaction.objectStore('store-with-path')
+
+Key path doesn't resolve to a value; should yield null, should throw DATA_ERR
+Expecting exception from store.put(null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path did not yield a value.
+
+Key path doesn't resolve to a value; should yield null, should throw DATA_ERR
+Expecting exception from store.put({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path did not yield a value.
+
+Key path resolves to a value that is invalid key; should yield 'invalid' key, should throw DATA_ERR
+Expecting exception from store.put({foo: null})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path yielded a value that is not a valid key.
+
+Key path resolves to a value that is valid key; should yield 'string' key, should succeed
+store.put({foo: 'zoo'})
+PASS store.put succeeded
+
+testKeyPathsAndGenerator():
+transaction = db.transaction(['store-with-path-and-generator'], 'readwrite')
+store = transaction.objectStore('store-with-path-and-generator')
+
+Key path doesn't resolve to a value; should yield null but insertion would fail, so put request should raise exception
+Expecting exception from store.put(null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+
+Key path doesn't resolve to a value; should yield null but insertion would fail, so put request should raise exception
+Expecting exception from store.put('string')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+
+Key path doesn't resolve to a value; should yield null, key should be generated, put request should succeed
+store.put({})
+PASS store.put succeeded
+
+Key path resolves to a value that is invalid key; should yield 'invalid' key, should throw DATA_ERR
+Expecting exception from store.put({foo: null})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path yielded a value that is not a valid key.
+
+Key path resolves to a value that is valid key; should yield 'string' key, should succeed
+store.put({foo: 'zoo'})
+PASS store.put succeeded
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathedgesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-edges-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-edges-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-edges-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keypath-edges.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathfetchkeyprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+Test IndexedDB keyPaths
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+testing simple identifier
+Deleted all object stores.
+objectStore = db.createObjectStore(testData[nextToOpen].name, {keyPath: testData[nextToOpen].keyPath});
+result = objectStore.add(testData[nextToOpen].value);
+result = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].key
+
+testing simple identifiers
+Deleted all object stores.
+objectStore = db.createObjectStore(testData[nextToOpen].name, {keyPath: testData[nextToOpen].keyPath});
+result = objectStore.add(testData[nextToOpen].value);
+result = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].key
+
+testing nested identifiers
+Deleted all object stores.
+objectStore = db.createObjectStore(testData[nextToOpen].name, {keyPath: testData[nextToOpen].keyPath});
+result = objectStore.add(testData[nextToOpen].value);
+result = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].key
+
+testing nested identifiers with distractions
+Deleted all object stores.
+objectStore = db.createObjectStore(testData[nextToOpen].name, {keyPath: testData[nextToOpen].keyPath});
+result = objectStore.add(testData[nextToOpen].value);
+result = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].key
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathfetchkeyprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-fetch-key-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keypath-fetch-key.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathintrinsicpropertiesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+Test IndexedDB keyPath with intrinsic properties
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store', {keyPath: 'id'})
+store.createIndex('string length', 'string.length')
+store.createIndex('array length', 'array.length')
+
+testKeyPaths():
+transaction = db.transaction('store', 'readwrite')
+store = transaction.objectStore('store')
+store.put({&quot;id&quot;:&quot;id#0&quot;,&quot;string&quot;:&quot;&quot;,&quot;array&quot;:[]})
+store.put({&quot;id&quot;:&quot;id#1&quot;,&quot;string&quot;:&quot;xx&quot;,&quot;array&quot;:[&quot;x&quot;,&quot;x&quot;,&quot;x&quot;]})
+store.put({&quot;id&quot;:&quot;id#2&quot;,&quot;string&quot;:&quot;xxxx&quot;,&quot;array&quot;:[&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;]})
+store.put({&quot;id&quot;:&quot;id#3&quot;,&quot;string&quot;:&quot;xxxxxx&quot;,&quot;array&quot;:[&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;]})
+store.put({&quot;id&quot;:&quot;id#4&quot;,&quot;string&quot;:&quot;xxxxxxxx&quot;,&quot;array&quot;:[&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;,&quot;x&quot;]})
+request = store.index('string length').openCursor()
+PASS cursor.key is cursor.value.string.length
+PASS cursor.key is cursor.value.string.length
+PASS cursor.key is cursor.value.string.length
+PASS cursor.key is cursor.value.string.length
+PASS cursor.key is cursor.value.string.length
+request = store.index('array length').openCursor()
+PASS cursor.key is cursor.value.array.length
+PASS cursor.key is cursor.value.array.length
+PASS cursor.key is cursor.value.array.length
+PASS cursor.key is cursor.value.array.length
+PASS cursor.key is cursor.value.array.length
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeypathintrinsicpropertiesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keypath-intrinsic-properties-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keypath-intrinsic-properties.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeyrangeprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keyrange-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keyrange-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keyrange-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,276 @@
</span><ins>+Test IndexedDB's KeyRange.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS 'lower' in IDBKeyRange is false
+PASS 'upper' in IDBKeyRange is false
+PASS 'lowerOpen' in IDBKeyRange is false
+PASS 'upperOpen' in IDBKeyRange is false
+PASS 'only' in IDBKeyRange is true
+PASS 'lowerBound' in IDBKeyRange is true
+PASS 'upperBound' in IDBKeyRange is true
+PASS 'bound' in IDBKeyRange is true
+
+instance = IDBKeyRange.only(1)
+PASS 'lower' in instance is true
+PASS 'upper' in instance is true
+PASS 'lowerOpen' in instance is true
+PASS 'upperOpen' in instance is true
+PASS 'only' in instance is false
+PASS 'lowerBound' in instance is false
+PASS 'upperBound' in instance is false
+PASS 'bound' in instance is false
+
+IDBKeyRange.only(1)
+PASS keyRange.lower is 1
+PASS keyRange.upper is 1
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.only(3.14)
+PASS keyRange.lower is 3.14
+PASS keyRange.upper is 3.14
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.only('a')
+PASS keyRange.lower is 'a'
+PASS keyRange.upper is 'a'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.lowerBound(10,true)
+PASS keyRange.lower is 10
+PASS keyRange.lowerOpen is true
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound(11,false)
+PASS keyRange.lower is 11
+PASS keyRange.lowerOpen is false
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound(12,undefined)
+PASS keyRange.lower is 12
+PASS keyRange.lowerOpen is false
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound(10.1,true)
+PASS keyRange.lower is 10.1
+PASS keyRange.lowerOpen is true
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound(11.2,false)
+PASS keyRange.lower is 11.2
+PASS keyRange.lowerOpen is false
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound(12.3,undefined)
+PASS keyRange.lower is 12.3
+PASS keyRange.lowerOpen is false
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound('aa',true)
+PASS keyRange.lower is 'aa'
+PASS keyRange.lowerOpen is true
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound('ab',false)
+PASS keyRange.lower is 'ab'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.lowerBound('ac',undefined)
+PASS keyRange.lower is 'ac'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upper is undefined.
+PASS keyRange.upperOpen is true
+IDBKeyRange.upperBound(20,true)
+PASS keyRange.upper is 20
+PASS keyRange.upperOpen is true
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound(21,false)
+PASS keyRange.upper is 21
+PASS keyRange.upperOpen is false
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound(22,undefined)
+PASS keyRange.upper is 22
+PASS keyRange.upperOpen is false
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound(20.2,true)
+PASS keyRange.upper is 20.2
+PASS keyRange.upperOpen is true
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound(21.3,false)
+PASS keyRange.upper is 21.3
+PASS keyRange.upperOpen is false
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound(22.4,undefined)
+PASS keyRange.upper is 22.4
+PASS keyRange.upperOpen is false
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound('ba',true)
+PASS keyRange.upper is 'ba'
+PASS keyRange.upperOpen is true
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound('bb',false)
+PASS keyRange.upper is 'bb'
+PASS keyRange.upperOpen is false
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.upperBound('bc',undefined)
+PASS keyRange.upper is 'bc'
+PASS keyRange.upperOpen is false
+PASS keyRange.lower is undefined.
+PASS keyRange.lowerOpen is true
+IDBKeyRange.bound(30,40, undefined, undefined)
+PASS keyRange.lower is 30
+PASS keyRange.upper is 40
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound(31,41, false, false)
+PASS keyRange.lower is 31
+PASS keyRange.upper is 41
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound(32,42, false, true)
+PASS keyRange.lower is 32
+PASS keyRange.upper is 42
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is true
+IDBKeyRange.bound(33,43, true, false)
+PASS keyRange.lower is 33
+PASS keyRange.upper is 43
+PASS keyRange.lowerOpen is true
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound(34,44, true, true)
+PASS keyRange.lower is 34
+PASS keyRange.upper is 44
+PASS keyRange.lowerOpen is true
+PASS keyRange.upperOpen is true
+IDBKeyRange.bound(30.1,40.2, undefined, undefined)
+PASS keyRange.lower is 30.1
+PASS keyRange.upper is 40.2
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound(31.3,41.4, false, false)
+PASS keyRange.lower is 31.3
+PASS keyRange.upper is 41.4
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound(32.5,42.6, false, true)
+PASS keyRange.lower is 32.5
+PASS keyRange.upper is 42.6
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is true
+IDBKeyRange.bound(33.7,43.8, true, false)
+PASS keyRange.lower is 33.7
+PASS keyRange.upper is 43.8
+PASS keyRange.lowerOpen is true
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound(34.9,44, true, true)
+PASS keyRange.lower is 34.9
+PASS keyRange.upper is 44
+PASS keyRange.lowerOpen is true
+PASS keyRange.upperOpen is true
+IDBKeyRange.bound('aaa','aba', false, false)
+PASS keyRange.lower is 'aaa'
+PASS keyRange.upper is 'aba'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound('aab','abb', undefined, undefined)
+PASS keyRange.lower is 'aab'
+PASS keyRange.upper is 'abb'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound('aac','abc', false, false)
+PASS keyRange.lower is 'aac'
+PASS keyRange.upper is 'abc'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound('aad','abd', false, true)
+PASS keyRange.lower is 'aad'
+PASS keyRange.upper is 'abd'
+PASS keyRange.lowerOpen is false
+PASS keyRange.upperOpen is true
+IDBKeyRange.bound('aae','abe', true, false)
+PASS keyRange.lower is 'aae'
+PASS keyRange.upper is 'abe'
+PASS keyRange.lowerOpen is true
+PASS keyRange.upperOpen is false
+IDBKeyRange.bound('aaf','abf', true, true)
+PASS keyRange.lower is 'aaf'
+PASS keyRange.upper is 'abf'
+PASS keyRange.lowerOpen is true
+PASS keyRange.upperOpen is true
+Passing an invalid key into only({})
+Expecting exception from IDBKeyRange.only({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Passing an invalid key into upperBound({})
+Expecting exception from IDBKeyRange.upperBound({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Passing an invalid key into lowerBound({})
+Expecting exception from IDBKeyRange.lowerBound({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Passing an invalid key into bound(null, {})
+Expecting exception from IDBKeyRange.bound(null, {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Passing an invalid key into bound({},null)
+Expecting exception from IDBKeyRange.bound({}, null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Passing an invalid key into bound({}, {})
+Expecting exception from IDBKeyRange.bound({}, {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Lower key greater than higher key, bound(4, 3)
+Expecting exception from IDBKeyRange.bound(4, 3)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Equal keys, either of the bounds is open, bound(4, 4, true, false)
+Expecting exception from IDBKeyRange.bound(4, 4, true, false)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Equal keys, either of the bounds is open, bound(4, 4, false, true)
+Expecting exception from IDBKeyRange.bound(4, 4, false, true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Equal keys, either of the bounds is open, bound(4, 4, true, true)
+Expecting exception from IDBKeyRange.bound(4, 4, true, true)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: The data provided does not meet requirements.
+Equal keys, none of the bounds is open, bound(4, 4, false, false)
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeyrangeprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keyrange-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keyrange-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keyrange-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keyrange.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeyrangerequiredargumentsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+Test IndexedDB keyrange required arguments
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS IDBKeyRange.only(); threw exception TypeError: Not enough arguments.
+PASS IDBKeyRange.lowerBound(); threw exception TypeError: Not enough arguments.
+PASS IDBKeyRange.upperBound(); threw exception TypeError: Not enough arguments.
+PASS IDBKeyRange.bound(1); threw exception TypeError: Not enough arguments.
+PASS IDBKeyRange.bound(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbkeyrangerequiredargumentsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/keyrange-required-arguments-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/keyrange-required-arguments.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddblazyindextypesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/lazy-index-types-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/lazy-index-types-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/lazy-index-types-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+Test lazy IndexedDB index population with various key types.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname, 1)
+
+onUpgradeNeeded():
+db = event.target.result
+store = db.createObjectStore('store', {autoIncrement: true})
+index = store.createIndex('greedy-index', 'id')
+store.put({id: 0})
+store.put({id: new Date(0)})
+store.put({id: 'string'})
+store.put({id: []})
+store.put({id: [0]})
+store.put({id: [new Date(0)]})
+store.put({id: ['string']})
+store.put({id: [[]]})
+store.put({id: undefined})
+store.put({id: null})
+store.put({id: true})
+store.put({id: false})
+store.put({id: {}})
+store.put({id: /(?:)/})
+index = store.createIndex('lazy-index', 'id')
+expectedIndexSize = 8
+
+onSuccess():
+db = event.target.result
+trans = db.transaction('store')
+store = trans.objectStore('store')
+greedyIndex = store.index('greedy-index')
+request = greedyIndex.count()
+lazyIndex = store.index('lazy-index')
+request = lazyIndex.count()
+
+countSuccess():
+PASS event.target.result is expectedIndexSize
+gotGreedyCount = true
+
+countSuccess():
+PASS event.target.result is expectedIndexSize
+gotLazyCount = true
+
+onComplete():
+PASS gotGreedyCount is true
+PASS gotLazyCount is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddblazyindextypesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/lazy-index-types-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/lazy-index-types-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/lazy-index-types-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/lazy-index-types.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddblegacyconstantsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/legacy-constants-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/legacy-constants-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/legacy-constants-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+
+Verify that constants from previous version of the spec (beyond a grace period) have been removed:
+PASS IDBKeyRange.SINGLE is undefined
+PASS IDBKeyRange.LEFT_OPEN is undefined
+PASS IDBKeyRange.RIGHT_OPEN is undefined
+PASS IDBKeyRange.LEFT_BOUND is undefined
+PASS IDBKeyRange.RIGHT_BOUND is undefined
+PASS IDBTransaction.LOADING is undefined
+PASS IDBRequest.LOADING is undefined
+PASS IDBRequest.DONE is undefined
+PASS IDBCursor.NEXT is undefined
+PASS IDBCursor.NEXT_NO_DUPLICATE is undefined
+PASS IDBCursor.PREV is undefined
+PASS IDBCursor.PREV_NO_DUPLICATE is undefined
+PASS IDBTransaction.READ_ONLY is undefined
+PASS IDBTransaction.READ_WRITE is undefined
+PASS IDBTransaction.VERSION_CHANGE is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddblegacyconstantsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/legacy-constants-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/legacy-constants-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/legacy-constants-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/legacy-constants.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddblistorderingprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/list-ordering-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/list-ordering-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/list-ordering-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+Test string list ordering in IndexedDB.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+check that the expected order is the canonical JS sort order:
+sorted_order = expected_order.slice(); sorted_order.sort()
+PASS areArraysEqual(sorted_order, expected_order) is true
+
+Object stores:
+db.createObjectStore(&quot;𝄞&quot;)
+db.createObjectStore(&quot;�&quot;)
+db.createObjectStore(&quot;Ā&quot;)
+db.createObjectStore(&quot;က&quot;)
+db.createObjectStore(&quot;á&quot;)
+db.createObjectStore(&quot;ÿ&quot;)
+db.createObjectStore(&quot;Á&quot;)
+db.createObjectStore(&quot;à&quot;)
+db.createObjectStore(&quot;&quot;)
+db.createObjectStore(&quot;À&quot;)
+db.createObjectStore(&quot;a&quot;)
+db.createObjectStore(&quot;b&quot;)
+db.createObjectStore(&quot;A&quot;)
+db.createObjectStore(&quot;B&quot;)
+db.createObjectStore(&quot;0&quot;)
+db.createObjectStore(&quot;1&quot;)
+db.createObjectStore(&quot;\u0000&quot;)
+db.createObjectStore(&quot;&quot;)
+PASS areArraysEqual(db.objectStoreNames, expected_order) is true
+
+Indexes:
+store = db.createObjectStore('store')
+store.createIndex(&quot;𝄞&quot;, 'keyPath')
+store.createIndex(&quot;�&quot;, 'keyPath')
+store.createIndex(&quot;Ā&quot;, 'keyPath')
+store.createIndex(&quot;က&quot;, 'keyPath')
+store.createIndex(&quot;á&quot;, 'keyPath')
+store.createIndex(&quot;ÿ&quot;, 'keyPath')
+store.createIndex(&quot;Á&quot;, 'keyPath')
+store.createIndex(&quot;à&quot;, 'keyPath')
+store.createIndex(&quot;&quot;, 'keyPath')
+store.createIndex(&quot;À&quot;, 'keyPath')
+store.createIndex(&quot;a&quot;, 'keyPath')
+store.createIndex(&quot;b&quot;, 'keyPath')
+store.createIndex(&quot;A&quot;, 'keyPath')
+store.createIndex(&quot;B&quot;, 'keyPath')
+store.createIndex(&quot;0&quot;, 'keyPath')
+store.createIndex(&quot;1&quot;, 'keyPath')
+store.createIndex(&quot;\u0000&quot;, 'keyPath')
+store.createIndex(&quot;&quot;, 'keyPath')
+PASS areArraysEqual(store.indexNames, expected_order) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddblistorderingprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/list-ordering-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/list-ordering-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/list-ordering-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/list-ordering.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmetadataprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/metadata-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/metadata-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/metadata-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,79 @@
</span><ins>+Test IndexedDB database metadata mutation/snapshotting
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+connection1store1 = connection1.createObjectStore('store1')
+connection1store1.createIndex('index1', 'path')
+PASS connection1.version is 1
+PASS connection1.objectStoreNames.length is 1
+PASS connection1store1.indexNames.length is 1
+Connection's properties should be snapshotted on close
+connection1.close()
+
+secondOpen():
+request = indexedDB.open(dbname, 2)
+connection2 = request.result
+trans = request.transaction
+connection2.createObjectStore('store2')
+connection2store1 = trans.objectStore('store1')
+connection2store1.createIndex('index2', 'path')
+PASS connection2.version is 2
+PASS connection2.objectStoreNames.length is 2
+PASS connection2store1.indexNames.length is 2
+Connection's properties should be snapshotted on close
+connection2.close()
+
+thirdOpen():
+request = indexedDB.open(dbname, 3)
+connection3 = request.result
+trans = request.transaction
+connection3.createObjectStore('store3')
+connection3store1 = trans.objectStore('store1')
+connection3store1.createIndex('index3', 'path')
+PASS connection3.version is 3
+PASS connection3.objectStoreNames.length is 3
+PASS connection3store1.indexNames.length is 3
+Connection's properties should be reverted on abort
+trans.abort()
+Connection's properties should be snapshotted on close
+connection3.close()
+
+fourthOpen():
+request = indexedDB.open(dbname, 4)
+connection4 = request.result
+trans = request.transaction
+connection4.createObjectStore('store4')
+connection4store1 = trans.objectStore('store1')
+connection4store1.createIndex('index4', 'path')
+PASS connection4.version is 4
+PASS connection4.objectStoreNames.length is 3
+PASS connection4store1.indexNames.length is 3
+Connection's properties should be snapshotted on close
+connection4.close()
+
+checkState():
+PASS connection1.version is 1
+PASS connection1.objectStoreNames.length is 1
+PASS connection1store1.indexNames.length is 1
+
+PASS connection2.version is 2
+PASS connection2.objectStoreNames.length is 2
+PASS connection2store1.indexNames.length is 2
+
+PASS connection3.version is 2
+PASS connection3.objectStoreNames.length is 2
+PASS connection3store1.indexNames.length is 2
+
+PASS connection4.version is 4
+PASS connection4.objectStoreNames.length is 3
+PASS connection4store1.indexNames.length is 3
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmetadataprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/metadata-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/metadata-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/metadata-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/metadata.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmutatingcursorprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/mutating-cursor-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/mutating-cursor-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/mutating-cursor-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,89 @@
</span><ins>+Test mutating an IndexedDB's objectstore from a cursor.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('store')
+objectStore.add(1, 1).onerror = unexpectedErrorCallback
+objectStore.add(2, 2).onerror = unexpectedErrorCallback
+objectStore.add(3, 3).onerror = unexpectedErrorCallback
+objectStore.add(4, 4).onerror = unexpectedErrorCallback
+openForwardCursor()
+trans = db.transaction(['store'], 'readwrite')
+trans.objectStore('store')
+objectStore.openCursor()
+forwardCursor()
+1
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+event.target.source.add(5, 5)
+cursor.continue()
+forwardCursor()
+2
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+forwardCursor()
+3
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+forwardCursor()
+4
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+forwardCursor()
+5
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+forwardCursor()
+PASS cursorSteps is 5
+forwardCursorComplete()
+openReverseCursor()
+trans = db.transaction(['store'], 'readwrite')
+trans.objectStore('store')
+objectStore.openCursor(null, 'prev')
+reverseCursor()
+5
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+reverseCursor()
+4
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+reverseCursor()
+3
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+reverseCursor()
+2
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+event.target.source.add(0, 0)
+cursor.continue()
+reverseCursor()
+1
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+reverseCursor()
+0
+PASS cursor.key is cursorSteps
+PASS cursor.value is cursorSteps
+cursor.continue()
+reverseCursor()
+PASS cursorSteps is 0
+reverseCursorComplete()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmutatingcursorprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/mutating-cursor-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/mutating-cursor-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/mutating-cursor-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/mutating-cursor.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectStorerequiredargumentsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+Test IndexedDB object store required arguments
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('foo');
+PASS objectStore.put(); threw exception TypeError: Not enough arguments.
+PASS objectStore.add(); threw exception TypeError: Not enough arguments.
+PASS objectStore.delete(); threw exception TypeError: Not enough arguments.
+PASS objectStore.get(); threw exception TypeError: Not enough arguments.
+PASS objectStore.createIndex(); threw exception TypeError: Not enough arguments.
+PASS objectStore.createIndex('foo'); threw exception TypeError: Not enough arguments.
+PASS objectStore.index(); threw exception TypeError: Not enough arguments.
+PASS objectStore.deleteIndex(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectStorerequiredargumentsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectStore-required-arguments-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectStore-required-arguments.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstoreautoincrementprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,88 @@
</span><ins>+Test IndexedDB's IDBObjectStore auto-increment feature.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+createObjectStore():
+store = db.createObjectStore('StoreWithKeyPath', {keyPath: 'id', autoIncrement: true})
+db.createObjectStore('StoreWithAutoIncrement', {autoIncrement: true})
+db.createObjectStore('PlainOldStore', {autoIncrement: false})
+db.createObjectStore('StoreWithLongKeyPathAndUTF8', {keyPath: 'a.b.c.køi', autoIncrement: true})
+storeNames = db.objectStoreNames
+PASS store.name is &quot;StoreWithKeyPath&quot;
+PASS store.keyPath is &quot;id&quot;
+PASS storeNames.contains('StoreWithKeyPath') is true
+PASS storeNames.contains('StoreWithAutoIncrement') is true
+PASS storeNames.contains('PlainOldStore') is true
+PASS storeNames.length is 4
+setVersionCompleted():
+trans = db.transaction(['StoreWithKeyPath', 'StoreWithAutoIncrement', 'PlainOldStore'], 'readwrite')
+store = trans.objectStore('StoreWithKeyPath')
+Insert into object store with auto increment and key path, with key in the object.
+store.add({name: 'Jeffersson', number: '7010', id: 3})
+addJefferssonSuccess():
+PASS event.target.result is 3
+Insert into object store with auto increment and key path, without key in the object.
+store.add({name: 'Lincoln', number: '7012'})
+addLincolnWithInjectKeySuccess():
+PASS event.target.result is 4
+store.get(4)
+getLincolnAfterInjectedKeySuccess():
+PASS event.target.result.name is &quot;Lincoln&quot;
+PASS event.target.result.number is &quot;7012&quot;
+PASS event.target.result.id is 4
+store = trans.objectStore('StoreWithAutoIncrement')
+Insert into object store with key gen using explicit key
+store.add({name: 'Lincoln', number: '7012'}, 5)
+addLincolnWithExplicitKeySuccess():
+PASS event.target.result is 5
+store.get(5)
+getLincolnSuccess():
+PASS event.target.result.name is &quot;Lincoln&quot;
+PASS event.target.result.number is &quot;7012&quot;
+store.put({name: 'Abraham', number: '2107'})
+putAbrahamSuccess():
+PASS event.target.result is 6
+store.get(6)
+getAbrahamSuccess():
+PASS event.target.result.name is &quot;Abraham&quot;
+PASS event.target.result.number is &quot;2107&quot;
+store = trans.objectStore('PlainOldStore')
+Try adding with no key to object store without auto increment.
+Expecting exception from store.add({name: 'Adam'})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+store.add({name: 'Adam'}, 1)
+addAdamSuccess():
+PASS event.target.result is 1
+testLongKeyPath():
+trans = db.transaction('StoreWithLongKeyPathAndUTF8', 'readwrite')
+store = trans.objectStore('StoreWithLongKeyPathAndUTF8')
+store.add({foo: 'bar'})
+store.add({foo: 'bar', a: {}})
+store.add({foo: 'bar', a: {b: {}}})
+store.add({foo: 'bar', a: {b: {c: {}}}})
+store.openCursor()
+expected = null
+count = 0
+expected = cursor.value.a.b.c.køi + 1
+PASS cursor.value.foo is &quot;bar&quot;
+PASS cursor.value.a.b.c.køi is expected
+expected = cursor.value.a.b.c.køi + 1
+PASS cursor.value.foo is &quot;bar&quot;
+PASS cursor.value.a.b.c.køi is expected
+expected = cursor.value.a.b.c.køi + 1
+PASS cursor.value.foo is &quot;bar&quot;
+PASS cursor.value.a.b.c.køi is expected
+expected = cursor.value.a.b.c.køi + 1
+PASS count is 4
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstoreautoincrementprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-autoincrement-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectstore-autoincrement.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstorebasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,234 @@
</span><ins>+Test the basics of IndexedDB's IDBObjectStore.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+store = db.createObjectStore('storeName', null)
+storeNames = db.objectStoreNames
+PASS 'name' in store is true
+PASS 'keyPath' in store is true
+PASS 'indexNames' in store is true
+PASS 'transaction' in store is true
+PASS 'autoIncrement' in store is true
+PASS 'put' in store is true
+PASS typeof store.put is &quot;function&quot;
+PASS 'add' in store is true
+PASS typeof store.add is &quot;function&quot;
+PASS 'delete' in store is true
+PASS typeof store.delete is &quot;function&quot;
+PASS 'get' in store is true
+PASS typeof store.get is &quot;function&quot;
+PASS 'clear' in store is true
+PASS typeof store.clear is &quot;function&quot;
+PASS 'openCursor' in store is true
+PASS typeof store.openCursor is &quot;function&quot;
+PASS 'createIndex' in store is true
+PASS typeof store.createIndex is &quot;function&quot;
+PASS 'index' in store is true
+PASS typeof store.index is &quot;function&quot;
+PASS 'deleteIndex' in store is true
+PASS typeof store.deleteIndex is &quot;function&quot;
+PASS 'count' in store is true
+PASS typeof store.count is &quot;function&quot;
+PASS store.name is &quot;storeName&quot;
+PASS store.keyPath is null
+PASS store.autoIncrement is false
+PASS storeNames.contains('storeName') is true
+PASS storeNames.length is 1
+PASS db.createObjectStore('storeWithKeyPath', {keyPath: 'path'}).keyPath is &quot;path&quot;
+PASS db.createObjectStore('storeWithKeyGenerator', {autoIncrement: true}).autoIncrement is true
+Ask for an index that doesn't exist:
+Expecting exception from store.index('asdf')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The specified index was not found.
+createIndex():
+index = store.createIndex('indexName', 'x', {unique: true})
+PASS index is non-null.
+PASS store.indexNames.contains('indexName') is true
+index = store.index('indexName')
+PASS index is non-null.
+Ask for an index that doesn't exist:
+Expecting exception from store.index('asdf')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The specified index was not found.
+indexedDB.open(dbname, 2)
+db.close()
+PASS db.version is 2
+setVersionTrans = event.target.transaction
+PASS setVersionTrans is non-null.
+store = setVersionTrans.objectStore('storeName')
+index = store.createIndex('indexFail', 'x')
+PASS db.version is 1
+PASS store.transaction is setVersionTrans
+PASS store.indexNames is ['indexName']
+PASS store.indexNames.length is 1
+PASS store.indexNames.contains('') is false
+PASS store.indexNames.contains('indexFail') is false
+PASS store.indexNames.contains('indexName') is true
+PASS store.indexNames[0] is &quot;indexName&quot;
+PASS store.indexNames[1] is undefined.
+PASS store.indexNames[100] is undefined.
+PASS store.indexNames.item(1) is null
+PASS store.indexNames.item(100) is null
+
+openAgain():
+indexedDB.open(dbname)
+
+addData():
+db = event.target.result
+transaction = db.transaction(['storeName'], 'readwrite')
+store = transaction.objectStore('storeName')
+Try to insert data with a Date key:
+store.add({x: 'foo'}, testDate)
+Try to insert a value not handled by structured clone:
+Expecting exception from store.add({x: 'bar', y: self}, 'bar')
+PASS Exception was thrown.
+PASS code is DOMException.DATA_CLONE_ERR
+Exception message: Failed to store record in an IDBObjectStore: An object could not be cloned.
+Try to insert data where key path yields a Date key:
+store.add({x: testDateB, y: 'value'}, 'key')
+addSuccess():
+PASS event.target.result is &quot;key&quot;
+event.target.source.add({x: 'foo'}, 'zzz')
+addAgainFailure():
+PASS event.target.error.name is 'ConstraintError'
+event.preventDefault()
+db.transaction(['storeName'], 'readwrite')
+store = transaction.objectStore('storeName')
+store.add({x: 'somevalue'}, 'somekey')
+Expecting exception from store.add({x: 'othervalue'}, null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+db.transaction(['storeName'], 'readwrite')
+store = transaction.objectStore('storeName')
+Ensure invalid key pointed at by index keyPath is ignored
+store.add({x: null}, 'validkey')
+db.transaction(['storeName'], 'readwrite')
+store = transaction.objectStore('storeName')
+store.get('key')
+getSuccess():
+PASS event.target.result.y is &quot;value&quot;
+store = event.target.source
+store.get(testDate)
+getSuccessDateKey():
+PASS event.target.result.x is &quot;foo&quot;
+store.delete('key')
+removeSuccess():
+PASS event.target.result is undefined
+store.delete('key')
+removeSuccessButNotThere():
+PASS event.target.result is undefined
+store = event.target.source
+Passing an invalid key into store.get().
+Expecting exception from store.get({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The parameter is not a valid key.
+Passing an invalid key into store.delete().
+Expecting exception from store.delete({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The parameter is not a valid key.
+Passing an invalid key into store.add().
+Expecting exception from store.add(null, {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+Passing an invalid key into store.put().
+Expecting exception from store.put(null, {})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+testPreConditions():
+indexedDB.open(dbname, 3)
+
+upgradeNeeded():
+storeWithInLineKeys = db.createObjectStore('storeWithInLineKeys', {keyPath: 'key'})
+storeWithOutOfLineKeys = db.createObjectStore('storeWithOutIOfLineKeys')
+storeWithIndex = db.createObjectStore('storeWithIndex')
+index = storeWithIndex.createIndex('indexName', 'indexKey')
+
+IDBObjectStore.put()
+The object store uses in-line keys and the key parameter was provided.
+Expecting exception from storeWithInLineKeys.put({key: 1}, 'key')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The object store uses in-line keys and the key parameter was provided.
+The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+Expecting exception from storeWithOutOfLineKeys.put({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+The object store uses in-line keys and the result of evaluating the object store's key path yields a value and that value is not a valid key.
+Expecting exception from storeWithInLineKeys.put({key: null})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path yielded a value that is not a valid key.
+The object store uses in-line keys but no key generator and the result of evaluating the object store's key path does not yield a value.
+Expecting exception from storeWithInLineKeys.put({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path did not yield a value.
+The key parameter was provided but does not contain a valid key.
+Expecting exception from storeWithOutOfLineKeys.put({}, null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+
+IDBObjectStore.add()
+The object store uses in-line keys and the key parameter was provided.
+Expecting exception from storeWithInLineKeys.add({key: 1}, 'key')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The object store uses in-line keys and the key parameter was provided.
+The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+Expecting exception from storeWithOutOfLineKeys.add({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
+The object store uses in-line keys and the result of evaluating the object store's key path yields a value and that value is not a valid key.
+Expecting exception from storeWithInLineKeys.add({key: null})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path yielded a value that is not a valid key.
+The object store uses in-line keys but no key generator and the result of evaluating the object store's key path does not yield a value.
+Expecting exception from storeWithInLineKeys.add({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: Evaluating the object store's key path did not yield a value.
+The key parameter was provided but does not contain a valid key.
+Expecting exception from storeWithOutOfLineKeys.add({}, null)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to store record in an IDBObjectStore: The parameter is not a valid key.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstorebasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectstore-basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstoreclearprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-clear-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-clear-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-clear-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+Test IndexedDB's webkitIDBObjectStore.clear().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.createIndex('indexName', '')
+PASS store.indexNames.contains('indexName') is true
+store.add('value', 'key')
+otherStore = db.createObjectStore('otherStoreName', null)
+otherStore.add('value', 'key')
+store.clear()
+PASS event.target.result is undefined.
+store.openCursor()
+PASS event.target.result is null
+index = store.index('indexName')
+index.openKeyCursor()
+openKeyCursorSuccess():
+PASS event.target.result is null
+db.transaction(['otherStoreName'])
+otherStore = transaction.objectStore('otherStoreName')
+otherStore.get('key')
+PASS event.target.result is &quot;value&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstoreclearprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-clear-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-clear-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-clear-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectstore-clear.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstorecountprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-count-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-count-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-count-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,111 @@
</span><ins>+Test IndexedDB's IDBObjectStore.count().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+adding 0 ... 99
+
+verifying count without range
+trans = db.transaction('storeName', 'readonly')
+PASS trans is non-null.
+store = trans.objectStore('storeName')
+PASS store is non-null.
+request = store.count()
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+verifying count with range
+trans = db.transaction('storeName', 'readonly')
+PASS trans is non-null.
+store = trans.objectStore('storeName')
+PASS store is non-null.
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:99,&quot;upperOpen&quot;:false,&quot;expected&quot;:100}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:true,&quot;upper&quot;:99,&quot;upperOpen&quot;:false,&quot;expected&quot;:99}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 99
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:99,&quot;upperOpen&quot;:true,&quot;expected&quot;:99}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 99
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:true,&quot;upper&quot;:99,&quot;upperOpen&quot;:true,&quot;expected&quot;:98}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 98
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:100,&quot;upperOpen&quot;:false,&quot;expected&quot;:100}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:100,&quot;upperOpen&quot;:false,&quot;expected&quot;:100}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+
+test = {&quot;lower&quot;:10,&quot;lowerOpen&quot;:false,&quot;upper&quot;:100,&quot;upperOpen&quot;:false,&quot;expected&quot;:90}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 90
+
+test = {&quot;lower&quot;:0,&quot;lowerOpen&quot;:false,&quot;upper&quot;:0,&quot;upperOpen&quot;:false,&quot;expected&quot;:1}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 1
+
+test = {&quot;lower&quot;:500,&quot;lowerOpen&quot;:false,&quot;upper&quot;:500,&quot;upperOpen&quot;:false,&quot;expected&quot;:0}
+request = store.count(IDBKeyRange.bound(test.lower, test.upper, test.lowerOpen, test.upperOpen))
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 0
+
+verifying count with key
+trans = db.transaction('storeName', 'readonly')
+PASS trans is non-null.
+store = trans.objectStore('storeName')
+PASS store is non-null.
+Expecting exception from store.count(NaN)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The parameter is not a valid key.
+Expecting exception from store.count({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The parameter is not a valid key.
+Expecting exception from store.count(/regex/)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The parameter is not a valid key.
+
+test = {&quot;key&quot;:0,&quot;expected&quot;:1}
+request = store.count(test.key)
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 1
+
+test = {&quot;key&quot;:100,&quot;expected&quot;:0}
+request = store.count(test.key)
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 0
+
+test = {&quot;key&quot;:null,&quot;expected&quot;:100}
+request = store.count(test.key)
+PASS typeof request.result is &quot;number&quot;
+PASS request.result is 100
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstorecountprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-count-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-count-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-count-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectstore-count.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstorecursorprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,751 @@
</span><ins>+Test IndexedDB's objectStore.openCursor + the cursor it produces in depth.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('someObjectStore')
+
+Verify that specifying an invalid direction raises an exception:
+Expecting TypeError exception from objectStore.openCursor(0, 'invalid-direction')
+PASS Exception was thrown.
+PASS objectStore.openCursor(0, 'invalid-direction') threw TypeError: Type error
+
+objectStore.add('', testData[nextToAdd])
+objectStore.add('', testData[nextToAdd])
+objectStore.add('', testData[nextToAdd])
+objectStore.add('', testData[nextToAdd])
+objectStore.add('', testData[nextToAdd])
+objectStore.add('', testData[nextToAdd])
+objectStore.add('', testData[nextToAdd])
+Scheduling tests...
+Running tests...
+
+Next test: lower open bound is 0; sorted ascending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 0; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 0; sorted ascending.
+PASS event.target.result is null
+
+Next test: upper bound is 0; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 0; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: lower bound is 0; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper open bound is 0; sorted descending.
+PASS event.target.result is null
+
+Next test: upper bound is 0; sorted descending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: lower open bound is 0; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower bound is 0; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 1; sorted ascending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 1; sorted ascending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 1; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 1; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: lower open bound is 1; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: lower bound is 1; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: upper open bound is 1; sorted descending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 1; sorted descending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: lower open bound is 1; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: lower bound is 1; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: lower open bound is 2; sorted ascending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 2; sorted ascending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 2; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result is null
+
+Next test: upper bound is 2; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: lower open bound is 2; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: lower bound is 2; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: upper open bound is 2; sorted descending.
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 2; sorted descending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: lower open bound is 2; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: lower bound is 2; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: lower open bound is 3; sorted ascending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 3; sorted ascending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 3; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result is null
+
+Next test: upper bound is 3; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: lower open bound is 3; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: lower bound is 3; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: upper open bound is 3; sorted descending.
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 3; sorted descending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: lower open bound is 3; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: lower bound is 3; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: lower open bound is 4; sorted ascending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 4; sorted ascending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 4; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result is null
+
+Next test: upper bound is 4; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: lower open bound is 4; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 4; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: upper open bound is 4; sorted descending.
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 4; sorted descending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 4; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: lower bound is 4; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: lower open bound is 5; sorted ascending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 5; sorted ascending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 5; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result is null
+
+Next test: upper bound is 5; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 5; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 5; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: upper open bound is 5; sorted descending.
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 5; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower open bound is 5; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower bound is 5; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: lower open bound is 6; sorted ascending.
+PASS event.target.result is null
+
+Next test: lower bound is 6; sorted ascending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 6; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result is null
+
+Next test: upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 6; sorted descending.
+PASS event.target.result is null
+
+Next test: lower bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: upper open bound is 6; sorted descending.
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+
+Next test: lower open bound is 6; upper open bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower open bound is 6; upper bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper open bound is 6; sorted ascending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper bound is 6; sorted ascending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: lower open bound is 6; upper open bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower open bound is 6; upper bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper open bound is 6; sorted descending.
+Skipping illegal key range.
+
+Next test: lower bound is 6; upper bound is 6; sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: null key path sorted ascending.
+PASS event.target.result.key is testData[0]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[6]
+PASS event.target.result is null
+
+Next test: null key path sorted descending.
+PASS event.target.result.key is testData[6]
+PASS event.target.result.key is testData[5]
+PASS event.target.result.key is testData[4]
+PASS event.target.result.key is testData[3]
+PASS event.target.result.key is testData[2]
+PASS event.target.result.key is testData[1]
+PASS event.target.result.key is testData[0]
+PASS event.target.result is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstorecursorprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-cursor-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectstore-cursor.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstoreremoveobjectstoreprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+Test IndexedDB's webkitIDBObjectStore.deleteObjectStore().
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.createIndex('indexName', '')
+PASS store.indexNames.contains('indexName') is true
+store.add('value', 'key')
+db.transaction(['storeName'])
+store = transaction.objectStore('storeName')
+store.get('key')
+PASS event.target.result is &quot;value&quot;
+db.close()
+indexedDB.open(dbname, 2)
+db.deleteObjectStore('storeName')
+db.createObjectStore('storeName', null)
+db.transaction(['storeName'])
+store = transaction.objectStore('storeName')
+store.get('key')
+PASS event.target.result is undefined
+PASS event.target.source.indexNames.contains('indexName') is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbobjectstoreremoveobjectstoreprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/objectstore-removeobjectstore.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddboddstringsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/odd-strings-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/odd-strings-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/odd-strings-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,113 @@
</span><ins>+Test IndexedDB odd value datatypes
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+Deleting all the databases...
+opening a database named null
+indexedDB.open(testData[nextToOpen].name, 1)
+objectStore = db.createObjectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.add(key, key);
+db.close()
+
+opening a database named faihu
+indexedDB.open(testData[nextToOpen].name, 1)
+objectStore = db.createObjectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.add(key, key);
+db.close()
+
+opening a database named unpaired surrogate
+indexedDB.open(testData[nextToOpen].name, 1)
+objectStore = db.createObjectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.add(key, key);
+db.close()
+
+opening a database named fffe
+indexedDB.open(testData[nextToOpen].name, 1)
+objectStore = db.createObjectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.add(key, key);
+db.close()
+
+opening a database named ffff
+indexedDB.open(testData[nextToOpen].name, 1)
+objectStore = db.createObjectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.add(key, key);
+db.close()
+
+opening a database named line separator
+indexedDB.open(testData[nextToOpen].name, 1)
+objectStore = db.createObjectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.add(key, key);
+db.close()
+
+reopening a database named null
+indexedDB.open(testData[nextToOpen].name, 2)
+trans = event.target.transaction
+objectStore = trans.objectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].name
+PASS cursor.value is testData[nextToOpen].name
+
+reopening a database named faihu
+indexedDB.open(testData[nextToOpen].name, 2)
+trans = event.target.transaction
+objectStore = trans.objectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].name
+PASS cursor.value is testData[nextToOpen].name
+
+reopening a database named unpaired surrogate
+indexedDB.open(testData[nextToOpen].name, 2)
+trans = event.target.transaction
+objectStore = trans.objectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].name
+PASS cursor.value is testData[nextToOpen].name
+
+reopening a database named fffe
+indexedDB.open(testData[nextToOpen].name, 2)
+trans = event.target.transaction
+objectStore = trans.objectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].name
+PASS cursor.value is testData[nextToOpen].name
+
+reopening a database named ffff
+indexedDB.open(testData[nextToOpen].name, 2)
+trans = event.target.transaction
+objectStore = trans.objectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].name
+PASS cursor.value is testData[nextToOpen].name
+
+reopening a database named line separator
+indexedDB.open(testData[nextToOpen].name, 2)
+trans = event.target.transaction
+objectStore = trans.objectStore(testData[nextToOpen].name);
+key = testData[nextToOpen].name
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is testData[nextToOpen].name
+PASS cursor.value is testData[nextToOpen].name
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddboddstringsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/odd-strings-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/odd-strings-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/odd-strings-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/odd-strings.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopencursorprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/open-cursor-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/open-cursor-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/open-cursor-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+Test IndexedDB's openCursor.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('test')
+objectStore.add('myValue', 'myKey')
+Opening cursor
+event.target.source.openCursor(keyRange)
+Cursor opened successfully.
+PASS cursor.direction is &quot;next&quot;
+PASS cursor.key is &quot;myKey&quot;
+PASS cursor.value is &quot;myValue&quot;
+
+Passing an invalid key into .continue({}).
+Expecting exception from event.target.result.continue({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is not a valid key.
+
+Opening an empty cursor.
+objectStore.openCursor(keyRange)
+Empty cursor opened successfully.
+PASS cursor is null
+Opening cursor
+event.target.source.openCursor(&quot;myKey&quot;)
+Cursor opened successfully.
+PASS cursor.direction is &quot;next&quot;
+PASS cursor.key is &quot;myKey&quot;
+PASS cursor.value is &quot;myValue&quot;
+
+Passing an invalid key into .continue({}).
+Expecting exception from cursor.continue({})
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'DataError'
+Exception message: Failed to execute 'continue' on 'IDBCursor': The parameter is not a valid key.
+
+Opening an empty cursor.
+objectStore.openCursor(&quot;InexistentKey&quot;)
+Empty cursor opened successfully.
+PASS cursor is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopencursorprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/open-cursor-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/open-cursor-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/open-cursor-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/open-cursor.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopenduringtransactionprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/open-during-transaction-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/open-during-transaction-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/open-during-transaction-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+Test IndexedDB opening database connections during transactions
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+dbc1.createObjectStore('storeName')
+database preparation complete
+
+starting transaction
+state = 'starting'
+trans = dbc1.transaction('storeName', 'readwrite')
+the transaction is kept alive with a series of puts until opens are complete
+
+trying to open the same database
+openreq2 = indexedDB.open(dbname)
+
+trying to open a different database
+openreq3 = indexedDB.open(dbname + '2')
+
+openreq2.onsuccess
+PASS state is &quot;starting&quot;
+state = 'open2complete'
+
+openreq3.onsuccess
+PASS state is &quot;open2complete&quot;
+state = 'open3complete'
+
+transaction complete
+PASS state is &quot;open3complete&quot;
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopenduringtransactionprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/open-during-transaction-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/open-during-transaction-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/open-during-transaction-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/open-during-transaction.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopenorderingprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/open-ordering-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/open-ordering-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/open-ordering-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IndexedDB ordering of pending open calls.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname, 2)
+
+runTest():
+connection = event.target.result
+
+First a delete request, which will defer subsequent opens. The delete itself will be blocked by the open connection.
+deleteRequest = indexedDB.deleteDatabase(dbname)
+
+Now three open requests:
+order = []
+request1 = indexedDB.open(dbname, 2)
+request2 = indexedDB.open(dbname)
+request3 = indexedDB.open(dbname, 2)
+
+Close the connection to unblock the delete
+connection.close()
+
+onDeleteSuccess():
+
+onRequest1Success():
+order.push(1)
+
+onRequest2Success():
+order.push(2)
+
+onRequest3Success():
+order.push(3)
+
+checkOrder():
+PASS JSON.stringify(order) is &quot;[1,2,3]&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopenorderingprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/open-ordering-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/open-ordering-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/open-ordering-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/open-ordering.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopencursorkeyprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/opencursor-key-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/opencursor-key-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/opencursor-key-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+Test openCursor/openKeyCursor with raw IDBKeys.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore(objectStoreName);
+First, add all our data to the object store.
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+Now create the indexes.
+objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+testObjectStore()
+trans = db.transaction(objectStoreName, 'readwrite')
+objectStore = trans.objectStore(objectStoreName)
+request = objectStore.openCursor('237-23-7739')
+PASS cursor.key is &quot;237-23-7739&quot;
+PASS JSON.stringify(cursor.value) is JSON.stringify(objectStoreData[7].value)
+PASS cursor.primaryKey is cursor.key
+cursor.continue()
+PASS cursor is null
+trans = db.transaction(objectStoreName, 'readwrite')
+objectStore = trans.objectStore(objectStoreName)
+index = objectStore.index('weight')
+request = index.openCursor(180)
+PASS cursor.key is 180
+PASS JSON.stringify(cursor.value) is JSON.stringify(objectStoreData[2].value)
+PASS cursor.primaryKey is &quot;237-23-7734&quot;
+cursor.continue()
+PASS cursor.key is 180
+PASS JSON.stringify(cursor.value) is JSON.stringify(objectStoreData[6].value)
+PASS cursor.primaryKey is &quot;237-23-7738&quot;
+cursor.continue()
+PASS cursor.key is 180
+PASS JSON.stringify(cursor.value) is JSON.stringify(objectStoreData[10].value)
+PASS cursor.primaryKey is &quot;237-23-7742&quot;
+cursor.continue()
+PASS cursor is null
+trans = db.transaction(objectStoreName, 'readwrite')
+objectStore = trans.objectStore(objectStoreName)
+index = objectStore.index('weight')
+request = index.openKeyCursor(180)
+PASS cursor.key is 180
+PASS cursor.primaryKey is &quot;237-23-7734&quot;
+cursor.continue()
+PASS cursor.key is 180
+PASS cursor.primaryKey is &quot;237-23-7738&quot;
+cursor.continue()
+PASS cursor.key is 180
+PASS cursor.primaryKey is &quot;237-23-7742&quot;
+cursor.continue()
+PASS cursor is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbopencursorkeyprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/opencursor-key-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/opencursor-key-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/opencursor-key-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/opencursor-key.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpendingactivityprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/pending-activity-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/pending-activity-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/pending-activity-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,47 @@
</span><ins>+Checks that garbage collection doesn't reclaim objects with pending activity
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+store = db.createObjectStore('store')
+store.put(0, 0)
+
+testTransaction():
+transaction = db.transaction('store')
+transaction.oncomplete = transactionOnComplete
+transaction = null
+self.gc()
+PASS Transaction 'complete' event fired.
+
+testRequest():
+transaction = db.transaction('store')
+store = transaction.objectStore('store')
+request = store.get(0)
+request.onsuccess = requestOnSuccess
+request = null
+self.gc()
+PASS Request 'success' event fired.
+
+testCursorRequest():
+transaction = db.transaction('store')
+store = transaction.objectStore('store')
+request = store.openCursor()
+request.onsuccess = cursorRequestOnFirstSuccess
+PASS Request 'success' event fired.
+cursor = request.result
+cursor.continue()
+request.onsuccess = cursorRequestOnSecondSuccess
+request = null
+self.gc()
+PASS Request 'success' event fired.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpendingactivityprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/pending-activity-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/pending-activity-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/pending-activity-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/pending-activity.js&quot;&gt;&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpendingversionchangeonexitprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+No crashes when there are event listeners in a worker on shutdown
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS Didn't crash!
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpendingversionchangeonexitprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/pending-version-change-on-exit-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script&gt;
+
+description(&quot;No crashes when there are event listeners in a worker on shutdown&quot;);
+
+if (self.location.search == &quot;?second&quot;) {
+  testPassed(&quot;Didn't crash!&quot;);
+  finishJSTest();
+} else {
+  evalAndLog(&quot;workerGotBlocked = false&quot;);
+  evalAndLog(&quot;gotVersionChangeEvent = false&quot;);
+  indexedDBTest(prepareDatabase, startTheWorker);
+}
+
+function prepareDatabase()
+{
+  debug(&quot;inside prepareDatabase&quot;);
+  preamble();
+  db = event.target.result;
+  db.onversionchange = onVersionChange;
+}
+
+function startTheWorker()
+{
+  worker = startWorker(&quot;resources/pending-version-change-on-exit.js?&quot; + encodeURIComponent(dbname));
+  realFinishJSTest = finishJSTest;
+  worker.onerror = function(e) {
+    testFailed(e.message);
+    realFinishJSTest();
+  };
+  finishJSTest = function() {
+    workerGotBlocked = true;
+    maybeReload();
+  }
+}
+
+function onVersionChange(e)
+{
+  gotVersionChangeEvent = true;
+  maybeReload();
+};
+
+function maybeReload()
+{
+  if (gotVersionChangeEvent &amp;&amp; workerGotBlocked)
+    self.location = self.location + &quot;?second&quot;;
+};
+
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpendingversionchangestuckprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+Implicitly terminating worker with blocked setVersion call should allow later open calls to proceed
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+request = indexedDB.open(&quot;pending-version-change-stuck.html&quot;)
+PASS Open worked after page reload.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpendingversionchangestuckprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/pending-version-change-stuck-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script&gt;
+
+description(&quot;Implicitly terminating worker with blocked setVersion call should allow later open calls to proceed&quot;);
+
+function test()
+{
+    removeVendorPrefixes();
+    dbname = self.location.pathname.substring(1 + self.location.pathname.lastIndexOf(&quot;/&quot;));
+    evalAndLog(&quot;request = indexedDB.open(\&quot;&quot; + dbname + &quot;\&quot;)&quot;);
+    request.onblocked = unexpectedBlockedCallback;
+    request.onerror = unexpectedErrorCallback;
+    if (self.location.search == &quot;?second&quot;) {
+        request.onsuccess = function() {
+            testPassed(&quot;Open worked after page reload.&quot;);
+            finishJSTest();
+        };
+    } else {
+        request.onsuccess = startTheWorker;
+    }
+}
+
+function startTheWorker()
+{
+    worker = startWorker(&quot;resources/pending-version-change-stuck.js?&quot; + encodeURI(dbname));
+    worker.onerror = function(e) {
+        testFailed(e.message);
+        finishJSTest();
+    };
+    originalOnMessage = worker.onmessage;
+    worker.onmessage = function(event) {
+        if (event.data == &quot;gotblocked&quot;)
+            self.location = self.location + &quot;?second&quot;;
+        else
+            originalOnMessage(event);
+    };
+}
+
+test();
+
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpersistenceexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/storage/indexeddb/persistence-expected.txt (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/persistence-expected.txt        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/storage/indexeddb/persistence-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -12,7 +12,6 @@
</span><span class="cx"> db = request.result
</span><span class="cx"> PASS db is non-null.
</span><span class="cx"> PASS db.version is 1
</span><del>-PASS db.name is &quot;persistence.html&quot;
</del><span class="cx"> PASS db.objectStoreNames.length is 0
</span><span class="cx"> db.createObjectStore('store1')
</span><span class="cx"> PASS db.objectStoreNames.length is 1
</span><span class="lines">@@ -22,7 +21,6 @@
</span><span class="cx"> db = request.result
</span><span class="cx"> PASS db is non-null.
</span><span class="cx"> PASS db.version is 2
</span><del>-PASS db.name is &quot;persistence.html&quot;
</del><span class="cx"> PASS db.objectStoreNames.length is 1
</span><span class="cx"> PASS db.objectStoreNames.contains('store1') is true
</span><span class="cx"> db.createObjectStore('store2')
</span><span class="lines">@@ -35,7 +33,6 @@
</span><span class="cx"> db = request.result
</span><span class="cx"> PASS db is non-null.
</span><span class="cx"> PASS db.version is 3
</span><del>-PASS db.name is &quot;persistence.html&quot;
</del><span class="cx"> PASS db.objectStoreNames.length is 2
</span><span class="cx"> PASS db.objectStoreNames.contains('store1') is true
</span><span class="cx"> PASS db.objectStoreNames.contains('store2') is true
</span><span class="lines">@@ -49,7 +46,6 @@
</span><span class="cx"> db = request.result
</span><span class="cx"> PASS db is non-null.
</span><span class="cx"> PASS db.version is 4
</span><del>-PASS db.name is &quot;persistence.html&quot;
</del><span class="cx"> PASS db.objectStoreNames.length is 1
</span><span class="cx"> PASS db.objectStoreNames.contains('store1') is false
</span><span class="cx"> PASS db.objectStoreNames.contains('store2') is true
</span><span class="lines">@@ -63,7 +59,6 @@
</span><span class="cx"> db = request.result
</span><span class="cx"> PASS db is non-null.
</span><span class="cx"> PASS db.version is 5
</span><del>-PASS db.name is &quot;persistence.html&quot;
</del><span class="cx"> PASS db.objectStoreNames.length is 0
</span><span class="cx"> PASS db.objectStoreNames.contains('store1') is false
</span><span class="cx"> PASS db.objectStoreNames.contains('store2') is false
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpersistenceprivateexpectedtxtfromrev195246trunkLayoutTestsstorageindexeddbpersistenceexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/storage/indexeddb/persistence-private-expected.txt (from rev 195246, trunk/LayoutTests/storage/indexeddb/persistence-expected.txt) (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/persistence-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/persistence-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+Test IndexedDB persistence
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+request = indexedDB.open(dbname, 1)
+db = request.result
+PASS db is non-null.
+PASS db.version is 1
+PASS db.objectStoreNames.length is 0
+db.createObjectStore('store1')
+PASS db.objectStoreNames.length is 1
+db.close()
+
+request = indexedDB.open(dbname, 2)
+db = request.result
+PASS db is non-null.
+PASS db.version is 2
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('store1') is true
+db.createObjectStore('store2')
+PASS db.objectStoreNames.length is 2
+PASS db.objectStoreNames.contains('store1') is true
+PASS db.objectStoreNames.contains('store2') is true
+db.close()
+
+request = indexedDB.open(dbname, 3)
+db = request.result
+PASS db is non-null.
+PASS db.version is 3
+PASS db.objectStoreNames.length is 2
+PASS db.objectStoreNames.contains('store1') is true
+PASS db.objectStoreNames.contains('store2') is true
+db.deleteObjectStore('store1')
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('store1') is false
+PASS db.objectStoreNames.contains('store2') is true
+db.close()
+
+request = indexedDB.open(dbname, 4)
+db = request.result
+PASS db is non-null.
+PASS db.version is 4
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('store1') is false
+PASS db.objectStoreNames.contains('store2') is true
+db.deleteObjectStore('store2')
+PASS db.objectStoreNames.length is 0
+PASS db.objectStoreNames.contains('store1') is false
+PASS db.objectStoreNames.contains('store2') is false
+db.close()
+
+request = indexedDB.open(dbname, 5)
+db = request.result
+PASS db is non-null.
+PASS db.version is 5
+PASS db.objectStoreNames.length is 0
+PASS db.objectStoreNames.contains('store1') is false
+PASS db.objectStoreNames.contains('store2') is false
+db.close()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbpersistenceprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/persistence-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/persistence-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/persistence-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/persistence.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbprefetchbugfix108071privateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+Regression test for http://crbug.com/108071
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('store', {keyPath: 'id'})
+
+resetObjectStore():
+objectStore.clear()
+objectStore.add({id: 0, name: &quot;Alpha&quot;})
+objectStore.add({id: 1, name: &quot;Bravo&quot;})
+objectStore.add({id: 2, name: &quot;Charlie&quot;})
+objectStore.add({id: 3, name: &quot;Delta&quot;})
+objectStore.add({id: 4, name: &quot;Echo&quot;})
+
+iterateAndDeleteFirstElement():
+trans = db.transaction(['store'], 'readwrite')
+trans.objectStore('store').openCursor()
+0: Alpha
+trans.objectStore('store').delete(0)
+1: Bravo
+2: Charlie
+3: Delta
+4: Echo
+
+resetObjectStore():
+objectStore.clear()
+objectStore.add({id: 0, name: &quot;Alpha&quot;})
+objectStore.add({id: 1, name: &quot;Bravo&quot;})
+objectStore.add({id: 2, name: &quot;Charlie&quot;})
+objectStore.add({id: 3, name: &quot;Delta&quot;})
+objectStore.add({id: 4, name: &quot;Echo&quot;})
+
+prefetchAndAbort():
+trans.objectStore('store').openCursor()
+0: Alpha
+1: Bravo
+2: Charlie
+3: Delta
+trans.abort()
+PASS Transaction aborted as expected
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbprefetchbugfix108071privatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/prefetch-bugfix-108071-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/prefetch-bugfix-108071.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbqueuedcommandsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/queued-commands-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/queued-commands-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/queued-commands-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+Verify that queuing up several commands works (and they all fire).
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('storeName')
+store.createIndex('indexName', 'x')
+store.add({x: 'value', y: 'zzz'}, 'key')
+store.add({x: 'value2', y: 'zzz2'}, 'key2')
+store.put({x: 'valu2', y: 'zz2'}, 'ky2')
+PASS 0 is 0
+PASS 1 is 1
+PASS 2 is 2
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbqueuedcommandsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/queued-commands-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/queued-commands-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/queued-commands-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/queued-commands.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbreadonlyprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/readonly-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/readonly-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/readonly-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+Test IndexedDB readonly properties
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+transaction = event.target.transaction;
+trying to set readonly property transaction.mode
+transaction.mode = 666
+PASS transaction.mode is still versionchange
+trying to set readonly property transaction.db
+transaction.db = this
+PASS transaction.db is still [object IDBDatabase]
+Deleted all object stores.
+objectStore = db.createObjectStore('foo');
+trying to set readonly property objectStore.name
+objectStore.name = 'bar'
+PASS objectStore.name is still foo
+trying to set readonly property objectStore.keyPath
+objectStore.keyPath = 'bar'
+PASS objectStore.keyPath is still null
+result = objectStore.add({}, 'first');
+result = objectStore.openCursor();
+cursor = event.target.result;
+trying to set readonly property cursor.source
+cursor.source = this
+PASS cursor.source is still [object IDBObjectStore]
+trying to set readonly property cursor.direction
+cursor.direction = 666
+PASS cursor.direction is still next
+trying to set readonly property cursor.key
+cursor.key = Infinity
+PASS cursor.key is still first
+trying to set readonly property cursor.primaryKey
+cursor.primaryKey = Infinity
+PASS cursor.primaryKey is still first
+index = objectStore.createIndex('first', 'first');
+trying to set readonly property index.name
+index.name = 'bar'
+PASS index.name is still first
+trying to set readonly property index.objectStore
+index.objectStore = this
+PASS index.objectStore is still [object IDBObjectStore]
+trying to set readonly property index.keyPath
+index.keyPath = 'bar'
+PASS index.keyPath is still first
+trying to set readonly property index.unique
+index.unique = true
+PASS index.unique is still false
+trying to set readonly property keyRange.lower
+keyRange.lower = Infinity
+PASS keyRange.lower is still first
+trying to set readonly property keyRange.upper
+keyRange.upper = Infinity
+PASS keyRange.upper is still first
+trying to set readonly property keyRange.lowerOpen
+keyRange.lowerOpen = true
+PASS keyRange.lowerOpen is still false
+trying to set readonly property keyRange.upperOpen
+keyRange.upperOpen = true
+PASS keyRange.upperOpen is still false
+trying to set readonly property request.result
+request.result = Infinity
+PASS request.result is still [object IDBDatabase]
+trying to set readonly property request.error
+request.error = {}
+PASS request.error is still null
+trying to set readonly property request.source
+request.source = this
+PASS request.source is still null
+trying to set readonly property request.transaction
+request.transaction = this
+PASS request.transaction is still null
+trying to set readonly property request.readyState
+request.readyState = 666
+PASS request.readyState is still done
+db = event.target.result
+trying to set readonly property db.name
+db.name = 'bar'
+PASS db.name is still readonly-private.html
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbreadonlyprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/readonly-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/readonly-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/readonly-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/readonly.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbreadonlypropertiesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/readonly-properties-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/readonly-properties-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/readonly-properties-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+Test IndexedDB readonly properties
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('foo');
+trying to set readonly property objectStore.transaction
+objectStore.transaction = this
+PASS objectStore.transaction is still [object IDBTransaction]
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbreadonlypropertiesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/readonly-properties-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/readonly-properties-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/readonly-properties-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/readonly-properties.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbremovedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/removed-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/removed-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/removed-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+Ensure that some obsolete IndexedDB features are gone.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+PASS self.webkitIDBDatabaseError is undefined.
+PASS 'IDBDatabaseException' in self is false
+PASS 'errorCode' in indexedDB.open(dbname) is false
+PASS 'setVersion' in IDBDatabase.prototype is false
+PASS document.createEvent('IDBUpgradeNeededEvent') threw exception Error: NotSupportedError: DOM Exception 9.
+PASS 'version' in document.createEvent('IDBVersionChangeEvent') is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbremovedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/removed-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/removed-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/removed-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/removed.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbrequestcontinueabortprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/request-continue-abort-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/request-continue-abort-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/request-continue-abort-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+Regression test for IDBRequest issue calling continue on a cursor then aborting.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('store')
+
+testCursor:
+transaction = db.transaction('store', 'readwrite')
+store = transaction.objectStore('store')
+store.add('value1', 'key1')
+store.add('value2', 'key2')
+
+state = 0
+request = store.openCursor()
+
+'success' event fired at request.
+PASS ++state is 1
+request.result.continue()
+
+'error' event fired at request.
+PASS ++state is 2
+
+'abort' event fired at transaction.
+PASS ++state is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbrequestcontinueabortprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/request-continue-abort-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/request-continue-abort-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/request-continue-abort-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/request-continue-abort.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbrequesteventpropagationprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/request-event-propagation-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/request-event-propagation-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/request-event-propagation-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,146 @@
</span><ins>+Test event propogation on IDBRequest.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.add({x: 'value', y: 'zzz'}, 'key')
+Verify that handler fires and that not preventing default will result in an abort
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted
+trans.oncomplete = unexpectedCompleteCallback
+trans.onerror = allowDefault
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+PASS Event handler fired
+Doing nothing to prevent the default action...
+PASS handlerFired is true
+
+Verifing error
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted2
+trans.oncomplete = unexpectedAbortCallback
+trans.addEventListener('error', errorCaptureCallback, true)
+trans.addEventListener('error', errorBubbleCallback, false)
+trans.addEventListener('success', unexpectedSuccessCallback, true)
+trans.addEventListener('success', unexpectedSuccessCallback, false)
+db.addEventListener('error', dbErrorCaptureCallback, true)
+db.addEventListener('error', dbErrorBubbleCallback, false)
+db.addEventListener('success', unexpectedSuccessCallback, true)
+db.addEventListener('success', unexpectedSuccessCallback, false)
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+
+In IDBDatabase error capture
+PASS dbCaptureFired is false
+PASS captureFired is false
+PASS requestFired is false
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is db
+
+In IDBTransaction error capture
+PASS dbCaptureFired is true
+PASS captureFired is false
+PASS requestFired is false
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is trans
+
+In IDBRequest handler
+PASS dbCaptureFired is true
+PASS captureFired is true
+PASS requestFired is false
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is request
+
+In IDBTransaction error bubble
+PASS dbCaptureFired is true
+PASS captureFired is true
+PASS requestFired is true
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is trans
+
+In IDBDatabase error bubble
+PASS dbCaptureFired is true
+PASS captureFired is true
+PASS requestFired is true
+PASS bubbleFired is true
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is db
+
+Transaction aborted
+PASS dbCaptureFired is true
+PASS captureFired is true
+PASS requestFired is true
+PASS bubbleFired is true
+PASS dbBubbleFired is true
+
+Verifing success.
+trans = db.transaction(['storeName'], 'readwrite')
+trans.oncomplete = transactionComplete
+trans.onabort = unexpectedAbortCallback
+trans.addEventListener('success', successCaptureCallback, true)
+trans.addEventListener('success', successBubbleCallback, false)
+trans.addEventListener('error', unexpectedErrorCallback, true)
+trans.addEventListener('error', unexpectedErrorCallback, false)
+db.removeEventListener('error', dbErrorCaptureCallback, true)
+db.removeEventListener('error', dbErrorBubbleCallback, false)
+db.removeEventListener('success', unexpectedSuccessCallback, true)
+db.removeEventListener('success', unexpectedSuccessCallback, false)
+db.addEventListener('success', dbSuccessCaptureCallback, true)
+db.addEventListener('success', dbSuccessBubbleCallback, false)
+db.addEventListener('error', unexpectedErrorCallback, true)
+db.addEventListener('error', unexpectedErrorCallback, false)
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key2')
+
+In IDBDatabase success capture
+PASS dbCaptureFired is false
+PASS captureFired is false
+PASS requestFired is false
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is db
+
+In IDBTransaction success capture
+PASS dbCaptureFired is true
+PASS captureFired is false
+PASS requestFired is false
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is trans
+
+In IDBRequest handler
+PASS dbCaptureFired is true
+PASS captureFired is true
+PASS requestFired is false
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+PASS event.target is request
+PASS event.currentTarget is request
+
+Transaction completed
+PASS dbCaptureFired is true
+PASS captureFired is true
+PASS requestFired is true
+PASS bubbleFired is false
+PASS dbBubbleFired is false
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbrequesteventpropagationprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/request-event-propagation-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/request-event-propagation-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/request-event-propagation-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/request-event-propagation.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbresourcespersistencejs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/storage/indexeddb/resources/persistence.js (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/resources/persistence.js        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/LayoutTests/storage/indexeddb/resources/persistence.js        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx">     openAndChangeVersion(1, function (connection) {
</span><span class="cx">         db = connection;
</span><span class="cx">         shouldBe(&quot;db.version&quot;, &quot;1&quot;);
</span><del>-        shouldBeEqualToString(&quot;db.name&quot;, dbname);
</del><span class="cx">         shouldBe(&quot;db.objectStoreNames.length&quot;, &quot;0&quot;);
</span><span class="cx">         evalAndLog(&quot;db.createObjectStore('store1')&quot;);
</span><span class="cx">         shouldBe(&quot;db.objectStoreNames.length&quot;, &quot;1&quot;);
</span><span class="lines">@@ -35,7 +34,6 @@
</span><span class="cx">     openAndChangeVersion(2, function (connection) {
</span><span class="cx">         db = connection;
</span><span class="cx">         shouldBe(&quot;db.version&quot;, &quot;2&quot;);
</span><del>-        shouldBeEqualToString(&quot;db.name&quot;, dbname);
</del><span class="cx">         shouldBe(&quot;db.objectStoreNames.length&quot;, &quot;1&quot;);
</span><span class="cx">         shouldBeTrue(&quot;db.objectStoreNames.contains('store1')&quot;);
</span><span class="cx">         evalAndLog(&quot;db.createObjectStore('store2')&quot;);
</span><span class="lines">@@ -50,7 +48,6 @@
</span><span class="cx">     openAndChangeVersion(3, function (connection) {
</span><span class="cx">         db = connection;
</span><span class="cx">         shouldBe(&quot;db.version&quot;, &quot;3&quot;);
</span><del>-        shouldBeEqualToString(&quot;db.name&quot;, dbname);
</del><span class="cx">         shouldBe(&quot;db.objectStoreNames.length&quot;, &quot;2&quot;);
</span><span class="cx">         shouldBeTrue(&quot;db.objectStoreNames.contains('store1')&quot;);
</span><span class="cx">         shouldBeTrue(&quot;db.objectStoreNames.contains('store2')&quot;);
</span><span class="lines">@@ -66,7 +63,6 @@
</span><span class="cx">     openAndChangeVersion(4, function (connection) {
</span><span class="cx">         db = connection;
</span><span class="cx">         shouldBe(&quot;db.version&quot;, &quot;4&quot;);
</span><del>-        shouldBeEqualToString(&quot;db.name&quot;, dbname);
</del><span class="cx">         shouldBe(&quot;db.objectStoreNames.length&quot;, &quot;1&quot;);
</span><span class="cx">         shouldBeFalse(&quot;db.objectStoreNames.contains('store1')&quot;);
</span><span class="cx">         shouldBeTrue(&quot;db.objectStoreNames.contains('store2')&quot;);
</span><span class="lines">@@ -82,7 +78,6 @@
</span><span class="cx">     openAndChangeVersion(5, function (connection) {
</span><span class="cx">         db = connection;
</span><span class="cx">         shouldBe(&quot;db.version&quot;, &quot;5&quot;);
</span><del>-        shouldBeEqualToString(&quot;db.name&quot;, dbname);
</del><span class="cx">         shouldBe(&quot;db.objectStoreNames.length&quot;, &quot;0&quot;);
</span><span class="cx">         shouldBeFalse(&quot;db.objectStoreNames.contains('store1')&quot;);
</span><span class="cx">         shouldBeFalse(&quot;db.objectStoreNames.contains('store2')&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbset_version_blockedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/set_version_blocked-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/set_version_blocked-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/set_version_blocked-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+An open connection blocks a separate connection's setVersion call
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+seen_blocked_event = true
+PASS blocked_event.oldVersion is 1
+PASS blocked_event.newVersion is 2
+PASS blocked_event.target.readyState is 'pending'
+connection.close()
+in setVersion.onsuccess
+PASS seen_blocked_event is true
+Deleted all object stores.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbset_version_blockedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/set_version_blocked-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/set_version_blocked-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/set_version_blocked-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/set_version_blocked.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbsetversionblockedbyversionchangecloseprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+h2 shouldn't receive any blocked events, and h3 should open after h2 is open
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+blockedEventFired = false
+versionChangeComplete = false
+h2Opened = false
+
+openAnother():
+h1 = event.target.result
+indexedDB.open(dbname, 2)
+indexedDB.open(dbname)
+h1.close()
+
+h2UpgradeNeeded():
+h2 = event.target.result
+
+transactionOnComplete():
+versionChangeComplete = true
+
+h2Success():
+h2Opened = true
+
+h3Success():
+h3 = event.target.result
+PASS h3.version is 2
+PASS blockedEventFired is false
+PASS versionChangeComplete is true
+PASS h2Opened is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbsetversionblockedbyversionchangecloseprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/setversion-blocked-by-versionchange-close-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/setversion-blocked-by-versionchange-close.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbsetversionnotblockedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+Test that setVersion is not blocked if handle closed in versionchange handler.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+blockedEventFired = false
+versionchangeEventFired = false
+indexedDB.open(dbname)
+
+prepareDatabase():
+h1 = event.target.result
+h1.onversionchange = h1OnVersionChange
+indexedDB.open(dbname, 2)
+
+h1OnVersionChange():
+versionchangeEventFired = true
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+h1.close()
+
+h2UpgradeNeeded():
+PASS event.oldVersion is 1
+PASS event.newVersion is 2
+
+h2OpenSuccess():
+PASS versionchangeEventFired is true
+PASS blockedEventFired is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbsetversionnotblockedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/setversion-not-blocked.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionabortprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-abort-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-abort-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-abort-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+Test transaction aborts send the proper onabort messages..
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.add({x: 'value', y: 'zzz'}, 'key')
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = transactionAborted
+trans.oncomplete = unexpectedCompleteCallback
+store = trans.objectStore('storeName')
+store.add({x: 'value2', y: 'zzz2'}, 'key2')
+store.add({x: 'value3', y: 'zzz3'}, 'key3')
+PASS event.target.error.name is 'AbortError'
+PASS trans.error is null
+PASS firstError is false
+PASS secondError is false
+PASS abortFired is false
+Expecting exception from store.add({x: 'value4', y: 'zzz4'}, 'key4')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+PASS event.target.error.name is 'AbortError'
+PASS trans.error is null
+PASS firstError is true
+PASS secondError is false
+PASS abortFired is false
+PASS firstError is true
+PASS secondError is true
+PASS abortFired is false
+PASS trans.error is null
+Expecting exception from store.add({x: 'value5', y: 'zzz5'}, 'key5')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from trans.abort()
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'abort' on 'IDBTransaction': The transaction is inactive or finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionabortprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-abort-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-abort-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-abort-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-abort.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionactiveflagprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,265 @@
</span><ins>+Test IndexedDB transaction internal active flag.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+store.createIndex('index', 'keypath')
+
+runTransaction():
+transaction = db.transaction('store', 'readwrite')
+
+Verify that transactions are created with |active| flag set:
+store = transaction.objectStore('store')
+index = store.index('index')
+PASS store.add(0, 0) did not throw exception.
+PASS store.put(0, 0) did not throw exception.
+PASS store.get(0) did not throw exception.
+PASS store.get(IDBKeyRange.only(0)) did not throw exception.
+PASS store.delete(0) did not throw exception.
+PASS store.delete(IDBKeyRange.only(0)) did not throw exception.
+PASS store.count() did not throw exception.
+PASS store.count(0) did not throw exception.
+PASS store.count(IDBKeyRange.only(0)) did not throw exception.
+PASS store.clear() did not throw exception.
+PASS store.openCursor() did not throw exception.
+PASS store.openCursor(0) did not throw exception.
+PASS store.openCursor(0, 'next') did not throw exception.
+PASS store.openCursor(IDBKeyRange.only(0)) did not throw exception.
+PASS store.openCursor(IDBKeyRange.only(0), 'next') did not throw exception.
+PASS index.get(0) did not throw exception.
+PASS index.get(IDBKeyRange.only(0)) did not throw exception.
+PASS index.getKey(0) did not throw exception.
+PASS index.getKey(IDBKeyRange.only(0)) did not throw exception.
+PASS index.count() did not throw exception.
+PASS index.count(0) did not throw exception.
+PASS index.count(IDBKeyRange.only(0)) did not throw exception.
+PASS index.openCursor() did not throw exception.
+PASS index.openCursor(0) did not throw exception.
+PASS index.openCursor(0, 'next') did not throw exception.
+PASS index.openCursor(IDBKeyRange.only(0)) did not throw exception.
+PASS index.openCursor(IDBKeyRange.only(0), 'next') did not throw exception.
+PASS index.openKeyCursor() did not throw exception.
+PASS index.openKeyCursor(0) did not throw exception.
+PASS index.openKeyCursor(0, 'next') did not throw exception.
+PASS index.openKeyCursor(IDBKeyRange.only(0)) did not throw exception.
+PASS index.openKeyCursor(IDBKeyRange.only(0), 'next') did not throw exception.
+
+Transaction shouldn't be active inside a non-IDB-event callback
+setTimeout(testTimeout, 0)
+
+testTimeout():
+store = transaction.objectStore('store')
+index = store.index('index')
+Expecting exception from store.add(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from store.put(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from store.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.get(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: A request was placed against a transaction which is either currently not active, or which is finished.
+Expecting exception from store.delete(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.delete(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.count()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.count(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.count(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.clear()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from index.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.get(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.getKey(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.getKey(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.count()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.count(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.count(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openCursor(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor(0, 'next')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor(IDBKeyRange.only(0))
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor(IDBKeyRange.only(0), 'next')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+
+testEventCallback():
+Transaction should be active inside a non-IDB-event callback
+store = transaction.objectStore('store')
+index = store.index('index')
+PASS store.add(0, 0) did not throw exception.
+PASS store.put(0, 0) did not throw exception.
+PASS store.get(0) did not throw exception.
+PASS store.get(IDBKeyRange.only(0)) did not throw exception.
+PASS store.delete(0) did not throw exception.
+PASS store.delete(IDBKeyRange.only(0)) did not throw exception.
+PASS store.count() did not throw exception.
+PASS store.count(0) did not throw exception.
+PASS store.count(IDBKeyRange.only(0)) did not throw exception.
+PASS store.clear() did not throw exception.
+PASS store.openCursor() did not throw exception.
+PASS store.openCursor(0) did not throw exception.
+PASS store.openCursor(0, 'next') did not throw exception.
+PASS store.openCursor(IDBKeyRange.only(0)) did not throw exception.
+PASS store.openCursor(IDBKeyRange.only(0), 'next') did not throw exception.
+PASS index.get(0) did not throw exception.
+PASS index.get(IDBKeyRange.only(0)) did not throw exception.
+PASS index.getKey(0) did not throw exception.
+PASS index.getKey(IDBKeyRange.only(0)) did not throw exception.
+PASS index.count() did not throw exception.
+PASS index.count(0) did not throw exception.
+PASS index.count(IDBKeyRange.only(0)) did not throw exception.
+PASS index.openCursor() did not throw exception.
+PASS index.openCursor(0) did not throw exception.
+PASS index.openCursor(0, 'next') did not throw exception.
+PASS index.openCursor(IDBKeyRange.only(0)) did not throw exception.
+PASS index.openCursor(IDBKeyRange.only(0), 'next') did not throw exception.
+PASS index.openKeyCursor() did not throw exception.
+PASS index.openKeyCursor(0) did not throw exception.
+PASS index.openKeyCursor(0, 'next') did not throw exception.
+PASS index.openKeyCursor(IDBKeyRange.only(0)) did not throw exception.
+PASS index.openKeyCursor(IDBKeyRange.only(0), 'next') did not throw exception.
+
+transactionComplete():
+Expecting exception from store = transaction.objectStore('store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The transaction finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionactiveflagprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-active-flag-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-active-flag.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionaftercloseprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-after-close-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-after-close-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-after-close-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+Test closing a database connection in IndexedDB.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+request = store.put('x', 'y')
+PASS Put success
+running first transaction
+currentTransaction = db.transaction(['store'], 'readwrite')
+objectStore.put('a', 'b')
+db.close()
+Expecting exception from db.transaction(['store'], 'readwrite')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
+
+verify that we can reopen the db after calling close
+indexedDB.open(dbname)
+second_db = event.target.result
+currentTransaction = second_db.transaction(['store'], 'readwrite')
+request = store.put('1', '2')
+PASS final put success
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionaftercloseprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-after-close-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-after-close-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-after-close-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-after-close.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionandobjectstorecallsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,167 @@
</span><ins>+Test IndexedDB's transaction and objectStore calls
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('a')
+db.createObjectStore('b')
+db.createObjectStore('store').createIndex('index', 'some_path')
+
+trans = db.transaction(['a'])
+trans.objectStore('a')
+Expecting exception from trans.objectStore('b')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+Expecting exception from trans.objectStore('x')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+
+trans = db.transaction(['a'])
+trans.objectStore('a')
+Expecting exception from trans.objectStore('b')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+Expecting exception from trans.objectStore('x')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+
+trans = db.transaction(['b'])
+trans.objectStore('b')
+Expecting exception from trans.objectStore('a')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+Expecting exception from trans.objectStore('x')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+
+trans = db.transaction(['a', 'b'])
+trans.objectStore('a')
+trans.objectStore('b')
+Expecting exception from trans.objectStore('x')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+
+trans = db.transaction(['b', 'a'])
+trans.objectStore('a')
+trans.objectStore('b')
+Expecting exception from trans.objectStore('x')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+
+Passing a string as the first argument is a shortcut for just one object store:
+trans = db.transaction('a')
+trans.objectStore('a')
+Expecting exception from trans.objectStore('b')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+Expecting exception from trans.objectStore('x')
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The specified object store was not found.
+
+PASS trans = db.transaction() threw exception TypeError: Not enough arguments.
+
+Expecting exception from db.transaction(['x'])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction(['x'])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction(['a', 'x'])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction(['x', 'x'])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction(['a', 'x', 'b'])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+
+Exception thrown when no stores specified:
+Expecting exception from db.transaction([])
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_ACCESS_ERR
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': The storeNames parameter was empty.
+
+{} coerces to a string - so no match, but not a type error:
+Expecting exception from db.transaction({})
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction({mode:0})
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+
+Overriding the default string coercion makes these work:
+db.transaction({toString:function(){return 'a';}})
+db.transaction([{toString:function(){return 'a';}}])
+... but you still need to specify a real store:
+Expecting exception from db.transaction([{toString:function(){return 'x';}}])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction([{toString:function(){return 'x';}}])
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+
+trans = db.transaction(['store'])
+PASS trans is non-null.
+store = trans.objectStore('store')
+PASS store is non-null.
+store.get('some_key')
+transaction complete, ensuring methods fail
+PASS trans is non-null.
+PASS store is non-null.
+Expecting exception from trans.objectStore('store')
+PASS Exception was thrown.
+PASS code is 11
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'objectStore' on 'IDBTransaction': The transaction finished.
+Expecting exception from store.index('index')
+PASS Exception was thrown.
+PASS code is 11
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'index' on 'IDBObjectStore': The transaction is finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionandobjectstorecallsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-and-objectstore-calls-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-and-objectstore-calls.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionbasicsprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-basics-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-basics-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-basics-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,256 @@
</span><ins>+Test IndexedDB transaction basics.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+PASS self.db.objectStoreNames is []
+PASS self.db.objectStoreNames.length is 0
+PASS self.db.objectStoreNames.contains('storeFail') is false
+request = newConnection()
+indexedDB.open(dbname, 2)
+addRemoveIDBObjects():
+trans = event.target.transaction
+PASS trans is non-null.
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x')
+db.deleteObjectStore('storeFail')
+Expecting exception from store.deleteIndex('indexFail')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The object store has been deleted.
+
+testSetVersionAbort2():
+PASS self.db.objectStoreNames is []
+PASS self.db.objectStoreNames.length is 0
+PASS self.db.objectStoreNames.contains('storeFail') is false
+request = newConnection()
+indexedDB.open(dbname, 3)
+addRemoveAddIDBObjects():
+trans = event.target.transaction
+PASS trans is non-null.
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x')
+db.deleteObjectStore('storeFail')
+Expecting exception from store.deleteIndex('indexFail')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'deleteIndex' on 'IDBObjectStore': The object store has been deleted.
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x')
+
+testSetVersionAbort3():
+PASS event.cancelable is false
+PASS self.db.objectStoreNames is []
+PASS self.db.objectStoreNames.length is 0
+PASS self.db.objectStoreNames.contains('storeFail') is false
+request = newConnection()
+indexedDB.open(dbname, 4)
+addIDBObjects():
+PASS event.cancelable is false
+trans = event.target.transaction
+PASS trans is non-null.
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x')
+
+testInactiveAbortedTransaction():
+Expecting exception from index.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.getKey(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.count()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from store.put(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from store.add(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from store.delete(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.clear()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+
+testSetVersionAbort4():
+PASS self.db.objectStoreNames is []
+PASS self.db.objectStoreNames.length is 0
+PASS self.db.objectStoreNames.contains('storeFail') is false
+request = newConnection()
+indexedDB.open(dbname, 5)
+addIDBObjectsAndCommit():
+trans = event.target.transaction
+PASS trans is non-null.
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x')
+
+testInactiveCompletedTransaction():
+Expecting exception from index.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.openKeyCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openKeyCursor' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.getKey(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'getKey' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from index.count()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'count' on 'IDBIndex': The transaction is inactive or finished.
+Expecting exception from store.put(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from store.add(0, 0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is inactive or finished.
+Expecting exception from store.delete(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.clear()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'clear' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.get(0)
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction is inactive or finished.
+Expecting exception from store.openCursor()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'TransactionInactiveError'
+Exception message: Failed to execute 'openCursor' on 'IDBObjectStore': The transaction is inactive or finished.
+
+testSetVersionAbort5():
+PASS db.objectStoreNames is ['storeFail']
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('storeFail') is true
+request = newConnection()
+indexedDB.open(dbname, 6)
+removeIDBObjects():
+trans = event.target.transaction
+PASS trans is non-null.
+store = trans.objectStore('storeFail')
+store.deleteIndex('indexFail')
+db.deleteObjectStore('storeFail')
+
+testSetVersionAbort6():
+PASS db.objectStoreNames is ['storeFail']
+PASS db.objectStoreNames.length is 1
+PASS db.objectStoreNames.contains('storeFail') is true
+request = newConnection()
+indexedDB.open(dbname, 7)
+
+setVersionSuccess():
+trans = event.target.transaction
+PASS trans is non-null.
+Deleted all object stores.
+db.createObjectStore('storeName', null)
+
+completeCallback():
+PASS event.cancelable is false
+PASS complete event fired
+db.transaction(['storeName'])
+store = transaction.objectStore('storeName')
+PASS store.name is &quot;storeName&quot;
+PASS complete event fired
+
+Verifying DOMStringList works as argument for IDBDatabase.transaction()
+db.objectStoreNames is [object DOMStringList]
+... which contains: [&quot;storeName&quot;]
+transaction = db.transaction(db.objectStoreNames)
+PASS no exception thrown
+PASS transaction.objectStore(&quot;storeName&quot;) is non-null.
+PASS all stores present in transaction
+
+Verify that specifying an invalid mode raises an exception
+Expecting TypeError exception from db.transaction(['storeName'], 'lsakjdf')
+PASS Exception was thrown.
+PASS db.transaction(['storeName'], 'lsakjdf') threw TypeError: Failed to execute 'transaction' on 'IDBDatabase': The mode provided ('lsakjdf') is not one of 'readonly' or 'readwrite'.
+
+Test that null and undefined are treated as strings
+Expecting exception from db.transaction(null)
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+Expecting exception from db.transaction(undefined)
+PASS Exception was thrown.
+PASS code is DOMException.NOT_FOUND_ERR
+PASS ename is 'NotFoundError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': One of the specified object stores was not found.
+request = newConnection()
+indexedDB.open(dbname, 8)
+db.createObjectStore('null')
+db.createObjectStore('undefined')
+PASS transaction = db.transaction(null) did not throw exception.
+PASS transaction.objectStore('null') is non-null.
+PASS transaction = db.transaction(undefined) did not throw exception.
+PASS transaction.objectStore('undefined') is non-null.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionbasicsprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-basics-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-basics-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-basics-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-basics.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncompleteworkersprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+[Worker] Test IndexedDB workers, recursion, and transaction termination.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Starting worker: resources/transaction-complete-workers.js
+[Worker] indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+[Worker] 
+[Worker] indexedDB.deleteDatabase(dbname)
+[Worker] indexedDB.open(dbname)
+[Worker] 
+[Worker] prepareDatabase():
+[Worker] db.createObjectStore('store')
+[Worker] 
+[Worker] createTransaction():
+[Worker] transaction = db.transaction('store')
+[Worker] store = transaction.objectStore('store')
+PASS [Worker] Transaction completed
+[Worker] Expecting exception from store.get(0)
+PASS [Worker] Exception was thrown.
+PASS [Worker] code is 0
+PASS [Worker] ename is 'TransactionInactiveError'
+[Worker] Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction has finished.
+[Worker] 
+[Worker] recursionTest():
+[Worker] transaction = db.transaction('store')
+[Worker] store = transaction.objectStore('store')
+[Worker] store.get(0)
+PASS [Worker] transaction is active
+[Worker] recursion depth: 1
+[Worker] store.get(0)
+PASS [Worker] transaction is still active
+[Worker] recursion depth: 2
+[Worker] store.get(0)
+PASS [Worker] transaction is still active
+[Worker] recursion depth: 3
+[Worker] store.get(0)
+PASS [Worker] transaction is still active
+[Worker] recursion depth: 3
+[Worker] store.get(0)
+PASS [Worker] transaction is still active
+[Worker] recursion depth: 2
+[Worker] store.get(0)
+PASS [Worker] transaction is still active
+[Worker] recursion depth: 1
+[Worker] store.get(0)
+PASS [Worker] transaction is still active
+PASS [Worker] transaction completed
+[Worker] Expecting exception from store.get(0)
+PASS [Worker] Exception was thrown.
+PASS [Worker] code is 0
+PASS [Worker] ename is 'TransactionInactiveError'
+[Worker] Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction has finished.
+[Worker] 
+[Worker] trying a timeout callback:
+[Worker] setTimeout(timeoutTest, 0)
+[Worker] 
+[Worker] timeoutTest():
+[Worker] transaction = db.transaction('store')
+[Worker] store = transaction.objectStore('store')
+PASS [Worker] transaction started in setTimeout() callback completed
+[Worker] Expecting exception from store.get(0)
+PASS [Worker] Exception was thrown.
+PASS [Worker] code is 0
+PASS [Worker] ename is 'TransactionInactiveError'
+[Worker] Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction has finished.
+[Worker] 
+[Worker] errorTest():
+[Worker] self.old_onerror = self.onerror
+[Worker] self.onerror = errorHandler
+[Worker] 
+[Worker] errorHandler():
+[Worker] self.onerror = self.old_onerror
+[Worker] transaction = db.transaction('store')
+[Worker] store = transaction.objectStore('store')
+Got expected error from worker, ignoring
+event.preventDefault()
+PASS [Worker] Transaction completed
+[Worker] Expecting exception from store.get(0)
+PASS [Worker] Exception was thrown.
+PASS [Worker] code is 0
+PASS [Worker] ename is 'TransactionInactiveError'
+[Worker] Exception message: Failed to execute 'get' on 'IDBObjectStore': The transaction has finished.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncompleteworkersprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-complete-workers-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script&gt;
+
+worker = startWorker('resources/transaction-complete-workers.js');
+
+// FIXME: It should be possible for the worker to set self.onerror to catch the event
+// and call event.preventDefault(), but in the current Worker implementation the raw
+// exception is seen by the event handler in the worker, not an ErrorEvent object.
+
+var orig_onerror = worker.onerror;
+worker.onerror = function (event) {
+    if (event.message === &quot;Uncaught Error: ignore this&quot; || event.message === &quot;Error: ignore this&quot;) {
+        debug(&quot;Got expected error from worker, ignoring&quot;);
+        evalAndLog(&quot;event.preventDefault()&quot;);
+    } else if (orig_onerror) {
+        orig_onerror(event);
+    }
+};
+
+
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncoordinationacrossdatabasesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+Check that transactions in different databases can run in parallel.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+dbname1 = dbname + '1'
+dbname2 = dbname + '2'
+
+deleteDatabase1():
+indexedDB.deleteDatabase(dbname1)
+
+deleteDatabase2():
+indexedDB.deleteDatabase(dbname2)
+
+openDatabase1():
+indexedDB.open(dbname1, 1)
+
+openOnUpgradeNeeded1():
+db1 = event.target.result
+store1 = db1.createObjectStore('store')
+store1.put(0, 0)
+
+openOnSuccess1():
+db1 = event.target.result
+
+openDatabase2():
+indexedDB.open(dbname2, 1)
+
+onUpgradeNeeded2():
+db2 = event.target.result
+store2 = db2.createObjectStore('store')
+
+openOnSuccess2():
+db2 = event.target.result
+
+startWork():
+transaction1 = db1.transaction('store', 'readwrite')
+transaction2 = db2.transaction('store', 'readwrite')
+transaction1PutSuccess = false
+transaction2PutSuccess = false
+Keep both transactions alive until each has reported at least one successful operation
+
+onTransactionComplete():
+first transaction complete, still waiting...
+
+onTransactionComplete():
+PASS transaction1PutSuccess is true
+PASS transaction2PutSuccess is true
+db1.close()
+db2.close()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncoordinationacrossdatabasesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-coordination-across-databases-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-coordination-across-databases.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncoordinationwithindatabaseprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+Check that read-only transactions within a database can run in parallel.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+db = event.target.result
+store = db.createObjectStore('store')
+store.put('value', 'key')
+
+runParallelTransactions():
+db = event.target.result
+
+transaction1 = db.transaction('store', 'readonly')
+transaction2 = db.transaction('store', 'readonly')
+transaction1GetSuccess = false
+transaction2GetSuccess = false
+Keep both transactions alive until each has reported at least one successful operation
+
+onTransactionComplete():
+first transaction complete, still waiting...
+
+onTransactionComplete():
+PASS transaction1GetSuccess is true
+PASS transaction2GetSuccess is true
+db.close()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncoordinationwithindatabaseprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-coordination-within-database-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-coordination-within-database.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncrashonabortprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+Test IndexedDB transaction does not crash on abort.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('foo')
+db.transaction('foo')
+self.gc()
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioncrashonabortprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-crash-on-abort-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-crash-on-abort.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionerrorprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-error-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-error-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-error-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,60 @@
</span><ins>+Test IDBTransaction.error cases.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName')
+store.add('value', 'key')
+
+trans = db.transaction('storeName')
+
+IDBTransaction.error should be null if transaction is not finished:
+PASS trans.error is null
+
+transaction() should throw if one of the DOMStringList items cannot be converted to a String:
+PASS db.transaction(['storeName', nonConvertibleToString]) threw exception Exception in toString().
+
+If IDBTransaction.abort() is explicitly called, IDBTransaction.error should be null:
+trans.abort()
+PASS trans.error is null
+
+If the transaction is aborted due to a request error that is not prevented, IDBTransaction.error should match:
+trans = db.transaction('storeName', 'readwrite')
+request = trans.objectStore('storeName').add('value2', 'key')
+PASS request.error.name is 'ConstraintError'
+request_error = request.error
+Transaction received abort event.
+PASS trans.error is non-null.
+PASS trans.error is request_error
+
+If the transaction is aborted due to an exception thrown from event callback, IDBTransaction.error should be AbortError:
+trans = db.transaction('storeName', 'readwrite')
+request = trans.objectStore('storeName').add('value2', 'key')
+PASS request.error.name is 'ConstraintError'
+Throwing exception...
+Transaction received abort event.
+PASS trans.error is non-null.
+PASS trans.error.name is 'AbortError'
+
+If the transaction is aborted due to an error during commit, IDBTransaction.error should reflect that error:
+trans = db.transaction('storeName', 'readwrite')
+request = trans.objectStore('storeName').add({id: 1}, 'record1')
+request = trans.objectStore('storeName').add({id: 1}, 'record2')
+request = indexedDB.open(dbname, 2)
+trans = request.transaction
+This should fail due to the unique constraint:
+indexName = 'Also test utf8: 漢'
+trans.objectStore('storeName').createIndex(indexName, 'id', {unique: true})
+Transaction received abort event.
+PASS trans.error is non-null.
+PASS trans.error.name is 'ConstraintError'
+Note: This fails because of http://wkb.ug/37327
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionerrorprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-error-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-error-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-error-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-error.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioneventpropagationprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+Test event propogation on IDBTransaction.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('storeName', null)
+store.add({x: 'value', y: 'zzz'}, 'key')
+Verifing abort
+trans = db.transaction(['storeName'], 'readwrite')
+trans.onabort = abortFiredCallback
+trans.oncomplete = unexpectedAbortCallback
+db.addEventListener('abort', dbAbortCaptureCallback, true)
+db.addEventListener('abort', dbAbortBubbleCallback, false)
+db.addEventListener('complete', unexpectedCompleteCallback, true)
+db.addEventListener('complete', unexpectedCompleteCallback, false)
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key')
+
+In IDBDatabase abort capture
+PASS dbCaptureFired is false
+PASS abortFired is false
+PASS dbBubbleFired1 is false
+PASS event.target is trans
+PASS event.currentTarget is db
+
+In abort handler
+PASS dbCaptureFired is true
+PASS abortFired is false
+PASS dbBubbleFired1 is false
+PASS event.target is trans
+PASS event.currentTarget is trans
+
+In IDBDatabase error bubble
+PASS dbCaptureFired is true
+PASS abortFired is true
+PASS dbBubbleFired1 is false
+PASS event.target is trans
+PASS event.currentTarget is db
+
+Verifing success.
+trans = db.transaction(['storeName'], 'readwrite')
+trans.oncomplete = completeFiredCallback
+trans.onabort = unexpectedAbortCallback
+db.removeEventListener('abort', dbAbortCaptureCallback, true)
+db.removeEventListener('abort', dbAbortBubbleCallback, false)
+db.removeEventListener('complete', unexpectedCompleteCallback, true)
+db.removeEventListener('complete', unexpectedCompleteCallback, false)
+db.addEventListener('complete', dbCompleteCaptureCallback, true)
+db.addEventListener('complete', dbCompleteBubbleCallback, false)
+db.addEventListener('abort', unexpectedAbortCallback, true)
+db.addEventListener('abort', unexpectedAbortCallback, false)
+store = trans.objectStore('storeName')
+store.add({x: 'value', y: 'zzz'}, 'key2')
+
+In IDBDatabase complete capture
+PASS dbCaptureFired is false
+PASS completeFired is false
+PASS dbBubbleFired2 is false
+PASS event.target is trans
+PASS event.currentTarget is db
+
+In IDBRequest handler
+PASS dbCaptureFired is true
+PASS completeFired is false
+PASS dbBubbleFired2 is false
+PASS event.target is trans
+PASS event.currentTarget is trans
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactioneventpropagationprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-event-propagation-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-event-propagation.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionreadonlyprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-read-only-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-read-only-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-read-only-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+Test read-only transactions in IndexedDB.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+store = db.createObjectStore('store')
+store.put('x', 'y')
+trans = db.transaction('store')
+Expecting exception from trans.objectStore('store').put('a', 'b')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to store record in an IDBObjectStore: The transaction is read-only.
+trans = db.transaction('store')
+Expecting exception from trans.objectStore('store').delete('x')
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'delete' on 'IDBObjectStore': The transaction is read-only.
+trans = db.transaction('store')
+cur = trans.objectStore('store').openCursor()
+PASS !event.target.result is false
+Expecting exception from event.target.result.delete()
+PASS Exception was thrown.
+PASS code is 0
+PASS ename is 'ReadOnlyError'
+Exception message: Failed to execute 'delete' on 'IDBCursor': The record may not be deleted inside a read-only transaction.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionreadonlyprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-read-only-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-read-only-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-read-only-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-read-only.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionreadwriteexclusiveprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+Check that readwrite transactions with overlapping scopes do not run in parallel.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+openConnection1():
+indexedDB.open(dbname, 1)
+
+openOnUpgradeNeeded1():
+db = event.target.result
+store = db.createObjectStore('store')
+
+openOnSuccess():
+db1 = event.target.result
+
+openConnection2():
+indexedDB.open(dbname, 1)
+
+openOnSuccess2():
+db2 = event.target.result
+
+startWork():
+transaction1 = db1.transaction('store', 'readwrite')
+transaction2 = db2.transaction('store', 'readwrite')
+transaction1PutSuccess = false
+transaction1Complete = false
+transaction2PutSuccess = false
+transaction2Complete = false
+
+Keep transaction1 alive for a while and ensure transaction2 doesn't start
+count = 0
+transaction1.objectStore('store').put(1, count++)
+transaction2.objectStore('store').put(2, 0)
+
+put1OnSuccess():
+transaction1PutSuccess = true
+transaction1.objectStore('store').put(1, count++)
+
+put1OnSuccess():
+transaction1PutSuccess = true
+transaction1.objectStore('store').put(1, count++)
+
+put1OnSuccess():
+transaction1PutSuccess = true
+transaction1.objectStore('store').put(1, count++)
+
+put1OnSuccess():
+transaction1PutSuccess = true
+transaction1.objectStore('store').put(1, count++)
+
+put1OnSuccess():
+transaction1PutSuccess = true
+
+onTransaction1Complete():
+transaction1Complete = true
+PASS transaction2PutSuccess is false
+PASS transaction2Complete is false
+
+put2OnSuccess():
+transaction2PutSuccess = true
+PASS transaction1Complete is true
+
+onTransaction2Complete():
+transaction2Complete = true
+PASS transaction1PutSuccess is true
+PASS transaction1Complete is true
+PASS transaction2PutSuccess is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionreadwriteexclusiveprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-readwrite-exclusive-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-readwrite-exclusive.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionrollbackprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-rollback-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-rollback-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-rollback-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+Test IndexedDB transaction rollback.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('myObjectStore')
+PASS db.objectStoreNames.length is 1
+setVersionComplete():
+transaction = db.transaction(['myObjectStore'], 'readwrite')
+store = transaction.objectStore('myObjectStore')
+store.add('rollbackValue', 'rollbackKey123')
+addSuccess():
+PASS event.target.result is &quot;rollbackKey123&quot;
+store.openCursor()
+openCursorSuccess():
+cursor = event.target.result
+abortCallback():
+Transaction was aborted.
+transaction = db.transaction(['myObjectStore'], 'readonly')
+store = transaction.objectStore('myObjectStore')
+store.get('rollbackKey123')
+getSuccess():
+PASS event.target.result is undefined
+PASS cursor.value is &quot;rollbackValue&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionrollbackprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-rollback-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-rollback-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-rollback-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-rollback.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionscopesequencingprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+Check that scope restrictions on read-write transactions are enforced.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+db = event.target.result
+db.createObjectStore('a')
+db.createObjectStore('b')
+db.createObjectStore('c')
+
+runTransactions():
+db = event.target.result
+
+transaction1 = db.transaction(['a'], 'readwrite')
+transaction1Started = false
+transaction1Complete = false
+transaction1.objectStore('a').get(0)
+
+transaction2 overlaps with transaction1, so must wait until transaction1 completes
+transaction2 = db.transaction(['a', 'b'], 'readwrite')
+transaction2Started = false
+transaction2Complete = false
+transaction2.objectStore('a').get(0)
+
+transaction3 overlaps with transaction2, so must wait until transaction2 completes
+even though it does not overlap with transaction1
+transaction3 = db.transaction(['b', 'c'], 'readwrite')
+transaction3Started = false
+transaction3Complete = false
+transaction3.objectStore('b').get(0)
+
+transaction1Started = true
+
+transaction1Complete = true
+PASS transaction2Started is false
+PASS transaction3Started is false
+
+PASS transaction1Complete is true
+transaction2Started = true
+
+transaction2Complete = true
+PASS transaction3Started is false
+
+PASS transaction1Complete is true
+PASS transaction2Complete is true
+transaction3Started = true
+
+transaction3Complete = true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionscopesequencingprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-scope-sequencing-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-scope-sequencing.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionstarvationprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-starvation-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-starvation-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-starvation-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+Check that read-only transactions don't starve read-write transactions.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+prepareDatabase():
+db = event.target.result
+db.createObjectStore('store')
+
+runTransactions():
+db = event.target.result
+
+readWriteTransactionStarted = false
+readWriteTransactionComplete = false
+
+startReadOnlyTransaction():
+transaction = db.transaction('store', 'readonly')
+store = transaction.objectStore('store')
+Keep the transaction alive with an endless series of gets
+
+startReadWriteTransaction():
+transaction = db.transaction('store', 'readwrite')
+readWriteTransactionStarted = true
+
+readWriteTransactionComplete():
+PASS Transaction wasn't starved
+readWriteTransactionComplete = true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionstoreNamesrequiredprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+Test IndexedDB: transaction storeNames required arguments
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+PASS db.transaction(); threw exception TypeError: Not enough arguments.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbtransactionstoreNamesrequiredprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/transaction-storeNames-required-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/transaction-storeNames-required.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbunblockedversionchangesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+Ensure that metadata remains correct when an aborted version change is followed by another.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+
+openConnection():
+request = indexedDB.open(dbname, 2)
+
+onUpgradeNeeded():
+db = request.result
+PASS db.version is 2
+transaction = request.transaction
+request = indexedDB.open(dbname, 3)
+transaction.abort()
+
+onError():
+PASS db.version is 0
+
+onUpgradeNeeded2():
+db = request.result
+PASS db.version is 3
+
+onSuccess():
+db = request.result
+PASS db.version is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbunblockedversionchangesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/unblocked-version-changes.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbunprefixprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/unprefix-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/unprefix-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/unprefix-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+Check that IDBFactory is available through the prefixed or unprefixed entry point.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS String(self.indexedDB) is &quot;[object IDBFactory]&quot;
+PASS String(self.webkitIndexedDB) is &quot;[object IDBFactory]&quot;
+PASS IDBCursor is non-null.
+PASS IDBDatabase is non-null.
+PASS IDBFactory is non-null.
+PASS IDBIndex is non-null.
+PASS IDBKeyRange is non-null.
+PASS IDBObjectStore is non-null.
+PASS IDBRequest is non-null.
+PASS IDBTransaction is non-null.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbunprefixprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/unprefix-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/unprefix-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/unprefix-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/unprefix.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbvalueundefinedprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/value-undefined-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/value-undefined-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/value-undefined-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+Test IndexedDB undefined as record value
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+objectStore = db.createObjectStore('foo');
+result = objectStore.add(undefined, Infinity);
+result = objectStore.get(Infinity);
+value = event.target.result;
+PASS value is undefined
+result = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.key is Infinity
+PASS cursor.value is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbvalueundefinedprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/value-undefined-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/value-undefined-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/value-undefined-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/value-undefined.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbvaluesoddtypesprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/values-odd-types-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/values-odd-types-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/values-odd-types-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IndexedDB odd value datatypes
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+db.createObjectStore('foo', {autoIncrement: true});
+adding regexp value
+objectStore.add(validTypes[nextToAdd].value)
+adding date value
+objectStore.add(validTypes[nextToAdd].value)
+adding object value
+objectStore.add(validTypes[nextToAdd].value)
+adding imagedata value
+objectStore.add(validTypes[nextToAdd].value)
+request = objectStore.openCursor();
+cursor = event.target.result;
+PASS cursor.value.toString() is validTypes[valueIndex].value.toString()
+cursor.continue();
+valueIndex++;
+cursor = event.target.result;
+PASS cursor.value.toString() is validTypes[valueIndex].value.toString()
+PASS cursor.value.toUTCString() is &quot;Thu, 01 Jan 1970 00:00:00 GMT&quot;
+cursor.continue();
+valueIndex++;
+cursor = event.target.result;
+PASS cursor.value.toString() is validTypes[valueIndex].value.toString()
+cursor.continue();
+valueIndex++;
+cursor = event.target.result;
+PASS cursor.value.toString() is validTypes[valueIndex].value.toString()
+PASS cursor.value.width is 1
+cursor.continue();
+valueIndex++;
+cursor = event.target.result;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbvaluesoddtypesprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/values-odd-types-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/values-odd-types-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/values-odd-types-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/values-odd-types.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbversionchangeabortprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/version-change-abort-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/version-change-abort-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/version-change-abort-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+Ensure that aborted VERSION_CHANGE transactions are completely rolled back
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+PASS trans instanceof IDBTransaction is true
+store = db.createObjectStore('store1')
+setVersion1 complete
+PASS db.version is 1
+
+vcreq = indexedDB.open(dbname, 2)
+setVersion2() callback
+PASS db.version is 2
+PASS vcreq.transaction instanceof IDBTransaction is true
+store = db.deleteObjectStore('store1')
+store = db.createObjectStore('store2')
+raising exception
+
+setVersion2Abort() callback
+request = indexedDB.open(dbname)
+PASS db.version is 1
+PASS db.objectStoreNames.contains('store1') is true
+PASS db.objectStoreNames.contains('store2') is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbversionchangeabortprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/version-change-abort-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/version-change-abort-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/version-change-abort-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/version-change-abort.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbversionchangeexclusiveprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+Ensure pending open waits for version change transaction to complete.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+calling open() - callback should wait until VERSION_CHANGE transaction is complete
+indexedDB.open(dbname)
+setVersion() callback
+starting work in VERSION_CHANGE transaction
+self.state = 'VERSION_CHANGE started'
+store = db.createObjectStore('test-store')
+Expecting exception from db.transaction('test-store')
+PASS Exception was thrown.
+PASS code is DOMException.INVALID_STATE_ERR
+PASS ename is 'InvalidStateError'
+Exception message: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.
+store.put(0, 0)
+in put's onsuccess
+store.put(1, 1)
+in put's onsuccess
+store.put(2, 2)
+in put's onsuccess
+store.put(3, 3)
+in put's onsuccess
+store.put(4, 4)
+in put's onsuccess
+store.put(5, 5)
+in put's onsuccess
+store.put(6, 6)
+in put's onsuccess
+store.put(7, 7)
+in put's onsuccess
+store.put(8, 8)
+in put's onsuccess
+store.put(9, 9)
+in put's onsuccess
+ending work in VERSION_CHANGE transaction
+self.state = 'VERSION_CHANGE finished'
+open() callback - this should appear after VERSION_CHANGE transaction ends
+PASS self.state is &quot;VERSION_CHANGE finished&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbversionchangeexclusiveprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/version-change-exclusive-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/version-change-exclusive.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbversionchangerequestactivedomobjectprivateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private-expected.txt (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private-expected.txt        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+Ensure that IDBVersionChangeRequest objects are not GC'd if they have pending events
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+
+self.dbname = 'versionchangerequest-activedomobject'
+
+testDeleteDatabase():
+indexedDB.deleteDatabase(self.dbname)
+self.gc()
+PASS deleteDatabase's IDBVersionChangeRequest.onsuccess event fired
+
+testSetVersion():
+indexedDB.open(self.dbname)
+self.gc()
+PASS IDBOpenDBRequest received upgradeneeded event
+PASS IDBOpenDBRequest received success event
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbversionchangerequestactivedomobjectprivatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private.html (0 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/versionchangerequest-activedomobject-private.html        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/versionchangerequest-activedomobject.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/Source/WebCore/ChangeLog        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2016-01-18  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB: Add private-browsing variant for many IDB tests, and enable private browsing in Modern IDB.
+        https://bugs.webkit.org/show_bug.cgi?id=153179
+
+        Reviewed by Darin Adler.
+
+        Tests: Many private-browsing copies of existing IDB tests.
+
+        * Modules/indexeddb/client/IDBFactoryImpl.cpp:
+        (WebCore::IDBClient::shouldThrowSecurityException): Allow IDB access in private browsing.
+
</ins><span class="cx"> 2016-01-18  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS Simulator WK1] ASSERT loading Blink layout test imported/web-platform-tests/mediacapture-streams/stream-api/mediastream/mediastream-idl.html
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBFactoryImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp (195246 => 195247)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp        2016-01-19 04:08:56 UTC (rev 195246)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp        2016-01-19 06:02:30 UTC (rev 195247)
</span><span class="lines">@@ -52,8 +52,6 @@
</span><span class="cx">             return true;
</span><span class="cx">         if (!document.page())
</span><span class="cx">             return true;
</span><del>-        if (document.page()-&gt;usesEphemeralSession() &amp;&amp; !SchemeRegistry::allowsDatabaseAccessInPrivateBrowsing(document.securityOrigin()-&gt;protocol()))
-            return true;
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!context-&gt;securityOrigin()-&gt;canAccessDatabase(context-&gt;topOrigin()))
</span></span></pre>
</div>
</div>

</body>
</html>