jest-webextension-mock 4.1.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # jest-webextension-mock
2
2
 
3
+ ## 4.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - e8087a9: Add a mock for the `contextMenus` API (also exposed as `menus` for Firefox parity): `create`, `update`, `remove`, `removeAll`, `refresh`, `getTargetElement`, the `ACTION_MENU_TOP_LEVEL_LIMIT` constant, and the `onClicked`/`onShown`/`onHidden` events (#11).
8
+ - 25c1406: Flesh out the `webNavigation` mock: add the remaining events (`onBeforeNavigate`, `onCommitted`, `onDOMContentLoaded`, `onErrorOccurred`, `onCreatedNavigationTarget`, `onReferenceFragmentUpdated`, `onTabReplaced`) with full stateful listener tracking, and add `getFrame`/`getAllFrames` with the callback/promise dual pattern (#5).
9
+
3
10
  ## 4.1.1
4
11
 
5
12
  ### Patch Changes
package/dist/setup.js CHANGED
@@ -11,9 +11,9 @@ function _arrayWithHoles(r) {
11
11
  function _defineProperty(e, r, t) {
12
12
  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
13
13
  value: t,
14
- enumerable: !0,
15
- configurable: !0,
16
- writable: !0
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true
17
17
  }) : e[r] = t, e;
18
18
  }
