@vacantthinker/firefox-addon-framework-easy 2026.618.1706 → 2026.619.849

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.
@@ -6,8 +6,9 @@
6
6
  * @param filename
7
7
  * @param querySelector - Optional custom selector if you aren't targeting the
8
8
  * first <img>.
9
+ * @param delayMs
9
10
  */
10
- export declare function ctJsDownloadYoutubeImageViaCanvas(filename: string, querySelector?: string): void;
11
+ export declare function ctJsDownloadYoutubeImageViaCanvas(filename: string, querySelector?: string, delayMs?: number): Promise<void>;
11
12
  /**
12
13
  * Delays execution for a random period to emulate human actions and bypass
13
14
  * anti-bot detections.
@@ -58,6 +59,7 @@ export declare function ctJsRemoveCurrentTab(): Promise<void>;
58
59
  export declare function ctJsFocusTargetTab(targetTabId: number): Promise<void>;
59
60
  export declare function ctJsReloadTargetTab(targetTabId: number): Promise<void>;
60
61
  export declare function ctJsInfoToBackground(info: string): Promise<void>;
62
+ export declare function ctJsDownloadFile(downlink: string, filename: string): Promise<void>;
61
63
  export declare function ctJsNotification(content: string): Promise<void>;
62
64
  export declare function ctJsBrowserRuntimeSendMessage<T extends {
63
65
  act: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ContentJs.d.ts","sourceRoot":"","sources":["../src/ContentJs.ts"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,MAAc,GAAG,IAAI,CAmCvG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,uBAAuB,kBAE5C;AAED,wBAAsB,sBAAsB,kBAE3C;AAED,QAAA,MAAM,YAAY;;;;;;CAMR,CAAC;AAEX,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,OAAO,YAAY,iBAGtE;AAID;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpE;AAGD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,iBAE7C;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,iBAEzD;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,iBAExD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAKnD;AAQD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAW,EAAE,SAAS,UAAO,QAgB/D;AAED,wBAAsB,YAAY,kBAIjC;AAED,wBAAsB,oBAAoB,kBAIzC;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,iBAK3D;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,iBAK5D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,iBAGtD;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,iBAIrD;AAED,wBAAsB,6BAA6B,CAAC,CAAC,SAAS;IAC5D,GAAG,EAAE,MAAM,CAAA;CACZ,EAAE,OAAO,EAAE,CAAC,iBAEZ"}
1
+ {"version":3,"file":"ContentJs.d.ts","sourceRoot":"","sources":["../src/ContentJs.ts"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,MAAc,EAC7B,OAAO,GAAE,MAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,uBAAuB,kBAE5C;AAED,wBAAsB,sBAAsB,kBAE3C;AAED,QAAA,MAAM,YAAY;;;;;;CAMR,CAAC;AAEX,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,OAAO,YAAY,iBAGtE;AAID;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpE;AAGD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,iBAE7C;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,iBAEzD;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,iBAExD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAKnD;AAQD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAW,EAAE,SAAS,UAAO,QAgB/D;AAED,wBAAsB,YAAY,kBAIjC;AAED,wBAAsB,oBAAoB,kBAIzC;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,iBAK3D;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,iBAK5D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,iBAGtD;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAIxE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,iBAIrD;AAED,wBAAsB,6BAA6B,CAAC,CAAC,SAAS;IAC5D,GAAG,EAAE,MAAM,CAAA;CACZ,EAAE,OAAO,EAAE,CAAC,iBAEZ"}
package/dist/ContentJs.js CHANGED
@@ -9,36 +9,50 @@ import { browserRuntimeSendMessage } from "./browserRuntime";
9
9
  * @param filename
10
10
  * @param querySelector - Optional custom selector if you aren't targeting the
11
11
  * first <img>.
12
+ * @param delayMs
12
13
  */
