Browse Source

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

Gildas 3 years ago
parent
commit
f39369f7c2

+ 4 - 0
_locales/de/messages.json

@@ -267,6 +267,10 @@
 		"message": "Seite verkleinern",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "Ereignis \"scroll\" versenden",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "Bilder für alternative Bildschirmauflösungen entfernen",
 		"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",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "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",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "enviar evento \"scroll\"",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "eliminar imágenes para resoluciones alternativas de pantalla",
 		"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",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "envoyer l'évènement \"scroll\"",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "supprimer les images pour des résolutions d'écran alternatives",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/it/messages.json

@@ -267,6 +267,10 @@
 		"message": "zoom out pagina",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "inviare evento \"scroll\"",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "rimuovi immagini per risoluzioni dello schermo alternative",
 		"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",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "代替画面解像度用の画像を削除します",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/pl/messages.json

@@ -267,6 +267,10 @@
 		"message": "pomniejsz stronę",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "usuwaj obrazy dla alternatywnych rozdzielczości ekranu",
 		"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",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "remover imagens para resoluções alternativas de tela",
 		"description": "Options page label: 'remove images for alternative screen resolutions'"

+ 4 - 0
_locales/ru/messages.json

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

+ 4 - 0
_locales/zh_CN/messages.json

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

+ 4 - 0
_locales/zh_TW/messages.json

@@ -267,6 +267,10 @@
 		"message": "縮小頁面",
 		"description": "Options page label: 'zoom out the page'"
 	},
