Просмотр исходного кода

improved cancelAnimationFrame implementation

Gildas 7 лет назад
Родитель
Сommit
f9825959b9
1 измененных файлов с 17 добавлено и 6 удалено
  1. 17 6
      lib/hooks/hooks-frame.js

+ 17 - 6
lib/hooks/hooks-frame.js

@@ -135,30 +135,41 @@ this.hooksFrame = this.hooksFrame || (() => {
 
 
 		let warningRequestAnimationFrameDisplayed;
 		let warningRequestAnimationFrameDisplayed;
 		const pendingRequestAnimationFrameCalls = new Map();
 		const pendingRequestAnimationFrameCalls = new Map();
+		const pendingSetTimeoutCalls = new Map();
 		window.requestAnimationFrame = function (callback) {
 		window.requestAnimationFrame = function (callback) {
 			if (!warningRequestAnimationFrameDisplayed) {
 			if (!warningRequestAnimationFrameDisplayed) {
 				console.warn("SingleFile is hooking the requestAnimationFrame and cancelAnimationFrame functions to load deferred images."); // eslint-disable-line no-console
 				console.warn("SingleFile is hooking the requestAnimationFrame and cancelAnimationFrame functions to load deferred images."); // eslint-disable-line no-console
 				warningRequestAnimationFrameDisplayed = true;
 				warningRequestAnimationFrameDisplayed = true;
 			}
 			}
+			let id;
 			if (loadDeferredImages) {
 			if (loadDeferredImages) {
-				return setTimeout(callback, 0);
+				id = setTimeout(() => {
+					pendingSetTimeoutCalls.delete(id);
+					callback(0);
+				}, 0);
+				pendingSetTimeoutCalls.set(id, callback);
 			} else {
 			} else {
-				const id = requestAnimationFrame(timestamp => {
+				id = requestAnimationFrame(timestamp => {
 					pendingRequestAnimationFrameCalls.delete(id);
 					pendingRequestAnimationFrameCalls.delete(id);
 					callback(timestamp);
 					callback(timestamp);
 				});
 				});
 				pendingRequestAnimationFrameCalls.set(id, callback);
 				pendingRequestAnimationFrameCalls.set(id, callback);
-				return id;
 			}
 			}
+			return id;
 		};
 		};
 		window.requestAnimationFrame.toString = function () { return "requestAnimationFrame() { [native code] }"; };
 		window.requestAnimationFrame.toString = function () { return "requestAnimationFrame() { [native code] }"; };
 
 
 		window.cancelAnimationFrame = function (id) {
 		window.cancelAnimationFrame = function (id) {
 			const pendingCallDeleted = pendingRequestAnimationFrameCalls.delete(id);
 			const pendingCallDeleted = pendingRequestAnimationFrameCalls.delete(id);
-			if (loadDeferredImages && !pendingCallDeleted) {
-				return clearTimeout(id);
-			} else {
+			if (pendingCallDeleted) {
 				return cancelAnimationFrame(id);
 				return cancelAnimationFrame(id);
+			} else {
+				const pendingCallDeleted = pendingSetTimeoutCalls.delete(id);
+				if (pendingCallDeleted) {
+					return clearTimeout(id);
+				} else {
+					return cancelAnimationFrame(id);
+				}
 			}
 			}
 		};
 		};
 		window.cancelAnimationFrame.toString = function () { return "cancelAnimationFrame() { [native code] }"; };
 		window.cancelAnimationFrame.toString = function () { return "cancelAnimationFrame() { [native code] }"; };