summaryrefslogtreecommitdiffstats
path: root/toolkit/components/pdfjs/test/browser_pdfjs_force_opening_files.js
blob: 0490a6eec3fd2804d500396d022ad1112eeee91b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

add_task(async function test_file_opening() {
  // Get a ref to the pdf we want to open.
  let dirFileObj = getChromeDir(getResolvedURI(gTestPath));
  dirFileObj.append("file_pdfjs_test.pdf");

  // Change the defaults.
  var oldAction = changeMimeHandler(Ci.nsIHandlerInfo.useSystemDefault, true);

  // Test: "Open with" dialog should not come up, despite pdf.js not being
  // the default - because files from disk should always use pdfjs, unless
  // it is forcibly disabled.
  let openedWindow = false;
  let windowOpenedPromise = new Promise((resolve, reject) => {
    addWindowListener(
      "chrome://mozapps/content/downloads/unknownContentType.xhtml",
      () => {
        openedWindow = true;
        resolve();
      }
    );
  });

  // Open the tab with a system principal:
  var tab = BrowserTestUtils.addTab(gBrowser, dirFileObj.path);

  let pdfjsLoadedPromise = TestUtils.waitForCondition(() => {
    let { contentPrincipal } = tab.linkedBrowser;
    return (contentPrincipal?.URI?.spec || "").endsWith("viewer.html");
  });
  await Promise.race([pdfjsLoadedPromise, windowOpenedPromise]);
  ok(!openedWindow, "Shouldn't open an unknownContentType window!");

  BrowserTestUtils.removeTab(tab);

  // Now try opening it from the file directory:
  tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    dirFileObj.parent.path
  );
  pdfjsLoadedPromise = BrowserTestUtils.browserLoaded(
    tab.linkedBrowser,
    false,
    url => url.endsWith("test.pdf")
  );
  await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
    content.document.querySelector("a[href$='test.pdf']").click();
  });
  await Promise.race([pdfjsLoadedPromise, windowOpenedPromise]);
  ok(
    !openedWindow,
    "Shouldn't open an unknownContentType window for PDFs from file: links!"
  );

  registerCleanupFunction(function () {
    if (listenerCleanup) {
      listenerCleanup();
    }
    changeMimeHandler(oldAction[0], oldAction[1]);
    gBrowser.removeTab(tab);
  });
});

let listenerCleanup;
function addWindowListener(aURL, aCallback) {
  let listener = {
    onOpenWindow(aXULWindow) {
      info("window opened, waiting for focus");
      listenerCleanup();
      listenerCleanup = null;

      var domwindow = aXULWindow.docShell.domWindow;
      waitForFocus(function () {
        is(
          domwindow.document.location.href,
          aURL,
          "should have seen the right window open"
        );
        domwindow.close();
        aCallback();
      }, domwindow);
    },
    onCloseWindow(aXULWindow) {},
  };
  Services.wm.addListener(listener);
  listenerCleanup = () => Services.wm.removeListener(listener);
}