diff --git a/src/ext/UWServer.ts b/src/ext/UWServer.ts index 582976d..98aca12 100644 --- a/src/ext/UWServer.ts +++ b/src/ext/UWServer.ts @@ -6,7 +6,7 @@ import Settings from './lib/Settings'; import Logger, { baseLoggingOptions } from './lib/Logger'; import { sleep } from '../common/js/utils'; import EventBus, { EventBusCommand } from './lib/EventBus'; -import { ComponentLogger } from './lib/logging/ComponentLogger.js'; +import { ComponentLogger } from './lib/logging/ComponentLogger'; const BASE_LOGGING_STYLES = { diff --git a/src/ext/lib/aard/Aard.ts b/src/ext/lib/aard/Aard.ts index 4833b8b..541ded1 100644 --- a/src/ext/lib/aard/Aard.ts +++ b/src/ext/lib/aard/Aard.ts @@ -19,6 +19,7 @@ import { AardDetectionSample, generateSampleArray, resetSamples } from './interf import { AardStatus, initAardStatus } from './interfaces/aard-status.interface'; import { AardTestResults, initAardTestResults, resetAardTestResults, resetGuardLine } from './interfaces/aard-test-results.interface'; import { AardTimers, initAardTimers } from './interfaces/aard-timers.interface'; +import { ComponentLogger } from '../logging/ComponentLogger'; /** @@ -221,7 +222,7 @@ import { AardTimers, initAardTimers } from './interfaces/aard-timers.interface'; */ export class Aard { //#region configuration parameters - private logger: Logger; + private logger: ComponentLogger; private videoData: VideoData; private settings: Settings; private siteSettings: SiteSettings; @@ -292,7 +293,7 @@ export class Aard { //#region lifecycle constructor(videoData: VideoData){ - this.logger = videoData.logger; + this.logger = new ComponentLogger(videoData.logAggregator, 'Aard', {}); this.videoData = videoData; this.video = videoData.video; this.settings = videoData.settings; @@ -304,7 +305,7 @@ export class Aard { this.arid = (Math.random()*100).toFixed(); // we can tick manually, for debugging - this.logger.log('info', 'init', `[ArDetector::ctor] creating new ArDetector. arid: ${this.arid}`); + this.logger.log('ctor', `creating new ArDetector. arid: ${this.arid}`); this.timer = new AardTimer(); this.init(); @@ -372,14 +373,14 @@ export class Aard { if (this.settings.active.arDetect.aardType !== 'webgl') { return new FallbackCanvas({...this.settings.active.arDetect.canvasDimensions.sampleCanvas, id: 'main-legacy'}); } - console.error('[ultrawidify|Aard::createCanvas] could not create webgl canvas:', e); + this.logger.error('createCanvas', 'could not create webgl canvas:', e); this.eventBus.send('uw-config-broadcast', {type: 'aard-error', aardErrors: {webglError: true}}); throw e; } } else if (this.settings.active.arDetect.aardType === 'legacy') { return new FallbackCanvas({...this.settings.active.arDetect.canvasDimensions.sampleCanvas, id: 'main-legacy'}); } else { - console.error('[ultrawidify|Aard::createCanvas] invalid value in settings.arDetect.aardType:', this.settings.active.arDetect.aardType); + this.logger.error('createCanvas', 'invalid value in settings.arDetect.aardType:', this.settings.active.arDetect.aardType); this.eventBus.send('uw-config-broadcast', {type: 'aard-error', aardErrors: {invalidSettings: true}}); throw 'AARD_INVALID_SETTINGS'; } @@ -725,7 +726,7 @@ export class Aard { return VideoPlaybackState.Playing; } } catch (e) { - this.logger.log('warn', 'debug', `[ArDetect::getVideoPlaybackState] There was an error while determining video playback state.`, e); + this.logger.warn('getVideoPlaybackState]', `There was an error while determining video playback state.`, e); return VideoPlaybackState.Error; } } diff --git a/src/ext/lib/comms/CommsServer.ts b/src/ext/lib/comms/CommsServer.ts index a4573ae..9fb25a7 100644 --- a/src/ext/lib/comms/CommsServer.ts +++ b/src/ext/lib/comms/CommsServer.ts @@ -1,3 +1,4 @@ +import { ComponentLogger } from './../logging/ComponentLogger'; import { EventBusContext } from './../EventBus'; import Debug from '../../conf/Debug'; import BrowserDetect from '../../conf/BrowserDetect'; @@ -8,9 +9,13 @@ import EventBus from '../EventBus'; import { CommsOrigin } from './CommsClient'; +const BASE_LOGGING_STYLES = { + log: "background-color: #11D; color: #aad", +}; + class CommsServer { server: any; - logger: Logger; + logger: ComponentLogger; settings: Settings; eventBus: EventBus; @@ -61,7 +66,7 @@ class CommsServer { //#region lifecycle constructor(server) { this.server = server; - this.logger = server.logger; + this.logger = new ComponentLogger(server.logAggregator, 'CommsServer', {styles: BASE_LOGGING_STYLES}); this.settings = server.settings; this.eventBus = server.eventBus; @@ -106,6 +111,7 @@ class CommsServer { //#endregion sendMessage(message, context?) { + this.logger.debug('sendMessage', `preparing to send message ${message.command ?? ''} ...`, {message, context}); // stop messages from returning where they came from, and prevent // cross-pollination between content scripts running in different // tabs. @@ -129,11 +135,16 @@ class CommsServer { // okay I lied! Messages originating from content script can be forwarded to // content scripts running in _other_ frames of the tab + let forwarded = false; if (context?.origin === CommsOrigin.ContentScript) { if (context?.comms.forwardTo === 'all-frames') { + forwarded = true; this.sendToOtherFrames(message, context); } } + if (!forwarded) { + this.logger.warn('sendMessage', `message ${message.command ?? ''} was not forwarded to any destination!`, {message, context}); + } } /** @@ -148,10 +159,13 @@ class CommsServer { * Does NOT send a message to popup. **/ private sendToAll(message){ + this.logger.info('sendToAll', "sending message to all content scripts", message); + for(const tid in this.ports){ const tab = this.ports[tid]; for(const frame in tab){ for (const port in tab[frame]) { + this.logger.info('sendToAll', ` <——— attempting to send message ${message.command ?? ''} to tab ${tab}, frame ${frame}, port ${port}`, message); tab[frame][port].postMessage(message); } } @@ -168,9 +182,11 @@ class CommsServer { private async sendToFrameContentScripts(message, tab, frame, port?) { if (port !== undefined) { this.ports[tab][frame][port].postMessage(message); + this.logger.info('sendToOtherFrames', ` <——— attempting to send message ${message.command ?? ''} to tab ${tab}, frame ${frame}, port ${port}`, message); return; } for (const framePort in this.ports[tab][frame]) { + this.logger.info('sendToOtherFrames', ` <——— attempting to send message ${message.command ?? ''} to tab ${tab}, frame ${frame}`, message); this.ports[tab][frame][framePort].postMessage(JSON.parse(JSON.stringify(message))); } } @@ -198,7 +214,7 @@ class CommsServer { } private async sendToFrame(message, tab, frame, port?) { - this.logger.log('info', 'comms', `%c[CommsServer::sendToFrame] attempting to send message to tab ${tab}, frame ${frame}`, "background: #dda; color: #11D", message); + this.logger.info('sendToFrame', ` <——— attempting to send message ${message.command ?? ''} to tab ${tab}, frame ${frame}`, message); if (isNaN(tab)) { if (frame === '__playing') { @@ -212,33 +228,32 @@ class CommsServer { [tab, frame] = frame.split('-'); } - this.logger.log('info', 'comms', `%c[CommsServer::sendToFrame] attempting to send message to tab ${tab}, frame ${frame}`, "background: #dda; color: #11D", message); + this.logger.info('sendToFrame', ` <——— attempting to send message ${message.command ?? ''} to tab ${tab}, frame ${frame}`, message); try { this.sendToFrameContentScripts(message, tab, frame, port); } catch (e) { - this.logger.log('error', 'comms', `%c[CommsServer::sendToFrame] Sending message failed. Reason:`, "background: #dda; color: #11D", e); + this.logger.error('sendToFrame', ` Sending message failed. Reason:`, e); } } private async sendToActive(message) { - this.logger.log('info', 'comms', "%c[CommsServer::sendToActive] trying to send a message to active tab. Message:", "background: #dda; color: #11D", message); + this.logger.info('sendToActive', ` <——— trying to send a message ${message.command ?? ''} to active tab. Message:`, message); const tabs = await this.activeTab; - this.logger.log('info', 'comms', "[CommsServer::_sendToActive] currently active tab(s)?", tabs); - for (const frame in this.ports[tabs[0].id]) { - this.logger.log('info', 'comms', "key?", frame, this.ports[tabs[0].id]); - } + this.logger.info('sendToActive', "currently active tab(s)?", tabs); for (const frame in this.ports[tabs[0].id]) { + this.logger.info('sendToActive', "sending message to frame:", frame, this.ports[tabs[0].id][frame], '; message:', message); this.sendToFrameContentScripts(message, tabs[0].id, frame); } } private async processReceivedMessage(message, port, sender?: {frameId: string, tabId: string}){ + this.logger.info('processMessage', ` ==> Received message ${message.command ?? ''} from content script or port`, "background-color: #11D; color: #aad", message, port, sender); // this triggers events this.eventBus.send( message.command, @@ -259,7 +274,7 @@ class CommsServer { } private processReceivedMessage_nonpersistent(message, sender){ - this.logger.log('info', 'comms', "%c[CommsServer.js::processMessage_nonpersistent] Received message from background script!", "background-color: #11D; color: #aad", message, sender); + this.logger.info('processMessage_nonpersistent', ` ==> Received message from background script!`, "background-color: #11D; color: #aad", message, sender); this.eventBus.send( message.command, diff --git a/src/ext/lib/kbm/KbmBase.ts b/src/ext/lib/kbm/KbmBase.ts index e8c8103..ed1eec8 100644 --- a/src/ext/lib/kbm/KbmBase.ts +++ b/src/ext/lib/kbm/KbmBase.ts @@ -1,11 +1,12 @@ import EventBus, { EventBusCommand } from '../EventBus'; import Logger from '../Logger'; +import { ComponentLogger } from '../logging/ComponentLogger'; import Settings from '../Settings'; import { SiteSettings } from '../settings/SiteSettings'; export class KbmBase { listenFor: string[] = []; - logger: Logger; + logger: ComponentLogger; settings: Settings; siteSettings: SiteSettings; eventBus: EventBus; @@ -28,7 +29,7 @@ export class KbmBase { }, } - constructor(eventBus: EventBus, siteSettings: SiteSettings, settings: Settings, logger: Logger) { + constructor(eventBus: EventBus, siteSettings: SiteSettings, settings: Settings, logger: ComponentLogger) { this.logger = logger; this.settings = settings; this.eventBus = eventBus; diff --git a/src/ext/lib/kbm/KeyboardHandler.ts b/src/ext/lib/kbm/KeyboardHandler.ts index 60f9125..ba225de 100644 --- a/src/ext/lib/kbm/KeyboardHandler.ts +++ b/src/ext/lib/kbm/KeyboardHandler.ts @@ -8,11 +8,17 @@ import VideoData from '../video-data/VideoData'; import EventBus, { EventBusCommand } from '../EventBus'; import KbmBase from './KbmBase'; import { SiteSettings } from '../settings/SiteSettings'; +import { LogAggregator } from '../logging/LogAggregator'; +import { ComponentLogger } from '../logging/ComponentLogger'; if(process.env.CHANNEL !== 'stable'){ console.info("Loading KeyboardHandler"); } +const BASE_LOGGING_STYLES = { + log: "color: #ff0" +}; + /** * Handles keypresses and mouse movement. * @@ -23,7 +29,6 @@ if(process.env.CHANNEL !== 'stable'){ */ export class KeyboardHandler extends KbmBase { listenFor: string[] = ['keyup']; - logger: Logger; settings: Settings; siteSettings: SiteSettings; eventBus: EventBus; @@ -45,14 +50,14 @@ export class KeyboardHandler extends KbmBase { } //#region lifecycle - constructor(eventBus: EventBus, siteSettings: SiteSettings, settings: Settings, logger: Logger) { - super(eventBus, siteSettings, settings, logger); - + constructor(eventBus: EventBus, siteSettings: SiteSettings, settings: Settings, logAggregator: LogAggregator) { + const tmpLogger = new ComponentLogger(logAggregator, 'KeyboardHandler', {styles: BASE_LOGGING_STYLES}); + super(eventBus, siteSettings, settings, tmpLogger); this.init(); } init() { - this.logger.log('info', 'debug', "[KeyboardHandler::init] starting init"); + this.logger.debug("init", "starting init"); // reset keypressActions when re-initializing, otherwise keypressActions will // multiply in an unwanted way @@ -119,28 +124,28 @@ export class KeyboardHandler extends KbmBase { preventAction(event) { var activeElement = document.activeElement; - if (this.logger.canLog('keyboard')) { - this.logger.pause(); // temp disable to avoid recursing; - const preventAction = this.preventAction(event); - this.logger.resume(); // undisable + // if (this.logger.canLog('keyboard')) { + // this.logger.pause(); // temp disable to avoid recursing; + // const preventAction = this.preventAction(event); + // this.logger.resume(); // undisable - this.logger.log('info', 'keyboard', "[KeyboardHandler::preventAction] Testing whether we're in a textbox or something. Detailed rundown of conditions:\n" + - "\nis tag one of defined inputs? (yes->prevent):", this.inputs.indexOf(activeElement.tagName.toLocaleLowerCase()) !== -1, - "\nis role = textbox? (yes -> prevent):", activeElement.getAttribute("role") === "textbox", - "\nis type === 'text'? (yes -> prevent):", activeElement.getAttribute("type") === "text", - "\nevent.target.isContentEditable? (yes -> prevent):", event.target.isContentEditable, - "\nis keyboard local disabled? (yes -> prevent):", this.keyboardLocalDisabled, - // "\nis keyboard enabled in settings? (no -> prevent)", this.settings.keyboardShortcutsEnabled(window.location.hostname), - "\nwill the action be prevented? (yes -> prevent)", preventAction, - "\n-----------------{ extra debug info }-------------------", - "\ntag name? (lowercase):", activeElement.tagName, activeElement.tagName.toLocaleLowerCase(), - "\nrole:", activeElement.getAttribute('role'), - "\ntype:", activeElement.getAttribute('type'), - "\ninsta-fail inputs:", this.inputs, - "\nevent:", event, - "\nevent.target:", event.target - ); - } + // this.logger.log('info', 'keyboard', "[KeyboardHandler::preventAction] Testing whether we're in a textbox or something. Detailed rundown of conditions:\n" + + // "\nis tag one of defined inputs? (yes->prevent):", this.inputs.indexOf(activeElement.tagName.toLocaleLowerCase()) !== -1, + // "\nis role = textbox? (yes -> prevent):", activeElement.getAttribute("role") === "textbox", + // "\nis type === 'text'? (yes -> prevent):", activeElement.getAttribute("type") === "text", + // "\nevent.target.isContentEditable? (yes -> prevent):", event.target.isContentEditable, + // "\nis keyboard local disabled? (yes -> prevent):", this.keyboardLocalDisabled, + // // "\nis keyboard enabled in settings? (no -> prevent)", this.settings.keyboardShortcutsEnabled(window.location.hostname), + // "\nwill the action be prevented? (yes -> prevent)", preventAction, + // "\n-----------------{ extra debug info }-------------------", + // "\ntag name? (lowercase):", activeElement.tagName, activeElement.tagName.toLocaleLowerCase(), + // "\nrole:", activeElement.getAttribute('role'), + // "\ntype:", activeElement.getAttribute('type'), + // "\ninsta-fail inputs:", this.inputs, + // "\nevent:", event, + // "\nevent.target:", event.target + // ); + // } if (this.keyboardLocalDisabled) { return true; @@ -213,19 +218,15 @@ export class KeyboardHandler extends KbmBase { handleKeyup(event) { - // if (!this.keyboardEnabled) { - // this.logger.log('info', 'keyboard', "%c[KeyboardHandler::handleKeyup] kbmHandler.keyboardEnabled is set to false. Doing nothing."); - // return; - // } - this.logger.log('info', 'keyboard', "%c[KeyboardHandler::handleKeyup] we pressed a key: ", "color: #ff0", event.key , " | keyup: ", event.keyup, "event:", event); + this.logger.info('handleKeyup', "we pressed a key: ", event.key , " | keyup: ", event.keyup, "event:", event); try { if (this.preventAction(event)) { - this.logger.log('info', 'keyboard', "[KeyboardHandler::handleKeyup] we are in a text box or something. Doing nothing."); + this.logger.info('handleKeyup', "we are in a text box or something. Doing nothing."); return; } - this.logger.log('info', 'keyboard', "%c[KeyboardHandler::handleKeyup] Trying to find and execute action for event. Actions/event: ", "color: #ff0", this.keypressActions, event); + this.logger.info('handleKeyup', "Trying to find and execute action for event. Actions/event:", this.keypressActions, event); const isLatin = this.isLatin(event.key); for (const command of this.keypressActions) { @@ -234,7 +235,7 @@ export class KeyboardHandler extends KbmBase { } } } catch (e) { - this.logger.log('info', 'debug', '[KeyboardHandler::handleKeyup] Failed to handle keyup!', e); + this.logger.debug('handleKeyup', 'Failed to handle keyup!', e); } } diff --git a/src/ext/lib/kbm/PlayerMouseHandler.ts b/src/ext/lib/kbm/PlayerMouseHandler.ts index 677af47..a484b59 100644 --- a/src/ext/lib/kbm/PlayerMouseHandler.ts +++ b/src/ext/lib/kbm/PlayerMouseHandler.ts @@ -1,5 +1,7 @@ +import { LogAggregator } from './../logging/LogAggregator'; import EventBus, { EventBusCommand } from '../EventBus'; import Logger from '../Logger'; +import { ComponentLogger } from '../logging/ComponentLogger'; import Settings from '../Settings'; import { SiteSettings } from '../settings/SiteSettings'; import KbmBase from './KbmBase'; @@ -9,6 +11,10 @@ if(process.env.CHANNEL !== 'stable'){ } +const BASE_LOGGING_STYLES = { + log: "color: #ff0" +}; + /** * Handles keypress */ @@ -36,21 +42,21 @@ export class MouseHandler extends KbmBase { } //#region lifecycle - constructor(playerElement: HTMLElement, eventBus: EventBus, siteSettings: SiteSettings, settings: Settings, logger: Logger) { - super(eventBus, siteSettings, settings, logger); + constructor(playerElement: HTMLElement, eventBus: EventBus, siteSettings: SiteSettings, settings: Settings, logAggregator: LogAggregator) { + const tmpLogger = new ComponentLogger(logAggregator, 'MouseHandler', {styles: BASE_LOGGING_STYLES}); + + super(eventBus, siteSettings, settings, tmpLogger); - this.logger = logger; this.settings = settings; this.siteSettings = siteSettings; this.eventBus = eventBus; this.playerElement = playerElement; this.init(); - } init() { - this.logger.log('info', 'debug', '[MouseHandler::init] starting init'); + // this.logger.debug('init', 'starting init'); } load() { diff --git a/src/ext/lib/video-data/PlayerData.ts b/src/ext/lib/video-data/PlayerData.ts index 5d8fc42..24f36ff 100644 --- a/src/ext/lib/video-data/PlayerData.ts +++ b/src/ext/lib/video-data/PlayerData.ts @@ -14,6 +14,7 @@ import { SiteSettings } from '../settings/SiteSettings'; import PageInfo from './PageInfo'; import { RunLevel } from '../../enum/run-level.enum'; import { ExtensionEnvironment } from '../../../common/interfaces/SettingsInterface'; +import { ComponentLogger } from '../logging/ComponentLogger'; if (process.env.CHANNEL !== 'stable'){ console.info("Loading: PlayerData.js"); @@ -69,7 +70,7 @@ class PlayerData { private playerCssClass = 'uw-ultrawidify-player-css'; //#region helper objects - logger: Logger; + logger: ComponentLogger; videoData: VideoData; pageInfo: PageInfo; siteSettings: SiteSettings; @@ -193,7 +194,7 @@ class PlayerData { constructor(videoData) { try { // set all our helper objects - this.logger = videoData.logger; + this.logger = new ComponentLogger(videoData.logAggregator, 'PlayerData', {styles: Debug.getLoggingStyles()}); this.videoData = videoData; this.videoElement = videoData.video; this.pageInfo = videoData.pageInfo; @@ -457,13 +458,13 @@ class PlayerData { private handleDimensionChanges(newDimensions: PlayerDimensions, oldDimensions: PlayerDimensions) { if (this.runLevel === RunLevel.Off ) { - this.logger.log('info', 'debug', "[PlayerDetect] player size changed, but PlayerDetect is in disabled state. The player element is probably too small."); + this.logger.info('handleDimensionChanges', "player size changed, but PlayerDetect is in disabled state. The player element is probably too small."); return; } // this 'if' is just here for debugging — real code starts later. It's safe to collapse and // ignore the contents of this if (unless we need to change how logging works) - this.logger.log('info', 'debug', "[PlayerDetect] player size potentially changed.\n\nold dimensions:", oldDimensions, '\nnew dimensions:', newDimensions); + this.logger.info('handleDimensionChanges', "player size potentially changed.\n\nold dimensions:", oldDimensions, '\nnew dimensions:', newDimensions); // if size doesn't match, trigger onPlayerDimensionChange if ( diff --git a/src/ext/lib/video-data/VideoData.ts b/src/ext/lib/video-data/VideoData.ts index a79b384..94fc4c2 100644 --- a/src/ext/lib/video-data/VideoData.ts +++ b/src/ext/lib/video-data/VideoData.ts @@ -19,6 +19,8 @@ import { Aard } from '../aard/Aard'; import { Stretch } from '../../../common/interfaces/StretchInterface'; import ExtensionMode from '../../../common/enums/ExtensionMode.enum'; import { ExtensionEnvironment } from '../../../common/interfaces/SettingsInterface'; +import { LogAggregator } from '../logging/LogAggregator'; +import { ComponentLogger } from '../logging/ComponentLogger'; /** * VideoData — handles CSS for the video element. @@ -67,7 +69,8 @@ class VideoData { //#endregion //#region helper objects - logger: Logger; + logger: ComponentLogger; + logAggregator: LogAggregator settings: Settings; // AARD needs it siteSettings: SiteSettings; pageInfo: PageInfo; @@ -117,7 +120,9 @@ class VideoData { * @param pageInfo */ constructor(video, settings: Settings, siteSettings: SiteSettings, pageInfo: PageInfo){ - this.logger = pageInfo.logger; + this.logAggregator = pageInfo.logAggregator; + this.logger = new ComponentLogger(this.logAggregator, 'VideoData', {}); + this.arSetupComplete = false; this.video = video; this.destroyed = false; @@ -167,7 +172,7 @@ class VideoData { if (!this.video?.videoWidth || !this.video?.videoHeight || this.video.readyState < 2) { return; // onVideoLoaded is a lie in this case } - this.logger.log('info', 'init', '%c[VideoData::onVideoLoaded] ——————————— Initiating phase two of videoData setup ———————————', 'color: #0f9'); + this.logger.info('onVideoLoaded', '%c ——————————— Initiating phase two of videoData setup ———————————', 'color: #0f9'); this.hasDrm = hasDrm(this.video); this.eventBus.send( @@ -179,12 +184,12 @@ class VideoData { this.videoDimensionsLoaded = true; try { await this.setupStageTwo(); - this.logger.log('info', 'init', '%c[VideoData::onVideoLoaded] ——————————— videoData setup stage two complete ———————————', 'color: #0f9'); + this.logger.info('onVideoLoaded', '%c——————————— videoData setup stage two complete ———————————', 'color: #0f9'); } catch (e) { - this.logger.log('error', 'init', '%c[VideoData::onVideoLoaded] ——————————— Setup stage two failed. ———————————\n', 'color: #f00', e); + this.logger.error('onVideoLoaded', '%c ——————————— Setup stage two failed. ———————————\n', 'color: #f00', e); } } else if (!this.videoDimensionsLoaded) { - this.logger.log('info', 'debug', "%c[VideoData::restoreCrop] Recovering from illegal video dimensions. Resetting aspect ratio.", "background: #afd, color: #132"); + this.logger.debug('onVideoLoaded', "%cRecovering from illegal video dimensions. Resetting aspect ratio.", "background: #afd, color: #132"); this.restoreCrop(); this.videoDimensionsLoaded = true; @@ -213,11 +218,11 @@ class VideoData { //#region