AppData.sys.mjs (2354B)
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 // Reference needed in order for fake app dir provider to be active. 6 var gFakeAppDirectoryProvider; 7 8 /** 9 * Installs a fake UAppData directory. 10 * 11 * This is needed by tests because a UAppData directory typically isn't 12 * present in the test environment. 13 * 14 * We create the new UAppData directory under the profile's directory 15 * because the profile directory is automatically cleaned as part of 16 * test shutdown. 17 * 18 * This returns a promise that will be resolved once the new directory 19 * is created and installed. 20 */ 21 export var makeFakeAppDir = function () { 22 let dirMode = 0o700; 23 let baseFile = Services.dirsvc.get("ProfD", Ci.nsIFile); 24 let appD = baseFile.clone(); 25 appD.append("UAppData"); 26 27 if (gFakeAppDirectoryProvider) { 28 return Promise.resolve(appD.path); 29 } 30 31 function makeDir(f) { 32 if (f.exists()) { 33 return; 34 } 35 36 dump("Creating directory: " + f.path + "\n"); 37 f.create(Ci.nsIFile.DIRECTORY_TYPE, dirMode); 38 } 39 40 makeDir(appD); 41 42 let reportsD = appD.clone(); 43 reportsD.append("Crash Reports"); 44 45 let pendingD = reportsD.clone(); 46 pendingD.append("pending"); 47 let submittedD = reportsD.clone(); 48 submittedD.append("submitted"); 49 let eventsD = reportsD.clone(); 50 eventsD.append("events"); 51 52 makeDir(reportsD); 53 makeDir(pendingD); 54 makeDir(submittedD); 55 makeDir(eventsD); 56 57 let provider = { 58 getFile(prop, persistent) { 59 persistent.value = true; 60 if (prop == "UAppData") { 61 return appD.clone(); 62 } 63 64 throw Components.Exception( 65 "failed to get file: " + prop, 66 Cr.NS_ERROR_FAILURE 67 ); 68 }, 69 70 QueryInterace(iid) { 71 if ( 72 iid.equals(Ci.nsIDirectoryServiceProvider) || 73 iid.equals(Ci.nsISupports) 74 ) { 75 return this; 76 } 77 78 throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE); 79 }, 80 }; 81 82 // Register the new provider. 83 Services.dirsvc.registerProvider(provider); 84 85 // And undefine the old one. 86 try { 87 Services.dirsvc.undefine("UAppData"); 88 } catch (ex) {} 89 90 gFakeAppDirectoryProvider = provider; 91 92 dump("Successfully installed fake UAppDir\n"); 93 return Promise.resolve(appD.path); 94 };