summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2015-04-08 15:10:00 +0200
committerYoann Lopes <yoann.lopes@theqtcompany.com>2015-04-09 09:36:34 +0000
commita700ff9674f1e3ca86f279d3041c8e81433be7ca (patch)
tree14e58dde604b228c58da7aa2d105a3a0d82ca753
parentddec92543f10d0d16455ba5ba4f450c3fe417644 (diff)
Make the QtMultimedia singleton type a QObject.
It was a QJSValue for the sake of being as lightweight as possible and because we don't actually need any of the QObject features for that type in its current state. However, this implies that type information is not available at runtime. This is a problem for qmlplugindump which currently crashes because it always expects every QML type to have an associated meta object. We can safely make that type a QObject since it doesn't affect source compatibility in any way. This type was bound to become a QObject at some point anyway. Task-number: QTBUG-44299 Change-Id: I2d9b874f15ffc94ed95ef74fadc3b1fd193fe1ef Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
-rw-r--r--src/imports/multimedia/multimedia.cpp8
-rw-r--r--src/imports/multimedia/qdeclarativemultimediaglobal.cpp52
-rw-r--r--src/imports/multimedia/qdeclarativemultimediaglobal_p.h26
3 files changed, 43 insertions, 43 deletions
diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp
index 80dc4f82c..a71c6f1c2 100644
--- a/src/imports/multimedia/multimedia.cpp
+++ b/src/imports/multimedia/multimedia.cpp
@@ -57,6 +57,12 @@ QML_DECLARE_TYPE(QSoundEffect)
QT_BEGIN_NAMESPACE
+static QObject *multimedia_global_object(QQmlEngine *qmlEngine, QJSEngine *jsEngine)
+{
+ Q_UNUSED(qmlEngine)
+ return new QDeclarativeMultimediaGlobal(jsEngine);
+}
+
class QMultimediaDeclarativeModule : public QQmlExtensionPlugin
{
Q_OBJECT
@@ -98,7 +104,7 @@ public:
qmlRegisterType<QSoundEffect>(uri, 5, 3, "SoundEffect");
// 5.4 types
- qmlRegisterSingletonType(uri, 5, 4, "QtMultimedia", QDeclarativeMultimedia::initGlobalObject);
+ qmlRegisterSingletonType<QDeclarativeMultimediaGlobal>(uri, 5, 4, "QtMultimedia", multimedia_global_object);
qmlRegisterRevision<QDeclarativeCamera, 1>(uri, 5, 4);
qmlRegisterUncreatableType<QDeclarativeCameraViewfinder>(uri, 5, 4, "CameraViewfinder",
trUtf8("CameraViewfinder is provided by Camera"));
diff --git a/src/imports/multimedia/qdeclarativemultimediaglobal.cpp b/src/imports/multimedia/qdeclarativemultimediaglobal.cpp
index 37e429794..c6430427e 100644
--- a/src/imports/multimedia/qdeclarativemultimediaglobal.cpp
+++ b/src/imports/multimedia/qdeclarativemultimediaglobal.cpp
@@ -153,27 +153,6 @@ Camera {
\endqml
*/
-namespace QDeclarativeMultimedia {
-
-#define FREEZE_SOURCE "(function deepFreeze(o) { "\
- " var prop, propKey;" \
- " Object.freeze(o);" \
- " for (propKey in o) {" \
- " prop = o[propKey];" \
- " if (!o.hasOwnProperty(propKey) || !(typeof prop === \"object\") || " \
- " Object.isFrozen(prop)) {" \
- " continue;" \
- " }" \
- " deepFreeze(prop);" \
- " }" \
- "})"
-
-static void deepFreeze(QJSEngine *jsEngine, const QJSValue &obj)
-{
- QJSValue freezeFunc = jsEngine->evaluate(QString::fromUtf8(FREEZE_SOURCE));
- freezeFunc.call(QJSValueList() << obj);
-}
-
static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &camera)
{
QJSValue o = jsEngine->newObject();
@@ -184,29 +163,24 @@ static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &came
return o;
}
-QJSValue initGlobalObject(QQmlEngine *qmlEngine, QJSEngine *jsEngine)
+QDeclarativeMultimediaGlobal::QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent)
+ : QObject(parent)
+ , m_engine(engine)
{
- Q_UNUSED(qmlEngine)
-
- QJSValue globalObject = jsEngine->newObject();
+}
- // property object defaultCamera
- globalObject.setProperty(QStringLiteral("defaultCamera"),
- cameraInfoToJSValue(jsEngine, QCameraInfo::defaultCamera()));
+QJSValue QDeclarativeMultimediaGlobal::defaultCamera() const
+{
+ return cameraInfoToJSValue(m_engine, QCameraInfo::defaultCamera());
+}
- // property list<object> availableCameras
+QJSValue QDeclarativeMultimediaGlobal::availableCameras() const
+{
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
- QJSValue availableCameras = jsEngine->newArray(cameras.count());
+ QJSValue availableCameras = m_engine->newArray(cameras.count());
for (int i = 0; i < cameras.count(); ++i)
- availableCameras.setProperty(i, cameraInfoToJSValue(jsEngine, cameras.at(i)));
- globalObject.setProperty(QStringLiteral("availableCameras"), availableCameras);
-
- // freeze global object to prevent properties to be modified from QML
- deepFreeze(jsEngine, globalObject);
-
- return globalObject;
-}
-
+ availableCameras.setProperty(i, cameraInfoToJSValue(m_engine, cameras.at(i)));
+ return availableCameras;
}
QT_END_NAMESPACE
diff --git a/src/imports/multimedia/qdeclarativemultimediaglobal_p.h b/src/imports/multimedia/qdeclarativemultimediaglobal_p.h
index 6c4dba7f4..192874c23 100644
--- a/src/imports/multimedia/qdeclarativemultimediaglobal_p.h
+++ b/src/imports/multimedia/qdeclarativemultimediaglobal_p.h
@@ -46,12 +46,32 @@
//
#include <QtQml/qqml.h>
+#include <QtQml/qjsvalue.h>
QT_BEGIN_NAMESPACE
-namespace QDeclarativeMultimedia {
- QJSValue initGlobalObject(QQmlEngine *, QJSEngine *);
-}
+class QDeclarativeMultimediaGlobal : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QJSValue defaultCamera READ defaultCamera NOTIFY defaultCameraChanged)
+ Q_PROPERTY(QJSValue availableCameras READ availableCameras NOTIFY availableCamerasChanged)
+
+public:
+ explicit QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent = 0);
+
+ QJSValue defaultCamera() const;
+ QJSValue availableCameras() const;
+
+Q_SIGNALS:
+ // Unused at the moment. QCameraInfo doesn't notify when cameras are added or removed,
+ // but it might change in the future.
+ void defaultCameraChanged();
+ void availableCamerasChanged();
+
+private:
+ QJSEngine *m_engine;
+};
QT_END_NAMESPACE