1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
42 #ifndef QDECLARATIVEENGINE_P_H
43 #define QDECLARATIVEENGINE_P_H
49 // This file is not part of the Qt API. It exists purely as an
50 // implementation detail. This header file may change from version to
51 // version without notice, or even be removed.
56 #include "qdeclarativeengine.h"
58 #include "private/qdeclarativetypeloader_p.h"
59 #include "private/qdeclarativeimport_p.h"
60 #include "private/qpodvector_p.h"
61 #include "qdeclarative.h"
62 #include "private/qdeclarativevaluetype_p.h"
63 #include "qdeclarativecontext.h"
64 #include "private/qdeclarativecontext_p.h"
65 #include "qdeclarativeexpression.h"
66 #include "qdeclarativeimageprovider.h"
67 #include "private/qdeclarativeproperty_p.h"
68 #include "private/qdeclarativepropertycache_p.h"
69 #include "private/qdeclarativeobjectscriptclass_p.h"
70 #include "private/qdeclarativecontextscriptclass_p.h"
71 #include "private/qdeclarativevaluetypescriptclass_p.h"
72 #include "private/qdeclarativemetatype_p.h"
73 #include "private/qdeclarativedirparser_p.h"
75 #include <QtScript/QScriptClass>
76 #include <QtScript/QScriptValue>
77 #include <QtScript/QScriptString>
78 #include <QtCore/qstring.h>
79 #include <QtCore/qlist.h>
80 #include <QtCore/qpair.h>
81 #include <QtCore/qstack.h>
82 #include <QtCore/qmutex.h>
83 #include <QtScript/qscriptengine.h>
85 #include <private/qobject_p.h>
89 class QDeclarativeContext;
90 class QDeclarativeEngine;
91 class QDeclarativeContextPrivate;
92 class QDeclarativeExpression;
93 class QDeclarativeContextScriptClass;
94 class QDeclarativeImportDatabase;
95 class QDeclarativeObjectScriptClass;
96 class QDeclarativeTypeNameScriptClass;
97 class QDeclarativeValueTypeScriptClass;
99 class QNetworkAccessManager;
100 class QDeclarativeNetworkAccessManagerFactory;
101 class QDeclarativeAbstractBinding;
102 class QScriptDeclarativeClass;
103 class QDeclarativeTypeNameScriptClass;
104 class QDeclarativeTypeNameCache;
105 class QDeclarativeComponentAttached;
106 class QDeclarativeListScriptClass;
107 class QDeclarativeCleanup;
108 class QDeclarativeDelayedError;
109 class QDeclarativeWorkerScriptEngine;
110 class QDeclarativeGlobalScriptClass;
113 class QDeclarativeScriptEngine : public QScriptEngine
116 QDeclarativeScriptEngine(QDeclarativeEnginePrivate *priv);
117 virtual ~QDeclarativeScriptEngine();
119 QUrl resolvedUrl(QScriptContext *context, const QUrl& url); // resolved against p's context, or baseUrl if no p
120 static QScriptValue resolvedUrl(QScriptContext *ctxt, QScriptEngine *engine);
122 static QDeclarativeScriptEngine *get(QScriptEngine* e) { return static_cast<QDeclarativeScriptEngine*>(e); }
124 QDeclarativeEnginePrivate *p;
127 QScriptClass *sqlQueryClass;
128 QString offlineStoragePath;
130 // Used by DOM Core 3 API
131 QScriptClass *namedNodeMapClass;
132 QScriptClass *nodeListClass;
136 virtual QNetworkAccessManager *networkAccessManager();
139 class Q_AUTOTEST_EXPORT QDeclarativeEnginePrivate : public QObjectPrivate
141 Q_DECLARE_PUBLIC(QDeclarativeEngine)
143 QDeclarativeEnginePrivate(QDeclarativeEngine *);
144 ~QDeclarativeEnginePrivate();
148 struct CapturedProperty {
149 CapturedProperty(QObject *o, int c, int n)
150 : object(o), coreIndex(c), notifier(0), notifyIndex(n) {}
151 CapturedProperty(QDeclarativeNotifier *n)
152 : object(0), coreIndex(-1), notifier(n), notifyIndex(-1) {}
156 QDeclarativeNotifier *notifier;
159 bool captureProperties;
160 QPODVector<CapturedProperty> capturedProperties;
162 QDeclarativeContext *rootContext;
165 bool outputWarningsToStdErr;
167 QDeclarativeContextScriptClass *contextClass;
168 QDeclarativeContextData *sharedContext;
169 QObject *sharedScope;
170 QDeclarativeObjectScriptClass *objectClass;
171 QDeclarativeValueTypeScriptClass *valueTypeClass;
172 QDeclarativeTypeNameScriptClass *typeNameClass;
173 QDeclarativeListScriptClass *listClass;
174 // Global script class
175 QDeclarativeGlobalScriptClass *globalClass;
177 // Registered cleanup handlers
178 QDeclarativeCleanup *cleanup;
180 // Bindings that have had errors during startup
181 QDeclarativeDelayedError *erroredBindings;
182 int inProgressCreations;
184 QDeclarativeScriptEngine scriptEngine;
186 QDeclarativeWorkerScriptEngine *getWorkerScriptEngine();
187 QDeclarativeWorkerScriptEngine *workerScriptEngine;
194 : count(0), values(0) {}
196 : count(0), values(new T*[r]) {}
205 T *at(int idx) const {
214 static void clear(SimpleList<QDeclarativeAbstractBinding> &);
215 static void clear(SimpleList<QDeclarativeParserStatus> &);
217 QList<SimpleList<QDeclarativeAbstractBinding> > bindValues;
218 QList<SimpleList<QDeclarativeParserStatus> > parserStatus;
219 QList<QPair<QDeclarativeGuard<QObject>,int> > finalizedParserStatus;
220 QDeclarativeComponentAttached *componentAttached;
222 void registerFinalizedParserStatusObject(QObject *obj, int index) {
223 finalizedParserStatus.append(qMakePair(QDeclarativeGuard<QObject>(obj), index));
228 QNetworkAccessManager *createNetworkAccessManager(QObject *parent) const;
229 QNetworkAccessManager *getNetworkAccessManager() const;
230 mutable QNetworkAccessManager *networkAccessManager;
231 mutable QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory;
233 QHash<QString,QSharedPointer<QDeclarativeImageProvider> > imageProviders;
234 QDeclarativeImageProvider::ImageType getImageProviderType(const QUrl &url);
235 QImage getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
236 QPixmap getPixmapFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
238 mutable QMutex mutex;
240 QDeclarativeTypeLoader typeLoader;
241 QDeclarativeImportDatabase importDatabase;
243 QString offlineStoragePath;
245 mutable quint32 uniqueId;
246 quint32 getUniqueId() const {
250 QDeclarativeValueTypeFactory valueTypes;
252 QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
253 QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
254 inline QDeclarativePropertyCache *cache(QObject *obj);
255 inline QDeclarativePropertyCache *cache(const QMetaObject *);
256 inline QDeclarativePropertyCache *cache(QDeclarativeType *, int, QDeclarativeError &error);
257 QDeclarativePropertyCache *createCache(const QMetaObject *);
258 QDeclarativePropertyCache *createCache(QDeclarativeType *, int, QDeclarativeError &error);
260 void registerCompositeType(QDeclarativeCompiledData *);
263 QObject *toQObject(const QVariant &, bool *ok = 0) const;
264 QDeclarativeMetaType::TypeCategory typeCategory(int) const;
265 bool isList(int) const;
266 int listType(int) const;
267 const QMetaObject *rawMetaObjectForType(int) const;
268 const QMetaObject *metaObjectForType(int) const;
269 QHash<int, int> m_qmlLists;
270 QHash<int, QDeclarativeCompiledData *> m_compositeTypes;
272 QHash<QString, QScriptValue> m_sharedScriptImports;
274 QScriptValue scriptValueFromVariant(const QVariant &);
275 QVariant scriptValueToVariant(const QScriptValue &, int hint = QVariant::Invalid);
278 void warning(const QDeclarativeError &);
279 void warning(const QList<QDeclarativeError> &);
280 static void warning(QDeclarativeEngine *, const QDeclarativeError &);
281 static void warning(QDeclarativeEngine *, const QList<QDeclarativeError> &);
282 static void warning(QDeclarativeEnginePrivate *, const QDeclarativeError &);
283 static void warning(QDeclarativeEnginePrivate *, const QList<QDeclarativeError> &);
285 static QScriptValue qmlScriptObject(QObject*, QDeclarativeEngine*);
287 static QScriptValue createComponent(QScriptContext*, QScriptEngine*);
288 static QScriptValue createQmlObject(QScriptContext*, QScriptEngine*);
289 static QScriptValue isQtObject(QScriptContext*, QScriptEngine*);
290 static QScriptValue vector3d(QScriptContext*, QScriptEngine*);
291 static QScriptValue rgba(QScriptContext*, QScriptEngine*);
292 static QScriptValue hsla(QScriptContext*, QScriptEngine*);
293 static QScriptValue point(QScriptContext*, QScriptEngine*);
294 static QScriptValue size(QScriptContext*, QScriptEngine*);
295 static QScriptValue rect(QScriptContext*, QScriptEngine*);
297 static QScriptValue lighter(QScriptContext*, QScriptEngine*);
298 static QScriptValue darker(QScriptContext*, QScriptEngine*);
299 static QScriptValue tint(QScriptContext*, QScriptEngine*);
301 static QScriptValue desktopOpenUrl(QScriptContext*, QScriptEngine*);
302 static QScriptValue fontFamilies(QScriptContext*, QScriptEngine*);
303 static QScriptValue md5(QScriptContext*, QScriptEngine*);
304 static QScriptValue btoa(QScriptContext*, QScriptEngine*);
305 static QScriptValue atob(QScriptContext*, QScriptEngine*);
306 static QScriptValue consoleLog(QScriptContext*, QScriptEngine*);
307 static QScriptValue quit(QScriptContext*, QScriptEngine*);
309 #ifndef QT_NO_DATESTRING
310 static QScriptValue formatDate(QScriptContext*, QScriptEngine*);
311 static QScriptValue formatTime(QScriptContext*, QScriptEngine*);
312 static QScriptValue formatDateTime(QScriptContext*, QScriptEngine*);
314 static QScriptEngine *getScriptEngine(QDeclarativeEngine *e) { return &e->d_func()->scriptEngine; }
315 static QDeclarativeEngine *getEngine(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p->q_func(); }
316 static QDeclarativeEnginePrivate *get(QDeclarativeEngine *e) { return e->d_func(); }
317 static QDeclarativeEnginePrivate *get(QDeclarativeContext *c) { return (c && c->engine()) ? QDeclarativeEnginePrivate::get(c->engine()) : 0; }
318 static QDeclarativeEnginePrivate *get(QDeclarativeContextData *c) { return (c && c->engine) ? QDeclarativeEnginePrivate::get(c->engine) : 0; }
319 static QDeclarativeEnginePrivate *get(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p; }
320 static QDeclarativeEngine *get(QDeclarativeEnginePrivate *p) { return p->q_func(); }
321 QDeclarativeContextData *getContext(QScriptContext *);
322 QUrl getUrl(QScriptContext *);
324 static QString urlToLocalFileOrQrc(const QUrl& url);
326 static void defineModule();
328 static bool qml_debugging_enabled;
332 Returns a QDeclarativePropertyCache for \a obj if one is available.
334 If \a obj is null, being deleted or contains a dynamic meta object 0
337 The returned cache is not referenced, so if it is to be stored, call addref().
339 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
341 if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
344 const QMetaObject *mo = obj->metaObject();
345 QDeclarativePropertyCache *rv = propertyCache.value(mo);
346 if (!rv) rv = createCache(mo);
351 Returns a QDeclarativePropertyCache for \a metaObject.
353 As the cache is persisted for the life of the engine, \a metaObject must be
354 a static "compile time" meta-object, or a meta-object that is otherwise known to
355 exist for the lifetime of the QDeclarativeEngine.
357 The returned cache is not referenced, so if it is to be stored, call addref().
359 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(const QMetaObject *metaObject)
361 Q_ASSERT(metaObject);
363 QDeclarativePropertyCache *rv = propertyCache.value(metaObject);
364 if (!rv) rv = createCache(metaObject);
369 Returns a QDeclarativePropertyCache for \a type with \a minorVersion.
371 The returned cache is not referenced, so if it is to be stored, call addref().
373 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QDeclarativeType *type, int minorVersion, QDeclarativeError &error)
377 if (minorVersion == -1 || !type->containsRevisionedAttributes())
378 return cache(type->metaObject());
380 QDeclarativePropertyCache *rv = typePropertyCache.value(qMakePair(type, minorVersion));
381 if (!rv) rv = createCache(type, minorVersion, error);
387 #endif // QDECLARATIVEENGINE_P_H