1/*! 2 * Trusted Types Policy Registry (TT) - Final Fix 3 * - ä¸ä¾è³´ getPolicy(),ç´æ¥ä½¿ç¨å»ºç«ç policy ç©ä»¶ 4 */ 5(function () { 6 'use strict'; 7 8 var TT = (window.TT = window.TT || {}); 9 var hasTT = !!window.trustedTypes; 10 var created = {}; // å稱 -> policy (鿝å¯ä¸å¯é ç便º) 11 12 // å° created æ´é²çµ¦å¤é¨,ä¾è¨ºæ·ä½¿ç¨ 13 TT.created = created; 14 15 function safeFactory(obj) { 16 obj = obj || {}; 17 return { 18 createHTML: typeof obj.createHTML === 'function' ? obj.createHTML : function (s) { return String(s ?? ''); }, 19 createScript: typeof obj.createScript === 'function' ? obj.createScript : function (s) { return String(s ?? ''); }, 20 createScriptURL: typeof obj.createScriptURL === 'function' ? obj.createScriptURL : function (s) { 21 var url = String(s ?? ''); 22 if (url.startsWith('data:') || url.startsWith('javascript:')) { 23 throw new Error('ä¸å 許 data: / javascript: URL'); 24 } 25 return url; 26 } 27 }; 28 } 29 30 TT.ensurePolicy = function ensurePolicy(name, factory) { 31 if (!hasTT) { 32 console.warn('[TT.ensurePolicy] Trusted Types 䏿¯æ´'); 33 return null; 34 } 35 36 // 檢æ¥å¿«å 37 if (created[name]) { 38 //console.log('[TT.ensurePolicy] Policy "' + name + '" å·²å卿¼å¿«å'); 39 return created[name]; 40 } 41 42 // å»ºç«æ°ç policy 43 try { 44 var policy = window.trustedTypes.createPolicy(name, safeFactory(factory)); 45 46 // å²åå°å¿«å (鿝å¯ä¸å¯é çæ¹å¼) 47 created[name] = policy; 48 49 //console.log('[TT.ensurePolicy] â Policy "' + name + '" å»ºç«æå'); 50 return policy; 51 52 } catch (e) { 53 // 妿é¯èª¤è¨æ¯å å« "already exists" 54 if (e && /already exists/i.test(e.message)) { 55 console.warn('[TT.ensurePolicy] â ï¸ Policy "' + name + '" å·²åå¨ (å¾é¯èª¤è¨æ¯å¤æ·)'); 56 57 // å試å¾å¿«ååå¾ (å¯è½æ¯å ¶ä»å°æ¹å»ºç«ç) 58 if (created[name]) { 59 return created[name]; 60 } 61 62 // å¦æå¿«åæ²æ,è¿å null (ç¡æ³åå¾å·²åå¨ç policy) 63 console.error('[TT.ensurePolicy] â Policy "' + name + '" å·²åå¨ä½ç¡æ³åå¾'); 64 return null; 65 } 66 67 console.error('[TT.ensurePolicy] â å»ºç« policy "' + name + '" 失æ:', e.message); 68 return null; 69 } 70 }; 71 72 TT.get = function get(name) { 73 if (!hasTT) return null; 74 75 // ç´æ¥å¾å¿«ååå¾ (æå¯é ) 76 return created[name] || null; 77 }; 78 79 // å°ä»»æè¼¸å ¥è½çº TrustedHTML 80 TT.toTrustedHTML = function toTrustedHTML(input) { 81 var s = String(input ?? ''); 82 if (!hasTT) return s; 83 84 try { 85 if (window.DOMPurify && typeof window.DOMPurify.sanitize === 'function') { 86 var purified = window.DOMPurify.sanitize(s, { RETURN_TRUSTED_TYPE: true }); 87 if (purified) return purified; 88 } 89 } catch (_) { } 90 91 var sanitizer = TT.get('sanitizer') || TT.get('default'); 92 return sanitizer && sanitizer.createHTML ? sanitizer.createHTML(s) : s; 93 }; 94 95 // ======= 建ç«åºç¤ policy ======= 96 if (hasTT) { 97 //console.log('[TT] éå§å»ºç«åºç¤ policies...'); 98 99 TT.ensurePolicy('default', { 100 createHTML: function (s) { return String(s ?? ''); }, 101 createScript: function (s) { return String(s ?? ''); }, 102 createScriptURL: function (s) { 103 var url = String(s ?? ''); 104 if (url.startsWith('data:') || url.startsWith('javascript:')) { 105 throw new Error('ä¸å 許 data: / javascript: URL'); 106 } 107 return url; 108 } 109 }); 110 111 TT.ensurePolicy('sanitizer', { 112 createHTML: function (s) { return String(s ?? ''); } 113 }); 114 115 // æ°å¢ easyui policy 116 TT.ensurePolicy('easyui', { 117 createHTML: function (s) { return String(s ?? ''); } 118 }); 119 120 //// æ°å¢ dompurify policy (å³ä½¿ç®åæªä½¿ç¨ DOMPurify library) 121 //TT.ensurePolicy('dompurify', { 122 // createHTML: function (s) { return String(s ?? ''); } 123 //}); 124 125 //console.log('[TT] åºç¤ policies 建ç«å®æ'); 126 //console.log('[TT] created å¿«å:', Object.keys(created)); 127 } 128})(); 129 130// 卿ªæ¡çæå¾ï¼ç¶ææ policies é½å»ºç«å®æå¾ï¼æ´¾ç¼ä¸åèªè¨äºä»¶ 131//console.log('[tt-policy-registry] ææåºç¤ policies 已建ç«
131ï¼æ´¾ç¼ tt-ready äºä»¶ã'); 132document.dispatchEvent(new Event('tt-ready'));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.