From 33005c39578bfdd1aed4f0fcdc213c7278e17281 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 19 Aug 2011 15:47:34 -0700 Subject: [PATCH 1/6] Add a few new QWebSettings for page settings. Among the most useful, is the jsEnabled setting, which allows you to disable JavaScript. --- python/pyphantomjs/phantom.py | 5 +++++ python/pyphantomjs/webpage.py | 5 +++++ src/consts.h | 5 +++++ src/phantom.cpp | 5 +++++ src/webpage.cpp | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index 083de085..fcf42fc1 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -68,6 +68,11 @@ class Phantom(QObject): self.m_defaultPageSettings['loadImages'] = args.load_images self.m_defaultPageSettings['loadPlugins'] = args.load_plugins + self.m_defaultPageSettings['jsEnabled'] = True + self.m_defaultPageSettings['jsOpenWindows'] = False + self.m_defaultPageSettings['jsAccessClipboard'] = False + self.m_defaultPageSettings['XSSAuditing'] = False + self.m_defaultPageSettings['quirksMode'] = True self.m_defaultPageSettings['userAgent'] = self.m_page.userAgent() self.m_defaultPageSettings['localAccessRemote'] = args.local_access_remote self.m_page.applySettings(self.m_defaultPageSettings) diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index d468d25f..c181ead2 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -120,6 +120,11 @@ class WebPage(QObject): opt.setAttribute(QWebSettings.AutoLoadImages, defaults['loadImages']) opt.setAttribute(QWebSettings.PluginsEnabled, defaults['loadPlugins']) + opt.setAttribute(QWebSettings.JavascriptEnabled, defaults['jsEnabled']) + opt.setAttribute(QWebSettings.JavascriptCanOpenWindows, defaults['jsOpenWindows']) + opt.setAttribute(QWebSettings.JavascriptCanAccessClipboard, defaults['jsAccessClipboard']) + opt.setAttribute(QWebSettings.XSSAuditingEnabled, defaults['XSSAuditing']) + opt.setAttribute(QWebSettings.SiteSpecificQuirksEnabled, defaults['quirksMode']) opt.setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, defaults['localAccessRemote']) if 'userAgent' in defaults: self.m_webPage.m_userAgent = defaults['userAgent'] diff --git a/src/consts.h b/src/consts.h index 8a44f851..49458a0b 100644 --- a/src/consts.h +++ b/src/consts.h @@ -50,6 +50,11 @@ #define PAGE_SETTINGS_LOAD_IMAGES "loadImages" #define PAGE_SETTINGS_LOAD_PLUGINS "loadPlugins" +#define PAGE_SETTINGS_JS_ENABLED "jsEnabled" +#define PAGE_SETTINGS_JS_OPEN_WINDOWS "jsOpenWindows" +#define PAGE_SETTINGS_JS_ACCESS_CLIPBOARD "jsAccessClipboard" +#define PAGE_SETTINGS_XSS_AUDITING "XSSAuditing" +#define PAGE_SETTINGS_QUIRKS_MODE "quirksMode" #define PAGE_SETTINGS_USER_AGENT "userAgent" #define PAGE_SETTINGS_LOCAL_ACCESS_REMOTE "localAccessRemote" diff --git a/src/phantom.cpp b/src/phantom.cpp index bbb74690..9cb04ef9 100644 --- a/src/phantom.cpp +++ b/src/phantom.cpp @@ -178,6 +178,11 @@ Phantom::Phantom(QObject *parent) m_defaultPageSettings[PAGE_SETTINGS_LOAD_IMAGES] = QVariant::fromValue(autoLoadImages); m_defaultPageSettings[PAGE_SETTINGS_LOAD_PLUGINS] = QVariant::fromValue(pluginsEnabled); + m_defaultPageSettings[PAGE_SETTINGS_JS_ENABLED] = QVariant::fromValue(true); + m_defaultPageSettings[PAGE_SETTINGS_JS_OPEN_WINDOWS] = QVariant::fromValue(false); + m_defaultPageSettings[PAGE_SETTINGS_JS_ACCESS_CLIPBOARD] = QVariant::fromValue(false); + m_defaultPageSettings[PAGE_SETTINGS_XSS_AUDITING] = QVariant::fromValue(false); + m_defaultPageSettings[PAGE_SETTINGS_QUIRKS_MODE] = QVariant::fromValue(true); m_defaultPageSettings[PAGE_SETTINGS_USER_AGENT] = QVariant::fromValue(m_page->userAgent()); m_defaultPageSettings[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE] = QVariant::fromValue(localAccessRemote); m_page->applySettings(m_defaultPageSettings); diff --git a/src/webpage.cpp b/src/webpage.cpp index 2944bd5e..e0259595 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -176,6 +176,11 @@ void WebPage::applySettings(const QVariantMap &def) opt->setAttribute(QWebSettings::AutoLoadImages, def[PAGE_SETTINGS_LOAD_IMAGES].toBool()); opt->setAttribute(QWebSettings::PluginsEnabled, def[PAGE_SETTINGS_LOAD_PLUGINS].toBool()); + opt->setAttribute(QWebSettings::JavascriptEnabled, def[PAGE_SETTINGS_JS_ENABLED].toBool()); + opt->setAttribute(QWebSettings::JavascriptCanOpenWindows, def[PAGE_SETTINGS_JS_OPEN_WINDOWS].toBool()); + opt->setAttribute(QWebSettings::JavascriptCanAccessClipboard, def[PAGE_SETTINGS_JS_ACCESS_CLIPBOARD].toBool()); + opt->setAttribute(QWebSettings::XSSAuditingEnabled, def[PAGE_SETTINGS_XSS_AUDITING].toBool()); + opt->setAttribute(QWebSettings::SiteSpecificQuirksEnabled, def[PAGE_SETTINGS_QUIRKS_MODE].toBool()); opt->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, def[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE].toBool()); if (def.contains(PAGE_SETTINGS_USER_AGENT)) From 9e4830d44c0fddb612e51fe6e62e430b72e1ddc1 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 19 Aug 2011 16:09:40 -0700 Subject: [PATCH 2/6] Move pdf_dpi to better location --- python/pyphantomjs/webpage.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index d468d25f..f7a17511 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -31,11 +31,6 @@ from plugincontroller import do_action from utils import injectJsInFrame -# Different defaults. -# OSX: 72, X11: 75(?), Windows: 96 -pdf_dpi = 72 - - class CustomPage(QWebPage): def __init__(self, parent): QWebPage.__init__(self, parent) @@ -177,11 +172,14 @@ class WebPage(QObject): self.m_webPage.setViewportSize(viewportSize) return image + # Different defaults. + # OSX: 72, X11: 75(?), Windows: 96 + pdf_dpi = 72 def renderPdf(self, fileName): p = QPrinter() p.setOutputFormat(QPrinter.PdfFormat) p.setOutputFileName(fileName) - p.setResolution(pdf_dpi) + p.setResolution(self.pdf_dpi) paperSize = self.m_paperSize if not len(paperSize): @@ -256,8 +254,8 @@ class WebPage(QObject): ('mm', 72 / 25.4), ('cm', 72 / 2.54), ('in', 72.0), - ('px', 72.0 / pdf_dpi / 2.54), - ('', 72.0 / pdf_dpi / 2.54) + ('px', 72.0 / self.pdf_dpi / 2.54), + ('', 72.0 / self.pdf_dpi / 2.54) ) for unit, format in units: From 7418a84e604f68f4d80cf378f7eae23050b44946 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 19 Aug 2011 16:28:09 -0700 Subject: [PATCH 3/6] Added functions to WebPage class to simulate mouse move, mouse up, and mouse down. Also added click() convenience function, which combines a move, mousedown, and mouseup. --- python/pyphantomjs/webpage.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index f7a17511..d8f262c8 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -21,9 +21,10 @@ from math import ceil, floor from PyQt4.QtCore import (pyqtProperty, pyqtSlot, pyqtSignal, Qt, QObject, QRect, QPoint, QUrl, QFileInfo, QDir, QSize, - QSizeF, QByteArray, QEventLoop, QFile) + QSizeF, QByteArray, QEventLoop, QEvent, QFile) from PyQt4.QtGui import (QPalette, QDesktopServices, QPrinter, QImage, - QPainter, QRegion, QApplication, qRgba) + QPainter, QRegion, QApplication, QMouseEvent, + qRgba) from PyQt4.QtWebKit import QWebSettings, QWebPage from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest @@ -77,6 +78,7 @@ class WebPage(QObject): self.m_paperSize = {} self.m_clipRect = QRect() self.m_libraryPath = '' + self.m_mousePos = QPoint() self.setObjectName('WebPage') self.m_webPage = CustomPage(self) @@ -280,6 +282,12 @@ class WebPage(QObject): document.body.appendChild(el); ''' % {'scriptUrl': scriptUrl}) + @pyqtSlot(int, int) + def click(self, x, y): + self.mouseMoveTo(x, y) + self.mouseDown() + self.mouseUp() + @pyqtProperty('QVariantMap') def clipRect(self): clipRect = self.m_clipRect @@ -322,6 +330,25 @@ class WebPage(QObject): def injectJs(self, filePath): return injectJsInFrame(filePath, self.m_libraryPath, self.m_mainFrame) + @pyqtSlot() + def mouseDown(self): + event = QMouseEvent(QEvent.MouseButtonPress, self.m_mousePos, Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) + QApplication.postEvent(self.m_webPage, event) + QApplication.processEvents() + + @pyqtSlot() + def mouseUp(self): + event = QMouseEvent(QEvent.MouseButtonRelease, self.m_mousePos, Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) + QApplication.postEvent(self.m_webPage, event) + QApplication.processEvents() + + @pyqtSlot(int, int) + def mouseMoveTo(self, x, y): + self.m_mousePos = QPoint(x, y) + event = QMouseEvent(QEvent.MouseMove, self.m_mousePos, Qt.NoButton, Qt.NoButton, Qt.NoModifier) + QApplication.postEvent(self.m_webPage, event) + QApplication.processEvents() + @pyqtSlot(str, str, 'QVariantMap') @pyqtSlot(str, 'QVariantMap', 'QVariantMap') def openUrl(self, address, op, settings): From faa0a062583f3782f6d3684b76cbdf35341c6218 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Fri, 19 Aug 2011 16:41:35 -0700 Subject: [PATCH 4/6] Plugin controllers get() method should never fail silently --- python/pyphantomjs/plugincontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyphantomjs/plugincontroller.py b/python/pyphantomjs/plugincontroller.py index c7b72146..84b12f1d 100644 --- a/python/pyphantomjs/plugincontroller.py +++ b/python/pyphantomjs/plugincontroller.py @@ -76,7 +76,7 @@ def get(name, depth=3, scope='local'): elif scope == 'builtin': scope = 'f_builtins' - return getattr(sys._getframe(depth), scope).get(name) + return getattr(sys._getframe(depth), scope)[name] def has_action(hook, func=None): From 8deac1b8c6ff7744728107d052f97abd6ac01702 Mon Sep 17 00:00:00 2001 From: Niek Date: Sat, 20 Aug 2011 10:24:56 +0200 Subject: [PATCH 5/6] Fix issue 128 and issue 193 --- src/webpage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/webpage.cpp b/src/webpage.cpp index 2944bd5e..9f78fae4 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -60,6 +60,7 @@ public: , m_webPage(parent) { m_userAgent = QWebPage::userAgentForUrl(QUrl()); + setForwardUnsupportedContent(true); } public slots: From 8880edcf782478ce93bc42b7e4e6e935a01b99b0 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Sat, 20 Aug 2011 16:49:36 -0700 Subject: [PATCH 6/6] Remove settings: jsOpenWindows, jsAccessClipboard, siteSpecificQuirksMode Renamed jsEnabled to javascriptEnabled --- python/pyphantomjs/phantom.py | 5 +---- python/pyphantomjs/webpage.py | 5 +---- src/consts.h | 5 +---- src/phantom.cpp | 3 --- src/webpage.cpp | 3 --- 5 files changed, 3 insertions(+), 18 deletions(-) diff --git a/python/pyphantomjs/phantom.py b/python/pyphantomjs/phantom.py index fcf42fc1..36b8375d 100644 --- a/python/pyphantomjs/phantom.py +++ b/python/pyphantomjs/phantom.py @@ -68,11 +68,8 @@ class Phantom(QObject): self.m_defaultPageSettings['loadImages'] = args.load_images self.m_defaultPageSettings['loadPlugins'] = args.load_plugins - self.m_defaultPageSettings['jsEnabled'] = True - self.m_defaultPageSettings['jsOpenWindows'] = False - self.m_defaultPageSettings['jsAccessClipboard'] = False + self.m_defaultPageSettings['javascriptEnabled'] = True self.m_defaultPageSettings['XSSAuditing'] = False - self.m_defaultPageSettings['quirksMode'] = True self.m_defaultPageSettings['userAgent'] = self.m_page.userAgent() self.m_defaultPageSettings['localAccessRemote'] = args.local_access_remote self.m_page.applySettings(self.m_defaultPageSettings) diff --git a/python/pyphantomjs/webpage.py b/python/pyphantomjs/webpage.py index c181ead2..4039fcc7 100644 --- a/python/pyphantomjs/webpage.py +++ b/python/pyphantomjs/webpage.py @@ -120,11 +120,8 @@ class WebPage(QObject): opt.setAttribute(QWebSettings.AutoLoadImages, defaults['loadImages']) opt.setAttribute(QWebSettings.PluginsEnabled, defaults['loadPlugins']) - opt.setAttribute(QWebSettings.JavascriptEnabled, defaults['jsEnabled']) - opt.setAttribute(QWebSettings.JavascriptCanOpenWindows, defaults['jsOpenWindows']) - opt.setAttribute(QWebSettings.JavascriptCanAccessClipboard, defaults['jsAccessClipboard']) + opt.setAttribute(QWebSettings.JavascriptEnabled, defaults['javascriptEnabled']) opt.setAttribute(QWebSettings.XSSAuditingEnabled, defaults['XSSAuditing']) - opt.setAttribute(QWebSettings.SiteSpecificQuirksEnabled, defaults['quirksMode']) opt.setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, defaults['localAccessRemote']) if 'userAgent' in defaults: self.m_webPage.m_userAgent = defaults['userAgent'] diff --git a/src/consts.h b/src/consts.h index 49458a0b..2be74a86 100644 --- a/src/consts.h +++ b/src/consts.h @@ -50,11 +50,8 @@ #define PAGE_SETTINGS_LOAD_IMAGES "loadImages" #define PAGE_SETTINGS_LOAD_PLUGINS "loadPlugins" -#define PAGE_SETTINGS_JS_ENABLED "jsEnabled" -#define PAGE_SETTINGS_JS_OPEN_WINDOWS "jsOpenWindows" -#define PAGE_SETTINGS_JS_ACCESS_CLIPBOARD "jsAccessClipboard" +#define PAGE_SETTINGS_JS_ENABLED "javasriptEnabled" #define PAGE_SETTINGS_XSS_AUDITING "XSSAuditing" -#define PAGE_SETTINGS_QUIRKS_MODE "quirksMode" #define PAGE_SETTINGS_USER_AGENT "userAgent" #define PAGE_SETTINGS_LOCAL_ACCESS_REMOTE "localAccessRemote" diff --git a/src/phantom.cpp b/src/phantom.cpp index 9cb04ef9..5b8650a8 100644 --- a/src/phantom.cpp +++ b/src/phantom.cpp @@ -179,10 +179,7 @@ Phantom::Phantom(QObject *parent) m_defaultPageSettings[PAGE_SETTINGS_LOAD_IMAGES] = QVariant::fromValue(autoLoadImages); m_defaultPageSettings[PAGE_SETTINGS_LOAD_PLUGINS] = QVariant::fromValue(pluginsEnabled); m_defaultPageSettings[PAGE_SETTINGS_JS_ENABLED] = QVariant::fromValue(true); - m_defaultPageSettings[PAGE_SETTINGS_JS_OPEN_WINDOWS] = QVariant::fromValue(false); - m_defaultPageSettings[PAGE_SETTINGS_JS_ACCESS_CLIPBOARD] = QVariant::fromValue(false); m_defaultPageSettings[PAGE_SETTINGS_XSS_AUDITING] = QVariant::fromValue(false); - m_defaultPageSettings[PAGE_SETTINGS_QUIRKS_MODE] = QVariant::fromValue(true); m_defaultPageSettings[PAGE_SETTINGS_USER_AGENT] = QVariant::fromValue(m_page->userAgent()); m_defaultPageSettings[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE] = QVariant::fromValue(localAccessRemote); m_page->applySettings(m_defaultPageSettings); diff --git a/src/webpage.cpp b/src/webpage.cpp index e0259595..89c447a2 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -177,10 +177,7 @@ void WebPage::applySettings(const QVariantMap &def) opt->setAttribute(QWebSettings::AutoLoadImages, def[PAGE_SETTINGS_LOAD_IMAGES].toBool()); opt->setAttribute(QWebSettings::PluginsEnabled, def[PAGE_SETTINGS_LOAD_PLUGINS].toBool()); opt->setAttribute(QWebSettings::JavascriptEnabled, def[PAGE_SETTINGS_JS_ENABLED].toBool()); - opt->setAttribute(QWebSettings::JavascriptCanOpenWindows, def[PAGE_SETTINGS_JS_OPEN_WINDOWS].toBool()); - opt->setAttribute(QWebSettings::JavascriptCanAccessClipboard, def[PAGE_SETTINGS_JS_ACCESS_CLIPBOARD].toBool()); opt->setAttribute(QWebSettings::XSSAuditingEnabled, def[PAGE_SETTINGS_XSS_AUDITING].toBool()); - opt->setAttribute(QWebSettings::SiteSpecificQuirksEnabled, def[PAGE_SETTINGS_QUIRKS_MODE].toBool()); opt->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, def[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE].toBool()); if (def.contains(PAGE_SETTINGS_USER_AGENT))