19
19
  function _iterableToArrayLimit(r, l) {
@@ -24,15 +24,12 @@ function _iterableToArrayLimit(r, l) {
24
24
  i,
25
25
  u,
26
26
  a = [],
27
- f = !0,
28
- o = !1;
27
+ f = true,
28
+ o = false;
29
29
  try {
30
- if (i = (t = t.call(r)).next, 0 === l) {
31
- if (Object(t) !== t) return;
32
- f = !1;
33
- } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
30
+ if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
34
31
  } catch (r) {
35
- o = !0, n = r;
32
+ o = true, n = r;
36
33
  } finally {
37
34
  try {
38
35
  if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
@@ -59,7 +56,7 @@ function ownKeys(e, r) {
59
56
  function _objectSpread2(e) {
60
57
  for (var r = 1; r < arguments.length; r++) {
61
58
  var t = null != arguments[r] ? arguments[r] : {};
62
- r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
59
+ r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
63
60
  _defineProperty(e, r, t[r]);
64
61
  }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
65
62
  Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
@@ -74,7 +71,7 @@ function _toPrimitive(t, r) {
74
71
  if ("object" != typeof t || !t) return t;
75
72
  var e = t[Symbol.toPrimitive];
76
73
  if (void 0 !== e) {
77
- var i = e.call(t, r || "default");
74
+ var i = e.call(t, r);
78
75
  if ("object" != typeof i) return i;
79
76
  throw new TypeError("@@toPrimitive must return a primitive value.");
80
77
  }
@@ -247,6 +244,43 @@ var commands = {
247
244
  }
248
245
  };
249
246
 
247
+ var cbOrPromise$2 = function cbOrPromise(cb, value) {
248
+ if (cb !== undefined) {
249
+ return cb(value);
250
+ }
251
+ return Promise.resolve(value);
252
+ };
253
+ var generatedId = 0;
254
+ var create$1 = function create(createProperties, cb) {
255
+ var id = createProperties && createProperties.id !== undefined ? createProperties.id : "generated-id-".concat(++generatedId);
256
+ if (typeof cb === 'function') {
257
+ cb();
258
+ }
259
+ return id;
260
+ };
261
+ var contextMenus = {
262
+ ACTION_MENU_TOP_LEVEL_LIMIT: 6,
263
+ create: jest.fn(create$1),
264
+ update: jest.fn(function (id, updateProperties, cb) {
265
+ return cbOrPromise$2(cb);
266
+ }),
267
+ remove: jest.fn(function (menuItemId, cb) {
268
+ return cbOrPromise$2(cb);
269
+ }),
270
+ removeAll: jest.fn(function (cb) {
271
+ return cbOrPromise$2(cb);
272
+ }),
273
+ refresh: jest.fn(function (cb) {
274
+ return cbOrPromise$2(cb);
275
+ }),
276
+ getTargetElement: jest.fn(function () {
277
+ return null;
278
+ }),
279
+ onClicked: createEventListeners(),
280
+ onShown: createEventListeners(),
281
+ onHidden: createEventListeners()
282
+ };
283
+
250
284
  var cbOrPromise$1 = function cbOrPromise(cb, value) {
251
285
  if (cb !== undefined) {
252
286
  return cb(value);
@@ -415,6 +449,7 @@ var pageAction = {
415
449
  };
416
450
 
417
451
  // https://developer.chrome.com/extensions/permissions
452
+
418
453
  var permissions = {
419
454
  contains: jest.fn(),
420
455
  getAll: jest.fn(),
@@ -682,12 +717,27 @@ var tabs = {
682
717
  };
683
718
 
684
719
  var webNavigation = {
685
- onCompleted: {
686
- addListener: jest.fn()
687
- },
688
- onHistoryStateUpdated: {
689
- addListener: jest.fn()
690
- }
720
+ getFrame: jest.fn(function (details, cb) {
721
+ if (cb !== undefined) {
722
+ return cb(null);
723
+ }
724
+ return Promise.resolve(null);
725
+ }),
726
+ getAllFrames: jest.fn(function (details, cb) {
727
+ if (cb !== undefined) {
728
+ return cb([]);
729
+ }
730
+ return Promise.resolve([]);
731
+ }),
732
+ onBeforeNavigate: createEventListeners(),
733
+ onCommitted: createEventListeners(),
734
+ onDOMContentLoaded: createEventListeners(),
735
+ onCompleted: createEventListeners(),
736
+ onErrorOccurred: createEventListeners(),
737
+ onCreatedNavigationTarget: createEventListeners(),
738
+ onReferenceFragmentUpdated: createEventListeners(),
739
+ onTabReplaced: createEventListeners(),
740
+ onHistoryStateUpdated: createEventListeners()
691
741
  };
692
742
 
693
743
  globalThis[Symbol["for"]('jest-webextension-mock')] = _objectSpread2({
@@ -698,6 +748,9 @@ var chrome = {
698
748
  alarms: alarms,
699
749
  browserAction: browserAction,
700
750
  commands: commands,
751
+ contextMenus: contextMenus,
752
+ menus: contextMenus,
753
+ // Firefox exposes the same API as `menus`
701
754
  downloads: downloads,
702
755
  extension: extension,
703
756
  geckoProfiler: geckoProfiler,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jest-webextension-mock",
3
- "version": "4.1.1",
3
+ "version": "4.2.0",
4
4
  "description": "Mock the components of a WebExtension",
5
5
  "main": "dist/setup.js",
6
6
  "module": "src/setup.js",
@@ -28,18 +28,18 @@
28
28
  "release": "changeset version"
29
29
  },
30
30
  "devDependencies": {
31
- "@rollup/plugin-babel": "^6.0.0",
32
- "@rollup/plugin-node-resolve": "^15.0.0",
33
31
  "@babel/core": "^7.29.0",
34
32
  "@babel/preset-env": "^7.29.0",
35
33
  "@changesets/cli": "^2.29.8",
34
+ "@rollup/plugin-babel": "^7.1.0",
35
+ "@rollup/plugin-node-resolve": "^16.0.3",
36
36
  "babel-jest": "^29.7.0",
37
37
  "eslint": "^9.39.3",
38
38
  "eslint-config-prettier": "^9.1.2",
39
39
  "eslint-plugin-prettier": "^5.5.5",
40
40
  "jest": "^29.7.0",
41
41
  "prettier": "^3.8.1",
42
- "rollup": "^2.80.0"
42
+ "rollup": "^4.62.2"
43
43
  },
44
44
  "jest": {
45
45
  "bail": true,
@@ -0,0 +1,37 @@
1
+ import { createEventListeners } from './createEventListeners';
2
+
3
+ const cbOrPromise = (cb, value) => {
4
+ if (cb !== undefined) {
5
+ return cb(value);
6
+ }
7
+
8
+ return Promise.resolve(value);
9
+ };
10
+
11
+ let generatedId = 0;
12
+
13
+ const create = (createProperties, cb) => {
14
+ const id =
15
+ createProperties && createProperties.id !== undefined
16
+ ? createProperties.id
17
+ : `generated-id-${++generatedId}`;
18
+
19
+ if (typeof cb === 'function') {
20
+ cb();
21
+ }
22
+
23
+ return id;
24
+ };
25
+
26
+ export const contextMenus = {
27
+ ACTION_MENU_TOP_LEVEL_LIMIT: 6,
28
+ create: jest.fn(create),
29
+ update: jest.fn((id, updateProperties, cb) => cbOrPromise(cb)),
30
+ remove: jest.fn((menuItemId, cb) => cbOrPromise(cb)),
31
+ removeAll: jest.fn((cb) => cbOrPromise(cb)),
32
+ refresh: jest.fn((cb) => cbOrPromise(cb)),
33
+ getTargetElement: jest.fn(() => null),
34
+ onClicked: createEventListeners(),
35
+ onShown: createEventListeners(),
36
+ onHidden: createEventListeners(),
37
+ };
package/src/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { alarms } from './alarms';
2
2
  import { browserAction } from './browserAction';
3
3
  import { commands } from './commands';
4
+ import { contextMenus } from './contextMenus';
4
5
  import { downloads } from './downloads';
5
6
  import { extension } from './extension';
6
7
  import { geckoProfiler } from './geckoProfiler';
@@ -24,6 +25,8 @@ const chrome = {
24
25
  alarms,
25
26
  browserAction,
26
27
  commands,
28
+ contextMenus,
29
+ menus: contextMenus, // Firefox exposes the same API as `menus`
27
30
  downloads,
28
31
  extension,
29
32
  geckoProfiler,
@@ -1,8 +1,25 @@
1
+ import { createEventListeners } from './createEventListeners';
2
+
1
3
  export const webNavigation = {
2
- onCompleted: {
3
- addListener: jest.fn(),
4
- },
5
- onHistoryStateUpdated: {
6
- addListener: jest.fn(),
7
- },
4
+ getFrame: jest.fn((details, cb) => {
5
+ if (cb !== undefined) {
6
+ return cb(null);
7
+ }
8
+ return Promise.resolve(null);
9
+ }),
10
+ getAllFrames: jest.fn((details, cb) => {
11
+ if (cb !== undefined) {
12
+ return cb([]);
13
+ }
14
+ return Promise.resolve([]);
15
+ }),
16
+ onBeforeNavigate: createEventListeners(),
17
+ onCommitted: createEventListeners(),
18
+ onDOMContentLoaded: createEventListeners(),
19
+ onCompleted: createEventListeners(),
20
+ onErrorOccurred: createEventListeners(),
21
+ onCreatedNavigationTarget: createEventListeners(),
22
+ onReferenceFragmentUpdated: createEventListeners(),
23
+ onTabReplaced: createEventListeners(),
24
+ onHistoryStateUpdated: createEventListeners(),
8
25
  };