Skip to content

Commit

Permalink
Create absolute filter-URLs when needed in DOMFilterFactory (issue …
Browse files Browse the repository at this point in the history
…18406)

This functionality is purposely limited to development mode and GENERIC builds, since it's unnecessary in e.g. the *built-in* Firefox PDF Viewer, and will only be used when a `<base>`-element is actually present.

*Please note:* We also have tests in mozilla-central that will *indirectly* ensure that relative filter-URLs work as intended in the Firefox PDF Viewer, see https://searchfox.org/mozilla-central/source/toolkit/components/pdfjs/test/browser_pdfjs_filters.js

---

---

To test that the issue is fixed, the following code can be used:

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <base href=".">
  <title>base href (issue 18406)</title>
</head>
<body>

<ul>
  <li>Place this code in a file, named `base_href.html`, in the root of the PDF.js repository</li>
  <li>Run <pre>npx gulp dist-install</pre></li>
  <li>Run <pre>npx gulp server</pre></li>
  <li>Open <a href="http://localhost:8888/base_href.html">http://localhost:8888/base_href.html</a> in a browser</li>
  <li>Compare rendering with <a href="http://localhost:8888/web/viewer.html?file=/test/pdfs/issue16287.pdf">http://localhost:8888/web/viewer.html?file=/test/pdfs/issue16287.pdf</a></li>
</ul>

<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>

<script src="/node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>

<script id="script" type="module">
  //
  // If absolute URL from the remote server is provided, configure the CORS
  // header on that server.
  //
  const url = '/test/pdfs/issue16287.pdf';

  //
  // The workerSrc property shall be specified.
  //
  pdfjsLib.GlobalWorkerOptions.workerSrc =
    '/node_modules/pdfjs-dist/build/pdf.worker.mjs';

  //
  // Asynchronous download PDF
  //
  const loadingTask = pdfjsLib.getDocument(url);
  const pdf = await loadingTask.promise;
  //
  // Fetch the first page
  //
  const page = await pdf.getPage(1);
  const scale = 1.5;
  const viewport = page.getViewport({ scale });
  // Support HiDPI-screens.
  const outputScale = window.devicePixelRatio || 1;

  //
  // Prepare canvas using PDF page dimensions
  //
  const canvas = document.getElementById("the-canvas");
  const context = canvas.getContext("2d");

  canvas.width = Math.floor(viewport.width * outputScale);
  canvas.height = Math.floor(viewport.height * outputScale);
  canvas.style.width = Math.floor(viewport.width) + "px";
  canvas.style.height = Math.floor(viewport.height) + "px";

  const transform = outputScale !== 1
    ? [outputScale, 0, 0, outputScale, 0, 0]
    : null;

  //
  // Render PDF page into canvas context
  //
  const renderContext = {
    canvasContext: context,
    transform,
    viewport,
  };
  page.render(renderContext);
</script>

</body>
</html>
```
  • Loading branch information
Snuffleupagus committed Jul 10, 2024
1 parent 7ffea2f commit 6b818f8
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 5 deletions.
31 changes: 26 additions & 5 deletions src/display/display_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class PixelsPerInch {
* does the magic for us.
*/
class DOMFilterFactory extends BaseFilterFactory {
#baseUrl;

#_cache;

#_defs;
Expand Down Expand Up @@ -121,6 +123,25 @@ class DOMFilterFactory extends BaseFilterFactory {
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) {
if (!maps) {
return "none";
Expand All @@ -146,7 +167,7 @@ class DOMFilterFactory extends BaseFilterFactory {
// https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement

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(key, url);

Expand Down Expand Up @@ -232,7 +253,7 @@ class DOMFilterFactory extends BaseFilterFactory {
filter
);

info.url = `url(#${id})`;
info.url = this.#createUrl(id);
return info.url;
}

Expand All @@ -254,7 +275,7 @@ class DOMFilterFactory extends BaseFilterFactory {
}

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(key, url);

Expand Down Expand Up @@ -287,7 +308,7 @@ class DOMFilterFactory extends BaseFilterFactory {
}

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(key, url);

Expand Down Expand Up @@ -389,7 +410,7 @@ class DOMFilterFactory extends BaseFilterFactory {
filter
);

info.url = `url(#${id})`;
info.url = this.#createUrl(id);
return info.url;
}

Expand Down
1 change: 1 addition & 0 deletions test/pdfs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@
!issue7891_bc0.pdf
!issue11242_reduced.pdf
!issue16176.pdf
!issue16287.pdf
!issue17064_readonly.pdf
!issue11279.pdf
!issue11362.pdf
Expand Down
Binary file added test/pdfs/issue16287.pdf
Binary file not shown.
8 changes: 8 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5625,6 +5625,14 @@
"rounds": 1,
"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",
"file": "pdfs/issue2006.pdf",
Expand Down

0 comments on commit 6b818f8

Please sign in to comment.