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() {