+	"optionLoadDeferredImagesDispatchScrollEvent": {
+		"message": "dispatch \"scroll\" event",
+		"description": "Options page label: 'dispatch \"scroll\" event'"
+	},
 	"optionRemoveAlternativeImages": {
 		"message": "移除用於備選分辨率的圖片",
 		"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,
 	loadDeferredImagesBlockStorage: false,
 	loadDeferredImagesKeepZoomLevel: false,
+	loadDeferredImagesDispatchScrollEvent: false,
 	filenameTemplate: "{page-title} ({date-locale} {time-locale}).html",
 	infobarTemplate: "",
 	includeInfobar: false,

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

@@ -45,6 +45,7 @@ const DEFAULT_CONFIG = {
 	loadDeferredImagesBlockCookies: false,
 	loadDeferredImagesBlockStorage: false,
 	loadDeferredImagesKeepZoomLevel: false,
+	loadDeferredImagesDispatchScrollEvent: false,
 	filenameTemplate: "{page-title} ({date-locale} {time-locale}).html",
 	infobarTemplate: "",
 	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 loadDeferredImagesMaxIdleTimeLabel = document.getElementById("loadDeferredImagesMaxIdleTimeLabel");
 const loadDeferredImagesKeepZoomLevelLabel = document.getElementById("loadDeferredImagesKeepZoomLevelLabel");
+const loadDeferredImagesDispatchScrollEventLabel = document.getElementById("loadDeferredImagesDispatchScrollEventLabel");
 const addMenuEntryLabel = document.getElementById("addMenuEntryLabel");
 const filenameTemplateLabel = document.getElementById("filenameTemplateLabel");
 const filenameMaxLengthLabel = document.getElementById("filenameMaxLengthLabel");
@@ -181,6 +182,7 @@ const moveStylesInHeadInput = document.getElementById("moveStylesInHeadInput");
 const loadDeferredImagesInput = document.getElementById("loadDeferredImagesInput");
 const loadDeferredImagesMaxIdleTimeInput = document.getElementById("loadDeferredImagesMaxIdleTimeInput");
 const loadDeferredImagesKeepZoomLevelInput = document.getElementById("loadDeferredImagesKeepZoomLevelInput");
+const loadDeferredImagesDispatchScrollEventInput = document.getElementById("loadDeferredImagesDispatchScrollEventInput");
 const contextMenuEnabledInput = document.getElementById("contextMenuEnabledInput");
 const filenameTemplateInput = document.getElementById("filenameTemplateInput");
 const filenameMaxLengthInput = document.getElementById("filenameMaxLengthInput");
@@ -536,6 +538,7 @@ moveStylesInHeadLabel.textContent = browser.i18n.getMessage("optionMoveStylesInH
 loadDeferredImagesLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImages");
 loadDeferredImagesMaxIdleTimeLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesMaxIdleTime");
 loadDeferredImagesKeepZoomLevelLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesKeepZoomLevel");
+loadDeferredImagesDispatchScrollEventLabel.textContent = browser.i18n.getMessage("optionLoadDeferredImagesDispatchScrollEvent");
 addMenuEntryLabel.textContent = browser.i18n.getMessage("optionAddMenuEntry");
 filenameTemplateLabel.textContent = browser.i18n.getMessage("optionFilenameTemplate");
 filenameMaxLengthLabel.textContent = browser.i18n.getMessage("optionFilenameMaxLength");
@@ -773,6 +776,8 @@ async function refresh(profileName) {
 	loadDeferredImagesKeepZoomLevelInput.checked = profileOptions.loadDeferredImagesKeepZoomLevel;
 	loadDeferredImagesKeepZoomLevelInput.disabled = !profileOptions.loadDeferredImages;
 	loadDeferredImagesMaxIdleTimeInput.disabled = !profileOptions.loadDeferredImages;
+	loadDeferredImagesDispatchScrollEventInput.checked = profileOptions.loadDeferredImagesDispatchScrollEvent;
+	loadDeferredImagesDispatchScrollEventInput.disabled = !profileOptions.loadDeferredImages;
 	contextMenuEnabledInput.checked = profileOptions.contextMenuEnabled;
 	filenameTemplateInput.value = profileOptions.filenameTemplate;
 	filenameMaxLengthInput.value = profileOptions.filenameMaxLength;
@@ -880,6 +885,7 @@ async function update() {
 			loadDeferredImages: loadDeferredImagesInput.checked,
 			loadDeferredImagesMaxIdleTime: Math.max(loadDeferredImagesMaxIdleTimeInput.value, 0),
 			loadDeferredImagesKeepZoomLevel: loadDeferredImagesKeepZoomLevelInput.checked,
+			loadDeferredImagesDispatchScrollEvent: loadDeferredImagesDispatchScrollEventInput.checked,
 			contextMenuEnabled: contextMenuEnabledInput.checked,
 			filenameTemplate: filenameTemplateInput.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
 							otherwise.</p>
 					</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
 							the page</span>
 						<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>
 				<input type="number" class="large-input" id="loadDeferredImagesMaxIdleTimeInput" step="100">
 			</div>
+			<div class="option second-level">
+				<label for="loadDeferredImagesDispatchScrollEventInput"
+					id="loadDeferredImagesDispatchScrollEventLabel"></label>
+				<input type="checkbox" id="loadDeferredImagesDispatchScrollEventInput">
+			</div>
 			<div class="option second-level">
 				<label for="loadDeferredImagesKeepZoomLevelInput" id="loadDeferredImagesKeepZoomLevelLabel"></label>
 				<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_STORAGE_START_EVENT = "single-file-block-storage-start";
 	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 LOAD_IMAGE_EVENT = "single-file-load-image";
 	const IMAGE_LOADED_EVENT = "single-file-image-loaded";
@@ -66,6 +68,7 @@
 	const observers = new Map();
 	const observedElements = new Map();
 
+	let dispatchScrollEvent;
 	addEventListener(LOAD_DEFERRED_IMAGES_START_EVENT, () => loadDeferredImagesStart());
 	addEventListener(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_START_EVENT, () => loadDeferredImagesStart(true));
 
@@ -246,6 +249,14 @@
 		delete screen.width;
 	}
 
+	addEventListener(DISPATCH_SCROLL_START_EVENT, () => {
+		dispatchScrollEvent = true;
+	});
+
+	addEventListener(DISPATCH_SCROLL_END_EVENT, () => {
+		dispatchScrollEvent = false;
+	});
+
 	addEventListener(BLOCK_COOKIES_START_EVENT, () => {
 		try {
 			document.__defineGetter__("cookie", () => { throw new Error("document.cookie temporary blocked by SingleFile"); });
@@ -382,6 +393,9 @@
 	function dispatchResizeEvent() {
 		try {
 			dispatchEvent(new UIEvent("resize"));
+			if (dispatchScrollEvent) {
+				dispatchEvent(new UIEvent("scroll"));
+			}
 		} catch (error) {
 			// 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 BLOCK_COOKIES_START_EVENT = "single-file-block-cookies-start";
 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_END_EVENT = "single-file-block-storage-end";
 const LOAD_IMAGE_EVENT = "single-file-load-image";
@@ -100,6 +102,9 @@ function loadDeferredImagesStart(options) {
 	if (options.loadDeferredImagesBlockStorage) {
 		dispatchEvent(new CustomEvent(BLOCK_STORAGE_START_EVENT));
 	}
+	if (options.loadDeferredImagesDispatchScrollEvent) {
+		dispatchEvent(new CustomEvent(DISPATCH_SCROLL_START_EVENT));
+	}
 	if (options.loadDeferredImagesKeepZoomLevel) {
 		dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_START_EVENT));
 	} else {
@@ -114,6 +119,9 @@ function loadDeferredImagesEnd(options) {
 	if (options.loadDeferredImagesBlockStorage) {
 		dispatchEvent(new CustomEvent(BLOCK_STORAGE_END_EVENT));
 	}
+	if (options.loadDeferredImagesDispatchScrollEvent) {
+		dispatchEvent(new CustomEvent(DISPATCH_SCROLL_END_EVENT));
+	}
 	if (options.loadDeferredImagesKeepZoomLevel) {
 		dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_KEEP_ZOOM_LEVEL_END_EVENT));
 	} else {