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;
98 class QScriptEngineDebugger;
100 class QNetworkAccessManager;
101 class QDeclarativeNetworkAccessManagerFactory;
102 class QDeclarativeAbstractBinding;
103 class QScriptDeclarativeClass;
104 class QDeclarativeTypeNameScriptClass;
105 class QDeclarativeTypeNameCache;
106 class QDeclarativeComponentAttached;
107 class QDeclarativeListScriptClass;
108 class QDeclarativeCleanup;
109 class QDeclarativeDelayedError;
110 class QDeclarativeWorkerScriptEngine;
111 class QDeclarativeGlobalScriptClass;
114 class QDeclarativeScriptEngine : public QScriptEngine
117 QDeclarativeScriptEngine(QDeclarativeEnginePrivate *priv);
118 virtual ~QDeclarativeScriptEngine();
120 QUrl resolvedUrl(QScriptContext *context, const QUrl& url); // resolved against p's context, or baseUrl if no p
121 static QScriptValue resolvedUrl(QScriptContext *ctxt, QScriptEngine *engine);
123 static QDeclarativeScriptEngine *get(QScriptEngine* e) { return static_cast<QDeclarativeScriptEngine*>(e); }
125 QDeclarativeEnginePrivate *p;
128 QScriptClass *sqlQueryClass;
129 QString offlineStoragePath;
131 // Used by DOM Core 3 API
132 QScriptClass *namedNodeMapClass;
133 QScriptClass *nodeListClass;
137 virtual QNetworkAccessManager *networkAccessManager();
140 class Q_AUTOTEST_EXPORT QDeclarativeEnginePrivate : public QObjectPrivate
142 Q_DECLARE_PUBLIC(QDeclarativeEngine)
144 QDeclarativeEnginePrivate(QDeclarativeEngine *);
145 ~QDeclarativeEnginePrivate();
149 struct CapturedProperty {
150 CapturedProperty(QObject *o, int c, int n)
151 : object(o), coreIndex(c), notifier(0), notifyIndex(n) {}
152 CapturedProperty(QDeclarativeNotifier *n)
153 : object(0), coreIndex(-1), notifier(n), notifyIndex(-1) {}
157 QDeclarativeNotifier *notifier;
160 bool captureProperties;
161 QPODVector<CapturedProperty> capturedProperties;
163 QDeclarativeContext *rootContext;
166 bool outputWarningsToStdErr;
168 QDeclarativeContextScriptClass *contextClass;
169 QDeclarativeContextData *sharedContext;
170 QObject *sharedScope;
171 QDeclarativeObjectScriptClass *objectClass;
172 QDeclarativeValueTypeScriptClass *valueTypeClass;
173 QDeclarativeTypeNameScriptClass *typeNameClass;
174 QDeclarativeListScriptClass *listClass;
175 // Global script class
176 QDeclarativeGlobalScriptClass *globalClass;
178 // Registered cleanup handlers
179 QDeclarativeCleanup *cleanup;
181 // Bindings that have had errors during startup
182 QDeclarativeDelayedError *erroredBindings;
183 int inProgressCreations;
185 QDeclarativeScriptEngine scriptEngine;
187 QDeclarativeWorkerScriptEngine *getWorkerScriptEngine();
188 QDeclarativeWorkerScriptEngine *workerScriptEngine;
195 : count(0), values(0) {}
197 : count(0), values(new T*[r]) {}
206 T *at(int idx) const {
215 static void clear(SimpleList<QDeclarativeAbstractBinding> &);
216 static void clear(SimpleList<QDeclarativeParserStatus> &);
218 QList<SimpleList<QDeclarativeAbstractBinding> > bindValues;
219 QList<SimpleList<QDeclarativeParserStatus> > parserStatus;
220 QList<QPair<QDeclarativeGuard<QObject>,int> > finalizedParserStatus;
221 QDeclarativeComponentAttached *componentAttached;
223 void registerFinalizedParserStatusObject(QObject *obj, int index) {
224 finalizedParserStatus.append(qMakePair(QDeclarativeGuard<QObject>(obj), index));
229 QNetworkAccessManager *createNetworkAccessManager(QObject *parent) const;
230 QNetworkAccessManager *getNetworkAccessManager() const;
231 mutable QNetworkAccessManager *networkAccessManager;
232 mutable QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory;
234 QHash<QString,QSharedPointer<QDeclarativeImageProvider> > imageProviders;
235 QDeclarativeImageProvider::ImageType getImageProviderType(const QUrl &url);
236 QImage getImageFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
237 QPixmap getPixmapFromProvider(const QUrl &url, QSize *size, const QSize& req_size);
239 mutable QMutex mutex;
241 QDeclarativeTypeLoader typeLoader;
242 QDeclarativeImportDatabase importDatabase;
244 QString offlineStoragePath;
246 mutable quint32 uniqueId;
247 quint32 getUniqueId() const {
251 QDeclarativeValueTypeFactory valueTypes;
253 QHash<const QMetaObject *, QDeclarativePropertyCache *> propertyCache;
254 QHash<QPair<QDeclarativeType *, int>, QDeclarativePropertyCache *> typePropertyCache;
255 inline QDeclarativePropertyCache *cache(QObject *obj);
256 inline QDeclarativePropertyCache *cache(const QMetaObject *);
257 inline QDeclarativePropertyCache *cache(QDeclarativeType *, int, QDeclarativeError &error);
258 QDeclarativePropertyCache *createCache(const QMetaObject *);
259 QDeclarativePropertyCache *createCache(QDeclarativeType *, int, QDeclarativeError &error);
261 void registerCompositeType(QDeclarativeCompiledData *);
264 QObject *toQObject(const QVariant &, bool *ok = 0) const;
265 QDeclarativeMetaType::TypeCategory typeCategory(int) const;
266 bool isList(int) const;
267 int listType(int) const;
268 const QMetaObject *rawMetaObjectForType(int) const;
269 const QMetaObject *metaObjectForType(int) const;
270 QHash<int, int> m_qmlLists;
271 QHash<int, QDeclarativeCompiledData *> m_compositeTypes;
273 QHash<QString, QScriptValue> m_sharedScriptImports;
275 QScriptValue scriptValueFromVariant(const QVariant &);
276 QVariant scriptValueToVariant(const QScriptValue &, int hint = QVariant::Invalid);
279 void warning(const QDeclarativeError &);
280 void warning(const QList<QDeclarativeError> &);
281 static void warning(QDeclarativeEngine *, const QDeclarativeError &);
282 static void warning(QDeclarativeEngine *, const QList<QDeclarativeError> &);
283 static void warning(QDeclarativeEnginePrivate *, const QDeclarativeError &);
284 static void warning(QDeclarativeEnginePrivate *, const QList<QDeclarativeError> &);
286 static QScriptValue qmlScriptObject(QObject*, QDeclarativeEngine*);
288 static QScriptValue createComponent(QScriptContext*, QScriptEngine*);
289 static QScriptValue createQmlObject(QScriptContext*, QScriptEngine*);
290 static QScriptValue isQtObject(QScriptContext*, QScriptEngine*);
291 static QScriptValue vector3d(QScriptContext*, QScriptEngine*);
292 static QScriptValue rgba(QScriptContext*, QScriptEngine*);
293 static QScriptValue hsla(QScriptContext*, QScriptEngine*);
294 static QScriptValue point(QScriptContext*, QScriptEngine*);
295 static QScriptValue size(QScriptContext*, QScriptEngine*);
296 static QScriptValue rect(QScriptContext*, QScriptEngine*);
298 static QScriptValue lighter(QScriptContext*, QScriptEngine*);
299 static QScriptValue darker(QScriptContext*, QScriptEngine*);
300 static QScriptValue tint(QScriptContext*, QScriptEngine*);
302 static QScriptValue desktopOpenUrl(QScriptContext*, QScriptEngine*);
303 static QScriptValue fontFamilies(QScriptContext*, QScriptEngine*);
304 static QScriptValue md5(QScriptContext*, QScriptEngine*);
305 static QScriptValue btoa(QScriptContext*, QScriptEngine*);
306 static QScriptValue atob(QScriptContext*, QScriptEngine*);
307 static QScriptValue consoleLog(QScriptContext*, QScriptEngine*);
308 static QScriptValue quit(QScriptContext*, QScriptEngine*);
310 #ifndef QT_NO_DATESTRING
311 static QScriptValue formatDate(QScriptContext*, QScriptEngine*);
312 static QScriptValue formatTime(QScriptContext*, QScriptEngine*);
313 static QScriptValue formatDateTime(QScriptContext*, QScriptEngine*);
315 static QScriptEngine *getScriptEngine(QDeclarativeEngine *e) { return &e->d_func()->scriptEngine; }
316 static QDeclarativeEngine *getEngine(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p->q_func(); }
317 static QDeclarativeEnginePrivate *get(QDeclarativeEngine *e) { return e->d_func(); }
318 static QDeclarativeEnginePrivate *get(QDeclarativeContext *c) { return (c && c->engine()) ? QDeclarativeEnginePrivate::get(c->engine()) : 0; }
319 static QDeclarativeEnginePrivate *get(QDeclarativeContextData *c) { return (c && c->engine) ? QDeclarativeEnginePrivate::get(c->engine) : 0; }
320 static QDeclarativeEnginePrivate *get(QScriptEngine *e) { return static_cast<QDeclarativeScriptEngine*>(e)->p; }
321 static QDeclarativeEngine *get(QDeclarativeEnginePrivate *p) { return p->q_func(); }
322 QDeclarativeContextData *getContext(QScriptContext *);
323 QUrl getUrl(QScriptContext *);
325 static QString urlToLocalFileOrQrc(const QUrl& url);
327 static void defineModule();
329 static bool qml_debugging_enabled;
333 Returns a QDeclarativePropertyCache for \a obj if one is available.
335 If \a obj is null, being deleted or contains a dynamic meta object 0
338 The returned cache is not referenced, so if it is to be stored, call addref().
340 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QObject *obj)
342 if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
345 const QMetaObject *mo = obj->metaObject();
346 QDeclarativePropertyCache *rv = propertyCache.value(mo);
347 if (!rv) rv = createCache(mo);
352 Returns a QDeclarativePropertyCache for \a metaObject.
354 As the cache is persisted for the life of the engine, \a metaObject must be
355 a static "compile time" meta-object, or a meta-object that is otherwise known to
356 exist for the lifetime of the QDeclarativeEngine.
358 The returned cache is not referenced, so if it is to be stored, call addref().
360 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(const QMetaObject *metaObject)
362 Q_ASSERT(metaObject);
364 QDeclarativePropertyCache *rv = propertyCache.value(metaObject);
365 if (!rv) rv = createCache(metaObject);
370 Returns a QDeclarativePropertyCache for \a type with \a minorVersion.
372 The returned cache is not referenced, so if it is to be stored, call addref().
374 QDeclarativePropertyCache *QDeclarativeEnginePrivate::cache(QDeclarativeType *type, int minorVersion, QDeclarativeError &error)
378 if (minorVersion == -1 || !type->containsRevisionedAttributes())
379 return cache(type->metaObject());
381 QDeclarativePropertyCache *rv = typePropertyCache.value(qMakePair(type, minorVersion));
382 if (!rv) rv = createCache(type, minorVersion, error);
388 #endif // QDECLARATIVEENGINE_P_H