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 +7 -0
- package/dist/setup.js +71 -18
- package/package.json +4 -4
- package/src/contextMenus.js +37 -0
- package/src/index.js +3 -0
- package/src/webNavigation.js +23 -6
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:
|
|
15
|
-
configurable:
|
|
16
|
-
writable:
|
|
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 =
|
|
28
|
-
o =
|
|
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 =
|
|
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),
|
|
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
|
|
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
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
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.
|
|
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": "^
|
|
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,
|
package/src/webNavigation.js
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
|
+
import { createEventListeners } from './createEventListeners';
|
|
2
|
+
|
|
1
3
|
export const webNavigation = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
};
|