Backed out changeset f594e6f00208 (bug 1940883) for causing crashes in bug 1941164.
[gecko.git] / toolkit / components / pdfjs / test / browser_pdfjs_force_opening_files.js
blob10fdc6f2b76dbb8f52039ff59782b1ce59b982a2
1 /* Any copyright is dedicated to the Public Domain.
2  * http://creativecommons.org/publicdomain/zero/1.0/ */
4 add_task(async function test_file_opening() {
5   // Get a ref to the pdf we want to open.
6   let dirFileObj = getChromeDir(getResolvedURI(gTestPath));
7   dirFileObj.append("file_pdfjs_test.pdf");
9   // Change the defaults.
10   var oldAction = changeMimeHandler(Ci.nsIHandlerInfo.useSystemDefault, true);
12   // Test: "Open with" dialog should not come up, despite pdf.js not being
13   // the default - because files from disk should always use pdfjs, unless
14   // it is forcibly disabled.
15   let openedWindow = false;
16   const windowOpenedPromise = new Promise(resolve => {
17     addWindowListener(
18       "chrome://mozapps/content/downloads/unknownContentType.xhtml",
19       () => {
20         openedWindow = true;
21         resolve();
22       }
23     );
24   });
26   // Open the tab with a system principal:
27   var tab = await BrowserTestUtils.openNewForegroundTab(
28     gBrowser,
29     dirFileObj.path
30   );
31   await Promise.race([
32     windowOpenedPromise,
33     waitForSelector(
34       tab.linkedBrowser,
35       ".textLayer .endOfContent",
36       "Wait for text layer."
37     ),
38   ]);
39   ok(!openedWindow, "Shouldn't open an unknownContentType window!");
40   await waitForPdfJSClose(tab.linkedBrowser, /* closeTab = */ true);
42   // Now try opening it from the file directory:
43   tab = await BrowserTestUtils.openNewForegroundTab(
44     gBrowser,
45     dirFileObj.parent.path
46   );
47   const pdfjsLoadedPromise = BrowserTestUtils.browserLoaded(
48     tab.linkedBrowser,
49     false,
50     url => url.endsWith("test.pdf")
51   );
52   await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
53     content.document.querySelector("a[href$='test.pdf']").click();
54   });
55   await Promise.race([windowOpenedPromise, pdfjsLoadedPromise]);
56   ok(
57     !openedWindow,
58     "Shouldn't open an unknownContentType window for PDFs from file: links!"
59   );
61   await waitForSelector(
62     tab.linkedBrowser,
63     ".textLayer .endOfContent",
64     "Wait for text layer."
65   );
67   registerCleanupFunction(async () => {
68     if (listenerCleanup) {
69       listenerCleanup();
70     }
71     changeMimeHandler(oldAction[0], oldAction[1]);
72     await waitForPdfJSClose(tab.linkedBrowser, /* closeTab = */ true);
73   });
74 });
76 let listenerCleanup;
77 function addWindowListener(aURL, aCallback) {
78   let listener = {
79     onOpenWindow(aXULWindow) {
80       info("window opened, waiting for focus");
81       listenerCleanup();
82       listenerCleanup = null;
84       var domwindow = aXULWindow.docShell.domWindow;
85       waitForFocus(function () {
86         is(
87           domwindow.document.location.href,
88           aURL,
89           "should have seen the right window open"
90         );
91         domwindow.close();
92         aCallback();
93       }, domwindow);
94     },
95     onCloseWindow() {},
96   };
97   Services.wm.addListener(listener);
98   listenerCleanup = () => Services.wm.removeListener(listener);