On 10/11/15 21:38, Ximin Luo wrote: > > Attached is the patch, please review. I will tidy up the Debian package then > file it upstream. I am unsure about certain things, for example: > > - The "webSecurity" option now has no effect, because it's not exposed in Qt > 5.5. I'm not sure if this has any practical implications. > - in cookiejar.cpp I replaced a quint32 with effectively a uint. Not sure if > this is a security concern, I'm not a C++ guy. > > But hey at least it works. :) >
Whoops, I've attached the patch for real this time. Also a second patch to make the build script work. For some reason debhelper wants to set MAKEFLAGS=w... X -- GPG: 4096R/1318EFAC5FBBDBCE git://github.com/infinity0/pubkeys.git
diff --git a/src/config.cpp b/src/config.cpp index 1f38c1e..e056812 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -176,7 +176,7 @@ void Config::loadJsonFile(const QString& filePath) // Add this object to the global scope webPage.mainFrame()->addToJavaScriptWindowObject("config", this); // Apply the JSON config settings to this very object - webPage.mainFrame()->evaluateJavaScript(configurator.arg(jsonConfig), QString()); + webPage.mainFrame()->evaluateJavaScript(configurator.arg(jsonConfig)); } QString Config::helpText() const diff --git a/src/cookiejar.cpp b/src/cookiejar.cpp index 9f01ebf..16839b2 100644 --- a/src/cookiejar.cpp +++ b/src/cookiejar.cpp @@ -39,31 +39,31 @@ #define COOKIE_JAR_VERSION 1 // Operators needed for Cookie Serialization -QT_BEGIN_NAMESPACE -QDataStream& operator<<(QDataStream& stream, const QList<QNetworkCookie>& list) + +QDataStream &operator<<(QDataStream& stream, const QList<QNetworkCookie>& list) { - stream << COOKIE_JAR_VERSION; - stream << quint32(list.size()); + stream << QVariant(COOKIE_JAR_VERSION); + stream << QVariant(list.size()); for (int i = 0; i < list.size(); ++i) { stream << list.at(i).toRawForm(); } return stream; } -QDataStream& operator>>(QDataStream& stream, QList<QNetworkCookie>& list) +QDataStream &operator>>(QDataStream& stream, QList<QNetworkCookie>& list) { list.clear(); - quint32 version; + QVariant version; stream >> version; - if (version != COOKIE_JAR_VERSION) { + if (version.toUInt() != COOKIE_JAR_VERSION) { return stream; } - quint32 count; + QVariant count; stream >> count; - for (quint32 i = 0; i < count; ++i) { + for (quint32 i = 0; i < count.toUInt(); ++i) { QByteArray value; stream >> value; QList<QNetworkCookie> newCookies = QNetworkCookie::parseCookies(value); @@ -79,7 +79,6 @@ QDataStream& operator>>(QDataStream& stream, QList<QNetworkCookie>& list) } return stream; } -QT_END_NAMESPACE // public: CookieJar::CookieJar(QString cookiesFile, QObject* parent) diff --git a/src/cookiejar.h b/src/cookiejar.h index 1ced25a..f23bb9e 100644 --- a/src/cookiejar.h +++ b/src/cookiejar.h @@ -36,6 +36,12 @@ #include <QNetworkCookieJar> #include <QVariantList> #include <QVariantMap> +#include <QDataStream> + +QT_BEGIN_NAMESPACE +QDataStream& operator<<(QDataStream& stream, const QList<QNetworkCookie>& list); +QDataStream& operator<<(QDataStream& stream, const QList<QNetworkCookie>& list); +QT_END_NAMESPACE class CookieJar: public QNetworkCookieJar { diff --git a/src/phantom.cpp b/src/phantom.cpp index 08b836e..e7cb56d 100644 --- a/src/phantom.cpp +++ b/src/phantom.cpp @@ -377,7 +377,7 @@ void Phantom::loadModule(const QString& moduleSource, const QString& filename) "require.cache['" + filename + "'].exports," + "require.cache['" + filename + "']" + "));"; - m_page->mainFrame()->evaluateJavaScript(scriptSource, ""); + m_page->mainFrame()->evaluateJavaScript(scriptSource); } bool Phantom::injectJs(const QString& jsFilePath) @@ -447,8 +447,7 @@ void Phantom::onInitialized() // Bootstrap the PhantomJS scope m_page->mainFrame()->evaluateJavaScript( - Utils::readResourceFileUtf8(":/bootstrap.js"), - QString("phantomjs://bootstrap.js") + Utils::readResourceFileUtf8(":/bootstrap.js") ); } diff --git a/src/phantomjs.pro b/src/phantomjs.pro index a658803..8e1e919 100644 --- a/src/phantomjs.pro +++ b/src/phantomjs.pro @@ -1,11 +1,7 @@ -if(!equals(QT_MAJOR_VERSION, 5)|!equals(QT_MINOR_VERSION, 4)) { - error("This program can only be compiled with Qt 5.4.x.") -} - TEMPLATE = app TARGET = phantomjs -QT += network webkitwidgets +QT += core network webkitwidgets printsupport CONFIG += console DESTDIR = ../bin diff --git a/src/repl.cpp b/src/repl.cpp index dfffff8..7f25a22 100644 --- a/src/repl.cpp +++ b/src/repl.cpp @@ -147,7 +147,7 @@ REPL::REPL(QWebFrame* webframe, Phantom* parent) linenoiseSetCompletionCallback(REPL::offerCompletion); // Inject REPL utility functions - m_webframe->evaluateJavaScript(Utils::readResourceFileUtf8(":/repl.js"), QString("phantomjs://repl.js")); + m_webframe->evaluateJavaScript(Utils::readResourceFileUtf8(":/repl.js")); // Add self to JavaScript world m_webframe->addToJavaScriptWindowObject("_repl", this); @@ -184,8 +184,7 @@ void REPL::offerCompletion(const char* buf, linenoiseCompletions* lc) QStringList completions = REPL::getInstance()->m_webframe->evaluateJavaScript( QString(JS_RETURN_POSSIBLE_COMPLETIONS).arg( toInspect, - toComplete), - QString() + toComplete) ).toStringList(); foreach(QString c, completions) { @@ -210,7 +209,7 @@ void REPL::startLoop() // Send the user input to the main Phantom frame for evaluation m_webframe->evaluateJavaScript( QString(JS_EVAL_USER_INPUT).arg( - QString(userInput).replace('"', "\\\"")), QString("phantomjs://repl-input")); + QString(userInput).replace('"', "\\\""))); // Save command in the REPL history linenoiseHistoryAdd(userInput); diff --git a/src/utils.cpp b/src/utils.cpp index 42de4d0..47ddec4 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -133,7 +133,7 @@ bool injectJsInFrame(const QString& jsFilePath, const QString& jsFileLanguage, c return false; } // Execute JS code in the context of the document - targetFrame->evaluateJavaScript(scriptBody, jsFilePath); + targetFrame->evaluateJavaScript(scriptBody); return true; } @@ -151,7 +151,7 @@ bool loadJSForDebug(const QString& jsFilePath, const QString& jsFileLanguage, co targetFrame->evaluateJavaScript(scriptBody); if (autorun) { - targetFrame->evaluateJavaScript("__run()", QString()); + targetFrame->evaluateJavaScript("__run()"); } return true; diff --git a/src/webpage.cpp b/src/webpage.cpp index 630774d..61a2394 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -360,13 +360,6 @@ WebPage::WebPage(QObject* parent, const QUrl& baseUrl) m_customWebPage = new CustomPage(this); Config* phantomCfg = Phantom::instance()->config(); - // To grant universal access to a web page - // attribute "WebSecurityEnabled" must be applied during the initializing - // security context for Document instance. Setting up it later will not cause any effect - // see <qt\src\3rdparty\webkit\Source\WebCore\dom\Document.cpp:4468> - QWebSettings* settings = m_customWebPage->settings(); - settings->setAttribute(QWebSettings::WebSecurityEnabled, phantomCfg->webSecurityEnabled()); - m_mainFrame = m_customWebPage->mainFrame(); m_currentFrame = m_mainFrame; m_mainFrame->setHtml(BLANK_HTML, baseUrl); @@ -613,7 +606,6 @@ void WebPage::applySettings(const QVariantMap& def) 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()); - opt->setAttribute(QWebSettings::WebSecurityEnabled, def[PAGE_SETTINGS_WEB_SECURITY_ENABLED].toBool()); opt->setAttribute(QWebSettings::JavascriptCanOpenWindows, def[PAGE_SETTINGS_JS_CAN_OPEN_WINDOWS].toBool()); opt->setAttribute(QWebSettings::JavascriptCanCloseWindows, def[PAGE_SETTINGS_JS_CAN_CLOSE_WINDOWS].toBool()); @@ -729,8 +721,8 @@ QVariant WebPage::evaluateJavaScript(const QString& code) qDebug() << "WebPage - evaluateJavaScript" << function; evalResult = m_currentFrame->evaluateJavaScript( - function, //< function evaluated - QString("phantomjs://webpage.evaluate()")); //< reference source file + function //< function evaluated + ); //< reference source file qDebug() << "WebPage - evaluateJavaScript result" << evalResult; @@ -912,7 +904,7 @@ void WebPage::openUrl(const QString& address, const QVariant& op, const QVariant } if (networkOp == QNetworkAccessManager::UnknownOperation) { - m_mainFrame->evaluateJavaScript("console.error('Unknown network operation: " + operation + "');", QString()); + m_mainFrame->evaluateJavaScript("console.error('Unknown network operation: " + operation + "');"); return; } @@ -1243,7 +1235,7 @@ bool WebPage::renderPdf(const QString& fileName) printer.setPageMargins(marginLeft, marginTop, marginRight, marginBottom, QPrinter::Point); - m_mainFrame->print(&printer, this); + m_mainFrame->print(&printer); return true; } @@ -1301,7 +1293,7 @@ QString getHeaderFooter(const QVariantMap& map, const QString& key, QWebFrame* f } } } - frame->evaluateJavaScript("console.error('Bad header callback given, use phantom.callback);", QString()); + frame->evaluateJavaScript("console.error('Bad header callback given, use phantom.callback);"); return QString(); } @@ -1340,7 +1332,7 @@ bool WebPage::injectJs(const QString& jsFilePath) void WebPage::_appendScriptElement(const QString& scriptUrl) { - m_currentFrame->evaluateJavaScript(QString(JS_APPEND_SCRIPT_ELEMENT).arg(scriptUrl), scriptUrl); + m_currentFrame->evaluateJavaScript(QString(JS_APPEND_SCRIPT_ELEMENT).arg(scriptUrl)); } QObject* WebPage::_getGenericCallback() diff --git a/src/webpage.h b/src/webpage.h index 0873996..97ec1d3 100644 --- a/src/webpage.h +++ b/src/webpage.h @@ -45,7 +45,7 @@ class NetworkAccessManager; class QWebInspector; class Phantom; -class WebPage : public QObject, public QWebFrame::PrintCallback +class WebPage : public QObject { Q_OBJECT Q_PROPERTY(QString title READ title)
--- a/build.sh +++ b/build.sh @@ -9,7 +9,7 @@ MAKEFLAGS_JOBS='' if [[ "$MAKEFLAGS" != "" ]]; then - MAKEFLAGS_JOBS=$(echo $MAKEFLAGS | egrep -o '\-j[0-9]+' | egrep -o '[0-9]+') + MAKEFLAGS_JOBS=$(echo $MAKEFLAGS | egrep -o '\-j[0-9]+' | egrep -o '[0-9]+' | cat) fi if [[ "$MAKEFLAGS_JOBS" != "" ]]; then