mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-10 05:08:36 +02:00
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
110 lines
3.3 KiB
JavaScript
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"
|
|
);
|
|
});
|