diff --git a/qutebrowser/browser/pdfjs.py b/qutebrowser/browser/pdfjs.py index da6dcbfe6..c6eef53d9 100644 --- a/qutebrowser/browser/pdfjs.py +++ b/qutebrowser/browser/pdfjs.py @@ -198,9 +198,12 @@ def is_available(): return True -def should_use_pdfjs(mimetype): - return (mimetype in ['application/pdf', 'application/x-pdf'] and - config.val.content.pdfjs) +def should_use_pdfjs(mimetype, url): + # e.g. 'blob:qute%3A///b45250b3-787e-44d1-a8d8-c2c90f81f981' + is_download_url = (url.scheme() == 'blob' and + QUrl(url.path()).scheme() == 'qute') + is_pdf = mimetype in ['application/pdf', 'application/x-pdf'] + return is_pdf and not is_download_url and config.val.content.pdfjs def get_main_url(filename): diff --git a/qutebrowser/browser/webengine/webenginedownloads.py b/qutebrowser/browser/webengine/webenginedownloads.py index a9d44427d..3f47dd640 100644 --- a/qutebrowser/browser/webengine/webenginedownloads.py +++ b/qutebrowser/browser/webengine/webenginedownloads.py @@ -221,7 +221,7 @@ class DownloadManager(downloads.AbstractDownloadManager): download.set_target(self._mhtml_target) self._mhtml_target = None return - if pdfjs.should_use_pdfjs(qt_item.mimeType()): + if pdfjs.should_use_pdfjs(qt_item.mimeType(), qt_item.url()): download.set_target(downloads.PDFJSDownloadTarget()) return diff --git a/qutebrowser/browser/webkit/webpage.py b/qutebrowser/browser/webkit/webpage.py index 7037f29fb..63017ec45 100644 --- a/qutebrowser/browser/webkit/webpage.py +++ b/qutebrowser/browser/webkit/webpage.py @@ -268,7 +268,7 @@ class BrowserPage(QWebPage): else: reply.finished.connect(functools.partial( self.display_content, reply, 'image/jpeg')) - elif pdfjs.should_use_pdfjs(mimetype): + elif pdfjs.should_use_pdfjs(mimetype, reply.url()): download_manager.fetch(reply, target=downloads.PDFJSDownloadTarget()) else: diff --git a/tests/unit/browser/test_pdfjs.py b/tests/unit/browser/test_pdfjs.py index ff62545bd..91536e416 100644 --- a/tests/unit/browser/test_pdfjs.py +++ b/tests/unit/browser/test_pdfjs.py @@ -173,15 +173,20 @@ def test_is_available(available, mocker): assert pdfjs.is_available() == available -@pytest.mark.parametrize('mimetype, enabled, expected', [ - ('application/pdf', True, True), - ('application/x-pdf', True, True), - ('application/octet-stream', True, False), - ('application/pdf', False, False), +@pytest.mark.parametrize('mimetype, url, enabled, expected', [ + # PDF files + ('application/pdf', 'http://www.example.com', True, True), + ('application/x-pdf', 'http://www.example.com', True, True), + # Not a PDF + ('application/octet-stream', 'http://www.example.com', True, False), + # PDF.js disabled + ('application/pdf', 'http://www.example.com', False, False), + # Download button in PDF.js + ('application/pdf', 'blob:qute%3A///b45250b3', True, False), ]) -def test_should_use_pdfjs(mimetype, enabled, expected, config_stub): +def test_should_use_pdfjs(mimetype, url, enabled, expected, config_stub): config_stub.val.content.pdfjs = enabled - assert pdfjs.should_use_pdfjs(mimetype) == expected + assert pdfjs.should_use_pdfjs(mimetype, QUrl(url)) == expected def test_get_main_url():