From 0b298c6a374e3fa957aecc9fa2f8c1166421444e Mon Sep 17 00:00:00 2001 From: Ming Xiao Date: Thu, 24 Mar 2016 09:57:18 +0800 Subject: [PATCH 01/15] Update browser_tab.py Line:915 Change "user-agent" to "User-Agent" --- splash/browser_tab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index 713b63798..5ba7e700d 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -912,7 +912,7 @@ def _send_request(self, url, callback, method='GET', body=None, ua_from_headers = _get_header_value(headers, b'user-agent') web_page_ua = self.web_page.userAgentForUrl(to_qurl(url)) user_agent = ua_from_headers or web_page_ua - request.setRawHeader(b"user-agent", to_bytes(user_agent)) + request.setRawHeader(b"User-Agent", to_bytes(user_agent)) if method.upper() == "POST": reply = self.network_manager.post(request, body) From bb02add114e44dc3a3207edd3f51422bf872590e Mon Sep 17 00:00:00 2001 From: Ming Xiao Date: Thu, 24 Mar 2016 16:56:49 +0800 Subject: [PATCH 02/15] Update test_execute.py --- splash/tests/test_execute.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/tests/test_execute.py b/splash/tests/test_execute.py index 789341f43..ffb045cc2 100644 --- a/splash/tests/test_execute.py +++ b/splash/tests/test_execute.py @@ -2552,7 +2552,7 @@ def test_get_with_custom_headers(self): self.assertNotEqual(len(headers), 0) self.assertEqual(headers["Header-1"], "Value 1") self.assertEqual(headers["Header-2"], "Value 2") - self.assertIn("user-agent", headers) + self.assertIn("User-Agent", headers) def test_get_with_custom_ua(self): resp = self.request_lua(""" From fc6c211e178cb3e5cd25c7db6ddd2772172a958d Mon Sep 17 00:00:00 2001 From: Ming Xiao Date: Thu, 24 Mar 2016 17:02:44 +0800 Subject: [PATCH 03/15] Update test_execute.py --- splash/tests/test_execute.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/splash/tests/test_execute.py b/splash/tests/test_execute.py index ffb045cc2..2fbde0304 100644 --- a/splash/tests/test_execute.py +++ b/splash/tests/test_execute.py @@ -2534,7 +2534,7 @@ def test_get_with_default_headers(self): headers = resp.json() self.assertNotEqual(len(headers), 0) self.assertEqual(len(headers), 1) - self.assertIn("Mozilla/5.0", headers["user-agent"]) + self.assertIn("Mozilla/5.0", headers["User-Agent"]) def test_get_with_custom_headers(self): resp = self.request_lua(""" @@ -2565,7 +2565,7 @@ def test_get_with_custom_ua(self): self.assertStatusCode(resp, 200) headers = resp.json() self.assertNotEqual(len(headers), 0) - self.assertEqual(headers["user-agent"], "CUSTOM UA") + self.assertEqual(headers["User-Agent"], "CUSTOM UA") def test_get_with_custom_ua_in_headers(self): resp = self.request_lua(""" @@ -2577,7 +2577,7 @@ def test_get_with_custom_ua_in_headers(self): self.assertStatusCode(resp, 200) headers = resp.json() self.assertNotEqual(len(headers), 0) - self.assertEqual(headers["user-agent"], "Value 1") + self.assertEqual(headers["User-Agent"], "Value 1") def test_get_with_custom_ua_in_headers_and_set_with_splash(self): resp = self.request_lua(""" @@ -2597,7 +2597,7 @@ def test_get_with_custom_ua_in_headers_and_set_with_splash(self): self.assertStatusCode(resp, 200) resp = resp.json() headers1, headers2, headers3 = resp["result1"], resp["result2"], resp["result3"] - self.assertTrue(all("user-agent" in h for h in (headers1, headers2, headers3))) + self.assertTrue(all("User-Agent" in h for h in (headers1, headers2, headers3))) self.assertEqual(headers1["user-agent"], "CUSTOM UA") self.assertEqual(headers2["user-agent"], "Value 1") self.assertEqual(headers3["user-agent"], "CUSTOM UA") From 62fcf1c309ff7841ba55f92978f9551ddfdb7b43 Mon Sep 17 00:00:00 2001 From: Ming Xiao Date: Thu, 24 Mar 2016 17:40:12 +0800 Subject: [PATCH 04/15] Update test_execute.py --- splash/tests/test_execute.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/splash/tests/test_execute.py b/splash/tests/test_execute.py index 2fbde0304..66c5c3a84 100644 --- a/splash/tests/test_execute.py +++ b/splash/tests/test_execute.py @@ -1395,11 +1395,11 @@ class JsonPostArgsTest(ArgsTest): request_handler = JsonPostRequestHandler def test_headers(self): - headers = {"user-agent": "Firefox", "content-type": "text/plain"} + headers = {"User-Agent": "Firefox", "content-type": "text/plain"} self.assertArgsPassed({"headers": headers}) def test_headers_items(self): - headers = [["user-agent", "Firefox"], ["content-type", "text/plain"]] + headers = [["User-Agent", "Firefox"], ["content-type", "text/plain"]] self.assertArgsPassed({"headers": headers}) def test_access_headers(self): @@ -1407,12 +1407,12 @@ def test_access_headers(self): function main(splash) local ua = "Unknown" if splash.args.headers then - ua = splash.args.headers['user-agent'] + ua = splash.args.headers['User-Agent'] end return {ua=ua, firefox=(ua=="Firefox")} end """ - resp = self.request_lua(func, {'headers': {"user-agent": "Firefox"}}) + resp = self.request_lua(func, {'headers': {"User-Agent": "Firefox"}}) self.assertStatusCode(resp, 200) self.assertEqual(resp.json(), {"ua": "Firefox", "firefox": True}) @@ -1876,13 +1876,13 @@ def test_set_user_agent(self): self.assertNotIn("Mozilla", data["res3"]) if six.PY3: - self.assertNotIn("b'user-agent': b'Foozilla'", data["res1"]) - self.assertIn("b'user-agent': b'Foozilla'", data["res2"]) - self.assertIn("b'user-agent': b'Foozilla'", data["res3"]) + self.assertNotIn("b'User-Agent': b'Foozilla'", data["res1"]) + self.assertIn("b'User-Agent': b'Foozilla'", data["res2"]) + self.assertIn("b'User-Agent': b'Foozilla'", data["res3"]) else: - self.assertNotIn("'user-agent': 'Foozilla'", data["res1"]) - self.assertIn("'user-agent': 'Foozilla'", data["res2"]) - self.assertIn("'user-agent': 'Foozilla'", data["res3"]) + self.assertNotIn("'User-Agent': 'Foozilla'", data["res1"]) + self.assertIn("'User-Agent': 'Foozilla'", data["res2"]) + self.assertIn("'User-Agent': 'Foozilla'", data["res3"]) def test_set_user_agent_base_url(self): resp = self.request_lua(""" @@ -2570,7 +2570,7 @@ def test_get_with_custom_ua(self): def test_get_with_custom_ua_in_headers(self): resp = self.request_lua(""" function main(splash) - response = assert(splash:http_get{splash.args.url, headers={["user-agent"]="Value 1"}}) + response = assert(splash:http_get{splash.args.url, headers={["User-Agent"]="Value 1"}}) return response.request.headers end """, {"url": self.mockurl("jsrender")}) @@ -2584,7 +2584,7 @@ def test_get_with_custom_ua_in_headers_and_set_with_splash(self): function main(splash) splash:set_user_agent("CUSTOM UA") response1 = assert(splash:http_get(splash.args.url)) - response2 = assert(splash:http_get{splash.args.url, headers={["user-agent"]="Value 1"}}) + response2 = assert(splash:http_get{splash.args.url, headers={["User-Agent"]="Value 1"}}) response3 = assert(splash:http_get(splash.args.url)) return { @@ -2598,9 +2598,9 @@ def test_get_with_custom_ua_in_headers_and_set_with_splash(self): resp = resp.json() headers1, headers2, headers3 = resp["result1"], resp["result2"], resp["result3"] self.assertTrue(all("User-Agent" in h for h in (headers1, headers2, headers3))) - self.assertEqual(headers1["user-agent"], "CUSTOM UA") - self.assertEqual(headers2["user-agent"], "Value 1") - self.assertEqual(headers3["user-agent"], "CUSTOM UA") + self.assertEqual(headers1["User-Agent"], "CUSTOM UA") + self.assertEqual(headers2["User-Agent"], "Value 1") + self.assertEqual(headers3["User-Agent"], "CUSTOM UA") def test_ua_on_rendering(self): resp = self.request_lua(""" @@ -2611,13 +2611,13 @@ def test_ua_on_rendering(self): result[#result+1] = response.request.headers end) - response = assert(splash:go{splash.args.url, headers={["user-agent"]="Value 1"}}) + response = assert(splash:go{splash.args.url, headers={["User-Agent"]="Value 1"}}) return result end """, {"url": self.mockurl("subresources")}) self.assertStatusCode(resp, 200) resp = resp.json() - uas = [r.get("User-Agent", r.get("user-agent")) for r in resp] + uas = [r.get("User-Agent", r.get("User-Agent")) for r in resp] self.assertTrue(all(h == "Value 1" for h in uas)) def test_bad_url(self): From 8568dde3e911677e7a323a2a784f9cf593f42acf Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 15:06:05 +0800 Subject: [PATCH 05/15] add feature mouse_click --- splash/browser_tab.py | 11 ++++++++++- splash/qtrender_lua.py | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index 713b63798..c58d98787 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -729,6 +729,15 @@ def html(self): self.store_har_timing("_onHtmlRendered") return result + def mouse_click(self, x, y): + """ mouse click on given point(x, y) of web_page""" + self.logger.log("mouse click on point(%d, %d)" % (x,y), min_level=2) + evt = QMouseEvent(QEvent.MouseButtonPress, QPoint(x,y), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) + QApplication.sendEvent(self.web_page, evt) + evt = QMouseEvent(QEvent.MouseButtonRelease, QPoint(x,y), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) + QApplication.sendEvent(self.web_page, evt) + self.store_har_timing("_onClicked") + def _get_image(self, image_format, width, height, render_all, scale_method, region): old_size = self.web_page.viewportSize() @@ -912,7 +921,7 @@ def _send_request(self, url, callback, method='GET', body=None, ua_from_headers = _get_header_value(headers, b'user-agent') web_page_ua = self.web_page.userAgentForUrl(to_qurl(url)) user_agent = ua_from_headers or web_page_ua - request.setRawHeader(b"user-agent", to_bytes(user_agent)) + request.setRawHeader(b"User-Agent", to_bytes(user_agent)) if method.upper() == "POST": reply = self.network_manager.post(request, body) diff --git a/splash/qtrender_lua.py b/splash/qtrender_lua.py index 0909f49e7..46ff020a8 100644 --- a/splash/qtrender_lua.py +++ b/splash/qtrender_lua.py @@ -567,6 +567,10 @@ def error(error_info): def html(self): return self.tab.html() + @command() + def mouse_click(self, x, y): + return self.tab.mouse_click(x, y) + @command() def png(self, width=None, height=None, render_all=False, scale_method=None, region=None): From 382acb60ef7cc4f47c38d9c4f899703193da6f96 Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 15:39:19 +0800 Subject: [PATCH 06/15] update splash-auto.json for feature splash:mouse_click(x, y) --- splash/kernel/inspections/splash-auto.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/splash/kernel/inspections/splash-auto.json b/splash/kernel/inspections/splash-auto.json index 87942a604..c9efa806a 100644 --- a/splash/kernel/inspections/splash-auto.json +++ b/splash/kernel/inspections/splash-auto.json @@ -197,6 +197,17 @@ "details": "Example:\n\n.. code-block:: lua\n\n -- A simplistic implementation of render.html endpoint\n function main(splash)\n splash:set_result_content_type(\"text/html; charset=utf-8\")\n assert(splash:go(splash.args.url))\n return splash:html()\n end\n\nNothing prevents us from taking multiple HTML snapshots. For example, let's\nvisit first 3 pages on a website, and for each page store\ninitial HTML snapshot and an HTML snapshot after waiting 0.5s:\n\ntreat = require(\"treat\")\n\n-- Given an url, this function returns a table\n-- with the page screenshoot, it's HTML contents\n-- and it's title.\nfunction page_info(splash, url)\n local ok, msg = splash:go(url)\n if not ok then\n return {ok=false, reason=msg}\n end\n local res = {\n html=splash:html(),\n title=splash:evaljs('document.title'),\n image=splash:png(),\n ok=true,\n }\n return res\nend\n\n-- visit first 3 pages of hacker news\nlocal base = \"https://news.ycombinator.com/news?p=\"\nfunction main(splash)\n local result = treat.as_array({})\n for i=1,3 do\n local url = base .. i\n result[i] = page_info(splash, url)\n end\n return result\nend", "params": null }, + "splash:mouse_click": { + "name": "mouse_click", + "header": "splash:mouse_click", + "content": "Click a given point(x, y) of web_page, usually (x, y) relate to an element of html", + "short": "Click a given point(x, y) of web_page", + "signature": "splash:mouse_click(x, y)", + "returns": "nil", + "async": "no.", + "details": "", + "params": "* x - x position of the mouse cursor, relative to web_page\n * y - y position of the mouse cursor, relative to web_page." + }, "splash:png": { "name": "png", "header": "splash:png", @@ -516,4 +527,4 @@ "details": "As of now, this table contains:\n\n* ``splash`` - (string) Splash version\n* ``major`` - (int) Splash major version\n* ``minor`` - (int) Splash minor version\n* ``python`` - (string) Python version\n* ``qt`` - (string) Qt version\n* ``pyqt`` - (string) PyQt version\n* ``webkit`` - (string) WebKit version\n* ``sip`` - (string) SIP version\n* ``twisted`` - (string) Twisted version\n\nExample:\n\n.. code-block:: lua\n\n function main(splash)\n local version = splash:get_version()\n if version.major < 2 and version.minor < 8 then\n error(\"Splash 1.8 or newer required\")\n end\n end", "params": null } -} \ No newline at end of file +} From 700007ce587cf6a3a02e1503f77b9b8e1d8e201c Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 15:42:19 +0800 Subject: [PATCH 07/15] update splash-auto.json --- splash/kernel/inspections/splash-auto.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/kernel/inspections/splash-auto.json b/splash/kernel/inspections/splash-auto.json index c9efa806a..330bc166f 100644 --- a/splash/kernel/inspections/splash-auto.json +++ b/splash/kernel/inspections/splash-auto.json @@ -206,7 +206,7 @@ "returns": "nil", "async": "no.", "details": "", - "params": "* x - x position of the mouse cursor, relative to web_page\n * y - y position of the mouse cursor, relative to web_page." + "params": "* x - x position of the mouse cursor, relative to web_page\n* y - y position of the mouse cursor, relative to web_page." }, "splash:png": { "name": "png", From a416df0cb029a795f22be2f7462fc5482eb7b6bb Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 15:45:49 +0800 Subject: [PATCH 08/15] update splash-auto.json --- splash/kernel/inspections/splash-auto.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/kernel/inspections/splash-auto.json b/splash/kernel/inspections/splash-auto.json index 330bc166f..cf6639d28 100644 --- a/splash/kernel/inspections/splash-auto.json +++ b/splash/kernel/inspections/splash-auto.json @@ -206,7 +206,7 @@ "returns": "nil", "async": "no.", "details": "", - "params": "* x - x position of the mouse cursor, relative to web_page\n* y - y position of the mouse cursor, relative to web_page." + "params": "* x - x position of the mouse cursor, relative to web_page.\n* y - y position of the mouse cursor, relative to web_page." }, "splash:png": { "name": "png", From d6f558dca87a3073742646c99c7bafc391befbe2 Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 16:23:39 +0800 Subject: [PATCH 09/15] update splash-auto.json --- splash/kernel/inspections/splash-auto.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/kernel/inspections/splash-auto.json b/splash/kernel/inspections/splash-auto.json index cf6639d28..874256778 100644 --- a/splash/kernel/inspections/splash-auto.json +++ b/splash/kernel/inspections/splash-auto.json @@ -206,7 +206,7 @@ "returns": "nil", "async": "no.", "details": "", - "params": "* x - x position of the mouse cursor, relative to web_page.\n* y - y position of the mouse cursor, relative to web_page." + "params": "* x - integer, position of the mouse cursor relative to web_page.\n* y - integer, position of the mouse cursor relative to web_page." }, "splash:png": { "name": "png", From 197b41da4937cafbca10d9693fad723e4b3aeecd Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 17:07:48 +0800 Subject: [PATCH 10/15] import module QEvent --- splash/browser_tab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index c58d98787..badbf010c 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -6,7 +6,7 @@ import weakref import uuid -from PyQt5.QtCore import QObject, QSize, Qt, QTimer, pyqtSlot +from PyQt5.QtCore import QObject, QSize, Qt, QTimer, QEvent, pyqtSlot from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtWebKitWidgets import QWebPage from PyQt5.QtWebKit import QWebSettings From decaada0dddba148533f7f34f28ff6adc31b65ed Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 17:35:35 +0800 Subject: [PATCH 11/15] import module QApplication, QMouseEvent --- splash/browser_tab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index badbf010c..2a708aab0 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -9,7 +9,7 @@ from PyQt5.QtCore import QObject, QSize, Qt, QTimer, QEvent, pyqtSlot from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtWebKitWidgets import QWebPage -from PyQt5.QtWebKit import QWebSettings +from PyQt5.QtWebKit import QWebSettings, QApplication, QMouseEvent from twisted.internet import defer from twisted.python import log From 532647bf86f81ffcbb8e0fb5423dad7932e5c4af Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 17:37:59 +0800 Subject: [PATCH 12/15] import module QApplication, QMouseEvent --- splash/browser_tab.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index 2a708aab0..765a0ca82 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -7,9 +7,11 @@ import uuid from PyQt5.QtCore import QObject, QSize, Qt, QTimer, QEvent, pyqtSlot +from PyQt5.QtGui import QMouseEvent +from PyQt5.QtWidgets import QApplication from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtWebKitWidgets import QWebPage -from PyQt5.QtWebKit import QWebSettings, QApplication, QMouseEvent +from PyQt5.QtWebKit import QWebSettings from twisted.internet import defer from twisted.python import log From 1ec88e55caa664c269dc0c4f59b8d80e5acb7a82 Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 17:39:49 +0800 Subject: [PATCH 13/15] import module QApplication, QMouseEvent, QPoint --- splash/browser_tab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index 765a0ca82..caf862ec6 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -6,7 +6,7 @@ import weakref import uuid -from PyQt5.QtCore import QObject, QSize, Qt, QTimer, QEvent, pyqtSlot +from PyQt5.QtCore import QObject, QSize, QPoint, Qt, QTimer, QEvent, pyqtSlot from PyQt5.QtGui import QMouseEvent from PyQt5.QtWidgets import QApplication from PyQt5.QtNetwork import QNetworkRequest From 3e86883a1f627b721f7ca2be93ecda5eb4c77bee Mon Sep 17 00:00:00 2001 From: davidken Date: Sat, 2 Apr 2016 18:20:50 +0800 Subject: [PATCH 14/15] change comment mouse click to mouse clicking --- splash/browser_tab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/splash/browser_tab.py b/splash/browser_tab.py index caf862ec6..5f760fb9c 100644 --- a/splash/browser_tab.py +++ b/splash/browser_tab.py @@ -733,12 +733,12 @@ def html(self): def mouse_click(self, x, y): """ mouse click on given point(x, y) of web_page""" - self.logger.log("mouse click on point(%d, %d)" % (x,y), min_level=2) + self.logger.log("mouse clicking on point(%d, %d)" % (x,y), min_level=2) evt = QMouseEvent(QEvent.MouseButtonPress, QPoint(x,y), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) QApplication.sendEvent(self.web_page, evt) evt = QMouseEvent(QEvent.MouseButtonRelease, QPoint(x,y), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) QApplication.sendEvent(self.web_page, evt) - self.store_har_timing("_onClicked") + self.store_har_timing("_onMouseClicked") def _get_image(self, image_format, width, height, render_all, scale_method, region): From bacec59dd389383b20ae01a3afb4a08e389d309c Mon Sep 17 00:00:00 2001 From: genius001 Date: Sat, 2 Apr 2016 20:33:40 +0800 Subject: [PATCH 15/15] add feature click --- bin/splash | 0 debian/rules | 0 dockerfiles/splash/provision.sh | 0 scripts/rst2inspections.py | 0 setup.cfg | 0 setup.py | 0 splash/tests/mockserver.py | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 bin/splash mode change 100755 => 100644 debian/rules mode change 100755 => 100644 dockerfiles/splash/provision.sh mode change 100755 => 100644 scripts/rst2inspections.py mode change 100755 => 100644 setup.cfg mode change 100755 => 100644 setup.py mode change 100755 => 100644 splash/tests/mockserver.py diff --git a/bin/splash b/bin/splash old mode 100755 new mode 100644 diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 diff --git a/dockerfiles/splash/provision.sh b/dockerfiles/splash/provision.sh old mode 100755 new mode 100644 diff --git a/scripts/rst2inspections.py b/scripts/rst2inspections.py old mode 100755 new mode 100644 diff --git a/setup.cfg b/setup.cfg old mode 100755 new mode 100644 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 diff --git a/splash/tests/mockserver.py b/splash/tests/mockserver.py old mode 100755 new mode 100644