Merge pull request #18417 from Snuffleupagus/DOMFilterFactory-baseUrl

Create absolute filter-URLs when needed in `DOMFilterFactory` (issue 18406)
This commit is contained in:
Jonas Jenwald 2024-07-11 12:25:16 +02:00 committed by GitHub
commit 8082c2daf1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 35 additions and 5 deletions

View file

@ -49,6 +49,8 @@ class PixelsPerInch {
* does the magic for us. * does the magic for us.
*/ */
class DOMFilterFactory extends BaseFilterFactory { class DOMFilterFactory extends BaseFilterFactory {
#baseUrl;
#_cache; #_cache;
#_defs; #_defs;
@ -121,6 +123,25 @@ class DOMFilterFactory extends BaseFilterFactory {
return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; return [bufferR.join(","), bufferG.join(","), bufferB.join(",")];
} }
#createUrl(id) {
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
if (this.#baseUrl === undefined) {
const url = this.#document.URL;
if (url === this.#document.baseURI) {
// No `<base>`-element present, hence a relative URL should work.
this.#baseUrl = "";
} else if (isDataScheme(url)) {
warn('#createUrl: ignore "data:"-URL for performance reasons.');
this.#baseUrl = "";
} else {
this.#baseUrl = url.split("#", 1)[0];
}
}
return `url(${this.#baseUrl}#${id})`;
}
return `url(${id})`;
}
addFilter(maps) { addFilter(maps) {
if (!maps) { if (!maps) {
return "none"; return "none";
@ -146,7 +167,7 @@ class DOMFilterFactory extends BaseFilterFactory {
// https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement // https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
const id = `g_${this.#docId}_transfer_map_${this.#id++}`; const id = `g_${this.#docId}_transfer_map_${this.#id++}`;
const url = `url(#${id})`; const url = this.#createUrl(id);
this.#cache.set(maps, url); this.#cache.set(maps, url);
this.#cache.set(key, url); this.#cache.set(key, url);
@ -232,7 +253,7 @@ class DOMFilterFactory extends BaseFilterFactory {
filter filter
); );
info.url = `url(#${id})`; info.url = this.#createUrl(id);
return info.url; return info.url;
} }
@ -254,7 +275,7 @@ class DOMFilterFactory extends BaseFilterFactory {
} }
const id = `g_${this.#docId}_alpha_map_${this.#id++}`; const id = `g_${this.#docId}_alpha_map_${this.#id++}`;
const url = `url(#${id})`; const url = this.#createUrl(id);
this.#cache.set(map, url); this.#cache.set(map, url);
this.#cache.set(key, url); this.#cache.set(key, url);
@ -287,7 +308,7 @@ class DOMFilterFactory extends BaseFilterFactory {
} }
const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;
const url = `url(#${id})`; const url = this.#createUrl(id);
this.#cache.set(map, url); this.#cache.set(map, url);
this.#cache.set(key, url); this.#cache.set(key, url);
@ -389,7 +410,7 @@ class DOMFilterFactory extends BaseFilterFactory {
filter filter
); );
info.url = `url(#${id})`; info.url = this.#createUrl(id);
return info.url; return info.url;
} }

View file

@ -127,6 +127,7 @@
!issue7891_bc0.pdf !issue7891_bc0.pdf
!issue11242_reduced.pdf !issue11242_reduced.pdf
!issue16176.pdf !issue16176.pdf
!issue16287.pdf
!issue17064_readonly.pdf !issue17064_readonly.pdf
!issue11279.pdf !issue11279.pdf
!issue11362.pdf !issue11362.pdf

BIN
test/pdfs/issue16287.pdf Normal file

Binary file not shown.

View file

@ -5646,6 +5646,14 @@
"rounds": 1, "rounds": 1,
"type": "eq" "type": "eq"
}, },
{
"id": "issue16287",
"file": "pdfs/issue16287.pdf",
"md5": "cd3e0859140465ae8b8bde0c95cb4929",
"rounds": 1,
"type": "eq",
"about": "Please note that this file currently renders incorrectly."
},
{ {
"id": "issue2006", "id": "issue2006",
"file": "pdfs/issue2006.pdf", "file": "pdfs/issue2006.pdf",