|
|
@@ -18,7 +18,7 @@
|
|
|
* along with SingleFile. If not, see <http://www.gnu.org/licenses/>.
|
|
|
*/
|
|
|
|
|
|
-/* global browser, document, MutationObserver */
|
|
|
+/* global browser, document, MutationObserver, setTimeout, clearTimeout, lazyLoader */
|
|
|
|
|
|
this.lazyLoader = this.lazyLoader || (() => {
|
|
|
|
|
|
@@ -34,8 +34,8 @@ this.lazyLoader = this.lazyLoader || (() => {
|
|
|
function process(options) {
|
|
|
return new Promise(async resolve => {
|
|
|
let timeoutId, srcAttributeChanged;
|
|
|
- setTimeout(() => {
|
|
|
- clearTimeout(timeoutId);
|
|
|
+ setAsyncTimeout(() => {
|
|
|
+ clearAsyncTimeout(timeoutId);
|
|
|
lazyLoadEnd(idleTimeoutId, observer, resolve);
|
|
|
}, options.loadDeferredImagesMaxIdleTime * 5);
|
|
|
const observer = new MutationObserver(async mutations => {
|
|
|
@@ -56,9 +56,9 @@ this.lazyLoader = this.lazyLoader || (() => {
|
|
|
}
|
|
|
});
|
|
|
observer.observe(document, { subtree: true, childList: true, attributes: true });
|
|
|
- const idleTimeoutId = await setTimeout(() => {
|
|
|
+ const idleTimeoutId = await setAsyncTimeout(() => {
|
|
|
if (!srcAttributeChanged) {
|
|
|
- clearTimeout(timeoutId);
|
|
|
+ clearAsyncTimeout(timeoutId);
|
|
|
lazyLoadEnd(idleTimeoutId, observer, resolve);
|
|
|
}
|
|
|
}, options.loadDeferredImagesMaxIdleTime * 1.2);
|
|
|
@@ -67,38 +67,51 @@ this.lazyLoader = this.lazyLoader || (() => {
|
|
|
}
|
|
|
|
|
|
async function deferLazyLoadEnd(timeoutId, idleTimeoutId, observer, options, resolve) {
|
|
|
- await clearTimeout(timeoutId);
|
|
|
- return setTimeout(async () => await lazyLoadEnd(idleTimeoutId, observer, resolve), options.loadDeferredImagesMaxIdleTime);
|
|
|
+ await clearAsyncTimeout(timeoutId);
|
|
|
+ return setAsyncTimeout(async () => await lazyLoadEnd(idleTimeoutId, observer, resolve), options.loadDeferredImagesMaxIdleTime);
|
|
|
}
|
|
|
|
|
|
function lazyLoadEnd(idleTimeoutId, observer, resolve) {
|
|
|
- clearTimeout(idleTimeoutId);
|
|
|
+ clearAsyncTimeout(idleTimeoutId);
|
|
|
injectScript(SCRIPT_AFTER_PATH);
|
|
|
- setTimeout(resolve, 100);
|
|
|
+ setAsyncTimeout(resolve, 100);
|
|
|
observer.disconnect();
|
|
|
}
|
|
|
|
|
|
function injectScript(path) {
|
|
|
const scriptElement = document.createElement(SCRIPT_TAG_NAME);
|
|
|
- scriptElement.src = browser.runtime.getURL(path);
|
|
|
+ if (lazyLoader.getScriptPath) {
|
|
|
+ scriptElement.src = lazyLoader.getScriptPath(path);
|
|
|
+ } else {
|
|
|
+ debugger
|
|
|
+ scriptElement.textContent = lazyLoader.getScriptContent(path);
|
|
|
+ }
|
|
|
(document.documentElement || document).appendChild(scriptElement);
|
|
|
scriptElement.onload = () => scriptElement.remove();
|
|
|
}
|
|
|
|
|
|
- async function setTimeout(callback, delay) {
|
|
|
- const timeoutId = await browser.runtime.sendMessage({ setTimeoutRequest: true, delay });
|
|
|
- const timeoutCallback = message => {
|
|
|
- if (message.onTimeout && message.id == timeoutId) {
|
|
|
- browser.runtime.onMessage.removeListener(timeoutCallback);
|
|
|
- callback();
|
|
|
- }
|
|
|
- };
|
|
|
- browser.runtime.onMessage.addListener(timeoutCallback);
|
|
|
- return timeoutId;
|
|
|
+ async function setAsyncTimeout(callback, delay) {
|
|
|
+ if (this.browser && browser.runtime && browser.runtime.sendMessage) {
|
|
|
+ const timeoutId = await browser.runtime.sendMessage({ setTimeoutRequest: true, delay });
|
|
|
+ const timeoutCallback = message => {
|
|
|
+ if (message.onTimeout && message.id == timeoutId) {
|
|
|
+ browser.runtime.onMessage.removeListener(timeoutCallback);
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ browser.runtime.onMessage.addListener(timeoutCallback);
|
|
|
+ return timeoutId;
|
|
|
+ } else {
|
|
|
+ return setTimeout(callback, delay);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- async function clearTimeout(timeoutId) {
|
|
|
- await browser.runtime.sendMessage({ clearTimeout: true, id: timeoutId });
|
|
|
+ async function clearAsyncTimeout(timeoutId) {
|
|
|
+ if (this.browser && browser && browser.runtime && browser.runtime.sendMessage) {
|
|
|
+ await browser.runtime.sendMessage({ clearTimeout: true, id: timeoutId });
|
|
|
+ } else {
|
|
|
+ return clearTimeout(timeoutId);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
})();
|