Bug 1576508 - Fix downloads.onCreated DataClone error regression due to nsIURI referrer property. r=zombie

Differential Revision: https://phabricator.services.mozilla.com/D49007

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Luca Greco 2019-10-14 12:00:34 +00:00
parent f2f4cc162b
commit dea9517662
5 changed files with 98 additions and 1 deletions

View File

@ -104,9 +104,11 @@ class DownloadItem {
return this.download.source.url;
}
get referrer() {
return this.download.source.referrerInfo
const uri = this.download.source.referrerInfo
? this.download.source.referrerInfo.originalReferrer
: null;
return uri && uri.spec;
}
get filename() {
return this.download.target.path;

View File

@ -1,7 +1,9 @@
[DEFAULT]
support-files =
head.js
data/**
[browser_ext_downloads_referrer.js]
[browser_ext_management_themes.js]
skip-if = verify
[browser_ext_test_mock.js]

View File

@ -0,0 +1,82 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const { BrowserTestUtils } = ChromeUtils.import(
"resource://testing-common/BrowserTestUtils.jsm"
);
const URL_PATH = "browser/toolkit/components/extensions/test/browser/data";
const TEST_URL = `http://example.com/${URL_PATH}/test_downloads_referrer.html`;
const DOWNLOAD_URL = `http://example.com/${URL_PATH}/test-download.txt`;
async function triggerSaveAs({ selector }) {
await BrowserTestUtils.synthesizeMouseAtCenter(
selector,
{ type: "contextmenu", button: 2 },
gBrowser.selectedBrowser
);
let saveLinkCommand = window.document.getElementById("context-savelink");
saveLinkCommand.doCommand();
}
add_task(function test_setup() {
const tempDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
tempDir.append("test-download-dir");
if (!tempDir.exists()) {
tempDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
}
let MockFilePicker = SpecialPowers.MockFilePicker;
MockFilePicker.init(window);
registerCleanupFunction(function() {
MockFilePicker.cleanup();
if (tempDir.exists()) {
tempDir.remove(true);
}
});
MockFilePicker.displayDirectory = tempDir;
MockFilePicker.showCallback = function(fp) {
info("MockFilePicker: shown");
const filename = fp.defaultString;
info("MockFilePicker: save as " + filename);
const destFile = tempDir.clone();
destFile.append(filename);
MockFilePicker.setFiles([destFile]);
info("MockFilePicker: showCallback done");
};
});
add_task(async function test_download_item_referrer_info() {
const extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["downloads"],
},
async background() {
browser.downloads.onCreated.addListener(async downloadInfo => {
browser.test.sendMessage("download-on-created", downloadInfo);
});
// Call an API method implemented in the parent process to make sure
// registering the downloas.onCreated event listener has been completed.
await browser.runtime.getBrowserInfo();
browser.test.sendMessage("bg-page:ready");
},
});
await extension.startup();
await extension.awaitMessage("bg-page:ready");
await BrowserTestUtils.withNewTab({ gBrowser, url: TEST_URL }, async () => {
await triggerSaveAs({ selector: "a.test-link" });
const downloadInfo = await extension.awaitMessage("download-on-created");
is(downloadInfo.url, DOWNLOAD_URL, "Got the expected download url");
is(downloadInfo.referrer, TEST_URL, "Got the expected referrer");
});
await extension.unload();
});

View File

@ -0,0 +1 @@
test download content

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test downloads referrer</title>
</head>
<body>
<a href="test-download.txt" class="test-link">test link</a>
</body>
</html>