browser_save_private_link_perwindowpb.js (3747B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 function createTemporarySaveDirectory() { 6 var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile); 7 saveDir.append("testsavedir"); 8 if (!saveDir.exists()) { 9 saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755); 10 } 11 return saveDir; 12 } 13 14 function promiseNoCacheEntry(filename) { 15 return new Promise(resolve => { 16 Visitor.prototype = { 17 onCacheStorageInfo(num) { 18 info("disk storage contains " + num + " entries"); 19 }, 20 onCacheEntryInfo(uri) { 21 let urispec = uri.asciiSpec; 22 info(urispec); 23 is( 24 urispec.includes(filename), 25 false, 26 "web content present in disk cache" 27 ); 28 }, 29 onCacheEntryVisitCompleted() { 30 resolve(); 31 }, 32 }; 33 function Visitor() {} 34 35 let storage = Services.cache2.diskCacheStorage( 36 Services.loadContextInfo.default 37 ); 38 storage.asyncVisitStorage(new Visitor(), true /* Do walk entries */); 39 }); 40 } 41 42 function promiseImageDownloaded() { 43 return new Promise(resolve => { 44 let fileName; 45 let MockFilePicker = SpecialPowers.MockFilePicker; 46 MockFilePicker.init(window.browsingContext); 47 48 function onTransferComplete(downloadSuccess) { 49 ok( 50 downloadSuccess, 51 "Image file should have been downloaded successfully " + fileName 52 ); 53 54 // Give the request a chance to finish and create a cache entry 55 resolve(fileName); 56 } 57 58 // Create the folder the image will be saved into. 59 var destDir = createTemporarySaveDirectory(); 60 var destFile = destDir.clone(); 61 62 MockFilePicker.displayDirectory = destDir; 63 MockFilePicker.showCallback = function (fp) { 64 fileName = fp.defaultString; 65 destFile.append(fileName); 66 MockFilePicker.setFiles([destFile]); 67 MockFilePicker.filterIndex = 1; // kSaveAsType_URL 68 }; 69 70 mockTransferCallback = onTransferComplete; 71 mockTransferRegisterer.register(); 72 73 registerCleanupFunction(function () { 74 mockTransferCallback = null; 75 mockTransferRegisterer.unregister(); 76 MockFilePicker.cleanup(); 77 destDir.remove(true); 78 }); 79 }); 80 } 81 82 add_setup(async function () { 83 await SpecialPowers.pushPrefEnv({ 84 set: [["test.wait300msAfterTabSwitch", true]], 85 }); 86 }); 87 88 add_task(async function () { 89 let testURI = 90 "http://mochi.test:8888/browser/browser/base/content/test/general/bug792517.html"; 91 let privateWindow = await BrowserTestUtils.openNewBrowserWindow({ 92 private: true, 93 }); 94 let tab = await BrowserTestUtils.openNewForegroundTab( 95 privateWindow.gBrowser, 96 testURI 97 ); 98 99 let contextMenu = privateWindow.document.getElementById( 100 "contentAreaContextMenu" 101 ); 102 let popupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown"); 103 let popupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden"); 104 await BrowserTestUtils.synthesizeMouseAtCenter( 105 "#img", 106 { 107 type: "contextmenu", 108 button: 2, 109 }, 110 tab.linkedBrowser 111 ); 112 await popupShown; 113 114 Services.cache2.clear(); 115 116 let imageDownloaded = promiseImageDownloaded(); 117 // Select "Save Image As" option from context menu 118 privateWindow.document.getElementById("context-saveimage").doCommand(); 119 120 contextMenu.hidePopup(); 121 await popupHidden; 122 123 // wait for image download 124 let fileName = await imageDownloaded; 125 await promiseNoCacheEntry(fileName); 126 127 await BrowserTestUtils.closeWindow(privateWindow); 128 }); 129 130 Services.scriptloader.loadSubScript( 131 "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js", 132 this 133 );