summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js')
-rw-r--r--toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js118
1 files changed, 105 insertions, 13 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js b/toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js
index e7dd1e99c6..b8fa021a1c 100644
--- a/toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_cookieBehaviors.js
@@ -61,17 +61,34 @@ function assertCookiesForHost(url, cookiesCount, message) {
// Test that the indexedDB and localStorage are allowed in an extension page
// and that the indexedDB is allowed in a extension worker.
add_task(async function test_ext_page_allowed_storage() {
- function testWebStorages() {
+ async function testWebStorages() {
const url = window.location.href;
try {
// In a webpage accessing indexedDB throws on cookiesBehavior reject,
// here we verify that doesn't happen for an extension page.
+
+ await new Promise((resolve, reject) => {
+ const begin = indexedDB.open("door");
+ begin.onsuccess = resolve;
+ begin.onerror = err => reject(err.target);
+ });
+
+ const dbs = await indexedDB.databases();
browser.test.assertTrue(
- indexedDB,
- "IndexedDB global should be accessible"
+ dbs.some(elem => elem.name === "door"),
+ "Just created database should be found"
);
+ await new Promise((resolve, reject) => {
+ const end = indexedDB.deleteDatabase("door");
+ end.onsuccess = () => {
+ browser.test.log(`IndexedDB is accessible`);
+ resolve();
+ };
+ end.onerror = reject;
+ });
+
// In a webpage localStorage is undefined on cookiesBehavior reject,
// here we verify that doesn't happen for an extension page.
browser.test.assertTrue(
@@ -97,9 +114,23 @@ add_task(async function test_ext_page_allowed_storage() {
}
function testWorker() {
- this.onmessage = () => {
+ this.onmessage = async () => {
try {
void indexedDB;
+ await new Promise((resolve, reject) => {
+ const begin = indexedDB.open("door");
+ begin.onerror = err => reject(err.target);
+ begin.onsuccess = () => {
+ indexedDB
+ .databases()
+ .then(() => {
+ const end = indexedDB.deleteDatabase("door");
+ end.onerror = err => reject(err.target);
+ end.onsuccess = resolve;
+ })
+ .catch(reject);
+ };
+ });
postMessage({ pass: true });
} catch (err) {
postMessage({ pass: false });
@@ -448,9 +479,43 @@ add_task(
let extFrame = this.content.document.querySelector("iframe#ext");
let webFrame = this.content.document.querySelector("iframe#web");
- function testIDB(win) {
+ async function testIDB(win) {
try {
- void win.indexedDB;
+ if (!win.indexedDB) {
+ Assert.ok(false, "IndexedDB global should be accessible");
+ return;
+ }
+
+ await new Promise((resolve, reject) => {
+ const req = win.indexedDB.open("door");
+ req.onerror = err => {
+ reject(err.target);
+ Assert.ok(
+ false,
+ "IDB open should be accessible: " + err.target.message
+ );
+ };
+ req.onsuccess = resolve;
+ });
+
+ const dbs = await win.indexedDB.databases();
+ Assert.ok(
+ dbs.some(elem => elem.name === "door"),
+ "Just created database should be found"
+ );
+
+ await new Promise((resolve, reject) => {
+ const req = win.indexedDB.deleteDatabase("door");
+ req.onerror = err => {
+ reject(err.target);
+ Assert.ok(
+ false,
+ "IDB deleteDatabase should be accessible: " + err.target.message
+ );
+ };
+ req.onsuccess = resolve;
+ });
+
return { success: true };
} catch (err) {
return { error: `${err}` };
@@ -467,10 +532,10 @@ add_task(
}
return {
- extTopLevel: testIDB(this.content),
+ extTopLevel: await testIDB(this.content),
// TODO bug 1762638: Execute the following in their own tasks.
- extSubFrame: testIDB(extFrame.contentWindow),
- webSubFrame: testIDB(webFrame.contentWindow),
+ extSubFrame: await testIDB(extFrame.contentWindow),
+ webSubFrame: await testIDB(webFrame.contentWindow),
webServiceWorker: await testServiceWorker(webFrame.contentWindow),
};
});
@@ -485,9 +550,30 @@ add_task(
return new Promise(resolve => {
let frame = this.content.document.createElement("iframe");
frame.setAttribute("src", `moz-extension://${uuid}/subframe.html`);
- frame.onload = () => {
+ frame.onload = async () => {
try {
- void frame.contentWindow.indexedDB;
+ if (!frame.contentWindow.indexedDB) {
+ throw Error("IndexedDB global should be accessible");
+ }
+ const indexedDB = frame.contentWindow.indexedDB;
+
+ await new Promise((success, failure) => {
+ const begin = indexedDB.open("door");
+ begin.onsuccess = success;
+ begin.onerror = err => failure(err.target);
+ });
+
+ const dbs = await indexedDB.databases();
+ if (!dbs.some(elem => elem.name === "door")) {
+ throw Error("Just created database should be found");
+ }
+
+ await new Promise((success, failure) => {
+ const end = indexedDB.deleteDatabase("door");
+ end.onsuccess = success;
+ end.onerror = err => failure(err.target);
+ });
+
resolve({ success: true });
} catch (err) {
resolve({ error: `${err}` });
@@ -512,7 +598,7 @@ add_task(
Assert.deepEqual(
results.webSubFrame,
- { error: "SecurityError: The operation is insecure." },
+ { error: "SecurityError: IDBFactory.open: The operation is insecure" },
"IndexedDB not allowed in a subframe webpage with a top level extension page"
);
Assert.deepEqual(
@@ -544,8 +630,14 @@ add_task(async function test_content_script_on_cookieBehaviorReject() {
function contentScript() {
// Ensure that when the current cookieBehavior doesn't allow a webpage to use indexedDB
// or localStorage, then a WebExtension content script is not allowed to use it as well.
+ browser.test.assertTrue(indexedDB, "IndexedDB handle should be accessible");
+
browser.test.assertThrows(
- () => indexedDB,
+ () => {
+ indexedDB.open("door").onsuccess = () => {
+ browser.test.fail(`Unreached function`);
+ };
+ },
/The operation is insecure/,
"a content script can't use indexedDB from a page where it is disallowed"
);