PageSourceSearch

https://www.taipeistarbank.com.tw/Scripts/tt-policy-registry.js?v=639267787635783292

js taipeistarbank.com.tw collected 2026-10-05 06:33:37 UTC 4,827 bytes, 132 lines download raw bytes

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.