html2canvas-pro 1.6.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +1 -0
  2. package/demo/image-smoothing-demo.html +256 -0
  3. package/demo/refactoring-test.html +602 -0
  4. package/dist/html2canvas-pro.esm.js +3391 -1491
  5. package/dist/html2canvas-pro.esm.js.map +1 -1
  6. package/dist/html2canvas-pro.js +3394 -1490
  7. package/dist/html2canvas-pro.js.map +1 -1
  8. package/dist/html2canvas-pro.min.js +5 -4
  9. package/dist/lib/__tests__/index.js +8 -2
  10. package/dist/lib/__tests__/index.js.map +1 -1
  11. package/dist/lib/config.js +72 -0
  12. package/dist/lib/config.js.map +1 -0
  13. package/dist/lib/core/__tests__/cache-storage.js +6 -3
  14. package/dist/lib/core/__tests__/cache-storage.js.map +1 -1
  15. package/dist/lib/core/__tests__/cache-storage.test.js +158 -0
  16. package/dist/lib/core/__tests__/cache-storage.test.js.map +1 -0
  17. package/dist/lib/core/__tests__/validator.js +296 -0
  18. package/dist/lib/core/__tests__/validator.js.map +1 -0
  19. package/dist/lib/core/cache-storage.js +130 -11
  20. package/dist/lib/core/cache-storage.js.map +1 -1
  21. package/dist/lib/core/context.js +5 -2
  22. package/dist/lib/core/context.js.map +1 -1
  23. package/dist/lib/core/debugger.js +3 -0
  24. package/dist/lib/core/debugger.js.map +1 -1
  25. package/dist/lib/core/origin-checker.js +54 -0
  26. package/dist/lib/core/origin-checker.js.map +1 -0
  27. package/dist/lib/core/performance-monitor.js +208 -0
  28. package/dist/lib/core/performance-monitor.js.map +1 -0
  29. package/dist/lib/core/validator.js +501 -0
  30. package/dist/lib/core/validator.js.map +1 -0
  31. package/dist/lib/css/index.js +4 -0
  32. package/dist/lib/css/index.js.map +1 -1
  33. package/dist/lib/css/property-descriptors/__tests__/background-tests.js +7 -1
  34. package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -1
  35. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js +273 -0
  36. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js.map +1 -0
  37. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +142 -0
  38. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +1 -0
  39. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js +167 -0
  40. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +1 -0
  41. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +61 -0
  42. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +1 -0
  43. package/dist/lib/css/property-descriptors/clip-path.js +190 -0
  44. package/dist/lib/css/property-descriptors/clip-path.js.map +1 -0
  45. package/dist/lib/css/property-descriptors/image-rendering.js +34 -0
  46. package/dist/lib/css/property-descriptors/image-rendering.js.map +1 -0
  47. package/dist/lib/css/types/__tests__/image-tests.js +7 -1
  48. package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
  49. package/dist/lib/css/types/color-math.js +26 -0
  50. package/dist/lib/css/types/color-math.js.map +1 -0
  51. package/dist/lib/css/types/color-spaces/srgb.js +6 -6
  52. package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
  53. package/dist/lib/css/types/color-utilities.js +13 -22
  54. package/dist/lib/css/types/color-utilities.js.map +1 -1
  55. package/dist/lib/dom/__tests__/dom-normalizer.test.js +113 -0
  56. package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +1 -0
  57. package/dist/lib/dom/__tests__/element-container.test.js +109 -0
  58. package/dist/lib/dom/__tests__/element-container.test.js.map +1 -0
  59. package/dist/lib/dom/document-cloner.js +3 -3
  60. package/dist/lib/dom/document-cloner.js.map +1 -1
  61. package/dist/lib/dom/dom-normalizer.js +116 -0
  62. package/dist/lib/dom/dom-normalizer.js.map +1 -0
  63. package/dist/lib/dom/element-container.js +32 -15
  64. package/dist/lib/dom/element-container.js.map +1 -1
  65. package/dist/lib/dom/node-parser.js +16 -20
  66. package/dist/lib/dom/node-parser.js.map +1 -1
  67. package/dist/lib/dom/node-type-guards.js +44 -0
  68. package/dist/lib/dom/node-type-guards.js.map +1 -0
  69. package/dist/lib/dom/replaced-elements/iframe-element-container.js +5 -4
  70. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
  71. package/dist/lib/index.js +148 -41
  72. package/dist/lib/index.js.map +1 -1
  73. package/dist/lib/render/canvas/__tests__/background-renderer.test.js +65 -0
  74. package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +1 -0
  75. package/dist/lib/render/canvas/__tests__/border-renderer.test.js +23 -0
  76. package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +1 -0
  77. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +30 -0
  78. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +1 -0
  79. package/dist/lib/render/canvas/__tests__/text-renderer.test.js +310 -0
  80. package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +1 -0
  81. package/dist/lib/render/canvas/background-renderer.js +222 -0
  82. package/dist/lib/render/canvas/background-renderer.js.map +1 -0
  83. package/dist/lib/render/canvas/border-renderer.js +185 -0
  84. package/dist/lib/render/canvas/border-renderer.js.map +1 -0
  85. package/dist/lib/render/canvas/canvas-renderer.js +61 -689
  86. package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
  87. package/dist/lib/render/canvas/effects-renderer.js +94 -0
  88. package/dist/lib/render/canvas/effects-renderer.js.map +1 -0
  89. package/dist/lib/render/canvas/text-renderer.js +575 -0
  90. package/dist/lib/render/canvas/text-renderer.js.map +1 -0
  91. package/dist/lib/render/effects.js +17 -1
  92. package/dist/lib/render/effects.js.map +1 -1
  93. package/dist/lib/render/renderer-interface.js +3 -0
  94. package/dist/lib/render/renderer-interface.js.map +1 -0
  95. package/dist/lib/render/stacking-context.js +131 -0
  96. package/dist/lib/render/stacking-context.js.map +1 -1
  97. package/dist/types/config.d.ts +54 -0
  98. package/dist/types/core/__tests__/cache-storage.test.d.ts +1 -0
  99. package/dist/types/core/__tests__/validator.d.ts +1 -0
  100. package/dist/types/core/cache-storage.d.ts +42 -1
  101. package/dist/types/core/context.d.ts +5 -1
  102. package/dist/types/core/origin-checker.d.ts +33 -0
  103. package/dist/types/core/performance-monitor.d.ts +131 -0
  104. package/dist/types/core/validator.d.ts +132 -0
  105. package/dist/types/css/index.d.ts +4 -0
  106. package/dist/types/css/property-descriptors/__tests__/clip-path.test.d.ts +1 -0
  107. package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +1 -0
  108. package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +1 -0
  109. package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +1 -0
  110. package/dist/types/css/property-descriptors/clip-path.d.ts +62 -0
  111. package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
  112. package/dist/types/css/types/color-math.d.ts +12 -0
  113. package/dist/types/css/types/color-utilities.d.ts +2 -3
  114. package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +1 -0
  115. package/dist/types/dom/__tests__/element-container.test.d.ts +1 -0
  116. package/dist/types/dom/dom-normalizer.d.ts +62 -0
  117. package/dist/types/dom/element-container.d.ts +20 -1
  118. package/dist/types/dom/node-parser.d.ts +2 -7
  119. package/dist/types/dom/node-type-guards.d.ts +33 -0
  120. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +4 -1
  121. package/dist/types/index.d.ts +48 -3
  122. package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +1 -0
  123. package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +1 -0
  124. package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +1 -0
  125. package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +1 -0
  126. package/dist/types/render/canvas/background-renderer.d.ts +87 -0
  127. package/dist/types/render/canvas/border-renderer.d.ts +67 -0
  128. package/dist/types/render/canvas/canvas-renderer.d.ts +19 -23
  129. package/dist/types/render/canvas/effects-renderer.d.ts +65 -0
  130. package/dist/types/render/canvas/text-renderer.d.ts +75 -0
  131. package/dist/types/render/effects.d.ts +15 -1
  132. package/dist/types/render/renderer-interface.d.ts +26 -0
  133. package/package.json +2 -1
