summaryrefslogtreecommitdiff
path: root/ext/fg/js/frame-offset-forwarder.js
diff options
context:
space:
mode:
authorsiikamiika <siikamiika@users.noreply.github.com>2020-04-18 22:08:38 +0300
committersiikamiika <siikamiika@users.noreply.github.com>2020-04-18 23:28:00 +0300
commita81c33b60aac0752ccca06f5183632146f6c6bf0 (patch)
treef6fe0a5a5f01b0d422959058b32efac6dab73834 /ext/fg/js/frame-offset-forwarder.js
parent691b7398490bbf247070cd38603e51c7a6b66121 (diff)
simplify element source lazy load
Diffstat (limited to 'ext/fg/js/frame-offset-forwarder.js')
-rw-r--r--ext/fg/js/frame-offset-forwarder.js56
1 files changed, 23 insertions, 33 deletions
diff --git a/ext/fg/js/frame-offset-forwarder.js b/ext/fg/js/frame-offset-forwarder.js
index 72731605..f40c642d 100644
--- a/ext/fg/js/frame-offset-forwarder.js
+++ b/ext/fg/js/frame-offset-forwarder.js
@@ -94,52 +94,42 @@ class FrameOffsetForwarder {
}
_findFrameWithContentWindow(contentWindow) {
- const elementSources = [
- () => [...this._frameCache],
- // will contain duplicates, but frame elements are cheap to handle
- () => [...document.querySelectorAll('frame, iframe:not(.yomichan-float)')],
- () => [document.documentElement]
- ];
- const getMoreElements = () => {
- while (true) {
- const source = elementSources.shift();
- if (source) {
- const elements = source();
- if (elements.length === 0) { continue; }
- return elements;
+ const ELEMENT_NODE = Node.ELEMENT_NODE;
+ for (const elements of this._getFrameElementSources()) {
+ while (elements.length > 0) {
+ const element = elements.shift();
+ if (element.contentWindow === contentWindow) {
+ this._frameCache.add(element);
+ return element;
}
- return [];
- }
- };
- const elements = [];
- const ELEMENT_NODE = Node.ELEMENT_NODE;
- while (elements.length > 0 || elements.push(...getMoreElements())) {
- const element = elements.shift();
- if (element.contentWindow === contentWindow) {
- this._frameCache.add(element);
- return element;
- }
+ const shadowRoot = element.shadowRoot;
+ if (shadowRoot) {
+ for (const child of shadowRoot.children) {
+ if (child.nodeType === ELEMENT_NODE) {
+ elements.push(child);
+ }
+ }
+ }
- const shadowRoot = element.shadowRoot;
- if (shadowRoot) {
- for (const child of shadowRoot.children) {
+ for (const child of element.children) {
if (child.nodeType === ELEMENT_NODE) {
elements.push(child);
}
}
}
-
- for (const child of element.children) {
- if (child.nodeType === ELEMENT_NODE) {
- elements.push(child);
- }
- }
}
return null;
}
+ *_getFrameElementSources() {
+ yield [...this._frameCache];
+ // will contain duplicates, but frame elements are cheap to handle
+ yield [...document.querySelectorAll('frame, iframe:not(.yomichan-float)')];
+ yield [document.documentElement];
+ }
+
_forwardFrameOffsetParent(offset, uniqueId) {
window.parent.postMessage({action: 'getFrameOffset', params: {offset, uniqueId}}, '*');
}