|
1 | 1 | // 다운로드 가로채기 (Firefox 버전) |
2 | | -// - onCreated: URL 기반 즉시 감지 (1차 판정) |
3 | | -// - onChanged: filename 확정 시 재판정 (2차 판정) |
4 | | -// - browser.downloads.search로 최신 DownloadItem 재조회 |
| 2 | +// - onCreated: url/mime/referrer 기반 1차 판정 (filename 미확정일 수 있음) |
| 3 | +// - onChanged: filename 확정 시 2차 판정 |
| 4 | +// - browser.downloads.search 로 최신 DownloadItem 재조회 |
5 | 5 | // - handled 집합으로 동일 다운로드 중복 처리 방지 |
| 6 | +// |
| 7 | +// #207: 판정 로직은 rhwp-shared/sw/download-interceptor-common.js 와 공유. |
| 8 | +// Chrome 과 동일한 DEXT5 블랙리스트 / MIME 힌트 / finalUrl 검사 자동 적용. |
6 | 9 |
|
7 | 10 | import { openViewer } from './viewer-launcher.js'; |
| 11 | +import { shouldInterceptDownload } from './download-interceptor-common.js'; |
8 | 12 |
|
9 | | -const HWP_EXTENSIONS = /\.(hwp|hwpx)(\?.*)?$/i; |
10 | 13 | const handled = new Set(); // 이미 처리된 downloadId |
11 | 14 |
|
12 | 15 | export function setupDownloadInterceptor() { |
13 | | - // 1차: 다운로드 시작 시 URL 기반 즉시 감지 |
| 16 | + // 1차: 다운로드 시작 시 url/mime/referrer 로 즉시 판정 |
14 | 17 | browser.downloads.onCreated.addListener((item) => { |
15 | 18 | if (handled.has(item.id)) return; |
16 | 19 |
|
17 | | - if (HWP_EXTENSIONS.test(item.url || '')) { |
| 20 | + if (shouldInterceptDownload(item)) { |
18 | 21 | handled.add(item.id); |
19 | 22 | handleHwpDownload(item); |
20 | 23 | } |
21 | | - // URL로 판별 불가 시: filename 확정될 때 onChanged에서 재판정 |
| 24 | + // 판정 불가 시: filename 확정될 때 onChanged에서 재판정 |
22 | 25 | }); |
23 | 26 |
|
24 | 27 | // 2차: filename 확정 시 재판정 |
25 | 28 | browser.downloads.onChanged.addListener(async (delta) => { |
26 | | - // filename 확정으로 HWP가 처음 판정되는 경우에만 처리 |
27 | | - if (!handled.has(delta.id) |
28 | | - && delta.filename?.current |
29 | | - && HWP_EXTENSIONS.test(delta.filename.current)) { |
30 | | - handled.add(delta.id); |
31 | | - |
| 29 | + // 아직 미처리 + filename 확정 → 최신 DownloadItem 으로 재판정 |
| 30 | + if (!handled.has(delta.id) && delta.filename?.current) { |
32 | 31 | try { |
33 | | - // 최신 DownloadItem 재조회 (url, fileSize 등 완전한 정보 확보) |
34 | 32 | const [item] = await browser.downloads.search({ id: delta.id }); |
35 | | - if (item) { |
| 33 | + if (item && shouldInterceptDownload(item)) { |
| 34 | + handled.add(delta.id); |
36 | 35 | handleHwpDownload(item); |
37 | 36 | } |
38 | 37 | } catch (err) { |
@@ -61,7 +60,7 @@ async function handleHwpDownload(item) { |
61 | 60 |
|
62 | 61 | openViewer({ |
63 | 62 | url: item.url, |
64 | | - filename: item.filename |
| 63 | + filename: item.filename, |
65 | 64 | }); |
66 | 65 | } catch (err) { |
67 | 66 | console.error('[rhwp] 다운로드 인터셉터 오류:', err); |
|
0 commit comments