Start implementing run levels
This commit is contained in:
parent
1c48ea1908
commit
277506b3c8
5
src/ext/enum/run-level.enum.ts
Normal file
5
src/ext/enum/run-level.enum.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export enum RunLevel {
|
||||||
|
Off = 0,
|
||||||
|
UIOnly = 1,
|
||||||
|
CustomCSSActive = 2
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user