aboutsummaryrefslogtreecommitdiff
path: root/ext/mixed/js/display.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mixed/js/display.js')
-rw-r--r--ext/mixed/js/display.js134
1 files changed, 97 insertions, 37 deletions
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js
index 19df9a61..ba1f3758 100644
--- a/ext/mixed/js/display.js
+++ b/ext/mixed/js/display.js
@@ -32,8 +32,9 @@
*/
class Display extends EventDispatcher {
- constructor() {
+ constructor(pageType) {
super();
+ this._pageType = pageType;
this._container = document.querySelector('#definitions');
this._definitions = [];
this._optionsContext = {depth: 0, url: window.location.href};
@@ -79,7 +80,6 @@ class Display extends EventDispatcher {
documentUtil: this._documentUtil
});
this._mode = null;
- this._ownerFrameId = null;
this._defaultAnkiFieldTemplates = null;
this._defaultAnkiFieldTemplatesPromise = null;
this._templateRenderer = new TemplateRendererProxy();
@@ -95,6 +95,13 @@ class Display extends EventDispatcher {
this._closeButton = document.querySelector('#close-button');
this._navigationPreviousButton = document.querySelector('#navigate-previous-button');
this._navigationNextButton = document.querySelector('#navigate-next-button');
+ this._frontend = null;
+ this._frontendSetupPromise = null;
+ this._depth = 0;
+ this._parentPopupId = null;
+ this._parentFrameId = null;
+ this._ownerFrameId = null;
+ this._childrenSupported = true;
this.registerActions([
['close', () => { this.onEscape(); }],
@@ -135,7 +142,9 @@ class Display extends EventDispatcher {
['setOptionsContext', {async: false, handler: this._onMessageSetOptionsContext.bind(this)}],
['setContent', {async: false, handler: this._onMessageSetContent.bind(this)}],
['clearAutoPlayTimer', {async: false, handler: this._onMessageClearAutoPlayTimer.bind(this)}],
- ['setCustomCss', {async: false, handler: this._onMessageSetCustomCss.bind(this)}]
+ ['setCustomCss', {async: false, handler: this._onMessageSetCustomCss.bind(this)}],
+ ['setContentScale', {async: false, handler: this._onMessageSetContentScale.bind(this)}],
+ ['configure', {async: true, handler: this._onMessageConfigure.bind(this)}]
]);
}
@@ -164,10 +173,6 @@ class Display extends EventDispatcher {
return this._ownerFrameId;
}
- set ownerFrameId(value) {
- this._ownerFrameId = value;
- }
-
async prepare() {
this._audioSystem.prepare();
this._updateMode();
@@ -268,6 +273,8 @@ class Display extends EventDispatcher {
preventMiddleMouse: scanning.preventMiddleMouse.onSearchQuery
}
});
+
+ this._updateNestedFrontend(options);
}
addMultipleEventListeners(selector, type, listener, options) {
@@ -365,36 +372,6 @@ class Display extends EventDispatcher {
}
}
- async setupNestedPopups({depth, parentPopupId, parentFrameId, useProxyPopup, pageType}) {
- await dynamicLoader.loadScripts([
- '/mixed/js/text-scanner.js',
- '/mixed/js/frame-client.js',
- '/fg/js/popup.js',
- '/fg/js/popup-proxy.js',
- '/fg/js/popup-window.js',
- '/fg/js/popup-factory.js',
- '/fg/js/frame-offset-forwarder.js',
- '/fg/js/frontend.js'
- ]);
-
- const {frameId} = await api.frameInformationGet();
-
- const popupFactory = new PopupFactory(frameId);
- popupFactory.prepare();
-
- const frontend = new Frontend({
- frameId,
- popupFactory,
- depth,
- parentPopupId,
- parentFrameId,
- useProxyPopup,
- pageType,
- allowRootFramePopupProxy: true
- });
- await frontend.prepare();
- }
-
authenticateMessageData(data) {
return data;
}
@@ -453,6 +430,20 @@ class Display extends EventDispatcher {
this.setCustomCss(css);
}
+ _onMessageSetContentScale({scale}) {
+ this._setContentScale(scale);
+ }
+
+ async _onMessageConfigure({depth, parentPopupId, parentFrameId, ownerFrameId, childrenSupported, scale, optionsContext}) {
+ this._depth = depth;
+ this._parentPopupId = parentPopupId;
+ this._parentFrameId = parentFrameId;
+ this._ownerFrameId = ownerFrameId;
+ this._childrenSupported = childrenSupported;
+ this._setContentScale(scale);
+ await this.setOptionsContext(optionsContext);
+ }
+
// Private
async _onStateChanged() {
@@ -1568,4 +1559,73 @@ class Display extends EventDispatcher {
target.focus({preventScroll: true});
}
}
+
+ _setContentScale(scale) {
+ const body = document.body;
+ if (body === null) { return; }
+ body.style.fontSize = `${scale}em`;
+ }
+
+ async _updateNestedFrontend(options) {
+ const isSearchPage = (this._pageType === 'search');
+ const isEnabled = this._childrenSupported && (
+ (isSearchPage) ?
+ (options.scanning.enableOnSearchPage) :
+ (this._depth < options.scanning.popupNestingMaxDepth)
+ );
+
+ if (this._frontend === null) {
+ if (!isEnabled) { return; }
+
+ try {
+ if (this._frontendSetupPromise === null) {
+ this._frontendSetupPromise = this._setupNestedFrontend(isSearchPage);
+ }
+ await this._frontendSetupPromise;
+ } catch (e) {
+ yomichan.logError(e);
+ return;
+ } finally {
+ this._frontendSetupPromise = null;
+ }
+ }
+
+ this._frontend.setDisabledOverride(!isEnabled);
+ }
+
+ async _setupNestedFrontend(isSearchPage) {
+ const setupNestedPopupsOptions = (
+ (isSearchPage) ?
+ {useProxyPopup: false} :
+ {useProxyPopup: true, parentPopupId: this._parentPopupId, parentFrameId: this._parentFrameId}
+ );
+
+ const {frameId} = await api.frameInformationGet();
+
+ await dynamicLoader.loadScripts([
+ '/mixed/js/text-scanner.js',
+ '/mixed/js/frame-client.js',
+ '/fg/js/popup.js',
+ '/fg/js/popup-proxy.js',
+ '/fg/js/popup-window.js',
+ '/fg/js/popup-factory.js',
+ '/fg/js/frame-offset-forwarder.js',
+ '/fg/js/frontend.js'
+ ]);
+
+ const popupFactory = new PopupFactory(frameId);
+ popupFactory.prepare();
+
+ Object.assign(setupNestedPopupsOptions, {
+ depth: this._depth + 1,
+ frameId,
+ popupFactory,
+ pageType: this._pageType,
+ allowRootFramePopupProxy: true
+ });
+
+ const frontend = new Frontend(setupNestedPopupsOptions);
+ this._frontend = frontend;
+ await frontend.prepare();
+ }
}