aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2018-01-31 20:48:21 +0100
committerAndré Hartmann <aha_1980@gmx.de>2018-02-02 13:07:49 +0000
commit5f6950757309b123ad46de06cf5d9282973d37c6 (patch)
treeb5802c1b721dbe8e54f7d08f6dd0dcb2100ebd7d
parent38807f3deda5084bf5211d6e53a3485f4865edd6 (diff)
JavaScriptFilter: Use QScriptEngine to avoid endless loops
QJSEngine does not provide a means to interrupt the evaluation when then engine stucks in an endless loop. The (deprecated) QScriptEngine does allow this, so use this for now. As QBS also needs QScriptEngine, no extra dependency is created. For Qt installations without QtScript, the JavaScriptFilter is not compiled. Task-number: QTCREATORBUG-19690 Change-Id: I172b7e7042eea0d40a765c836b2d1c57b6a529e6 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Eike Ziller <eike.ziller@qt.io> Reviewed-by: Orgad Shaneh <orgads@gmail.com>
-rw-r--r--src/plugins/coreplugin/coreplugin.qbs19
-rw-r--r--src/plugins/coreplugin/locator/javascriptfilter.cpp28
-rw-r--r--src/plugins/coreplugin/locator/javascriptfilter.h4
-rw-r--r--src/plugins/coreplugin/locator/locator.cpp2
-rw-r--r--src/plugins/coreplugin/locator/locator.pri16
5 files changed, 55 insertions, 14 deletions
diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs
index ce47658daa..9425c4ad92 100644
--- a/src/plugins/coreplugin/coreplugin.qbs
+++ b/src/plugins/coreplugin/coreplugin.qbs
@@ -17,11 +17,18 @@ Project {
condition: qbs.targetOS.contains("windows")
}
+ Depends { name: "Qt.script"; required: false }
+
Depends { name: "Utils" }
Depends { name: "Aggregation" }
Depends { name: "app_version_header" }
+ Properties {
+ condition: Qt.script.present
+ cpp.defines: base.concat("WITH_JAVASCRIPTFILTER")
+ }
+
cpp.dynamicLibraries: {
if (qbs.targetOS.contains("windows"))
return ["ole32", "user32"]
@@ -343,8 +350,6 @@ Project {
"filesystemfilter.ui",
"ilocatorfilter.cpp",
"ilocatorfilter.h",
- "javascriptfilter.cpp",
- "javascriptfilter.h",
"locatorconstants.h",
"locatorfiltersfilter.cpp",
"locatorfiltersfilter.h",
@@ -365,6 +370,16 @@ Project {
}
Group {
+ name: "Locator Javascript Filter"
+ condition: Qt.script.present
+ prefix: "locator/"
+ files: [
+ "javascriptfilter.cpp",
+ "javascriptfilter.h",
+ ]
+ }
+
+ Group {
name: "Locator_mac"
condition: qbs.targetOS.contains("macos")
files: [
diff --git a/src/plugins/coreplugin/locator/javascriptfilter.cpp b/src/plugins/coreplugin/locator/javascriptfilter.cpp
index 6255101dca..a4c20e7a7e 100644
--- a/src/plugins/coreplugin/locator/javascriptfilter.cpp
+++ b/src/plugins/coreplugin/locator/javascriptfilter.cpp
@@ -27,14 +27,16 @@
#include <QClipboard>
#include <QGuiApplication>
-#include <QJSEngine>
+#include <QScriptEngine>
+#include <QTimer>
namespace Core {
namespace Internal {
enum JavaScriptAction
{
- ResetEngine = QVariant::UserType + 1
+ ResetEngine = QVariant::UserType + 1,
+ AbortEngine
};
JavaScriptFilter::JavaScriptFilter()
@@ -66,12 +68,24 @@ QList<LocatorFilterEntry> JavaScriptFilter::matchesFor(
if (entry.trimmed().isEmpty()) {
entries.append({this, tr("Reset Engine"), QVariant(ResetEngine, nullptr)});
} else {
+ bool aborted = false;
+
+ QTimer::singleShot(1000, this, [this, &aborted]() {
+ m_engine->abortEvaluation();
+ aborted = true;
+ });
+
const QString result = m_engine->evaluate(entry).toString();
- const QString expression = entry + " = " + result;
- entries.append({this, expression, QVariant()});
- entries.append({this, tr("Copy to clipboard: %1").arg(result), result});
- entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression});
+ if (aborted) {
+ const QString message = entry + " = " + tr("Engine aborted after timeout.");
+ entries.append({this, message, QVariant(AbortEngine, nullptr)});
+ } else {
+ const QString expression = entry + " = " + result;
+ entries.append({this, expression, QVariant()});
+ entries.append({this, tr("Copy to clipboard: %1").arg(result), result});
+ entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression});
+ }
}
return entries;
@@ -104,7 +118,7 @@ void JavaScriptFilter::refresh(QFutureInterface<void> &future)
void JavaScriptFilter::setupEngine()
{
- m_engine.reset(new QJSEngine);
+ m_engine.reset(new QScriptEngine);
m_engine->evaluate(
"function abs(x) { return Math.abs(x); }\n"
"function acos(x) { return Math.acos(x); }\n"
diff --git a/src/plugins/coreplugin/locator/javascriptfilter.h b/src/plugins/coreplugin/locator/javascriptfilter.h
index 9bf3ac5194..025ce2fa6a 100644
--- a/src/plugins/coreplugin/locator/javascriptfilter.h
+++ b/src/plugins/coreplugin/locator/javascriptfilter.h
@@ -30,7 +30,7 @@
#include <memory>
QT_BEGIN_NAMESPACE
-class QJSEngine;
+class QScriptEngine;
QT_END_NAMESPACE
namespace Core {
@@ -53,7 +53,7 @@ public:
private:
void setupEngine();
- mutable std::unique_ptr<QJSEngine> m_engine;
+ mutable std::unique_ptr<QScriptEngine> m_engine;
};
} // namespace Internal
diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp
index e57f20241a..6a4f530f3c 100644
--- a/src/plugins/coreplugin/locator/locator.cpp
+++ b/src/plugins/coreplugin/locator/locator.cpp
@@ -122,8 +122,10 @@ void Locator::initialize(CorePlugin *corePlugin, const QStringList &, QString *)
new LocatorManager(this);
+#ifdef WITH_JAVASCRIPTFILTER
m_javaScriptFilter = new JavaScriptFilter;
m_corePlugin->addObject(m_javaScriptFilter);
+#endif
m_openDocumentsFilter = new OpenDocumentsFilter;
m_corePlugin->addObject(m_openDocumentsFilter);
diff --git a/src/plugins/coreplugin/locator/locator.pri b/src/plugins/coreplugin/locator/locator.pri
index 183d7fde51..c5f2cfaf9c 100644
--- a/src/plugins/coreplugin/locator/locator.pri
+++ b/src/plugins/coreplugin/locator/locator.pri
@@ -15,8 +15,7 @@ HEADERS += \
$$PWD/executefilter.h \
$$PWD/locatorsearchutils.h \
$$PWD/locatorsettingspage.h \
- $$PWD/externaltoolsfilter.h \
- $$PWD/javascriptfilter.h
+ $$PWD/externaltoolsfilter.h
SOURCES += \
$$PWD/locator.cpp \
@@ -33,7 +32,18 @@ SOURCES += \
$$PWD/locatorsearchutils.cpp \
$$PWD/locatorsettingspage.cpp \
$$PWD/externaltoolsfilter.cpp \
- $$PWD/javascriptfilter.cpp
+
+qtHaveModule(script) {
+ QT *= script
+
+ DEFINES += WITH_JAVASCRIPTFILTER
+
+ HEADERS += \
+ $$PWD/javascriptfilter.h
+
+ SOURCES += \
+ $$PWD/javascriptfilter.cpp
+}
FORMS += \
$$PWD/filesystemfilter.ui \