diff options
author | Ben Murdoch <benm@google.com> | 2010-10-22 13:02:20 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2010-10-26 15:21:41 +0100 |
commit | a94275402997c11dd2e778633dacf4b7e630a35d (patch) | |
tree | e66f56c67e3b01f22c9c23cd932271ee9ac558ed /LayoutTests | |
parent | 09e26c78506587b3f5d930d7bc72a23287ffbec0 (diff) | |
download | external_webkit-a94275402997c11dd2e778633dacf4b7e630a35d.zip external_webkit-a94275402997c11dd2e778633dacf4b7e630a35d.tar.gz external_webkit-a94275402997c11dd2e778633dacf4b7e630a35d.tar.bz2 |
Merge WebKit at r70209: Initial merge by Git
Change-Id: Id23a68efa36e9d1126bcce0b137872db00892c8e
Diffstat (limited to 'LayoutTests')
77 files changed, 3155 insertions, 461 deletions
diff --git a/LayoutTests/fast/dom/DeviceMotion/no-page-cache-expected.txt b/LayoutTests/fast/dom/DeviceMotion/no-page-cache-expected.txt new file mode 100644 index 0000000..1dee7cd --- /dev/null +++ b/LayoutTests/fast/dom/DeviceMotion/no-page-cache-expected.txt @@ -0,0 +1,14 @@ +Tests that pages that use DeviceMotion are not put in the page cache. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +Main page opening resources/cached-page-1.html +resources/cached-page-1.html onload fired, count = 1 +resources/cached-page-1.html about to navigate to resources/cached-page-2.html +resources/cached-page-2.html about to go back to resources/cached-page-1.html +resources/cached-page-1.html onload fired, count = 2 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/dom/DeviceMotion/no-page-cache.html b/LayoutTests/fast/dom/DeviceMotion/no-page-cache.html new file mode 100644 index 0000000..2e09eac --- /dev/null +++ b/LayoutTests/fast/dom/DeviceMotion/no-page-cache.html @@ -0,0 +1,12 @@ +<html> +<head> +<link rel="stylesheet" href="../../js/resources/js-test-style.css"> +<script src="../../js/resources/js-test-pre.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script src="script-tests/no-page-cache.js"></script> +<script src="../../js/resources/js-test-post.js"></script> +</body> +</html> diff --git a/LayoutTests/fast/dom/DeviceMotion/resources/cached-page-1.html b/LayoutTests/fast/dom/DeviceMotion/resources/cached-page-1.html new file mode 100644 index 0000000..759fbf9 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceMotion/resources/cached-page-1.html @@ -0,0 +1,11 @@ +<script> +function loadNext() { + window.addEventListener('devicemotion', function() {}); + if (window.opener.reportPageOneOnload() == 1) { + window.opener.debug('resources/cached-page-1.html about to navigate to resources/cached-page-2.html') + // Location changes need to happen outside the onload handler to generate history entries. + setTimeout(function() { location.href = 'cached-page-2.html'; }, 0); + } +} +</script> +<body onload="loadNext()"></body> diff --git a/LayoutTests/fast/dom/DeviceMotion/resources/cached-page-2.html b/LayoutTests/fast/dom/DeviceMotion/resources/cached-page-2.html new file mode 100644 index 0000000..5478f9c --- /dev/null +++ b/LayoutTests/fast/dom/DeviceMotion/resources/cached-page-2.html @@ -0,0 +1,8 @@ +<script> +function init() { + window.opener.pageTwoLoaded = true; + window.opener.debug('resources/cached-page-2.html about to go back to resources/cached-page-1.html'); + history.back(); +} +</script> +<body onload="init()"></body> diff --git a/LayoutTests/fast/dom/DeviceMotion/script-tests/no-page-cache.js b/LayoutTests/fast/dom/DeviceMotion/script-tests/no-page-cache.js new file mode 100644 index 0000000..67cfcf6 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceMotion/script-tests/no-page-cache.js @@ -0,0 +1,24 @@ +description('Tests that pages that use DeviceMotion are not put in the page cache.'); + +if (window.layoutTestController) { + layoutTestController.waitUntilDone(); + layoutTestController.setCanOpenWindows(); + layoutTestController.overridePreference('WebKitUsesPageCachePreferenceKey', 1); +} else + debug('This test can not be run without the LayoutTestController'); + +var pageOneOnloadCount = 0; +function reportPageOneOnload() { + ++pageOneOnloadCount; + debug('resources/cached-page-1.html onload fired, count = ' + pageOneOnloadCount); + if (pageOneOnloadCount == 2) { + finishJSTest(); + } + return pageOneOnloadCount; +} + +debug("Main page opening resources/cached-page-1.html"); +window.open("resources/cached-page-1.html"); + +window.jsTestIsAsync = true; +window.successfullyParsed = true; diff --git a/LayoutTests/fast/dom/DeviceOrientation/create-event-onorientationchange-expected.txt b/LayoutTests/fast/dom/DeviceOrientation/create-event-onorientationchange-expected.txt new file mode 100644 index 0000000..0f0aac6 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/create-event-onorientationchange-expected.txt @@ -0,0 +1,16 @@ +Tests that document.createEvent() works with orientationChange + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + + +FAIL... orientationChange event doesn't appear to be enabled or implemented. + + +PASS successfullyParsed is true + +TEST COMPLETE + + + + diff --git a/LayoutTests/fast/dom/DeviceOrientation/create-event-onorientationchange.html b/LayoutTests/fast/dom/DeviceOrientation/create-event-onorientationchange.html new file mode 100644 index 0000000..7a033e0 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/create-event-onorientationchange.html @@ -0,0 +1,13 @@ +<html> +<head> +<link rel="stylesheet" href="../../js/resources/js-test-style.css"> +<script src="../../js/resources/js-test-pre.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></p> +<div id="result"></div> +<script src="script-tests/create-event-onorientationchange.js"></script> +<script src="../../js/resources/js-test-post.js"></script> +</body> +</html> diff --git a/LayoutTests/fast/dom/DeviceOrientation/event-after-navigation-expected.txt b/LayoutTests/fast/dom/DeviceOrientation/event-after-navigation-expected.txt new file mode 100644 index 0000000..8e6bc39 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/event-after-navigation-expected.txt @@ -0,0 +1,3 @@ +Tests for a crash where an event is fired after the page has been navigated away when the original page is in the page cache. + +SUCCESS diff --git a/LayoutTests/fast/dom/DeviceOrientation/event-after-navigation.html b/LayoutTests/fast/dom/DeviceOrientation/event-after-navigation.html new file mode 100644 index 0000000..ced3703 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/event-after-navigation.html @@ -0,0 +1,12 @@ +<html> +<head> +<link rel="stylesheet" href="../../js/resources/js-test-style.css"> +<script src="../../js/resources/js-test-pre.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script src="script-tests/event-after-navigation.js"></script> +<script src="../../js/resources/js-test-post.js"></script> +</body> +</html> diff --git a/LayoutTests/fast/dom/DeviceOrientation/no-page-cache-expected.txt b/LayoutTests/fast/dom/DeviceOrientation/no-page-cache-expected.txt new file mode 100644 index 0000000..0217208 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/no-page-cache-expected.txt @@ -0,0 +1,14 @@ +Tests that pages that use DeviceOrientation are not put in the page cache. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +Main page opening resources/cached-page-1.html +resources/cached-page-1.html onload fired, count = 1 +resources/cached-page-1.html about to navigate to resources/cached-page-2.html +resources/cached-page-2.html about to go back to resources/cached-page-1.html +resources/cached-page-1.html onload fired, count = 2 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/dom/DeviceOrientation/no-page-cache.html b/LayoutTests/fast/dom/DeviceOrientation/no-page-cache.html new file mode 100644 index 0000000..2e09eac --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/no-page-cache.html @@ -0,0 +1,12 @@ +<html> +<head> +<link rel="stylesheet" href="../../js/resources/js-test-style.css"> +<script src="../../js/resources/js-test-pre.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script src="script-tests/no-page-cache.js"></script> +<script src="../../js/resources/js-test-post.js"></script> +</body> +</html> diff --git a/LayoutTests/fast/dom/DeviceOrientation/resources/cached-page-1.html b/LayoutTests/fast/dom/DeviceOrientation/resources/cached-page-1.html new file mode 100644 index 0000000..2d76889 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/resources/cached-page-1.html @@ -0,0 +1,11 @@ +<script> +function loadNext() { + window.addEventListener('deviceorientation', function() {}); + if (window.opener.reportPageOneOnload() == 1) { + window.opener.debug('resources/cached-page-1.html about to navigate to resources/cached-page-2.html') + // Location changes need to happen outside the onload handler to generate history entries. + setTimeout(function() { location.href = 'cached-page-2.html'; }, 0); + } +} +</script> +<body onload="loadNext()"></body> diff --git a/LayoutTests/fast/dom/DeviceOrientation/resources/cached-page-2.html b/LayoutTests/fast/dom/DeviceOrientation/resources/cached-page-2.html new file mode 100644 index 0000000..5478f9c --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/resources/cached-page-2.html @@ -0,0 +1,8 @@ +<script> +function init() { + window.opener.pageTwoLoaded = true; + window.opener.debug('resources/cached-page-2.html about to go back to resources/cached-page-1.html'); + history.back(); +} +</script> +<body onload="init()"></body> diff --git a/LayoutTests/fast/dom/DeviceOrientation/resources/event-after-navigation-new.html b/LayoutTests/fast/dom/DeviceOrientation/resources/event-after-navigation-new.html new file mode 100644 index 0000000..157e050 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/resources/event-after-navigation-new.html @@ -0,0 +1,15 @@ +<html> + <head> + </head> + <body> + Tests for a crash where an event is fired after the page has been navigated + away when the original page is in the page cache.<br><br> + SUCCESS + <script> + if (window.layoutTestController) { + layoutTestController.setMockDeviceOrientation(true, 1.1, true, 2.2, true, 3.3); + layoutTestController.notifyDone(); + } + </script> + </body> +</html> diff --git a/LayoutTests/fast/dom/DeviceOrientation/script-tests/create-event-onorientationchange.js b/LayoutTests/fast/dom/DeviceOrientation/script-tests/create-event-onorientationchange.js new file mode 100644 index 0000000..a63685b --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/script-tests/create-event-onorientationchange.js @@ -0,0 +1,18 @@ +description('Tests that document.createEvent() works with orientationChange') + +function handleOrientationChange() +{ + document.getElementById('result').innerHTML = "PASS"; +} + +window.addEventListener('onorientationchange', handleOrientationChange, false); + +try { + var event = document.createEvent("OrientationEvent"); + event.initEvent("orientationchange", false, false); + window.dispatchEvent(event); +} catch(e) { + document.getElementById('result').innerHTML = "FAIL... orientationChange event doesn't appear to be enabled or implemented."; +} + +window.successfullyParsed = true; diff --git a/LayoutTests/fast/dom/DeviceOrientation/script-tests/event-after-navigation.js b/LayoutTests/fast/dom/DeviceOrientation/script-tests/event-after-navigation.js new file mode 100644 index 0000000..2756e55 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/script-tests/event-after-navigation.js @@ -0,0 +1,12 @@ +description('Tests for a crash where an event is fired after the page has been navigated away when the original page is in the page cache.'); + +if (window.layoutTestController) + layoutTestController.overridePreference('WebKitUsesPageCachePreferenceKey', 1); +else + debug('This test can not be run without the LayoutTestController'); + +window.addEventListener('deviceorientation', function() { } ); +window.location = "resources/event-after-navigation-new.html"; + +window.jsTestIsAsync = true; +window.successfullyParsed = true; diff --git a/LayoutTests/fast/dom/DeviceOrientation/script-tests/no-page-cache.js b/LayoutTests/fast/dom/DeviceOrientation/script-tests/no-page-cache.js new file mode 100644 index 0000000..cbfb501 --- /dev/null +++ b/LayoutTests/fast/dom/DeviceOrientation/script-tests/no-page-cache.js @@ -0,0 +1,24 @@ +description('Tests that pages that use DeviceOrientation are not put in the page cache.'); + +if (window.layoutTestController) { + layoutTestController.waitUntilDone(); + layoutTestController.setCanOpenWindows(); + layoutTestController.overridePreference('WebKitUsesPageCachePreferenceKey', 1); +} else + debug('This test can not be run without the LayoutTestController'); + +var pageOneOnloadCount = 0; +function reportPageOneOnload() { + ++pageOneOnloadCount; + debug('resources/cached-page-1.html onload fired, count = ' + pageOneOnloadCount); + if (pageOneOnloadCount == 2) { + finishJSTest(); + } + return pageOneOnloadCount; +} + +debug("Main page opening resources/cached-page-1.html"); +window.open("resources/cached-page-1.html"); + +window.jsTestIsAsync = true; +window.successfullyParsed = true; diff --git a/LayoutTests/fast/dom/HTMLAnchorElement/script-tests/set-href-attribute-prevents-rebase.js b/LayoutTests/fast/dom/HTMLAnchorElement/script-tests/set-href-attribute-prevents-rebase.js new file mode 100644 index 0000000..139a9e5 --- /dev/null +++ b/LayoutTests/fast/dom/HTMLAnchorElement/script-tests/set-href-attribute-prevents-rebase.js @@ -0,0 +1,118 @@ +description('Tests that when an href attribute is set, the href is no longer subject to updates to the document base URI.'); + +var a = document.createElement('a'); +var base = document.createElement('base'); +document.head.appendChild(base); + + +debug("Search attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "?search"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://new_base/?search'"); + +debug("Search attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "?foo"; +a.search = "search"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://old_base/?search'"); +debug(''); + + +debug("Pathname attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "path"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://new_base/path'"); + +debug("Pathname attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "foo"; +a.pathname = "path"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://old_base/path'"); +debug(''); + + +debug("Hash attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "#hash"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://new_base/#hash'"); + +debug("Pathname attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "#foo"; +a.hash = "hash"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://old_base/#hash'"); +debug(''); + + +debug('Note that for the following attributes, updating the document base URI has no effect because we have to use an abosulte URL for the href in order to set an initial value for the attribute we wish to update. They are included for completeness.'); +debug(''); + + +debug("Host attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "http://host:0"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://host:0/'"); + +debug("Host attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "http://foo:80"; +a.host = "host:0"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://host:0/'"); +debug(''); + + +debug("Hostname attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "http://host"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://host/'"); + +debug("Hostname attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "http://foo"; +a.hostname = "host"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://host/'"); +debug(''); + + +debug("Protocol attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "protocol:"; +base.href = "http://new_base/"; +shouldBe("a.href", "'protocol:'"); + +debug("Protocol attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "foo:"; +a.protocol = "protocol:"; +base.href = "http://new_base/"; +shouldBe("a.href", "'protocol:'"); +debug(''); + + +debug("Port attribute, update document base URI without attribute having been set"); +base.href = "http://old_base/"; +a.href = "http://host:0"; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://host:0/'"); + +debug("Port attribute, update document base URI after attribute has been set"); +base.href = "http://old_base/"; +a.href = "http://host:80"; +a.port = 0; +base.href = "http://new_base/"; +shouldBe("a.href", "'http://host:0/'"); +debug(''); + + +base.href = ''; +var successfullyParsed = true; diff --git a/LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase-expected.txt b/LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase-expected.txt new file mode 100644 index 0000000..c7de5cb --- /dev/null +++ b/LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase-expected.txt @@ -0,0 +1,46 @@ +Tests that when an href attribute is set, the href is no longer subject to updates to the document base URI. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +Search attribute, update document base URI without attribute having been set +PASS a.href is 'http://new_base/?search' +Search attribute, update document base URI after attribute has been set +PASS a.href is 'http://old_base/?search' + +Pathname attribute, update document base URI without attribute having been set +PASS a.href is 'http://new_base/path' +Pathname attribute, update document base URI after attribute has been set +PASS a.href is 'http://old_base/path' + +Hash attribute, update document base URI without attribute having been set +PASS a.href is 'http://new_base/#hash' +Pathname attribute, update document base URI after attribute has been set +PASS a.href is 'http://old_base/#hash' + +Note that for the following attributes, updating the document base URI has no effect because we have to use an abosulte URL for the href in order to set an initial value for the attribute we wish to update. They are included for completeness. + +Host attribute, update document base URI without attribute having been set +PASS a.href is 'http://host:0/' +Host attribute, update document base URI after attribute has been set +PASS a.href is 'http://host:0/' + +Hostname attribute, update document base URI without attribute having been set +PASS a.href is 'http://host/' +Hostname attribute, update document base URI after attribute has been set +PASS a.href is 'http://host/' + +Protocol attribute, update document base URI without attribute having been set +PASS a.href is 'protocol:' +Protocol attribute, update document base URI after attribute has been set +PASS a.href is 'protocol:' + +Port attribute, update document base URI without attribute having been set +PASS a.href is 'http://host:0/' +Port attribute, update document base URI after attribute has been set +PASS a.href is 'http://host:0/' + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase.html b/LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase.html new file mode 100644 index 0000000..bfc1c29 --- /dev/null +++ b/LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase.html @@ -0,0 +1,13 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<link rel="stylesheet" href="../../js/resources/js-test-style.css"> +<script src="../../js/resources/js-test-pre.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script src="script-tests/set-href-attribute-prevents-rebase.js"></script> +<script src="../../js/resources/js-test-post.js"></script> +</body> +</html> diff --git a/LayoutTests/fast/js/resources/fs-test-post.js b/LayoutTests/fast/js/resources/fs-test-post.js new file mode 100644 index 0000000..6d84656 --- /dev/null +++ b/LayoutTests/fast/js/resources/fs-test-post.js @@ -0,0 +1,6 @@ +wasPostTestScriptParsed = true; + +if (window.layoutTestController) + layoutTestController.waitUntilDone(); +if (window.wasFinishJSTestCalled) + finishJSTest(); diff --git a/LayoutTests/fast/js/resources/js-test-pre.js b/LayoutTests/fast/js/resources/js-test-pre.js index 87db5d4..3536a89 100644 --- a/LayoutTests/fast/js/resources/js-test-pre.js +++ b/LayoutTests/fast/js/resources/js-test-pre.js @@ -124,7 +124,7 @@ function shouldBeNull(_a) { shouldBe(_a, "null"); } function shouldBeEqualToString(a, b) { - var unevaledString = '"' + b.replace(/\\/g, "\\\\").replace(/"/g, "\"") + '"'; + var unevaledString = '"' + b.replace(/\\/g, "\\\\").replace(/"/g, "\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r") + '"'; shouldBe(a, unevaledString); } diff --git a/LayoutTests/fast/url/query-expected.txt b/LayoutTests/fast/url/query-expected.txt index 9941416..e4816a5 100644 --- a/LayoutTests/fast/url/query-expected.txt +++ b/LayoutTests/fast/url/query-expected.txt @@ -5,7 +5,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE PASS canonicalize('http://www.example.com/?foo=bar') is 'http://www.example.com/?foo=bar' PASS canonicalize('http://www.example.com/?as?df') is 'http://www.example.com/?as?df' -FAIL canonicalize('http://www.example.com/?\x02hello bye') should be http://www.example.com/?%02hello%7F%20bye. Was http://www.example.com/?hello%7F%20bye. +PASS canonicalize('http://www.example.com/?\x02hello bye') is 'http://www.example.com/?%02hello%7F%20bye' PASS canonicalize('http://www.example.com/?%40%41123') is 'http://www.example.com/?%40%41123' PASS canonicalize('http://www.example.com/?q=ä½ å¥½') is 'http://www.example.com/?q=%26%2320320%3B%26%2322909%3B' PASS canonicalize('http://www.example.com/?q=\ud800\ud800') is 'http://www.example.com/?q=%26%2355296%3B%26%2355296%3B' diff --git a/LayoutTests/fast/url/script-tests/segments-from-data-url.js b/LayoutTests/fast/url/script-tests/segments-from-data-url.js index 8fc3013..5c4ae02 100644 --- a/LayoutTests/fast/url/script-tests/segments-from-data-url.js +++ b/LayoutTests/fast/url/script-tests/segments-from-data-url.js @@ -14,7 +14,7 @@ cases = [ ["http://f:00000000000000000000080/c", ["http:","f","0","/c","",""]], ["http://f:b/c", [":","","0","","",""]], ["http://f: /c", [":","","0","","",""]], - ["http://f:\\n/c", ["http:","f","0","/c","",""]], + ["http://f:\\n/c", [":","","0","","",""]], ["http://f:fifty-two/c", [":","","0","","",""]], ["http://f:999999/c", [":","","0","","",""]], ["http://f: 21 / b ? d # e ", [":","","0","","",""]], diff --git a/LayoutTests/fast/url/script-tests/segments.js b/LayoutTests/fast/url/script-tests/segments.js index c0c6fa1..c621da1 100644 --- a/LayoutTests/fast/url/script-tests/segments.js +++ b/LayoutTests/fast/url/script-tests/segments.js @@ -14,7 +14,7 @@ cases = [ ["http://f:00000000000000000000080/c", ["http:","f","0","/c","",""]], ["http://f:b/c", [":","","0","","",""]], ["http://f: /c", [":","","0","","",""]], - ["http://f:\\n/c", ["http:","f","0","/c","",""]], + ["http://f:\\n/c", [":","","0","","",""]], ["http://f:fifty-two/c", [":","","0","","",""]], ["http://f:999999/c", [":","","0","","",""]], ["http://f: 21 / b ? d # e ", [":","","0","","",""]], diff --git a/LayoutTests/fast/url/segments-expected.txt b/LayoutTests/fast/url/segments-expected.txt index 3833f36..2da6912 100644 --- a/LayoutTests/fast/url/segments-expected.txt +++ b/LayoutTests/fast/url/segments-expected.txt @@ -15,7 +15,7 @@ PASS segments('http://f:00000000000000/c') is '["http:","f","0","/c","",""]' FAIL segments('http://f:00000000000000000000080/c') should be ["http:","f","0","/c","",""]. Was ["http:","f","80","/c","",""]. PASS segments('http://f:b/c') is '[":","","0","","",""]' PASS segments('http://f: /c') is '[":","","0","","",""]' -PASS segments('http://f:\n/c') is '["http:","f","0","/c","",""]' +PASS segments('http://f:\n/c') is '[":","","0","","",""]' PASS segments('http://f:fifty-two/c') is '[":","","0","","",""]' FAIL segments('http://f:999999/c') should be [":","","0","","",""]. Was ["http:","f","65535","/c","",""]. PASS segments('http://f: 21 / b ? d # e ') is '[":","","0","","",""]' diff --git a/LayoutTests/fast/url/segments-from-data-url-expected.txt b/LayoutTests/fast/url/segments-from-data-url-expected.txt index 5d102ef..6e1853e 100644 --- a/LayoutTests/fast/url/segments-from-data-url-expected.txt +++ b/LayoutTests/fast/url/segments-from-data-url-expected.txt @@ -15,7 +15,7 @@ PASS segments('http://f:00000000000000/c') is '["http:","f","0","/c","",""]' FAIL segments('http://f:00000000000000000000080/c') should be ["http:","f","0","/c","",""]. Was ["http:","f","80","/c","",""]. PASS segments('http://f:b/c') is '[":","","0","","",""]' PASS segments('http://f: /c') is '[":","","0","","",""]' -PASS segments('http://f:\n/c') is '["http:","f","0","/c","",""]' +PASS segments('http://f:\n/c') is '[":","","0","","",""]' PASS segments('http://f:fifty-two/c') is '[":","","0","","",""]' FAIL segments('http://f:999999/c') should be [":","","0","","",""]. Was ["http:","f","65535","/c","",""]. PASS segments('http://f: 21 / b ? d # e ') is '[":","","0","","",""]' diff --git a/LayoutTests/http/tests/appcache/document-write-html-element-2-expected.txt b/LayoutTests/http/tests/appcache/document-write-html-element-2-expected.txt new file mode 100644 index 0000000..32581f4 --- /dev/null +++ b/LayoutTests/http/tests/appcache/document-write-html-element-2-expected.txt @@ -0,0 +1,2 @@ +SUCCESS, no assertion failure +applicationCache.status == 1 diff --git a/LayoutTests/http/tests/appcache/document-write-html-element-2.html b/LayoutTests/http/tests/appcache/document-write-html-element-2.html new file mode 100644 index 0000000..bee9fe0 --- /dev/null +++ b/LayoutTests/http/tests/appcache/document-write-html-element-2.html @@ -0,0 +1,19 @@ +<html manifest="resources/document-write-html-element.manifest"> +<script> +if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); +} + +function test() +{ + document.write("SUCCESS, no assertion failure"); + document.write("<br>applicationCache.status == " + applicationCache.status); + + if (window.layoutTestController) + layoutTestController.notifyDone(); +} + +applicationCache.oncached = test; +applicationCache.onnoupdate = test; +</script> diff --git a/LayoutTests/http/tests/appcache/document-write-html-element-expected.txt b/LayoutTests/http/tests/appcache/document-write-html-element-expected.txt new file mode 100644 index 0000000..08dccd3 --- /dev/null +++ b/LayoutTests/http/tests/appcache/document-write-html-element-expected.txt @@ -0,0 +1 @@ +DONE. Passed if there were no alerts displayed. diff --git a/LayoutTests/http/tests/appcache/document-write-html-element.html b/LayoutTests/http/tests/appcache/document-write-html-element.html new file mode 100644 index 0000000..83954bb --- /dev/null +++ b/LayoutTests/http/tests/appcache/document-write-html-element.html @@ -0,0 +1,26 @@ +<script> +if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); +} + +window.onload = function() +{ + document.write("<html manifest='resources/document-write-html-element.manifest'>"); + applicationCache.oncached = function() { + alert("FAIL: appcache cached"); + } + applicationCache.onnoupdate = function() { + alert("FAIL: appcache noupdate"); + } + applicationCache.onerror = function() { + alert("FAIL: appcache error"); + } + + setTimeout(function() { + document.write("DONE. Passed if there were no alerts displayed."); + if (window.layoutTestController) + layoutTestController.notifyDone(); + }, 100); +} +</script> diff --git a/LayoutTests/http/tests/appcache/fail-on-update-2-expected.txt b/LayoutTests/http/tests/appcache/fail-on-update-2-expected.txt new file mode 100644 index 0000000..cd15247 --- /dev/null +++ b/LayoutTests/http/tests/appcache/fail-on-update-2-expected.txt @@ -0,0 +1 @@ +SUCCESS: No crash. diff --git a/LayoutTests/http/tests/appcache/fail-on-update-2.html b/LayoutTests/http/tests/appcache/fail-on-update-2.html new file mode 100644 index 0000000..fcbc3dd --- /dev/null +++ b/LayoutTests/http/tests/appcache/fail-on-update-2.html @@ -0,0 +1,64 @@ +<html manifest="resources/fail-on-update-2.php"> +<script> +if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); +} + +function setManifestDeleted(state) +{ + var req = new XMLHttpRequest; + req.open("GET", "resources/fail-on-update.php?command=" + (state ? "delete" : "reset"), false); + req.send(null); +} + +function test() +{ + clearTimeout(timeoutId); + + setManifestDeleted(true); + applicationCache.update(); + + // Create two subframes at different times to make hitting the race condition more likely. + var ifr = document.createElement("iframe"); + ifr.setAttribute("src", 'resources/fail-on-update-2.html'); + document.body.appendChild(ifr); + + setTimeout(function() { + var ifr = document.createElement("iframe"); + ifr.setAttribute("src", 'resources/fail-on-update-2.html'); + document.body.appendChild(ifr); + }, 0); +} + +var subframesLeft = 2; +function subframeLoaded() +{ + if (!--subframesLeft) { + document.write('<p>SUCCESS: No crash.</p>'); + if (window.layoutTestController) + layoutTestController.notifyDone(); + } +} + +function resetManifest() +{ + if (applicationCache.status != applicationCache.UNCACHED && applicationCache.status != applicationCache.OBSOLETE) { + timeoutId = setTimeout(resetManifest, 100); + return; + } + + setManifestDeleted(false); + location.reload(); +} + +applicationCache.addEventListener('noupdate', function() { setTimeout(test, 0) }, false); +applicationCache.addEventListener('cached', function() { setTimeout(test, 0) }, false); + +// If the manifest script happened to be in a wrong state, reset it. +var timeoutId = setTimeout(resetManifest, 100); + +</script> +<p>Test for a particular incorrect assertion failure.</p> + +</html> diff --git a/LayoutTests/http/tests/appcache/foreign-fallback-expected.txt b/LayoutTests/http/tests/appcache/foreign-fallback-expected.txt new file mode 100644 index 0000000..dded924 --- /dev/null +++ b/LayoutTests/http/tests/appcache/foreign-fallback-expected.txt @@ -0,0 +1,6 @@ +Test for bug 44406: Application Cache crash when a fallback document has a manifest URL. + +PASS +The frame below should display a Not Found error - the fallback entry is foreign, so it shouldn't be used for main resource. + + diff --git a/LayoutTests/http/tests/appcache/foreign-fallback.html b/LayoutTests/http/tests/appcache/foreign-fallback.html new file mode 100644 index 0000000..7a80046 --- /dev/null +++ b/LayoutTests/http/tests/appcache/foreign-fallback.html @@ -0,0 +1,48 @@ +<html manifest="resources/foreign-fallback.manifest"> +<body> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=44406">bug 44406</a>: +Application Cache crash when a fallback document has a manifest URL.</p> +<div id="result">Testing...</div> +<script> +if (window.layoutTestController) { + layoutTestController.waitUntilDone(); + layoutTestController.dumpAsText(); +} + + +applicationCache.addEventListener('cached', test, false); +applicationCache.addEventListener('noupdate', test, false); + +function test() +{ + var ifr = document.createElement("iframe"); + ifr.setAttribute("src", "resources/foreign-fallback/does-not-exist.html"); + document.body.appendChild(ifr); + + // I couldn't find any event that would fire on frame loading failure, so let's poll. + setTimeout(frameDone, 100); +} + +function frameDone() +{ + try { + var frameContent = frames[0].document.documentElement.innerHTML; + if (frameContent.match("Not Found")) + document.getElementById("result").innerHTML = "PASS"; + else if (frameContent.match("FAIL")) + document.getElementById("result").innerHTML = "FAIL"; + else + throw "Try again"; + + if (window.layoutTestController) + layoutTestController.notifyDone(); + } catch (ex) { + // Not done yet. + setTimeout(frameDone, 100); + } +} + +</script> +<p>The frame below should display a Not Found error - the fallback entry is foreign, so it shouldn't be used for main resource.</p> +</body> +</html> diff --git a/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-2-expected.txt b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-2-expected.txt new file mode 100644 index 0000000..08dccd3 --- /dev/null +++ b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-2-expected.txt @@ -0,0 +1 @@ +DONE. Passed if there were no alerts displayed. diff --git a/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-2.html b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-2.html new file mode 100644 index 0000000..539d28b --- /dev/null +++ b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-2.html @@ -0,0 +1,30 @@ +<html> +<div></div> +<script> +if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); +} + +var div = document.getElementsByTagName("div")[0]; +div.innerHTML = '<html manifest="resources/insert-html-element-with-manifest.manifest">' + +window.onload = function() +{ + applicationCache.oncached = function() { + alert("FAIL: appcache cached"); + } + applicationCache.onnoupdate = function() { + alert("FAIL: appcache noupdate"); + } + applicationCache.onerror = function() { + alert("FAIL: appcache error"); + } + + setTimeout(function() { + document.write("DONE. Passed if there were no alerts displayed."); + if (window.layoutTestController) + layoutTestController.notifyDone(); + }, 100); +} +</script> diff --git a/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-expected.txt b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-expected.txt new file mode 100644 index 0000000..08dccd3 --- /dev/null +++ b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest-expected.txt @@ -0,0 +1 @@ +DONE. Passed if there were no alerts displayed. diff --git a/LayoutTests/http/tests/appcache/insert-html-element-with-manifest.html b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest.html new file mode 100644 index 0000000..694392c --- /dev/null +++ b/LayoutTests/http/tests/appcache/insert-html-element-with-manifest.html @@ -0,0 +1,31 @@ +<html> +<script> +if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); +} + +document.removeChild(document.documentElement); +var newHTML = document.createElement("html"); +newHTML.setAttribute("manifest", "resources/insert-html-element-with-manifest.manifest"); +document.appendChild(newHTML); + +window.onload = function() +{ + applicationCache.oncached = function() { + alert("FAIL: appcache cached"); + } + applicationCache.onnoupdate = function() { + alert("FAIL: appcache noupdate"); + } + applicationCache.onerror = function() { + alert("FAIL: appcache error"); + } + + setTimeout(function() { + document.write("DONE. Passed if there were no alerts displayed."); + if (window.layoutTestController) + layoutTestController.notifyDone(); + }, 100); +} +</script> diff --git a/LayoutTests/http/tests/appcache/main-resource-redirect-expected.txt b/LayoutTests/http/tests/appcache/main-resource-redirect-expected.txt new file mode 100644 index 0000000..0a727f5 --- /dev/null +++ b/LayoutTests/http/tests/appcache/main-resource-redirect-expected.txt @@ -0,0 +1,4 @@ +Test that application cache is consulted again after a redirect response. + +PASS + diff --git a/LayoutTests/http/tests/appcache/main-resource-redirect.html b/LayoutTests/http/tests/appcache/main-resource-redirect.html new file mode 100644 index 0000000..3ede636 --- /dev/null +++ b/LayoutTests/http/tests/appcache/main-resource-redirect.html @@ -0,0 +1,39 @@ +<html manifest="resources/main-resource-redirect.manifest"> +<body> +<p>Test that application cache is consulted again after a redirect response.</p> +<div id="result">Testing...</div> +<script> +if (window.layoutTestController) { + layoutTestController.waitUntilDone(); + layoutTestController.dumpAsText(); +} + +function setNetworkEnabled(state) +{ + var req = new XMLHttpRequest; + req.open("GET", "/resources/network-simulator.php?command=" + (state ? "connect" : "disconnect"), false); + req.send(""); +} + +function test() +{ + applicationCache.oncached = null; + applicationCache.onnoupdate = null; + setNetworkEnabled(false); + var ifr = document.createElement("iframe"); + ifr.setAttribute("src", "resources/main-resource-redirect-frame.php"); + document.body.appendChild(ifr); +} + +function done() +{ + if (window.layoutTestController) + layoutTestController.notifyDone(); + setNetworkEnabled(true); +} + +applicationCache.oncached=test; +applicationCache.onnoupdate=test; +applicationCache.onerror = function() { setNetworkEnabled(true); window.location.reload(); } +</script> +</body> diff --git a/LayoutTests/http/tests/appcache/resources/document-write-html-element.manifest b/LayoutTests/http/tests/appcache/resources/document-write-html-element.manifest new file mode 100644 index 0000000..af16a0e --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/document-write-html-element.manifest @@ -0,0 +1 @@ +CACHE MANIFEST diff --git a/LayoutTests/http/tests/appcache/resources/fail-on-update-2.html b/LayoutTests/http/tests/appcache/resources/fail-on-update-2.html new file mode 100644 index 0000000..7e78de7 --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/fail-on-update-2.html @@ -0,0 +1,7 @@ +<html manifest="fail-on-update-2.php"> +<body> +<script> + top.subframeLoaded(); +</script> +</body> +</html> diff --git a/LayoutTests/http/tests/appcache/resources/fail-on-update-2.php b/LayoutTests/http/tests/appcache/resources/fail-on-update-2.php new file mode 100644 index 0000000..4e11735 --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/fail-on-update-2.php @@ -0,0 +1,39 @@ +<?php +require_once '../../resources/portabilityLayer.php'; + +$tmpFile = sys_get_temp_dir() . "/" . "fail_on_update_state"; + +function setState($newState, $file) +{ + file_put_contents($file, $newState); +} + +function getState($file) +{ + if (!file_exists($file)) { + return "Uninitialized"; + } + return file_get_contents($file); +} + +$command = $_GET['command']; +$state = getState($tmpFile); + +header("Expires: Thu, 01 Dec 2003 16:00:00 GMT"); +header("Cache-Control: no-cache, must-revalidate"); +header("Pragma: no-cache"); + +if ($command == "reset") { + unlink($tmpFile); +} else if ($command == "delete") { + setState("Deleted", $tmpFile); +} else if ($state == "Uninitialized") { + header("Content-Type: text/cache-manifest"); + print("CACHE MANIFEST\n"); + print("fail-on-update-2.html\n"); + print("NETWORK:\n"); + print("fail-on-update.php?command=\n"); +} else if ($state == "Deleted") { + header('HTTP/1.0 404 Not Found'); +} +?> diff --git a/LayoutTests/http/tests/appcache/resources/foreign-fallback-fallback.html b/LayoutTests/http/tests/appcache/resources/foreign-fallback-fallback.html new file mode 100644 index 0000000..9996bf6 --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/foreign-fallback-fallback.html @@ -0,0 +1,2 @@ +<html manifest="foobar.manifest"> +FAIL diff --git a/LayoutTests/http/tests/appcache/resources/foreign-fallback.manifest b/LayoutTests/http/tests/appcache/resources/foreign-fallback.manifest new file mode 100644 index 0000000..ddaf602 --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/foreign-fallback.manifest @@ -0,0 +1,4 @@ +CACHE MANIFEST + +FALLBACK: +/appcache/resources/foreign-fallback/ foreign-fallback-fallback.html diff --git a/LayoutTests/http/tests/appcache/resources/insert-html-element-with-manifest.manifest b/LayoutTests/http/tests/appcache/resources/insert-html-element-with-manifest.manifest new file mode 100644 index 0000000..af16a0e --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/insert-html-element-with-manifest.manifest @@ -0,0 +1 @@ +CACHE MANIFEST diff --git a/LayoutTests/http/tests/appcache/resources/main-resource-redirect-frame-2.html b/LayoutTests/http/tests/appcache/resources/main-resource-redirect-frame-2.html new file mode 100644 index 0000000..0acc1e2 --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/main-resource-redirect-frame-2.html @@ -0,0 +1,6 @@ +<html manifest="http://127.0.0.1:8000/appcache/resources/main-resource-redirect.manifest"> +<script> +parent.document.getElementById("result").innerHTML = (applicationCache.status) > 0 ? "PASS" : "FAIL: child frame status is UNCACHED"; +parent.done(); + +</script> diff --git a/LayoutTests/http/tests/appcache/resources/main-resource-redirect-frame.php b/LayoutTests/http/tests/appcache/resources/main-resource-redirect-frame.php new file mode 100644 index 0000000..638057b --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/main-resource-redirect-frame.php @@ -0,0 +1,4 @@ +<?php + header('HTTP/1.0 302 Found'); + header('Location: http://127.0.0.1:8000/resources/network-simulator.php?path=/appcache/resources/main-resource-redirect-frame-2.html'); +?> diff --git a/LayoutTests/http/tests/appcache/resources/main-resource-redirect.manifest b/LayoutTests/http/tests/appcache/resources/main-resource-redirect.manifest new file mode 100644 index 0000000..beffe84 --- /dev/null +++ b/LayoutTests/http/tests/appcache/resources/main-resource-redirect.manifest @@ -0,0 +1,4 @@ +CACHE MANIFEST +http://127.0.0.1:8000/resources/network-simulator.php?path=/appcache/resources/main-resource-redirect-frame-2.html +NETWORK: +http://127.0.0.1:8000/resources/network-simulator.php?command diff --git a/LayoutTests/storage/indexeddb/basics-expected.txt b/LayoutTests/storage/indexeddb/basics-expected.txt index 7632e40..b7b8b94 100644 --- a/LayoutTests/storage/indexeddb/basics-expected.txt +++ b/LayoutTests/storage/indexeddb/basics-expected.txt @@ -3,9 +3,9 @@ Test IndexedDB's basics. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS 'indexedDB' in window is true -PASS indexedDB == null is false -indexedDB.open('name', 'description') +PASS 'webkitIndexedDB' in window is true +PASS webkitIndexedDB == null is false +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -22,6 +22,12 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE +webkitIndexedDB.open('name'); +PASS Exception thrown. +webkitIndexedDB.open('name', null); +PASS Exception thrown. +webkitIndexedDB.open('name', undefined); +PASS Exception thrown. PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/storage/indexeddb/basics.html b/LayoutTests/storage/indexeddb/basics.html index 9f5f20f..2e382b2 100644 --- a/LayoutTests/storage/indexeddb/basics.html +++ b/LayoutTests/storage/indexeddb/basics.html @@ -14,25 +14,47 @@ description("Test IndexedDB's basics."); if (window.layoutTestController) layoutTestController.waitUntilDone(); -function openCallback() -{ - verifySuccessEvent(event); - done(); -} - function test() { - shouldBeTrue("'indexedDB' in window"); - shouldBeFalse("indexedDB == null"); + shouldBeTrue("'webkitIndexedDB' in window"); + shouldBeFalse("webkitIndexedDB == null"); // FIXME: Verify other IndexedDatabaseRequest constructors, once they're implemented. - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); verifyResult(result); result.onsuccess = openCallback; - result.onerror = unexpectedErrorCallback; + result.onerror = unexpectedErrorCallback;
+}
+
+function openCallback()
+{
+ verifySuccessEvent(event);
+ try {
+ debug("webkitIndexedDB.open('name');");
+ webkitIndexedDB.open('name');
+ testFailed("Calling IDBFactory::open without a description should have thrown.");
+ } catch (err) {
+ testPassed("Exception thrown.");
+ }
+ try {
+ debug("webkitIndexedDB.open('name', null);");
+ webkitIndexedDB.open('name', null);
+ testFailed("Calling IDBFactory::open with a null description should have thrown.");
+ } catch (err) {
+ testPassed("Exception thrown.");
+ }
+ try {
+ debug("webkitIndexedDB.open('name', undefined);");
+ webkitIndexedDB.open('name', undefined);
+ testFailed("Calling IDBFactory::open with an undefined description should have thrown.");
+ } catch (err) {
+ testPassed("Exception thrown.");
+ }
+ done();
} + test(); var successfullyParsed = true; diff --git a/LayoutTests/storage/indexeddb/constants-expected.txt b/LayoutTests/storage/indexeddb/constants-expected.txt index ff47655..15a2df7 100644 --- a/LayoutTests/storage/indexeddb/constants-expected.txt +++ b/LayoutTests/storage/indexeddb/constants-expected.txt @@ -3,32 +3,32 @@ Test IndexedDB's constants. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS IDBKeyRange.SINGLE is 0 -PASS IDBKeyRange.LEFT_OPEN is 1 -PASS IDBKeyRange.RIGHT_OPEN is 2 -PASS IDBKeyRange.LEFT_BOUND is 4 -PASS IDBKeyRange.RIGHT_BOUND is 8 -PASS IDBDatabaseException.UNKNOWN_ERR is 0 -PASS IDBDatabaseException.NON_TRANSIENT_ERR is 1 -PASS IDBDatabaseException.NOT_FOUND_ERR is 2 -PASS IDBDatabaseException.CONSTRAINT_ERR is 3 -PASS IDBDatabaseException.DATA_ERR is 4 -PASS IDBDatabaseException.NOT_ALLOWED_ERR is 5 -PASS IDBDatabaseException.SERIAL_ERR is 11 -PASS IDBDatabaseException.RECOVERABLE_ERR is 21 -PASS IDBDatabaseException.TRANSIENT_ERR is 31 -PASS IDBDatabaseException.TIMEOUT_ERR is 32 -PASS IDBDatabaseException.DEADLOCK_ERR is 33 -PASS IDBRequest.LOADING is 1 -PASS IDBRequest.DONE is 2 -PASS IDBCursor.NEXT is 0 -PASS IDBCursor.NEXT_NO_DUPLICATE is 1 -PASS IDBCursor.PREV is 2 -PASS IDBCursor.PREV_NO_DUPLICATE is 3 -PASS IDBTransaction.READ_WRITE is 0 -PASS IDBTransaction.READ_ONLY is 1 -PASS IDBTransaction.SNAPSHOT_READ is 2 -PASS IDBTransaction.VERSION_CHANGE is 3 +PASS webkitIDBKeyRange.SINGLE is 0 +PASS webkitIDBKeyRange.LEFT_OPEN is 1 +PASS webkitIDBKeyRange.RIGHT_OPEN is 2 +PASS webkitIDBKeyRange.LEFT_BOUND is 4 +PASS webkitIDBKeyRange.RIGHT_BOUND is 8 +PASS webkitIDBDatabaseException.UNKNOWN_ERR is 0 +PASS webkitIDBDatabaseException.NON_TRANSIENT_ERR is 1 +PASS webkitIDBDatabaseException.NOT_FOUND_ERR is 2 +PASS webkitIDBDatabaseException.CONSTRAINT_ERR is 3 +PASS webkitIDBDatabaseException.DATA_ERR is 4 +PASS webkitIDBDatabaseException.NOT_ALLOWED_ERR is 5 +PASS webkitIDBDatabaseException.SERIAL_ERR is 11 +PASS webkitIDBDatabaseException.RECOVERABLE_ERR is 21 +PASS webkitIDBDatabaseException.TRANSIENT_ERR is 31 +PASS webkitIDBDatabaseException.TIMEOUT_ERR is 32 +PASS webkitIDBDatabaseException.DEADLOCK_ERR is 33 +PASS webkitIDBRequest.LOADING is 1 +PASS webkitIDBRequest.DONE is 2 +PASS webkitIDBCursor.NEXT is 0 +PASS webkitIDBCursor.NEXT_NO_DUPLICATE is 1 +PASS webkitIDBCursor.PREV is 2 +PASS webkitIDBCursor.PREV_NO_DUPLICATE is 3 +PASS webkitIDBTransaction.READ_WRITE is 0 +PASS webkitIDBTransaction.READ_ONLY is 1 +PASS webkitIDBTransaction.SNAPSHOT_READ is 2 +PASS webkitIDBTransaction.VERSION_CHANGE is 3 PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/storage/indexeddb/constants.html b/LayoutTests/storage/indexeddb/constants.html index dd24917..813fe7a 100644 --- a/LayoutTests/storage/indexeddb/constants.html +++ b/LayoutTests/storage/indexeddb/constants.html @@ -16,36 +16,36 @@ if (window.layoutTestController) function test() { - shouldBe("IDBKeyRange.SINGLE", "0"); - shouldBe("IDBKeyRange.LEFT_OPEN", "1"); - shouldBe("IDBKeyRange.RIGHT_OPEN", "2"); - shouldBe("IDBKeyRange.LEFT_BOUND", "4"); - shouldBe("IDBKeyRange.RIGHT_BOUND", "8"); - - shouldBe("IDBDatabaseException.UNKNOWN_ERR", "0"); - shouldBe("IDBDatabaseException.NON_TRANSIENT_ERR", "1"); - shouldBe("IDBDatabaseException.NOT_FOUND_ERR", "2"); - shouldBe("IDBDatabaseException.CONSTRAINT_ERR", "3"); - shouldBe("IDBDatabaseException.DATA_ERR", "4"); - shouldBe("IDBDatabaseException.NOT_ALLOWED_ERR", "5"); - shouldBe("IDBDatabaseException.SERIAL_ERR", "11"); - shouldBe("IDBDatabaseException.RECOVERABLE_ERR", "21"); - shouldBe("IDBDatabaseException.TRANSIENT_ERR", "31"); - shouldBe("IDBDatabaseException.TIMEOUT_ERR", "32"); - shouldBe("IDBDatabaseException.DEADLOCK_ERR", "33"); - - shouldBe("IDBRequest.LOADING", "1"); - shouldBe("IDBRequest.DONE", "2"); - - shouldBe("IDBCursor.NEXT", "0"); - shouldBe("IDBCursor.NEXT_NO_DUPLICATE", "1"); - shouldBe("IDBCursor.PREV", "2"); - shouldBe("IDBCursor.PREV_NO_DUPLICATE", "3"); - - shouldBe("IDBTransaction.READ_WRITE", "0"); - shouldBe("IDBTransaction.READ_ONLY", "1"); - shouldBe("IDBTransaction.SNAPSHOT_READ", "2"); - shouldBe("IDBTransaction.VERSION_CHANGE", "3"); + shouldBe("webkitIDBKeyRange.SINGLE", "0"); + shouldBe("webkitIDBKeyRange.LEFT_OPEN", "1"); + shouldBe("webkitIDBKeyRange.RIGHT_OPEN", "2"); + shouldBe("webkitIDBKeyRange.LEFT_BOUND", "4"); + shouldBe("webkitIDBKeyRange.RIGHT_BOUND", "8"); + + shouldBe("webkitIDBDatabaseException.UNKNOWN_ERR", "0"); + shouldBe("webkitIDBDatabaseException.NON_TRANSIENT_ERR", "1"); + shouldBe("webkitIDBDatabaseException.NOT_FOUND_ERR", "2"); + shouldBe("webkitIDBDatabaseException.CONSTRAINT_ERR", "3"); + shouldBe("webkitIDBDatabaseException.DATA_ERR", "4"); + shouldBe("webkitIDBDatabaseException.NOT_ALLOWED_ERR", "5"); + shouldBe("webkitIDBDatabaseException.SERIAL_ERR", "11"); + shouldBe("webkitIDBDatabaseException.RECOVERABLE_ERR", "21"); + shouldBe("webkitIDBDatabaseException.TRANSIENT_ERR", "31"); + shouldBe("webkitIDBDatabaseException.TIMEOUT_ERR", "32"); + shouldBe("webkitIDBDatabaseException.DEADLOCK_ERR", "33"); + + shouldBe("webkitIDBRequest.LOADING", "1"); + shouldBe("webkitIDBRequest.DONE", "2"); + + shouldBe("webkitIDBCursor.NEXT", "0"); + shouldBe("webkitIDBCursor.NEXT_NO_DUPLICATE", "1"); + shouldBe("webkitIDBCursor.PREV", "2"); + shouldBe("webkitIDBCursor.PREV_NO_DUPLICATE", "3"); + + shouldBe("webkitIDBTransaction.READ_WRITE", "0"); + shouldBe("webkitIDBTransaction.READ_ONLY", "1"); + shouldBe("webkitIDBTransaction.SNAPSHOT_READ", "2"); + shouldBe("webkitIDBTransaction.VERSION_CHANGE", "3"); } test(); diff --git a/LayoutTests/storage/indexeddb/database-basics-expected.txt b/LayoutTests/storage/indexeddb/database-basics-expected.txt index 42c9879..2a5fa2f 100644 --- a/LayoutTests/storage/indexeddb/database-basics-expected.txt +++ b/LayoutTests/storage/indexeddb/database-basics-expected.txt @@ -3,7 +3,7 @@ Test the basics of IndexedDB's IDBDatabase. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('name', 'description') +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -21,6 +21,27 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result +db.setVersion('new version') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +setVersionSuccess(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +Deleted all object stores. Testing setVersion. db.setVersion("version a") PASS 'onsuccess' in result is true @@ -61,7 +82,15 @@ PASS db.name is "name" PASS db.objectStores is [] PASS db.objectStores.length is 0 PASS db.objectStores.contains('') is false +PASS db.objectStores[0] is null +PASS db.objectStores.item(0) is null db.createObjectStore("test123") +PASS db.objectStores is ['test123'] +PASS db.objectStores.length is 1 +PASS db.objectStores.contains('') is false +PASS db.objectStores.contains('test456') is false +PASS db.objectStores.contains('test123') is true +db.setVersion("version c") PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -78,6 +107,17 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE +PASS db.version is "version c" +PASS db.name is "name" +PASS db.objectStores is ['test123'] +PASS db.objectStores.length is 1 +PASS db.objectStores.contains('') is false +PASS db.objectStores.contains('test456') is false +PASS db.objectStores.contains('test123') is true +db.createObjectStore("test456") +setVersionTrans = event.result +PASS setVersionTrans !== null is true +PASS db.version is "version b" PASS db.objectStores is ['test123'] PASS db.objectStores.length is 1 PASS db.objectStores.contains('') is false diff --git a/LayoutTests/storage/indexeddb/database-basics.html b/LayoutTests/storage/indexeddb/database-basics.html index b099a49..31c887b 100644 --- a/LayoutTests/storage/indexeddb/database-basics.html +++ b/LayoutTests/storage/indexeddb/database-basics.html @@ -14,23 +14,43 @@ description("Test the basics of IndexedDB's IDBDatabase."); if (window.layoutTestController) layoutTestController.waitUntilDone(); +function test() +{ + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); + verifyResult(result); + result.onsuccess = openSuccess; + result.onerror = unexpectedErrorCallback; +} + function openSuccess() { verifySuccessEvent(event); + window.db = evalAndLog("db = event.result"); + + result = evalAndLog("db.setVersion('new version')"); + verifyResult(result); + result.onsuccess = setVersionSuccess; + result.onerror = unexpectedErrorCallback; +} - var db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); +function setVersionSuccess() +{ + debug("setVersionSuccess():"); + verifySuccessEvent(event); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; - // We must do something asynchronous before anything synchronous since - // deleteAllObjectStores only schedules the object stores to be removed. - // We don't know for sure whether it's happened until an IDBRequest object - // that was created after the removes fires. + deleteAllObjectStores(db, testSetVersion); +} +function testSetVersion() +{ debug("Testing setVersion."); result = evalAndLog('db.setVersion("version a")'); verifyResult(result); result.onsuccess = setVersionAgain; - result.onError = unexpectedErrorCallback; + result.onerror = unexpectedErrorCallback; } function setVersionAgain() @@ -40,7 +60,7 @@ function setVersionAgain() result = evalAndLog('db.setVersion("version b")'); verifyResult(result); result.onsuccess = createObjectStore; - result.onError = unexpectedErrorCallback; + result.onerror = unexpectedErrorCallback; } function createObjectStore() @@ -51,33 +71,58 @@ function createObjectStore() shouldBe("db.objectStores", "[]"); shouldBe("db.objectStores.length", "0"); shouldBe("db.objectStores.contains('')", "false"); + shouldBeNull("db.objectStores[0]"); + shouldBeNull("db.objectStores.item(0)"); - result = evalAndLog('db.createObjectStore("test123")'); - verifyResult(result); - result.onsuccess = checkObjectStore; - result.onError = unexpectedErrorCallback; + objectStore = evalAndLog('db.createObjectStore("test123")'); + checkObjectStore(); + commitAndContinue(); } function checkObjectStore() { - verifySuccessEvent(event); shouldBe("db.objectStores", "['test123']"); shouldBe("db.objectStores.length", "1"); shouldBe("db.objectStores.contains('')", "false"); shouldBe("db.objectStores.contains('test456')", "false"); shouldBe("db.objectStores.contains('test123')", "true"); +} - done(); +function commitAndContinue() +{ + window.setTimeout(testSetVersionAbort, 0); } -function test() +function testSetVersionAbort() { - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog('db.setVersion("version c")'); verifyResult(result); - result.onsuccess = openSuccess; + result.onsuccess = createAnotherObjectStore; result.onerror = unexpectedErrorCallback; } +function createAnotherObjectStore() +{ + verifySuccessEvent(event); + shouldBeEqualToString("db.version", "version c"); + shouldBeEqualToString("db.name", "name"); + checkObjectStore(); + + objectStore = evalAndLog('db.createObjectStore("test456")'); + var setVersionTrans = evalAndLog("setVersionTrans = event.result"); + shouldBeTrue("setVersionTrans !== null"); + setVersionTrans.oncomplete = unexpectedCompleteCallback; + setVersionTrans.onabort = checkMetadata; + setVersionTrans.abort(); +} + +function checkMetadata() +{ + shouldBeEqualToString("db.version", "version b"); + checkObjectStore(); + done(); +} + test(); var successfullyParsed = true; diff --git a/LayoutTests/storage/indexeddb/database-quota-expected.txt b/LayoutTests/storage/indexeddb/database-quota-expected.txt new file mode 100644 index 0000000..b6ea505 --- /dev/null +++ b/LayoutTests/storage/indexeddb/database-quota-expected.txt @@ -0,0 +1,1115 @@ +Tests IndexedDB's quota enforcing mechanism. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +webkitIndexedDB.open('name', 'description') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +db = event.result +db.setVersion('new version') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +setVersionSuccess(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +Deleted all object stores. +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +PASS db.version is "new version" +PASS db.name is "name" +PASS db.objectStores is [] +PASS db.objectStores.length is 0 +PASS db.objectStores.contains('') is false +db.createObjectStore("test123") +PASS db.objectStores is ['test123'] +PASS db.objectStores.length is 1 +PASS db.objectStores.contains('') is false +PASS db.objectStores.contains('test456') is false +PASS db.objectStores.contains('test123') is true +trans = db.transaction() +Creating 'data' which contains 64K of data +PASS data.length is 65536 +store = trans.objectStore('test123') +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +store = event.source +store.add({x: data}, dataAdded) +Error function called: (0) Error writing data to stable storage. +Error event fired: +PASS 'result' in event is false +PASS 'code' in event is true +PASS 'message' in event is true +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +PASS Adding data failed due to quota error. Data added was: 5120 KB +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/storage/indexeddb/database-quota.html b/LayoutTests/storage/indexeddb/database-quota.html new file mode 100644 index 0000000..45ce709 --- /dev/null +++ b/LayoutTests/storage/indexeddb/database-quota.html @@ -0,0 +1,126 @@ +<html> +<head> +<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> +<script src="../../fast/js/resources/js-test-pre.js"></script> +<script src="../../fast/js/resources/js-test-post-function.js"></script> +<script src="resources/shared.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script> + +description("Tests IndexedDB's quota enforcing mechanism."); +if (window.layoutTestController) + layoutTestController.waitUntilDone(); + +function test() +{ + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); + verifyResult(result); + result.onsuccess = openSuccess; + result.onerror = unexpectedErrorCallback; +} + +function openSuccess() +{ + verifySuccessEvent(event); + window.db = evalAndLog("db = event.result"); + + result = evalAndLog("db.setVersion('new version')"); + verifyResult(result); + result.onsuccess = setVersionSuccess; + result.onerror = unexpectedErrorCallback; +} + +function setVersionSuccess() +{ + debug("setVersionSuccess():"); + verifySuccessEvent(event); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + + deleteAllObjectStores(db, createNewObjectStore); +} + +function createNewObjectStore() +{ + verifySuccessEvent(event); + shouldBeEqualToString("db.version", "new version"); + shouldBeEqualToString("db.name", "name"); + shouldBe("db.objectStores", "[]"); + shouldBe("db.objectStores.length", "0"); + shouldBe("db.objectStores.contains('')", "false"); + + objectStore = evalAndLog('db.createObjectStore("test123")');
+ checkObjectStore();
+ commitAndContinue(); +} + +function checkObjectStore() +{ + shouldBe("db.objectStores", "['test123']"); + shouldBe("db.objectStores.length", "1"); + shouldBe("db.objectStores.contains('')", "false"); + shouldBe("db.objectStores.contains('test456')", "false"); + shouldBe("db.objectStores.contains('test123')", "true");
+}
+
+function commitAndContinue()
+{
+ window.setTimeout(checkQuotaEnforcing, 0); +}
+
+function checkQuotaEnforcing()
+{
+ var trans = evalAndLog("trans = db.transaction()");
+ trans.onabort = testComplete;
+ trans.oncomplete = unexpectedCompleteCallback;
+ debug("Creating 'data' which contains 64K of data");
+ window.data = "X";
+ for (var i = 0; i < 16; i++)
+ data += data;
+ shouldBe("data.length", "65536");
+ window.dataAdded = 0;
+ window.store = evalAndLog("store = trans.objectStore('test123')");
+ addData();
+}
+
+function addData()
+{
+ if (dataAdded < 5 * 1024 * 1024) {
+ if (dataAdded > 0) {
+ verifySuccessEvent(event);
+ store = evalAndLog("store = event.source");
+ }
+ } else {
+ testFailed("added more than quota");
+ done();
+ return;
+ }
+ dataAdded += 65536;
+ result = evalAndLog("store.add({x: data}, dataAdded)");
+ result.onsuccess = addData;
+ result.onerror = logError;
+}
+
+function logError()
+{
+ debug("Error function called: (" + event.code + ") " + event.message);
+ verifyErrorEvent(event);
+}
+
+function testComplete()
+{
+ testPassed("Adding data failed due to quota error. Data added was: " + dataAdded / 1024 + " KB");
+ done(); +} + +test(); + +var successfullyParsed = true; + +</script> +</body> +</html> diff --git a/LayoutTests/storage/indexeddb/index-basics-expected.txt b/LayoutTests/storage/indexeddb/index-basics-expected.txt index 564bdc8..0869d95 100644 --- a/LayoutTests/storage/indexeddb/index-basics-expected.txt +++ b/LayoutTests/storage/indexeddb/index-basics-expected.txt @@ -1,9 +1,9 @@ -Test the basics of IndexedDB's IDBIndex. +Test the basics of IndexedDB's webkitIDBIndex. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('name', 'description') +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -21,12 +21,13 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('storeName', null) +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true An event should fire shortly... +setVersionSuccess(): Success event fired: PASS 'result' in event is true PASS 'code' in event is false @@ -38,8 +39,25 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -store = event.result -event.result.createIndex('indexName', 'x') +trans = event.result +PASS trans !== null is true +Deleted all object stores. +db.createObjectStore('storeName', null) +store.createIndex('indexName', 'x') +store.createIndex('indexName2', 'y', false) +PASS 'name' in indexObject is true +PASS indexObject.name is "indexName" +PASS 'storeName' in indexObject is true +PASS indexObject.storeName is "storeName" +PASS 'keyPath' in indexObject is true +PASS indexObject.keyPath is "x" +PASS 'unique' in indexObject is true +PASS indexObject.unique is false +PASS 'openKeyCursor' in indexObject is true +PASS 'openCursor' in indexObject is true +PASS 'getKey' in indexObject is true +PASS 'get' in indexObject is true +store.add({x: 'value', y: 'zzz'}, 'key') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -56,21 +74,7 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -PASS event.result === null is false -indexObject = event.result -PASS 'name' in indexObject is true -PASS indexObject.name is "indexName" -PASS 'storeName' in indexObject is true -PASS indexObject.storeName is "storeName" -PASS 'keyPath' in indexObject is true -PASS indexObject.keyPath is "x" -PASS 'unique' in indexObject is true -PASS indexObject.unique is false -PASS 'openObjectCursor' in indexObject is true -PASS 'openCursor' in indexObject is true -PASS 'getObject' in indexObject is true -PASS 'get' in indexObject is true -event.source.add({x: 'value', y: 'zzz'}, 'key') +event.source.add({x: 'value2', y: 'zzz2'}, 'key2') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -87,7 +91,7 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -event.source.add({x: 'value2', y: 'zzz2'}, 'key2') +indexObject.getKey('value') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -104,7 +108,8 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -indexObject.get('value') +PASS event.result is "key" +indexObject2.getKey('zzz') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -122,7 +127,7 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE PASS event.result is "key" -indexObject.getObject('value') +indexObject.get('value') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -141,7 +146,7 @@ PASS event.target.readyState is event.target.DONE PASS event.result.x is "value" PASS event.result.y is "zzz" -indexObject.get('does not exist') +indexObject.getKey('does not exist') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -158,8 +163,8 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -PASS event.code is IDBDatabaseException.NOT_FOUND_ERR -indexObject.getObject('does not exist') +PASS event.code is webkitIDBDatabaseException.NOT_FOUND_ERR +indexObject.get('does not exist') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -176,8 +181,8 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -PASS event.code is IDBDatabaseException.NOT_FOUND_ERR -indexObject.openCursor() +PASS event.code is webkitIDBDatabaseException.NOT_FOUND_ERR +indexObject.openKeyCursor() PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -235,7 +240,7 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE PASS event.result === null is true -indexObject.openObjectCursor() +indexObject.openCursor() PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true diff --git a/LayoutTests/storage/indexeddb/index-basics.html b/LayoutTests/storage/indexeddb/index-basics.html index c23f141..f7257f1 100644 --- a/LayoutTests/storage/indexeddb/index-basics.html +++ b/LayoutTests/storage/indexeddb/index-basics.html @@ -10,47 +10,50 @@ <div id="console"></div> <script> -description("Test the basics of IndexedDB's IDBIndex."); +description("Test the basics of IndexedDB's webkitIDBIndex."); if (window.layoutTestController) layoutTestController.waitUntilDone(); function test() { - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); verifyResult(result); - result.onsuccess = createObjectStore; + result.onsuccess = setVersion; result.onerror = unexpectedErrorCallback; } -function createObjectStore() +function setVersion() { verifySuccessEvent(event); db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('storeName', null)"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = createIndex; + result.onsuccess = deleteExisting; result.onerror = unexpectedErrorCallback; } -function createIndex() +function deleteExisting() { + debug("setVersionSuccess():"); verifySuccessEvent(event); - window.store = evalAndLog("store = event.result"); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; - result = evalAndLog("event.result.createIndex('indexName', 'x')"); - verifyResult(result); - result.onsuccess = addData; - result.onerror = unexpectedErrorCallback; + deleteAllObjectStores(db, createIndex); +} + +function createIndex() +{ + window.store = evalAndLog("db.createObjectStore('storeName', null)"); + window.indexObject = evalAndLog("store.createIndex('indexName', 'x')"); + window.indexObject2 = evalAndLog("store.createIndex('indexName2', 'y', false)"); + addData(); } function addData() { - verifySuccessEvent(event); - shouldBeFalse("event.result === null"); - window.indexObject = evalAndLog("indexObject = event.result"); shouldBeTrue("'name' in indexObject"); shouldBeEqualToString("indexObject.name", "indexName"); shouldBeTrue("'storeName' in indexObject"); @@ -59,12 +62,12 @@ function addData() shouldBeEqualToString("indexObject.keyPath", "x"); shouldBeTrue("'unique' in indexObject"); shouldBeFalse("indexObject.unique"); - shouldBeTrue("'openObjectCursor' in indexObject"); + shouldBeTrue("'openKeyCursor' in indexObject"); shouldBeTrue("'openCursor' in indexObject"); - shouldBeTrue("'getObject' in indexObject"); + shouldBeTrue("'getKey' in indexObject"); shouldBeTrue("'get' in indexObject"); - result = evalAndLog("event.source.add({x: 'value', y: 'zzz'}, 'key')"); + result = evalAndLog("store.add({x: 'value', y: 'zzz'}, 'key')"); verifyResult(result); result.onsuccess = addMore; result.onerror = unexpectedErrorCallback; @@ -84,7 +87,7 @@ function getData() { verifySuccessEvent(event); - result = evalAndLog("indexObject.get('value')"); + result = evalAndLog("indexObject.getKey('value')"); verifyResult(result); result.onsuccess = getObjectData; result.onerror = unexpectedErrorCallback; @@ -95,7 +98,18 @@ function getObjectData() verifySuccessEvent(event); shouldBeEqualToString("event.result", "key"); - result = evalAndLog("indexObject.getObject('value')"); + result = evalAndLog("indexObject2.getKey('zzz')"); + verifyResult(result); + result.onsuccess = getObjectData2; + result.onerror = unexpectedErrorCallback; +} + +function getObjectData2() +{ + verifySuccessEvent(event); + shouldBeEqualToString("event.result", "key"); + + result = evalAndLog("indexObject.get('value')"); verifyResult(result); result.onsuccess = getDataFail; result.onerror = unexpectedErrorCallback; @@ -107,7 +121,7 @@ function getDataFail() shouldBeEqualToString("event.result.x", "value"); shouldBeEqualToString("event.result.y", "zzz"); - result = evalAndLog("indexObject.get('does not exist')"); + result = evalAndLog("indexObject.getKey('does not exist')"); verifyResult(result); result.onsuccess = unexpectedSuccessCallback; result.onerror = getObjectDataFail; @@ -116,20 +130,20 @@ function getDataFail() function getObjectDataFail() { verifyErrorEvent(event); - shouldBe("event.code", "IDBDatabaseException.NOT_FOUND_ERR"); + shouldBe("event.code", "webkitIDBDatabaseException.NOT_FOUND_ERR"); - result = evalAndLog("indexObject.getObject('does not exist')"); + result = evalAndLog("indexObject.get('does not exist')"); verifyResult(result); result.onsuccess = unexpectedSuccessCallback; - result.onerror = openCursor; + result.onerror = openKeyCursor; } -function openCursor() +function openKeyCursor() { verifyErrorEvent(event); - shouldBe("event.code", "IDBDatabaseException.NOT_FOUND_ERR"); + shouldBe("event.code", "webkitIDBDatabaseException.NOT_FOUND_ERR"); - window.result = evalAndLog("indexObject.openCursor()"); + window.result = evalAndLog("indexObject.openKeyCursor()"); verifyResult(result); result.onsuccess = cursor1Continue; result.onerror = unexpectedErrorCallback; @@ -166,7 +180,7 @@ function openObjectCursor() verifySuccessEvent(event); shouldBeTrue("event.result === null"); - window.result = evalAndLog("indexObject.openObjectCursor()"); + window.result = evalAndLog("indexObject.openCursor()"); verifyResult(result); result.onsuccess = cursor2Continue; result.onerror = unexpectedErrorCallback; diff --git a/LayoutTests/storage/indexeddb/index-cursor-expected.txt b/LayoutTests/storage/indexeddb/index-cursor-expected.txt index 6d1417f..88b96ff 100644 --- a/LayoutTests/storage/indexeddb/index-cursor-expected.txt +++ b/LayoutTests/storage/indexeddb/index-cursor-expected.txt @@ -1,9 +1,9 @@ -Test IndexedDB's IDBIndex.openCursor + the cursor it produces in depth. +Test IndexedDB's webkitIDBIndex.openCursor + the cursor it produces in depth. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('someDB', 'some description') +webkitIndexedDB.open('someDB', 'some description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -21,7 +21,7 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('someObjectStore') +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -38,36 +38,11 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -objectStore = event.result +trans = event.result +PASS trans !== null is true +Deleted all object stores. +db.createObjectStore('someObjectStore') objectStore.createIndex('someIndex', 'x') -PASS 'onsuccess' in result is true -PASS 'onerror' in result is true -PASS 'readyState' in result is true -An event should fire shortly... - -Success event fired: -PASS 'result' in event is true -PASS 'code' in event is false -PASS 'message' in event is false -PASS 'source' in event is true -PASS event.source != null is true -PASS 'onsuccess' in event.target is true -PASS 'onerror' in event.target is true -PASS 'readyState' in event.target is true -PASS event.target.readyState is event.target.DONE - -indexObject = event.result -Success event fired: -PASS 'result' in event is true -PASS 'code' in event is false -PASS 'message' in event is false -PASS 'source' in event is true -PASS event.source != null is true -PASS 'onsuccess' in event.target is true -PASS 'onerror' in event.target is true -PASS 'readyState' in event.target is true -PASS event.target.readyState is event.target.DONE - objectStore.add({'x': testData[nextToAdd]}, nextToAdd) PASS 'onsuccess' in result is true PASS 'onerror' in result is true diff --git a/LayoutTests/storage/indexeddb/index-cursor.html b/LayoutTests/storage/indexeddb/index-cursor.html index 9541d60..5aab4f8 100644 --- a/LayoutTests/storage/indexeddb/index-cursor.html +++ b/LayoutTests/storage/indexeddb/index-cursor.html @@ -10,7 +10,7 @@ <div id="console"></div> <script> -description("Test IndexedDB's IDBIndex.openCursor + the cursor it produces in depth."); +description("Test IndexedDB's webkitIDBIndex.openCursor + the cursor it produces in depth."); if (window.layoutTestController) layoutTestController.waitUntilDone(); @@ -29,49 +29,45 @@ window.testData = [ function openDatabase() { - result = evalAndLog("indexedDB.open('someDB', 'some description')"); + result = evalAndLog("webkitIndexedDB.open('someDB', 'some description')"); verifyResult(result); - result.onsuccess = openObjectStore; + result.onsuccess = setVersion; result.onerror = unexpectedErrorCallback; } -function openObjectStore() +function setVersion() { verifySuccessEvent(event); window.db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('someObjectStore')"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = openIndex; + result.onsuccess = deleteExisting; result.onerror = unexpectedErrorCallback; } -function openIndex() +function deleteExisting() { verifySuccessEvent(event); - window.objectStore = evalAndLog("objectStore = event.result"); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; - result = evalAndLog("objectStore.createIndex('someIndex', 'x')"); - verifyResult(result); - result.onsuccess = startAddingData; - result.onerror = unexpectedErrorCallback; + deleteAllObjectStores(db, startAddingData); } function startAddingData() { - verifySuccessEvent(event); - window.indexObject = evalAndLog("indexObject = event.result"); - + window.objectStore = evalAndLog("db.createObjectStore('someObjectStore')"); + window.indexObject = evalAndLog("objectStore.createIndex('someIndex', 'x')"); window.nextToAdd = 0; addData(); } function addData() { - // We cheat when called for the first time; we're in the context of the objectStore success event. - verifySuccessEvent(event); + if (window.nextToAdd > 0) + verifySuccessEvent(event); result = evalAndLog("objectStore.add({'x': testData[nextToAdd]}, nextToAdd)"); verifyResult(result); @@ -105,7 +101,7 @@ function scheduleTests() } debug("Running tests..."); - setTimeout(runNextTest, 0); + runNextTest(); } function runNextTest() @@ -184,13 +180,13 @@ function runNextTest() var keyRange; if (lower !== null && upper !== null) - keyRange = IDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen); + keyRange = webkitIDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen); else if (lower !== null) - keyRange = IDBKeyRange.leftBound(testData[lower], lowerIsOpen); + keyRange = webkitIDBKeyRange.leftBound(testData[lower], lowerIsOpen); else - keyRange = IDBKeyRange.rightBound(testData[upper], upperIsOpen); + keyRange = webkitIDBKeyRange.rightBound(testData[upper], upperIsOpen); - var request = indexObject.openCursor(keyRange, ascending ? IDBCursor.NEXT : IDBCursor.PREV); + var request = indexObject.openKeyCursor(keyRange, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV); request.onsuccess = cursorIteration; request.onerror = unexpectedErrorCallback; } @@ -213,12 +209,12 @@ function cursorIteration() { if (expectedIndex === null) { shouldBeNull("event.result"); - setTimeout(runNextTest, 0); + runNextTest(); return; } if (event.result === null) { - testFailed("Event.result should not be null.") - setTimeout(runNextTest, 0); + testFailed("Event.result should not be null."); + runNextTest(); return; } diff --git a/LayoutTests/storage/indexeddb/keyrange-expected.txt b/LayoutTests/storage/indexeddb/keyrange-expected.txt index 6528a11..8d6bf86 100644 --- a/LayoutTests/storage/indexeddb/keyrange-expected.txt +++ b/LayoutTests/storage/indexeddb/keyrange-expected.txt @@ -3,20 +3,20 @@ Test IndexedDB's KeyRange. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS 'SINGLE' in IDBKeyRange is true -PASS 'LEFT_OPEN' in IDBKeyRange is true -PASS 'RIGHT_OPEN' in IDBKeyRange is true -PASS 'LEFT_BOUND' in IDBKeyRange is true -PASS 'RIGHT_BOUND' in IDBKeyRange is true -PASS 'left' in IDBKeyRange is false -PASS 'right' in IDBKeyRange is false -PASS 'flags' in IDBKeyRange is false -PASS 'only' in IDBKeyRange is true -PASS 'leftBound' in IDBKeyRange is true -PASS 'rightBound' in IDBKeyRange is true -PASS 'bound' in IDBKeyRange is true +PASS 'SINGLE' in webkitIDBKeyRange is true +PASS 'LEFT_OPEN' in webkitIDBKeyRange is true +PASS 'RIGHT_OPEN' in webkitIDBKeyRange is true +PASS 'LEFT_BOUND' in webkitIDBKeyRange is true +PASS 'RIGHT_BOUND' in webkitIDBKeyRange is true +PASS 'left' in webkitIDBKeyRange is false +PASS 'right' in webkitIDBKeyRange is false +PASS 'flags' in webkitIDBKeyRange is false +PASS 'only' in webkitIDBKeyRange is true +PASS 'leftBound' in webkitIDBKeyRange is true +PASS 'rightBound' in webkitIDBKeyRange is true +PASS 'bound' in webkitIDBKeyRange is true -instance = IDBKeyRange.only(1) +instance = webkitIDBKeyRange.only(1) PASS 'SINGLE' in instance is true PASS 'LEFT_OPEN' in instance is true PASS 'RIGHT_OPEN' in instance is true @@ -30,113 +30,113 @@ PASS 'leftBound' in instance is false PASS 'rightBound' in instance is false PASS 'bound' in instance is false -IDBKeyRange.only(1) +webkitIDBKeyRange.only(1) PASS keyRange.left is 1 PASS keyRange.right is 1 PASS keyRange.flags is keyRange.SINGLE -IDBKeyRange.only('a') +webkitIDBKeyRange.only('a') PASS keyRange.left is 'a' PASS keyRange.right is 'a' PASS keyRange.flags is keyRange.SINGLE -IDBKeyRange.leftBound(10,true) +webkitIDBKeyRange.leftBound(10,true) PASS keyRange.left is 10 PASS keyRange.right is null PASS keyRange.flags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND -IDBKeyRange.leftBound(11,false) +webkitIDBKeyRange.leftBound(11,false) PASS keyRange.left is 11 PASS keyRange.right is null PASS keyRange.flags is keyRange.LEFT_BOUND -IDBKeyRange.leftBound(12,undefined) +webkitIDBKeyRange.leftBound(12,undefined) PASS keyRange.left is 12 PASS keyRange.right is null PASS keyRange.flags is keyRange.LEFT_BOUND -IDBKeyRange.leftBound('aa',true) +webkitIDBKeyRange.leftBound('aa',true) PASS keyRange.left is 'aa' PASS keyRange.right is null PASS keyRange.flags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND -IDBKeyRange.leftBound('ab',false) +webkitIDBKeyRange.leftBound('ab',false) PASS keyRange.left is 'ab' PASS keyRange.right is null PASS keyRange.flags is keyRange.LEFT_BOUND -IDBKeyRange.leftBound('ac',undefined) +webkitIDBKeyRange.leftBound('ac',undefined) PASS keyRange.left is 'ac' PASS keyRange.right is null PASS keyRange.flags is keyRange.LEFT_BOUND -IDBKeyRange.rightBound(20,true) +webkitIDBKeyRange.rightBound(20,true) PASS keyRange.right is 20 PASS keyRange.left is null PASS keyRange.flags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND -IDBKeyRange.rightBound(21,false) +webkitIDBKeyRange.rightBound(21,false) PASS keyRange.right is 21 PASS keyRange.left is null PASS keyRange.flags is keyRange.RIGHT_BOUND -IDBKeyRange.rightBound(22,undefined) +webkitIDBKeyRange.rightBound(22,undefined) PASS keyRange.right is 22 PASS keyRange.left is null PASS keyRange.flags is keyRange.RIGHT_BOUND -IDBKeyRange.rightBound('ba',true) +webkitIDBKeyRange.rightBound('ba',true) PASS keyRange.right is 'ba' PASS keyRange.left is null PASS keyRange.flags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND -IDBKeyRange.rightBound('bb',false) +webkitIDBKeyRange.rightBound('bb',false) PASS keyRange.right is 'bb' PASS keyRange.left is null PASS keyRange.flags is keyRange.RIGHT_BOUND -IDBKeyRange.rightBound('bc',undefined) +webkitIDBKeyRange.rightBound('bc',undefined) PASS keyRange.right is 'bc' PASS keyRange.left is null PASS keyRange.flags is keyRange.RIGHT_BOUND -IDBKeyRange.bound(30,40,undefined,undefined) +webkitIDBKeyRange.bound(30,40,undefined,undefined) PASS keyRange.left is 30 PASS keyRange.right is 40 PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound(31,41,false,false) +webkitIDBKeyRange.bound(31,41,false,false) PASS keyRange.left is 31 PASS keyRange.right is 41 PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound(32,42,false,true) +webkitIDBKeyRange.bound(32,42,false,true) PASS keyRange.left is 32 PASS keyRange.right is 42 PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND -IDBKeyRange.bound(33,43,true,false) +webkitIDBKeyRange.bound(33,43,true,false) PASS keyRange.left is 33 PASS keyRange.right is 43 PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound(34,44,true,true) +webkitIDBKeyRange.bound(34,44,true,true) PASS keyRange.left is 34 PASS keyRange.right is 44 PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND -IDBKeyRange.bound('aaa','aba',false,false) +webkitIDBKeyRange.bound('aaa','aba',false,false) PASS keyRange.left is 'aaa' PASS keyRange.right is 'aba' PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound('aab','abb',undefined,undefined) +webkitIDBKeyRange.bound('aab','abb',undefined,undefined) PASS keyRange.left is 'aab' PASS keyRange.right is 'abb' PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound('aac','abc',false,false) +webkitIDBKeyRange.bound('aac','abc',false,false) PASS keyRange.left is 'aac' PASS keyRange.right is 'abc' PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound('aad','abd',false,true) +webkitIDBKeyRange.bound('aad','abd',false,true) PASS keyRange.left is 'aad' PASS keyRange.right is 'abd' PASS leftFlags is keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND -IDBKeyRange.bound('aae','abe',true,false) +webkitIDBKeyRange.bound('aae','abe',true,false) PASS keyRange.left is 'aae' PASS keyRange.right is 'abe' PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND PASS rightFlags is keyRange.RIGHT_BOUND -IDBKeyRange.bound('aaf','abf',true,true) +webkitIDBKeyRange.bound('aaf','abf',true,true) PASS keyRange.left is 'aaf' PASS keyRange.right is 'abf' PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND diff --git a/LayoutTests/storage/indexeddb/keyrange.html b/LayoutTests/storage/indexeddb/keyrange.html index d60cb15..c3885fc 100644 --- a/LayoutTests/storage/indexeddb/keyrange.html +++ b/LayoutTests/storage/indexeddb/keyrange.html @@ -16,7 +16,7 @@ if (window.layoutTestController) function checkSingleKeyRange(value) { - keyRange = evalAndLog("IDBKeyRange.only(" + value + ")"); + keyRange = evalAndLog("webkitIDBKeyRange.only(" + value + ")"); shouldBe("keyRange.left", "" + value); shouldBe("keyRange.right", "" + value); shouldBe("keyRange.flags", "keyRange.SINGLE"); @@ -24,7 +24,7 @@ function checkSingleKeyRange(value) function checkLeftBoundKeyRange(value, open) { - keyRange = evalAndLog("IDBKeyRange.leftBound(" + value + "," + open + ")"); + keyRange = evalAndLog("webkitIDBKeyRange.leftBound(" + value + "," + open + ")"); shouldBe("keyRange.left", "" + value); shouldBeNull("keyRange.right"); shouldBe("keyRange.flags", open ? "keyRange.LEFT_OPEN | keyRange.LEFT_BOUND" : "keyRange.LEFT_BOUND"); @@ -32,7 +32,7 @@ function checkLeftBoundKeyRange(value, open) function checkRightBoundKeyRange(value, open) { - keyRange = evalAndLog("IDBKeyRange.rightBound(" + value + "," + open + ")"); + keyRange = evalAndLog("webkitIDBKeyRange.rightBound(" + value + "," + open + ")"); shouldBe("keyRange.right", "" + value); shouldBeNull("keyRange.left"); shouldBe("keyRange.flags", open ? "keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND" : "keyRange.RIGHT_BOUND"); @@ -40,7 +40,7 @@ function checkRightBoundKeyRange(value, open) function checkBoundKeyRange(left, right, openLeft, openRight) { - keyRange = evalAndLog("IDBKeyRange.bound(" + left + "," + right + "," + openLeft + "," + openRight + ")"); + keyRange = evalAndLog("webkitIDBKeyRange.bound(" + left + "," + right + "," + openLeft + "," + openRight + ")"); shouldBe("keyRange.left", "" + left); shouldBe("keyRange.right", "" + right); leftFlags = keyRange.flags & (keyRange.LEFT_OPEN | keyRange.LEFT_BOUND); @@ -51,22 +51,22 @@ function checkBoundKeyRange(left, right, openLeft, openRight) function test() { - shouldBeTrue("'SINGLE' in IDBKeyRange"); - shouldBeTrue("'LEFT_OPEN' in IDBKeyRange"); - shouldBeTrue("'RIGHT_OPEN' in IDBKeyRange"); - shouldBeTrue("'LEFT_BOUND' in IDBKeyRange"); - shouldBeTrue("'RIGHT_BOUND' in IDBKeyRange"); - shouldBeFalse("'left' in IDBKeyRange"); - shouldBeFalse("'right' in IDBKeyRange"); - shouldBeFalse("'flags' in IDBKeyRange"); - shouldBeTrue("'only' in IDBKeyRange"); - shouldBeTrue("'leftBound' in IDBKeyRange"); - shouldBeTrue("'rightBound' in IDBKeyRange"); - shouldBeTrue("'bound' in IDBKeyRange"); + shouldBeTrue("'SINGLE' in webkitIDBKeyRange"); + shouldBeTrue("'LEFT_OPEN' in webkitIDBKeyRange"); + shouldBeTrue("'RIGHT_OPEN' in webkitIDBKeyRange"); + shouldBeTrue("'LEFT_BOUND' in webkitIDBKeyRange"); + shouldBeTrue("'RIGHT_BOUND' in webkitIDBKeyRange"); + shouldBeFalse("'left' in webkitIDBKeyRange"); + shouldBeFalse("'right' in webkitIDBKeyRange"); + shouldBeFalse("'flags' in webkitIDBKeyRange"); + shouldBeTrue("'only' in webkitIDBKeyRange"); + shouldBeTrue("'leftBound' in webkitIDBKeyRange"); + shouldBeTrue("'rightBound' in webkitIDBKeyRange"); + shouldBeTrue("'bound' in webkitIDBKeyRange"); debug(""); - var instance = evalAndLog("instance = IDBKeyRange.only(1)"); + var instance = evalAndLog("instance = webkitIDBKeyRange.only(1)"); shouldBeTrue("'SINGLE' in instance"); shouldBeTrue("'LEFT_OPEN' in instance"); shouldBeTrue("'RIGHT_OPEN' in instance"); diff --git a/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt b/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt index 7b5439a..d22e6f0 100644 --- a/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt +++ b/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt @@ -3,7 +3,7 @@ Test the basics of IndexedDB's IDBObjectStore. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('name', 'description') +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -22,13 +22,13 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('storeName', null) +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true An event should fire shortly... -createSuccess(): +setVersionSuccess(): Success event fired: PASS 'result' in event is true PASS 'code' in event is false @@ -40,23 +40,34 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -store = event.result +trans = event.result +PASS trans !== null is true +Deleted all object stores. +creatObjectStore(): +store = db.createObjectStore('storeName', null) storeNames = db.objectStores PASS store.name is "storeName" PASS store.keyPath is null PASS storeNames.contains('storeName') is true PASS storeNames.length is 1 -Ask for a store that doesn't exist: +Ask for an index that doesn't exist: index = store.index('asdf') -PASS index is null -FAIL Asking for a store that doesn't exist should have thrown. -event.result.createIndex('indexName', 'x', true) +PASS Exception thrown. +createIndex(): +index = store.createIndex('indexName', 'x', true) +PASS index !== null is true +PASS store.indexNames.contains('indexName') is true +index = store.index('indexName') +PASS index !== null is true +Ask for an index that doesn't exist: +index = store.index('asdf') +PASS Exception thrown. +db.setVersion("version fail") PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true An event should fire shortly... -addIndexSuccess(): Success event fired: PASS 'result' in event is true PASS 'code' in event is false @@ -68,15 +79,25 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -PASS event.result !== null is true -PASS event.source.indexNames.contains('indexName') is true -index = event.source.index('indexName') -PASS index !== null is true -Ask for a store that doesn't exist: -index = store.index('asdf') -PASS index is null -FAIL Asking for a store that doesn't exist should have thrown. -event.source.add({x: 'value'}, 'key') +PASS db.version is "version fail" +setVersionTrans = event.result +PASS setVersionTrans !== null is true +store = setVersionTrans.objectStore('storeName') +index = store.createIndex('indexFail', 'x') +PASS db.version is "new version" +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 "indexName" +PASS store.indexNames[1] is null +PASS store.indexNames[100] is null +PASS store.indexNames.item(1) is null +PASS store.indexNames.item(100) is null +transaction = db.transaction() +store = transaction.objectStore('storeName') +store.add({x: 'value'}, 'key') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -113,7 +134,7 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -PASS event.code is IDBDatabaseException.UNKNOWN_ERR +PASS event.code is webkitIDBDatabaseException.UNKNOWN_ERR db.transaction() store = transaction.objectStore('storeName') store.get('key') diff --git a/LayoutTests/storage/indexeddb/objectstore-basics.html b/LayoutTests/storage/indexeddb/objectstore-basics.html index b2d383a..9730db8 100644 --- a/LayoutTests/storage/indexeddb/objectstore-basics.html +++ b/LayoutTests/storage/indexeddb/objectstore-basics.html @@ -16,7 +16,7 @@ if (window.layoutTestController) function test() { - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); verifyResult(result); result.onsuccess = openSuccess; result.onerror = unexpectedErrorCallback; @@ -26,21 +26,29 @@ function openSuccess() { debug("openSuccess():"); verifySuccessEvent(event); - db = evalAndLog("db = event.result"); + window.db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('storeName', null)"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = createSuccess; + result.onsuccess = setVersionSuccess; result.onerror = unexpectedErrorCallback; } -function createSuccess() +function setVersionSuccess() { - debug("createSuccess():"); + debug("setVersionSuccess():"); verifySuccessEvent(event); - var store = evalAndLog("store = event.result"); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + + deleteAllObjectStores(db, createObjectStore); +} + +function createObjectStore() +{ + debug("creatObjectStore():"); + window.store = evalAndLog("store = db.createObjectStore('storeName', null)"); var storeNames = evalAndLog("storeNames = db.objectStores"); shouldBeEqualToString("store.name", "storeName"); @@ -49,42 +57,92 @@ function createSuccess() shouldBe("storeNames.length", "1"); // FIXME: test all of object store's methods. - debug("Ask for a store that doesn't exist:"); + debug("Ask for an index that doesn't exist:"); try { - index = evalAndLog("index = store.index('asdf')"); - shouldBeNull("index"); // Returning null is wrong, but less wrong than returning an actual object! + debug("index = store.index('asdf')"); + index = store.index('asdf'); testFailed("Asking for a store that doesn't exist should have thrown."); } catch (err) { - testPassed("Error thrown."); + testPassed("Exception thrown."); // FIXME: Verify the correct exception thrown. } - result = evalAndLog("event.result.createIndex('indexName', 'x', true)"); // true == unique requirement. - verifyResult(result); - result.onsuccess = addIndexSuccess; - result.onerror = unexpectedErrorCallback; + createIndex(); } -function addIndexSuccess() +function createIndex() { - debug("addIndexSuccess():"); - verifySuccessEvent(event); - shouldBeTrue("event.result !== null"); - shouldBeTrue("event.source.indexNames.contains('indexName')"); - index = evalAndLog("index = event.source.index('indexName')"); + debug("createIndex():"); + var index = evalAndLog("index = store.createIndex('indexName', 'x', true)"); // true == unique requirement. shouldBeTrue("index !== null"); - - debug("Ask for a store that doesn't exist:"); + shouldBeTrue("store.indexNames.contains('indexName')"); + index = evalAndLog("index = store.index('indexName')"); + shouldBeTrue("index !== null"); + + debug("Ask for an index that doesn't exist:"); try { - index = evalAndLog("index = store.index('asdf')"); - shouldBeNull("index"); // Returning null is wrong, but less wrong than returning an actual object! + debug("index = store.index('asdf')"); + index = store.index('asdf'); testFailed("Asking for a store that doesn't exist should have thrown."); } catch (err) { - testPassed("Error thrown."); + testPassed("Exception thrown."); // FIXME: Verify the correct exception thrown. } - result = evalAndLog("event.source.add({x: 'value'}, 'key')"); + commitAndContinue(); +} + +function commitAndContinue() +{ + window.setTimeout(testSetVersionAbort, 0); +} + +function testSetVersionAbort() +{ + result = evalAndLog('db.setVersion("version fail")'); + verifyResult(result); + result.onsuccess = createAnotherIndex; + result.onerror = unexpectedErrorCallback; +} + +function createAnotherIndex() +{ + verifySuccessEvent(event); + shouldBeEqualToString("db.version", "version fail"); + + var setVersionTrans = evalAndLog("setVersionTrans = event.result"); + shouldBeTrue("setVersionTrans !== null"); + setVersionTrans.oncomplete = unexpectedCompleteCallback; + setVersionTrans.onabort = checkMetadata; + window.store = evalAndLog("store = setVersionTrans.objectStore('storeName')"); + var index = evalAndLog("index = store.createIndex('indexFail', 'x')"); + + setVersionTrans.abort(); +} + +function checkMetadata() +{ + shouldBeEqualToString("db.version", "new version"); + shouldBe("store.indexNames", "['indexName']"); + shouldBe("store.indexNames.length", "1"); + shouldBe("store.indexNames.contains('')", "false"); + shouldBe("store.indexNames.contains('indexFail')", "false"); + shouldBe("store.indexNames.contains('indexName')", "true"); + shouldBeEqualToString("store.indexNames[0]", "indexName"); + shouldBeNull("store.indexNames[1]"); + shouldBeNull("store.indexNames[100]"); + shouldBeNull("store.indexNames.item(1)"); + shouldBeNull("store.indexNames.item(100)"); + addData(); +} + + +function addData() +{ + var transaction = evalAndLog("transaction = db.transaction()"); + transaction.onabort = unexpectedAbortCallback; + window.store = evalAndLog("store = transaction.objectStore('storeName')"); + result = evalAndLog("store.add({x: 'value'}, 'key')"); verifyResult(result); result.onsuccess = addSuccess; result.onerror = unexpectedErrorCallback; @@ -107,7 +165,7 @@ function addAgainFailure() debug("addAgainFailure():"); verifyErrorEvent(event); // FIXME: This error code needs to be specced. - shouldBe("event.code", "IDBDatabaseException.UNKNOWN_ERR"); + shouldBe("event.code", "webkitIDBDatabaseException.UNKNOWN_ERR"); transaction = evalAndLog("db.transaction()"); transaction.onabort = unexpectedErrorCallback; diff --git a/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt b/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt index e7211f6..881fe92 100644 --- a/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt +++ b/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt @@ -3,7 +3,7 @@ Test IndexedDB's objectStore.openCursor + the cursor it produces in depth. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('someDB', 'some description') +webkitIndexedDB.open('someDB', 'some description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -21,7 +21,7 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('someObjectStore') +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -38,18 +38,10 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -objectStore = event.result -Success event fired: -PASS 'result' in event is true -PASS 'code' in event is false -PASS 'message' in event is false -PASS 'source' in event is true -PASS event.source != null is true -PASS 'onsuccess' in event.target is true -PASS 'onerror' in event.target is true -PASS 'readyState' in event.target is true -PASS event.target.readyState is event.target.DONE - +trans = event.result +PASS trans !== null is true +Deleted all object stores. +db.createObjectStore('someObjectStore') objectStore.add('', testData[nextToAdd]) PASS 'onsuccess' in result is true PASS 'onerror' in result is true diff --git a/LayoutTests/storage/indexeddb/objectstore-cursor.html b/LayoutTests/storage/indexeddb/objectstore-cursor.html index 25e9456..d9ad805 100644 --- a/LayoutTests/storage/indexeddb/objectstore-cursor.html +++ b/LayoutTests/storage/indexeddb/objectstore-cursor.html @@ -28,38 +28,44 @@ window.testData = [ function openDatabase() { - result = evalAndLog("indexedDB.open('someDB', 'some description')"); + result = evalAndLog("webkitIndexedDB.open('someDB', 'some description')"); verifyResult(result); - result.onsuccess = openObjectStore; + result.onsuccess = setVersion; result.onerror = unexpectedErrorCallback; } -function openObjectStore() +function setVersion() { verifySuccessEvent(event); window.db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('someObjectStore')"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = startAddingData; + result.onsuccess = deleteExisting; result.onerror = unexpectedErrorCallback; } - -function startAddingData() + +function deleteExisting() { verifySuccessEvent(event); - window.objectStore = evalAndLog("objectStore = event.result"); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + deleteAllObjectStores(db, startAddingData); +} + +function startAddingData() +{ + window.objectStore = evalAndLog("db.createObjectStore('someObjectStore')"); window.nextToAdd = 0; addData(); } function addData() { - // We cheat when called for the first time; we're in the context of the objectStore success event. - verifySuccessEvent(event); + if (window.nextToAdd > 0) + verifySuccessEvent(event); result = evalAndLog("objectStore.add('', testData[nextToAdd])"); verifyResult(result); @@ -93,7 +99,7 @@ function scheduleTests() } debug("Running tests..."); - setTimeout(runNextTest, 0); + runNextTest(); } function runNextTest() @@ -152,13 +158,13 @@ function runNextTest() var keyRange; if (lower !== null && upper !== null) - keyRange = IDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen); + keyRange = webkitIDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen); else if (lower !== null) - keyRange = IDBKeyRange.leftBound(testData[lower], lowerIsOpen); + keyRange = webkitIDBKeyRange.leftBound(testData[lower], lowerIsOpen); else - keyRange = IDBKeyRange.rightBound(testData[upper], upperIsOpen); + keyRange = webkitIDBKeyRange.rightBound(testData[upper], upperIsOpen); - // FIXME: Should be IDBCursor.NEXT : IDBCursor.PREV, but we can't do that yet. + // FIXME: Should be webkitIDBCursor.NEXT : webkitIDBCursor.PREV, but we can't do that yet. var request = objectStore.openCursor(keyRange, ascending ? 0 : 2); request.onsuccess = cursorIteration; request.onerror = unexpectedErrorCallback; @@ -182,12 +188,12 @@ function cursorIteration() { if (expectedIndex === null) { shouldBeNull("event.result"); - setTimeout(runNextTest, 0); + runNextTest(); return; } if (event.result === null) { - testFailed("Event.result should not be null.") - setTimeout(runNextTest, 0); + testFailed("Event.result should not be null."); + runNextTest(); return; } diff --git a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt index b7ba473..b6b20a2 100644 --- a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt +++ b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt @@ -1,9 +1,9 @@ -Test IndexedDB's IDBObjectStore.removeObjectStore(). +Test IndexedDB's webkitIDBObjectStore.removeObjectStore(). On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('name', 'description') +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -21,7 +21,7 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('storeName', null) +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -38,7 +38,13 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -event.result.add('value', 'key') +trans = event.result +PASS trans !== null is true +Deleted all object stores. +store = db.createObjectStore('storeName', null) +store.createIndex('indexName', '') +PASS store.indexNames.contains('indexName') is true +store.add('value', 'key') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -75,7 +81,7 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE PASS event.result is "value" -event.source.createIndex('indexName', '') +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -92,41 +98,10 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -PASS event.source.indexNames.contains('indexName') is true +trans = event.result +PASS trans !== null is true db.removeObjectStore('storeName') -PASS 'onsuccess' in result is true -PASS 'onerror' in result is true -PASS 'readyState' in result is true -An event should fire shortly... - -Success event fired: -PASS 'result' in event is true -PASS 'code' in event is false -PASS 'message' in event is false -PASS 'source' in event is true -PASS event.source != null is true -PASS 'onsuccess' in event.target is true -PASS 'onerror' in event.target is true -PASS 'readyState' in event.target is true -PASS event.target.readyState is event.target.DONE - db.createObjectStore('storeName', null) -PASS 'onsuccess' in result is true -PASS 'onerror' in result is true -PASS 'readyState' in result is true -An event should fire shortly... - -Success event fired: -PASS 'result' in event is true -PASS 'code' in event is false -PASS 'message' in event is false -PASS 'source' in event is true -PASS event.source != null is true -PASS 'onsuccess' in event.target is true -PASS 'onerror' in event.target is true -PASS 'readyState' in event.target is true -PASS event.target.readyState is event.target.DONE - db.transaction() store = transaction.objectStore('storeName') store.get('key') diff --git a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html index 7878c7f..c4418bc 100644 --- a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html +++ b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html @@ -10,36 +10,46 @@ <div id="console"></div> <script> -description("Test IndexedDB's IDBObjectStore.removeObjectStore()."); +description("Test IndexedDB's webkitIDBObjectStore.removeObjectStore()."); if (window.layoutTestController) layoutTestController.waitUntilDone(); function test() { - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); verifyResult(result); - result.onsuccess = createObjectStore; + result.onsuccess = startSetVersion; result.onerror = unexpectedErrorCallback; } -function createObjectStore() +function startSetVersion() { verifySuccessEvent(event); db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('storeName', null)"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = addValue; + result.onsuccess = deleteExisting; result.onerror = unexpectedErrorCallback; } -function addValue() +function deleteExisting() { verifySuccessEvent(event); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + + deleteAllObjectStores(db, createObjectStoreAndAddValue); +} + +function createObjectStoreAndAddValue() +{ + store = evalAndLog("store = db.createObjectStore('storeName', null)"); - result = evalAndLog("event.result.add('value', 'key')"); + window.index = evalAndLog("store.createIndex('indexName', '')"); + shouldBeTrue("store.indexNames.contains('indexName')"); + + result = evalAndLog("store.add('value', 'key')"); verifyResult(result); result.onsuccess = getValue; result.onerror = unexpectedErrorCallback; @@ -64,42 +74,31 @@ function addIndex() verifySuccessEvent(event); shouldBeEqualToString("event.result", "value"); - result = evalAndLog("event.source.createIndex('indexName', '')"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = commitTransaction; + result.onsuccess = removeObjectStore; result.onerror = unexpectedErrorCallback; } -function commitTransaction() +function removeObjectStore() { verifySuccessEvent(event); - shouldBeTrue("event.source.indexNames.contains('indexName')"); - // Let the transaction commit. - window.setTimeout('removeObjectStore()', 0); -} + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; -function removeObjectStore() -{ - result = evalAndLog("db.removeObjectStore('storeName')"); - verifyResult(result); - result.onsuccess = createObjectStoreAgain; - result.onerror = unexpectedErrorCallback; + evalAndLog("db.removeObjectStore('storeName')"); + createObjectStoreAgain(); } function createObjectStoreAgain() { - verifySuccessEvent(event); - - result = evalAndLog("db.createObjectStore('storeName', null)"); - verifyResult(result); - result.onsuccess = getValueAgain; - result.onerror = unexpectedErrorCallback; + evalAndLog("db.createObjectStore('storeName', null)"); + getValueAgain(); } function getValueAgain() { - verifySuccessEvent(event); - transaction = evalAndLog("db.transaction()"); transaction.onabort = unexpectedErrorCallback; var store = evalAndLog("store = transaction.objectStore('storeName')"); diff --git a/LayoutTests/storage/indexeddb/open-cursor-expected.txt b/LayoutTests/storage/indexeddb/open-cursor-expected.txt index bda103f..1bca527 100644 --- a/LayoutTests/storage/indexeddb/open-cursor-expected.txt +++ b/LayoutTests/storage/indexeddb/open-cursor-expected.txt @@ -3,7 +3,7 @@ Test IndexedDB's openCursor. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -indexedDB.open('name', 'description') +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true @@ -21,12 +21,13 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('test') +db.setVersion('new version') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true An event should fire shortly... +setVersionSuccess(): Success event fired: PASS 'result' in event is true PASS 'code' in event is false @@ -38,7 +39,10 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE -objectStore = event.result +trans = event.result +PASS trans !== null is true +Deleted all object stores. +objectStore = db.createObjectStore('test') objectStore.add('myValue', 'myKey') PASS 'onsuccess' in result is true PASS 'onerror' in result is true @@ -46,7 +50,7 @@ PASS 'readyState' in result is true An event should fire shortly... Opening cursor -objectStore.openCursor(keyRange) +event.source.openCursor(keyRange) PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true diff --git a/LayoutTests/storage/indexeddb/open-cursor.html b/LayoutTests/storage/indexeddb/open-cursor.html index 03d1da0..ec62f2c 100644 --- a/LayoutTests/storage/indexeddb/open-cursor.html +++ b/LayoutTests/storage/indexeddb/open-cursor.html @@ -25,7 +25,7 @@ function emptyCursorSuccess() function openEmptyCursor() { debug("Opening an empty cursor."); - keyRange = IDBKeyRange.leftBound("InexistentKey"); + keyRange = webkitIDBKeyRange.leftBound("InexistentKey"); result = evalAndLog("objectStore.openCursor(keyRange)"); verifyResult(result); result.onsuccess = emptyCursorSuccess; @@ -47,26 +47,31 @@ function cursorSuccess() function openCursor() { debug("Opening cursor"); - keyRange = IDBKeyRange.leftBound("myKey"); - result = evalAndLog("objectStore.openCursor(keyRange)"); + keyRange = webkitIDBKeyRange.leftBound("myKey"); + result = evalAndLog("event.source.openCursor(keyRange)"); verifyResult(result); result.onsuccess = cursorSuccess; result.onerror = unexpectedErrorCallback; -} - -function populateObjectStore(objectStore) -{ +}
+
+function createAndPopulateObjectStore() +{
+ var objectStore = evalAndLog("objectStore = db.createObjectStore('test')"); result = evalAndLog("objectStore.add('myValue', 'myKey')"); verifyResult(result); result.onsuccess = openCursor; result.onerror = unexpectedErrorCallback; } -function createObjectStoreSuccess() +function setVersionSuccess() { + debug("setVersionSuccess():"); verifySuccessEvent(event); - var objectStore = evalAndLog("objectStore = event.result"); - populateObjectStore(objectStore); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + + deleteAllObjectStores(db, createAndPopulateObjectStore); } function openSuccess() @@ -74,17 +79,15 @@ function openSuccess() verifySuccessEvent(event); var db = evalAndLog("db = event.result"); - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('test')"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = createObjectStoreSuccess; + result.onsuccess = setVersionSuccess; result.onerror = unexpectedErrorCallback; } function test() { - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); verifyResult(result); result.onsuccess = openSuccess; result.onerror = unexpectedErrorCallback; diff --git a/LayoutTests/storage/indexeddb/queued-commands-expected.txt b/LayoutTests/storage/indexeddb/queued-commands-expected.txt new file mode 100644 index 0000000..e2e20af --- /dev/null +++ b/LayoutTests/storage/indexeddb/queued-commands-expected.txt @@ -0,0 +1,104 @@ +Verify that queuing up several commands works (and they all fire). + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +webkitIndexedDB.open('name', 'description') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +db = event.result +db.setVersion('new version') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +setVersionSuccess(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +Deleted all object stores. +db.createObjectStore('storeName', null) +store.createIndex('indexName', 'x') +store.add({x: 'value', y: 'zzz'}, 'key') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +store.add({x: 'value2', y: 'zzz2'}, 'key2') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +store.put({x: 'valu2', y: 'zz2'}, 'ky2') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +PASS 0 is 0 +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +PASS 1 is 1 +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +PASS 2 is 2 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/storage/indexeddb/queued-commands.html b/LayoutTests/storage/indexeddb/queued-commands.html new file mode 100644 index 0000000..7dc94c3 --- /dev/null +++ b/LayoutTests/storage/indexeddb/queued-commands.html @@ -0,0 +1,87 @@ +<html> +<head> +<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> +<script src="../../fast/js/resources/js-test-pre.js"></script> +<script src="../../fast/js/resources/js-test-post-function.js"></script> +<script src="resources/shared.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script> + +description("Verify that queuing up several commands works (and they all fire)."); +if (window.layoutTestController) + layoutTestController.waitUntilDone(); + +function test() +{ + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); + verifyResult(result); + result.onsuccess = setVersion; + result.onerror = unexpectedErrorCallback; +} + +function setVersion() +{ + verifySuccessEvent(event); + db = evalAndLog("db = event.result"); + + result = evalAndLog("db.setVersion('new version')"); + verifyResult(result); + result.onsuccess = deleteExisting; + result.onerror = unexpectedErrorCallback; +} + +function deleteExisting() +{ + debug("setVersionSuccess():"); + verifySuccessEvent(event); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + + deleteAllObjectStores(db, createIndex); +} + +function createIndex() +{ + window.store = evalAndLog("db.createObjectStore('storeName', null)"); + window.indexObject = evalAndLog("store.createIndex('indexName', 'x')"); + + result = evalAndLog("store.add({x: 'value', y: 'zzz'}, 'key')"); + verifyResult(result); + result.onsuccess = function() { verifyAdd(0); }; + result.onerror = unexpectedErrorCallback; + + result = evalAndLog("store.add({x: 'value2', y: 'zzz2'}, 'key2')"); + verifyResult(result); + result.onsuccess = function() { verifyAdd(1); }; + result.onerror = unexpectedErrorCallback; + + result = evalAndLog("store.put({x: 'valu2', y: 'zz2'}, 'ky2')"); + verifyResult(result); + result.onsuccess = function() { verifyAdd(2); }; + result.onerror = unexpectedErrorCallback; + + window.addCount = 0; +} + +function verifyAdd(expected) +{ + verifySuccessEvent(event); + shouldBe("" + addCount++, "" + expected); + + if (addCount == 3) + done(); + if (addCount > 3) + testFailed("Unexpected call to verifyAdd!"); +} + +test(); + +var successfullyParsed = true; + +</script> +</body> +</html> diff --git a/LayoutTests/storage/indexeddb/resources/shared.js b/LayoutTests/storage/indexeddb/resources/shared.js index 65da3bf..01ec606 100644 --- a/LayoutTests/storage/indexeddb/resources/shared.js +++ b/LayoutTests/storage/indexeddb/resources/shared.js @@ -40,6 +40,12 @@ function verifyAbortEvent(event) shouldBeEqualToString("event.type", "abort"); } +function verifyCompleteEvent(event) +{ + debug("Complete event fired:"); + shouldBeEqualToString("event.type", "complete"); +} + function verifyResult(result) { shouldBeTrue("'onsuccess' in result"); @@ -65,9 +71,28 @@ function unexpectedErrorCallback() done(); } -function deleteAllObjectStores(db) +function unexpectedAbortCallback() +{ + testFailed("Abort function called unexpectedly!"); + debug(""); + verifyAbortEvent(event); + done(); +} + +function unexpectedCompleteCallback() { - objectStores = db.objectStores; - for (var i = 0; i < objectStores.length; ++i) - db.removeObjectStore(objectStores[i]); + testFailed("oncomplete function called unexpectedly!"); + debug(""); + verifyCompleteEvent(event); + done(); +} + +// FIXME: remove the onfinished parameter. +function deleteAllObjectStores(db, onfinished) +{ + while (db.objectStores.length) + db.removeObjectStore(db.objectStores.item(0)); + + debug("Deleted all object stores."); + onfinished(); } diff --git a/LayoutTests/storage/indexeddb/transaction-basics-expected.txt b/LayoutTests/storage/indexeddb/transaction-basics-expected.txt index bba62f0..b493946 100644 --- a/LayoutTests/storage/indexeddb/transaction-basics-expected.txt +++ b/LayoutTests/storage/indexeddb/transaction-basics-expected.txt @@ -3,15 +3,15 @@ Test IndexedDB transaction basics. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS 'indexedDB' in window is true -PASS indexedDB == null is false -indexedDB.open('name', 'description') +PASS 'webkitIndexedDB' in window is true +PASS webkitIndexedDB == null is false +webkitIndexedDB.open('name', 'description') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true An event should fire shortly... -createObjectStoreCallback(): +openSuccess(): Success event fired: PASS 'result' in event is true PASS 'code' in event is false @@ -24,12 +24,32 @@ PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE db = event.result -db.createObjectStore('storeName', null) +result = db.setVersion('version 1') +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +Deleted all object stores. +PASS window.db.objectStores is [] +PASS window.db.objectStores.length is 0 +PASS window.db.objectStores.contains('storeFail') is false +PASS window.db.objectStores is [] +PASS window.db.objectStores.length is 0 +PASS window.db.objectStores.contains('storeFail') is false +result = startSetVersion('version fail') PASS 'onsuccess' in result is true PASS 'onerror' in result is true PASS 'readyState' in result is true An event should fire shortly... +addRemoveIDBObjects(): Success event fired: PASS 'result' in event is true PASS 'code' in event is false @@ -41,11 +61,125 @@ PASS 'onerror' in event.target is true PASS 'readyState' in event.target is true PASS event.target.readyState is event.target.DONE +trans = event.result +PASS trans !== null is true +store = db.createObjectStore('storeFail', null) +index = store.createIndex('indexFail', 'x', false) +db.removeObjectStore('storeFail') +store.removeIndex('indexFail') +PASS window.db.objectStores is [] +PASS window.db.objectStores.length is 0 +PASS window.db.objectStores.contains('storeFail') is false +result = startSetVersion('version fail') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +addRemoveAddIDBObjects(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +store = db.createObjectStore('storeFail', null) +index = store.createIndex('indexFail', 'x', false) +db.removeObjectStore('storeFail') +store.removeIndex('indexFail') +store = db.createObjectStore('storeFail', null) +index = store.createIndex('indexFail', 'x', false) +PASS window.db.objectStores is [] +PASS window.db.objectStores.length is 0 +PASS window.db.objectStores.contains('storeFail') is false +result = startSetVersion('version fail') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +addIDBObjects(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +store = db.createObjectStore('storeFail', null) +index = store.createIndex('indexFail', 'x', false) +PASS db.objectStores is ['storeFail'] +PASS db.objectStores.length is 1 +PASS db.objectStores.contains('storeFail') is true +result = startSetVersion('version fail') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +removeIDBObjects(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +store = trans.objectStore('storeFail') +store.removeIndex('indexFail') +db.removeObjectStore('storeFail') +PASS db.objectStores is ['storeFail'] +PASS db.objectStores.length is 1 +PASS db.objectStores.contains('storeFail') is true +db.setVersion('new version') +PASS 'onsuccess' in result is true +PASS 'onerror' in result is true +PASS 'readyState' in result is true +An event should fire shortly... + +setVersionSuccess(): +Success event fired: +PASS 'result' in event is true +PASS 'code' in event is false +PASS 'message' in event is false +PASS 'source' in event is true +PASS event.source != null is true +PASS 'onsuccess' in event.target is true +PASS 'onerror' in event.target is true +PASS 'readyState' in event.target is true +PASS event.target.readyState is event.target.DONE + +trans = event.result +PASS trans !== null is true +Deleted all object stores. +db.createObjectStore('storeName', null) db.transaction() store = transaction.objectStore('storeName') PASS store.name is "storeName" Abort event fired: PASS event.type is "abort" +Complete event fired: +PASS event.type is "complete" +PASS oncomplete event had fired PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/storage/indexeddb/transaction-basics.html b/LayoutTests/storage/indexeddb/transaction-basics.html index cea5d5d..07fc685 100644 --- a/LayoutTests/storage/indexeddb/transaction-basics.html +++ b/LayoutTests/storage/indexeddb/transaction-basics.html @@ -16,48 +16,239 @@ if (window.layoutTestController) function test() { - shouldBeTrue("'indexedDB' in window"); - shouldBeFalse("indexedDB == null"); + shouldBeTrue("'webkitIndexedDB' in window"); + shouldBeFalse("webkitIndexedDB == null"); - result = evalAndLog("indexedDB.open('name', 'description')"); + result = evalAndLog("webkitIndexedDB.open('name', 'description')"); verifyResult(result); result.onsuccess = openSuccess; result.onerror = unexpectedErrorCallback; +}
+
+function openSuccess()
+{
+ debug("openSuccess():");
+ verifySuccessEvent(event);
+ window.db = evalAndLog("db = event.result");
+ result = evalAndLog("result = db.setVersion('version 1')");
+ result.onsuccess = cleanDatabase;
+ result.onerror = unexpectedErrorCallback;
+}
+
+function cleanDatabase()
+{
+ verifySuccessEvent(event);
+ deleteAllObjectStores(db, checkMetadataEmpty);
+ commitAndContinue(testSetVersionAbort1);
+}
+
+function testSetVersionAbort1()
+{
+ checkMetadataEmpty();
+ result = evalAndLog("result = startSetVersion('version fail')");
+ result.onsuccess = addRemoveIDBObjects;
+}
+
+function addRemoveIDBObjects()
+{
+ debug("addRemoveIDBObjects():");
+ verifySuccessEvent(event);
+ var trans = evalAndLog("trans = event.result");
+ shouldBeTrue("trans !== null");
+ trans.onabort = testSetVersionAbort2;
+ trans.oncomplete = unexpectedCompleteCallback;
+
+ var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+ var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+ evalAndLog("db.removeObjectStore('storeFail')");
+ evalAndLog("store.removeIndex('indexFail')");
+
+ trans.abort();
+}
+
+function testSetVersionAbort2()
+{
+ checkMetadataEmpty();
+ result = evalAndLog("result = startSetVersion('version fail')");
+ result.onsuccess = addRemoveAddIDBObjects;
+}
+
+function addRemoveAddIDBObjects()
+{
+ debug("addRemoveAddIDBObjects():");
+ verifySuccessEvent(event);
+ var trans = evalAndLog("trans = event.result");
+ shouldBeTrue("trans !== null");
+ trans.onabort = testSetVersionAbort3;
+ trans.oncomplete = unexpectedCompleteCallback;
+
+ var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+ var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+ evalAndLog("db.removeObjectStore('storeFail')");
+ evalAndLog("store.removeIndex('indexFail')");
+
+ var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+ var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+ trans.abort();
+}
+
+function testSetVersionAbort3()
+{
+ checkMetadataEmpty();
+ result = evalAndLog("result = startSetVersion('version fail')");
+ result.onsuccess = addIDBObjects;
+}
+
+function addIDBObjects()
+{
+ debug("addIDBObjects():");
+ verifySuccessEvent(event);
+ var trans = evalAndLog("trans = event.result");
+ shouldBeTrue("trans !== null");
+ trans.onabort = testSetVersionAbort4;
+ trans.oncomplete = unexpectedCompleteCallback;
+
+ var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+ var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+ trans.abort();
+}
+
+function testSetVersionAbort4()
+{
+ checkMetadataEmpty();
+ result = evalAndLog("result = startSetVersion('version fail')");
+ result.onsuccess = addIDBObjectsAndCommit;
+}
+
+function addIDBObjects()
+{
+ debug("addIDBObjects():");
+ verifySuccessEvent(event);
+ var trans = evalAndLog("trans = event.result");
+ shouldBeTrue("trans !== null");
+ trans.onabort = unexpectedAbortCallback;
+
+ var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+ var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+ commitAndContinue(testSetVersionAbort5);
+}
+
+function commitAndContinue(continueFunction)
+{
+ window.setTimeout(continueFunction, 0);
+}
+
+function testSetVersionAbort5()
+{
+ checkMetadataExistingObjectStore();
+ result = evalAndLog("result = startSetVersion('version fail')");
+ result.onsuccess = removeIDBObjects;
+}
+
+function removeIDBObjects()
+{
+ debug("removeIDBObjects():");
+ verifySuccessEvent(event);
+ var trans = evalAndLog("trans = event.result");
+ shouldBeTrue("trans !== null");
+ trans.onabort = testSetVersionAbort6;
+ trans.oncomplete = unexpectedCompleteCallback;
+
+ var store = evalAndLog("store = trans.objectStore('storeFail')");
+ evalAndLog("store.removeIndex('indexFail')");
+ evalAndLog("db.removeObjectStore('storeFail')");
+
+ trans.abort();
+}
+
+function testSetVersionAbort6()
+{
+ checkMetadataExistingObjectStore();
+ setNewVersion();
+}
+
+function startSetVersion(versionName)
+{
+ result = db.setVersion(versionName);
+ verifyResult(result);
+ result.onerror = unexpectedErrorCallback;
+ return result;
+}
+
+function checkMetadataEmpty()
+{
+ shouldBe("window.db.objectStores", "[]");
+ shouldBe("window.db.objectStores.length", "0");
+ shouldBe("window.db.objectStores.contains('storeFail')", "false"); +}
+
+function checkMetadataExistingObjectStore()
+{
+ shouldBe("db.objectStores", "['storeFail']");
+ shouldBe("db.objectStores.length", "1");
+ shouldBe("db.objectStores.contains('storeFail')", "true");
} -function openSuccess() +function setNewVersion() { - debug("createObjectStoreCallback():"); - verifySuccessEvent(event); - db = evalAndLog("db = event.result"); - - deleteAllObjectStores(db); - - result = evalAndLog("db.createObjectStore('storeName', null)"); + result = evalAndLog("db.setVersion('new version')"); verifyResult(result); - result.onsuccess = createSuccess; + result.onsuccess = setVersionSuccess; result.onerror = unexpectedErrorCallback; } -function createSuccess() +function setVersionSuccess() { + debug("setVersionSuccess():"); verifySuccessEvent(event); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + trans.oncomplete = completeCallback; + window.completeEventFired = false; + + deleteAllObjectStores(db, createObjectStoreAndStartTransaction); +}
+
+function createObjectStoreAndStartTransaction()
+{
+ evalAndLog("db.createObjectStore('storeName', null)"); transaction = evalAndLog("db.transaction()"); transaction.onabort = abortCallback; var store = evalAndLog("store = transaction.objectStore('storeName')"); shouldBeEqualToString("store.name", "storeName"); } +function completeCallback() +{ + verifyCompleteEvent(event); + window.completeEventFired = true; +} + function abortCallback() { verifyAbortEvent(event); - done(); + checkForCompleteEvent(); } -test(); +function checkForCompleteEvent() +{ + if (completeEventFired) { + testPassed("oncomplete event had fired"); + done(); + } else + setTimeout(checkForCompleteEvent, 1); +} var successfullyParsed = true; +test(); + </script> </body> </html> |