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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/* global global */
/**
* Adds mocks for browser-environment global variables/methods to Node global.
*/
function setMocksInGlobal() {
global.Cc = {};
global.Ci = {
// sw states from
// mozilla-central/source/dom/interfaces/base/nsIServiceWorkerManager.idl
nsIServiceWorkerInfo: {
STATE_PARSED: 0,
STATE_INSTALLING: 1,
STATE_INSTALLED: 2,
STATE_ACTIVATING: 3,
STATE_ACTIVATED: 4,
STATE_REDUNDANT: 5,
STATE_UNKNOWN: 6,
},
};
global.Cu = {};
global.Services = require("Services-mock");
global.ChromeUtils = require("ChromeUtils-mock");
global.isWorker = false;
global.loader = {
lazyGetter: (context, name, fn) => {
const module = fn();
global[name] = module;
},
lazyRequireGetter: (context, names, module, destructure) => {
if (!Array.isArray(names)) {
names = [names];
}
for (const name of names) {
Object.defineProperty(global, name, {
get() {
const value = destructure
? require(module)[name]
: require(module || name);
return value;
},
configurable: true,
});
}
},
};
global.define = function() {};
// Used for the HTMLTooltip component.
// And set "isSystemPrincipal: false" because can't support XUL element in node.
global.document.nodePrincipal = {
isSystemPrincipal: false,
};
global.requestIdleCallback = function() {};
global.requestAnimationFrame = function(cb) {
cb();
return null;
};
// Mock getSelection
let selection;
global.getSelection = function() {
return {
toString: () => selection,
get type() {
if (selection === undefined) {
return "None";
}
if (selection === "") {
return "Caret";
}
return "Range";
},
setMockSelection: str => {
selection = str;
},
};
};
// Array#flatMap is only supported in Node 11+
if (!Array.prototype.flatMap) {
// eslint-disable-next-line no-extend-native
Array.prototype.flatMap = function(cb) {
return this.reduce((acc, x, i, arr) => {
return acc.concat(cb(x, i, arr));
}, []);
};
}
global.indexedDB = function() {
const store = {};
return {
open: () => ({}),
getItem: async key => store[key],
setItem: async (key, value) => {
store[key] = value;
},
};
};
if (typeof global.TextEncoder === "undefined") {
const { TextEncoder } = require("util");
global.TextEncoder = TextEncoder;
}
if (typeof global.TextDecoder === "undefined") {
const { TextDecoder } = require("util");
global.TextDecoder = TextDecoder;
}
}
module.exports = {
setMocksInGlobal,
};
|