Merge branch 'lamarpavel-relapaths'
This commit is contained in:
commit
10e8b78695
@ -138,6 +138,7 @@ Contributors, sorted by the number of commits in descending order:
|
||||
* Raphael Pierzina
|
||||
* Joel Torstensson
|
||||
* Claude
|
||||
* Lamar Pavel
|
||||
* Martin Tournoij
|
||||
* Artur Shaik
|
||||
* Antoni Boucher
|
||||
|
@ -38,7 +38,7 @@
|
||||
|<<ui-display-statusbar-messages,display-statusbar-messages>>|Whether to display javascript statusbar messages.
|
||||
|<<ui-zoom-text-only,zoom-text-only>>|Whether the zoom factor on a frame applies only to the text or to all content.
|
||||
|<<ui-frame-flattening,frame-flattening>>|Whether to expand each subframe to its contents.
|
||||
|<<ui-user-stylesheet,user-stylesheet>>|User stylesheet to use (absolute filename or CSS string). Will expand environment variables.
|
||||
|<<ui-user-stylesheet,user-stylesheet>>|User stylesheet to use (absolute filename, filename relative to the config directory or CSS string). Will expand environment variables.
|
||||
|<<ui-css-media-type,css-media-type>>|Set the CSS media type.
|
||||
|<<ui-smooth-scrolling,smooth-scrolling>>|Whether to enable smooth scrolling for webpages.
|
||||
|<<ui-remove-finished-downloads,remove-finished-downloads>>|Whether to remove finished downloads automatically.
|
||||
@ -530,7 +530,7 @@ Default: +pass:[false]+
|
||||
|
||||
[[ui-user-stylesheet]]
|
||||
=== user-stylesheet
|
||||
User stylesheet to use (absolute filename or CSS string). Will expand environment variables.
|
||||
User stylesheet to use (absolute filename, filename relative to the config directory or CSS string). Will expand environment variables.
|
||||
|
||||
Default: +pass:[::-webkit-scrollbar { width: 0px; height: 0px; }]+
|
||||
|
||||
|
@ -269,8 +269,9 @@ def data(readonly=False):
|
||||
('user-stylesheet',
|
||||
SettingValue(typ.UserStyleSheet(),
|
||||
'::-webkit-scrollbar { width: 0px; height: 0px; }'),
|
||||
"User stylesheet to use (absolute filename or CSS string). Will "
|
||||
"expand environment variables."),
|
||||
"User stylesheet to use (absolute filename, filename relative to "
|
||||
"the config directory or CSS string). Will expand environment "
|
||||
"variables."),
|
||||
|
||||
('css-media-type',
|
||||
SettingValue(typ.String(none_ok=True), ''),
|
||||
|
@ -34,6 +34,7 @@ from PyQt5.QtWidgets import QTabWidget, QTabBar
|
||||
|
||||
from qutebrowser.commands import cmdutils
|
||||
from qutebrowser.config import configexc
|
||||
from qutebrowser.utils import standarddir
|
||||
|
||||
|
||||
SYSTEM_PROXY = object() # Return value for Proxy type
|
||||
@ -798,6 +799,17 @@ class File(BaseType):
|
||||
|
||||
typestr = 'file'
|
||||
|
||||
def transform(self, value):
|
||||
if not value:
|
||||
return None
|
||||
value = os.path.expanduser(value)
|
||||
value = os.path.expandvars(value)
|
||||
if not os.path.isabs(value):
|
||||
cfgdir = standarddir.config()
|
||||
if cfgdir is not None:
|
||||
return os.path.join(cfgdir, value)
|
||||
return value
|
||||
|
||||
def validate(self, value):
|
||||
if not value:
|
||||
if self._none_ok:
|
||||
@ -805,20 +817,26 @@ class File(BaseType):
|
||||
else:
|
||||
raise configexc.ValidationError(value, "may not be empty!")
|
||||
value = os.path.expanduser(value)
|
||||
value = os.path.expandvars(value)
|
||||
try:
|
||||
if not os.path.isfile(value):
|
||||
raise configexc.ValidationError(value, "must be a valid file!")
|
||||
if not os.path.isabs(value):
|
||||
cfgdir = standarddir.config()
|
||||
if cfgdir is None:
|
||||
raise configexc.ValidationError(
|
||||
value, "must be an absolute path when not using a "
|
||||
"config directory!")
|
||||
elif not os.path.isfile(os.path.join(cfgdir, value)):
|
||||
raise configexc.ValidationError(
|
||||
value, "must be a valid path relative to the config "
|
||||
"directory!")
|
||||
else:
|
||||
return
|
||||
elif not os.path.isfile(value):
|
||||
raise configexc.ValidationError(
|
||||
value, "must be an absolute path!")
|
||||
value, "must be a valid file!")
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, e)
|
||||
|
||||
def transform(self, value):
|
||||
if not value:
|
||||
return None
|
||||
return os.path.expanduser(value)
|
||||
|
||||
|
||||
class Directory(BaseType):
|
||||
|
||||
@ -1151,6 +1169,16 @@ class UserStyleSheet(File):
|
||||
def __init__(self):
|
||||
super().__init__(none_ok=True)
|
||||
|
||||
def transform(self, value):
|
||||
if not value:
|
||||
return None
|
||||
path = super().transform(value)
|
||||
if os.path.exists(path):
|
||||
return QUrl.fromLocalFile(path)
|
||||
else:
|
||||
data = base64.b64encode(value.encode('utf-8')).decode('ascii')
|
||||
return QUrl("data:text/css;charset=utf-8;base64,{}".format(data))
|
||||
|
||||
def validate(self, value):
|
||||
if not value:
|
||||
if self._none_ok:
|
||||
@ -1160,31 +1188,17 @@ class UserStyleSheet(File):
|
||||
value = os.path.expandvars(value)
|
||||
value = os.path.expanduser(value)
|
||||
try:
|
||||
if not os.path.isabs(value):
|
||||
# probably a CSS, so we don't handle it as filename.
|
||||
# FIXME We just try if it is encodable, maybe we should
|
||||
# validate CSS?
|
||||
# https://github.com/The-Compiler/qutebrowser/issues/115
|
||||
try:
|
||||
super().validate(value)
|
||||
except configexc.ValidationError:
|
||||
try:
|
||||
if not os.path.isabs(value):
|
||||
# probably a CSS, so we don't handle it as filename.
|
||||
# FIXME We just try if it is encodable, maybe we should
|
||||
# validate CSS?
|
||||
# https://github.com/The-Compiler/qutebrowser/issues/115
|
||||
value.encode('utf-8')
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, str(e))
|
||||
return
|
||||
elif not os.path.isfile(value):
|
||||
raise configexc.ValidationError(value, "must be a valid file!")
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, e)
|
||||
|
||||
def transform(self, value):
|
||||
path = os.path.expandvars(value)
|
||||
path = os.path.expanduser(path)
|
||||
if not value:
|
||||
return None
|
||||
elif os.path.isabs(path):
|
||||
return QUrl.fromLocalFile(path)
|
||||
else:
|
||||
data = base64.b64encode(value.encode('utf-8')).decode('ascii')
|
||||
return QUrl("data:text/css;charset=utf-8;base64,{}".format(data))
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, str(e))
|
||||
|
||||
|
||||
class AutoSearch(BaseType):
|
||||
|
@ -1362,6 +1362,7 @@ class TestFile:
|
||||
def test_validate_does_not_exist(self, os_path):
|
||||
"""Test validate with a file which does not exist."""
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.return_value = False
|
||||
with pytest.raises(configexc.ValidationError):
|
||||
self.t.validate('foobar')
|
||||
@ -1369,26 +1370,50 @@ class TestFile:
|
||||
def test_validate_exists_abs(self, os_path):
|
||||
"""Test validate with a file which does exist."""
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.return_value = True
|
||||
os_path.isabs.return_value = True
|
||||
self.t.validate('foobar')
|
||||
|
||||
def test_validate_exists_not_abs(self, os_path):
|
||||
"""Test validate with a file which does exist but is not absolute."""
|
||||
def test_validate_exists_rel(self, os_path, monkeypatch):
|
||||
"""Test validate with a relative path to an existing file."""
|
||||
monkeypatch.setattr(
|
||||
'qutebrowser.config.configtypes.standarddir.config',
|
||||
lambda: '/home/foo/.config/')
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.return_value = True
|
||||
os_path.isabs.return_value = False
|
||||
self.t.validate('foobar')
|
||||
os_path.join.assert_called_once_with('/home/foo/.config/', 'foobar')
|
||||
|
||||
def test_validate_rel_config_none(self, os_path, monkeypatch):
|
||||
"""Test with a relative path and standarddir.config returning None."""
|
||||
monkeypatch.setattr(
|
||||
'qutebrowser.config.configtypes.standarddir.config', lambda: None)
|
||||
os_path.isabs.return_value = False
|
||||
with pytest.raises(configexc.ValidationError):
|
||||
self.t.validate('foobar')
|
||||
|
||||
def test_validate_expanduser(self, os_path):
|
||||
"""Test if validate expands the user correctly."""
|
||||
os_path.expanduser.side_effect = lambda x: x.replace('~', '/home/foo')
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.side_effect = lambda path: path == '/home/foo/foobar'
|
||||
os_path.isabs.return_value = True
|
||||
self.t.validate('~/foobar')
|
||||
os_path.expanduser.assert_called_once_with('~/foobar')
|
||||
|
||||
def test_validate_expandvars(self, os_path):
|
||||
"""Test if validate expands the environment vars correctly."""
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x.replace(
|
||||
'$HOME', '/home/foo')
|
||||
os_path.isfile.side_effect = lambda path: path == '/home/foo/foobar'
|
||||
os_path.isabs.return_value = True
|
||||
self.t.validate('$HOME/foobar')
|
||||
os_path.expandvars.assert_called_once_with('$HOME/foobar')
|
||||
|
||||
def test_validate_invalid_encoding(self, os_path, unicode_encode_err):
|
||||
"""Test validate with an invalid encoding, e.g. LC_ALL=C."""
|
||||
os_path.isfile.side_effect = unicode_encode_err
|
||||
@ -1399,6 +1424,7 @@ class TestFile:
|
||||
def test_transform(self, os_path):
|
||||
"""Test transform."""
|
||||
os_path.expanduser.side_effect = lambda x: x.replace('~', '/home/foo')
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
assert self.t.transform('~/foobar') == '/home/foo/foobar'
|
||||
os_path.expanduser.assert_called_once_with('~/foobar')
|
||||
|
||||
@ -1930,13 +1956,21 @@ class TestUserStyleSheet:
|
||||
"""Test transform with an empty value."""
|
||||
assert self.t.transform('') is None
|
||||
|
||||
def test_transform_file(self):
|
||||
def test_transform_file(self, os_path, mocker):
|
||||
"""Test transform with a filename."""
|
||||
qurl = mocker.patch('qutebrowser.config.configtypes.QUrl',
|
||||
autospec=True)
|
||||
qurl.fromLocalFile.return_value = QUrl("file:///foo/bar")
|
||||
os_path.exists.return_value = True
|
||||
path = os.path.join(os.path.sep, 'foo', 'bar')
|
||||
assert self.t.transform(path) == QUrl("file:///foo/bar")
|
||||
|
||||
def test_transform_file_expandvars(self, monkeypatch):
|
||||
def test_transform_file_expandvars(self, os_path, monkeypatch, mocker):
|
||||
"""Test transform with a filename (expandvars)."""
|
||||
qurl = mocker.patch('qutebrowser.config.configtypes.QUrl',
|
||||
autospec=True)
|
||||
qurl.fromLocalFile.return_value = QUrl("file:///foo/bar")
|
||||
os_path.exists.return_value = True
|
||||
monkeypatch.setenv('FOO', 'foo')
|
||||
path = os.path.join(os.path.sep, '$FOO', 'bar')
|
||||
assert self.t.transform(path) == QUrl("file:///foo/bar")
|
||||
|
Loading…
Reference in New Issue
Block a user