Update Popup to not store the full options object (#2106)

This commit is contained in:
toasted-nutbread 2022-04-03 17:09:51 -04:00 committed by GitHub
parent f61690ea2c
commit b896724aac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -51,11 +51,25 @@ class Popup extends EventDispatcher {
this._injectPromiseComplete = false;
this._visible = new DynamicProperty(false);
this._visibleValue = false;
this._options = null;
this._optionsContext = null;
this._contentScale = 1.0;
this._targetOrigin = chrome.runtime.getURL('/').replace(/\/$/, '');
this._optionsAssigned = false;
this._initialWidth = 400;
this._initialHeight = 250;
this._horizontalOffset = 0;
this._verticalOffset = 10;
this._horizontalOffset2 = 10;
this._verticalOffset2 = 0;
this._verticalTextPosition = 'before';
this._horizontalTextPosition = 'below';
this._displayMode = 'default';
this._scaleRelativeToVisualViewport = true;
this._useSecureFrameUrl = true;
this._useShadowDom = true;
this._customOuterCss = '';
this._frameSizeContentScale = null;
this._frameClient = null;
this._frame = document.createElement('iframe');
@ -237,7 +251,7 @@ class Popup extends EventDispatcher {
* @returns {Promise<void>}
*/
async showContent(details, displayDetails) {
if (this._options === null) { throw new Error('Options not assigned'); }
if (!this._optionsAssigned) { throw new Error('Options not assigned'); }
const {optionsContext, elementRect, writingMode} = details;
if (optionsContext !== null) {
@ -379,13 +393,13 @@ class Popup extends EventDispatcher {
}
async _injectInner2() {
if (this._options === null) {
if (!this._optionsAssigned) {
throw new Error('Options not initialized');
}
const {useSecurePopupFrameUrl, usePopupShadowDom} = this._options.general;
const useSecurePopupFrameUrl = this._useSecureFrameUrl;
await this._setUpContainer(usePopupShadowDom);
await this._setUpContainer(this._useShadowDom);
const setupFrame = (frame) => {
frame.removeAttribute('src');
@ -470,7 +484,7 @@ class Popup extends EventDispatcher {
}
try {
await this.setCustomOuterCss(this._options.general.customPopupOuterCss, true);
await this.setCustomOuterCss(this._customOuterCss, true);
} catch (e) {
// NOP
}
@ -513,34 +527,31 @@ class Popup extends EventDispatcher {
const injected = await this._inject();
if (!injected) { return; }
const optionsGeneral = this._options.general;
const {popupDisplayMode} = optionsGeneral;
const frame = this._frame;
const frameRect = frame.getBoundingClientRect();
const viewport = this._getViewport(optionsGeneral.popupScaleRelativeToVisualViewport);
const viewport = this._getViewport(this._scaleRelativeToVisualViewport);
const scale = this._contentScale;
const scaleRatio = this._frameSizeContentScale === null ? 1.0 : scale / this._frameSizeContentScale;
this._frameSizeContentScale = scale;
const getPositionArgs = [
elementRect,
Math.max(frameRect.width * scaleRatio, optionsGeneral.popupWidth * scale),
Math.max(frameRect.height * scaleRatio, optionsGeneral.popupHeight * scale),
Math.max(frameRect.width * scaleRatio, this._initialWidth * scale),
Math.max(frameRect.height * scaleRatio, this._initialHeight * scale),
viewport,
scale,
optionsGeneral,
writingMode
];
let [x, y, width, height, below] = (
writingMode === 'horizontal-tb' || optionsGeneral.popupVerticalTextPosition === 'default' ?
writingMode === 'horizontal-tb' || this._verticalTextPosition === 'default' ?
this._getPositionForHorizontalText(...getPositionArgs) :
this._getPositionForVerticalText(...getPositionArgs)
);
frame.dataset.popupDisplayMode = popupDisplayMode;
frame.dataset.popupDisplayMode = this._displayMode;
frame.dataset.below = `${below}`;
if (popupDisplayMode === 'full-width') {
if (this._displayMode === 'full-width') {
x = viewport.left;
y = below ? viewport.bottom - height : viewport.top;
width = viewport.right - viewport.left;
@ -641,10 +652,10 @@ class Popup extends EventDispatcher {
return fullscreenElement;
}
_getPositionForHorizontalText(elementRect, width, height, viewport, offsetScale, optionsGeneral) {
const preferBelow = (optionsGeneral.popupHorizontalTextPosition === 'below');
const horizontalOffset = optionsGeneral.popupHorizontalOffset * offsetScale;
const verticalOffset = optionsGeneral.popupVerticalOffset * offsetScale;
_getPositionForHorizontalText(elementRect, width, height, viewport, offsetScale) {
const preferBelow = (this._horizontalTextPosition === 'below');
const horizontalOffset = this._horizontalOffset * offsetScale;
const verticalOffset = this._verticalOffset * offsetScale;
const [x, w] = this._getConstrainedPosition(
elementRect.x + elementRect.width - horizontalOffset,
@ -665,10 +676,10 @@ class Popup extends EventDispatcher {
return [x, y, w, h, below];
}
_getPositionForVerticalText(elementRect, width, height, viewport, offsetScale, optionsGeneral, writingMode) {
const preferRight = this._isVerticalTextPopupOnRight(optionsGeneral.popupVerticalTextPosition, writingMode);
const horizontalOffset = optionsGeneral.popupHorizontalOffset2 * offsetScale;
const verticalOffset = optionsGeneral.popupVerticalOffset2 * offsetScale;
_getPositionForVerticalText(elementRect, width, height, viewport, offsetScale, writingMode) {
const preferRight = this._isVerticalTextPopupOnRight(this._verticalTextPosition, writingMode);
const horizontalOffset = this._horizontalOffset2 * offsetScale;
const verticalOffset = this._verticalOffset2 * offsetScale;
const [x, w] = this._getConstrainedPositionBinary(
elementRect.x - horizontalOffset,
@ -784,10 +795,24 @@ class Popup extends EventDispatcher {
async _setOptionsContext(optionsContext) {
this._optionsContext = optionsContext;
this._options = await yomichan.api.optionsGet(optionsContext);
const {general} = this._options;
const options = await yomichan.api.optionsGet(optionsContext);
const {general} = options;
this._themeController.theme = general.popupTheme;
this._themeController.outerTheme = general.popupOuterTheme;
this._initialWidth = general.popupWidth;
this._initialHeight = general.popupHeight;
this._horizontalOffset = general.popupHorizontalOffset;
this._verticalOffset = general.popupVerticalOffset;
this._horizontalOffset2 = general.popupHorizontalOffset2;
this._verticalOffset2 = general.popupVerticalOffset2;
this._verticalTextPosition = general.popupVerticalTextPosition;
this._horizontalTextPosition = general.popupHorizontalTextPosition;
this._displayMode = general.popupDisplayMode;
this._scaleRelativeToVisualViewport = general.popupScaleRelativeToVisualViewport;
this._useSecureFrameUrl = general.useSecurePopupFrameUrl;
this._useShadowDom = general.usePopupShadowDom;
this._customOuterCss = general.customPopupOuterCss;
this._optionsAssigned = true;
this.updateTheme();
}