소스 검색

use a Map to store fonts (see #755 and #783)

Gildas 4 년 전
부모
커밋
ef35ab7080
1개의 변경된 파일9개의 추가작업 그리고 10개의 파일을 삭제
  1. 9 10
      lib/single-file/processors/hooks/content/content-hooks-frames.js

+ 9 - 10
lib/single-file/processors/hooks/content/content-hooks-frames.js

@@ -50,25 +50,24 @@ let fontFaces;
 if (window._singleFile_fontFaces) {
 	fontFaces = window._singleFile_fontFaces;
 } else {
-	fontFaces = window._singleFile_fontFaces = [];
+	fontFaces = window._singleFile_fontFaces = new Map();
 }
 
 if (document instanceof HTMLDocument) {
 	if (browser && browser.runtime && browser.runtime.getURL) {
 		addEventListener(NEW_FONT_FACE_EVENT, event => {
 			const detail = event.detail;
-			if (!fontFaces.find(fontFace => JSON.stringify(fontFace) == JSON.stringify(detail))) {
-				fontFaces.push(event.detail);
-			}
+			const key = Object.assign({}, detail);
+			delete key.src;
+			fontFaces.set(JSON.stringify(key), detail);
 		});
 		addEventListener(DELETE_FONT_EVENT, event => {
 			const detail = event.detail;
-			const indexFontFace = fontFaces.findIndex(fontFace => fontFace["family-name"] == detail["family-name"]);
-			if (indexFontFace != -1) {
-				fontFaces.splice(indexFontFace, 1);
-			}
+			const key = Object.assign({}, detail);
+			delete key.src;
+			fontFaces.delete(JSON.stringify(key));
 		});
-		addEventListener(CLEAR_FONTS_EVENT, () => fontFaces = []);
+		addEventListener(CLEAR_FONTS_EVENT, () => fontFaces = new Map());
 		let scriptElement = document.createElement("script");
 		scriptElement.src = "data:," + "(" + injectedScript.toString() + ")()";
 		(document.documentElement || document).appendChild(scriptElement);
@@ -91,7 +90,7 @@ export {
 };
 
 function getFontsData() {
-	return fontFaces;
+	return Array.from(fontFaces.values());
 }
 
 function loadDeferredImagesStart(options) {