diff options
Diffstat (limited to 'dom/base/test')
51 files changed, 439 insertions, 1170 deletions
diff --git a/dom/base/test/browser.toml b/dom/base/test/browser.toml index 1deeb88d89..a68bd2e873 100644 --- a/dom/base/test/browser.toml +++ b/dom/base/test/browser.toml @@ -109,6 +109,16 @@ skip-if = [ ] support-files = ["browser_multiple_popups.html"] +["browser_object_attachment.js"] +support-files = [ + "file_img_object_attachment.html", + "file_img_attachment.jpg", + "file_img_attachment.jpg^headers^", + "file_pdf_object_attachment.html", + "file_pdf_attachment.pdf", + "file_pdf_attachment.pdf^headers^", +] + ["browser_outline_refocus.js"] ["browser_page_load_event_telemetry.js"] diff --git a/dom/base/test/browser_object_attachment.js b/dom/base/test/browser_object_attachment.js new file mode 100644 index 0000000000..b4432862f0 --- /dev/null +++ b/dom/base/test/browser_object_attachment.js @@ -0,0 +1,168 @@ +ChromeUtils.defineESModuleGetters(this, { + Downloads: "resource://gre/modules/Downloads.sys.mjs", +}); + +const httpsTestRoot = getRootDirectory(gTestPath).replace( + "chrome://mochitests/content", + "https://example.com" +); + +add_task(async function test_pdf_object_attachment() { + await SpecialPowers.pushPrefEnv({ + set: [["dom.navigation.object_embed.allow_retargeting", false]], + }); + + await BrowserTestUtils.withNewTab( + `${httpsTestRoot}/file_pdf_object_attachment.html`, + async browser => { + is( + browser.browsingContext.children.length, + 1, + "Should have a child frame" + ); + await SpecialPowers.spawn(browser, [], async () => { + let obj = content.document.querySelector("object"); + is( + obj.displayedType, + Ci.nsIObjectLoadingContent.TYPE_DOCUMENT, + "should be displaying TYPE_DOCUMENT" + ); + }); + } + ); +}); + +add_task(async function test_img_object_attachment() { + await SpecialPowers.pushPrefEnv({ + set: [["dom.navigation.object_embed.allow_retargeting", false]], + }); + + await BrowserTestUtils.withNewTab( + `${httpsTestRoot}/file_img_object_attachment.html`, + async browser => { + is( + browser.browsingContext.children.length, + 1, + "Should have a child frame" + ); + await SpecialPowers.spawn(browser, [], async () => { + let obj = content.document.querySelector("object"); + is( + obj.displayedType, + Ci.nsIObjectLoadingContent.TYPE_DOCUMENT, + "should be displaying TYPE_DOCUMENT" + ); + }); + } + ); +}); + +async function waitForDownload() { + // Get the downloads list and add a view to listen for a download to be added. + let downloadList = await Downloads.getList(Downloads.ALL); + + // Wait for a single download + let downloadView; + let finishedAllDownloads = new Promise(resolve => { + downloadView = { + onDownloadAdded(aDownload) { + info("download added"); + resolve(aDownload); + }, + }; + }); + await downloadList.addView(downloadView); + let download = await finishedAllDownloads; + await downloadList.removeView(downloadView); + + // Clean up the download from the list. + await downloadList.remove(download); + await download.finalize(true); + + // Return the download + return download; +} + +add_task(async function test_pdf_object_attachment_download() { + await SpecialPowers.pushPrefEnv({ + set: [["dom.navigation.object_embed.allow_retargeting", true]], + }); + + // Set the behaviour to save pdfs to disk and not handle internally, so we + // don't end up with extra tabs after the test. + var gMimeSvc = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService); + var gHandlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService( + Ci.nsIHandlerService + ); + const mimeInfo = gMimeSvc.getFromTypeAndExtension("application/pdf", "pdf"); + let previousAction = mimeInfo.preferredAction; + mimeInfo.preferredAction = Ci.nsIHandlerInfo.saveToDisk; + gHandlerSvc.store(mimeInfo); + registerCleanupFunction(() => { + mimeInfo.preferredAction = previousAction; + gHandlerSvc.store(mimeInfo); + }); + + // Start listening for the download before opening the new tab. + let downloadPromise = waitForDownload(); + await BrowserTestUtils.withNewTab( + `${httpsTestRoot}/file_pdf_object_attachment.html`, + async browser => { + let download = await downloadPromise; + is( + download.source.url, + `${httpsTestRoot}/file_pdf_attachment.pdf`, + "download should be the pdf" + ); + + await SpecialPowers.spawn(browser, [], async () => { + let obj = content.document.querySelector("object"); + is( + obj.displayedType, + Ci.nsIObjectLoadingContent.TYPE_FALLBACK, + "should be displaying TYPE_FALLBACK" + ); + }); + } + ); +}); + +add_task(async function test_img_object_attachment_download() { + // NOTE: This is testing our current behaviour here as of bug 1868001 (which + // is to download an image with `Content-Disposition: attachment` embedded + // within an object or embed element). + // + // Other browsers ignore the `Content-Disposition: attachment` header when + // loading images within object or embed element as-of december 2023, as + // we did prior to the changes in bug 1595491. + // + // If this turns out to be a web-compat issue, we may want to introduce + // special handling to ignore content-disposition when loading images within + // an object or embed element. + await SpecialPowers.pushPrefEnv({ + set: [["dom.navigation.object_embed.allow_retargeting", true]], + }); + + // Start listening for the download before opening the new tab. + let downloadPromise = waitForDownload(); + await BrowserTestUtils.withNewTab( + `${httpsTestRoot}/file_img_object_attachment.html`, + async browser => { + let download = await downloadPromise; + is( + download.source.url, + `${httpsTestRoot}/file_img_attachment.jpg`, + "download should be the jpg" + ); + + await SpecialPowers.spawn(browser, [], async () => { + let obj = content.document.querySelector("object"); + is( + obj.displayedType, + Ci.nsIObjectLoadingContent.TYPE_FALLBACK, + "should be displaying TYPE_FALLBACK" + ); + }); + } + ); +}); diff --git a/dom/base/test/chrome.toml b/dom/base/test/chrome.toml index 687d778cac..ec736a086c 100644 --- a/dom/base/test/chrome.toml +++ b/dom/base/test/chrome.toml @@ -1,6 +1,5 @@ [DEFAULT] skip-if = ["os == 'android'"] -prefs = ["dom.domrequest.enabled=true"] support-files = [ "file_empty.html", "file_blocking_image.html", @@ -38,8 +37,6 @@ support-files = [ ["test_bug1120222.html"] -["test_domrequesthelper.xhtml"] - ["test_fragment_sanitization.xhtml"] ["test_getLastOverWindowPointerLocationInCSSPixels.html"] diff --git a/dom/base/test/chrome/bug418986-1.js b/dom/base/test/chrome/bug418986-1.js index 7c39df0c13..e7e3c63b5c 100644 --- a/dom/base/test/chrome/bug418986-1.js +++ b/dom/base/test/chrome/bug418986-1.js @@ -1,4 +1,7 @@ /* globals chromeWindow */ + +/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ + // The main test function. var test = function (isContent) { SimpleTest.waitForExplicitFinish(); diff --git a/dom/base/test/chrome/chrome.toml b/dom/base/test/chrome/chrome.toml index b8439a2d2e..08265bcb97 100644 --- a/dom/base/test/chrome/chrome.toml +++ b/dom/base/test/chrome/chrome.toml @@ -18,7 +18,6 @@ support-files = [ "custom_element_ep.js", "window_nsITextInputProcessor.xhtml", "title_window.xhtml", - "window_swapFrameLoaders.xhtml", ] prefs = ["gfx.font_rendering.fallback.async=false"] @@ -126,9 +125,6 @@ support-files = ["../dummy.html"] ["test_range_getClientRectsAndTexts.html"] -["test_swapFrameLoaders.xhtml"] -skip-if = ["os == 'mac'"] # bug 1674413 - ["test_title.xhtml"] support-files = ["file_title.xhtml"] diff --git a/dom/base/test/chrome/file_bug549682.xhtml b/dom/base/test/chrome/file_bug549682.xhtml index 8ae05d38d8..0bb3080507 100644 --- a/dom/base/test/chrome/file_bug549682.xhtml +++ b/dom/base/test/chrome/file_bug549682.xhtml @@ -28,11 +28,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=549682 } var asyncPPML = false; - function ppmASL(m) { + function ppmASL() { asyncPPML = true; } var syncPPML = false; - function ppmSL(m) { + function ppmSL() { syncPPML = true; } ppm.addMessageListener("processmessageAsync", ppmASL); @@ -42,7 +42,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=549682 cpm.sendSyncMessage("processmessageSync", ""); var asyncCPML = false; - function cpmASL(m) { + function cpmASL() { asyncCPML = true; } cpm.addMessageListener("childprocessmessage", cpmASL); @@ -93,7 +93,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=549682 var weakListener = { QueryInterface: ChromeUtils.generateQI(["nsISupportsWeakReference"]), - receiveMessage(msg) { + receiveMessage() { if (weakMessageReceived) { ok(false, 'Weak listener fired twice.'); return; @@ -109,7 +109,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=549682 var weakListener2 = { QueryInterface: ChromeUtils.generateQI(["nsISupportsWeakReference"]), - receiveMessage(msg) { + receiveMessage() { ok(false, 'Should not have received a message.'); } }; diff --git a/dom/base/test/chrome/file_bug616841.xhtml b/dom/base/test/chrome/file_bug616841.xhtml index b0512d162c..3651a00226 100644 --- a/dom/base/test/chrome/file_bug616841.xhtml +++ b/dom/base/test/chrome/file_bug616841.xhtml @@ -27,7 +27,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=616841 [ "D", "\u010C" ] ]; var nCmps = 0; - function recvContentReady(m) { + function recvContentReady() { for (var i = 0; i < toCompare.length; ++i) { var pair = toCompare[i]; messageManager.broadcastAsyncMessage("cmp", diff --git a/dom/base/test/chrome/test_bug1339722.html b/dom/base/test/chrome/test_bug1339722.html index d8d95f1faa..7655ff95fa 100644 --- a/dom/base/test/chrome/test_bug1339722.html +++ b/dom/base/test/chrome/test_bug1339722.html @@ -29,7 +29,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1339722 // behave similarly. const TOPIC = "document-on-modify-request"; let win; - const observe = (subject, topic, data) => { + const observe = (subject, topic) => { info("Got " + topic); Services.obs.removeObserver(observe, TOPIC); @@ -58,7 +58,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1339722 // Remove the iframe to cause frameloader destroy. iframe.remove(); - setTimeout($ => { + setTimeout(() => { ok(!document.getElementById("testFrame"), "verify iframe removed"); SimpleTest.finish(); }, 0); diff --git a/dom/base/test/chrome/test_bug339494.xhtml b/dom/base/test/chrome/test_bug339494.xhtml index 203f6e644d..afab41b65c 100644 --- a/dom/base/test/chrome/test_bug339494.xhtml +++ b/dom/base/test/chrome/test_bug339494.xhtml @@ -55,7 +55,7 @@ SimpleTest.waitForExplicitFinish(); s.setAttribute("ggg", "testvalue"); await promiseFlushingMutationObserver(); - const observer = new MutationObserver((aMutationList, aObserver) => { + const observer = new MutationObserver(() => { ok(s.hasAttribute("ggg"), "Value check 3. There should be a value"); isnot(s.getAttribute("ggg"), "testvalue", "Value check 4"); is(s.getAttribute("ggg"), "othervalue", "Value check 5"); diff --git a/dom/base/test/chrome/test_bug429785.xhtml b/dom/base/test/chrome/test_bug429785.xhtml index fb51634fab..10c9977ccb 100644 --- a/dom/base/test/chrome/test_bug429785.xhtml +++ b/dom/base/test/chrome/test_bug429785.xhtml @@ -21,7 +21,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=429785 var errorLogged = false; var listener = { QueryInterface: ChromeUtils.generateQI(["nsIConsoleListener"]), - observe(msg) { errorLogged = true; } + observe() { errorLogged = true; } }; function step2() { diff --git a/dom/base/test/chrome/test_bug430050.xhtml b/dom/base/test/chrome/test_bug430050.xhtml index d7d6cf656c..dfe1e3c8ee 100644 --- a/dom/base/test/chrome/test_bug430050.xhtml +++ b/dom/base/test/chrome/test_bug430050.xhtml @@ -27,7 +27,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=430050 } function startTest() { - const observer = new MutationObserver((aMutationList, aObserver) => { + const observer = new MutationObserver(() => { document.getElementById('b').setAttribute("src", "data:text/plain,failed"); const systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); diff --git a/dom/base/test/chrome/test_chromeOuterWindowID.xhtml b/dom/base/test/chrome/test_chromeOuterWindowID.xhtml index 1feb7c7c74..3aa482b636 100644 --- a/dom/base/test/chrome/test_chromeOuterWindowID.xhtml +++ b/dom/base/test/chrome/test_chromeOuterWindowID.xhtml @@ -42,7 +42,7 @@ windows. "Both browsers should belong to the same document."); let winID = getOuterWindowID(browser1.ownerGlobal); - let getChildRootOuterId = browser => { + let getChildRootOuterId = () => { try { return docShell.browserChild?.chromeOuterWindowID; } catch(ex) { } diff --git a/dom/base/test/chrome/test_swapFrameLoaders.xhtml b/dom/base/test/chrome/test_swapFrameLoaders.xhtml deleted file mode 100644 index 4ea11a1a62..0000000000 --- a/dom/base/test/chrome/test_swapFrameLoaders.xhtml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/css" href="chrome://global/skin"?> -<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> -<!-- -https://bugzilla.mozilla.org/show_bug.cgi?id=1242644 -Test swapFrameLoaders with different frame types and remoteness ---> -<window title="Mozilla Bug 1242644" - xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> - <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> - - <!-- test results are displayed in the html:body --> - <body xmlns="http://www.w3.org/1999/xhtml"> - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1242644" - target="_blank">Mozilla Bug 1242644</a> - </body> - - <!-- test code goes here --> - <script type="application/javascript"><![CDATA[ - SimpleTest.waitForExplicitFinish(); - - window.openDialog("window_swapFrameLoaders.xhtml", "bug1242644", - "chrome,width=600,height=600,noopener", window); - ]]></script> -</window> diff --git a/dom/base/test/chrome/title_window.xhtml b/dom/base/test/chrome/title_window.xhtml index f48cdaaaf1..5f9840c36c 100644 --- a/dom/base/test/chrome/title_window.xhtml +++ b/dom/base/test/chrome/title_window.xhtml @@ -63,10 +63,10 @@ } } - function listener2(ev) { + function listener2() { inProgressDoc[description] = false; } - function listener3(ev) { + function listener3() { inProgressWin[description] = false; } frame.addEventListener("DOMTitleChanged", listener); diff --git a/dom/base/test/chrome/window_nsITextInputProcessor.xhtml b/dom/base/test/chrome/window_nsITextInputProcessor.xhtml index c8ce6ee5e7..c62ba2ce47 100644 --- a/dom/base/test/chrome/window_nsITextInputProcessor.xhtml +++ b/dom/base/test/chrome/window_nsITextInputProcessor.xhtml @@ -4120,7 +4120,7 @@ function runUnloadTests1() let oldSrc = iframe.src; let parentWindow = window; - iframe.addEventListener("load", function (aEvent) { + iframe.addEventListener("load", function () { ok(true, description + "dummy page is loaded"); childWindow = iframe.contentWindow; textareaInFrame = null; @@ -4181,7 +4181,7 @@ function runUnloadTests2() let oldSrc = iframe.src; - iframe.addEventListener("load", function (aEvent) { + iframe.addEventListener("load", function () { ok(true, description + "dummy page is loaded"); childWindow = iframe.contentWindow; textareaInFrame = null; diff --git a/dom/base/test/chrome/window_swapFrameLoaders.xhtml b/dom/base/test/chrome/window_swapFrameLoaders.xhtml deleted file mode 100644 index 4a38bcc1fc..0000000000 --- a/dom/base/test/chrome/window_swapFrameLoaders.xhtml +++ /dev/null @@ -1,223 +0,0 @@ -<?xml version="1.0"?> -<?xml-stylesheet type="text/css" href="chrome://global/skin"?> -<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> -<!-- -https://bugzilla.mozilla.org/show_bug.cgi?id=1242644 -Test swapFrameLoaders with different frame types and remoteness ---> -<window title="Mozilla Bug 1242644" - xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> - - <script type="application/javascript"><![CDATA[ - ["SimpleTest", "SpecialPowers", "info", "is", "ok", "add_task"].forEach(key => { - window[key] = window.arguments[0][key]; - }) - - const NS = { - xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", - html: "http://www.w3.org/1999/xhtml", - } - - const TAG = { - xul: "browser", - html: "iframe", // mozbrowser - } - - const SCENARIOS = [ - ["xul", "xul"], - ["xul", "html"], - ["html", "xul"], - ["html", "html"], - ["xul", "xul", { remote: true }], - ["xul", "html", { remote: true }], - ["html", "xul", { remote: true }], - ["html", "html", { remote: true }], - ["xul", "html", { userContextId: 2 }], - ["xul", "html", { userContextId: 2, remote: true }], - ]; - - const HEIGHTS = [ - 200, - 400 - ]; - - function frameScript() { - /* eslint-env mozilla/frame-script */ - addEventListener("load", function onLoad() { - sendAsyncMessage("test:load"); - }, true); - } - - // Watch for loads in new frames - window.messageManager.loadFrameScript(`data:,(${frameScript})();`, true); - - function once(target, eventName, useCapture = false) { - info("Waiting for event: '" + eventName + "' on " + target + "."); - - return new Promise(resolve => { - for (let [add, remove] of [ - ["addEventListener", "removeEventListener"], - ["addMessageListener", "removeMessageListener"], - ]) { - if ((add in target) && (remove in target)) { - target[add](eventName, function onEvent(...aArgs) { - info("Got event: '" + eventName + "' on " + target + "."); - target[remove](eventName, onEvent, useCapture); - resolve(aArgs); - }, useCapture); - break; - } - } - }); - } - - async function addFrame(type, options, height) { - let remote = options && options.remote; - let userContextId = options && options.userContextId; - let frame = document.createElementNS(NS[type], TAG[type]); - frame.setAttribute("remote", remote); - if (remote && type == "xul") { - frame.setAttribute("style", "-moz-binding: none;"); - } - if (userContextId) { - frame.setAttribute("usercontextid", userContextId); - } - if (type == "html") { - frame.setAttribute("mozbrowser", "true"); - frame.setAttribute("noisolation", "true"); - frame.setAttribute("allowfullscreen", "true"); - } else if (type == "xul") { - frame.setAttribute("type", "content"); - } - let src = `data:text/html,<!doctype html>` + - `<body style="height:${height}px"/>`; - frame.setAttribute("src", src); - document.documentElement.appendChild(frame); - let mm = frame.frameLoader.messageManager; - await once(mm, "test:load"); - return frame; - } - - add_task(async function() { - for (let scenario of SCENARIOS) { - let [ typeA, typeB, options ] = scenario; - let heightA = HEIGHTS[0]; - info(`Adding frame A, type ${typeA}, options ${JSON.stringify(options)}, height ${heightA}`); - let frameA = await addFrame(typeA, options, heightA); - - let heightB = HEIGHTS[1]; - info(`Adding frame B, type ${typeB}, options ${JSON.stringify(options)}, height ${heightB}`); - let frameB = await addFrame(typeB, options, heightB); - - let frameScriptFactory = function(name) { - /* eslint-env mozilla/frame-script */ - return `function() { - addMessageListener("ping", function() { - sendAsyncMessage("pong", "${name}"); - }); - addMessageListener("check-browser-api", function() { - let exists = "api" in this; - sendAsyncMessage("check-browser-api", { - exists, - running: exists && !this.api._shuttingDown, - }); - }); - addEventListener("pagehide", function({ inFrameSwap }) { - sendAsyncMessage("pagehide", inFrameSwap); - }, {mozSystemGroup: true}); - }`; - } - - // Load frame script into each frame - { - let mmA = frameA.frameLoader.messageManager; - let mmB = frameB.frameLoader.messageManager; - - mmA.loadFrameScript("data:,(" + frameScriptFactory("A") + ")()", false); - mmB.loadFrameScript("data:,(" + frameScriptFactory("B") + ")()", false); - } - - // Ping before swap - { - let mmA = frameA.frameLoader.messageManager; - let mmB = frameB.frameLoader.messageManager; - - let inflightA = once(mmA, "pong"); - let inflightB = once(mmB, "pong"); - - info("Ping message manager for frame A"); - mmA.sendAsyncMessage("ping"); - let [ { data: pongA } ] = await inflightA; - is(pongA, "A", "Frame A message manager gets reply A before swap"); - - info("Ping message manager for frame B"); - mmB.sendAsyncMessage("ping"); - let [ { data: pongB } ] = await inflightB; - is(pongB, "B", "Frame B message manager gets reply B before swap"); - } - - // Ping after swap using message managers acquired before - { - let mmA = frameA.frameLoader.messageManager; - let mmB = frameB.frameLoader.messageManager; - - let pagehideA = once(mmA, "pagehide"); - let pagehideB = once(mmB, "pagehide"); - - info("swapFrameLoaders"); - frameA.swapFrameLoaders(frameB); - - let [ { data: inFrameSwapA } ] = await pagehideA; - ok(inFrameSwapA, "Frame A got pagehide with inFrameSwap: true"); - let [ { data: inFrameSwapB } ] = await pagehideB; - ok(inFrameSwapB, "Frame B got pagehide with inFrameSwap: true"); - - let inflightA = once(mmA, "pong"); - let inflightB = once(mmB, "pong"); - - info("Ping message manager for frame A"); - mmA.sendAsyncMessage("ping"); - let [ { data: pongA } ] = await inflightA; - is(pongA, "B", "Frame A message manager acquired before swap gets reply B after swap"); - - info("Ping message manager for frame B"); - mmB.sendAsyncMessage("ping"); - let [ { data: pongB } ] = await inflightB; - is(pongB, "A", "Frame B message manager acquired before swap gets reply A after swap"); - } - - // Check height after swap - if (frameA.getContentDimensions) { - let { height } = await frameA.getContentDimensions(); - is(height, heightB, "Frame A's content height is 400px after swap"); - } - if (frameB.getContentDimensions) { - let { height } = await frameB.getContentDimensions(); - is(height, heightA, "Frame B's content height is 200px after swap"); - } - - // Ping after swap using message managers acquired after - { - let mmA = frameA.frameLoader.messageManager; - let mmB = frameB.frameLoader.messageManager; - - let inflightA = once(mmA, "pong"); - let inflightB = once(mmB, "pong"); - - info("Ping message manager for frame A"); - mmA.sendAsyncMessage("ping"); - let [ { data: pongA } ] = await inflightA; - is(pongA, "B", "Frame A message manager acquired after swap gets reply B after swap"); - - info("Ping message manager for frame B"); - mmB.sendAsyncMessage("ping"); - let [ { data: pongB } ] = await inflightB; - is(pongB, "A", "Frame B message manager acquired after swap gets reply A after swap"); - } - - frameA.remove(); - frameB.remove(); - } - }); - ]]></script> -</window> diff --git a/dom/base/test/common_postMessages.js b/dom/base/test/common_postMessages.js index c4836fdd77..044f3e7f34 100644 --- a/dom/base/test/common_postMessages.js +++ b/dom/base/test/common_postMessages.js @@ -1,3 +1,5 @@ +/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ + function getType(a) { if (a === null || a === undefined) { return "null"; diff --git a/dom/base/test/file_bug1008126_worker.js b/dom/base/test/file_bug1008126_worker.js index aaba278de5..4e418d777e 100644 --- a/dom/base/test/file_bug1008126_worker.js +++ b/dom/base/test/file_bug1008126_worker.js @@ -3,6 +3,8 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ +/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ + var gEntry1 = "data_1.txt"; var gEntry2 = "data_2.txt"; var gEntry3 = "data_big.txt"; diff --git a/dom/base/test/file_bug945152_worker.js b/dom/base/test/file_bug945152_worker.js index 9664045b6d..c0feebf0d6 100644 --- a/dom/base/test/file_bug945152_worker.js +++ b/dom/base/test/file_bug945152_worker.js @@ -1,3 +1,4 @@ +/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ var gData1 = "TEST_DATA_1:ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var gData2 = "TEST_DATA_2:1234567890"; var gPaddingChar = "."; diff --git a/dom/base/test/file_focus_shadow_dom.html b/dom/base/test/file_focus_shadow_dom.html index 6fa9d1b88e..7a0a0da729 100644 --- a/dom/base/test/file_focus_shadow_dom.html +++ b/dom/base/test/file_focus_shadow_dom.html @@ -79,10 +79,16 @@ opener.is(lastFocusTarget, shadowDate, "Should have focused date element in shadow DOM. (3)"); synthesizeKey("KEY_Tab"); opener.is(lastFocusTarget, shadowDate, "Should have focused date element with a calendar button in shadow DOM. (3)"); - synthesizeKey("KEY_Tab"); - opener.is(shadowIframe.contentDocument.activeElement, - shadowIframe.contentDocument.documentElement, - "Should have focused document element in shadow iframe. (3)"); + + let canTabMoveFocusToRootElement = + !SpecialPowers.getBoolPref("dom.disable_tab_focus_to_root_element"); + if (canTabMoveFocusToRootElement) { + synthesizeKey("KEY_Tab"); + opener.is(shadowIframe.contentDocument.activeElement, + shadowIframe.contentDocument.documentElement, + "Should have focused document element in shadow iframe. (3)"); + } + synthesizeKey("KEY_Tab"); opener.is(shadowIframe.contentDocument.activeElement, shadowIframe.contentDocument.body.firstChild, @@ -99,10 +105,12 @@ opener.is(shadowIframe.contentDocument.activeElement, shadowIframe.contentDocument.body.firstChild, "Should have focused input element in shadow iframe. (4)"); - synthesizeKey("KEY_Tab", {shiftKey: true}); - opener.is(shadowIframe.contentDocument.activeElement, - shadowIframe.contentDocument.documentElement, - "Should have focused document element in shadow iframe. (4)"); + if (canTabMoveFocusToRootElement) { + synthesizeKey("KEY_Tab", {shiftKey: true}); + opener.is(shadowIframe.contentDocument.activeElement, + shadowIframe.contentDocument.documentElement, + "Should have focused document element in shadow iframe. (4)"); + } synthesizeKey("KEY_Tab", {shiftKey: true}); opener.is(lastFocusTarget, shadowDate, "Should have focused date element with a calendar button in shadow DOM. (4)"); synthesizeKey("KEY_Tab", {shiftKey: true}); diff --git a/dom/base/test/file_img_attachment.jpg b/dom/base/test/file_img_attachment.jpg Binary files differnew file mode 100644 index 0000000000..dcd99b9670 --- /dev/null +++ b/dom/base/test/file_img_attachment.jpg diff --git a/dom/base/test/file_img_attachment.jpg^headers^ b/dom/base/test/file_img_attachment.jpg^headers^ new file mode 100644 index 0000000000..71ed8e7805 --- /dev/null +++ b/dom/base/test/file_img_attachment.jpg^headers^ @@ -0,0 +1 @@ +Content-Disposition: attachment diff --git a/dom/base/test/file_img_object_attachment.html b/dom/base/test/file_img_object_attachment.html new file mode 100644 index 0000000000..502894041e --- /dev/null +++ b/dom/base/test/file_img_object_attachment.html @@ -0,0 +1,6 @@ +<!DOCTYPE html> +<html> + <body> + <object data="file_img_attachment.jpg" type="image/jpeg" width="100%" height="600">fallback</object> + </body> +</html> diff --git a/dom/base/test/file_pdf_attachment.pdf b/dom/base/test/file_pdf_attachment.pdf Binary files differnew file mode 100644 index 0000000000..89066463f1 --- /dev/null +++ b/dom/base/test/file_pdf_attachment.pdf diff --git a/dom/base/test/file_pdf_attachment.pdf^headers^ b/dom/base/test/file_pdf_attachment.pdf^headers^ new file mode 100644 index 0000000000..562009a8de --- /dev/null +++ b/dom/base/test/file_pdf_attachment.pdf^headers^ @@ -0,0 +1,2 @@ +Content-Type: application/octet-stream +Content-Disposition: attachment diff --git a/dom/base/test/file_pdf_object_attachment.html b/dom/base/test/file_pdf_object_attachment.html new file mode 100644 index 0000000000..d87eff9923 --- /dev/null +++ b/dom/base/test/file_pdf_object_attachment.html @@ -0,0 +1,6 @@ +<!DOCTYPE html> +<html> + <body> + <object data="file_pdf_attachment.pdf" type="application/pdf" width="100%" height="600">fallback</object> + </body> +</html> diff --git a/dom/base/test/fullscreen/MozDomFullscreen_chrome.xhtml b/dom/base/test/fullscreen/MozDomFullscreen_chrome.xhtml index 93f00311e7..bc92abf3e0 100644 --- a/dom/base/test/fullscreen/MozDomFullscreen_chrome.xhtml +++ b/dom/base/test/fullscreen/MozDomFullscreen_chrome.xhtml @@ -79,7 +79,7 @@ function thirdEntry(event) { gOuterDoc.exitFullscreen(); } -function earlyExit(event) { +function earlyExit() { ok(false, "MozDOMFullscreen:Exited should only be triggered after cancel all fullscreen"); } diff --git a/dom/base/test/fullscreen/browser_fullscreen-navigation-history-race.js b/dom/base/test/fullscreen/browser_fullscreen-navigation-history-race.js index 2ea2b9ee40..49a48c3177 100644 --- a/dom/base/test/fullscreen/browser_fullscreen-navigation-history-race.js +++ b/dom/base/test/fullscreen/browser_fullscreen-navigation-history-race.js @@ -82,7 +82,7 @@ function preventBFCache(aBrowsingContext, aPrevent) { let target = content.document.getElementById("div"); target.addEventListener( "mousedown", - function (e) { + function () { content.window.history.back(); }, { once: true } diff --git a/dom/base/test/fullscreen/browser_fullscreen-tab-close-race.js b/dom/base/test/fullscreen/browser_fullscreen-tab-close-race.js index 10d10a0b0f..1338c4a550 100644 --- a/dom/base/test/fullscreen/browser_fullscreen-tab-close-race.js +++ b/dom/base/test/fullscreen/browser_fullscreen-tab-close-race.js @@ -70,7 +70,7 @@ async function WaitRemoveDocumentAndCloseTab(aBrowser, aBrowsingContext) { return new Promise(resolve => { content.document.addEventListener( "fullscreenchange", - e => { + () => { resolve(); }, { once: true } diff --git a/dom/base/test/fullscreen/file_fullscreen-api.html b/dom/base/test/fullscreen/file_fullscreen-api.html index 645e6ece46..9661b10de9 100644 --- a/dom/base/test/fullscreen/file_fullscreen-api.html +++ b/dom/base/test/fullscreen/file_fullscreen-api.html @@ -112,7 +112,7 @@ function enter2(event) { promise = document.exitFullscreen(); } -function exit2(event) { +function exit2() { is(document.fullscreenElement, null, "Full-screen element should have rolled back."); is(iframe.contentDocument.fullscreenElement, null, @@ -156,7 +156,7 @@ function exit3(event) { promise = outOfDocElement.requestFullscreen(); } -function error1(event) { +function error1() { ok(!document.fullscreenElement, "Requests for full-screen from not-in-doc elements should fail."); assertPromiseRejected(promise, "in error1"); @@ -181,7 +181,7 @@ function enter4(event) { "Should not have a full-screen element again."); } -async function exit_to_arg_test_1(event) { +async function exit_to_arg_test_1() { ok(!document.fullscreenElement, "Should have left full-screen mode (third time)."); addFullscreenChangeContinuation("enter", enter_from_arg_test_1); @@ -196,14 +196,14 @@ async function exit_to_arg_test_1(event) { ok(!threw, "requestFullscreen with bogus arg (123) shouldn't throw exception"); } -function enter_from_arg_test_1(event) { +function enter_from_arg_test_1() { ok(document.fullscreenElement, "Should have entered full-screen after calling with bogus (ignored) argument (fourth time)"); addFullscreenChangeContinuation("exit", exit_to_arg_test_2); document.exitFullscreen(); } -async function exit_to_arg_test_2(event) { +async function exit_to_arg_test_2() { ok(!document.fullscreenElement, "Should have left full-screen mode (fourth time)."); addFullscreenChangeContinuation("enter", enter_from_arg_test_2); @@ -218,14 +218,14 @@ async function exit_to_arg_test_2(event) { ok(!threw, "requestFullscreen with { vrDisplay: null } shouldn't throw exception"); } -function enter_from_arg_test_2(event) { +function enter_from_arg_test_2() { ok(document.fullscreenElement, "Should have entered full-screen after calling with vrDisplay null argument (fifth time)"); addFullscreenChangeContinuation("exit", exit4); document.exitFullscreen(); } -function exit4(event) { +function exit4() { ok(!document.fullscreenElement, "Should be back in non-full-screen mode (fifth time)"); SpecialPowers.pushPrefEnv({"set":[["full-screen-api.allow-trusted-requests-only", true]]}, function() { @@ -234,7 +234,7 @@ function exit4(event) { }); } -function error2(event) { +function error2() { ok(!document.fullscreenElement, "Should still be in normal mode, because calling context isn't trusted."); button = document.createElement("button"); @@ -246,13 +246,13 @@ function error2(event) { sendMouseClick(button); } -function enter5(event) { +function enter5() { ok(document.fullscreenElement, "Moved to full-screen after mouse click"); addFullscreenChangeContinuation("exit", exit5); document.exitFullscreen(); } -function exit5(event) { +function exit5() { ok(!document.fullscreenElement, "Should have left full-screen mode (last time)."); SpecialPowers.pushPrefEnv({ @@ -264,7 +264,7 @@ function exit5(event) { }); } -function error3(event) { +function error3() { ok(!document.fullscreenElement, "Should still be in normal mode, because pref is not enabled."); diff --git a/dom/base/test/fullscreen/file_fullscreen-bug-1798219-2.html b/dom/base/test/fullscreen/file_fullscreen-bug-1798219-2.html index 61db80c228..48f2dea09d 100644 --- a/dom/base/test/fullscreen/file_fullscreen-bug-1798219-2.html +++ b/dom/base/test/fullscreen/file_fullscreen-bug-1798219-2.html @@ -2,7 +2,7 @@ <button>Launch</button> <script> let button = document.querySelector("button"); -button.addEventListener("click", function(e) { +button.addEventListener("click", function() { let newWindow = window.open("", "", "newWindow"); newWindow.document.write(`<!DOCTYPE HTML> <button>click me!</button> diff --git a/dom/base/test/fullscreen/file_fullscreen-bug-1798219.html b/dom/base/test/fullscreen/file_fullscreen-bug-1798219.html index 7490f12936..beafd79661 100644 --- a/dom/base/test/fullscreen/file_fullscreen-bug-1798219.html +++ b/dom/base/test/fullscreen/file_fullscreen-bug-1798219.html @@ -2,7 +2,7 @@ <button>click me!</button> <script> let button = document.querySelector("button"); -button.addEventListener("click", function(e) { +button.addEventListener("click", function() { document.documentElement.requestFullscreen(); setTimeout(() => { while(true) { diff --git a/dom/base/test/fullscreen/file_fullscreen-denied.html b/dom/base/test/fullscreen/file_fullscreen-denied.html index db9a69e71a..fe4244ec7f 100644 --- a/dom/base/test/fullscreen/file_fullscreen-denied.html +++ b/dom/base/test/fullscreen/file_fullscreen-denied.html @@ -137,7 +137,7 @@ function requestFullscreenMouseBtn(event, button) { synthesizeMouseAtCenter(clickEl, { button }); } -async function testFullscreenMouseBtn(event, button, next) { +async function testFullscreenMouseBtn() { await SpecialPowers.pushPrefEnv({ "set": [["full-screen-api.mouse-event-allow-left-button-only", true]] }); diff --git a/dom/base/test/fullscreen/file_fullscreen-esc-exit-inner.html b/dom/base/test/fullscreen/file_fullscreen-esc-exit-inner.html index d7d8a90aaf..210b2af1b6 100644 --- a/dom/base/test/fullscreen/file_fullscreen-esc-exit-inner.html +++ b/dom/base/test/fullscreen/file_fullscreen-esc-exit-inner.html @@ -33,7 +33,7 @@ function is(a, b, msg) { var escKeyReceived = false; var escKeySent = false; -function keyHandler(event) { +function keyHandler() { if (escKeyReceived == KeyboardEvent.DOM_VK_ESC) { escKeyReceived = true; } diff --git a/dom/base/test/fullscreen/file_fullscreen-esc-exit.html b/dom/base/test/fullscreen/file_fullscreen-esc-exit.html index f65f930b3f..1e2252f1ab 100644 --- a/dom/base/test/fullscreen/file_fullscreen-esc-exit.html +++ b/dom/base/test/fullscreen/file_fullscreen-esc-exit.html @@ -34,14 +34,14 @@ function finish() { opener.nextTest(); } -function fullscreenchange1(event) { +function fullscreenchange1() { is(document.fullscreenElement, document.body, "FSE should be doc"); addFullscreenChangeContinuation("exit", fullscreenchange2); ok(!document.getElementById("subdoc").contentWindow.escKeySent, "Should not yet have sent ESC key press."); document.getElementById("subdoc").contentWindow.startTest(); } -function fullscreenchange2(event) { +function fullscreenchange2() { ok(document.getElementById("subdoc").contentWindow.escKeySent, "Should have sent ESC key press."); ok(!document.getElementById("subdoc").contentWindow.escKeyReceived, "ESC key press to exit should not be delivered."); ok(!document.fullscreenElement, "Should have left full-screen mode on ESC key press"); diff --git a/dom/base/test/fullscreen/file_fullscreen-shadowdom.html b/dom/base/test/fullscreen/file_fullscreen-shadowdom.html index 348e08ae87..1972e1457e 100644 --- a/dom/base/test/fullscreen/file_fullscreen-shadowdom.html +++ b/dom/base/test/fullscreen/file_fullscreen-shadowdom.html @@ -29,7 +29,7 @@ var elem = shadowRoot.firstChild; var gotFullscreenEvent = false; - document.addEventListener("fullscreenchange", function (e) { + document.addEventListener("fullscreenchange", function () { if (document.fullscreenElement === host) { is(shadowRoot.fullscreenElement, elem, "Expected element entered fullsceen"); diff --git a/dom/base/test/fullscreen/file_fullscreen-svg-element.html b/dom/base/test/fullscreen/file_fullscreen-svg-element.html index 1dfc78aa1c..d03a13ee84 100644 --- a/dom/base/test/fullscreen/file_fullscreen-svg-element.html +++ b/dom/base/test/fullscreen/file_fullscreen-svg-element.html @@ -32,7 +32,7 @@ var elem = document.getElementById("svg-elem") , elemWasLocked = false; - document.addEventListener("fullscreenchange", function (e) { + document.addEventListener("fullscreenchange", function () { if (document.fullscreenElement === elem) { elemWasLocked = true; document.exitFullscreen(); diff --git a/dom/base/test/fullscreen/fullscreen.xhtml b/dom/base/test/fullscreen/fullscreen.xhtml index 2cc95642b6..76986db540 100644 --- a/dom/base/test/fullscreen/fullscreen.xhtml +++ b/dom/base/test/fullscreen/fullscreen.xhtml @@ -11,7 +11,7 @@ window.addEventListener("fullscreen", onFullScreen, true); -function onFullScreen(event) +function onFullScreen() { window.arguments[0].done(window.fullScreen); } diff --git a/dom/base/test/fullscreen/fullscreen_helpers.js b/dom/base/test/fullscreen/fullscreen_helpers.js index 6e78015cd8..f097ae316e 100644 --- a/dom/base/test/fullscreen/fullscreen_helpers.js +++ b/dom/base/test/fullscreen/fullscreen_helpers.js @@ -83,7 +83,7 @@ function waitWidgetFullscreenEvent( aIsInFullscreen, aWaitUntil = false ) { - return BrowserTestUtils.waitForEvent(aWindow, "fullscreen", false, aEvent => { + return BrowserTestUtils.waitForEvent(aWindow, "fullscreen", false, () => { if ( aWaitUntil && aIsInFullscreen != @@ -106,7 +106,7 @@ function waitForFullScreenObserver( aIsInFullscreen, aWaitUntil = false ) { - return TestUtils.topicObserved("fullscreen-painted", (subject, data) => { + return TestUtils.topicObserved("fullscreen-painted", () => { if ( aWaitUntil && aIsInFullscreen != diff --git a/dom/base/test/fullscreen/test_fullscreen-api.html b/dom/base/test/fullscreen/test_fullscreen-api.html index 2a59d6eeb0..ef07a5f97f 100644 --- a/dom/base/test/fullscreen/test_fullscreen-api.html +++ b/dom/base/test/fullscreen/test_fullscreen-api.html @@ -111,7 +111,7 @@ function runNextTest() { // otherwise, the fullscreen request might be denied. if (testWindow.document.hidden) { info("Waiting for document to unhide"); - waitForEvent(testWindow.document, "visibilitychange", (event) => { + waitForEvent(testWindow.document, "visibilitychange", () => { return !testWindow.document.hidden; }, testWindow.begin); return; diff --git a/dom/base/test/fullscreen/test_fullscreen_modal.html b/dom/base/test/fullscreen/test_fullscreen_modal.html index 78e70d9052..fef4e3867d 100644 --- a/dom/base/test/fullscreen/test_fullscreen_modal.html +++ b/dom/base/test/fullscreen/test_fullscreen_modal.html @@ -21,7 +21,7 @@ const button = document.querySelector("button"); let clickCount = 0; let lastFullscreenPromise = null; let shouldEnterFullscreen = false; -button.addEventListener("click", function(e) { +button.addEventListener("click", function() { clickCount++; if (shouldEnterFullscreen) { const fullscreenElement = document.getElementById("fullscreen"); @@ -58,6 +58,15 @@ async function testFullscreenIsModal(modal) { ok(document.fullscreenElement.matches(":fullscreen"), "Fullscreen element matches :fullscreen"); is(document.fullscreenElement.matches(":modal"), modal, "Fullscreen element matches :modal"); + // Before exiting fullscreen, wait on the document becoming active, + // which signifies that the fullscreen request has been completely + // processed. It is important that the fullscreen request is all + // the way done, or the exit fullscreen request could be dropped. + let documentWrapper = SpecialPowers.wrap(document); + await SimpleTest.promiseWaitForCondition(() => documentWrapper.isActive(), + "Timed out waiting for document to become active."); + ok(documentWrapper.isActive(), "Document is active."); + await document.exitFullscreen(); clickButton(/* expectEvent = */ true); } diff --git a/dom/base/test/gtest/TestMimeType.cpp b/dom/base/test/gtest/TestMimeType.cpp index fecb3f8678..40916130a8 100644 --- a/dom/base/test/gtest/TestMimeType.cpp +++ b/dom/base/test/gtest/TestMimeType.cpp @@ -9,12 +9,10 @@ #include "MimeType.h" #include "nsString.h" -using mozilla::UniquePtr; - TEST(MimeType, EmptyString) { const auto in = u""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Empty string"; } @@ -22,7 +20,7 @@ TEST(MimeType, EmptyString) TEST(MimeType, JustWhitespace) { const auto in = u" \t\r\n "_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Just whitespace"; } @@ -30,7 +28,7 @@ TEST(MimeType, JustWhitespace) TEST(MimeType, JustBackslash) { const auto in = u"\\"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Just backslash"; } @@ -38,7 +36,7 @@ TEST(MimeType, JustBackslash) TEST(MimeType, JustForwardslash) { const auto in = u"/"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Just forward slash"; } @@ -46,7 +44,7 @@ TEST(MimeType, JustForwardslash) TEST(MimeType, MissingType1) { const auto in = u"/bogus"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Missing type #1"; } @@ -54,7 +52,7 @@ TEST(MimeType, MissingType1) TEST(MimeType, MissingType2) { const auto in = u" \r\n\t/bogus"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Missing type #2"; } @@ -62,7 +60,7 @@ TEST(MimeType, MissingType2) TEST(MimeType, MissingSubtype1) { const auto in = u"bogus"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Missing subtype #1"; } @@ -70,7 +68,7 @@ TEST(MimeType, MissingSubtype1) TEST(MimeType, MissingSubType2) { const auto in = u"bogus/"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Missing subtype #2"; } @@ -78,7 +76,7 @@ TEST(MimeType, MissingSubType2) TEST(MimeType, MissingSubType3) { const auto in = u"bogus;"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Missing subtype #3"; } @@ -86,7 +84,7 @@ TEST(MimeType, MissingSubType3) TEST(MimeType, MissingSubType4) { const auto in = u"bogus; \r\n\t"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Missing subtype #3"; } @@ -94,7 +92,7 @@ TEST(MimeType, MissingSubType4) TEST(MimeType, ExtraForwardSlash) { const auto in = u"bogus/bogus/;"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Extra forward slash"; } @@ -102,7 +100,7 @@ TEST(MimeType, ExtraForwardSlash) TEST(MimeType, WhitespaceInType) { const auto in = u"t\re\nx\tt /html"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Type with whitespace"; } @@ -110,7 +108,7 @@ TEST(MimeType, WhitespaceInType) TEST(MimeType, WhitespaceInSubtype) { const auto in = u"text/ h\rt\nm\tl"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Subtype with whitespace"; } @@ -118,7 +116,7 @@ TEST(MimeType, WhitespaceInSubtype) TEST(MimeType, NonAlphanumericMediaType1) { const auto in = u"</>"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-alphanumeric media type #1"; } @@ -126,7 +124,7 @@ TEST(MimeType, NonAlphanumericMediaType1) TEST(MimeType, NonAlphanumericMediaType2) { const auto in = u"(/)"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-alphanumeric media type #2"; } @@ -134,7 +132,7 @@ TEST(MimeType, NonAlphanumericMediaType2) TEST(MimeType, NonAlphanumericMediaType3) { const auto in = u"{/}"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-alphanumeric media type #3"; } @@ -142,7 +140,7 @@ TEST(MimeType, NonAlphanumericMediaType3) TEST(MimeType, NonAlphanumericMediaType4) { const auto in = u"\"/\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-alphanumeric media type #4"; } @@ -150,7 +148,7 @@ TEST(MimeType, NonAlphanumericMediaType4) TEST(MimeType, NonAlphanumericMediaType5) { const auto in = u"\0/\0"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-alphanumeric media type #5"; } @@ -158,7 +156,7 @@ TEST(MimeType, NonAlphanumericMediaType5) TEST(MimeType, NonAlphanumericMediaType6) { const auto in = u"text/html(;doesnot=matter"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-alphanumeric media type #6"; } @@ -166,7 +164,7 @@ TEST(MimeType, NonAlphanumericMediaType6) TEST(MimeType, NonLatin1MediaType1) { const auto in = u"ÿ/ÿ"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-latin1 media type #1"; } @@ -174,7 +172,7 @@ TEST(MimeType, NonLatin1MediaType1) TEST(MimeType, NonLatin1MediaType2) { const auto in = u"\x0100/\x0100"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_FALSE(parsed) << "Non-latin1 media type #2"; } @@ -182,7 +180,7 @@ TEST(MimeType, NonLatin1MediaType2) TEST(MimeType, MultipleParameters) { const auto in = u"text/html;charset=gbk;no=1;charset_=gbk_;yes=2"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsString out; @@ -194,7 +192,7 @@ TEST(MimeType, MultipleParameters) TEST(MimeType, DuplicateParameter1) { const auto in = u"text/html;charset=gbk;charset=windows-1255"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsString out; @@ -206,7 +204,7 @@ TEST(MimeType, DuplicateParameter1) TEST(MimeType, DuplicateParameter2) { const auto in = u"text/html;charset=();charset=GBK"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsString out; @@ -218,7 +216,7 @@ TEST(MimeType, DuplicateParameter2) TEST(MimeType, CString) { const auto in = "text/html;charset=();charset=GBK"_ns; - UniquePtr<CMimeType> parsed = CMimeType::Parse(in); + RefPtr<CMimeType> parsed = CMimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsCString out; @@ -234,7 +232,7 @@ TEST(MimeType, CString) TEST(MimeType, NonAlphanumericParametersAreQuoted) { const auto in = u"text/html;test=\x00FF\\;charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsString out; @@ -249,7 +247,7 @@ TEST(MimeType, NonAlphanumericParametersAreQuoted) TEST(MimeType, ParameterQuotedIfHasLeadingWhitespace1) { const auto in = u"text/html;charset= g\\\"bk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -261,7 +259,7 @@ TEST(MimeType, ParameterQuotedIfHasLeadingWhitespace1) TEST(MimeType, ParameterQuotedIfHasLeadingWhitespace2) { const auto in = u"text/html;charset= \"g\\bk\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -273,7 +271,7 @@ TEST(MimeType, ParameterQuotedIfHasLeadingWhitespace2) TEST(MimeType, ParameterQuotedIfHasInternalWhitespace) { const auto in = u"text/html;charset=g \\b\"k"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -285,7 +283,7 @@ TEST(MimeType, ParameterQuotedIfHasInternalWhitespace) TEST(MimeType, ImproperlyQuotedParameter1) { const auto in = u"x/x;test=\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -297,7 +295,7 @@ TEST(MimeType, ImproperlyQuotedParameter1) TEST(MimeType, ImproperlyQuotedParameter2) { const auto in = u"x/x;test=\"\\"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -309,7 +307,7 @@ TEST(MimeType, ImproperlyQuotedParameter2) TEST(MimeType, NonLatin1ParameterIgnored) { const auto in = u"x/x;test=\xFFFD;x=x"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -321,7 +319,7 @@ TEST(MimeType, NonLatin1ParameterIgnored) TEST(MimeType, ParameterIgnoredIfWhitespaceInName1) { const auto in = u"text/html;charset =gbk;charset=123"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -333,7 +331,7 @@ TEST(MimeType, ParameterIgnoredIfWhitespaceInName1) TEST(MimeType, ParameterIgnoredIfWhitespaceInName2) { const auto in = u"text/html;cha rset =gbk;charset=123"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -345,7 +343,7 @@ TEST(MimeType, ParameterIgnoredIfWhitespaceInName2) TEST(MimeType, WhitespaceTrimmed) { const auto in = u"\n\r\t text/plain\n\r\t ;\n\r\t charset=123\n\r\t "_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -357,7 +355,7 @@ TEST(MimeType, WhitespaceTrimmed) TEST(MimeType, WhitespaceOnlyParameterIgnored) { const auto in = u"x/x;x= \r\n\t"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -369,7 +367,7 @@ TEST(MimeType, WhitespaceOnlyParameterIgnored) TEST(MimeType, IncompleteParameterIgnored1) { const auto in = u"x/x;test"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -381,7 +379,7 @@ TEST(MimeType, IncompleteParameterIgnored1) TEST(MimeType, IncompleteParameterIgnored2) { const auto in = u"x/x;test="_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -393,7 +391,7 @@ TEST(MimeType, IncompleteParameterIgnored2) TEST(MimeType, IncompleteParameterIgnored3) { const auto in = u"x/x;test= \r\n\t"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -405,7 +403,7 @@ TEST(MimeType, IncompleteParameterIgnored3) TEST(MimeType, IncompleteParameterIgnored4) { const auto in = u"text/html;test;charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -417,7 +415,7 @@ TEST(MimeType, IncompleteParameterIgnored4) TEST(MimeType, IncompleteParameterIgnored5) { const auto in = u"text/html;test=;charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -429,7 +427,7 @@ TEST(MimeType, IncompleteParameterIgnored5) TEST(MimeType, EmptyParameterIgnored1) { const auto in = u"text/html ; ; charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -441,7 +439,7 @@ TEST(MimeType, EmptyParameterIgnored1) TEST(MimeType, EmptyParameterIgnored2) { const auto in = u"text/html;;;;charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -453,7 +451,7 @@ TEST(MimeType, EmptyParameterIgnored2) TEST(MimeType, InvalidParameterIgnored1) { const auto in = u"text/html;';charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -465,7 +463,7 @@ TEST(MimeType, InvalidParameterIgnored1) TEST(MimeType, InvalidParameterIgnored2) { const auto in = u"text/html;\";charset=gbk;=123; =321"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -477,7 +475,7 @@ TEST(MimeType, InvalidParameterIgnored2) TEST(MimeType, InvalidParameterIgnored3) { const auto in = u"text/html;charset= \"\u007F;charset=GBK"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -490,7 +488,7 @@ TEST(MimeType, InvalidParameterIgnored4) { const auto in = nsLiteralString( u"text/html;charset=\"\u007F;charset=foo\";charset=GBK;charset="); - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -502,7 +500,7 @@ TEST(MimeType, InvalidParameterIgnored4) TEST(MimeType, SingleQuotes1) { const auto in = u"text/html;charset='gbk'"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -514,7 +512,7 @@ TEST(MimeType, SingleQuotes1) TEST(MimeType, SingleQuotes2) { const auto in = u"text/html;charset='gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -526,7 +524,7 @@ TEST(MimeType, SingleQuotes2) TEST(MimeType, SingleQuotes3) { const auto in = u"text/html;charset=gbk'"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -538,7 +536,7 @@ TEST(MimeType, SingleQuotes3) TEST(MimeType, SingleQuotes4) { const auto in = u"text/html;charset=';charset=GBK"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -550,7 +548,7 @@ TEST(MimeType, SingleQuotes4) TEST(MimeType, SingleQuotes5) { const auto in = u"text/html;charset=''';charset=GBK"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -562,7 +560,7 @@ TEST(MimeType, SingleQuotes5) TEST(MimeType, DoubleQuotes1) { const auto in = u"text/html;charset=\"gbk\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -574,7 +572,7 @@ TEST(MimeType, DoubleQuotes1) TEST(MimeType, DoubleQuotes2) { const auto in = u"text/html;charset=\"gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -586,7 +584,7 @@ TEST(MimeType, DoubleQuotes2) TEST(MimeType, DoubleQuotes3) { const auto in = u"text/html;charset=gbk\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -598,7 +596,7 @@ TEST(MimeType, DoubleQuotes3) TEST(MimeType, DoubleQuotes4) { const auto in = u"text/html;charset=\" gbk\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -610,7 +608,7 @@ TEST(MimeType, DoubleQuotes4) TEST(MimeType, DoubleQuotes5) { const auto in = u"text/html;charset=\"gbk \""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -622,7 +620,7 @@ TEST(MimeType, DoubleQuotes5) TEST(MimeType, DoubleQuotes6) { const auto in = u"text/html;charset=\"\\ gbk\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -634,7 +632,7 @@ TEST(MimeType, DoubleQuotes6) TEST(MimeType, DoubleQuotes7) { const auto in = u"text/html;charset=\"\\g\\b\\k\""_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -646,7 +644,7 @@ TEST(MimeType, DoubleQuotes7) TEST(MimeType, DoubleQuotes8) { const auto in = u"text/html;charset=\"gbk\"x"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -658,7 +656,7 @@ TEST(MimeType, DoubleQuotes8) TEST(MimeType, DoubleQuotes9) { const auto in = u"text/html;charset=\"\";charset=GBK"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -670,7 +668,7 @@ TEST(MimeType, DoubleQuotes9) TEST(MimeType, DoubleQuotes10) { const auto in = u"text/html;charset=\";charset=GBK"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -682,7 +680,7 @@ TEST(MimeType, DoubleQuotes10) TEST(MimeType, UnexpectedCodePoints) { const auto in = u"text/html;charset={gbk}"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -699,7 +697,7 @@ TEST(MimeType, LongTypesSubtypesAccepted) "2345678901234567890123456789012345678901234567890123456789/" "012345678901234567890123456789012345678901234567890123456789012345678901" "2345678901234567890123456789012345678901234567890123456789"); - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -716,7 +714,7 @@ TEST(MimeType, LongParametersAccepted) "012345678901234567890123456789012345678901234567890123456789012345678901" "2345678901234567890123456789012345678901234567890123456789=x;charset=" "gbk"); - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -744,7 +742,7 @@ TEST(MimeType, AllValidCharactersAccepted1) u"\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED" u"\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8" u"\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\""); - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -756,7 +754,7 @@ TEST(MimeType, AllValidCharactersAccepted1) TEST(MimeType, CaseNormalization1) { const auto in = u"TEXT/PLAIN;CHARSET=TEST"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -775,7 +773,7 @@ TEST(MimeType, CaseNormalization2) ".^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$" "%&'*+-.^_`|~" "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -794,7 +792,7 @@ TEST(MimeType, CaseNormalization2) TEST(MimeType, LegacyCommentSyntax1) { const auto in = u"text/html;charset=gbk("_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; @@ -806,7 +804,7 @@ TEST(MimeType, LegacyCommentSyntax1) TEST(MimeType, LegacyCommentSyntax2) { const auto in = u"text/html;x=(;charset=gbk"_ns; - UniquePtr<MimeType> parsed = MimeType::Parse(in); + RefPtr<MimeType> parsed = MimeType::Parse(in); ASSERT_TRUE(parsed) << "Parsing succeeded"; nsAutoString out; diff --git a/dom/base/test/meta_viewport/viewport_helpers.js b/dom/base/test/meta_viewport/viewport_helpers.js index d4d346b5d0..cad6613549 100644 --- a/dom/base/test/meta_viewport/viewport_helpers.js +++ b/dom/base/test/meta_viewport/viewport_helpers.js @@ -40,5 +40,6 @@ function getViewportInfo(aDisplayWidth, aDisplayHeight) { } function fuzzeq(a, b, msg) { + // eslint-disable-next-line mozilla/no-comparison-or-assignment-inside-ok ok(Math.abs(a - b) < 1e-6, msg); } diff --git a/dom/base/test/mochitest.toml b/dom/base/test/mochitest.toml index 6415c4b33b..fb6724e497 100644 --- a/dom/base/test/mochitest.toml +++ b/dom/base/test/mochitest.toml @@ -3,7 +3,6 @@ tags = "condprof" prefs = [ "formhelper.autozoom.force-disable.test-only=true", "plugins.rewrite_youtube_embeds=true", - "dom.domrequest.enabled=true", ] support-files = [ "audio.ogg", @@ -1232,8 +1231,6 @@ skip-if = [ ["test_domparsing.html"] -["test_domrequest.html"] - ["test_domwindowutils.html"] skip-if = ["os == 'android'"] # Bug 1525959 @@ -1301,6 +1298,8 @@ skip-if = [ "http2", ] +["test_focus_radio.html"] + ["test_focus_scroll_padding_tab.html"] ["test_focus_scrollable_fieldset.html"] diff --git a/dom/base/test/test_domrequest.html b/dom/base/test/test_domrequest.html deleted file mode 100644 index 1aea26f657..0000000000 --- a/dom/base/test/test_domrequest.html +++ /dev/null @@ -1,233 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <title>Test for DOMRequest</title> - <script src="/tests/SimpleTest/SimpleTest.js"></script> - <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> -</head> -<body> -<p id="display"></p> -<div id="content" style="display: none"> - -</div> -<pre id="test"> -<script class="testbody" type="application/javascript"> -"use strict"; - -var reqserv = SpecialPowers.getDOMRequestService(); -ok("createRequest" in reqserv, "appears to be a service"); - -function testBasics() { - // create a request - var req = reqserv.createRequest(window); - ok("result" in req, "request has result"); - ok("error" in req, "request has error"); - ok("onsuccess" in req, "request has onsuccess"); - ok("onerror" in req, "request has onerror"); - ok("readyState" in req, "request has readyState"); - ok("then" in req, "request has then"); - - is(req.readyState, "pending", "readyState is pending"); - is(req.result, undefined, "result is undefined"); - is(req.onsuccess, null, "onsuccess is null"); - is(req.onerror, null, "onerror is null"); - - runTest(); -} - -function testSuccess() { - // fire success - var req = reqserv.createRequest(window); - var ev = null; - req.onsuccess = function(e) { - ev = e; - } - var result = null; - var promise = req.then(function(r) { - is(r, "my result", "correct result when resolving the promise"); - result = r; - runTest(); - }, function(e) { - ok(false, "promise should not be rejected"); - runTest(); - }); - ok(promise instanceof Promise, "then() should return a Promise"); - reqserv.fireSuccess(req, "my result"); - ok(ev, "got success event"); - is(ev.type, "success", "correct type during success"); - is(ev.target, req, "correct target during success"); - is(req.readyState, "done", "correct readyState after success"); - is(req.error, null, "correct error after success"); - is(req.result, "my result", "correct result after success"); - is(result, null, "Promise should not be resolved synchronously"); -} - -function testError() { - // fire error - var req = reqserv.createRequest(window); - var ev = null; - req.onerror = function(e) { - ev = e; - } - var error = null; - var promise = req.then(function(r) { - ok(false, "promise should not be resolved"); - runTest(); - }, function(e) { - ok(e instanceof DOMException, "got error rejection"); - ok(e === req.error, "got correct error when rejecting the promise"); - error = e; - runTest(); - }); - ok(promise instanceof Promise, "then() should return a Promise"); - reqserv.fireError(req, "OhMyError"); - ok(ev, "got error event"); - is(ev.type, "error", "correct type during error"); - is(ev.target, req, "correct target during error"); - is(req.readyState, "done", "correct readyState after error"); - is(req.error.name, "UnknownError", "correct error type after error"); - is(req.error.message, "OhMyError", "correct error message after error"); - is(req.result, undefined, "correct result after error"); - is(error, null, "Promise should not be rejected synchronously"); -} - -function testDetailedError() { - // fire detailed error - var req = reqserv.createRequest(window); - var ev = null; - req.onerror = function(e) { - ev = e; - }; - var error = null; - var promise = req.then(function(r) { - ok(false, "promise should not be resolved"); - runTest(); - }, function(e) { - ok(e instanceof DOMException, "got error rejection"); - ok(e === req.error, "got correct error when rejecting the promise"); - error = e; - runTest(); - }); - ok(promise instanceof Promise, "then() should return a Promise"); - SpecialPowers.wrwp(req).fireDetailedError(new DOMException("detailedError")); - ok(ev, "got error event"); - is(ev.type, "error", "correct type during error"); - is(ev.target, req, "correct target during error"); - is(req.readyState, "done", "correct readyState after error"); - is(req.error.name, "UnknownError", "correct error type after error"); - is(req.error.message, "detailedError", "correct error message after error"); - is(req.result, undefined, "correct result after error"); - is(error, null, "Promise should not be rejected synchronously"); -} - -function testThenAfterSuccess() { - // fire success - var req = reqserv.createRequest(window); - var ev = null; - req.onsuccess = function(e) { - ev = e; - } - reqserv.fireSuccess(req, "my result"); - ok(ev, "got success event"); - is(ev.type, "success", "correct type during success"); - is(ev.target, req, "correct target during success"); - is(req.readyState, "done", "correct readyState after success"); - is(req.error, null, "correct error after success"); - is(req.result, "my result", "correct result after success"); - var result = null; - var promise = req.then(function(r) { - is(r, "my result", "correct result when resolving the promise"); - result = r; - runTest(); - }, function(e) { - ok(false, "promise should not be rejected"); - runTest(); - }); - ok(promise instanceof Promise, "then() should return a Promise"); - is(result, null, "Promise should not be resolved synchronously"); -} - -function testThenAfterError() { - // fire error - var req = reqserv.createRequest(window); - var ev = null; - req.onerror = function(e) { - ev = e; - } - reqserv.fireError(req, "OhMyError"); - ok(ev, "got error event"); - is(ev.type, "error", "correct type during error"); - is(ev.target, req, "correct target during error"); - is(req.readyState, "done", "correct readyState after error"); - is(req.error.name, "UnknownError", "correct error type after error"); - is(req.error.message, "OhMyError", "correct error message after error"); - is(req.result, undefined, "correct result after error"); - var error = null; - var promise = req.then(function(r) { - ok(false, "promise should not be resolved"); - runTest(); - }, function(e) { - ok(e instanceof DOMException, "got error rejection"); - ok(e === req.error, "got correct error when rejecting the promise"); - error = e; - runTest(); - }); - ok(promise instanceof Promise, "then() should return a Promise"); - is(error, null, "Promise should not be rejected synchronously"); -} - -function testDetailedError() { - // fire detailed error - var req = reqserv.createRequest(window); - var ev = null; - req.onerror = function(e) { - ev = e; - }; - var error = null; - var promise = req.then(function(r) { - ok(false, "promise should not be resolved"); - runTest(); - }, function(e) { - ok(e instanceof DOMException, "got error rejection"); - ok(e === req.error, "got correct error when rejecting the promise"); - error = e; - runTest(); - }); - ok(promise instanceof Promise, "then() should return a Promise"); - SpecialPowers.wrap(req).fireDetailedError(new DOMException("detailedError")); - ok(ev, "got error event"); - is(ev.type, "error", "correct type during error"); - is(ev.target, req, "correct target during error"); - is(req.readyState, "done", "correct readyState after error"); - is(req.error.name, "Error", "correct error type after error"); - is(req.error.message, "detailedError", "correct error message after error"); - is(req.result, undefined, "correct result after error"); - is(error, null, "Promise should not be rejected synchronously"); -} - -var tests = [ - testBasics, - testSuccess, - testError, - testDetailedError, - testThenAfterSuccess, - testThenAfterError, -]; - -function runTest() { - if (!tests.length) { - SimpleTest.finish(); - return; - } - - var test = tests.shift(); - test(); -} - -SimpleTest.waitForExplicitFinish(); -runTest(); - -</script> -</pre> -</body> -</html> diff --git a/dom/base/test/test_domrequesthelper.xhtml b/dom/base/test/test_domrequesthelper.xhtml deleted file mode 100644 index 6b9061b8a2..0000000000 --- a/dom/base/test/test_domrequesthelper.xhtml +++ /dev/null @@ -1,549 +0,0 @@ -<?xml version="1.0"?> -<!-- - Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ ---> -<?xml-stylesheet href="chrome://global/skin" type="text/css"?> -<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> - -<window title="DOMRequestHelper Test" - xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" - onload="start();"> - - <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> - - <script type="application/javascript"> - <![CDATA[ - const {DOMRequestIpcHelper} = ChromeUtils.importESModule( - "resource://gre/modules/DOMRequestHelper.sys.mjs" - ); - let obs = Cc["@mozilla.org/observer-service;1"]. - getService(Ci.nsIObserverService); - let ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"].getService(); - - function DummyHelperSubclass() { - this.onuninit = null; - } - DummyHelperSubclass.prototype = { - __proto__: DOMRequestIpcHelper.prototype, - uninit() { - if (typeof this.onuninit === "function") { - this.onuninit(); - } - this.onuninit = null; - } - }; - - var dummy = new DummyHelperSubclass(); - var isDOMRequestHelperDestroyed = false; - - /** - * Init & destroy. - */ - function initDOMRequestHelperTest(aMessages) { - // If we haven't initialized the DOMRequestHelper object, its private - // properties will be undefined, but once destroyDOMRequestHelper is - // called, they're set to null. - var expectedPrivatePropertyValues = - isDOMRequestHelperDestroyed ? null : undefined; - - is(dummy._requests, expectedPrivatePropertyValues, "Request is expected"); - is(dummy._messages, undefined, "Messages is undefined"); - is(dummy._window, expectedPrivatePropertyValues, "Window is expected"); - - dummy.initDOMRequestHelper(window, aMessages); - - ok(dummy._window, "Window exists"); - is(dummy._window, window, "Correct window"); - if (aMessages) { - is(typeof dummy._listeners, "object", "Listeners is an object"); - } - } - - function destroyDOMRequestHelperTest() { - dummy.destroyDOMRequestHelper(); - isDOMRequestHelperDestroyed = true; - - is(dummy._requests, null, "Request is null"); - is(dummy._messages, undefined, "Messages is undefined"); - is(dummy._window, null, "Window is null"); - } - - /** - * Message listeners. - */ - function checkMessageListeners(aExpectedListeners, aCount) { - info("Checking message listeners\n" + "Expected listeners " + - JSON.stringify(aExpectedListeners) + " \nExpected count " + aCount); - let count = 0; - Object.keys(dummy._listeners).forEach(function(name) { - count++; - is(aExpectedListeners[name].weakRef, dummy._listeners[name].weakRef, - "Message found " + name + " - Same weakRef"); - is(aExpectedListeners[name].count, dummy._listeners[name].count, - "Message found " + name + " - Same count"); - }); - is(aCount, count, "Correct number of listeners"); - } - - function addMessageListenersTest(aMessages, aExpectedListeners, aCount) { - dummy.addMessageListeners(aMessages); - info(JSON.stringify(dummy._listeners)); - checkMessageListeners(aExpectedListeners, aCount); - } - - function removeMessageListenersTest(aMessages, aExpectedListeners, aCount) { - dummy.removeMessageListeners(aMessages); - checkMessageListeners(aExpectedListeners, aCount); - } - - /** - * Utility function to test window destruction behavior. In general this - * function does the following: - * - * 1) Create a new iframe - * 2) Create a new DOMRequestHelper - * 3) initDOMRequestHelper(), optionally with weak or strong listeners - * 4) Optionally force a garbage collection to reap weak references - * 5) Destroy the iframe triggering an inner-window-destroyed event - * 6) Callback with a boolean indicating if DOMRequestHelper.uninit() was - * called. - * - * Example usage: - * - * checkWindowDestruction({ messages: ["foo"], gc: true }, - * function(uninitCalled) { - * // expect uninitCalled === false since GC with only weak refs - * }); - */ - const TOPIC = "inner-window-destroyed"; - function checkWindowDestruction(aOptions, aCallback) { - aOptions = aOptions || {}; - aOptions.messages = aOptions.messages || []; - aOptions.gc = !!aOptions.gc; - - if (typeof aCallback !== "function") { - aCallback = function() { }; - } - - let uninitCalled = false; - - // Use a secondary observer so we know when to expect the uninit(). We - // can then reasonably expect uninitCalled to be set properly on the - // next tick. - let observer = { - observe(aSubject, aTopic, aData) { - if (aTopic !== TOPIC) { - return; - } - obs.removeObserver(observer, TOPIC); - setTimeout(function() { - aCallback(uninitCalled); - }); - } - }; - - let frame = document.createXULElement("iframe"); - frame.onload = function() { - obs.addObserver(observer, TOPIC); - // Create dummy DOMRequestHelper specific to checkWindowDestruction() - let cwdDummy = new DummyHelperSubclass(); - cwdDummy.onuninit = function() { - uninitCalled = true; - - if (!aOptions.messages || !aOptions.messages.length) { - return; - } - - // If all message listeners are removed, cwdDummy.receiveMessage - // should never be called. - ppmm.broadcastAsyncMessage(aOptions.messages[0].name); - }; - - // Test if we still receive messages from ppmm. - cwdDummy.receiveMessage = function(aMessage) { - ok(false, "cwdDummy.receiveMessage should NOT be called: " + aMessage.name); - }; - - cwdDummy.initDOMRequestHelper(frame.contentWindow, aOptions.messages); - // Make sure to clear our strong ref here so that we can test our - // weak reference listeners and observer. - cwdDummy = null; - if (aOptions.gc) { - Cu.schedulePreciseGC(function() { - SpecialPowers.DOMWindowUtils.cycleCollect(); - SpecialPowers.DOMWindowUtils.garbageCollect(); - SpecialPowers.DOMWindowUtils.garbageCollect(); - document.documentElement.removeChild(frame); - }); - return; - } - document.documentElement.removeChild(frame); - }; - document.documentElement.appendChild(frame); - } - - /** - * Test steps. - */ - var tests = [ - function() { - info("== InitDOMRequestHelper no messages"); - initDOMRequestHelperTest(null); - next(); - }, - function() { - info("== DestroyDOMRequestHelper"); - destroyDOMRequestHelperTest(); - next(); - }, - function() { - info("== InitDOMRequestHelper empty array"); - initDOMRequestHelperTest([]); - checkMessageListeners({}, 0); - next(); - }, - function() { - info("== DestroyDOMRequestHelper"); - destroyDOMRequestHelperTest(); - next(); - }, - function() { - info("== InitDOMRequestHelper with strings array"); - initDOMRequestHelperTest(["name1", "nameN"]); - checkMessageListeners({"name1": {weakRef: false, count: 1}, - "nameN": {weakRef: false, count: 1}}, 2); - next(); - }, - function() { - info("== DestroyDOMRequestHelper"); - destroyDOMRequestHelperTest(); - next(); - }, - function() { - info("== InitDOMRequestHelper with objects array"); - initDOMRequestHelperTest([{ - name: "name1", - weakRef: false - }, { - name: "nameN", - weakRef: true - }]); - checkMessageListeners({ - "name1": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 2); - next(); - }, - function() { - info("== AddMessageListeners empty array"); - addMessageListenersTest([], { - "name1": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 2); - next(); - }, - function() { - info("== AddMessageListeners null"); - addMessageListenersTest(null, { - "name1": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 2); - next(); - }, - function() { - info("== AddMessageListeners new listener, string only"); - addMessageListenersTest("name2", { - "name1": {weakRef: false, count: 1}, - "name2": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 3); - next(); - }, - function() { - info("== AddMessageListeners new listeners, strings array"); - addMessageListenersTest(["name3", "name4"], { - "name1": {weakRef: false, count: 1}, - "name2": {weakRef: false, count: 1}, - "name3": {weakRef: false, count: 1}, - "name4": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 5); - next(); - }, - function() { - info("== AddMessageListeners new listeners, objects array"); - addMessageListenersTest([{ - name: "name5", - weakRef: true - }, { - name: "name6", - weakRef: false - }], { - "name1": {weakRef: false, count: 1}, - "name2": {weakRef: false, count: 1}, - "name3": {weakRef: false, count: 1}, - "name4": {weakRef: false, count: 1}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 7); - next(); - }, - function() { - info("== RemoveMessageListeners, null"); - removeMessageListenersTest(null, { - "name1": {weakRef: false, count: 1}, - "name2": {weakRef: false, count: 1}, - "name3": {weakRef: false, count: 1}, - "name4": {weakRef: false, count: 1}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 7); - next(); - }, - function() { - info("== RemoveMessageListeners, one message"); - removeMessageListenersTest("name1", { - "name2": {weakRef: false, count: 1}, - "name3": {weakRef: false, count: 1}, - "name4": {weakRef: false, count: 1}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 6); - next(); - }, - function() { - info("== RemoveMessageListeners, array of messages"); - removeMessageListenersTest(["name2", "name3"], { - "name4": {weakRef: false, count: 1}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 4); - next(); - }, - function() { - info("== RemoveMessageListeners, unknown message"); - removeMessageListenersTest("unknown", { - "name4": {weakRef: false, count: 1}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 4); - next(); - }, - function() { - try { - info("== AddMessageListeners, same message, same kind"); - addMessageListenersTest("name4", { - "name4": {weakRef: false, count: 2}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 4); - next(); - } catch (ex) { - ok(false, "Unexpected exception " + ex); - } - }, - function() { - info("== AddMessageListeners, same message, different kind"); - try { - addMessageListenersTest({name: "name4", weakRef: true}, { - "name4": {weakRef: false, count: 2}, - "name5": {weakRef: true, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 4); - ok(false, "Should have thrown an exception"); - } catch (ex) { - ok(true, "Expected exception"); - next(); - } - }, - function() { - info("== RemoveMessageListeners, message with two listeners"); - try { - removeMessageListenersTest(["name4", "name5"], { - "name4": {weakRef: false, count: 1}, - "name6": {weakRef: false, count: 1}, - "nameN": {weakRef: true, count: 1} - }, 3); - next(); - } catch (ex) { - ok(false, "Unexpected exception " + ex); - } - }, - function() { - info("== Test createRequest()"); - ok(DOMRequest, "DOMRequest object exists"); - var req = dummy.createRequest(); - ok(DOMRequest.isInstance(req), "Returned a DOMRequest"); - next(); - }, - function() { - info("== Test getRequestId(), removeRequest() and getRequest()"); - var req = dummy.createRequest(); - var id = dummy.getRequestId(req); - is(typeof id, "string", "id is a string"); - var req_ = dummy.getRequest(id); - is(req, req_, "Got correct request"); - dummy.removeRequest(id); - req = dummy.getRequest(id); - is(req, undefined, "No request"); - next(); - }, - function() { - info("== Test createPromise()"); - ok(Promise, "Promise object exists"); - var promise = dummy.createPromise(function(resolve, reject) { - resolve(true); - }); - ok(promise instanceof Promise, "Returned a Promise"); - promise.then(next); - }, - function() { - info("== Test createPromiseWithId()"); - var _resolverId; - var promise = dummy.createPromiseWithId(function(resolverId) { - _resolverId = resolverId; - }); - var resolver = dummy.getPromiseResolver(_resolverId); - ok(promise instanceof Promise, "Returned a Promise"); - ok(typeof _resolverId === "string", "resolverId is a string"); - ok(resolver != null, "resolverId is a valid id"); - next(); - }, - function() { - info("== Test getResolver()"); - var id; - var resolver; - var promise = dummy.createPromise(function(resolve, reject) { - var r = { resolve, reject }; - id = dummy.getPromiseResolverId(r); - resolver = r; - ok(typeof id === "string", "id is a string"); - r.resolve(true); - }).then(function(unused) { - var r = dummy.getPromiseResolver(id); - ok(resolver === r, "Get succeeded"); - next(); - }); - }, - function() { - info("== Test removeResolver"); - var id; - var promise = dummy.createPromise(function(resolve, reject) { - var r = { resolve, reject }; - id = dummy.getPromiseResolverId(r); - ok(typeof id === "string", "id is a string"); - - var resolver = dummy.getPromiseResolver(id); - info("Got resolver " + JSON.stringify(resolver)); - ok(resolver === r, "Resolver get succeeded"); - - r.resolve(true); - }).then(function(unused) { - dummy.removePromiseResolver(id); - var resolver = dummy.getPromiseResolver(id); - ok(resolver === undefined, "removeResolver: get failed"); - next(); - }); - }, - function() { - info("== Test takeResolver"); - var id; - var resolver; - var promise = dummy.createPromise(function(resolve, reject) { - var r = { resolve, reject }; - id = dummy.getPromiseResolverId(r); - resolver = r; - ok(typeof id === "string", "id is a string"); - - var gotR = dummy.getPromiseResolver(id); - ok(gotR === r, "resolver get succeeded"); - - r.resolve(true); - }).then(function(unused) { - var r = dummy.takePromiseResolver(id); - ok(resolver === r, "take should succeed"); - - r = dummy.getPromiseResolver(id); - ok(r === undefined, "takeResolver: get failed"); - next(); - }); - }, - function() { - info("== Test window destroyed without messages and without GC"); - checkWindowDestruction({ gc: false }, function(uninitCalled) { - ok(uninitCalled, "uninit() should have been called"); - next(); - }); - }, - function() { - info("== Test window destroyed without messages and with GC"); - checkWindowDestruction({ gc: true }, function(uninitCalled) { - ok(!uninitCalled, "uninit() should NOT have been called"); - next(); - }); - }, - function() { - info("== Test window destroyed with weak messages and without GC"); - checkWindowDestruction({ messages: [{ name: "foo", weakRef: true }], - gc: false }, function(uninitCalled) { - ok(uninitCalled, "uninit() should have been called"); - next(); - }); - }, - function() { - info("== Test window destroyed with weak messages and with GC"); - checkWindowDestruction({ messages: [{ name: "foo", weakRef: true }], - gc: true }, function(uninitCalled) { - ok(!uninitCalled, "uninit() should NOT have been called"); - next(); - }); - }, - function() { - info("== Test window destroyed with strong messages and without GC"); - checkWindowDestruction({ messages: [{ name: "foo", weakRef: false }], - gc: false }, function(uninitCalled) { - ok(uninitCalled, "uninit() should have been called"); - next(); - }); - }, - function() { - info("== Test window destroyed with strong messages and with GC"); - checkWindowDestruction({ messages: [{ name: "foo", weakRef: false }], - gc: true }, function(uninitCalled) { - ok(uninitCalled, "uninit() should have been called"); - next(); - }); - } - ]; - - function next() { - if (!tests.length) { - SimpleTest.finish(); - return; - } - - var test = tests.shift(); - test(); - } - - function start() { - SimpleTest.waitForExplicitFinish(); - next(); - } - ]]> - </script> - - <body xmlns="http://www.w3.org/1999/xhtml"> - <p id="display"></p> - <div id="content" style="display: none"></div> - <pre id="test"></pre> - </body> -</window> diff --git a/dom/base/test/test_focus_radio.html b/dom/base/test/test_focus_radio.html new file mode 100644 index 0000000000..8e97012745 --- /dev/null +++ b/dom/base/test/test_focus_radio.html @@ -0,0 +1,90 @@ +<!doctype html> +<title>Test for input radio focus</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<script src="/tests/SimpleTest/EventUtils.js"></script> + +<button id="before">before</button> +<fieldset> + <legend>a</legend> + <label><input id="a1" type="radio" name="a" checked>a1</label> + <label><input id="a2" type="radio" name="a">a2</label> +</fieldset> +<fieldset> + <legend>b</legend> + <label><input id="b1" type="radio" name="b">b1</label> + <label><input id="b2" type="radio" name="b" checked>b2</label> +</fieldset> +<fieldset> + <legend>c</legend> + <label><input id="c1" type="radio" name="c">c1</label> + <label><input id="c2" type="radio" name="c">c2</label> +</fieldset> +<fieldset> + <legend>d</legend> + <label><input id="d1" type="radio" name="d" disabled>d1</label> + <label><input id="d2" type="radio" name="d">d2</label> + <label><input id="d3" type="radio" name="d" disabled>d3</label> + <label><input id="d4" type="radio" name="d">d4</label> +</fieldset> +<button id="after">after</button> + +<script> + SimpleTest.waitForExplicitFinish(); + + function expectFocusAfterKey(key, id) { + const res = key.match(/(Shift\+)?(.*)/); + const shiftKey = Boolean(res[1]); + const rawKey = res[2]; + synthesizeKey(`KEY_${rawKey}`, { shiftKey }); + is(document.activeElement.id, id, `${id} is focused after ${key}`); + } + + SimpleTest.waitForFocus(async function() { + await SpecialPowers.pushPrefEnv({"set": [["accessibility.tabfocus", 7]]}); + + expectFocusAfterKey("Tab", "before"); + // a1 is checked. + expectFocusAfterKey("Tab", "a1"); + // b2 is checked. + expectFocusAfterKey("Tab", "b2"); + // Nothing is checked in group c, so c1 should get focus. + expectFocusAfterKey("Tab", "c1"); + // d1 is disabled, so d2 should get focus. + expectFocusAfterKey("Tab", "d2"); + expectFocusAfterKey("Tab", "after"); + + expectFocusAfterKey("Shift+Tab", "d2"); + expectFocusAfterKey("Shift+Tab", "c1"); + expectFocusAfterKey("Shift+Tab", "b2"); + expectFocusAfterKey("Shift+Tab", "a1"); + expectFocusAfterKey("Shift+Tab", "before"); + + expectFocusAfterKey("Tab", "a1"); + expectFocusAfterKey("ArrowDown", "a2"); + expectFocusAfterKey("Tab", "b2"); + // a2 is now checked, so shift+tab should focus it. + expectFocusAfterKey("Shift+Tab", "a2"); + + expectFocusAfterKey("Tab", "b2"); + expectFocusAfterKey("ArrowUp", "b1"); + expectFocusAfterKey("Shift+Tab", "a2"); + expectFocusAfterKey("Tab", "b1"); + + expectFocusAfterKey("Tab", "c1"); + expectFocusAfterKey("ArrowDown", "c2"); + expectFocusAfterKey("Tab", "d2"); + expectFocusAfterKey("Shift+Tab", "c2"); + + expectFocusAfterKey("Tab", "d2"); + // d3 is disabled, so down arrow should focus d4. + expectFocusAfterKey("ArrowDown", "d4"); + expectFocusAfterKey("ArrowUp", "d2"); + expectFocusAfterKey("ArrowDown", "d4"); + // Down arrow should wrap at the bottom, skipping disabled. + expectFocusAfterKey("ArrowDown", "d2"); + // Up arrow should wrap at the top. + expectFocusAfterKey("ArrowUp", "d4"); + + SimpleTest.finish(); + }); +</script> diff --git a/dom/base/test/unit/test_error_codes.js b/dom/base/test/unit/test_error_codes.js index 73c893c512..5c26331d11 100644 --- a/dom/base/test/unit/test_error_codes.js +++ b/dom/base/test/unit/test_error_codes.js @@ -10,7 +10,7 @@ function asyncXHR(expectedStatus, nextTestFunc) { xhr.open("GET", "http://localhost:4444/test_error_code.xml", true); var sawError = false; - xhr.addEventListener("loadend", function doAsyncRequest_onLoad(event) { + xhr.addEventListener("loadend", function doAsyncRequest_onLoad() { Assert.ok(sawError, "Should have received an error"); nextTestFunc(); }); diff --git a/dom/base/test/useractivation/file_clipboard_common.js b/dom/base/test/useractivation/file_clipboard_common.js index fe172e52c8..3925404350 100644 --- a/dom/base/test/useractivation/file_clipboard_common.js +++ b/dom/base/test/useractivation/file_clipboard_common.js @@ -373,10 +373,10 @@ function allMechanisms(aCb, aClipOverride, aNegateAll) { case 0: // Keyboard issued cutCopyAll( - function docut(aSucc) { + function docut() { synthesizeKey("x", { accelKey: true }); }, - function docopy(aSucc) { + function docopy() { synthesizeKey("c", { accelKey: true }); }, function done() { @@ -411,14 +411,14 @@ function allMechanisms(aCb, aClipOverride, aNegateAll) { case 2: // Not triggered by user gesture cutCopyAll( - function doCut(aSucc) { + function doCut() { is( false, document.execCommand("cut"), "Can't directly execCommand not in a user callback" ); }, - function doCopy(aSucc) { + function doCopy() { is( false, document.execCommand("copy"), diff --git a/dom/base/test/useractivation/test_popup_blocker_async_callback.html b/dom/base/test/useractivation/test_popup_blocker_async_callback.html index dc53596531..4667229116 100644 --- a/dom/base/test/useractivation/test_popup_blocker_async_callback.html +++ b/dom/base/test/useractivation/test_popup_blocker_async_callback.html @@ -16,7 +16,7 @@ SimpleTest.requestFlakyTimeout("Need to test setTimeout"); function startTest(aTestAsyncFun, aAllowPopup = true) { return new Promise(aResolve => { let target = document.getElementById("target"); - target.addEventListener("click", (e) => { + target.addEventListener("click", () => { aTestAsyncFun(() => { let w = window.open("about:blank"); is(!!w, aAllowPopup, `Should ${aAllowPopup ? "allow" : "block"} popup`); diff --git a/dom/base/test/useractivation/test_useractivation_scrollbar.html b/dom/base/test/useractivation/test_useractivation_scrollbar.html index 778d6d0898..197cdc49fb 100644 --- a/dom/base/test/useractivation/test_useractivation_scrollbar.html +++ b/dom/base/test/useractivation/test_useractivation_scrollbar.html @@ -78,7 +78,7 @@ if (!opener) { SimpleTest.waitForFocus(async function() { function waitForEvent(aTarget, aEvent) { return new Promise((aResolve) => { - aTarget.addEventListener(aEvent, function listener(event) { + aTarget.addEventListener(aEvent, function listener() { aResolve(); }, { once: true }); }); |