aboutsummaryrefslogtreecommitdiff
path: root/ext/fg/js/popup.js
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2019-08-17 18:50:48 -0400
committertoasted-nutbread <toasted-nutbread@users.noreply.github.com>2019-09-02 19:31:42 -0400
commit5c4614f585648c2b835efc1d369e78918bc4f5ff (patch)
tree50f7aee35187192b7104752d953c18d52bcfba6c /ext/fg/js/popup.js
parent4ac55da7dd5354e6c3495f04583352d0d863b7b6 (diff)
Add support for showing recursive popups
Diffstat (limited to 'ext/fg/js/popup.js')
-rw-r--r--ext/fg/js/popup.js45
1 files changed, 42 insertions, 3 deletions
diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js
index 86ce575d..f6b4f6d9 100644
--- a/ext/fg/js/popup.js
+++ b/ext/fg/js/popup.js
@@ -18,12 +18,15 @@
class Popup {
- constructor() {
+ constructor(id) {
+ this.id = id;
+ this.parent = null;
+ this.children = [];
this.container = document.createElement('iframe');
this.container.id = 'yomichan-float';
this.container.addEventListener('mousedown', e => e.stopPropagation());
this.container.addEventListener('scroll', e => e.stopPropagation());
- this.container.setAttribute('src', chrome.extension.getURL('/fg/float.html'));
+ this.container.setAttribute('src', chrome.extension.getURL(`/fg/float.html?id=${id}`));
this.container.style.width = '0px';
this.container.style.height = '0px';
this.injected = null;
@@ -77,6 +80,8 @@ class Popup {
container.style.width = `${width}px`;
container.style.height = `${height}px`;
container.style.visibility = 'visible';
+
+ this.hideChildren();
}
static getPositionForHorizontalText(elementRect, width, height, maxWidth, maxHeight, optionsGeneral) {
@@ -178,8 +183,34 @@ class Popup {
}
hide() {
- this.container.style.visibility = 'hidden';
+ this.hideContainer();
this.container.blur();
+ this.hideChildren();
+ }
+
+ hideChildren() {
+ if (this.children.length === 0) {
+ return;
+ }
+
+ const targets = this.children.slice(0);
+ while (targets.length > 0) {
+ const target = targets.shift();
+ if (target.isContainerHidden()) { continue; }
+
+ target.hideContainer();
+ for (const child of target.children) {
+ targets.push(child);
+ }
+ }
+ }
+
+ hideContainer() {
+ this.container.style.visibility = 'hidden';
+ }
+
+ isContainerHidden() {
+ return (this.container.style.visibility === 'hidden');
}
isVisible() {
@@ -209,6 +240,14 @@ class Popup {
return contained;
}
+ async containsPointAsync(point) {
+ return containsPoint(point);
+ }
+
+ containsPointIsAsync() {
+ return false;
+ }
+
async termsShow(elementRect, writingMode, definitions, options, context) {
await this.show(elementRect, writingMode, options);
this.invokeApi('termsShow', {definitions, options, context});