gecko-dev/browser/base/content/test/general/browser_bug676619.js
Gijs Kruitbosch 037a648633 Bug 1667787 - fix saving webp images served with jpeg extensions without content-disposition information, r=mak
This changes two bits of Firefox that, together with the mime service, end up
very confused over webp + jpeg.

1) it changes contentAreaUtils.js' getDefaultExtension that if it gets an image
mimetype as the content type, it should ignore the URL. It doesn't have full channel
info so it can't really do better anyway. This fixes the context menu's "save image as..."
case.
2) it changes the external helper app service to do a few things slightly differently:
a. If we're told not to get an extension out of a URL, really don't. Don't just get the
   filename and then get it from there anyway...
b. If we've got a suggested filename, and a primary extension for the mimetype,
   and the extension on the file is not one of the known extensions for the mimetype,
   replace it with the primary extension.
This fixes the link case.

It also adds tests for both of these mechanisms as well as "save image as."

Differential Revision: https://phabricator.services.mozilla.com/D92306
2020-10-20 20:35:26 +00:00

110 lines
3.3 KiB
JavaScript

function waitForNewWindow() {
return new Promise(resolve => {
var listener = {
onOpenWindow: aXULWindow => {
info("Download window shown...");
Services.wm.removeListener(listener);
function downloadOnLoad() {
domwindow.removeEventListener("load", downloadOnLoad, true);
is(
domwindow.document.location.href,
"chrome://mozapps/content/downloads/unknownContentType.xhtml",
"Download page appeared"
);
resolve(domwindow);
}
var domwindow = aXULWindow.docShell.domWindow;
domwindow.addEventListener("load", downloadOnLoad, true);
},
onCloseWindow: aXULWindow => {},
};
Services.wm.addListener(listener);
});
}
async function testLink(link, name) {
info("Checking " + link + " with name: " + name);
let winPromise = waitForNewWindow();
SpecialPowers.spawn(gBrowser.selectedBrowser, [link], contentLink => {
content.document.getElementById(contentLink).click();
});
let win = await winPromise;
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
Assert.equal(
content.document.getElementById("unload-flag").textContent,
"Okay",
"beforeunload shouldn't have fired"
);
});
is(
win.document.getElementById("location").value,
name,
"file name should match"
);
await BrowserTestUtils.closeWindow(win);
}
// Cross-origin URL does not trigger a download
async function testLocation(link, url) {
let tabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
SpecialPowers.spawn(gBrowser.selectedBrowser, [link], contentLink => {
content.document.getElementById(contentLink).click();
});
let tab = await tabPromise;
BrowserTestUtils.removeTab(tab);
}
async function runTest(url) {
let tab = BrowserTestUtils.addTab(gBrowser, url);
gBrowser.selectedTab = tab;
let browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
await testLink("link1", "test.txt");
await testLink("link2", "video.ogg");
await testLink("link3", "just some video.ogg");
await testLink("link4", "with-target.txt");
await testLink("link5", "javascript.html");
await testLink("link6", "test.blob");
await testLink("link7", "test.file");
await testLink("link8", "download_page_3.txt");
await testLink("link9", "download_page_3.txt");
await testLink("link10", "download_page_4.txt");
await testLink("link11", "download_page_4.txt");
await testLocation("link12", "http://example.com/");
// Check that we enforce the correct extension if the website's
// is bogus or missing. These extensions can differ slightly (ogx vs ogg,
// htm vs html) on different OSes.
let oggExtension = getMIMEInfoForType("application/ogg").primaryExtension;
await testLink("link13", "no file extension." + oggExtension);
let htmlExtension = getMIMEInfoForType("text/html").primaryExtension;
await testLink("link14", "javascript." + htmlExtension);
BrowserTestUtils.removeTab(tab);
}
add_task(async function() {
requestLongerTimeout(3);
waitForExplicitFinish();
await runTest(
"http://mochi.test:8888/browser/browser/base/content/test/general/download_page.html"
);
await runTest(
"https://example.com:443/browser/browser/base/content/test/general/download_page.html"
);
});