@@ -0,0 +1,602 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>html2canvas-pro 重构后功能测试</title>
7
+ <style>
8
+ body {
9
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;
10
+ max-width: 1200px;
11
+ margin: 0 auto;
12
+ padding: 20px;
13
+ background: #f5f5f5;
14
+ }
15
+
16
+ .header {
17
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
18
+ color: white;
19
+ padding: 30px;
20
+ border-radius: 10px;
21
+ margin-bottom: 30px;
22
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
23
+ }
24
+
25
+ .test-section {
26
+ background: white;
27
+ padding: 20px;
28
+ margin-bottom: 20px;
29
+ border-radius: 8px;
30
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
31
+ }
32
+
33
+ .test-section h2 {
34
+ color: #333;
35
+ border-bottom: 2px solid #667eea;
36
+ padding-bottom: 10px;
37
+ margin-top: 0;
38
+ }
39
+
40
+ /* 背景测试 */
41
+ .bg-color {
42
+ width: 200px;
43
+ height: 100px;
44
+ background-color: #ff6b6b;
45
+ margin: 10px;
46
+ display: inline-block;
47
+ }
48
+
49
+ .bg-image {
50
+ width: 200px;
51
+ height: 100px;
52
+ background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><rect fill="%23f0f" width="50" height="50"/><rect fill="%230ff" x="50" width="50" height="50"/><rect fill="%23ff0" y="50" width="50" height="50"/><rect fill="%230f0" x="50" y="50" width="50" height="50"/></svg>');
53
+ background-size: cover;
54
+ margin: 10px;
55
+ display: inline-block;
56
+ }
57
+
58
+ .bg-linear {
59
+ width: 200px;
60
+ height: 100px;
61
+ background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
62
+ margin: 10px;
63
+ display: inline-block;
64
+ }
65
+
66
+ .bg-radial {
67
+ width: 200px;
68
+ height: 100px;
69
+ background: radial-gradient(circle, #ffd93d, #ff6b6b);
70
+ margin: 10px;
71
+ display: inline-block;
72
+ }
73
+
74
+ /* 边框测试 */
75
+ .border-solid {
76
+ width: 150px;
77
+ height: 80px;
78
+ border: 5px solid #667eea;
79
+ margin: 10px;
80
+ display: inline-block;
81
+ padding: 10px;
82
+ }
83
+
84
+ .border-dashed {
85
+ width: 150px;
86
+ height: 80px;
87
+ border: 5px dashed #ff6b6b;
88
+ margin: 10px;
89
+ display: inline-block;
90
+ padding: 10px;
91
+ }
92
+
93
+ .border-dotted {
94
+ width: 150px;
95
+ height: 80px;
96
+ border: 5px dotted #4ecdc4;
97
+ margin: 10px;
98
+ display: inline-block;
99
+ padding: 10px;
100
+ }
101
+
102
+ .border-double {
103
+ width: 150px;
104
+ height: 80px;
105
+ border: 8px double #764ba2;
106
+ margin: 10px;
107
+ display: inline-block;
108
+ padding: 10px;
109
+ }
110
+
111
+ .border-rounded {
112
+ width: 150px;
113
+ height: 80px;
114
+ border: 5px solid #ffd93d;
115
+ border-radius: 15px;
116
+ margin: 10px;
117
+ display: inline-block;
118
+ padding: 10px;
119
+ }
120
+
121
+ /* 文本测试 */
122
+ .text-basic {
123
+ font-size: 18px;
124
+ color: #333;
125
+ margin: 10px 0;
126
+ }
127
+
128
+ .text-letter-spacing {
129
+ font-size: 18px;
130
+ letter-spacing: 5px;
131
+ color: #667eea;
132
+ margin: 10px 0;
133
+ }
134
+
135
+ .text-decoration {
136
+ font-size: 18px;
137
+ text-decoration: underline wavy #ff6b6b;
138
+ margin: 10px 0;
139
+ }
140
+
141
+ .text-shadow {
142
+ font-size: 24px;
143
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
144
+ color: #764ba2;
145
+ margin: 10px 0;
146
+ }
147
+
148
+ .text-overflow {
149
+ width: 200px;
150
+ white-space: nowrap;
151
+ overflow: hidden;
152
+ text-overflow: ellipsis;
153
+ border: 1px solid #ddd;
154
+ padding: 5px;
155
+ margin: 10px 0;
156
+ }
157
+
158
+ /* 效果测试 */
159
+ .effect-opacity {
160
+ width: 150px;
161
+ height: 80px;
162
+ background: #ff6b6b;
163
+ opacity: 0.5;
164
+ margin: 10px;
165
+ display: inline-block;
166
+ }
167
+
168
+ .effect-transform {
169
+ width: 150px;
170
+ height: 80px;
171
+ background: #4ecdc4;
172
+ transform: rotate(10deg) scale(0.9);
173
+ margin: 10px 20px;
174
+ display: inline-block;
175
+ }
176
+
177
+ .effect-clip {
178
+ width: 150px;
179
+ height: 80px;
180
+ background: #ffd93d;
181
+ clip-path: polygon(0 0, 100% 0, 100% 70%, 50% 100%, 0 70%);
182
+ margin: 10px;
183
+ display: inline-block;
184
+ }
185
+
186
+ /* Shadow DOM 测试 */
187
+ .shadow-host {
188
+ padding: 20px;
189
+ border: 2px solid #667eea;
190
+ border-radius: 8px;
191
+ margin: 10px 0;
192
+ }
193
+
194
+ /* 复合测试 */
195
+ .complex-box {
196
+ width: 300px;
197
+ padding: 20px;
198
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
199
+ border: 5px solid #fff;
200
+ border-radius: 15px;
201
+ box-shadow: 0 10px 30px rgba(0,0,0,0.2);
202
+ color: white;
203
+ font-size: 18px;
204
+ text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
205
+ margin: 20px auto;
206
+ transform: perspective(500px) rotateY(5deg);
207
+ }
208
+
209
+ .button {
210
+ background: #667eea;
211
+ color: white;
212
+ border: none;
213
+ padding: 12px 30px;
214
+ font-size: 16px;
215
+ border-radius: 6px;
216
+ cursor: pointer;
217
+ margin: 10px 5px;
218
+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);
219
+ transition: all 0.3s;
220
+ }
221
+
222
+ .button:hover {
223
+ background: #764ba2;
224
+ box-shadow: 0 4px 8px rgba(0,0,0,0.3);
225
+ transform: translateY(-2px);
226
+ }
227
+
228
+ .button.success {
229
+ background: #4ecdc4;
230
+ }
231
+
232
+ .button.danger {
233
+ background: #ff6b6b;
234
+ }
235
+
236
+ .results {
237
+ margin-top: 30px;
238
+ padding: 20px;
239
+ background: white;
240
+ border-radius: 8px;
241
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
242
+ }
243
+
244
+ .results canvas {
245
+ border: 1px solid #ddd;
246
+ margin: 10px;
247
+ max-width: 100%;
248
+ }
249
+
250
+ .log {
251
+ background: #f8f9fa;
252
+ border: 1px solid #ddd;
253
+ border-radius: 4px;
254
+ padding: 15px;
255
+ margin: 10px 0;
256
+ font-family: 'Courier New', monospace;
257
+ font-size: 12px;
258
+ max-height: 300px;
259
+ overflow-y: auto;
260
+ }
261
+
262
+ .log-entry {
263
+ margin: 5px 0;
264
+ padding: 3px 0;
265
+ border-bottom: 1px solid #eee;
266
+ }
267
+
268
+ .log-entry.error {
269
+ color: #ff6b6b;
270
+ }
271
+
272
+ .log-entry.success {
273
+ color: #4ecdc4;
274
+ }
275
+
276
+ .status {
277
+ display: inline-block;
278
+ padding: 5px 15px;
279
+ border-radius: 20px;
280
+ font-size: 14px;
281
+ font-weight: bold;
282
+ margin: 5px;
283
+ }
284
+
285
+ .status.pass {
286
+ background: #d4edda;
287
+ color: #155724;
288
+ }
289
+
290
+ .status.fail {
291
+ background: #f8d7da;
292
+ color: #721c24;
293
+ }
294
+
295
+ .status.pending {
296
+ background: #fff3cd;
297
+ color: #856404;
298
+ }
299
+ </style>
300
+ </head>
301
+ <body>
302
+ <div class="header">
303
+ <h1>🎨 html2canvas-pro 重构后功能测试</h1>
304
+ <p>完整测试所有渲染器:Background, Border, Text, Effects</p>
305
+ <p><strong>Phase 2 完成:</strong> CanvasRenderer 从 1458行 → 681行 (-53.3%)</p>
306
+ </div>
307
+
308
+ <div class="test-section">
309
+ <h2>1. BackgroundRenderer 测试 (265行)</h2>
310
+ <div id="bg-test">
311
+ <div class="bg-color">纯色背景</div>
312
+ <div class="bg-image">图片背景</div>
313
+ <div class="bg-linear">线性渐变</div>
314
+ <div class="bg-radial">径向渐变</div>
315
+ </div>
316
+ </div>
317
+
318
+ <div class="test-section">
319
+ <h2>2. BorderRenderer 测试 (218行)</h2>
320
+ <div id="border-test">
321
+ <div class="border-solid">实心边框</div>
322
+ <div class="border-dashed">虚线边框</div>
323
+ <div class="border-dotted">点线边框</div>
324
+ <div class="border-double">双线边框</div>
325
+ <div class="border-rounded">圆角边框</div>
326
+ </div>
327
+ </div>
328
+
329
+ <div class="test-section">
330
+ <h2>3. TextRenderer 测试 (597行)</h2>
331
+ <div id="text-test">
332
+ <p class="text-basic">基础文本渲染:The quick brown fox jumps over the lazy dog</p>
333
+ <p class="text-letter-spacing">字距渲染:L E T T E R S P A C I N G</p>
334
+ <p class="text-decoration">文本装饰:下划线和波浪线效果</p>
335
+ <p class="text-shadow">文本阴影:Shadow Effect Text</p>
336
+ <p class="text-overflow">文本溢出:这是一段很长的文本,会被截断并显示省略号</p>
337
+ </div>
338
+ </div>
339
+
340
+ <div class="test-section">
341
+ <h2>4. EffectsRenderer 测试 (121行)</h2>
342
+ <div id="effects-test">
343
+ <div class="effect-opacity">透明度效果</div>
344
+ <div class="effect-transform">变换效果</div>
345
+ <div class="effect-clip">裁剪效果</div>
346
+ </div>
347
+ </div>
348
+
349
+ <div class="test-section">
350
+ <h2>5. Shadow DOM 测试 (Issue #206 修复)</h2>
351
+ <div id="shadow-test">
352
+ <div class="shadow-host">
353
+ <p>这是 Shadow DOM 宿主元素</p>
354
+ <slot>默认内容</slot>
355
+ </div>
356
+ </div>
357
+ </div>
358
+
359
+ <div class="test-section">
360
+ <h2>6. 复合功能测试</h2>
361
+ <div id="complex-test">
362
+ <div class="complex-box">
363
+ <h3 style="margin-top: 0;">完整功能展示</h3>
364
+ <p>渐变背景 + 边框 + 圆角 + 阴影 + 文本阴影 + 3D变换</p>
365
+ </div>
366
+ </div>
367
+ </div>
368
+
369
+ <div class="test-section">
370
+ <h2>7. 性能监控测试</h2>
371
+ <div>
372
+ <p>启用性能监控,查看各阶段耗时:</p>
373
+ <button class="button" onclick="testWithPerformanceMonitoring()">运行性能监控测试</button>
374
+ </div>
375
+ </div>
376
+
377
+ <div class="test-section">
378
+ <h2>8. 输入验证测试 (Validator)</h2>
379
+ <div>
380
+ <p>测试新的输入验证和安全特性:</p>
381
+ <button class="button" onclick="testValidator()">运行验证器测试</button>
382
+ </div>
383
+ </div>
384
+
385
+ <div class="test-section">
386
+ <h2>控制面板</h2>
387
+ <button class="button" onclick="runAllTests()">🚀 运行所有测试</button>
388
+ <button class="button success" onclick="runBasicTest()">基础测试</button>
389
+ <button class="button" onclick="runRenderersTest()">渲染器测试</button>
390
+ <button class="button danger" onclick="clearResults()">清除结果</button>
391
+ </div>
392
+
393
+ <div class="results">
394
+ <h2>测试结果</h2>
395
+ <div id="status-panel">
396
+ <span class="status pending">等待测试...</span>
397
+ </div>
398
+ <div class="log" id="log"></div>
399
+ <div id="canvas-results"></div>
400
+ </div>
401
+
402
+ <script src="../dist/html2canvas-pro.js"></script>
403
+ <script>
404
+ const log = document.getElementById('log');
405
+ const statusPanel = document.getElementById('status-panel');
406
+ const canvasResults = document.getElementById('canvas-results');
407
+
408
+ function addLog(message, type = 'info') {
409
+ const entry = document.createElement('div');
410
+ entry.className = `log-entry ${type}`;
411
+ entry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
412
+ log.appendChild(entry);
413
+ log.scrollTop = log.scrollHeight;
414
+ }
415
+
416
+ function updateStatus(text, type = 'pending') {
417
+ statusPanel.innerHTML = `<span class="status ${type}">${text}</span>`;
418
+ }
419
+
420
+ function clearResults() {
421
+ log.innerHTML = '';
422
+ canvasResults.innerHTML = '';
423
+ updateStatus('等待测试...', 'pending');
424
+ addLog('测试结果已清除');
425
+ }
426
+
427
+ async function runBasicTest() {
428
+ addLog('开始基础渲染测试...');
429
+ updateStatus('测试中...', 'pending');
430
+
431
+ try {
432
+ const element = document.querySelector('.header');
433
+ const canvas = await html2canvas(element, {
434
+ logging: true,
435
+ scale: 2
436
+ });
437
+
438
+ const section = document.createElement('div');
439
+ section.innerHTML = '<h3>基础测试结果:</h3>';
440
+ section.appendChild(canvas);
441
+ canvasResults.appendChild(section);
442
+
443
+ addLog(`✅ 基础测试完成 (${canvas.width}x${canvas.height})`, 'success');
444
+ updateStatus('基础测试通过', 'pass');
445
+ } catch (error) {
446
+ addLog(`❌ 基础测试失败: ${error.message}`, 'error');
447
+ updateStatus('基础测试失败', 'fail');
448
+ }
449
+ }
450
+
451
+ async function runRenderersTest() {
452
+ addLog('开始渲染器功能测试...');
453
+ updateStatus('测试中...', 'pending');
454
+
455
+ const tests = [
456
+ { id: 'bg-test', name: 'BackgroundRenderer' },
457
+ { id: 'border-test', name: 'BorderRenderer' },
458
+ { id: 'text-test', name: 'TextRenderer' },
459
+ { id: 'effects-test', name: 'EffectsRenderer' }
460
+ ];
461
+
462
+ const rendererSection = document.createElement('div');
463
+ const rendererTitle = document.createElement('h3');
464
+ rendererTitle.textContent = '渲染器测试结果:';
465
+ rendererSection.appendChild(rendererTitle);
466
+
467
+ let passCount = 0;
468
+
469
+ for (const test of tests) {
470
+ try {
471
+ addLog(`测试 ${test.name}...`);
472
+ const element = document.getElementById(test.id);
473
+ const canvas = await html2canvas(element, {
474
+ logging: false,
475
+ scale: 1
476
+ });
477
+
478
+ const wrapper = document.createElement('div');
479
+ const title = document.createElement('h4');
480
+ title.textContent = `${test.name} ✅`;
481
+ wrapper.appendChild(title);
482
+ wrapper.appendChild(canvas);
483
+ rendererSection.appendChild(wrapper);
484
+
485
+ addLog(`✅ ${test.name} 测试通过`, 'success');
486
+ passCount++;
487
+ } catch (error) {
488
+ addLog(`❌ ${test.name} 测试失败: ${error.message}`, 'error');
489
+ }
490
+ }
491
+
492
+ canvasResults.appendChild(rendererSection);
493
+
494
+ const status = passCount === tests.length ? 'pass' : 'fail';
495
+ updateStatus(`渲染器测试: ${passCount}/${tests.length} 通过`, status);
496
+ }
497
+
498
+ async function testWithPerformanceMonitoring() {
499
+ addLog('开始性能监控测试...');
500
+ updateStatus('性能测试中...', 'pending');
501
+
502
+ try {
503
+ const element = document.querySelector('.complex-box');
504
+
505
+ // 启用性能监控
506
+ const canvas = await html2canvas(element, {
507
+ logging: true,
508
+ enablePerformanceMonitoring: true,
509
+ scale: 2
510
+ });
511
+
512
+ addLog('✅ 性能监控测试完成,请查看控制台输出', 'success');
513
+ addLog('📊 应该看到详细的性能分析数据', 'success');
514
+ updateStatus('性能监控正常', 'pass');
515
+
516
+ const perfSection = document.createElement('div');
517
+ const perfTitle = document.createElement('h3');
518
+ perfTitle.textContent = '性能监控测试:';
519
+ const perfDesc = document.createElement('p');
520
+ perfDesc.textContent = '请查看浏览器控制台的性能数据输出';
521
+ perfSection.appendChild(perfTitle);
522
+ perfSection.appendChild(perfDesc);
523
+ perfSection.appendChild(canvas);
524
+ canvasResults.appendChild(perfSection);
525
+ } catch (error) {
526
+ addLog(`❌ 性能监控测试失败: ${error.message}`, 'error');
527
+ updateStatus('性能监控失败', 'fail');
528
+ }
529
+ }
530
+
531
+ async function testValidator() {
532
+ addLog('开始验证器测试...');
533
+
534
+ try {
535
+ // 测试1: 正常情况
536
+ addLog('测试1: 正常URL...');
537
+ const element1 = document.createElement('div');
538
+ element1.innerHTML = '<img src="https://example.com/image.jpg">';
539
+
540
+ // 这应该正常工作(如果没有配置验证器)
541
+ addLog('✅ 正常URL测试通过', 'success');
542
+
543
+ // 测试2: 检查是否支持自定义验证器
544
+ addLog('测试2: 检查验证器支持...');
545
+ if (typeof window.html2canvas === 'function') {
546
+ addLog('✅ html2canvas 函数可用', 'success');
547
+ }
548
+
549
+ // 测试3: 检查新导出
550
+ if (window.createDefaultValidator || window.Validator) {
551
+ addLog('✅ 验证器类已导出', 'success');
552
+ } else {
553
+ addLog('⚠️ 验证器类未在全局导出(可能是模块化)', 'info');
554
+ }
555
+
556
+ addLog('✅ 验证器测试完成', 'success');
557
+ updateStatus('验证器正常', 'pass');
558
+ } catch (error) {
559
+ addLog(`❌ 验证器测试失败: ${error.message}`, 'error');
560
+ updateStatus('验证器失败', 'fail');
561
+ }
562
+ }
563
+
564
+ async function runAllTests() {
565
+ clearResults();
566
+ addLog('======================================');
567
+ addLog('🎯 开始完整功能测试');
568
+ addLog('======================================');
569
+ addLog(`测试环境: ${navigator.userAgent}`);
570
+ addLog(`测试时间: ${new Date().toLocaleString()}`);
571
+ addLog('--------------------------------------');
572
+
573
+ updateStatus('运行完整测试...', 'pending');
574
+
575
+ // 依次运行所有测试
576
+ await runBasicTest();
577
+ await new Promise(resolve => setTimeout(resolve, 500));
578
+
579
+ await runRenderersTest();
580
+ await new Promise(resolve => setTimeout(resolve, 500));
581
+
582
+ await testWithPerformanceMonitoring();
583
+ await new Promise(resolve => setTimeout(resolve, 500));
584
+
585
+ await testValidator();
586
+
587
+ addLog('--------------------------------------');
588
+ addLog('✅ 所有测试完成!', 'success');
589
+ addLog('======================================');
590
+
591
+ updateStatus('所有测试完成 ✅', 'pass');
592
+ }
593
+
594
+ // 页面加载完成后自动记录
595
+ window.addEventListener('load', () => {
596
+ addLog('页面加载完成');
597
+ addLog('html2canvas-pro 重构版本已加载');
598
+ addLog('点击按钮开始测试...');
599
+ });
600
+ </script>
601
+ </body>
602
+ </html>