/** CSP-safe compatibility adapter. Images remain in this browser. */ (function () { 'use strict'; var root = document.querySelector('[data-suite-key="file-converter"]'); var en = root && root.getAttribute('data-suite-locale') === 'en'; var current = null; function address(asset) { var url = new URL('/wp-admin/admin-ajax.php', location.origin); url.searchParams.set('action', 'yuqi_tools_runtime_asset'); url.searchParams.set('asset', asset); url.searchParams.set('ver', 'heic-csp-1.5.2'); return url.href; } function cancel() { if (current) current(new Error(en ? 'HEIC conversion cancelled.' : 'HEIC 转换已取消。')); } // Keep the existing call signature; never load the former eval-based bundle. window.heic2any = function (options) { if (current) return Promise.reject(new Error(en ? 'A HEIC conversion is already running.' : '已有 HEIC 转换正在进行。')); if (!options || !(options.blob instanceof Blob) || !options.blob.size || options.blob.size > 10 * 1024 * 1024) { return Promise.reject(new Error('HEIC limit: 1 byte–10 MB')); } if (['image/jpeg', 'image/png'].indexOf(options.toType) < 0) return Promise.reject(new Error('Unsupported HEIC output format')); return new Promise(function (resolve, reject) { var worker, timer, settled = false; function finish(error, blob) { if (settled) return; settled = true; clearTimeout(timer); if (worker) worker.terminate(); current = null; if (error) reject(error); else resolve(blob); } current = function (error) { finish(error); }; try { worker = new Worker(address('heic-decode-worker'), { type: 'module' }); timer = setTimeout(function () { finish(new Error(en ? 'HEIC conversion timed out.' : 'HEIC 转换超时。')); }, 60000); worker.onerror = function (event) { finish(new Error(event.message || 'HEIC worker failed')); }; worker.onmessageerror = function () { finish(new Error('Invalid HEIC worker response')); }; worker.onmessage = function (event) { var data = event.data || {}, bitmap = data.bitmap; if (settled) { if (bitmap && bitmap.close) bitmap.close(); return; } if (data.error) { finish(new Error(String(data.error))); return; } var canvas; try { if (!bitmap) throw new Error('HEIC decoder returned no image'); if (!window.YuqiQuality) throw new Error('Image validation unavailable'); window.YuqiQuality.dimensions(bitmap.width, bitmap.height); canvas = document.createElement('canvas'); canvas.width = bitmap.width; canvas.height = bitmap.height; var ctx = canvas.getContext('2d'); if (!ctx) throw new Error('Canvas unavailable'); ctx.drawImage(bitmap, 0, 0); bitmap.close(); canvas.toBlob(function (blob) { canvas.width = 1; canvas.height = 1; if (!blob || blob.type !== options.toType) finish(new Error('HEIC image encoding failed')); else finish(null, blob); }, options.toType, options.quality == null ? 0.92 : options.quality); } catch (error) { if (bitmap && bitmap.close) bitmap.close(); if (canvas) { canvas.width = 1; canvas.height = 1; } finish(error); } }; worker.postMessage({ blob: options.blob }); } catch (error) { finish(error); } }); }; window.heic2any.cancel = cancel; if (root) { // Capture the existing workspace cancel action before the job resets controls. root.addEventListener('click', function (event) { var button = event.target.closest('button'); if (button && /^(取消当前处理|Cancel processing)$/.test(button.textContent.trim())) cancel(); }, true); var note = document.createElement('p'); note.className = 'yuqi-suite-hint'; note.textContent = en ? 'HEIC/HEIF exports the first image only, not every image in a burst or multi-image container. Decoder: heic-to 1.5.2 (LGPL-3.0), loaded only when needed. ' : 'HEIC / HEIF 仅导出首张图像,不会导出连拍或多图容器中的全部图像。解码器:heic-to 1.5.2(LGPL-3.0),仅转换时加载。'; var link = document.createElement('a'); link.href = 'https://github.com/hoppergee/heic-to/tree/f37af866f9aa6212ddc84b67a279c9f2386aba4f'; link.rel = 'noopener noreferrer'; link.target = '_blank'; link.textContent = en ? 'Decoder source and license' : '解码器源码与许可证'; note.appendChild(link); root.appendChild(note); } window.addEventListener('pagehide', cancel); }());