Merge branch 'lamarpavel-relapaths'

This commit is contained in:
Florian Bruhin 2015-06-08 18:56:49 +02:00
commit 10e8b78695
5 changed files with 90 additions and 40 deletions

View File

@ -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

View File

@ -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; }]+

View File

@ -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), ''),

View File

@ -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):

View File

@ -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")