diff --git a/src/lib/plugins/qml/api/extensionscheme/qmlextensionscheme.h b/src/lib/plugins/qml/api/extensionscheme/qmlextensionscheme.h index 286b011b6..1669786f8 100644 --- a/src/lib/plugins/qml/api/extensionscheme/qmlextensionscheme.h +++ b/src/lib/plugins/qml/api/extensionscheme/qmlextensionscheme.h @@ -30,6 +30,7 @@ class QmlExtensionSchemeHandler; class QmlExtensionScheme : public QObject, public QQmlParserStatus { Q_OBJECT + Q_INTERFACES(QQmlParserStatus) /** * @brief extension scheme handle name */ diff --git a/src/lib/plugins/qml/api/userscript/qmluserscript.cpp b/src/lib/plugins/qml/api/userscript/qmluserscript.cpp index 5ae35a82a..f1fc8f27b 100644 --- a/src/lib/plugins/qml/api/userscript/qmluserscript.cpp +++ b/src/lib/plugins/qml/api/userscript/qmluserscript.cpp @@ -16,12 +16,18 @@ * along with this program. If not, see . * ============================================================ */ #include "qmluserscript.h" +#include "../../qmlstaticdata.h" QmlUserScript::QmlUserScript(QObject *parent) : QObject(parent) { } +QmlUserScript::~QmlUserScript() +{ + QmlStaticData::instance().getUserScriptsSingleton()->remove(this); +} + QWebEngineScript QmlUserScript::webEngineScript() const { return m_webEngineScript; @@ -46,6 +52,7 @@ void QmlUserScript::setName(const QString &name) { m_webEngineScript.setName(name); emit nameChanged(name); + aboutToUpdateUnderlyingScript(); } bool QmlUserScript::runsOnSubFrames() const @@ -57,6 +64,7 @@ void QmlUserScript::setRunsOnSubFrames(bool runsOnSubFrames) { m_webEngineScript.setRunsOnSubFrames(runsOnSubFrames); emit runsOnSubFramesChanged(runsOnSubFrames); + aboutToUpdateUnderlyingScript(); } int QmlUserScript::worldId() const @@ -80,6 +88,7 @@ void QmlUserScript::setWorldId(int worldId) break; } emit worldIdChanged(worldId); + aboutToUpdateUnderlyingScript(); } QString QmlUserScript::sourceCode() const @@ -91,6 +100,7 @@ void QmlUserScript::setSourceCode(const QString &sourceCode) { m_webEngineScript.setSourceCode(sourceCode); emit sourceCodeChanged(sourceCode); + aboutToUpdateUnderlyingScript(); } QmlUserScript::InjectionPoint QmlUserScript::injectionPoint() const @@ -114,4 +124,24 @@ void QmlUserScript::setInjectionPoint(InjectionPoint injectionPoint) break; } emit injectionPointChanged(injectionPoint); + aboutToUpdateUnderlyingScript(); +} + +void QmlUserScript::timerEvent(QTimerEvent *e) +{ + if (e->timerId() != m_basicTimer.timerId()) { + QObject::timerEvent(e); + return; + } + m_basicTimer.stop(); + QmlStaticData::instance().getUserScriptsSingleton()->insert(this); +} + +void QmlUserScript::aboutToUpdateUnderlyingScript() +{ + if (!m_basicTimer.isActive()) { + QmlStaticData::instance().getUserScriptsSingleton()->remove(this); + } + // Defer updates to the next event loop + m_basicTimer.start(0, this); } diff --git a/src/lib/plugins/qml/api/userscript/qmluserscript.h b/src/lib/plugins/qml/api/userscript/qmluserscript.h index 5a6944256..98ccd1777 100644 --- a/src/lib/plugins/qml/api/userscript/qmluserscript.h +++ b/src/lib/plugins/qml/api/userscript/qmluserscript.h @@ -20,6 +20,7 @@ #include "qzcommon.h" #include +#include #include /** @@ -73,6 +74,7 @@ public: Q_ENUM(ScriptWorldId) explicit QmlUserScript(QObject *parent = nullptr); + ~QmlUserScript(); QWebEngineScript webEngineScript() const; void setWebEngineScript(const QWebEngineScript &script); Q_SIGNALS: @@ -98,6 +100,7 @@ Q_SIGNALS: void injectionPointChanged(int injectionPoint); private: QWebEngineScript m_webEngineScript; + QBasicTimer m_basicTimer; bool null() const; QString name() const; @@ -110,4 +113,7 @@ private: void setSourceCode(const QString &sourceCode); InjectionPoint injectionPoint() const; void setInjectionPoint(InjectionPoint injectionPoint); + + void timerEvent(QTimerEvent *e) override; + void aboutToUpdateUnderlyingScript(); }; diff --git a/src/lib/plugins/qml/api/userscript/qmluserscripts.cpp b/src/lib/plugins/qml/api/userscript/qmluserscripts.cpp index 0a43ff1b7..841043967 100644 --- a/src/lib/plugins/qml/api/userscript/qmluserscripts.cpp +++ b/src/lib/plugins/qml/api/userscript/qmluserscripts.cpp @@ -26,14 +26,6 @@ QmlUserScripts::QmlUserScripts(QObject *parent) { } -QmlUserScripts::~QmlUserScripts() -{ - // remove scripts added by the plugin - for (const QWebEngineScript &webEngineScript : qAsConst(m_webEngineScripts)) { - mApp->webProfile()->scripts()->remove(webEngineScript); - } -} - int QmlUserScripts::count() const { return mApp->webProfile()->scripts()->count(); @@ -85,30 +77,6 @@ QList QmlUserScripts::findScripts(const QString &name) const return toQObjectList(list); } -void QmlUserScripts::insert(QObject *object) -{ - QmlUserScript *userScript = qobject_cast(object); - if (!userScript) { - return; - } - QWebEngineScript webEngineScript = userScript->webEngineScript(); - mApp->webProfile()->scripts()->insert(webEngineScript); - m_webEngineScripts.append(webEngineScript); -} - -void QmlUserScripts::insert(const QList &list) -{ - for (QObject *object : list) { - QmlUserScript *userScript = qobject_cast(object); - if (!userScript) { - continue; - } - QWebEngineScript webEngineScript = userScript->webEngineScript(); - mApp->webProfile()->scripts()->insert(webEngineScript); - m_webEngineScripts.append(webEngineScript); - } -} - void QmlUserScripts::remove(QObject *object) const { QmlUserScript *userScript = qobject_cast(object); @@ -124,3 +92,13 @@ QList QmlUserScripts::toList() const QList list = mApp->webProfile()->scripts()->toList(); return toQObjectList(list); } + +void QmlUserScripts::insert(QObject *object) +{ + QmlUserScript *userScript = qobject_cast(object); + if (!userScript) { + return; + } + QWebEngineScript webEngineScript = userScript->webEngineScript(); + mApp->webProfile()->scripts()->insert(webEngineScript); +} diff --git a/src/lib/plugins/qml/api/userscript/qmluserscripts.h b/src/lib/plugins/qml/api/userscript/qmluserscripts.h index 4bc7bb9d0..5fc7f8e42 100644 --- a/src/lib/plugins/qml/api/userscript/qmluserscripts.h +++ b/src/lib/plugins/qml/api/userscript/qmluserscripts.h @@ -40,7 +40,6 @@ class FALKON_EXPORT QmlUserScripts : public QObject Q_PROPERTY(bool empty READ empty CONSTANT) public: explicit QmlUserScripts(QObject *parent = nullptr); - ~QmlUserScripts(); /** * @brief Checks if the script is in collection * @param object of type QmlUserScript @@ -58,16 +57,6 @@ public: * @return list of objects, each of type QmlUserScript, representing the script of given name */ Q_INVOKABLE QList findScripts(const QString &name) const; - /** - * @brief Inserts a script into collection - * @param object of type QmlUserScript - */ - Q_INVOKABLE void insert(QObject *object); - /** - * @brief Inserts a list of scripts into collection - * @param list of objects, each of type QmlUserScript - */ - Q_INVOKABLE void insert(const QList &list); /** * @brief Removes a script from collection * @param object of type QmlUserScript @@ -78,11 +67,12 @@ public: * @return list of objects, each of type QmlUserScript */ Q_INVOKABLE QList toList() const; + + void insert(QObject *object); private: int count() const; int size() const; bool empty() const; - QList m_webEngineScripts; QList toQObjectList(const QList &list) const; }; diff --git a/src/lib/plugins/qml/qmlplugin.cpp b/src/lib/plugins/qml/qmlplugin.cpp index 2462812d5..a3d3ef937 100644 --- a/src/lib/plugins/qml/qmlplugin.cpp +++ b/src/lib/plugins/qml/qmlplugin.cpp @@ -70,7 +70,7 @@ void QmlPlugin::initPlugin(Plugins::Plugin *plugin) } qmlPluginLoader->createComponent(); if (!qmlPluginLoader->instance()) { - qWarning().noquote() << "Falied to create component for" << name << "plugin:" << qmlPluginLoader->component()->errorString(); + qWarning().noquote() << "Failed to create component for" << name << "plugin:" << qmlPluginLoader->component()->errorString(); return; } diff --git a/src/lib/plugins/qml/qmlstaticdata.cpp b/src/lib/plugins/qml/qmlstaticdata.cpp index d7a0457fa..f2cf1fd0c 100644 --- a/src/lib/plugins/qml/qmlstaticdata.cpp +++ b/src/lib/plugins/qml/qmlstaticdata.cpp @@ -25,6 +25,8 @@ #include "api/fileutils/qmlfileutils.h" #include "pluginproxy.h" +#include + QmlStaticData::QmlStaticData(QObject *parent) : QObject(parent) { @@ -138,53 +140,62 @@ QIcon QmlStaticData::getIcon(const QString &iconPath, const QString &pluginPath) QmlBookmarks *QmlStaticData::getBookmarksSingleton() { static QmlBookmarks *bookmarks = new QmlBookmarks(this); + QQmlEngine::setObjectOwnership(bookmarks, QQmlEngine::CppOwnership); return bookmarks; } QmlHistory *QmlStaticData::getHistorySingleton() { static QmlHistory *history = new QmlHistory(this); + QQmlEngine::setObjectOwnership(history, QQmlEngine::CppOwnership); return history; } QmlCookies *QmlStaticData::getCookiesSingleton() { static QmlCookies *cookies = new QmlCookies(this); + QQmlEngine::setObjectOwnership(cookies, QQmlEngine::CppOwnership); return cookies; } QmlTopSites *QmlStaticData::getTopSitesSingleton() { static QmlTopSites *topSites = new QmlTopSites(this); + QQmlEngine::setObjectOwnership(topSites, QQmlEngine::CppOwnership); return topSites; } QmlTabs *QmlStaticData::getTabsSingleton() { static QmlTabs *tabs = new QmlTabs(this); + QQmlEngine::setObjectOwnership(tabs, QQmlEngine::CppOwnership); return tabs; } QmlClipboard *QmlStaticData::getClipboardSingleton() { static QmlClipboard *clipboard = new QmlClipboard(this); + QQmlEngine::setObjectOwnership(clipboard, QQmlEngine::CppOwnership); return clipboard; } QmlWindows *QmlStaticData::getWindowsSingleton() { static QmlWindows *windows = new QmlWindows(this); + QQmlEngine::setObjectOwnership(windows, QQmlEngine::CppOwnership); return windows; } QmlExternalJsObject *QmlStaticData::getExternalJsObjectSingleton() { static QmlExternalJsObject *externalJsObject = new QmlExternalJsObject(this); + QQmlEngine::setObjectOwnership(externalJsObject, QQmlEngine::CppOwnership); return externalJsObject; } QmlUserScripts *QmlStaticData::getUserScriptsSingleton() { static QmlUserScripts *userScripts = new QmlUserScripts(this); + QQmlEngine::setObjectOwnership(userScripts, QQmlEngine::CppOwnership); return userScripts; } diff --git a/src/scripts/helloqml/main.qml b/src/scripts/helloqml/main.qml index 054faf370..1ee07eeb6 100644 --- a/src/scripts/helloqml/main.qml +++ b/src/scripts/helloqml/main.qml @@ -25,7 +25,6 @@ Falkon.PluginInterface { id: 'helloQmlObject', object: helloQmlObject }) - Falkon.UserScripts.insert(testingHelloQmlUserScript) } testPlugin: function() {