From 3b3846c9dc0e2f40926ef8e146f8e92409ee89da Mon Sep 17 00:00:00 2001 From: Imran Sobir Date: Mon, 27 Feb 2017 22:37:24 +0500 Subject: [PATCH] Add qute:javascript to serve JS files. --- qutebrowser/browser/qutescheme.py | 13 ++++++++ tests/unit/browser/test_qutescheme.py | 44 +++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 06417518c..77bb5fadc 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -248,6 +248,19 @@ def qute_history(url): return 'text/html', jinja.render('history.html', title='History') +@add_handler('javascript') +def qute_javascript(url): + """Handler for qute:javascript. + + Return content of file given as query parameter. + """ + path = url.path() + if path: + return 'text/html', utils.read_file("javascript" + path, binary=False) + else: + raise QuteSchemeError("No file specified", ValueError()) + + @add_handler('pyeval') def qute_pyeval(_url): """Handler for qute:pyeval.""" diff --git a/tests/unit/browser/test_qutescheme.py b/tests/unit/browser/test_qutescheme.py index 252499287..736e739aa 100644 --- a/tests/unit/browser/test_qutescheme.py +++ b/tests/unit/browser/test_qutescheme.py @@ -18,6 +18,7 @@ # along with qutebrowser. If not, see . import json +import os import time from PyQt5.QtCore import QUrl @@ -27,6 +28,49 @@ from qutebrowser.browser import history, qutescheme from qutebrowser.utils import objreg +class TestJavascriptHandler: + + """Test the qute://javascript endpoint.""" + + # Tuples of fake JS files and their content. + js_files = [ + ('foo.js', "var a = 'foo';"), + ('bar.js', "var a = 'bar';"), + ] + + @pytest.fixture(autouse=True) + def patch_read_file(self, monkeypatch): + """Patch utils.read_file to return few fake JS files.""" + def _read_file(path, binary=False): + """Faked utils.read_file""" + assert not binary + for filename, content in self.js_files: + if path == os.path.join('javascript', filename): + return content + raise IOError("File not found {}!".format(path)) + + monkeypatch.setattr('qutebrowser.utils.utils.read_file', _read_file) + + @pytest.mark.parametrize("filename, content", js_files) + def test_qutejavascript(self, filename, content): + url = QUrl("qute://javascript/{}".format(filename)) + _mimetype, data = qutescheme.qute_javascript(url) + + assert data == content + + def test_qutejavascript_error(self): + url = QUrl("qute://javascript/404.js") + + with pytest.raises(IOError): + qutescheme.qute_javascript(url) + + def test_qutejavascript_empty_query(self): + url = QUrl("qute://javascript") + + with pytest.raises(qutescheme.QuteSchemeError): + qutescheme.qute_javascript(url) + + class TestHistoryHandler: """Test the qute://history endpoint."""