From cdf8eec7d5dbc9041c026d8b394e3caba98a0124 Mon Sep 17 00:00:00 2001 From: Chumor <185651145+Chumor@users.noreply.github.com> Date: Sat, 21 Feb 2026 11:57:35 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix(download):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=93=9D=E5=A5=8F=E4=BA=91=E7=AD=89=E7=AB=99=E7=82=B9=E7=9A=84?= =?UTF-8?q?=20onclick=20=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.js | 24 ++++++++++++++++++++---- src/utils.js | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/utils.js diff --git a/src/main.js b/src/main.js index 240a83e..6b7e984 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,7 @@ import { isDownloadLink } from './detector.js'; import { openDownload } from './intent/factory.js'; import { showDownloadPicker } from './download-picker.js'; +import { extractUrlFromOnclick } from './utils.js'; import { registerMenu } from './menu.js'; registerMenu(); @@ -16,11 +17,26 @@ document.addEventListener('click', e => { if (e.__edgedl_handled__) return; e.__edgedl_handled__ = true; - const link = e.target?.closest?.('a'); - if (!link || !link.href) return; + const link = e.target?.closest?.('a, [onclick]'); + if (!link) return; - const url = link.href; - if (!isDownloadLink(url)) return; + let url = link.href; + + if ( + !url || + url === '#' || + url === '##' || + url.startsWith('javascript:') + ) { + const onclick = link.getAttribute('onclick') + || link.closest('[onclick]')?.getAttribute('onclick'); + + if (onclick) { + url = extractUrlFromOnclick(onclick); + } + } + + if (!url || !isDownloadLink(url)) return; // 阻止浏览器原生下载与页面跳转 e.preventDefault(); diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..927fdf4 --- /dev/null +++ b/src/utils.js @@ -0,0 +1,14 @@ +// 从 onclick 中解析下载 URL +export function extractUrlFromOnclick(onclick) { + if (!onclick) return null; + + const match = onclick.match( + /(https?:\/\/[^"'()\s]+)/i + ); + + if (match) { + return match[1]; + } + + return null; +} \ No newline at end of file From e936bea9347e685fae8e0154c99caebf77a8f4be Mon Sep 17 00:00:00 2001 From: Chumor <185651145+Chumor@users.noreply.github.com> Date: Sat, 21 Feb 2026 12:25:50 +0800 Subject: [PATCH 2/5] =?UTF-8?q?ci(build):=20dev=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E4=BA=A7=E7=89=A9=E7=89=88=E6=9C=AC=E5=8F=B7=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=20dev+commit=20=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c2db90..1e43619 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,16 +25,35 @@ jobs: - name: Build run: npm run build + - name: Inject version for dev build + if: github.ref_name == 'dev' + id: inject + run: | + BASE_VERSION=$(grep -E "@version\s+[0-9.]" rollup.config.js \ + | sed -E "s/.*@version\s+([0-9.]+).*/\1/") + + SHORT_SHA=$(git rev-parse --short HEAD) + + FULL_VERSION="${BASE_VERSION}-dev+${SHORT_SHA}" + + sed -i -E "s@// @version\s+.*@// @version ${FULL_VERSION}@" dist/EdgeDL.user.js + + echo "full_version=${FULL_VERSION}" >> $GITHUB_OUTPUT + - name: Resolve artifact name id: artifact run: | - VERSION=$(head -n 20 dist/EdgeDL.user.js | grep '@version' | sed -E 's/.*@version\s+([0-9.]+).*/\1/') + if [ -n "${{ steps.inject.outputs.full_version }}" ]; then + VERSION=${{ steps.inject.outputs.full_version }} + else + VERSION=$(head -n 20 dist/EdgeDL.user.js | grep '@version' | sed -E 's/.*@version\s+([0-9.]+).*/\1/') + fi SHORT_SHA=$(git rev-parse --short HEAD) if [ "${{ github.ref_name }}" = "main" ]; then NAME="EdgeDL-build-v${VERSION}" else - NAME="EdgeDL-build-v${VERSION}-${SHORT_SHA}" + NAME="EdgeDL-build-${VERSION}" fi echo "name=$NAME" >> $GITHUB_OUTPUT From 72a5aeb2488e8ffd2aec59709cbb03c366815d7a Mon Sep 17 00:00:00 2001 From: Chumor <185651145+Chumor@users.noreply.github.com> Date: Sat, 21 Feb 2026 12:35:08 +0800 Subject: [PATCH 3/5] =?UTF-8?q?ci(build):=20dev=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E7=89=88=E6=9C=AC=E5=8F=B7=E5=B9=B6=E8=A7=84?= =?UTF-8?q?=E8=8C=83=20artifact=20=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e43619..047f248 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,14 +29,14 @@ jobs: if: github.ref_name == 'dev' id: inject run: | - BASE_VERSION=$(grep -E "@version\s+[0-9.]" rollup.config.js \ - | sed -E "s/.*@version\s+([0-9.]+).*/\1/") + BASE_VERSION=$(grep -E "@version[[:space:]]+[0-9.]+" rollup.config.js \ + | sed -E 's/.*@version[[:space:]]+([0-9.]+).*/\1/') SHORT_SHA=$(git rev-parse --short HEAD) FULL_VERSION="${BASE_VERSION}-dev+${SHORT_SHA}" - sed -i -E "s@// @version\s+.*@// @version ${FULL_VERSION}@" dist/EdgeDL.user.js + sed -i -E "s@// @version[[:space:]]+.*@// @version ${FULL_VERSION}@" dist/EdgeDL.user.js echo "full_version=${FULL_VERSION}" >> $GITHUB_OUTPUT @@ -44,17 +44,13 @@ jobs: id: artifact run: | if [ -n "${{ steps.inject.outputs.full_version }}" ]; then - VERSION=${{ steps.inject.outputs.full_version }} + VERSION="${{ steps.inject.outputs.full_version }}" else - VERSION=$(head -n 20 dist/EdgeDL.user.js | grep '@version' | sed -E 's/.*@version\s+([0-9.]+).*/\1/') + VERSION=$(grep -E "@version[[:space:]]+[0-9.]+" rollup.config.js \ + | sed -E 's/.*@version[[:space:]]+([0-9.]+).*/\1/') fi - SHORT_SHA=$(git rev-parse --short HEAD) - if [ "${{ github.ref_name }}" = "main" ]; then - NAME="EdgeDL-build-v${VERSION}" - else - NAME="EdgeDL-build-${VERSION}" - fi + NAME="EdgeDL-build-${VERSION}" echo "name=$NAME" >> $GITHUB_OUTPUT @@ -62,4 +58,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: ${{ steps.artifact.outputs.name }} - path: dist/EdgeDL.user.js + path: dist/EdgeDL.user.js \ No newline at end of file From 2430e5db8eb53cf2eb1de8eb3f5ed02d417e26e5 Mon Sep 17 00:00:00 2001 From: Chumor <185651145+Chumor@users.noreply.github.com> Date: Sat, 21 Feb 2026 12:38:54 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E5=A4=8D=20dev=20?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E7=89=88=E6=9C=AC=E5=8F=B7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 047f248..3cb8c01 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,10 +33,9 @@ jobs: | sed -E 's/.*@version[[:space:]]+([0-9.]+).*/\1/') SHORT_SHA=$(git rev-parse --short HEAD) - FULL_VERSION="${BASE_VERSION}-dev+${SHORT_SHA}" - sed -i -E "s@// @version[[:space:]]+.*@// @version ${FULL_VERSION}@" dist/EdgeDL.user.js + sed -i -E "s|//[[:space:]]*@version[[:space:]]+.*|// @version ${FULL_VERSION}|" dist/EdgeDL.user.js echo "full_version=${FULL_VERSION}" >> $GITHUB_OUTPUT @@ -51,11 +50,10 @@ jobs: fi NAME="EdgeDL-build-${VERSION}" - echo "name=$NAME" >> $GITHUB_OUTPUT - name: Upload build artifact uses: actions/upload-artifact@v4 with: name: ${{ steps.artifact.outputs.name }} - path: dist/EdgeDL.user.js \ No newline at end of file + path: dist/EdgeDL.user.js From befd6e847b9eefb10c2cf5c6315f378dfdf11685 Mon Sep 17 00:00:00 2001 From: Chumor <185651145+Chumor@users.noreply.github.com> Date: Sat, 21 Feb 2026 12:41:43 +0800 Subject: [PATCH 5/5] release: 1.3.2 --- rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index 45985f4..5322114 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,7 +6,7 @@ const userscriptHeader = `// ==UserScript== // @name EdgeDL // @namespace https://github.com/Chumor/EdgeDL -// @version 1.3.1 +// @version 1.3.2 // @description EdgeDL:让 Android Edge 浏览器使用外部下载器下载文件 // @icon data:image/png;base64,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 // @author Chumor