@omega.js/desktop 0.51.0 → 0.53.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/README.md +18 -13
- package/dist/assets/css/core/_initialize.scss +1 -1
- package/dist/assets/js/core/app-shell.js +14 -15
- package/dist/assets/themes/_template/_theme.js +6 -6
- package/dist/assets/themes/base/_includes/global/sections/account.html +4 -4
- package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +5 -5
- package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +3 -3
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +1 -1
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +1 -1
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +1 -1
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +2 -3
- package/dist/assets/themes/base/_sections/verts/unit/section.html +1 -1
- package/dist/assets/themes/base/_sections/verts/unit/section.js +3 -4
- package/dist/assets/themes/base/_theme.js +4 -3
- package/dist/assets/themes/bootstrap/_theme.js +2 -2
- package/dist/assets/themes/bootstrap/overrides/_links.scss +1 -1
- package/dist/assets/themes/classy/_theme.js +8 -6
- package/dist/assets/themes/classy/css/marketing/_sections.scss +1 -2
- package/dist/assets/themes/classy/js/hero-demo-form.js +3 -2
- package/dist/assets/themes/neobrutalism/_theme.js +5 -5
- package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +1 -1
- package/dist/assets/themes/newsflash/_theme.js +6 -6
- package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +1 -1
- package/dist/build.js +87 -111
- package/dist/cli.js +1 -1
- package/dist/commands/build.js +2 -2
- package/dist/commands/cdp/capture.js +2 -2
- package/dist/commands/cdp/quit.js +2 -2
- package/dist/commands/cdp/relaunch.js +2 -2
- package/dist/commands/cdp/theme.js +1 -1
- package/dist/commands/clean.js +2 -2
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/finalize-release.js +4 -4
- package/dist/commands/install.js +3 -3
- package/dist/commands/launch.js +2 -2
- package/dist/commands/lib/deploy-precheck.js +3 -3
- package/dist/commands/lib/ensure-target.js +6 -6
- package/dist/commands/package.js +2 -2
- package/dist/commands/publish.js +2 -2
- package/dist/commands/release.js +3 -3
- package/dist/commands/runner.js +145 -48
- package/dist/commands/sign-windows.js +5 -5
- package/dist/commands/test.js +4 -4
- package/dist/commands/update.js +2 -2
- package/dist/commands/validate-certs.js +4 -4
- package/dist/commands/version.js +3 -3
- package/dist/defaults/.github/workflows/build.yml +2 -0
- package/dist/defaults/AGENTS.md +17 -8
- package/dist/defaults/config/omega.json5 +7 -7
- package/dist/defaults/hooks/build/post.js +1 -1
- package/dist/defaults/hooks/build/pre.js +1 -1
- package/dist/defaults/hooks/deploy/pre.js +1 -1
- package/dist/defaults/hooks/release/post.js +1 -1
- package/dist/defaults/hooks/release/pre.js +1 -1
- package/dist/defaults/src/assets/js/components/about/index.js +3 -5
- package/dist/defaults/src/assets/js/components/main/index.js +3 -5
- package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
- package/dist/defaults/src/integrations/context-menu/index.js +2 -2
- package/dist/defaults/src/integrations/menu/index.js +3 -3
- package/dist/defaults/src/integrations/tray/index.js +3 -3
- package/dist/defaults/src/main.js +3 -5
- package/dist/defaults/src/preload.js +3 -5
- package/dist/defaults/test/README.md +2 -2
- package/dist/gulp/main.js +9 -10
- package/dist/gulp/tasks/audit.js +7 -7
- package/dist/gulp/tasks/build-config.js +8 -8
- package/dist/gulp/tasks/bundle.js +16 -16
- package/dist/gulp/tasks/defaults.js +3 -3
- package/dist/gulp/tasks/distribute.js +2 -2
- package/dist/gulp/tasks/html.js +9 -9
- package/dist/gulp/tasks/package-quick.js +3 -3
- package/dist/gulp/tasks/package.js +3 -3
- package/dist/gulp/tasks/release.js +3 -3
- package/dist/gulp/tasks/sass.js +6 -6
- package/dist/gulp/tasks/serve.js +4 -4
- package/dist/hooks/notarize-artifacts.js +1 -1
- package/dist/hooks/notarize.js +1 -1
- package/dist/index.js +5 -8
- package/dist/lib/_environment-mixin.js +50 -0
- package/dist/lib/_lifecycle-mixin.js +45 -0
- package/dist/lib/analytics.js +33 -35
- package/dist/lib/app-state.js +14 -14
- package/dist/lib/auth-flow.js +18 -18
- package/dist/lib/auth-persistence.js +12 -12
- package/dist/lib/auth.js +421 -0
- package/dist/lib/auto-updater.js +49 -49
- package/dist/lib/context-menu.js +13 -13
- package/dist/lib/context.js +19 -19
- package/dist/lib/deep-link.js +34 -34
- package/dist/lib/fontawesome.js +5 -5
- package/dist/lib/ipc.js +4 -4
- package/dist/lib/menu.js +25 -25
- package/dist/lib/protocol.js +5 -5
- package/dist/lib/remote-config.js +22 -22
- package/dist/lib/remote-scripts.js +21 -21
- package/dist/lib/restart-manager/index.js +28 -28
- package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
- package/dist/lib/sign-helpers/sign-events.js +1 -1
- package/dist/lib/startup.js +18 -13
- package/dist/lib/storage.js +10 -10
- package/dist/lib/templating.js +16 -16
- package/dist/lib/theme.js +10 -10
- package/dist/lib/tray.js +27 -27
- package/dist/lib/usage.js +11 -11
- package/dist/lib/window-manager.js +26 -26
- package/dist/main.js +398 -483
- package/dist/preload.js +236 -176
- package/dist/renderer.js +417 -391
- package/dist/runner/job-started.js +1 -1
- package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
- package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
- package/dist/test/fixtures/consumer-app/src/main.js +5 -7
- package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
- package/dist/test/harness/boot-entry.js +22 -20
- package/dist/test/harness/main-entry.js +31 -30
- package/dist/test/harness/renderer-entry.js +5 -5
- package/dist/test/harness/renderer-preload.js +137 -141
- package/dist/test/index.js +10 -10
- package/dist/test/runner.js +2 -2
- package/dist/test/runners/boot.js +7 -6
- package/dist/test/runners/electron.js +3 -2
- package/dist/test/runners/render-event.js +2 -2
- package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
- package/dist/test/suites/boot/restart-manager.test.js +2 -2
- package/dist/test/suites/boot/storage-bundled.test.js +5 -5
- package/dist/test/suites/boot/theme.test.js +13 -13
- package/dist/test/suites/build/audit.test.js +1 -1
- package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
- package/dist/test/suites/build/boot-fixture.test.js +2 -2
- package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
- package/dist/test/suites/build/brand-scss.test.js +1 -1
- package/dist/test/suites/build/build-json-bake.test.js +1 -1
- package/dist/test/suites/build/cli.test.js +2 -2
- package/dist/test/suites/build/config-schema.test.js +5 -5
- package/dist/test/suites/build/defaults-scaffold.test.js +2 -2
- package/dist/test/suites/build/deploy-hook.test.js +3 -3
- package/dist/test/suites/build/ensure-target.test.js +2 -2
- package/dist/test/suites/build/env-delivery.test.js +2 -2
- package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
- package/dist/test/suites/build/exports.test.js +9 -8
- package/dist/test/suites/build/get-config.test.js +4 -4
- package/dist/test/suites/build/manifest-deps.test.js +1 -1
- package/dist/test/suites/build/merge-line-files.test.js +1 -1
- package/dist/test/suites/build/omega-shell.test.js +34 -2
- package/dist/test/suites/build/omega.test.js +350 -0
- package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
- package/dist/test/suites/build/runner.test.js +612 -5
- package/dist/test/suites/build/sentry.test.js +2 -2
- package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
- package/dist/test/suites/build/templating.test.js +3 -3
- package/dist/test/suites/build/test-stealth.test.js +7 -9
- package/dist/test/suites/build/url-helpers.test.js +55 -56
- package/dist/test/suites/build/validate-config.test.js +2 -2
- package/dist/test/suites/build/wave5-pins.test.js +2 -2
- package/dist/test/suites/main/analytics.test.js +59 -59
- package/dist/test/suites/main/app-state.test.js +66 -66
- package/dist/test/suites/main/auth-flow.test.js +41 -41
- package/dist/test/suites/main/auth-persistence.test.js +54 -43
- package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
- package/dist/test/suites/main/auth.test.js +336 -0
- package/dist/test/suites/main/auto-updater.test.js +134 -134
- package/dist/test/suites/main/boot-sequence.test.js +37 -49
- package/dist/test/suites/main/context-menu.test.js +51 -50
- package/dist/test/suites/main/context.test.js +25 -25
- package/dist/test/suites/main/deep-link.test.js +74 -74
- package/dist/test/suites/main/fontawesome.test.js +27 -27
- package/dist/test/suites/main/ipc.test.js +35 -35
- package/dist/test/suites/main/menu.test.js +101 -100
- package/dist/test/suites/main/protocol.test.js +19 -19
- package/dist/test/suites/main/remote-config.test.js +63 -63
- package/dist/test/suites/main/remote-scripts.test.js +103 -103
- package/dist/test/suites/main/request.test.js +71 -0
- package/dist/test/suites/main/restart-manager.test.js +33 -33
- package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
- package/dist/test/suites/main/startup.test.js +26 -26
- package/dist/test/suites/main/stealth-window.test.js +1 -1
- package/dist/test/suites/main/storage.test.js +25 -25
- package/dist/test/suites/main/theme.test.js +34 -34
- package/dist/test/suites/main/tray.test.js +79 -79
- package/dist/test/suites/main/url-helpers.test.js +133 -133
- package/dist/test/suites/main/usage.test.js +25 -25
- package/dist/test/suites/main/window-bounds.test.js +27 -27
- package/dist/test/suites/main/window-manager.test.js +44 -44
- package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
- package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
- package/dist/test/suites/renderer/round-trip.test.js +3 -3
- package/dist/test/suites/renderer/tooltips.test.js +15 -15
- package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +27 -7
- package/dist/test/utils/extended-mode-warning.js +1 -1
- package/dist/utils/boot-harness.js +56 -0
- package/dist/utils/mode-helpers.js +2 -15
- package/dist/utils/ship-keys.js +3 -3
- package/dist/utils/signing-status.js +51 -0
- package/dist/utils/test-events.js +7 -0
- package/dist/utils/test-stealth.js +6 -6
- package/dist/utils/url-helpers.js +52 -42
- package/dist/utils/user-agent.js +44 -0
- package/dist/vendor/account/engine.js +3 -3
- package/dist/vendor/account/index.js +14 -45
- package/dist/vendor/account/resolve-account.js +44 -0
- package/dist/vendor/account/schema.js +1 -1
- package/dist/vendor/account/user.js +99 -0
- package/dist/vendor/config/client-config.js +1 -1
- package/dist/vendor/config/environment.js +11 -30
- package/dist/vendor/config/index.js +13 -12
- package/dist/vendor/config/load.js +1 -2
- package/dist/vendor/config/platforms.js +1 -1
- package/dist/vendor/config/repo.js +24 -0
- package/dist/vendor/config/retired-keys.js +2 -2
- package/dist/vendor/config/schema.js +5 -8
- package/dist/vendor/config/site-global.js +2 -3
- package/dist/vendor/config/validate.js +1 -2
- package/dist/vendor/config/winback.js +1 -1
- package/dist/vendor/devkit/actions-secrets.js +1 -1
- package/dist/vendor/devkit/attach-log-file.js +1 -1
- package/dist/vendor/devkit/brand-version.js +162 -1
- package/dist/vendor/devkit/build-json.js +1 -1
- package/dist/vendor/devkit/cli-router.js +3 -4
- package/dist/vendor/devkit/defaults-engine.js +9 -11
- package/dist/vendor/devkit/deploy.js +64 -4
- package/dist/vendor/devkit/git-remote.js +78 -1
- package/dist/vendor/devkit/local.js +53 -3
- package/dist/vendor/devkit/lockfile.js +127 -0
- package/dist/vendor/devkit/merge-line-files.js +2 -3
- package/dist/vendor/devkit/pack-local.js +4 -7
- package/dist/vendor/devkit/preludes/origin-heal.js +35 -49
- package/dist/vendor/devkit/target-secrets.js +34 -45
- package/dist/vendor/devkit/test/runner-core.js +6 -6
- package/dist/vendor/monitoring/env.js +2 -2
- package/dist/vendor/monitoring/index.js +1 -1
- package/dist/vendor/monitoring/main.js +1 -1
- package/dist/vendor/monitoring/preload.js +1 -1
- package/dist/vendor/monitoring/renderer.js +1 -1
- package/docs/analytics.md +8 -8
- package/docs/app-state.md +19 -19
- package/docs/audit.md +4 -4
- package/docs/{client-bridge.md → auth.md} +88 -73
- package/docs/auto-updater.md +8 -8
- package/docs/boot-sequence.md +11 -6
- package/docs/build-system.md +1 -1
- package/docs/cdp-debugging.md +1 -1
- package/docs/common-mistakes.md +7 -7
- package/docs/config-schema.md +1 -1
- package/docs/context-menu.md +13 -13
- package/docs/context.md +11 -11
- package/docs/css.md +3 -9
- package/docs/deep-link.md +25 -25
- package/docs/environment-detection.md +16 -16
- package/docs/fontawesome.md +7 -5
- package/docs/hooks.md +8 -8
- package/docs/index.md +39 -28
- package/docs/ipc.md +10 -10
- package/docs/lib-modules.md +9 -9
- package/docs/logging.md +12 -14
- package/docs/menu.md +18 -18
- package/docs/releasing.md +4 -2
- package/docs/remote-config.md +9 -9
- package/docs/remote-scripts.md +12 -12
- package/docs/restart-manager.md +8 -8
- package/docs/runner.md +12 -10
- package/docs/sentry.md +4 -4
- package/docs/shared/analytics.md +1 -1
- package/docs/shared/brands.md +1 -1
- package/docs/shared/breaking-changes.md +79 -13
- package/docs/shared/config.md +24 -21
- package/docs/shared/deploys.md +30 -7
- package/docs/shared/local-dev.md +5 -3
- package/docs/shared/logging.md +1 -1
- package/docs/shared/monitoring.md +5 -5
- package/docs/shared/testing.md +2 -2
- package/docs/shared/theming.md +1 -1
- package/docs/shared/translation.md +19 -10
- package/docs/signing.md +1 -1
- package/docs/startup.md +16 -16
- package/docs/storage.md +11 -11
- package/docs/templating.md +3 -3
- package/docs/test-boot-layer.md +12 -12
- package/docs/test-framework.md +17 -17
- package/docs/themes.md +7 -7
- package/docs/tooltips.md +2 -2
- package/docs/tray.md +31 -31
- package/docs/usage.md +7 -7
- package/docs/verts.md +1 -1
- package/docs/windows.md +22 -22
- package/package.json +3 -4
- package/dist/lib/client-bridge.js +0 -374
- package/dist/lib/logger.js +0 -4
- package/dist/test/suites/build/manager.test.js +0 -213
- package/dist/test/suites/main/client-bridge.test.js +0 -262
|
@@ -14,13 +14,13 @@ module.exports = defineCases({
|
|
|
14
14
|
layer: 'main',
|
|
15
15
|
description: 'tray (main)',
|
|
16
16
|
cleanup: (ctx) => {
|
|
17
|
-
ctx.
|
|
17
|
+
ctx.omega.tray.destroy();
|
|
18
18
|
},
|
|
19
19
|
tests: [
|
|
20
20
|
{
|
|
21
21
|
name: 'initialize ran (enabled by default)',
|
|
22
22
|
run: (ctx) => {
|
|
23
|
-
ctx.expect(ctx.
|
|
23
|
+
ctx.expect(ctx.omega.tray._initialized).toBe(true);
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
26
|
{
|
|
@@ -29,7 +29,7 @@ module.exports = defineCases({
|
|
|
29
29
|
// With or without a consumer file, items is a non-empty array — consumer file
|
|
30
30
|
// declares what it wants; absent consumer → @omega.js/desktop ships its default template
|
|
31
31
|
// (title, open, check-for-updates, quit, ...).
|
|
32
|
-
const items = ctx.
|
|
32
|
+
const items = ctx.omega.tray.getItems();
|
|
33
33
|
ctx.expect(Array.isArray(items)).toBe(true);
|
|
34
34
|
ctx.expect(items.length).toBeGreaterThan(0);
|
|
35
35
|
},
|
|
@@ -37,41 +37,41 @@ module.exports = defineCases({
|
|
|
37
37
|
{
|
|
38
38
|
name: 'define() runs the builder fn and stores items',
|
|
39
39
|
run: (ctx) => {
|
|
40
|
-
ctx.
|
|
40
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
41
41
|
tray.tooltip('TestApp');
|
|
42
42
|
tray.item({ label: 'Hello', click: () => {} });
|
|
43
43
|
tray.separator();
|
|
44
44
|
tray.item({ label: 'World', click: () => {} });
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
const items = ctx.
|
|
47
|
+
const items = ctx.omega.tray.getItems();
|
|
48
48
|
ctx.expect(items.length).toBe(3);
|
|
49
49
|
ctx.expect(items[0].label).toBe('Hello');
|
|
50
50
|
ctx.expect(items[1].type).toBe('separator');
|
|
51
51
|
ctx.expect(items[2].label).toBe('World');
|
|
52
|
-
ctx.expect(ctx.
|
|
52
|
+
ctx.expect(ctx.omega.tray.getTooltip()).toBe('TestApp');
|
|
53
53
|
},
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
name: 'define() throws on non-function input',
|
|
57
57
|
run: (ctx) => {
|
|
58
|
-
ctx.expect(() => ctx.
|
|
59
|
-
ctx.expect(() => ctx.
|
|
58
|
+
ctx.expect(() => ctx.omega.tray.define(null)).toThrow(/must be a function/);
|
|
59
|
+
ctx.expect(() => ctx.omega.tray.define('nope')).toThrow(/must be a function/);
|
|
60
60
|
},
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
name: 'define() replaces previous items (not append)',
|
|
64
64
|
run: (ctx) => {
|
|
65
|
-
ctx.
|
|
65
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
66
66
|
tray.item({ label: 'First' });
|
|
67
67
|
});
|
|
68
|
-
ctx.expect(ctx.
|
|
68
|
+
ctx.expect(ctx.omega.tray.getItems().length).toBe(1);
|
|
69
69
|
|
|
70
|
-
ctx.
|
|
70
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
71
71
|
tray.item({ label: 'Second' });
|
|
72
72
|
tray.item({ label: 'Third' });
|
|
73
73
|
});
|
|
74
|
-
const items = ctx.
|
|
74
|
+
const items = ctx.omega.tray.getItems();
|
|
75
75
|
ctx.expect(items.length).toBe(2);
|
|
76
76
|
ctx.expect(items[0].label).toBe('Second');
|
|
77
77
|
},
|
|
@@ -79,46 +79,46 @@ module.exports = defineCases({
|
|
|
79
79
|
{
|
|
80
80
|
name: 'addItem appends without nuking existing items',
|
|
81
81
|
run: (ctx) => {
|
|
82
|
-
ctx.
|
|
82
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
83
83
|
tray.item({ label: 'A' });
|
|
84
84
|
tray.item({ label: 'B' });
|
|
85
85
|
});
|
|
86
|
-
ctx.
|
|
87
|
-
const labels = ctx.
|
|
86
|
+
ctx.omega.tray.addItem({ label: 'C' });
|
|
87
|
+
const labels = ctx.omega.tray.getItems().map((i) => i.label);
|
|
88
88
|
ctx.expect(labels).toEqual(['A', 'B', 'C']);
|
|
89
89
|
},
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
92
|
name: 'clearItems empties the list',
|
|
93
93
|
run: (ctx) => {
|
|
94
|
-
ctx.
|
|
95
|
-
ctx.
|
|
96
|
-
ctx.expect(ctx.
|
|
94
|
+
ctx.omega.tray.addItem({ label: 'X' });
|
|
95
|
+
ctx.omega.tray.clearItems();
|
|
96
|
+
ctx.expect(ctx.omega.tray.getItems()).toEqual([]);
|
|
97
97
|
},
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
name: 'setIcon / setTooltip update state',
|
|
101
101
|
run: (ctx) => {
|
|
102
|
-
ctx.
|
|
103
|
-
ctx.
|
|
104
|
-
ctx.expect(ctx.
|
|
105
|
-
ctx.expect(ctx.
|
|
102
|
+
ctx.omega.tray.setIcon('/tmp/some-icon.png');
|
|
103
|
+
ctx.omega.tray.setTooltip('Hover me');
|
|
104
|
+
ctx.expect(ctx.omega.tray.getIcon()).toBe('/tmp/some-icon.png');
|
|
105
|
+
ctx.expect(ctx.omega.tray.getTooltip()).toBe('Hover me');
|
|
106
106
|
},
|
|
107
107
|
},
|
|
108
108
|
{
|
|
109
109
|
name: 'dynamic label functions are evaluated on refresh',
|
|
110
110
|
run: (ctx) => {
|
|
111
111
|
let count = 0;
|
|
112
|
-
ctx.
|
|
112
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
113
113
|
tray.item({ label: () => `Count: ${count}` });
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
// Resolve internally to confirm the fn is called.
|
|
117
|
-
const resolved1 = ctx.
|
|
117
|
+
const resolved1 = ctx.omega.tray._resolveItem(ctx.omega.tray.getItems()[0]);
|
|
118
118
|
ctx.expect(resolved1.label).toBe('Count: 0');
|
|
119
119
|
|
|
120
120
|
count = 5;
|
|
121
|
-
const resolved2 = ctx.
|
|
121
|
+
const resolved2 = ctx.omega.tray._resolveItem(ctx.omega.tray.getItems()[0]);
|
|
122
122
|
ctx.expect(resolved2.label).toBe('Count: 5');
|
|
123
123
|
},
|
|
124
124
|
},
|
|
@@ -126,11 +126,11 @@ module.exports = defineCases({
|
|
|
126
126
|
name: 'click handlers are wrapped to catch errors',
|
|
127
127
|
run: (ctx) => {
|
|
128
128
|
let called = false;
|
|
129
|
-
ctx.
|
|
129
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
130
130
|
tray.item({ label: 'Boom', click: () => { called = true; throw new Error('boom'); } });
|
|
131
131
|
});
|
|
132
132
|
|
|
133
|
-
const resolved = ctx.
|
|
133
|
+
const resolved = ctx.omega.tray._resolveItem(ctx.omega.tray.getItems()[0]);
|
|
134
134
|
ctx.expect(typeof resolved.click).toBe('function');
|
|
135
135
|
|
|
136
136
|
// Invoking the wrapped click must NOT throw, even though the handler does.
|
|
@@ -141,17 +141,17 @@ module.exports = defineCases({
|
|
|
141
141
|
{
|
|
142
142
|
name: 'separator descriptor resolves to {type:"separator"}',
|
|
143
143
|
run: (ctx) => {
|
|
144
|
-
ctx.
|
|
144
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
145
145
|
tray.separator();
|
|
146
146
|
});
|
|
147
|
-
const resolved = ctx.
|
|
147
|
+
const resolved = ctx.omega.tray._resolveItem(ctx.omega.tray.getItems()[0]);
|
|
148
148
|
ctx.expect(resolved).toEqual({ type: 'separator' });
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
151
|
{
|
|
152
152
|
name: 'submenu items are recursively resolved',
|
|
153
153
|
run: (ctx) => {
|
|
154
|
-
ctx.
|
|
154
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
155
155
|
tray.item({
|
|
156
156
|
label: 'Parent',
|
|
157
157
|
submenu: [
|
|
@@ -160,7 +160,7 @@ module.exports = defineCases({
|
|
|
160
160
|
],
|
|
161
161
|
});
|
|
162
162
|
});
|
|
163
|
-
const resolved = ctx.
|
|
163
|
+
const resolved = ctx.omega.tray._resolveItem(ctx.omega.tray.getItems()[0]);
|
|
164
164
|
ctx.expect(resolved.label).toBe('Parent');
|
|
165
165
|
ctx.expect(Array.isArray(resolved.submenu)).toBe(true);
|
|
166
166
|
ctx.expect(resolved.submenu[0].label).toBe('Dyn child');
|
|
@@ -174,22 +174,22 @@ module.exports = defineCases({
|
|
|
174
174
|
// We don't assert isRendered() because @omega.js/desktop auto-resolves an icon at init time, so
|
|
175
175
|
// tray._tray may already exist from earlier — refresh() with null _icon just
|
|
176
176
|
// skips the re-render but leaves the existing Tray instance alone.
|
|
177
|
-
ctx.
|
|
177
|
+
ctx.omega.tray._icon = null;
|
|
178
178
|
// Should not throw.
|
|
179
|
-
ctx.
|
|
179
|
+
ctx.omega.tray.refresh();
|
|
180
180
|
},
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
|
-
name: 'consumer function receives
|
|
183
|
+
name: 'consumer function receives omega + tray builder (incl. id-path API)',
|
|
184
184
|
run: (ctx) => {
|
|
185
|
-
let
|
|
185
|
+
let receivedOmega;
|
|
186
186
|
let receivedTray;
|
|
187
|
-
ctx.
|
|
188
|
-
|
|
187
|
+
ctx.omega.tray.define((arg) => {
|
|
188
|
+
receivedOmega = arg.omega;
|
|
189
189
|
receivedTray = arg.tray;
|
|
190
190
|
arg.tray.item({ label: 'probe' });
|
|
191
191
|
});
|
|
192
|
-
ctx.expect(
|
|
192
|
+
ctx.expect(receivedOmega).toBe(ctx.omega);
|
|
193
193
|
ctx.expect(typeof receivedTray.icon).toBe('function');
|
|
194
194
|
ctx.expect(typeof receivedTray.tooltip).toBe('function');
|
|
195
195
|
ctx.expect(typeof receivedTray.item).toBe('function');
|
|
@@ -205,38 +205,38 @@ module.exports = defineCases({
|
|
|
205
205
|
{
|
|
206
206
|
name: 'useDefaults() ships an id-tagged template (open, quit, ...)',
|
|
207
207
|
run: (ctx) => {
|
|
208
|
-
ctx.
|
|
209
|
-
ctx.expect(ctx.
|
|
210
|
-
ctx.expect(ctx.
|
|
211
|
-
ctx.expect(ctx.
|
|
208
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
209
|
+
ctx.expect(ctx.omega.tray.find('open')).toBeTruthy();
|
|
210
|
+
ctx.expect(ctx.omega.tray.find('quit')).toBeTruthy();
|
|
211
|
+
ctx.expect(ctx.omega.tray.find('check-for-updates')).toBeTruthy();
|
|
212
212
|
},
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
name: 'tray.update patches an item by id-path',
|
|
216
216
|
run: (ctx) => {
|
|
217
|
-
ctx.
|
|
218
|
-
const ok = ctx.
|
|
217
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
218
|
+
const ok = ctx.omega.tray.update('quit', { label: 'GOODBYE' });
|
|
219
219
|
ctx.expect(ok).toBe(true);
|
|
220
|
-
ctx.expect(ctx.
|
|
220
|
+
ctx.expect(ctx.omega.tray.find('quit').label).toBe('GOODBYE');
|
|
221
221
|
},
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
name: 'tray.remove deletes an item by id-path',
|
|
225
225
|
run: (ctx) => {
|
|
226
|
-
ctx.
|
|
227
|
-
ctx.expect(ctx.
|
|
228
|
-
const ok = ctx.
|
|
226
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
227
|
+
ctx.expect(ctx.omega.tray.find('check-for-updates')).toBeTruthy();
|
|
228
|
+
const ok = ctx.omega.tray.remove('check-for-updates');
|
|
229
229
|
ctx.expect(ok).toBe(true);
|
|
230
|
-
ctx.expect(ctx.
|
|
230
|
+
ctx.expect(ctx.omega.tray.find('check-for-updates')).toBe(null);
|
|
231
231
|
},
|
|
232
232
|
},
|
|
233
233
|
{
|
|
234
234
|
name: 'tray.insertAfter splices a new sibling',
|
|
235
235
|
run: (ctx) => {
|
|
236
|
-
ctx.
|
|
237
|
-
const ok = ctx.
|
|
236
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
237
|
+
const ok = ctx.omega.tray.insertAfter('open', { id: 'probe', label: 'PROBE' });
|
|
238
238
|
ctx.expect(ok).toBe(true);
|
|
239
|
-
const items = ctx.
|
|
239
|
+
const items = ctx.omega.tray.getItems();
|
|
240
240
|
const openIdx = items.findIndex((i) => i.id === 'open');
|
|
241
241
|
ctx.expect(items[openIdx + 1].id).toBe('probe');
|
|
242
242
|
},
|
|
@@ -244,32 +244,32 @@ module.exports = defineCases({
|
|
|
244
244
|
{
|
|
245
245
|
name: 'tray.hide / tray.enable / tray.show are sugar over update',
|
|
246
246
|
run: (ctx) => {
|
|
247
|
-
ctx.
|
|
248
|
-
ctx.
|
|
249
|
-
ctx.expect(ctx.
|
|
250
|
-
ctx.
|
|
251
|
-
ctx.expect(ctx.
|
|
252
|
-
ctx.
|
|
253
|
-
ctx.expect(ctx.
|
|
254
|
-
ctx.
|
|
255
|
-
ctx.expect(ctx.
|
|
247
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
248
|
+
ctx.omega.tray.hide('quit');
|
|
249
|
+
ctx.expect(ctx.omega.tray.find('quit').visible).toBe(false);
|
|
250
|
+
ctx.omega.tray.show('quit');
|
|
251
|
+
ctx.expect(ctx.omega.tray.find('quit').visible).toBe(true);
|
|
252
|
+
ctx.omega.tray.enable('quit', false);
|
|
253
|
+
ctx.expect(ctx.omega.tray.find('quit').enabled).toBe(false);
|
|
254
|
+
ctx.omega.tray.enable('quit');
|
|
255
|
+
ctx.expect(ctx.omega.tray.find('quit').enabled).toBe(true);
|
|
256
256
|
},
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
name: 'tray.has reports presence',
|
|
260
260
|
run: (ctx) => {
|
|
261
|
-
ctx.
|
|
262
|
-
ctx.expect(ctx.
|
|
263
|
-
ctx.expect(ctx.
|
|
261
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
262
|
+
ctx.expect(ctx.omega.tray.has('quit')).toBe(true);
|
|
263
|
+
ctx.expect(ctx.omega.tray.has('does-not-exist')).toBe(false);
|
|
264
264
|
},
|
|
265
265
|
},
|
|
266
266
|
{
|
|
267
267
|
name: 'tray.insertBefore splices a new sibling',
|
|
268
268
|
run: (ctx) => {
|
|
269
|
-
ctx.
|
|
270
|
-
const ok = ctx.
|
|
269
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
270
|
+
const ok = ctx.omega.tray.insertBefore('quit', { id: 'before-quit', label: 'BEFORE' });
|
|
271
271
|
ctx.expect(ok).toBe(true);
|
|
272
|
-
const items = ctx.
|
|
272
|
+
const items = ctx.omega.tray.getItems();
|
|
273
273
|
const quitIdx = items.findIndex((i) => i.id === 'quit');
|
|
274
274
|
ctx.expect(items[quitIdx - 1].id).toBe('before-quit');
|
|
275
275
|
},
|
|
@@ -277,42 +277,42 @@ module.exports = defineCases({
|
|
|
277
277
|
{
|
|
278
278
|
name: 'tray.appendTo pushes into a submenu (creates one if absent)',
|
|
279
279
|
run: (ctx) => {
|
|
280
|
-
ctx.
|
|
280
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
281
281
|
tray.item({ id: 'parent', label: 'Parent' });
|
|
282
282
|
});
|
|
283
|
-
const ok = ctx.
|
|
283
|
+
const ok = ctx.omega.tray.appendTo('parent', { id: 'child', label: 'Child' });
|
|
284
284
|
ctx.expect(ok).toBe(true);
|
|
285
|
-
const parent = ctx.
|
|
285
|
+
const parent = ctx.omega.tray.find('parent');
|
|
286
286
|
ctx.expect(Array.isArray(parent.submenu)).toBe(true);
|
|
287
287
|
ctx.expect(parent.submenu[0].id).toBe('child');
|
|
288
288
|
// Resolves a nested id-path too:
|
|
289
|
-
ctx.expect(ctx.
|
|
289
|
+
ctx.expect(ctx.omega.tray.find('parent/child').label).toBe('Child');
|
|
290
290
|
},
|
|
291
291
|
},
|
|
292
292
|
{
|
|
293
293
|
name: 'tray submenu items resolvable by parent/child path',
|
|
294
294
|
run: (ctx) => {
|
|
295
|
-
ctx.
|
|
295
|
+
ctx.omega.tray.define(({ tray }) => {
|
|
296
296
|
tray.item({ id: 'account', label: 'Account', submenu: [
|
|
297
297
|
{ id: 'sign-out', label: 'Sign out' },
|
|
298
298
|
]});
|
|
299
299
|
});
|
|
300
|
-
ctx.expect(ctx.
|
|
301
|
-
ctx.
|
|
302
|
-
ctx.expect(ctx.
|
|
300
|
+
ctx.expect(ctx.omega.tray.find('account/sign-out').label).toBe('Sign out');
|
|
301
|
+
ctx.omega.tray.update('account/sign-out', { label: 'Bye' });
|
|
302
|
+
ctx.expect(ctx.omega.tray.find('account/sign-out').label).toBe('Bye');
|
|
303
303
|
},
|
|
304
304
|
},
|
|
305
305
|
{
|
|
306
306
|
name: 'auto-updater status updates the tray check-for-updates label',
|
|
307
307
|
run: (ctx) => {
|
|
308
|
-
ctx.
|
|
308
|
+
ctx.omega.tray.define(({ tray }) => { tray.useDefaults(); });
|
|
309
309
|
|
|
310
|
-
ctx.
|
|
310
|
+
ctx.omega.autoUpdater._state = {
|
|
311
311
|
code: 'downloaded', version: '7.0.0', percent: 100, error: null, downloadedAt: Date.now(), lastCheckedAt: null,
|
|
312
312
|
};
|
|
313
|
-
ctx.
|
|
313
|
+
ctx.omega.autoUpdater._updateTrayItem();
|
|
314
314
|
|
|
315
|
-
const item = ctx.
|
|
315
|
+
const item = ctx.omega.tray.find('check-for-updates');
|
|
316
316
|
ctx.expect(item.label).toContain('Restart to Update');
|
|
317
317
|
ctx.expect(item.label).toContain('7.0.0');
|
|
318
318
|
ctx.expect(item.enabled).toBe(true);
|