From db7077d94ff1044137d86e9e609a96316ae87d91 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 12 May 2014 14:33:12 +0200 Subject: [PATCH] Clean up javascript_escape --- qutebrowser/test/utils/test_webelem.py | 3 +-- qutebrowser/utils/webelem.py | 15 +++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/qutebrowser/test/utils/test_webelem.py b/qutebrowser/test/utils/test_webelem.py index 78b202195..657640c89 100644 --- a/qutebrowser/test/utils/test_webelem.py +++ b/qutebrowser/test/utils/test_webelem.py @@ -269,12 +269,11 @@ class JavascriptEscapeTests(TestCase): STRINGS = [ ('foo\\bar', r'foo\\bar'), ('foo\nbar', r'foo\nbar'), - ('foo\tbar', r'foo\tbar'), ("foo'bar", r"foo\'bar"), ('foo"bar', r'foo\"bar'), ] - def test_escape(self): + def test_fake_escape(self): for before, after in self.STRINGS: self.assertEqual(webelem.javascript_escape(before), after) diff --git a/qutebrowser/utils/webelem.py b/qutebrowser/utils/webelem.py index eaccc4dc7..16a4f1ac4 100644 --- a/qutebrowser/utils/webelem.py +++ b/qutebrowser/utils/webelem.py @@ -126,19 +126,18 @@ def rect_on_view(elem): def javascript_escape(text): """Escape values special to javascript in strings. - This maybe makes them work with QWebElement::evaluateJavaScript. - Maybe. + With this we should be able to use something like: + elem.evaluateJavaScript("this.value='{}'".format(javascript_escape(...))) + And all values should work. """ # This is a list of tuples because order matters, and using OrderedDict # makes no sense because we don't actually need dict-like properties. replacements = [ - ('\\', r'\\'), - ('\n', r'\n'), - ('\t', r'\t'), - ("'", r"\'"), - ('"', r'\"'), + ('\\', r'\\'), # First escape all literal \ signs as \\ + ("'", r"\'"), # Then escape ' and " as \' and \" + ('"', r'\"'), # (note it won't hurt when we escape the wrong one) + ('\n', r'\n'), # We also need to escape newlines for some reason. ] - text = text.rstrip('\n') for orig, repl in replacements: text = text.replace(orig, repl) return text