Commit 2f5e2973 authored by Gijs Kruitbosch's avatar Gijs Kruitbosch
Browse files

Bug 1753004, r=mhowell

Depends on D138641

Differential Revision: https://phabricator.services.mozilla.com/D138321
parent 2ca57aff
Loading
Loading
Loading
Loading
+56 −33
Original line number Diff line number Diff line
@@ -3,10 +3,12 @@

const PREF_SVG_DISABLED = "svg.disabled";
const PREF_WEBP_ENABLED = "image.webp.enabled";
const PREF_AVIF_ENABLED = "image.avif.enabled";
const PDF_MIME = "application/pdf";
const OCTET_MIME = "application/octet-stream";
const XML_MIME = "text/xml";
const SVG_MIME = "image/svg+xml";
const AVIF_MIME = "image/avif";
const WEBP_MIME = "image/webp";

const { Integration } = ChromeUtils.import(
@@ -70,37 +72,46 @@ function checkWasRegistered(ext, expectedWasRegistered) {
}

function checkAll(mime, ext, expected) {
  checkPreferInternal(mime, ext, expected);
  checkPreferInternal(mime, ext, expected && ext != "xml" && ext != "svg");
  checkShouldView(mime, ext, expected);
  if (ext != "xml" && ext != "svg") {
    checkWasRegistered(ext, expected);
  }
}

add_task(async function test_viewable_internally() {
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "xml , svg,webp");
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "xml , svg,avif,webp");
  Services.prefs.setBoolPref(PREF_SVG_DISABLED, false);
  Services.prefs.setBoolPref(PREF_WEBP_ENABLED, true);
  Services.prefs.setBoolPref(PREF_AVIF_ENABLED, true);

  checkAll(XML_MIME, "xml", false);
  checkAll(SVG_MIME, "svg", false);
  checkAll(WEBP_MIME, "webp", false);
  checkAll(AVIF_MIME, "avif", false);

  DownloadsViewableInternally.register();

  checkAll(XML_MIME, "xml", true);
  checkAll(SVG_MIME, "svg", true);
  checkAll(WEBP_MIME, "webp", true);
  checkAll(AVIF_MIME, "avif", true);

  // Remove SVG so it won't be cleared
  Services.prefs.clearUserPref(PREF_BRANCH_WAS_REGISTERED + "svg");
  // Remove webp so it won't be cleared
  Services.prefs.clearUserPref(PREF_BRANCH_WAS_REGISTERED + "webp");

  // Disable xml and svg, check that xml becomes disabled
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "webp");
  // Disable xml, avif and webp, check that avif becomes disabled
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "svg");

  checkAll(XML_MIME, "xml", false);
  checkAll(WEBP_MIME, "webp", true);
  // (XML is externally managed, and we just cleared the webp pref)
  checkAll(XML_MIME, "xml", true);
  checkPreferInternal(WEBP_MIME, "webp", true);

  // SVG shouldn't be cleared
  checkPreferInternal(SVG_MIME, "svg", true);
  // Avif should be disabled
  checkAll(AVIF_MIME, "avif", false);

  // SVG shouldn't be cleared as it's still enabled
  checkAll(SVG_MIME, "svg", true);

  Assert.ok(
    shouldView(PDF_MIME),
@@ -116,14 +127,16 @@ add_task(async function test_viewable_internally() {
  );
  Assert.ok(!shouldView(OCTET_MIME, "exe"), ".exe shouldn't be accepted");

  Assert.ok(!shouldView(XML_MIME), "text/xml should be disabled by pref");
  Assert.ok(!shouldView(SVG_MIME), "image/xml+svg should be disabled by pref");
  Assert.ok(!shouldView(WEBP_MIME), "imave/webp should be disabled by pref");
  Assert.ok(!shouldView(AVIF_MIME), "image/avif should be disabled by pref");

  // Enable, check that everything is enabled again
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "xml,svg,webp");
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "xml,svg,webp,avif");

  checkPreferInternal(XML_MIME, "xml", true);
  checkPreferInternal(SVG_MIME, "svg", true);
  checkAll(XML_MIME, "xml", true);
  checkAll(SVG_MIME, "svg", true);
  checkPreferInternal(WEBP_MIME, "webp", true);
  checkPreferInternal(AVIF_MIME, "avif", true);

  Assert.ok(
    shouldView(PDF_MIME),
@@ -160,18 +173,18 @@ add_task(async function test_viewable_internally() {
    Assert.equal(handler.alwaysAskBeforeHandling, ask);
  }

  // Enable viewable internally, XML should not be replaced, SVG and WebP should be saved.
  // Enable viewable internally, SVG and XML should not be replaced, WebP should be saved.
  Services.prefs.setCharPref(PREF_ENABLED_TYPES, "svg,webp,xml");

  Assert.equal(
    Services.prefs.getIntPref(PREF_BRANCH_PREVIOUS_ACTION + "svg"),
    Ci.nsIHandlerInfo.saveToDisk,
    "svg action should be saved"
    Services.prefs.prefHasUserValue(PREF_BRANCH_PREVIOUS_ACTION + "svg"),
    false,
    "svg action should not be stored"
  );
  Assert.equal(
    Services.prefs.getBoolPref(PREF_BRANCH_PREVIOUS_ASK + "svg"),
    true,
    "svg ask should be saved"
    Services.prefs.prefHasUserValue(PREF_BRANCH_PREVIOUS_ASK + "svg"),
    false,
    "svg ask should not be stored"
  );
  Assert.equal(
    Services.prefs.getIntPref(PREF_BRANCH_PREVIOUS_ACTION + "webp"),
@@ -185,10 +198,10 @@ add_task(async function test_viewable_internally() {
  );

  {
    let handler = MIMEService.getFromTypeAndExtension(XML_MIME, "xml");
    let handler = MIMEService.getFromTypeAndExtension(SVG_MIME, "svg");
    Assert.equal(
      handler.preferredAction,
      Ci.nsIHandlerInfo.useSystemDefault,
      Ci.nsIHandlerInfo.saveToDisk,
      "svg action should be preserved"
    );
    Assert.equal(
@@ -198,27 +211,37 @@ add_task(async function test_viewable_internally() {
    );
    // Clean up
    HandlerService.remove(handler);
    handler = MIMEService.getFromTypeAndExtension(XML_MIME, "xml");
    Assert.equal(
      handler.preferredAction,
      Ci.nsIHandlerInfo.useSystemDefault,
      "xml action should be preserved"
    );
    Assert.equal(
      !!handler.alwaysAskBeforeHandling,
      true,
      "xml ask should be preserved"
    );
    // Clean up
    HandlerService.remove(handler);
  }
  // It should still be possible to view XML internally
  checkShouldView(XML_MIME, "xml", true);
  checkWasRegistered("xml", true);

  checkAll(SVG_MIME, "svg", true);
  checkAll(WEBP_MIME, "webp", true);

  // Disable SVG to test SVG enabled check (depends on the pref)
  Services.prefs.setBoolPref(PREF_SVG_DISABLED, true);
  // Should have restored the settings from above
  checkAll(SVG_MIME, "svg", false);
  Services.prefs.setBoolPref(PREF_SVG_DISABLED, false);
  {
    let handler = MIMEService.getFromTypeAndExtension(SVG_MIME, "svg");
    Assert.equal(handler.preferredAction, Ci.nsIHandlerInfo.saveToDisk);
    Assert.equal(!!handler.alwaysAskBeforeHandling, true);
    // Clean up
    HandlerService.remove(handler);
    handler.preferredAction = Ci.nsIHandlerInfo.saveToDisk;
    handler.alwaysAskBeforeHandling = false;
    HandlerService.store(handler);
  }
  checkAll(SVG_MIME, "svg", false);

  Services.prefs.setBoolPref(PREF_SVG_DISABLED, false);
  checkAll(SVG_MIME, "svg", true);

  // Test WebP enabled check (depends on the pref)
+6 −0
Original line number Diff line number Diff line
@@ -299,6 +299,11 @@ add_task(async function test_unblock_download_visible() {

// Test Download an insecure svg and choose "Open with Firefox"
add_task(async function download_open_insecure_SVG() {
  const mimeInfo = MIMEService.getFromTypeAndExtension("image/svg+xml", "svg");
  mimeInfo.alwaysAskBeforeHandling = false;
  mimeInfo.preferredAction = mimeInfo.handleInternally;
  HandlerService.store(mimeInfo);

  for (let prefVal of [true, false]) {
    await SpecialPowers.pushPrefEnv({
      set: [["browser.download.improvements_to_download_panel", prefVal]],
@@ -331,4 +336,5 @@ add_task(async function download_open_insecure_SVG() {
      "A Blocked SVG can be opened internally"
    );
  }
  HandlerService.remove(mimeInfo);
});
+15 −3
Original line number Diff line number Diff line
@@ -36,11 +36,16 @@ support-files =
  file_xml_attachment_binary_octet_stream.xml^headers^
  file_xml_attachment_test.xml
  file_xml_attachment_test.xml^headers^
  file_green.webp
  file_green.webp^headers^
[browser_download_preferred_action.js]
support-files =
  mime_type_download.sjs
[browser_download_privatebrowsing.js]
[browser_download_skips_dialog.js]
support-files =
  file_green.webp
  file_green.webp^headers^
[browser_download_spam_permissions.js]
support-files =
  test_spammy_page.html
@@ -56,11 +61,11 @@ support-files =
  file_as.exe^headers^
[browser_filehandling_loop.js]
[browser_launched_app_save_directory.js]
 # This test checks the save destination of the
 # open with app download on Windows, Linux and OS X.
skip-if = (os == 'android')
support-files =
  file_pdf_application_pdf.pdf
  file_pdf_application_pdf.pdf^headers^
  file_green.webp
  file_green.webp^headers^
[browser_local_files_no_save_without_asking.js]
support-files =
  file_pdf_binary_octet_stream.pdf
@@ -68,6 +73,13 @@ support-files =
support-files =
  file_pdf_binary_octet_stream.pdf
[browser_shows_where_to_save_dialog.js]
support-files =
  file_green.webp
  file_green.webp^headers^
  file_pdf_application_pdf.pdf
  file_pdf_application_pdf.pdf^headers^
  file_txt_attachment_test.txt
  file_txt_attachment_test.txt^headers^
[browser_open_internal_choice_persistence.js]
skip-if =
  apple_silicon # bug 1752482
+17 −5
Original line number Diff line number Diff line
@@ -121,6 +121,7 @@ add_task(async function setup() {
  registerRestoreHandler("application/pdf", "pdf");
  registerRestoreHandler("binary/octet-stream", "pdf");
  registerRestoreHandler("application/unknown", "pdf");
  registerRestoreHandler("image/webp", "webp");
});

/**
@@ -572,18 +573,21 @@ add_task(async function test_check_open_with_external_then_internal() {
 */
add_task(
  async function test_internal_handler_hidden_with_viewable_internally_type() {
    await SpecialPowers.pushPrefEnv({
      set: [["image.webp.enabled", true]],
    });
    Services.telemetry.clearEvents();

    const mimeInfosToRestore = alwaysAskForHandlingTypes({
      "text/xml": "xml",
      "binary/octet-stream": "xml",
      "image/webp": "webp",
    });

    for (let [file, checkDefault] of [
      // The default for binary/octet-stream is changed by the PDF tests above,
      // this may change given bug 1659008, so I'm just ignoring the default for now.
      ["file_xml_attachment_binary_octet_stream.xml", false],
      ["file_xml_attachment_test.xml", true],
      ["file_green.webp", true],
    ]) {
      let dialogWindowPromise = BrowserTestUtils.domWindowOpenedAndLoaded();
      let loadingTab = await BrowserTestUtils.openNewForegroundTab({
@@ -608,13 +612,21 @@ add_task(
      checkTelemetry(
        "open " + file + " for viewable internal type",
        "ask",
        file == "file_xml_attachment_test.xml" ? "other" : "octetstream",
        file.endsWith(".webp") ? "other" : "octetstream",
        "attachment"
      );

      ok(!internalHandlerRadio.hidden, "The option should be visible for XML");
      let fileDesc = file.substring(file.lastIndexOf(".") + 1);

      ok(
        !internalHandlerRadio.hidden,
        `The option should be visible for ${fileDesc}`
      );
      if (checkDefault) {
        ok(internalHandlerRadio.selected, "The option should be selected");
        ok(
          internalHandlerRadio.selected,
          `The option should be selected for ${fileDesc}`
        );
      }

      let dialog = doc.querySelector("#unknownContentType");
+2 −1
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ add_task(async function skipDialogAndDownloadFile() {
    set: [
      ["browser.download.improvements_to_download_panel", true],
      ["browser.download.useDownloadDir", true],
      ["image.webp.enabled", true],
    ],
  });

@@ -26,7 +27,7 @@ add_task(async function skipDialogAndDownloadFile() {

  let loadingTab = await BrowserTestUtils.openNewForegroundTab({
    gBrowser,
    opening: TEST_PATH + "file_image_svgxml.svg",
    opening: TEST_PATH + "file_green.webp",
    waitForLoad: false,
    waitForStateStop: true,
  });
Loading