From 02e718382e47c208fbcebe869f66698cad52c417 Mon Sep 17 00:00:00 2001 From: Yury Getman Date: Tue, 20 May 2025 23:51:26 +0400 Subject: [PATCH 1/4] Renamed `app` directory name to `shared` --- src/background/controllers/camera_bubble_controller.ts | 6 +++--- src/background/controllers/current_window_tab_controller.ts | 2 +- src/background/controllers/recorder_controller.ts | 2 +- src/background/controllers/recording_controller.ts | 4 ++-- src/background/controllers/storage_controller.ts | 4 ++-- src/background/injector.ts | 2 +- src/{app => shared}/config.ts | 0 src/{app => shared}/injections.ts | 0 src/{app => shared}/messaging.ts | 0 src/{app => shared}/storage.ts | 0 src/ui/hooks/useStorageValue.tsx | 2 +- src/ui/pages/camera_bubble/CameraBubble.tsx | 2 +- src/ui/pages/camera_bubble/camera_bubble.ts | 4 ++-- src/ui/pages/popup/Popup.tsx | 4 ++-- 14 files changed, 16 insertions(+), 16 deletions(-) rename src/{app => shared}/config.ts (100%) rename src/{app => shared}/injections.ts (100%) rename src/{app => shared}/messaging.ts (100%) rename src/{app => shared}/storage.ts (100%) diff --git a/src/background/controllers/camera_bubble_controller.ts b/src/background/controllers/camera_bubble_controller.ts index bd5e124..34cc68f 100644 --- a/src/background/controllers/camera_bubble_controller.ts +++ b/src/background/controllers/camera_bubble_controller.ts @@ -3,9 +3,9 @@ import { MessageResponse, MessageResponseType, MessageType, -} from "@/app/messaging"; -import { storage } from "@/app/storage"; -import { Injection, InjectionElementId } from "@/app/injections"; +} from "@/shared/messaging"; +import { storage } from "@/shared/storage"; +import { Injection, InjectionElementId } from "@/shared/injections"; import { Injector } from "@/background/injector"; class CameraBubbleController { diff --git a/src/background/controllers/current_window_tab_controller.ts b/src/background/controllers/current_window_tab_controller.ts index 2511fab..e793d66 100644 --- a/src/background/controllers/current_window_tab_controller.ts +++ b/src/background/controllers/current_window_tab_controller.ts @@ -1,4 +1,4 @@ -import { storage } from "@/app/storage"; +import { storage } from "@/shared/storage"; chrome.tabs.onActivated.addListener((activatedTabInfo) => { console.log("Handle 'chrome.tabs.onActivated'"); diff --git a/src/background/controllers/recorder_controller.ts b/src/background/controllers/recorder_controller.ts index e4a4bbe..cb987c5 100644 --- a/src/background/controllers/recorder_controller.ts +++ b/src/background/controllers/recorder_controller.ts @@ -5,7 +5,7 @@ import { MessageType, RecorderCreateOptions, sender, -} from "@/app/messaging"; +} from "@/shared/messaging"; class Recorder { #mimeType: string; diff --git a/src/background/controllers/recording_controller.ts b/src/background/controllers/recording_controller.ts index 0bfa4d0..5eafc2c 100644 --- a/src/background/controllers/recording_controller.ts +++ b/src/background/controllers/recording_controller.ts @@ -5,8 +5,8 @@ import { MessageType, RecordingSaveOptions, sender, -} from "@/app/messaging"; -import { RecordingState, storage } from "@/app/storage"; +} from "@/shared/messaging"; +import { RecordingState, storage } from "@/shared/storage"; class RecordingController { static async start() { diff --git a/src/background/controllers/storage_controller.ts b/src/background/controllers/storage_controller.ts index 44563ca..edd0e42 100644 --- a/src/background/controllers/storage_controller.ts +++ b/src/background/controllers/storage_controller.ts @@ -1,5 +1,5 @@ -import { config } from "@/app/config"; -import { RecordingState, storage } from "@/app/storage"; +import { config } from "@/shared/config"; +import { RecordingState, storage } from "@/shared/storage"; chrome.runtime.onInstalled.addListener((_details) => { console.log("Handle 'chrome.runtime.onInstalled'"); diff --git a/src/background/injector.ts b/src/background/injector.ts index 26aa7b5..6b36e7c 100644 --- a/src/background/injector.ts +++ b/src/background/injector.ts @@ -1,4 +1,4 @@ -import type { Injection, InjectionElementId } from "@/app/injections"; +import type { Injection, InjectionElementId } from "@/shared/injections"; export class Injector { static inject(tabId: number, injection: Injection) { diff --git a/src/app/config.ts b/src/shared/config.ts similarity index 100% rename from src/app/config.ts rename to src/shared/config.ts diff --git a/src/app/injections.ts b/src/shared/injections.ts similarity index 100% rename from src/app/injections.ts rename to src/shared/injections.ts diff --git a/src/app/messaging.ts b/src/shared/messaging.ts similarity index 100% rename from src/app/messaging.ts rename to src/shared/messaging.ts diff --git a/src/app/storage.ts b/src/shared/storage.ts similarity index 100% rename from src/app/storage.ts rename to src/shared/storage.ts diff --git a/src/ui/hooks/useStorageValue.tsx b/src/ui/hooks/useStorageValue.tsx index 4fcb739..60c3576 100644 --- a/src/ui/hooks/useStorageValue.tsx +++ b/src/ui/hooks/useStorageValue.tsx @@ -4,7 +4,7 @@ import { createStorageSetter, StorageKey, StorageValueType, -} from "@/app/storage"; +} from "@/shared/storage"; export default function useStorageValue( storageKey: Key, diff --git a/src/ui/pages/camera_bubble/CameraBubble.tsx b/src/ui/pages/camera_bubble/CameraBubble.tsx index 8b2bfac..f4534c3 100644 --- a/src/ui/pages/camera_bubble/CameraBubble.tsx +++ b/src/ui/pages/camera_bubble/CameraBubble.tsx @@ -1,4 +1,4 @@ -import { StorageKey } from "@/app/storage"; +import { StorageKey } from "@/shared/storage"; import useStorageValue from "@/ui/hooks/useStorageValue"; import { Draggable } from "./components/Draggable"; diff --git a/src/ui/pages/camera_bubble/camera_bubble.ts b/src/ui/pages/camera_bubble/camera_bubble.ts index f4ed57e..5889483 100644 --- a/src/ui/pages/camera_bubble/camera_bubble.ts +++ b/src/ui/pages/camera_bubble/camera_bubble.ts @@ -1,7 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import { Injection, InjectionElementId } from "@/app/injections"; -import { storage } from "@/app/storage"; +import { Injection, InjectionElementId } from "@/shared/injections"; +import { storage } from "@/shared/storage"; import { CameraBubble } from "./CameraBubble"; async function inject() { diff --git a/src/ui/pages/popup/Popup.tsx b/src/ui/pages/popup/Popup.tsx index c55f4a6..c4b178b 100644 --- a/src/ui/pages/popup/Popup.tsx +++ b/src/ui/pages/popup/Popup.tsx @@ -1,5 +1,5 @@ -import { RecordingState, StorageKey } from "@/app/storage"; -import { sender } from "@/app/messaging"; +import { RecordingState, StorageKey } from "@/shared/storage"; +import { sender } from "@/shared/messaging"; import useStorageValue from "@/ui/hooks/useStorageValue"; import { PauseButton } from "./components/PauseButton"; import { PlayButton } from "./components/PlayButton"; From 0b8c65dcc6aebbb016f2e06e944709c847a6f07d Mon Sep 17 00:00:00 2001 From: Yury Getman Date: Wed, 21 May 2025 00:08:47 +0400 Subject: [PATCH 2/4] Tidied up `background` directory --- src/background/background.ts | 10 ++++++---- src/background/offscreen.ts | 2 +- .../camera_bubble_controller.ts | 2 +- .../camera_bubble_controller}/injector.ts | 0 .../current_tab_setter/current_tab_setter.ts} | 11 ----------- .../current_window_setter/current_window_setter.ts | 12 ++++++++++++ .../permissions_checker/permissions_checker.ts | 13 +++++++++++++ .../recorder_controller}/recorder_controller.ts | 0 .../recording_controller}/recording_controller.ts | 0 .../storage_controller}/storage_controller.ts | 5 ----- 10 files changed, 33 insertions(+), 22 deletions(-) rename src/background/{controllers => services/camera_bubble_controller}/camera_bubble_controller.ts (98%) rename src/background/{ => services/camera_bubble_controller}/injector.ts (100%) rename src/background/{controllers/current_window_tab_controller.ts => services/current_tab_setter/current_tab_setter.ts} (53%) create mode 100644 src/background/services/current_window_setter/current_window_setter.ts create mode 100644 src/background/services/permissions_checker/permissions_checker.ts rename src/background/{controllers => services/recorder_controller}/recorder_controller.ts (100%) rename src/background/{controllers => services/recording_controller}/recording_controller.ts (100%) rename src/background/{controllers => services/storage_controller}/storage_controller.ts (92%) diff --git a/src/background/background.ts b/src/background/background.ts index 78e1bec..62f9f90 100644 --- a/src/background/background.ts +++ b/src/background/background.ts @@ -1,4 +1,6 @@ -import "./controllers/camera_bubble_controller"; -import "./controllers/current_window_tab_controller"; -import "./controllers/recording_controller"; -import "./controllers/storage_controller"; +import "./services/camera_bubble_controller/camera_bubble_controller"; +import "./services/current_tab_setter/current_tab_setter"; +import "./services/current_window_setter/current_window_setter"; +import "./services/permissions_checker/permissions_checker"; +import "./services/recording_controller/recording_controller"; +import "./services/storage_controller/storage_controller"; diff --git a/src/background/offscreen.ts b/src/background/offscreen.ts index dac84b0..76b0b95 100644 --- a/src/background/offscreen.ts +++ b/src/background/offscreen.ts @@ -1 +1 @@ -import "./controllers/recorder_controller"; +import "./services/recorder_controller/recorder_controller"; diff --git a/src/background/controllers/camera_bubble_controller.ts b/src/background/services/camera_bubble_controller/camera_bubble_controller.ts similarity index 98% rename from src/background/controllers/camera_bubble_controller.ts rename to src/background/services/camera_bubble_controller/camera_bubble_controller.ts index 34cc68f..d101ee2 100644 --- a/src/background/controllers/camera_bubble_controller.ts +++ b/src/background/services/camera_bubble_controller/camera_bubble_controller.ts @@ -6,7 +6,7 @@ import { } from "@/shared/messaging"; import { storage } from "@/shared/storage"; import { Injection, InjectionElementId } from "@/shared/injections"; -import { Injector } from "@/background/injector"; +import { Injector } from "./injector"; class CameraBubbleController { static async show() { diff --git a/src/background/injector.ts b/src/background/services/camera_bubble_controller/injector.ts similarity index 100% rename from src/background/injector.ts rename to src/background/services/camera_bubble_controller/injector.ts diff --git a/src/background/controllers/current_window_tab_controller.ts b/src/background/services/current_tab_setter/current_tab_setter.ts similarity index 53% rename from src/background/controllers/current_window_tab_controller.ts rename to src/background/services/current_tab_setter/current_tab_setter.ts index e793d66..7d68374 100644 --- a/src/background/controllers/current_window_tab_controller.ts +++ b/src/background/services/current_tab_setter/current_tab_setter.ts @@ -10,14 +10,3 @@ chrome.tabs.onActivated.addListener((activatedTabInfo) => { ); }); }); - -chrome.windows.onFocusChanged.addListener((windowId) => { - console.log("Handle 'chrome.windows.onFocusChanged'"); - (async () => { - await storage.current.windowId.set(windowId); - })().catch((err) => { - console.error( - `Error in 'chrome.windows.onFocusChanged' handler: ${(err as Error).toString()}`, - ); - }); -}); diff --git a/src/background/services/current_window_setter/current_window_setter.ts b/src/background/services/current_window_setter/current_window_setter.ts new file mode 100644 index 0000000..e574b22 --- /dev/null +++ b/src/background/services/current_window_setter/current_window_setter.ts @@ -0,0 +1,12 @@ +import { storage } from "@/shared/storage"; + +chrome.windows.onFocusChanged.addListener((windowId) => { + console.log("Handle 'chrome.windows.onFocusChanged'"); + (async () => { + await storage.current.windowId.set(windowId); + })().catch((err) => { + console.error( + `Error in 'chrome.windows.onFocusChanged' handler: ${(err as Error).toString()}`, + ); + }); +}); diff --git a/src/background/services/permissions_checker/permissions_checker.ts b/src/background/services/permissions_checker/permissions_checker.ts new file mode 100644 index 0000000..417aa9d --- /dev/null +++ b/src/background/services/permissions_checker/permissions_checker.ts @@ -0,0 +1,13 @@ +chrome.runtime.onInstalled.addListener((_details) => { + console.log("Handle 'chrome.runtime.onInstalled'"); + (async () => { + await chrome.tabs.create({ + active: true, + url: chrome.runtime.getURL("permissions.html"), + }); + })().catch((err) => { + console.error( + `Error in 'chrome.runtime.onInstalled' handler: ${(err as Error).toString()}`, + ); + }); +}); diff --git a/src/background/controllers/recorder_controller.ts b/src/background/services/recorder_controller/recorder_controller.ts similarity index 100% rename from src/background/controllers/recorder_controller.ts rename to src/background/services/recorder_controller/recorder_controller.ts diff --git a/src/background/controllers/recording_controller.ts b/src/background/services/recording_controller/recording_controller.ts similarity index 100% rename from src/background/controllers/recording_controller.ts rename to src/background/services/recording_controller/recording_controller.ts diff --git a/src/background/controllers/storage_controller.ts b/src/background/services/storage_controller/storage_controller.ts similarity index 92% rename from src/background/controllers/storage_controller.ts rename to src/background/services/storage_controller/storage_controller.ts index edd0e42..7e8badc 100644 --- a/src/background/controllers/storage_controller.ts +++ b/src/background/services/storage_controller/storage_controller.ts @@ -23,11 +23,6 @@ chrome.runtime.onInstalled.addListener((_details) => { console.log( `Storage: ${JSON.stringify(await storage.getEntireStorage(), undefined, 2)}`, ); - - await chrome.tabs.create({ - active: true, - url: chrome.runtime.getURL("permissions.html"), - }); })().catch((err) => { console.error( `Error in 'chrome.runtime.onInstalled' handler: ${(err as Error).toString()}`, From d692b27bb25ba79dfa468e63955b6c73b8864c59 Mon Sep 17 00:00:00 2001 From: Yury Getman Date: Wed, 21 May 2025 22:18:01 +0400 Subject: [PATCH 3/4] Renamed several services --- src/background/background.ts | 8 +++---- .../active_tab_setter.ts} | 0 .../active_window_setter.ts} | 0 .../camera_bubble_injector.ts} | 22 +++++++++---------- .../injector.ts | 0 .../permissions_giver.ts} | 0 6 files changed, 15 insertions(+), 15 deletions(-) rename src/background/services/{current_tab_setter/current_tab_setter.ts => active_tab_setter/active_tab_setter.ts} (100%) rename src/background/services/{current_window_setter/current_window_setter.ts => active_window_setter/active_window_setter.ts} (100%) rename src/background/services/{camera_bubble_controller/camera_bubble_controller.ts => camera_bubble_injector/camera_bubble_injector.ts} (87%) rename src/background/services/{camera_bubble_controller => camera_bubble_injector}/injector.ts (100%) rename src/background/services/{permissions_checker/permissions_checker.ts => permissions_giver/permissions_giver.ts} (100%) diff --git a/src/background/background.ts b/src/background/background.ts index 62f9f90..7e09f05 100644 --- a/src/background/background.ts +++ b/src/background/background.ts @@ -1,6 +1,6 @@ -import "./services/camera_bubble_controller/camera_bubble_controller"; -import "./services/current_tab_setter/current_tab_setter"; -import "./services/current_window_setter/current_window_setter"; -import "./services/permissions_checker/permissions_checker"; +import "./services/active_tab_setter/active_tab_setter"; +import "./services/active_window_setter/active_window_setter"; +import "./services/camera_bubble_injector/camera_bubble_injector"; +import "./services/permissions_giver/permissions_giver"; import "./services/recording_controller/recording_controller"; import "./services/storage_controller/storage_controller"; diff --git a/src/background/services/current_tab_setter/current_tab_setter.ts b/src/background/services/active_tab_setter/active_tab_setter.ts similarity index 100% rename from src/background/services/current_tab_setter/current_tab_setter.ts rename to src/background/services/active_tab_setter/active_tab_setter.ts diff --git a/src/background/services/current_window_setter/current_window_setter.ts b/src/background/services/active_window_setter/active_window_setter.ts similarity index 100% rename from src/background/services/current_window_setter/current_window_setter.ts rename to src/background/services/active_window_setter/active_window_setter.ts diff --git a/src/background/services/camera_bubble_controller/camera_bubble_controller.ts b/src/background/services/camera_bubble_injector/camera_bubble_injector.ts similarity index 87% rename from src/background/services/camera_bubble_controller/camera_bubble_controller.ts rename to src/background/services/camera_bubble_injector/camera_bubble_injector.ts index d101ee2..98b2da8 100644 --- a/src/background/services/camera_bubble_controller/camera_bubble_controller.ts +++ b/src/background/services/camera_bubble_injector/camera_bubble_injector.ts @@ -8,9 +8,9 @@ import { storage } from "@/shared/storage"; import { Injection, InjectionElementId } from "@/shared/injections"; import { Injector } from "./injector"; -class CameraBubbleController { +class CameraBubbleInjector { static async show() { - console.log("CameraBubbleController.show()"); + console.log("CameraBubbleInjector.show()"); const [currentTab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true, @@ -21,7 +21,7 @@ class CameraBubbleController { } static async hide() { - console.log("CameraBubbleController.hide()"); + console.log("CameraBubbleInjector.hide()"); await Injector.deinject( await storage.ui.cameraBubble.tabId.get(), InjectionElementId.CameraBubble, @@ -37,8 +37,8 @@ chrome.tabs.onActivated.addListener((_activeTabInfo) => { if (!(await storage.ui.cameraBubble.enabled.get())) { return; } - await CameraBubbleController.hide(); - await CameraBubbleController.show(); + await CameraBubbleInjector.hide(); + await CameraBubbleInjector.show(); })().catch((err) => { console.error( `Error in 'chrome.tabs.onActivated' handler: ${(err as Error).toString()}`, @@ -52,7 +52,7 @@ chrome.tabs.onUpdated.addListener((_tabId, _changeInfo, _tab) => { if (!(await storage.ui.cameraBubble.enabled.get())) { return; } - await CameraBubbleController.show(); + await CameraBubbleInjector.show(); })().catch((err) => { console.error( `Error in 'chrome.tabs.onUpdated' handler: ${(err as Error).toString()}`, @@ -66,7 +66,7 @@ chrome.tabs.onRemoved.addListener((_closedTabId, _removeInfo) => { if (!(await storage.ui.cameraBubble.enabled.get())) { return; } - await CameraBubbleController.show(); + await CameraBubbleInjector.show(); })().catch((err) => { console.error( `Error in 'chrome.tabs.onRemoved' handler: ${(err as Error).toString()}`, @@ -80,8 +80,8 @@ chrome.windows.onFocusChanged.addListener((_windowId) => { if (!(await storage.ui.cameraBubble.enabled.get())) { return; } - await CameraBubbleController.hide(); - await CameraBubbleController.show(); + await CameraBubbleInjector.hide(); + await CameraBubbleInjector.show(); })().catch((err) => { console.error( `Error in 'chrome.windows.onFocusChanged' handler: ${(err as Error).toString()}`, @@ -102,10 +102,10 @@ chrome.runtime.onMessage.addListener( } switch (type) { case MessageType.CameraBubbleShow: - await CameraBubbleController.show(); + await CameraBubbleInjector.show(); break; case MessageType.CameraBubbleHide: - await CameraBubbleController.hide(); + await CameraBubbleInjector.hide(); break; } })() diff --git a/src/background/services/camera_bubble_controller/injector.ts b/src/background/services/camera_bubble_injector/injector.ts similarity index 100% rename from src/background/services/camera_bubble_controller/injector.ts rename to src/background/services/camera_bubble_injector/injector.ts diff --git a/src/background/services/permissions_checker/permissions_checker.ts b/src/background/services/permissions_giver/permissions_giver.ts similarity index 100% rename from src/background/services/permissions_checker/permissions_checker.ts rename to src/background/services/permissions_giver/permissions_giver.ts From e4af8ca89daa7477f52ec67e9f2cecda3a0da8fd Mon Sep 17 00:00:00 2001 From: Yury Getman Date: Wed, 4 Jun 2025 22:01:40 +0400 Subject: [PATCH 4/4] Added document closing on save completion and removed unnecessary `removeEventListener` --- .../services/recorder_controller/recorder_controller.ts | 3 +-- .../services/recording_controller/recording_controller.ts | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/background/services/recorder_controller/recorder_controller.ts b/src/background/services/recorder_controller/recorder_controller.ts index cb987c5..85f1643 100644 --- a/src/background/services/recorder_controller/recorder_controller.ts +++ b/src/background/services/recorder_controller/recorder_controller.ts @@ -77,7 +77,7 @@ class Recorder { }); for (const track of this.#mediaStream.getTracks()) { - track.addEventListener("ended", this.#onTrackEnded); + track.addEventListener("ended", this.#onTrackEnded.bind(this)); } this.#mediaRecorder.addEventListener( @@ -94,7 +94,6 @@ class Recorder { } this.#mediaRecorder.stop(); for (const track of this.#mediaStream.getTracks()) { - track.removeEventListener("ended", this.#onTrackEnded); track.stop(); } } diff --git a/src/background/services/recording_controller/recording_controller.ts b/src/background/services/recording_controller/recording_controller.ts index 5eafc2c..1542896 100644 --- a/src/background/services/recording_controller/recording_controller.ts +++ b/src/background/services/recording_controller/recording_controller.ts @@ -99,6 +99,7 @@ class RecordingController { return; } await sender.offscreen.recorderDelete(); + await chrome.offscreen.closeDocument(); await storage.recording.state.set(RecordingState.NotStarted); await storage.recording.downloadId.set(0); }