diff options
Diffstat (limited to 'dom/settings/tests/test_settings_blobs.html')
-rw-r--r-- | dom/settings/tests/test_settings_blobs.html | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/dom/settings/tests/test_settings_blobs.html b/dom/settings/tests/test_settings_blobs.html new file mode 100644 index 000000000..6d24111cf --- /dev/null +++ b/dom/settings/tests/test_settings_blobs.html @@ -0,0 +1,148 @@ +<!DOCTYPE html> +<html> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=821630 +--> +<head> + <title>Test for Bug 821630 Settings API</title> + <script type="text/javascript" src="/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" /> +</head> +<body> + +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=821630">Mozilla Bug 821630</a> +<p id="display"></p> +<div id="content" style="display: none"> + +</div> +<pre id="test"> +<script class="testbody" type="text/javascript;version=1.7"> + +"use strict"; + +var url = SimpleTest.getTestFileURL("file_loadserver.js"); +var script = SpecialPowers.loadChromeScript(url); + +function onUnwantedSuccess() { + ok(false, "onUnwantedSuccess: shouldn't get here"); +} + +function onFailure() { + return function(s) { + if (s) { + ok(false, "in on Failure! - " + s); + } else { + ok(false, "in on Failure!"); + } + } +} + +let req; + +let storedBlob = new Blob(['12345'], {"type": "text/plain"}); + +function checkBlob(blob) { + try { + let url = URL.createObjectURL(blob); + ok(true, "Valid blob"); + } catch (e) { + ok(false, "Valid blob"); + } +} + +let steps = [ + function() { + let lock = navigator.mozSettings.createLock(); + req = lock.clear(); + req.onsuccess = next; + req.onerror = onFailure("Deleting database"); + }, + function() { + function obs(e) { + checkBlob(e.settingValue); + navigator.mozSettings.removeObserver("test1", obs); + next(); + } + navigator.mozSettings.addObserver("test1", obs); + next(); + }, + function() { + // next is called by the observer above + let req = navigator.mozSettings.createLock().set({"test1": storedBlob}); + req.onerror = onFailure("Saving blob"); + }, + function() { + let req = navigator.mozSettings.createLock().get("test1"); + req.onsuccess = function(event) { + checkBlob(event.target.result["test1"]); + next(); + }; + req.onerror = onFailure("Getting blob"); + }, + function() { + let req = navigator.mozSettings.createLock().set({"test2": [1, 2, storedBlob, 4]}); + req.onsuccess = next; + req.onerror = onFailure("Saving array"); + }, + function() { + let req = navigator.mozSettings.createLock().get("test2"); + req.onsuccess = function(event) { + let val = event.target.result["test2"]; + ok(Array.isArray(val), "Result is an array"); + ok(val[0] == 1 && val[1] == 2 && val[3] == 4, "Primitives are preserved"); + checkBlob(val[2]); + next(); + }; + req.onerror = onFailure("Getting array"); + }, + function() { + let req = navigator.mozSettings.createLock().set({"test3": {foo: "bar", baz: {number: 1, arr: [storedBlob]}}}); + req.onsuccess = next(); + req.onerror = onFailure("Saving object"); + }, + function() { + let req = navigator.mozSettings.createLock().get("test3"); + req.onsuccess = function(event) { + let val = event.target.result["test3"]; + ok(typeof(val) == "object", "Result is an object"); + ok("foo" in val && typeof(val.foo) == "string", "String property preserved"); + ok("baz" in val && typeof(val.baz) == "object", "Object property preserved"); + let baz = val.baz; + ok("number" in baz && baz.number == 1, "Primite inside object preserved"); + ok("arr" in baz && Array.isArray(baz.arr), "Array inside object is preserved"); + checkBlob(baz.arr[0]); + next(); + }; + req.onerror = onFailure("Getting object"); + }, + function() { + let req = navigator.mozSettings.createLock().clear(); + req.onsuccess = function() { + next(); + }; + req.onerror = onFailure("Deleting database"); + }, + function () { + ok(true, "all done!\n"); + SimpleTest.finish(); + } +]; + +function next() { + try { + let step = steps.shift(); + if (step) { + step(); + } + } catch(ex) { + ok(false, "Caught exception", ex); + } +} + +SimpleTest.waitForExplicitFinish(); +addLoadEvent(next); +</script> +</pre> +</body> +</html> |