Jelajahi Sumber

added error detection for sync rAF calls

Gildas 6 tahun lalu
induk
melakukan
560899fb05
1 mengubah file dengan 16 tambahan dan 4 penghapusan
  1. 16 4
      lib/hooks/hooks-frame.js

+ 16 - 4
lib/hooks/hooks-frame.js

@@ -83,7 +83,7 @@ this.hooksFrame = this.hooksFrame || (() => {
 			screen.__defineGetter__("height", () => scrollHeight);
 			screen.__defineGetter__("width", () => scrollWidth);
 			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"); });
 			} catch (error) {
 				// ignored
 			}
@@ -215,16 +215,28 @@ this.hooksFrame = this.hooksFrame || (() => {
 		let warningRequestAnimationFrameDisplayed;
 		const pendingRequestAnimationFrameCalls = new Map();
 		let lastTimestamp = 0;
+		let errorDetected;
 		window.requestAnimationFrame = function (callback) {
 			if (!warningRequestAnimationFrameDisplayed) {
 				console.warn("SingleFile is hooking the requestAnimationFrame and cancelAnimationFrame functions to load deferred images."); // eslint-disable-line no-console
 				warningRequestAnimationFrameDisplayed = true;
 			}
 			let requestId;
-			if (loadDeferredImages) {
-				requestId = 0;
-				callback(lastTimestamp);
+			if (loadDeferredImages && !errorDetected) {
+				try {
+					requestId = 0;
+					callback(lastTimestamp);
+				} catch (error) {
+					errorDetected = true;
+					requestId = requestAnimationFrame(timestamp => {
+						lastTimestamp = timestamp;
+						callback(timestamp);
+					});
+				}
 			} else {
+				if (!loadDeferredImages) {
+					errorDetected = false;
+				}
 				requestId = requestAnimationFrame(timestamp => {
 					pendingRequestAnimationFrameCalls.delete(requestId);
 					lastTimestamp = timestamp;