13
- export function ctJsDownloadYoutubeImageViaCanvas(filename, querySelector = 'img') {
14
- const img = document.body.querySelector(querySelector);
15
- if (!img) {
16
- console.warn("downloadYoutubeImageViaCanvas: No image element found on the page.");
17
- return;
18
- }
19
- // Map YouTube naturalWidths to their expected canvas proportions (handling
20
- // black bars)
21
- const sizes = new Map();
22
- sizes.set(1280, { w: 1280, h: 720 });
23
- sizes.set(320, { w: 1280, h: 720 });
24
- sizes.set(640, { w: 1280, h: 900 });
25
- sizes.set(480, { w: 1280, h: 900 });
26
- const { w, h } = sizes.get(img.naturalWidth) || {
27
- w: img.naturalWidth,
28
- h: img.naturalHeight
29
- };
30
- const canvas = document.createElement('canvas');
31
- canvas.width = w;
32
- canvas.height = h;
33
- const ctx = canvas.getContext('2d');
34
- if (!ctx)
35
- return;
36
- ctx.drawImage(img, 0, 0, w, h);
37
- const canvasUrl = canvas.toDataURL('image/jpeg', 1.0);
38
- const eleA = document.createElement('a');
39
- eleA.href = canvasUrl;
40
- eleA.download = filename;
41
- eleA.click();
14
+ export function ctJsDownloadYoutubeImageViaCanvas(filename, querySelector = 'img', delayMs = 300) {
15
+ return new Promise((resolve, reject) => {
16
+ const img = document.body.querySelector(querySelector);
17
+ if (!img) {
18
+ console.warn("No image element found on the page.");
19
+ return resolve();
20
+ }
21
+ const sizes = new Map();
22
+ sizes.set(1280, { w: 1280, h: 720 });
23
+ sizes.set(320, { w: 1280, h: 720 });
24
+ sizes.set(640, { w: 1280, h: 900 });
25
+ sizes.set(480, { w: 1280, h: 900 });
26
+ const { w, h } = sizes.get(img.naturalWidth) || {
27
+ w: img.naturalWidth,
28
+ h: img.naturalHeight
29
+ };
30
+ const canvas = document.createElement('canvas');
31
+ canvas.width = w;
32
+ canvas.height = h;
33
+ const ctx = canvas.getContext('2d');
34
+ if (!ctx)
35
+ return resolve();
36
+ ctx.drawImage(img, 0, 0, w, h);
37
+ // BETTER WAY: Use toBlob instead of toDataURL
38
+ canvas.toBlob((blob) => {
39
+ if (!blob) {
40
+ return reject(new Error("Canvas to Blob conversion failed"));
41
+ }
42
+ // Create a temporary local URL for the binary data
43
+ const blobUrl = URL.createObjectURL(blob);
44
+ const eleA = document.createElement('a');
45
+ eleA.href = blobUrl;
46
+ eleA.download = filename;
47
+ eleA.click();
48
+ // Clean up the memory immediately after the click
49
+ URL.revokeObjectURL(blobUrl);
50
+ // Wait for the browser to register the download before resolving
51
+ setTimeout(() => {
52
+ resolve();
53
+ }, delayMs);
54
+ }, 'image/jpeg', 1.0);
55
+ });
42
56
  }
43
57
  /**
44
58
  * Delays execution for a random period to emulate human actions and bypass
@@ -176,6 +190,11 @@ export async function ctJsReloadTargetTab(targetTabId) {
176
190
  export async function ctJsInfoToBackground(info) {
177
191
  await browserRuntimeSendMessage({ act: "actInfo", info, });
178
192
  }
193
+ export async function ctJsDownloadFile(downlink, filename) {
194
+ await browserRuntimeSendMessage({
195
+ act: "actDownloadFile", downloadParams: { downlink, filename }
196
+ });
197
+ }
179
198
  export async function ctJsNotification(content) {
180
199
  await browserRuntimeSendMessage({
181
200
  act: "actNotification", content,
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundJs.d.ts","sourceRoot":"","sources":["../src/backgroundJs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,wBAAwB,EAAC,MAAM,SAAS,CAAC;AAGjD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErF;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,MAAM,GAAG,wBAAwB,KACpF,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CA4BzB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,MAAM,EAC5D,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,EACnC,MAAM,GAAE,MAAyB,QAqBlC"}
1
+ {"version":3,"file":"backgroundJs.d.ts","sourceRoot":"","sources":["../src/backgroundJs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,wBAAwB,EAA6B,MAAM,SAAS,CAAC;AAI7E,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErF;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,MAAM,GAAG,wBAAwB,KACpF,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAiCzB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,MAAM,EAC5D,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,EACnC,MAAM,GAAE,MAAyB,QAqBlC"}
@@ -2,6 +2,7 @@
2
2
  import { browserTabSendMessageMarcoPolo } from "./browserTab";
3
3
  import { tabOpFocus, tabOpReload, tabOpRemove } from "./opTab";
4
4
  import { browserNotificationCreateBasicContent } from "./browserNotification";
5
+ import { serviceDownloadByDownlink } from "./serviceCommon";
5
6
  /**
6
7
  * Uses <T extends string> so the app can pass its own union type.
7
8
  * It defaults to FrameworkBaseAction if no type is passed.
@@ -10,6 +11,11 @@ export function bkJsCreateActionBaseHandlers() {
10
11
  // We use `any` internally to set the map up without TS complaining,
11
12
  // but we return the strictly typed generic Map.
12
13
  const map = new Map();
14
+ map.set("actDownloadFile", async (rest) => {
15
+ if (rest && rest.downloadParams) {
16
+ await serviceDownloadByDownlink(rest.downloadParams);
17
+ }
18
+ });
13
19
  map.set("actNotification", async (rest) => {
14
20
  if (rest && rest.content) {
15
21
  await browserNotificationCreateBasicContent(rest.content);
@@ -1 +1 @@
1
- {"version":3,"file":"browserDownload.d.ts","sourceRoot":"","sources":["../src/browserDownload.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAsB,yBAAyB,CAAC,EACE,QAAQ,EACR,QAAe,GAChB,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF"}
1
+ {"version":3,"file":"browserDownload.d.ts","sourceRoot":"","sources":["../src/browserDownload.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAsB,yBAAyB,CAC7C,EACE,QAAQ,EACR,QAAe,GAChB,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"serviceCommon.d.ts","sourceRoot":"","sources":["../src/serviceCommon.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAK5E;;GAEG;AACH,wBAAsB,iBAAiB,kBAGtC;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrF"}
1
+ {"version":3,"file":"serviceCommon.d.ts","sourceRoot":"","sources":["../src/serviceCommon.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAK5E;;GAEG;AACH,wBAAsB,iBAAiB,kBAGtC;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvC"}
@@ -20,8 +20,7 @@ export async function serviceDownloadByDownlink(params) {
20
20
  try {
21
21
  // Attempt 1: Full download with provided parameters
22
22
  await browserDownloadByDownlink(params);
23
- await browserNotificationCreateBasicContent(`downloading! ${filename ??
24
- 'file'}`);
23
+ await browserNotificationCreateBasicContent(`downloading! ${filename ?? 'file'}`);
25
24
  }
26
25
  catch (error) {
27
26
  // Notify about the failure
package/dist/types.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- export type MessageActionBaseOptions = "actNotification" | 'actInfo' | "actMarco" | "actRemoveCurrentTab" | "actFocusTargetTab" | "actReloadTargetTab";
1
+ import { DownloadParams } from "./browserDownload";
2
+ export type MessageActionBaseOptions = "actDownloadFile" | "actNotification" | 'actInfo' | "actMarco" | "actRemoveCurrentTab" | "actFocusTargetTab" | "actReloadTargetTab";
2
3
  export interface MessagePayloadAction {
3
4
  act: MessageActionBaseOptions;
4
5
  }
6
+ export interface MessagePayloadDownloadInfo extends MessagePayloadAction {
7
+ downloadParams: DownloadParams;
8
+ }
5
9
  export interface MessagePayloadNotification extends MessagePayloadAction {
6
10
  content: string;
7
11
  title?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAChC,iBAAiB,GACjB,SAAS,GACT,UAAU,GACV,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,CAAA;AAExB,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,wBAAwB,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,4BAA4B,GAAG,uBAAuB,CAAC;AACnE,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,wBAAwB,GAChC,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,GACT,UAAU,GACV,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,CAAA;AAExB,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,wBAAwB,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,4BAA4B,GAAG,uBAAuB,CAAC;AACnE,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vacantthinker/firefox-addon-framework-easy",
3
- "version": "2026.0618.1706",
3
+ "version": "2026.0619.0849",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",