summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/general
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/tests/mochitest/general/frameStoragePrevented.html4
-rw-r--r--dom/tests/mochitest/general/storagePermissionsUtils.js133
-rw-r--r--dom/tests/mochitest/general/test_interfaces.js5
-rw-r--r--dom/tests/mochitest/general/test_storagePermissionsReject.html2
-rw-r--r--dom/tests/mochitest/general/window_storagePermissions.html2
-rw-r--r--dom/tests/mochitest/general/workerStorageAllowed.js131
-rw-r--r--dom/tests/mochitest/general/workerStoragePrevented.js114
7 files changed, 304 insertions, 87 deletions
diff --git a/dom/tests/mochitest/general/frameStoragePrevented.html b/dom/tests/mochitest/general/frameStoragePrevented.html
index 693beff5a4..baa74b1773 100644
--- a/dom/tests/mochitest/general/frameStoragePrevented.html
+++ b/dom/tests/mochitest/general/frameStoragePrevented.html
@@ -17,7 +17,7 @@
return new Promise((resolve, reject) => {
var w;
try {
- w = new Worker("workerStoragePrevented.js");
+ w = new Worker("workerStoragePrevented.js#outer");
} catch (e) {
ok(true, "Running workers was prevented");
resolve();
@@ -35,7 +35,7 @@
}
// Try to run a worker, which shouldn't be able to access storage
- await runWorker("workerStoragePrevented.js");
+ await runWorker("workerStoragePrevented.js#outer");
});
</script>
diff --git a/dom/tests/mochitest/general/storagePermissionsUtils.js b/dom/tests/mochitest/general/storagePermissionsUtils.js
index cfab2f0a14..b17adab6b4 100644
--- a/dom/tests/mochitest/general/storagePermissionsUtils.js
+++ b/dom/tests/mochitest/general/storagePermissionsUtils.js
@@ -38,7 +38,11 @@ function runIFrame(url) {
return;
}
- ok(!e.data.match(/^FAILURE/), e.data + " (IFRAME = " + url + ")");
+ const isFail = e.data.match(/^FAILURE/);
+ ok(!isFail, e.data + " (IFRAME = " + url + ")");
+ if (isFail) {
+ reject(e);
+ }
}
window.addEventListener("message", onMessage);
@@ -57,6 +61,11 @@ function runWorker(url) {
ok(!e.data.match(/^FAILURE/), e.data + " (WORKER = " + url + ")");
});
+
+ worker.addEventListener("error", function (e) {
+ ok(false, e.data + " (WORKER = " + url + ")");
+ reject(e);
+ });
});
}
@@ -130,24 +139,59 @@ function storageAllowed() {
ok(false, "getting indexedDB should not throw");
}
+ const dbName = "db";
+
try {
var promise = caches.keys();
ok(true, "getting caches didn't throw");
return new Promise((resolve, reject) => {
- promise.then(
- function () {
- ok(location.protocol == "https:", "The promise was not rejected");
- resolve();
- },
- function () {
- ok(
- location.protocol !== "https:",
- "The promise should not have been rejected"
- );
- resolve();
- }
- );
+ const checkCacheKeys = () => {
+ promise.then(
+ () => {
+ ok(location.protocol == "https:", "The promise was not rejected");
+ resolve();
+ },
+ () => {
+ ok(
+ location.protocol !== "https:",
+ "The promise should not have been rejected"
+ );
+ resolve();
+ }
+ );
+ };
+
+ const checkDeleteDbAndTheRest = dbs => {
+ ok(
+ dbs.some(elem => elem.name === dbName),
+ "Expected database should be found"
+ );
+
+ const end = indexedDB.deleteDatabase(dbName);
+ end.onsuccess = checkCacheKeys;
+ end.onerror = err => {
+ ok(false, "querying indexedDB databases should not throw");
+ reject(err);
+ };
+ };
+
+ const checkDatabasesAndTheRest = () => {
+ indexedDB
+ .databases()
+ .then(checkDeleteDbAndTheRest)
+ .catch(err => {
+ ok(false, "deleting an indexedDB database should not throw");
+ reject(err);
+ });
+ };
+
+ const begin = indexedDB.open(dbName);
+ begin.onsuccess = checkDatabasesAndTheRest;
+ begin.onerror = err => {
+ ok(false, "opening an indexedDB database should not throw");
+ reject(err);
+ };
});
} catch (e) {
ok(location.protocol !== "https:", "getting caches should not have thrown");
@@ -184,9 +228,47 @@ function storagePrevented() {
try {
indexedDB;
- ok(false, "getting indexedDB should have thrown");
+ ok(true, "getting indexedDB didn't throw");
} catch (e) {
- ok(true, "getting indexedDB threw");
+ ok(false, "getting indexedDB should not have thrown");
+ }
+
+ const dbName = "album";
+
+ try {
+ indexedDB.open(dbName);
+ ok(false, "opening an indexedDB database didn't throw");
+ } catch (e) {
+ ok(true, "opening an indexedDB database threw");
+ ok(
+ e.name == "SecurityError",
+ "opening indexedDB database emitted a security error"
+ );
+ }
+
+ // Note: Security error is expected to be thrown synchronously.
+ indexedDB.databases().then(
+ () => {
+ ok(false, "querying indexedDB databases didn't reject");
+ },
+ e => {
+ ok(true, "querying indexedDB databases rejected");
+ ok(
+ e.name == "SecurityError",
+ "querying indexedDB databases emitted a security error"
+ );
+ }
+ );
+
+ try {
+ indexedDB.deleteDatabase(dbName);
+ ok(false, "deleting an indexedDB database didn't throw");
+ } catch (e) {
+ ok(true, "deleting an indexedDB database threw");
+ ok(
+ e.name == "SecurityError",
+ "deleting indexedDB database emitted a security error"
+ );
}
try {
@@ -260,8 +342,15 @@ async function runTestInWindow(test) {
};
});
- await new Promise(resolve => {
+ return new Promise((resolve, reject) => {
onmessage = e => {
+ if (!e.data.type) {
+ w.postMessage("FAILURE: " + e.data, document.referrer);
+ ok(false, "No error data type");
+ reject(e);
+ return;
+ }
+
if (e.data.type == "finish") {
w.close();
resolve();
@@ -269,7 +358,15 @@ async function runTestInWindow(test) {
}
if (e.data.type == "check") {
- ok(e.data.test, e.data.msg);
+ const payload = e.data.msg ? e.data.msg : e.data;
+ ok(e.data.test, payload);
+ const isFail = payload.match(/^FAILURE/) || !e.data.test;
+ if (isFail) {
+ w.postMessage("FAILURE: " + e.data, document.referrer);
+ ok(false, payload);
+ w.close();
+ reject(e);
+ }
return;
}
diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js
index e6ea910e14..93a26b9238 100644
--- a/dom/tests/mochitest/general/test_interfaces.js
+++ b/dom/tests/mochitest/general/test_interfaces.js
@@ -73,6 +73,7 @@ let wasmGlobalInterfaces = [
{ name: "Function", insecureContext: true, nightly: true },
{ name: "Exception", insecureContext: true },
{ name: "Tag", insecureContext: true },
+ { name: "JSTag", insecureContext: true, earlyBetaOrEarlier: true },
{ name: "compile", insecureContext: true },
{ name: "compileStreaming", insecureContext: true },
{ name: "instantiate", insecureContext: true },
@@ -256,7 +257,7 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ClipboardEvent", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
- { name: "ClipboardItem", earlyBetaOrEarlier: true },
+ { name: "ClipboardItem" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "CloseEvent", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
@@ -328,7 +329,7 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "CSSRuleList", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
- { name: "CSSStartingStyleRule", insecureContext: true, disabled: true },
+ { name: "CSSStartingStyleRule", insecureContext: true, nightly: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "CSSStyleDeclaration", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
diff --git a/dom/tests/mochitest/general/test_storagePermissionsReject.html b/dom/tests/mochitest/general/test_storagePermissionsReject.html
index 70dbe856d9..62c06a0639 100644
--- a/dom/tests/mochitest/general/test_storagePermissionsReject.html
+++ b/dom/tests/mochitest/general/test_storagePermissionsReject.html
@@ -35,7 +35,7 @@ task(async function() {
await runIFrame(thirdparty + "frameStorageChrome.html?allowed=no&blockSessionStorage=yes");
// Workers should be unable to access storage
- await runWorker("workerStoragePrevented.js");
+ await runWorker("workerStoragePrevented.js#outer");
});
});
diff --git a/dom/tests/mochitest/general/window_storagePermissions.html b/dom/tests/mochitest/general/window_storagePermissions.html
index 3bab23c13b..92078f2fcc 100644
--- a/dom/tests/mochitest/general/window_storagePermissions.html
+++ b/dom/tests/mochitest/general/window_storagePermissions.html
@@ -25,6 +25,8 @@ onmessage = e => {
let runnable = eval(runnableStr); // eslint-disable-line no-eval
runnable.call(this).then(_ => {
opener.postMessage({ type: "finish" }, "*");
+ }).catch(e => {
+ ok(false, e.data);
});
return;
diff --git a/dom/tests/mochitest/general/workerStorageAllowed.js b/dom/tests/mochitest/general/workerStorageAllowed.js
index 89e0a4b9ce..93c4c94c48 100644
--- a/dom/tests/mochitest/general/workerStorageAllowed.js
+++ b/dom/tests/mochitest/general/workerStorageAllowed.js
@@ -14,50 +14,88 @@ function finishTest() {
self.close();
}
-// Workers don't have access to localstorage or sessionstorage
-ok(typeof self.localStorage == "undefined", "localStorage should be undefined");
-ok(
- typeof self.sessionStorage == "undefined",
- "sessionStorage should be undefined"
-);
-
// Make sure that we can access indexedDB
-try {
- indexedDB;
- ok(true, "WORKER getting indexedDB didn't throw");
-} catch (e) {
- ok(false, "WORKER getting indexedDB should not throw");
+function idbTest() {
+ try {
+ indexedDB;
+
+ const idbcycle = new Promise((resolve, reject) => {
+ const begin = indexedDB.open("door");
+ begin.onerror = e => {
+ reject(e);
+ };
+ begin.onsuccess = () => {
+ indexedDB
+ .databases()
+ .then(dbs => {
+ ok(
+ dbs.some(elem => elem.name === "door"),
+ "WORKER just created database should be found"
+ );
+ const end = indexedDB.deleteDatabase("door");
+ end.onerror = e => {
+ reject(e);
+ };
+ end.onsuccess = () => {
+ resolve();
+ };
+ })
+ .catch(err => {
+ reject(err);
+ });
+ };
+ });
+
+ idbcycle.then(
+ () => {
+ ok(true, "WORKER getting indexedDB didn't throw");
+ cacheTest();
+ },
+ e => {
+ ok(false, "WORKER getting indexedDB threw " + e.message);
+ cacheTest();
+ }
+ );
+ } catch (e) {
+ ok(false, "WORKER getting indexedDB should not throw");
+ cacheTest();
+ }
}
// Make sure that we can access caches
-try {
- var promise = caches.keys();
- ok(true, "WORKER getting caches didn't throw");
+function cacheTest() {
+ try {
+ var promise = caches.keys();
+ ok(true, "WORKER getting caches didn't throw");
- promise.then(
- function () {
- ok(location.protocol == "https:", "WORKER The promise was not rejected");
- workerTest();
- },
- function () {
- ok(
- location.protocol !== "https:",
- "WORKER The promise should not have been rejected"
- );
- workerTest();
- }
- );
-} catch (e) {
- ok(
- location.protocol !== "https:",
- "WORKER getting caches should not have thrown"
- );
- workerTest();
+ promise.then(
+ function () {
+ ok(
+ location.protocol == "https:",
+ "WORKER The promise was not rejected"
+ );
+ workerTest();
+ },
+ function () {
+ ok(
+ location.protocol !== "https:",
+ "WORKER The promise should not have been rejected"
+ );
+ workerTest();
+ }
+ );
+ } catch (e) {
+ ok(
+ location.protocol !== "https:",
+ "WORKER getting caches should not have thrown"
+ );
+ workerTest();
+ }
}
// Try to spawn an inner worker, and make sure that it can also access storage
function workerTest() {
- if (location.hash == "#inner") {
+ if (location.hash != "#outer") {
// Don't recurse infinitely, if we are the inner worker, don't spawn another
finishTest();
return;
@@ -75,4 +113,27 @@ function workerTest() {
e.data + " (WORKER = workerStorageAllowed.js#inner)"
);
});
+
+ worker.addEventListener("error", function (e) {
+ ok(false, e.data + " (WORKER = workerStorageAllowed.js#inner)");
+
+ finishTest();
+ });
+}
+
+try {
+ // Workers don't have access to localstorage or sessionstorage
+ ok(
+ typeof self.localStorage == "undefined",
+ "localStorage should be undefined"
+ );
+ ok(
+ typeof self.sessionStorage == "undefined",
+ "sessionStorage should be undefined"
+ );
+
+ idbTest();
+} catch (e) {
+ ok(false, "WORKER Unwelcome exception received");
+ finishTest();
}
diff --git a/dom/tests/mochitest/general/workerStoragePrevented.js b/dom/tests/mochitest/general/workerStoragePrevented.js
index 467cc09113..7d232d65df 100644
--- a/dom/tests/mochitest/general/workerStoragePrevented.js
+++ b/dom/tests/mochitest/general/workerStoragePrevented.js
@@ -21,40 +21,94 @@ ok(
"sessionStorage should be undefined"
);
-// Make sure that we can't access indexedDB
+// Make sure that we can access indexedDB handle
try {
indexedDB;
- ok(false, "WORKER getting indexedDB should have thrown");
+ ok(true, "WORKER getting indexedDB didn't throw");
} catch (e) {
- ok(true, "WORKER getting indexedDB threw");
+ ok(false, "WORKER getting indexedDB threw");
+}
+
+// Make sure that we cannot access indexedDB methods
+idbOpenTest();
+
+// Make sure that we can't access indexedDB deleteDatabase
+function idbDeleteTest() {
+ try {
+ indexedDB.deleteDatabase("door");
+ ok(false, "WORKER deleting indexedDB database succeeded");
+ } catch (e) {
+ ok(true, "WORKER deleting indexedDB database failed");
+ ok(
+ e.name == "SecurityError",
+ "WORKER deleting indexedDB database threw a security error"
+ );
+ } finally {
+ cacheTest();
+ }
+}
+
+// Make sure that we can't access indexedDB databases
+function idbDatabasesTest() {
+ indexedDB
+ .databases()
+ .then(() => {
+ ok(false, "WORKER querying indexedDB databases succeeded");
+ })
+ .catch(e => {
+ ok(true, "WORKER querying indexedDB databases failed");
+ ok(
+ e.name == "SecurityError",
+ "WORKER querying indexedDB databases threw a security error"
+ );
+ })
+ .finally(idbDeleteTest);
+}
+
+// Make sure that we can't access indexedDB open
+function idbOpenTest() {
+ try {
+ indexedDB.open("door");
+ ok(false, "WORKER opening indexedDB database succeeded");
+ } catch (e) {
+ ok(true, "WORKER opening indexedDB database failed");
+ ok(
+ e.name == "SecurityError",
+ "WORKER opening indexedDB database threw a security error"
+ );
+ } finally {
+ idbDatabasesTest();
+ }
}
// Make sure that we can't access caches
-try {
- var promise = caches.keys();
- ok(true, "WORKER getting caches didn't throw");
+function cacheTest() {
+ try {
+ var promise = caches.keys();
+ ok(true, "WORKER getting caches didn't throw");
- promise.then(
- function () {
- ok(false, "WORKER The promise should have rejected");
- workerTest();
- },
- function () {
- ok(true, "WORKER The promise was rejected");
- workerTest();
- }
- );
-} catch (e) {
- ok(
- location.protocol !== "https:",
- "WORKER getting caches should not have thrown"
- );
- workerTest();
+ promise.then(
+ function () {
+ ok(false, "WORKER The promise should have rejected");
+ workerTest();
+ },
+ function () {
+ ok(true, "WORKER The promise was rejected");
+ workerTest();
+ }
+ );
+ } catch (e) {
+ ok(
+ location.protocol !== "https:",
+ "WORKER getting caches should not have thrown"
+ );
+ workerTest();
+ }
}
// Try to spawn an inner worker, and make sure that it also can't access storage
function workerTest() {
- if (location.hash == "#inner") {
+ if (location.hash != "#outer") {
// Don't recurse infinitely, if we are the inner worker, don't spawn another
finishTest();
return;
@@ -62,14 +116,16 @@ function workerTest() {
// Create the inner worker, and listen for test messages from it
var worker = new Worker("workerStoragePrevented.js#inner");
worker.addEventListener("message", function (e) {
- if (e.data == "done") {
+ const isFail = e.data.match(/^FAILURE/);
+ ok(!isFail, e.data + " (WORKER = workerStoragePrevented.js#inner)");
+
+ if (e.data == "done" || isFail) {
finishTest();
- return;
}
+ });
+ worker.addEventListener("error", function (e) {
+ ok(false, e.data + " (WORKER = workerStoragePrevented.js#inner)");
- ok(
- !e.data.match(/^FAILURE/),
- e.data + " (WORKER = workerStoragePrevented.js#inner)"
- );
+ finishTest();
});
}