Hexlify strings in TestJavascriptEscape.
This commit is contained in:
parent
0ce9ae070c
commit
0a16f29bd1
@ -25,10 +25,12 @@ from unittest import mock
|
||||
import collections.abc
|
||||
import operator
|
||||
import itertools
|
||||
import binascii
|
||||
import os.path
|
||||
|
||||
import hypothesis
|
||||
import hypothesis.strategies
|
||||
from PyQt5.QtCore import QRect, QPoint
|
||||
from PyQt5.QtCore import PYQT_VERSION, QRect, QPoint
|
||||
from PyQt5.QtWebKit import QWebElement
|
||||
import pytest
|
||||
|
||||
@ -525,21 +527,63 @@ class TestJavascriptEscape:
|
||||
"""Test javascript escaping with some expected outcomes."""
|
||||
assert webelem.javascript_escape(before) == after
|
||||
|
||||
def _test_escape(self, text, webframe):
|
||||
def _test_escape(self, text, qtbot, webframe):
|
||||
"""Helper function for test_real_escape*."""
|
||||
try:
|
||||
self._test_escape_simple(text, webframe)
|
||||
except AssertionError:
|
||||
# Try another method if the simple method failed.
|
||||
#
|
||||
# See _test_escape_hexlified documentation on why this is
|
||||
# necessary.
|
||||
self._test_escape_hexlified(text, qtbot, webframe)
|
||||
|
||||
def _test_escape_hexlified(self, text, qtbot, webframe):
|
||||
"""Test conversion by hexlifying in javascript.
|
||||
|
||||
Since the conversion of QStrings to Python strings is broken in some
|
||||
older PyQt versions in some corner cases, we load a HTML file which
|
||||
generates an MD5 of the escaped text and use that for comparisons.
|
||||
"""
|
||||
escaped = webelem.javascript_escape(text)
|
||||
webframe.evaluateJavaScript('window.foo = "{}";'.format(escaped))
|
||||
assert webframe.evaluateJavaScript('window.foo') == text
|
||||
path = os.path.join(os.path.dirname(__file__),
|
||||
'test_webelem_jsescape.html')
|
||||
with open(path, encoding='utf-8') as f:
|
||||
html_source = f.read().replace('%INPUT%', escaped)
|
||||
|
||||
with qtbot.waitSignal(webframe.loadFinished, raising=True):
|
||||
webframe.setHtml(html_source)
|
||||
|
||||
result = webframe.evaluateJavaScript('window.qute_test_result')
|
||||
assert result is not None
|
||||
assert '|' in result
|
||||
result_md5, result_text = result.split('|', maxsplit=1)
|
||||
text_md5 = binascii.hexlify(text.encode('utf-8')).decode('ascii')
|
||||
assert result_md5 == text_md5, result_text
|
||||
|
||||
def _test_escape_simple(self, text, webframe):
|
||||
"""Test conversion by using evaluateJavaScript."""
|
||||
escaped = webelem.javascript_escape(text)
|
||||
result = webframe.evaluateJavaScript('"{}";'.format(escaped))
|
||||
assert result == text
|
||||
|
||||
@pytest.mark.parametrize('text', TESTS)
|
||||
def test_real_escape(self, webframe, text):
|
||||
def test_real_escape(self, webframe, qtbot, text):
|
||||
"""Test javascript escaping with a real QWebPage."""
|
||||
self._test_escape(text, webframe)
|
||||
self._test_escape(text, qtbot, webframe)
|
||||
|
||||
@hypothesis.given(hypothesis.strategies.text())
|
||||
def test_real_escape_hypothesis(self, webframe, text):
|
||||
def test_real_escape_hypothesis(self, webframe, qtbot, text):
|
||||
"""Test javascript escaping with a real QWebPage and hypothesis."""
|
||||
self._test_escape(text, webframe)
|
||||
# We can't simply use self._test_escape because of this:
|
||||
# https://github.com/pytest-dev/pytest-qt/issues/69
|
||||
|
||||
# self._test_escape(text, qtbot, webframe)
|
||||
try:
|
||||
self._test_escape_simple(text, webframe)
|
||||
except AssertionError:
|
||||
if PYQT_VERSION >= 0x050300:
|
||||
self._test_escape_hexlified(text, qtbot, webframe)
|
||||
|
||||
|
||||
class TestGetChildFrames:
|
||||
|
68
tests/browser/test_webelem_jsescape.html
Normal file
68
tests/browser/test_webelem_jsescape.html
Normal file
@ -0,0 +1,68 @@
|
||||
<!--
|
||||
Helper file for test_javascript_escape() in test_webelem.py.
|
||||
|
||||
Since the conversion from QStrings to Python strings is broken in some corner
|
||||
cases in PyQt < 5.4 we hexlify the string we got in javascript here and test
|
||||
that in the test.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
|
||||
/*
|
||||
* hexlify() and str2rstr_utf8() are based on:
|
||||
*
|
||||
* JavaScript MD5 1.0.1
|
||||
* https://github.com/blueimp/JavaScript-MD5
|
||||
*
|
||||
* Copyright 2011, Sebastian Tschan
|
||||
* https://blueimp.net
|
||||
*
|
||||
* Licensed under the MIT license:
|
||||
* http://www.opensource.org/licenses/MIT
|
||||
*
|
||||
* Based on
|
||||
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
|
||||
* Digest Algorithm, as defined in RFC 1321.
|
||||
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
|
||||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
||||
* Distributed under the BSD License
|
||||
* See http://pajhome.org.uk/crypt/md5 for more info.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
function hexlify(input) {
|
||||
var hex_tab = '0123456789abcdef';
|
||||
var output = '';
|
||||
var x;
|
||||
var i;
|
||||
|
||||
for (i = 0; i < input.length; i += 1) {
|
||||
x = input.charCodeAt(i);
|
||||
output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
function encode_utf8(input) {
|
||||
return unescape(encodeURIComponent(input));
|
||||
}
|
||||
|
||||
function set_text() {
|
||||
var elems = document.getElementsByTagName("p");
|
||||
var hexlified = hexlify(encode_utf8("%INPUT%"));
|
||||
var result = hexlified + "|" + "%INPUT%";
|
||||
elems[0].innerHTML = result
|
||||
window.qute_test_result = result;
|
||||
}
|
||||
|
||||
//]]>
|
||||
</script>
|
||||
</head>
|
||||
<body onload="set_text()">
|
||||
<p>set_text() not called...</p>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user