diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-08-25 17:05:12 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-08-26 07:47:11 +0000 |
commit | ee6d55dd955382b70228f469e785243761aa658d (patch) | |
tree | e08f66355a3524a48437535aca9027e4c847a202 | |
parent | c1732882bc616c3607306ef71fe8055fe7e760f3 (diff) |
Do not allow "static" JS extension classes to be instantiated
Apart from it being weird that people can instantiate them, it also
makes us crash.
Task-number: QBS-1009
Change-Id: Ic10ab530484df973b569aa5a185c06274ad2fef1
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
7 files changed, 56 insertions, 12 deletions
diff --git a/src/lib/corelib/jsextensions/environmentextension.cpp b/src/lib/corelib/jsextensions/environmentextension.cpp index 56c60653b..e38c065d2 100644 --- a/src/lib/corelib/jsextensions/environmentextension.cpp +++ b/src/lib/corelib/jsextensions/environmentextension.cpp @@ -73,10 +73,8 @@ void initializeJsExtensionEnvironment(QScriptValue extensionObject) QScriptValue EnvironmentExtension::js_ctor(QScriptContext *context, QScriptEngine *engine) { - // Add instance variables here etc., if needed. - Q_UNUSED(context); Q_UNUSED(engine); - return true; + return context->throwError(Tr::tr("'Environment' cannot be instantiated.")); } static QProcessEnvironment *getProcessEnvironment(QScriptContext *context, QScriptEngine *engine, diff --git a/src/lib/corelib/jsextensions/file.cpp b/src/lib/corelib/jsextensions/file.cpp index 40e9f2034..da19f5181 100644 --- a/src/lib/corelib/jsextensions/file.cpp +++ b/src/lib/corelib/jsextensions/file.cpp @@ -110,10 +110,8 @@ void initializeJsExtensionFile(QScriptValue extensionObject) QScriptValue File::js_ctor(QScriptContext *context, QScriptEngine *engine) { - // Add instance variables here etc., if needed. - Q_UNUSED(context); Q_UNUSED(engine); - return true; + return context->throwError(Tr::tr("'File' cannot be instantiated.")); } QScriptValue File::js_copy(QScriptContext *context, QScriptEngine *engine) diff --git a/src/lib/corelib/jsextensions/fileinfoextension.cpp b/src/lib/corelib/jsextensions/fileinfoextension.cpp index 245343e83..c9c879b3e 100644 --- a/src/lib/corelib/jsextensions/fileinfoextension.cpp +++ b/src/lib/corelib/jsextensions/fileinfoextension.cpp @@ -99,10 +99,8 @@ void initializeJsExtensionFileInfo(QScriptValue extensionObject) QScriptValue FileInfoExtension::js_ctor(QScriptContext *context, QScriptEngine *engine) { - // Add instance variables here etc., if needed. - Q_UNUSED(context); Q_UNUSED(engine); - return true; + return context->throwError(Tr::tr("'FileInfo' cannot be instantiated.")); } QScriptValue FileInfoExtension::js_path(QScriptContext *context, QScriptEngine *engine) diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp index adcfff770..13be6d9ec 100644 --- a/src/lib/corelib/jsextensions/utilitiesextension.cpp +++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp @@ -108,10 +108,8 @@ void initializeJsExtensionUtilities(QScriptValue extensionObject) QScriptValue UtilitiesExtension::js_ctor(QScriptContext *context, QScriptEngine *engine) { - // Add instance variables here etc., if needed. - Q_UNUSED(context); Q_UNUSED(engine); - return true; + return context->throwError(Tr::tr("'Utilities' cannot be instantiated.")); } QScriptValue UtilitiesExtension::js_canonicalArchitecture(QScriptContext *context, diff --git a/tests/auto/blackbox/testdata/invalid-extension-instantiation/invalid-extension-instantiation.qbs b/tests/auto/blackbox/testdata/invalid-extension-instantiation/invalid-extension-instantiation.qbs new file mode 100644 index 000000000..ad2f55da4 --- /dev/null +++ b/tests/auto/blackbox/testdata/invalid-extension-instantiation/invalid-extension-instantiation.qbs @@ -0,0 +1,27 @@ +import qbs +import qbs.Environment +import qbs.File +import qbs.FileInfo +import qbs.Utilities + +Product { + name: "theProduct" + type: ["mytype"] + property string extension + + Rule { + multiplex: true + Artifact { + filePath: "dummy" + fileTags: product.type + } + prepare: { + var cmd = new JavaScriptCommand(); + cmd.silent = true; + cmd.sourceCode = function() { + var f = eval("new " + product.extension); + }; + return [cmd]; + } + } +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index a6581a5d9..784477986 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -2638,6 +2638,29 @@ void TestBlackbox::invalidCommandProperty() QVERIFY2(m_qbsStderr.contains("unsuitable"), m_qbsStderr.constData()); } +void TestBlackbox::invalidExtensionInstantiation() +{ + QDir::setCurrent(testDataDir + "/invalid-extension-instantiation"); + QbsRunParameters params; + params.expectFailure = true; + params.arguments << (QString("theProduct.extension:") + QTest::currentDataTag()); + QVERIFY(runQbs(params) != 0); + QVERIFY2(m_qbsStderr.contains("invalid-extension-instantiation.qbs:18") + && m_qbsStderr.contains('\'' + QByteArray(QTest::currentDataTag()) + + "' cannot be instantiated"), + m_qbsStderr.constData()); +} + +void TestBlackbox::invalidExtensionInstantiation_data() +{ + QTest::addColumn<bool>("dummy"); + + QTest::newRow("Environment"); + QTest::newRow("File"); + QTest::newRow("FileInfo"); + QTest::newRow("Utilities"); +} + static QProcessEnvironment processEnvironmentWithCurrentDirectoryInLibraryPath() { QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index b05494243..5d70b8dc0 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -148,6 +148,8 @@ private slots: void installPackage(); void installTree(); void invalidCommandProperty(); + void invalidExtensionInstantiation(); + void invalidExtensionInstantiation_data(); void java(); void javaDependencyTracking(); void jsExtensionsFile(); |