From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../test/favicons/browser_favicon_nostore.js | 169 +++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 browser/base/content/test/favicons/browser_favicon_nostore.js (limited to 'browser/base/content/test/favicons/browser_favicon_nostore.js') diff --git a/browser/base/content/test/favicons/browser_favicon_nostore.js b/browser/base/content/test/favicons/browser_favicon_nostore.js new file mode 100644 index 0000000000..3fec666bbe --- /dev/null +++ b/browser/base/content/test/favicons/browser_favicon_nostore.js @@ -0,0 +1,169 @@ +/* Any copyright is dedicated to the Public Domain. + * https://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test that a favicon with Cache-Control: no-store is not stored in Places. +// Also tests that favicons added after pageshow are not stored. + +const TEST_SITE = "http://example.net"; +const ICON_URL = + TEST_SITE + "/browser/browser/base/content/test/favicons/no-store.png"; +const PAGE_URL = + TEST_SITE + "/browser/browser/base/content/test/favicons/no-store.html"; + +async function cleanup() { + Services.cache2.clear(); + await PlacesTestUtils.clearFavicons(); + await PlacesUtils.history.clear(); +} + +add_task(async function browser_loader() { + await cleanup(); + let iconPromise = waitForFaviconMessage(true, ICON_URL); + let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE_URL); + registerCleanupFunction(async () => { + await cleanup(); + }); + + let { iconURL } = await iconPromise; + is(iconURL, ICON_URL, "Should have seen the expected icon."); + + // Ensure the favicon has not been stored. + /* eslint-disable mozilla/no-arbitrary-setTimeout */ + await new Promise(resolve => setTimeout(resolve, 1000)); + await new Promise((resolve, reject) => { + PlacesUtils.favicons.getFaviconURLForPage( + Services.io.newURI(PAGE_URL), + foundIconURI => { + if (foundIconURI) { + reject(new Error("An icon has been stored " + foundIconURI.spec)); + } + resolve(); + } + ); + }); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function places_loader() { + await cleanup(); + + // Ensure the favicon is not stored even if Places is directly invoked. + await PlacesTestUtils.addVisits(PAGE_URL); + let faviconData = new Map(); + faviconData.set(PAGE_URL, ICON_URL); + // We can't wait for the promise due to bug 740457, so we race with a timer. + await Promise.race([ + PlacesTestUtils.addFavicons(faviconData), + /* eslint-disable mozilla/no-arbitrary-setTimeout */ + new Promise(resolve => setTimeout(resolve, 1000)), + ]); + await new Promise((resolve, reject) => { + PlacesUtils.favicons.getFaviconURLForPage( + Services.io.newURI(PAGE_URL), + foundIconURI => { + if (foundIconURI) { + reject(new Error("An icon has been stored " + foundIconURI.spec)); + } + resolve(); + } + ); + }); +}); + +async function later_addition(iconUrl) { + let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE_URL); + registerCleanupFunction(async () => { + await cleanup(); + BrowserTestUtils.removeTab(tab); + }); + + let iconPromise = waitForFaviconMessage(true, iconUrl); + await ContentTask.spawn(gBrowser.selectedBrowser, iconUrl, href => { + let doc = content.document; + let head = doc.head; + let link = doc.createElement("link"); + link.rel = "icon"; + link.href = href; + link.type = "image/png"; + head.appendChild(link); + }); + let { iconURL } = await iconPromise; + is(iconURL, iconUrl, "Should have seen the expected icon."); + + // Ensure the favicon has not been stored. + /* eslint-disable mozilla/no-arbitrary-setTimeout */ + await new Promise(resolve => setTimeout(resolve, 1000)); + await new Promise((resolve, reject) => { + PlacesUtils.favicons.getFaviconURLForPage( + Services.io.newURI(PAGE_URL), + foundIconURI => { + if (foundIconURI) { + reject(new Error("An icon has been stored " + foundIconURI.spec)); + } + resolve(); + } + ); + }); + BrowserTestUtils.removeTab(tab); +} + +add_task(async function test_later_addition() { + for (let iconUrl of [ + TEST_SITE + "/browser/browser/base/content/test/favicons/moz.png", + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABH0lEQVRYw2P8////f4YBBEwMAwxGHcBCUMX/91DGOSj/BpT/DkpzQChGBSjfBErLQsVZhmoI/L8LpRdD6X1QietQGhYy7FB5aAgwmkLpBKi4BZTPMThDgBGjHIDF+f9mKD0fKvGBRKNdoF7sgPL1saaJwZgGDkJ9vpZMn8PAHqg5G9FyifBgD4H/W9HyOWrU/f+DIzHhkoeZxxgzZEIAVtJ9RxX+Q6DAxCmP3byhXxkxshAs5odqbcioAY3UC1CBLyTGOTqAmsfAOWRCwBvqxV0oIUB2OQAzDy3/D+a6wB7q8mCU2vD/nw94GziYIQOtDRn9oXz+IZMGBKGMbCjNh9Ii+v8HR4uIAUeLiEEbb9twELaIRlqrmHG0bzjiHQAA1LVfww8jwM4AAAAASUVORK5CYII=", + ]) { + await later_addition(iconUrl); + } +}); + +add_task(async function root_icon_stored() { + XPCShellContentUtils.ensureInitialized(this); + let server = XPCShellContentUtils.createHttpServer({ + hosts: ["www.nostore.com"], + }); + server.registerFile( + "/favicon.ico", + new FileUtils.File( + PathUtils.join( + Services.dirsvc.get("CurWorkD", Ci.nsIFile).path, + "browser", + "browser", + "base", + "content", + "test", + "favicons", + "no-store.png" + ) + ) + ); + server.registerPathHandler("/page", (request, response) => { + response.write("A page without icon"); + }); + + let noStorePromise = TestUtils.topicObserved( + "http-on-stop-request", + (s, t, d) => { + let chan = s.QueryInterface(Ci.nsIHttpChannel); + return chan?.URI.spec == "http://www.nostore.com/favicon.ico"; + } + ).then(([chan]) => chan.isNoStoreResponse()); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: "http://www.nostore.com/page", + }, + async function (browser) { + await TestUtils.waitForCondition(async () => { + let uri = await new Promise(resolve => + PlacesUtils.favicons.getFaviconURLForPage( + Services.io.newURI("http://www.nostore.com/page"), + resolve + ) + ); + return uri?.spec == "http://www.nostore.com/favicon.ico"; + }, "wait for the favicon to be stored"); + Assert.ok(await noStorePromise, "Should have received no-store header"); + } + ); +}); -- cgit v1.2.3