Преглед изворни кода

add 'dispatch "scroll" event' option (fix #940)

Gildas пре 3 година
родитељ
комит
f39369f7c2

+ 4 - 0
_locales/de/messages.json

@@ -267,6 +267,10 @@
 		"message": "Seite verkleinern",
 		"message": "Seite verkleinern",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "Ereignis \"scroll\" versenden",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "Bilder für alternative Bildschirmauflösungen entfernen",
 		"message": "Bilder für alternative Bildschirmauflösungen entfernen",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/en/messages.json

@@ -267,6 +267,10 @@
 		"message": "zoom out the page",
 		"message": "zoom out the page",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "remove images for alternative screen resolutions",
 		"message": "remove images for alternative screen resolutions",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/es/messages.json

@@ -267,6 +267,10 @@
 		"message": "alejar la página",
 		"message": "alejar la página",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "enviar evento \"scroll\"",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "eliminar imágenes para resoluciones alternativas de pantalla",
 		"message": "eliminar imágenes para resoluciones alternativas de pantalla",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/fr/messages.json

@@ -267,6 +267,10 @@
 		"message": "dézoomer la page",
 		"message": "dézoomer la page",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "envoyer l'évènement \"scroll\"",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "supprimer les images pour des résolutions d'écran alternatives",
 		"message": "supprimer les images pour des résolutions d'écran alternatives",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/it/messages.json

@@ -267,6 +267,10 @@
 		"message": "zoom out pagina",
 		"message": "zoom out pagina",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "inviare evento \"scroll\"",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "rimuovi immagini per risoluzioni dello schermo alternative",
 		"message": "rimuovi immagini per risoluzioni dello schermo alternative",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/ja/messages.json

@@ -267,6 +267,10 @@
 		"message": "zoom out the page",
 		"message": "zoom out the page",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "代替画面解像度用の画像を削除します",
 		"message": "代替画面解像度用の画像を削除します",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/pl/messages.json

@@ -267,6 +267,10 @@
 		"message": "pomniejsz stronę",
 		"message": "pomniejsz stronę",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "usuwaj obrazy dla alternatywnych rozdzielczości ekranu",
 		"message": "usuwaj obrazy dla alternatywnych rozdzielczości ekranu",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/pt_br/messages.json

@@ -267,6 +267,10 @@
 		"message": "diminuir zoom no site",
 		"message": "diminuir zoom no site",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "remover imagens para resoluções alternativas de tela",
 		"message": "remover imagens para resoluções alternativas de tela",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/ru/messages.json

@@ -267,6 +267,10 @@
 		"message": "уменьшить масштаб страницы",
 		"message": "уменьшить масштаб страницы",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "удалить изображения для альтернативных разрешений экрана",
 		"message": "удалить изображения для альтернативных разрешений экрана",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/uk/messages.json

@@ -267,6 +267,10 @@
 		"message": "zoom out the page",
 		"message": "zoom out the page",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "видалити зображення для альтернативних розширень екрану ",
 		"message": "видалити зображення для альтернативних розширень екрану ",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/zh_CN/messages.json

@@ -267,6 +267,10 @@
 		"message": "缩小页面",
 		"message": "缩小页面",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "移除用于备选分辨率的图片",
 		"message": "移除用于备选分辨率的图片",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/zh_TW/messages.json

@@ -267,6 +267,10 @@
 		"message": "縮小頁面",
 		"message": "縮小頁面",
 		"description": "Options page label: 'zoom out the page'"
 		"description": "Options page label: 'zoom out the page'"
 	},
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 	"optionRemoveAlternativeImages": {
 		"message": "移除用於備選分辨率的圖片",
 		"message": "移除用於備選分辨率的圖片",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 1 - 0
cli/single-file-cli-api.js

@@ -40,6 +40,7 @@ const DEFAULT_OPTIONS = {
 	loadDeferredImagesBlockCookies: false,
 	loadDeferredImagesBlockCookies: false,
 	loadDeferredImagesBlockStorage: false,
 	loadDeferredImagesBlockStorage: false,
 	loadDeferredImagesKeepZoomLevel: false,
 	loadDeferredImagesKeepZoomLevel: false,
+	loadDeferredImagesDispatchScrollEvent: false,
 	filenameTemplate: "{page-title} ({date-locale} {time-locale}).html",
 	filenameTemplate: "{page-title} ({date-locale} {time-locale}).html",
 	infobarTemplate: "",
 	infobarTemplate: "",
 	includeInfobar: false,
 	includeInfobar: false,

+ 1 - 0
src/extension/core/bg/config.js

@@ -45,6 +45,7 @@ const DEFAULT_CONFIG = {
 	loadDeferredImagesBlockCookies: false,
 	loadDeferredImagesBlockCookies: false,
 	loadDeferredImagesBlockStorage: false,
 	loadDeferredImagesBlockStorage: false,
 	loadDeferredImagesKeepZoomLevel: false,
 	loadDeferredImagesKeepZoomLevel: false,
+	loadDeferredImagesDispatchScrollEvent: false,
 	filenameTemplate: "{page-title} ({date-locale} {time-locale}).html",
 	filenameTemplate: "{page-title} ({date-locale} {time-locale}).html",
 	infobarTemplate: "",
 	infobarTemplate: "",
 	includeInfobar: false,
 	includeInfobar: false,

+ 6 - 0
src/extension/ui/bg/ui-options.js

@@ -64,6 +64,7 @@ const moveStylesInHeadLabel = document.getElementById("moveStylesInHeadLabel");
 const loadDeferredImagesLabel = document.getElementById("loadDeferredImagesLabel");
 const loadDeferredImagesLabel = document.getElementById("loadDeferredImagesLabel");
 const loadDeferredImagesMaxIdleTimeLabel = document.getElementById("loadDeferredImagesMaxIdleTimeLabel");
 const loadDeferredImagesMaxIdleTimeLabel = document.getElementById("loadDeferredImagesMaxIdleTimeLabel");
 const loadDeferredImagesKeepZoomLevelLabel = document.getElementById("loadDeferredImagesKeepZoomLevelLabel");
 const loadDeferredImagesKeepZoomLevelLabel = document.getElementById("loadDeferredImagesKeepZoomLevelLabel");
+const loadDeferredImagesDispatchScrollEventLabel = document.getElementById("loadDeferredImagesDispatchScrollEventLabel");
 const addMenuEntryLabel = document.getElementById("addMenuEntryLabel");
 const addMenuEntryLabel = document.getElementById("addMenuEntryLabel");
 const filenameTemplateLabel = document.getElementById("filenameTemplateLabel");
 const filenameTemplateLabel = document.getElementById("filenameTemplateLabel");
 const filenameMaxLengthLabel = document.getElementById("filenameMaxLengthLabel");
 const filenameMaxLengthLabel = document.getElementById("filenameMaxLengthLabel");
@@ -181,6 +182,7 @@ const moveStylesInHeadInput = document.getElementById("moveStylesInHeadInput");
 const loadDeferredImagesInput = document.getElementById("loadDeferredImagesInput");
 const loadDeferredImagesInput = document.getElementById("loadDeferredImagesInput");
 const loadDeferredImagesMaxIdleTimeInput = document.getElementById("loadDeferredImagesMaxIdleTimeInput");
 const loadDeferredImagesMaxIdleTimeInput = document.getElementById("loadDeferredImagesMaxIdleTimeInput");
 const loadDeferredImagesKeepZoomLevelInput = document.getElementById("loadDeferredImagesKeepZoomLevelInput");
 const loadDeferredImagesKeepZoomLevelInput = document.getElementById("loadDeferredImagesKeepZoomLevelInput");
+const loadDeferredImagesDispatchScrollEventInput = document.getElementById("loadDeferredImagesDispatchScrollEventInput");
 const contextMenuEnabledInput = document.getElementById("contextMenuEnabledInput");
 const contextMenuEnabledInput = document.getElementById("contextMenuEnabledInput");
 const filenameTemplateInput = document.getElementById("filenameTemplateInput");
 const filenameTemplateInput = document.getElementById("filenameTemplateInput");
 const filenameMaxLengthInput = document.getElementById("filenameMaxLengthInput");
 const filenameMaxLengthInput = document.getElementById("filenameMaxLengthInput");
@@ -536,6 +538,7 @@ moveStylesInHeadLabel.textContent = browser.i18n.getMessage("optionMoveStylesInH
 loadDeferredImagesLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImages");
 loadDeferredImagesLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImages");
 loadDeferredImagesMaxIdleTimeLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesMaxIdleTime");
 loadDeferredImagesMaxIdleTimeLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesMaxIdleTime");
 loadDeferredImagesKeepZoomLevelLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesKeepZoomLevel");
 loadDeferredImagesKeepZoomLevelLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesKeepZoomLevel");
+loadDeferredImagesDispatchScrollEventLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesDispatchScrollEvent");
 addMenuEntryLabel.textContent = browser.i18n.getMessage("optionAddMenuEntry");
 addMenuEntryLabel.textContent = browser.i18n.getMessage("optionAddMenuEntry");
 filenameTemplateLabel.textContent = browser.i18n.getMessage("optionFilenameTemplate");
 filenameTemplateLabel.textContent = browser.i18n.getMessage("optionFilenameTemplate");
 filenameMaxLengthLabel.textContent = browser.i18n.getMessage("optionFilenameMaxLength");
 filenameMaxLengthLabel.textContent = browser.i18n.getMessage("optionFilenameMaxLength");
@@ -773,6 +776,8 @@ async function refresh(profileName) {
 	loadDeferredImagesKeepZoomLevelInput.checked = profileOptions.loadDeferredImagesKeepZoomLevel;
 	loadDeferredImagesKeepZoomLevelInput.checked = profileOptions.loadDeferredImagesKeepZoomLevel;
 	loadDeferredImagesKeepZoomLevelInput.disabled = !profileOptions.loadDeferredImages;
 	loadDeferredImagesKeepZoomLevelInput.disabled = !profileOptions.loadDeferredImages;
 	loadDeferredImagesMaxIdleTimeInput.disabled = !profileOptions.loadDeferredImages;
 	loadDeferredImagesMaxIdleTimeInput.disabled = !profileOptions.loadDeferredImages;
+	loadDeferredImagesDispatchScrollEventInput.checked = profileOptions.loadDeferredImagesDispatchScrollEvent;
+	loadDeferredImagesDispatchScrollEventInput.disabled = !profileOptions.loadDeferredImages;
 	contextMenuEnabledInput.checked = profileOptions.contextMenuEnabled;
 	contextMenuEnabledInput.checked = profileOptions.contextMenuEnabled;
 	filenameTemplateInput.value = profileOptions.filenameTemplate;
 	filenameTemplateInput.value = profileOptions.filenameTemplate;
 	filenameMaxLengthInput.value = profileOptions.filenameMaxLength;
 	filenameMaxLengthInput.value = profileOptions.filenameMaxLength;
@@ -880,6 +885,7 @@ async function update() {
 			loadDeferredImages: loadDeferredImagesInput.checked,
 			loadDeferredImages: loadDeferredImagesInput.checked,
 			loadDeferredImagesMaxIdleTime: Math.max(loadDeferredImagesMaxIdleTimeInput.value, 0),
 			loadDeferredImagesMaxIdleTime: Math.max(loadDeferredImagesMaxIdleTimeInput.value, 0),
 			loadDeferredImagesKeepZoomLevel: loadDeferredImagesKeepZoomLevelInput.checked,
 			loadDeferredImagesKeepZoomLevel: loadDeferredImagesKeepZoomLevelInput.checked,
+			loadDeferredImagesDispatchScrollEvent: loadDeferredImagesDispatchScrollEventInput.checked,
 			contextMenuEnabled: contextMenuEnabledInput.checked,
 			contextMenuEnabled: contextMenuEnabledInput.checked,
 			filenameTemplate: filenameTemplateInput.value,
 			filenameTemplate: filenameTemplateInput.value,
 			filenameMaxLength: filenameMaxLengthInput.value,
 			filenameMaxLength: filenameMaxLengthInput.value,

+ 9 - 0
src/extension/ui/pages/help.html

@@ -294,6 +294,15 @@
 							for example the network or system conditions are degraded. You can also decrease this value
 							for example the network or system conditions are degraded. You can also decrease this value
 							otherwise.</p>
 							otherwise.</p>
 					</li>
 					</li>
+					<li data-options-label="loadDeferredImagesDispatchScrollEventLabel"> <span class="option">Option:
+							dispatch "scroll" event</span>
+						<p>Check this option to dispatch the <a
+								href="https://developer.mozilla.org/docs/Web/API/Document/scroll_event"
+								target="_blank">"scroll"
+								event</a> when waiting for deferred images. This can improve the loading of images
+							on some sites but it can also cause unexpected scrolling problems on some other sites.</p>
+						<p class="notice">It is recommended to <u>uncheck</u> this option</p>
+					</li>
 					<li data-options-label="loadDeferredImagesKeepZoomLevelLabel"> <span class="option">Option: zoom out
 					<li data-options-label="loadDeferredImagesKeepZoomLevelLabel"> <span class="option">Option: zoom out
 							the page</span>
 							the page</span>
 						<p>Check this option to save the entire content of a page by zooming out the page. This can help
 						<p>Check this option to save the entire content of a page by zooming out the page. This can help

+ 5 - 0
src/extension/ui/pages/options.html

@@ -155,6 +155,11 @@
 				<label for="loadDeferredImagesMaxIdleTimeInput" id="loadDeferredImagesMaxIdleTimeLabel"></label>
 				<label for="loadDeferredImagesMaxIdleTimeInput" id="loadDeferredImagesMaxIdleTimeLabel"></label>
 				<input type="number" class="large-input" id="loadDeferredImagesMaxIdleTimeInput" step="100">
 				<input type="number" class="large-input" id="loadDeferredImagesMaxIdleTimeInput" step="100">
 			</div>
 			</div>
+			<div class="option second-level">
+				<label for="loadDeferredImagesDispatchScrollEventInput"
+					id="loadDeferredImagesDispatchScrollEventLabel"></label>
+				<input type="checkbox" id="loadDeferredImagesDispatchScrollEventInput">
+			</div>
 			<div class="option second-level">
 			<div class="option second-level">
 				<label for="loadDeferredImagesKeepZoomLevelInput" id="loadDeferredImagesKeepZoomLevelLabel"></label>
 				<label for="loadDeferredImagesKeepZoomLevelInput" id="loadDeferredImagesKeepZoomLevelLabel"></label>
 				<input type="checkbox" id="loadDeferredImagesKeepZoomLevelInput">
 				<input type="checkbox" id="loadDeferredImagesKeepZoomLevelInput">

+ 14 - 0
src/single-file/processors/hooks/content/content-hooks-frames-web.js

@@ -35,6 +35,8 @@
 	const BLOCK_COOKIES_END_EVENT = "single-file-block-cookies-end";
 	const BLOCK_COOKIES_END_EVENT = "single-file-block-cookies-end";
 	const BLOCK_STORAGE_START_EVENT = "single-file-block-storage-start";
 	const BLOCK_STORAGE_START_EVENT = "single-file-block-storage-start";
 	const BLOCK_STORAGE_END_EVENT = "single-file-block-storage-end";
 	const BLOCK_STORAGE_END_EVENT = "single-file-block-storage-end";
+	const DISPATCH_SCROLL_START_EVENT = "single-file-dispatch-scroll-event-start";
+	const DISPATCH_SCROLL_END_EVENT = "single-file-dispatch-scroll-event-end";
 	const LAZY_LOAD_ATTRIBUTE = "single-file-lazy-load";
 	const LAZY_LOAD_ATTRIBUTE = "single-file-lazy-load";
 	const LOAD_IMAGE_EVENT = "single-file-load-image";
 	const LOAD_IMAGE_EVENT = "single-file-load-image";
 	const IMAGE_LOADED_EVENT = "single-file-image-loaded";
 	const IMAGE_LOADED_EVENT = "single-file-image-loaded";
@@ -66,6 +68,7 @@
 	const observers = new Map();
 	const observers = new Map();
 	const observedElements = new Map();
 	const observedElements = new Map();
 
 
+	let dispatchScrollEvent;
 	addEventListener(LOAD_DEFERRED_IMAGES_START_EVENT, () => loadDeferredImagesStart());
 	addEventListener(LOAD_DEFERRED_IMAGES_START_EVENT, () => loadDeferredImagesStart());
 	addEventListener(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_START_EVENT, () => loadDeferredImagesStart(true));
 	addEventListener(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_START_EVENT, () => loadDeferredImagesStart(true));
 
 
@@ -246,6 +249,14 @@
 		delete screen.width;
 		delete screen.width;
 	}
 	}
 
 
+	addEventListener(DISPATCH_SCROLL_START_EVENT, () => {
+		dispatchScrollEvent = true;
+	});
+
+	addEventListener(DISPATCH_SCROLL_END_EVENT, () => {
+		dispatchScrollEvent = false;
+	});
+
 	addEventListener(BLOCK_COOKIES_START_EVENT, () => {
 	addEventListener(BLOCK_COOKIES_START_EVENT, () => {
 		try {
 		try {
 			document.__defineGetter__("cookie", () => { throw new Error("document.cookie temporary blocked by SingleFile"); });
 			document.__defineGetter__("cookie", () => { throw new Error("document.cookie temporary blocked by SingleFile"); });
@@ -382,6 +393,9 @@
 	function dispatchResizeEvent() {
 	function dispatchResizeEvent() {
 		try {
 		try {
 			dispatchEvent(new UIEvent("resize"));
 			dispatchEvent(new UIEvent("resize"));
+			if (dispatchScrollEvent) {
+				dispatchEvent(new UIEvent("scroll"));
+			}
 		} catch (error) {
 		} catch (error) {
 			// ignored
 			// ignored
 		}
 		}

+ 8 - 0
src/single-file/processors/hooks/content/content-hooks-frames.js

@@ -31,6 +31,8 @@ const LOAD_DEFERRED_IMAGES_RESET_ZOOM_LEVEL_EVENT = "single-file-load-deferred-i
 const LOAD_DEFERRED_IMAGES_RESET_EVENT = "single-file-load-deferred-images-reset";
 const LOAD_DEFERRED_IMAGES_RESET_EVENT = "single-file-load-deferred-images-reset";
 const BLOCK_COOKIES_START_EVENT = "single-file-block-cookies-start";
 const BLOCK_COOKIES_START_EVENT = "single-file-block-cookies-start";
 const BLOCK_COOKIES_END_EVENT = "single-file-block-cookies-end";
 const BLOCK_COOKIES_END_EVENT = "single-file-block-cookies-end";
+const DISPATCH_SCROLL_START_EVENT = "single-file-dispatch-scroll-event-start";
+const DISPATCH_SCROLL_END_EVENT = "single-file-dispatch-scroll-event-end";
 const BLOCK_STORAGE_START_EVENT = "single-file-block-storage-start";
 const BLOCK_STORAGE_START_EVENT = "single-file-block-storage-start";
 const BLOCK_STORAGE_END_EVENT = "single-file-block-storage-end";
 const BLOCK_STORAGE_END_EVENT = "single-file-block-storage-end";
 const LOAD_IMAGE_EVENT = "single-file-load-image";
 const LOAD_IMAGE_EVENT = "single-file-load-image";
@@ -100,6 +102,9 @@ function loadDeferredImagesStart(options) {
 	if (options.loadDeferredImagesBlockStorage) {
 	if (options.loadDeferredImagesBlockStorage) {
 		dispatchEvent(new CustomEvent(BLOCK_STORAGE_START_EVENT));
 		dispatchEvent(new CustomEvent(BLOCK_STORAGE_START_EVENT));
 	}
 	}
+	if (options.loadDeferredImagesDispatchScrollEvent) {
+		dispatchEvent(new CustomEvent(DISPATCH_SCROLL_START_EVENT));
+	}
 	if (options.loadDeferredImagesKeepZoomLevel) {
 	if (options.loadDeferredImagesKeepZoomLevel) {
 		dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_START_EVENT));
 		dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_START_EVENT));
 	} else {
 	} else {
@@ -114,6 +119,9 @@ function loadDeferredImagesEnd(options) {
 	if (options.loadDeferredImagesBlockStorage) {
 	if (options.loadDeferredImagesBlockStorage) {
 		dispatchEvent(new CustomEvent(BLOCK_STORAGE_END_EVENT));
 		dispatchEvent(new CustomEvent(BLOCK_STORAGE_END_EVENT));
 	}
 	}
+	if (options.loadDeferredImagesDispatchScrollEvent) {
+		dispatchEvent(new CustomEvent(DISPATCH_SCROLL_END_EVENT));
+	}
 	if (options.loadDeferredImagesKeepZoomLevel) {
 	if (options.loadDeferredImagesKeepZoomLevel) {
 		dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_END_EVENT));
 		dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_END_EVENT));
 	} else {
 	} else {