From 171267cfb04479cd77415ccefaadb4232ac0bc8a Mon Sep 17 00:00:00 2001 From: David Rosca Date: Tue, 16 Sep 2014 16:58:36 +0200 Subject: [PATCH] GreaseMonkey: Correctly run scripts in frames Closes #1457 --- src/plugins/GreaseMonkey/gm_manager.cpp | 49 ++++++++++++------------- src/plugins/GreaseMonkey/gm_manager.h | 4 +- src/plugins/GreaseMonkey/gm_plugin.cpp | 5 ++- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/plugins/GreaseMonkey/gm_manager.cpp b/src/plugins/GreaseMonkey/gm_manager.cpp index 2153e72aa..0a6789e6e 100644 --- a/src/plugins/GreaseMonkey/gm_manager.cpp +++ b/src/plugins/GreaseMonkey/gm_manager.cpp @@ -194,44 +194,41 @@ void GM_Manager::showNotification(const QString &message, const QString &title) mApp->desktopNotifications()->showNotification(icon, title.isEmpty() ? tr("GreaseMonkey") : title, message); } -void GM_Manager::pageLoadStart() +void GM_Manager::frameLoadStart() { - QWebFrame* mainFrame = qobject_cast(sender()); - if (!mainFrame) { + QWebFrame* frame = qobject_cast(sender()); + if (!frame) { return; } - const QString urlScheme = mainFrame->url().scheme(); - const QString urlString = mainFrame->url().toEncoded(); + const QUrl url = frame->url().isEmpty() ? frame->baseUrl() : frame->url(); + const QString urlScheme = url.scheme(); + const QString urlString = url.toEncoded(); if (!canRunOnScheme(urlScheme)) { return; } - // Run it in every frame - QList frames; - frames.append(mainFrame); - while (!frames.isEmpty()) { - QWebFrame* frame = frames.takeFirst(); - if (frame) { - mainFrame->addToJavaScriptWindowObject("_qz_greasemonkey", m_jsObject); + frame->addToJavaScriptWindowObject(QSL("_qz_greasemonkey"), m_jsObject); - foreach (GM_Script* script, m_startScripts) { - if (script->match(urlString)) { - mainFrame->evaluateJavaScript(m_bootstrap + script->script()); - } - } - - foreach (GM_Script* script, m_endScripts) { - if (script->match(urlString)) { - const QString jscript = QString("window.addEventListener(\"DOMContentLoaded\"," - "function(e) { \n%1\n }, false);").arg(m_bootstrap + script->script()); - mainFrame->evaluateJavaScript(jscript); - } - } - frames += frame->childFrames(); + foreach (GM_Script* script, m_startScripts) { + if (script->match(urlString)) { + frame->evaluateJavaScript(m_bootstrap + script->script()); } } + + foreach (GM_Script* script, m_endScripts) { + if (script->match(urlString)) { + const QString jscript = QString(QSL("window.addEventListener(\"DOMContentLoaded\"," + "function(e) { \n%1\n }, false);")).arg(m_bootstrap + script->script()); + frame->evaluateJavaScript(jscript); + } + } +} + +void GM_Manager::frameCreated(QWebFrame *frame) +{ + connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(frameLoadStart())); } void GM_Manager::load() diff --git a/src/plugins/GreaseMonkey/gm_manager.h b/src/plugins/GreaseMonkey/gm_manager.h index 776cc13e7..9e87774e2 100644 --- a/src/plugins/GreaseMonkey/gm_manager.h +++ b/src/plugins/GreaseMonkey/gm_manager.h @@ -24,6 +24,7 @@ #include class QUrl; +class QWebFrame; class QNetworkRequest; class BrowserWindow; @@ -67,7 +68,8 @@ public slots: void mainWindowCreated(BrowserWindow* window); void mainWindowDeleted(BrowserWindow* window); - void pageLoadStart(); + void frameLoadStart(); + void frameCreated(QWebFrame* frame); private slots: void load(); diff --git a/src/plugins/GreaseMonkey/gm_plugin.cpp b/src/plugins/GreaseMonkey/gm_plugin.cpp index e27029d44..027490dc3 100644 --- a/src/plugins/GreaseMonkey/gm_plugin.cpp +++ b/src/plugins/GreaseMonkey/gm_plugin.cpp @@ -41,7 +41,7 @@ PluginSpec GM_Plugin::pluginSpec() spec.name = "GreaseMonkey"; spec.info = "Userscripts for QupZilla"; spec.description = "Provides support for userscripts (www.userscripts.org)"; - spec.version = "0.4.6"; + spec.version = "0.5.0"; spec.author = "David Rosca "; spec.icon = QPixmap(":gm/data/icon.png"); spec.hasSettings = true; @@ -114,7 +114,8 @@ QNetworkReply* GM_Plugin::createRequest(QNetworkAccessManager::Operation op, con void GM_Plugin::webPageCreated(WebPage* page) { - connect(page->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), m_manager, SLOT(pageLoadStart())); + m_manager->frameCreated(page->mainFrame()); + connect(page, SIGNAL(frameCreated(QWebFrame*)), m_manager, SLOT(frameCreated(QWebFrame*))); } #if QT_VERSION < 0x050000