Bug 1753131 - use MediaManager device list change coalescing for MediaDevices r=jib
[gecko.git] / testing / modules / AppData.jsm
blob318b40fc60c173ed9d76e8752105d507e0d807df
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/. */
5 "use strict";
7 var EXPORTED_SYMBOLS = ["makeFakeAppDir"];
9 const { OS } = ChromeUtils.import("resource://gre/modules/osfile.jsm");
10 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
12 // Reference needed in order for fake app dir provider to be active.
13 var gFakeAppDirectoryProvider;
15 /**
16  * Installs a fake UAppData directory.
17  *
18  * This is needed by tests because a UAppData directory typically isn't
19  * present in the test environment.
20  *
21  * We create the new UAppData directory under the profile's directory
22  * because the profile directory is automatically cleaned as part of
23  * test shutdown.
24  *
25  * This returns a promise that will be resolved once the new directory
26  * is created and installed.
27  */
28 var makeFakeAppDir = function() {
29   let dirMode = OS.Constants.libc.S_IRWXU;
30   let baseFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
31   let appD = baseFile.clone();
32   appD.append("UAppData");
34   if (gFakeAppDirectoryProvider) {
35     return Promise.resolve(appD.path);
36   }
38   function makeDir(f) {
39     if (f.exists()) {
40       return;
41     }
43     dump("Creating directory: " + f.path + "\n");
44     f.create(Ci.nsIFile.DIRECTORY_TYPE, dirMode);
45   }
47   makeDir(appD);
49   let reportsD = appD.clone();
50   reportsD.append("Crash Reports");
52   let pendingD = reportsD.clone();
53   pendingD.append("pending");
54   let submittedD = reportsD.clone();
55   submittedD.append("submitted");
57   makeDir(reportsD);
58   makeDir(pendingD);
59   makeDir(submittedD);
61   let provider = {
62     getFile(prop, persistent) {
63       persistent.value = true;
64       if (prop == "UAppData") {
65         return appD.clone();
66       }
68       throw Components.Exception("", Cr.NS_ERROR_FAILURE);
69     },
71     QueryInterace(iid) {
72       if (
73         iid.equals(Ci.nsIDirectoryServiceProvider) ||
74         iid.equals(Ci.nsISupports)
75       ) {
76         return this;
77       }
79       throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
80     },
81   };
83   // Register the new provider.
84   Services.dirsvc.registerProvider(provider);
86   // And undefine the old one.
87   try {
88     Services.dirsvc.undefine("UAppData");
89   } catch (ex) {}
91   gFakeAppDirectoryProvider = provider;
93   dump("Successfully installed fake UAppDir\n");
94   return Promise.resolve(appD.path);