summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/test-helpers/shared-node-helpers.js
blob: ea8aece304fd237abe3d0c922f291eaa1162e418 (plain)
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,
};