Start implementing run levels

This commit is contained in:
Tamius Han 2024-05-07 19:05:10 +02:00
parent 1c48ea1908
commit 277506b3c8
4 changed files with 112 additions and 5 deletions

View File

@ -0,0 +1,5 @@
export enum RunLevel {
Off = 0,
UIOnly = 1,
CustomCSSActive = 2
}

View File

@ -12,6 +12,7 @@ import EventBus from '../EventBus';
import UI from '../uwui/UI'; import UI from '../uwui/UI';
import { SiteSettings } from '../settings/SiteSettings'; import { SiteSettings } from '../settings/SiteSettings';
import PageInfo from './PageInfo'; import PageInfo from './PageInfo';
import { RunLevel } from '../../enum/run-level.enum';
if (process.env.CHANNEL !== 'stable'){ if (process.env.CHANNEL !== 'stable'){
console.info("Loading: PlayerData.js"); console.info("Loading: PlayerData.js");
@ -35,6 +36,22 @@ interface PlayerDimensions {
* If list of names is provided, the function returns dimensions of the first element that contains any name from the list in either * If list of names is provided, the function returns dimensions of the first element that contains any name from the list in either
* id or class. * id or class.
*
*
* RUN LEVELS
* Run are there to ensure only the necessary functions run.
*
* * Off:
* * Extension is effectively disabled. However, even in this quasi-disabled state,
* certain functions of the class should still be active.
* 1. Player size monitoring
* (Run level could be set to 'off' due to player being too small)
* 2. Event bus
* (Actions from popup may cause RunLevel to increase)
*
* * UiOnly:
* * Extension should show in-player UI, but it should not inject any
* unnecessary CSS.
*/ */
class PlayerData { class PlayerData {
@ -56,6 +73,7 @@ class PlayerData {
//#endregion //#endregion
//#region flags //#region flags
runLevel: RunLevel;
enabled: boolean; enabled: boolean;
invalid: boolean = false; invalid: boolean = false;
private periodicallyRefreshPlayerElement: boolean = false; private periodicallyRefreshPlayerElement: boolean = false;
@ -85,6 +103,9 @@ class PlayerData {
'update-player': [{ 'update-player': [{
function: () => this.getPlayer() function: () => this.getPlayer()
}], }],
'set-run-level': [{
function: (runLevel) => this.setRunLevel(runLevel)
}]
} }
//#endregion //#endregion
@ -163,12 +184,9 @@ class PlayerData {
} }
private reloadPlayerDataConfig(siteConfUpdate) { private reloadPlayerDataConfig(siteConfUpdate) {
console.log('reloading config ...')
// this.siteSettings = siteConfUpdate; // this.siteSettings = siteConfUpdate;
this.element = this.getPlayer(); this.element = this.getPlayer();
console.log('got player:', this.element);
this.periodicallyRefreshPlayerElement = false; this.periodicallyRefreshPlayerElement = false;
try { try {
this.periodicallyRefreshPlayerElement = this.siteSettings.data.currentDOMConfig.periodicallyRefreshPlayerElement; this.periodicallyRefreshPlayerElement = this.siteSettings.data.currentDOMConfig.periodicallyRefreshPlayerElement;
@ -177,10 +195,12 @@ class PlayerData {
} }
// because this is often caused by the UI // because this is often caused by the UI
console.log('tree request:');
this.handlePlayerTreeRequest(); this.handlePlayerTreeRequest();
} }
/**
* Initializes event bus
*/
private initEventBus() { private initEventBus() {
for (const action in this.eventBusCommands) { for (const action in this.eventBusCommands) {
for (const command of this.eventBusCommands[action]) { for (const command of this.eventBusCommands[action]) {
@ -189,6 +209,9 @@ class PlayerData {
} }
} }
/**
* Completely stops everything the extension is doing
*/
destroy() { destroy() {
document.removeEventListener('fullscreenchange', this.dimensionChangeListener); document.removeEventListener('fullscreenchange', this.dimensionChangeListener);
this.stopChangeDetection(); this.stopChangeDetection();
@ -210,6 +233,37 @@ class PlayerData {
this.ui.enable(); this.ui.enable();
} }
/**
* Sets extension runLevel
* @param runLevel
* @returns
*/
setRunLevel(runLevel: RunLevel) {
if (this.runLevel === runLevel) {
return;
}
// increasing runLevel works differently than decreasing
if (this.runLevel > runLevel) {
if (runLevel < RunLevel.CustomCSSActive) {
this.element.classList.remove(this.playerCssClass);
}
if (runLevel < RunLevel.UIOnly) {
this.ui.disable();
}
} else {
if (runLevel >= RunLevel.UIOnly) {
this.ui.enable();
this.startChangeDetection();
}
if (runLevel >= RunLevel.CustomCSSActive) {
this.element.classList.add(this.playerCssClass);
}
}
this.runLevel = runLevel;
}
/** /**
* Disables ultrawidify for this video by removing the relevant classes * Disables ultrawidify for this video by removing the relevant classes
* from the video and player elements. * from the video and player elements.
@ -300,6 +354,10 @@ class PlayerData {
// Check if extension is allowed to run in current combination of theater + full screen // Check if extension is allowed to run in current combination of theater + full screen
const canEnable = this.siteSettings.isEnabledForEnvironment(this.isFullscreen, this.isTheaterMode) === ExtensionMode.Enabled; const canEnable = this.siteSettings.isEnabledForEnvironment(this.isFullscreen, this.isTheaterMode) === ExtensionMode.Enabled;
// TODO: if canEnable is 'true' and runLevel is OFF, we should
// call restoreAr function of resizer and let it figure out the necessary run level.
// Function that restores the last user-set AR may also need to be written.
// Enable/disable // Enable/disable
if (canEnable) { if (canEnable) {
if (!this.enabled) { if (!this.enabled) {
@ -338,7 +396,8 @@ class PlayerData {
|| newDimensions?.fullscreen != oldDimensions?.fullscreen || newDimensions?.fullscreen != oldDimensions?.fullscreen
){ ){
// If player size changes, we restore aspect ratio // If player size changes, we restore aspect ratio
this.videoData.resizer?.restore(); this.eventBus.send('restore-ar', null);
// this.videoData.resizer?.restore();
} }
} }
@ -347,6 +406,10 @@ class PlayerData {
} }
//#region player element change detection //#region player element change detection
/**
* Starts change detection.
* @returns
*/
startChangeDetection(){ startChangeDetection(){
if (this.invalid) { if (this.invalid) {
return; return;

View File

@ -15,6 +15,7 @@ import EventBus from '../EventBus';
import { SiteSettings } from '../settings/SiteSettings'; import { SiteSettings } from '../settings/SiteSettings';
import { Ar } from '../../../common/interfaces/ArInterface'; import { Ar } from '../../../common/interfaces/ArInterface';
import { ExtensionStatus } from './ExtensionStatus'; import { ExtensionStatus } from './ExtensionStatus';
import { RunLevel } from '../../enum/run-level.enum';
/** /**
* VideoData handles CSS for the video element. * VideoData handles CSS for the video element.
@ -37,6 +38,7 @@ class VideoData {
//#region flags //#region flags
arSetupComplete: boolean = false; arSetupComplete: boolean = false;
enabled: boolean; enabled: boolean;
runLevel: RunLevel;
destroyed: boolean = false; destroyed: boolean = false;
invalid: boolean = false; invalid: boolean = false;
videoStatusOk: boolean = false; videoStatusOk: boolean = false;
@ -383,6 +385,33 @@ class VideoData {
// this.restoreCrop(); // this.restoreCrop();
} }
setRunLevel(runLevel: RunLevel, options?: {fromPlayer?: boolean}) {
if (this.runLevel === runLevel) {
return; // also no need to propagate to the player
}
// Run level decreases towards 'off'
if (this.runLevel > runLevel) {
if (runLevel < RunLevel.CustomCSSActive) {
this.video.classList.remove(this.baseCssName);
this.video.classList.remove(this.userCssClassName);
this.enabled = false;
}
} else { // Run level increases towards 'everything runs'*
if (runLevel >= RunLevel.CustomCSSActive) {
this.video.classList.add(this.baseCssName);
this.video.classList.add(this.userCssClassName);
this.enabled = true;
}
}
this.runLevel = runLevel;
if (!options?.fromPlayer) {
this.player.setRunLevel(runLevel);
}
}
/** /**
* Disables ultrawidify in general. * Disables ultrawidify in general.
* @param options * @param options

View File

@ -17,6 +17,7 @@ import EventBus from '../EventBus';
import { _cp } from '../../../common/js/utils'; import { _cp } from '../../../common/js/utils';
import Settings from '../Settings'; import Settings from '../Settings';
import { Ar } from '../../../common/interfaces/ArInterface'; import { Ar } from '../../../common/interfaces/ArInterface';
import { RunLevel } from '../../enum/run-level.enum';
if(Debug.debug) { if(Debug.debug) {
console.log("Loading: Resizer.js"); console.log("Loading: Resizer.js");
@ -120,6 +121,9 @@ class Resizer {
}], }],
'get-ar': [{ 'get-ar': [{
function: () => this.eventBus.send('uw-config-broadcast', {type: 'ar', config: this.lastAr}) function: () => this.eventBus.send('uw-config-broadcast', {type: 'ar', config: this.lastAr})
}],
'restore-ar': [{
function: () => this.restore()
}] }]
} }
//#endregion //#endregion
@ -242,6 +246,12 @@ class Resizer {
return; return;
} }
if ([AspectRatioType.Reset].includes(ar.type)) {
this.eventBus.send('set-run-level', RunLevel.UIOnly);
} else {
this.eventBus.send('set-run-level', RunLevel.CustomCSSActive);
}
// handle autodetection stuff // handle autodetection stuff
if (ar.type === AspectRatioType.Automatic) { if (ar.type === AspectRatioType.Automatic) {
this.videoData.arDetector?.start(); this.videoData.arDetector?.start();