Merge branch 'master' of github.com:ariya/phantomjs

1.3
Ariya Hidayat 2011-08-20 18:13:38 -07:00
commit e679640700
6 changed files with 47 additions and 11 deletions

View File

@ -68,6 +68,8 @@ class Phantom(QObject):
self.m_defaultPageSettings['loadImages'] = args.load_images
self.m_defaultPageSettings['loadPlugins'] = args.load_plugins
self.m_defaultPageSettings['javascriptEnabled'] = True
self.m_defaultPageSettings['XSSAuditing'] = False
self.m_defaultPageSettings['userAgent'] = self.m_page.userAgent()
self.m_defaultPageSettings['localAccessRemote'] = args.local_access_remote
self.m_page.applySettings(self.m_defaultPageSettings)

View File

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

View File

@ -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
@ -31,11 +32,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)
@ -82,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)
@ -120,6 +117,8 @@ class WebPage(QObject):
opt.setAttribute(QWebSettings.AutoLoadImages, defaults['loadImages'])
opt.setAttribute(QWebSettings.PluginsEnabled, defaults['loadPlugins'])
opt.setAttribute(QWebSettings.JavascriptEnabled, defaults['javascriptEnabled'])
opt.setAttribute(QWebSettings.XSSAuditingEnabled, defaults['XSSAuditing'])
opt.setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, defaults['localAccessRemote'])
if 'userAgent' in defaults:
self.m_webPage.m_userAgent = defaults['userAgent']
@ -177,11 +176,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 +258,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:
@ -282,6 +284,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
@ -324,6 +332,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):

View File

@ -50,6 +50,8 @@
#define PAGE_SETTINGS_LOAD_IMAGES "loadImages"
#define PAGE_SETTINGS_LOAD_PLUGINS "loadPlugins"
#define PAGE_SETTINGS_JS_ENABLED "javasriptEnabled"
#define PAGE_SETTINGS_XSS_AUDITING "XSSAuditing"
#define PAGE_SETTINGS_USER_AGENT "userAgent"
#define PAGE_SETTINGS_LOCAL_ACCESS_REMOTE "localAccessRemote"

View File

@ -178,6 +178,8 @@ 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_XSS_AUDITING] = QVariant::fromValue(false);
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);

View File

@ -60,6 +60,7 @@ public:
, m_webPage(parent)
{
m_userAgent = QWebPage::userAgentForUrl(QUrl());
setForwardUnsupportedContent(true);
}
public slots:
@ -177,6 +178,8 @@ 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::XSSAuditingEnabled, def[PAGE_SETTINGS_XSS_AUDITING].toBool());
opt->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, def[PAGE_SETTINGS_LOCAL_ACCESS_REMOTE].toBool());
if (def.contains(PAGE_SETTINGS_USER_AGENT))