6#include <private/qqmlcomponent_p.h>
7#include <private/qqmldebugconnector_p.h>
8#include <private/qqmldebugserviceinterfaces_p.h>
9#include <private/qqmldelayedcallqueue_p.h>
10#include <private/qqmlengine_p.h>
11#include <private/qqmlloggingcategorybase_p.h>
12#include <private/qqmlplatform_p.h>
13#include <private/qqmlstringconverters_p.h>
15#include <private/qv4dateobject_p.h>
16#include <private/qv4domerrors_p.h>
17#include <private/qv4engine_p.h>
18#include <private/qv4functionobject_p.h>
19#include <private/qv4include_p.h>
20#include <private/qv4mm_p.h>
21#include <private/qv4qobjectwrapper_p.h>
22#include <private/qv4sequenceobject_p.h>
23#include <private/qv4stackframe_p.h>
25#include <QtQml/qqmlfile.h>
27#include <QtCore/qcoreapplication.h>
28#include <QtCore/qcryptographichash.h>
29#include <QtCore/qdatetime.h>
30#include <QtCore/qfileinfo.h>
31#include <QtCore/qloggingcategory.h>
32#include <QtCore/qpoint.h>
33#include <QtCore/qrect.h>
34#include <QtCore/qsize.h>
35#include <QtCore/qstring.h>
36#include <QtCore/qurl.h>
40Q_STATIC_LOGGING_CATEGORY(lcRootProperties,
"qt.qml.rootObjectProperties");
46#define THROW_TYPE_ERROR_WITH_MESSAGE(msg)
48 return scope.engine->throwTypeError(QString::fromUtf8(msg));
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
208
209
210
211
212
213
214
215
216
219
220
221
222
223
224
225
226
227
228
229
230
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
266QtObject::QtObject(ExecutionEngine *engine)
269#if QT_CONFIG(translation)
270 connect(m_engine->jsEngine(), &QJSEngine::uiLanguageChanged,
271 this, &QtObject::uiLanguageChanged);
275QtObject::Contexts QtObject::getContexts()
const
277 QQmlEngine *engine = qmlEngine();
281 QQmlRefPointer<QQmlContextData> context = v4Engine()->callingQmlContext();
283 context = QQmlContextData::get(QQmlEnginePrivate::get(engine)->rootContext);
286 QQmlRefPointer<QQmlContextData> effectiveContext
287 = context->isPragmaLibraryContext() ?
nullptr : context;
288 return {context, effectiveContext};
291QtObject *QtObject::create(QQmlEngine *, QJSEngine *jsEngine)
293 QV4::ExecutionEngine *v4 = jsEngine->handle();
294 QV4::Scope scope(v4);
295 ScopedObject globalObject(scope, v4->globalObject);
296 ScopedString qtName(scope, v4->newString(QStringLiteral(
"Qt")));
297 QV4::ScopedValue result(scope, globalObject->get(qtName->toPropertyKey()));
298 return qobject_cast<QtObject *>(result->as<QV4::QObjectWrapper>()->object());
301QJSValue QtObject::include(
const QString &url,
const QJSValue &callback)
const
303 return QV4Include::method_include(v4Engine(), v4Engine()->resolvedUrl(url), callback);
308
309
310
311
312
313bool QtObject::isQtObject(
const QJSValue &value)
const
315 return qjsvalue_cast<QObject *>(value) !=
nullptr;
319
320
321
322
323
324QVariant QtObject::color(
const QString &name)
const
327 const QVariant v = QQmlStringConverters::colorFromString(name, &ok);
331 v4Engine()->throwError(QStringLiteral(
"\"%1\" is not a valid color name").arg(name));
332 return QVariant::fromValue(
nullptr);
336
337
338
339
340
341QVariant QtObject::rgba(
double r,
double g,
double b,
double a)
const
343 r = qBound(0.0, r, 1.0);
344 g = qBound(0.0, g, 1.0);
345 b = qBound(0.0, b, 1.0);
346 a = qBound(0.0, a, 1.0);
348 return QQml_colorProvider()->fromRgbF(r, g, b, a);
352
353
354
355
356
357QVariant QtObject::hsla(
double h,
double s,
double l,
double a)
const
360 h = qBound(0.0, h, 1.0);
361 s = qBound(0.0, s, 1.0);
362 l = qBound(0.0, l, 1.0);
363 a = qBound(0.0, a, 1.0);
365 return QQml_colorProvider()->fromHslF(h, s, l, a);
369
370
371
372
373
374
375
376QVariant QtObject::hsva(
double h,
double s,
double v,
double a)
const
379 h = qBound(0.0, h, 1.0);
380 s = qBound(0.0, s, 1.0);
381 v = qBound(0.0, v, 1.0);
382 a = qBound(0.0, a, 1.0);
384 return QQml_colorProvider()->fromHsvF(h, s, v, a);
388
389
390
391
392
393
394
395bool QtObject::colorEqual(
const QVariant &lhs,
const QVariant &rhs)
const
399 QVariant color1 = lhs;
400 if (color1.userType() == QMetaType::QString) {
401 color1 = QQmlStringConverters::colorFromString(color1.toString(), &ok);
403 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid color name"));
406 }
else if (color1.userType() != QMetaType::QColor) {
407 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid arguments"));
411 QVariant color2 = rhs;
412 if (color2.userType() == QMetaType::QString) {
413 color2 = QQmlStringConverters::colorFromString(color2.toString(), &ok);
415 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid color name"));
418 }
else if (color2.userType() != QMetaType::QColor) {
419 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid arguments"));
423 return color1 == color2;
427
428
429
430
431QRectF QtObject::rect(
double x,
double y,
double width,
double height)
const
433 return QRectF(x, y, width, height);
437
438
439
440
441QPointF QtObject::point(
double x,
double y)
const
443 return QPointF(x, y);
447
448
449
450
451QSizeF QtObject::size(
double w,
double h)
const
457
458
459
460
461
462
463
464
465QVariant QtObject::font(
const QJSValue &fontSpecifier)
const
467 if (!fontSpecifier.isObject()) {
468 v4Engine()->throwError(QStringLiteral(
"Qt.font(): Invalid arguments"));
473 const QVariant v = QQmlValueTypeProvider::createValueType(
474 fontSpecifier, QMetaType(QMetaType::QFont));
479 v4Engine()->throwError(QStringLiteral(
"Qt.font(): Invalid argument: "
480 "no valid font subproperties specified"));
487 result.setProperty(i, e->toScriptValue(parameter));
491void addParameters<
double>(QJSEngine *, QJSValue &result,
int i,
double parameter)
493 result.setProperty(i, QJSValue(parameter));
496template<
typename T,
typename ...Others>
497void addParameters(QJSEngine *e, QJSValue &result,
int i, T parameter, Others... others)
499 addParameters<T>(e, result, i, parameter);
500 addParameters<Others...>(e, result, ++i, others...);
503template<
typename ...T>
508 QJSValue params = e->newArray(
sizeof...(parameters));
509 addParameters(e, params, 0, parameters...);
510 const QVariant variant = QQmlValueTypeProvider::createValueType(params, type);
511 return variant.isValid() ? variant : QVariant(type);
515
516
517
518
519QVariant QtObject::vector2d(
double x,
double y)
const
521 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector2D), x, y);
525
526
527
528
529QVariant QtObject::vector3d(
double x,
double y,
double z)
const
531 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector3D), x, y, z);
535
536
537
538
539QVariant QtObject::vector4d(
double x,
double y,
double z,
double w)
const
541 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector4D), x, y, z, w);
545
546
547
548
549QVariant QtObject::quaternion(
double scalar,
double x,
double y,
double z)
const
551 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QQuaternion), scalar, x, y, z);
555
556
557
558
559QVariant QtObject::matrix4x4()
const
561 const QMetaType metaType(QMetaType::QMatrix4x4);
562 const QVariant variant = QQmlValueTypeProvider::createValueType(QJSValue(), metaType);
563 return variant.isValid() ? variant : QVariant(metaType);
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581QVariant QtObject::matrix4x4(
const QJSValue &value)
const
583 if (value.isObject()) {
584 QVariant v = QQmlValueTypeProvider::createValueType(
585 value, QMetaType(QMetaType::QMatrix4x4));
590 v4Engine()->throwError(QStringLiteral(
"Qt.matrix4x4(): Invalid argument: "
591 "not a valid matrix4x4 values array"));
596
597
598
599
600
601
602
603
604
605
606
607
608
609QVariant QtObject::matrix4x4(
double m11,
double m12,
double m13,
double m14,
610 double m21,
double m22,
double m23,
double m24,
611 double m31,
double m32,
double m33,
double m34,
612 double m41,
double m42,
double m43,
double m44)
const
614 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QMatrix4x4),
615 m11, m12, m13, m14, m21, m22, m23, m24,
616 m31, m32, m33, m34, m41, m42, m43, m44);
622 if (color.isString()) {
623 v = QQmlStringConverters::colorFromString(color.toString(), ok);
625 return QVariant::fromValue(
nullptr);
627 v = color.toVariant();
628 if (v.userType() != QMetaType::QColor) {
630 return QVariant::fromValue(
nullptr);
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653QVariant QtObject::lighter(
const QJSValue &color,
double factor)
const
656 const QVariant v = colorVariantFromJSValue(color, &ok);
657 return ok ? QQml_colorProvider()->lighter(v, factor) : v;
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676QVariant QtObject::darker(
const QJSValue &color,
double factor)
const
679 const QVariant v = colorVariantFromJSValue(color, &ok);
680 return ok ? QQml_colorProvider()->darker(v, factor) : v;
684
685
686
687
688
689
690QVariant QtObject::alpha(
const QJSValue &baseColor,
double value)
const
693 const QVariant v = colorVariantFromJSValue(baseColor, &ok);
694 return ok ? QQml_colorProvider()->alpha(v, value) : v;
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724QVariant QtObject::tint(
const QJSValue &baseColor,
const QJSValue &tintColor)
const
729 const QVariant v1 = colorVariantFromJSValue(baseColor, &ok);
734 const QVariant v2 = colorVariantFromJSValue(tintColor, &ok);
736 return ok ? QQml_colorProvider()->tint(v1, v2) : v2;
741QString formatDateTimeObjectUsingDateFormat(T formatThis, Qt::DateFormat format) {
745 case Qt::RFC2822Date:
746 case Qt::ISODateWithMs:
747 return formatThis.toString(format);
758 return dateTime.toLocalTime().time();
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
780 const QDate date = QDate::fromString(string, Qt::ISODate);
787 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
788 if (dateTime.isValid()) {
789 qCWarning(lcRootProperties())
790 << string <<
"is a date/time string being passed to formatDate()."
791 <<
"You should only pass date strings to formatDate().";
792 return dateTime.date();
798 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
799 if (dateTime.isValid())
800 return DateObject::dateTimeToDate(dateTime);
803 engine->throwError(QStringLiteral(
"Invalid argument passed to formatDate(): %1").arg(string));
807QString QtObject::formatDate(QDate date,
const QString &format)
const
809 return date.toString(format);
812QString QtObject::formatDate(QDate date, Qt::DateFormat format)
const
814 return formatDateTimeObjectUsingDateFormat(date, format);
817QString QtObject::formatDate(
const QDateTime &dateTime,
const QString &format)
const
819 return DateObject::dateTimeToDate(dateTime).toString(format);
822QString QtObject::formatDate(
const QString &string,
const QString &format)
const
824 if (
const auto qDate = dateFromString(string, v4Engine()))
825 return formatDate(qDate.value(), format);
830QString QtObject::formatDate(
const QDateTime &dateTime, Qt::DateFormat format)
const
832 return formatDateTimeObjectUsingDateFormat(DateObject::dateTimeToDate(dateTime), format);
835QString QtObject::formatDate(
const QString &string, Qt::DateFormat format)
const
837 if (
const auto qDate = dateFromString(string, v4Engine()))
838 return formatDate(qDate.value(), format);
843#if QT_CONFIG(qml_locale)
844QString QtObject::formatDate(QDate date,
const QLocale &locale,
845 QLocale::FormatType formatType)
const
847 return locale.toString(date, formatType);
850QString QtObject::formatDate(
const QDateTime &dateTime,
const QLocale &locale,
851 QLocale::FormatType formatType)
const
853 return locale.toString(DateObject::dateTimeToDate(dateTime), formatType);
856QString QtObject::formatDate(
const QString &string,
const QLocale &locale,
857 QLocale::FormatType formatType)
const
859 if (
const auto qDate = dateFromString(string, v4Engine()))
860 return locale.toString(qDate.value(), formatType);
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
885 const QTime time = QTime::fromString(string, Qt::ISODate);
892 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
893 if (dateTime.isValid()) {
894 qCWarning(lcRootProperties())
895 << string <<
"is a date/time string being passed to formatTime()."
896 <<
"You should only pass time strings to formatTime().";
897 return dateTime.time();
903 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
904 if (dateTime.isValid())
905 return dateTimeToTime(dateTime);
908 engine->throwError(QStringLiteral(
"Invalid argument passed to formatTime(): %1").arg(string));
912QString QtObject::formatTime(QTime time,
const QString &format)
const
914 return time.toString(format);
917QString QtObject::formatTime(
const QDateTime &dateTime,
const QString &format)
const
919 return dateTimeToTime(dateTime).toString(format);
922QString QtObject::formatTime(
const QString &time,
const QString &format)
const
925 if (
auto qTime = timeFromString(time, v4Engine()))
926 return formatTime(qTime.value(), format);
931QString QtObject::formatTime(QTime time, Qt::DateFormat format)
const
933 return formatDateTimeObjectUsingDateFormat(time, format);
936QString QtObject::formatTime(
const QDateTime &dateTime, Qt::DateFormat format)
const
938 return formatDateTimeObjectUsingDateFormat(dateTimeToTime(dateTime), format);
941QString QtObject::formatTime(
const QString &time, Qt::DateFormat format)
const
943 if (
auto qTime = timeFromString(time, v4Engine()))
944 return formatTime(qTime.value(), format);
949#if QT_CONFIG(qml_locale)
950QString QtObject::formatTime(QTime time,
const QLocale &locale,
951 QLocale::FormatType formatType)
const
953 return locale.toString(time, formatType);
956QString QtObject::formatTime(
const QDateTime &dateTime,
const QLocale &locale,
957 QLocale::FormatType formatType)
const
959 return locale.toString(dateTimeToTime(dateTime), formatType);
962QString QtObject::formatTime(
const QString &time,
const QLocale &locale,
963 QLocale::FormatType formatType)
const
965 if (
auto qTime = timeFromString(time, v4Engine()))
966 return locale.toString(qTime.value(), formatType);
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1073 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
1074 if (dateTime.isValid())
1080 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
1081 if (dateTime.isValid())
1085 engine->throwError(QStringLiteral(
"Invalid argument passed to formatDateTime(): %1").arg(string));
1086 return std::nullopt;
1089QString QtObject::formatDateTime(
const QDateTime &dateTime,
const QString &format)
const
1091 return dateTime.toString(format);
1094QString QtObject::formatDateTime(
const QString &string,
const QString &format)
const
1097 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1098 return formatDateTime(qDateTime.value(), format);
1103QString QtObject::formatDateTime(
const QDateTime &dateTime, Qt::DateFormat format)
const
1105 return formatDateTimeObjectUsingDateFormat(dateTime, format);
1108QString QtObject::formatDateTime(
const QString &string, Qt::DateFormat format)
const
1111 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1112 return formatDateTime(qDateTime.value(), format);
1117#if QT_CONFIG(qml_locale)
1118QString QtObject::formatDateTime(
const QDateTime &dateTime,
const QLocale &locale,
1119 QLocale::FormatType formatType)
const
1121 return locale.toString(dateTime, formatType);
1124QString QtObject::formatDateTime(
const QString &string,
const QLocale &locale,
1125 QLocale::FormatType formatType)
const
1128 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1129 return formatDateTime(qDateTime.value(), locale, formatType);
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146bool QtObject::openUrlExternally(
const QUrl &url)
const
1148 return QQml_guiProvider()->openUrlExternally(resolvedUrl(url));
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161QUrl QtObject::url(
const QUrl &url)
const
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177QUrl QtObject::resolvedUrl(
const QUrl &url)
const
1179 if (QQmlRefPointer<QQmlContextData> ctxt = v4Engine()->callingQmlContext())
1180 return ctxt->resolvedUrl(url);
1181 if (QQmlEngine *engine = qmlEngine())
1182 return engine->baseUrl().resolved(url);
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196QUrl QtObject::resolvedUrl(
const QUrl &url, QObject *context)
const
1199 QQmlData *data = QQmlData::get(context);
1200 if (data && data->outerContext)
1201 return data->outerContext->resolvedUrl(url);
1204 if (QQmlEngine *engine = qmlEngine())
1205 return engine->baseUrl().resolved(url);
1210
1211
1212
1213
1214QStringList QtObject::fontFamilies()
const
1216 return QQml_guiProvider()->fontFamilies();
1220
1221
1222
1223QString QtObject::md5(
const QString &data)
const
1225 return QLatin1String(QCryptographicHash::hash(data.toUtf8(), QCryptographicHash::Md5).toHex());
1229
1230
1231
1232
1233
1234QString QtObject::btoa(
const QString &data)
const
1236 qWarning(
"Qt.btoa(string): This method is deprecated. "
1237 "Its output differs from the common Web API. "
1238 "Use the overloads that take array-likes.");
1239 return QLatin1String(data.toUtf8().toBase64());
1243
1244
1245
1246
1247
1248
1249QString QtObject::atob(
const QString &data)
const
1251 qWarning(
"Qt.atob(string): This method is deprecated. "
1252 "Its output differs from the common Web API. "
1253 "Use the overloads that take array-likes.");
1254 return QString::fromUtf8(QByteArray::fromBase64(data.toLatin1()));
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274QByteArray QtObject::btoa(
const QByteArray &data)
const
1276 return data.toBase64();
1281 QV4::Scope scope(engine);
1282 THROW_DOM(DOMEXCEPTION_INVALID_CHARACTER_ERR,
"Invalid character");
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302QByteArray QtObject::atob(
const QByteArray &data)
const
1305 = QByteArray::fromBase64Encoding(data, QByteArray::AbortOnBase64DecodingErrors);
1306 if (result.decodingStatus == QByteArray::Base64DecodingStatus::Ok)
1307 return result.decoded;
1309 throwInvalidCharacter(v4Engine());
1310 return QByteArray();
1315 const auto fail = [&]() {
1316 throwInvalidCharacter(engine);
1317 return QByteArray();
1322 const auto append = [&](
auto value) {
1323 if (value < 0 || value >= 256)
1325 result.append(
char(value));
1329 for (
const QVariant &entry : data) {
1330 switch (entry.typeId()) {
1331 case QMetaType::Char:
1332 result.append(*
static_cast<
const char *>(entry.constData()));
1334 case QMetaType::Int: {
1335 if (!append(*
static_cast<
const int *>(entry.constData())))
1339 case QMetaType::Double: {
1340 if (!append(*
static_cast<
const double *>(entry.constData())))
1344 case QMetaType::QString: {
1345 const QString *string =
static_cast<
const QString *>(entry.constData());
1346 if (string->length() != 1)
1348 if (!append(string->at(0).unicode()))
1361
1362
1363
1364
1365
1366
1367QByteArray QtObject::btoa(
const QVariantList &data)
const
1369 return btoa(convertVariantList(data, v4Engine()));
1373
1374
1375
1376
1377
1378
1379QByteArray QtObject::atob(
const QVariantList &data)
const
1381 return atob(convertVariantList(data, v4Engine()));
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395void QtObject::quit()
const
1397 if (QQmlEngine *engine = qmlEngine())
1398 QQmlEnginePrivate::get(engine)->sendQuit();
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413void QtObject::exit(
int retCode)
const
1415 if (QQmlEngine *engine = qmlEngine())
1416 QQmlEnginePrivate::get(engine)->sendExit(retCode);
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454QObject *QtObject::createQmlObject(
const QString &qml, QObject *parent,
const QUrl &url)
const
1456 QQmlEngine *engine = qmlEngine();
1458 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): "
1459 "Can only be called on a QML engine."));
1464 static ReturnedValue create(QV4::ExecutionEngine *v4,
const QList<QQmlError> &errors) {
1468 errorstr += QLatin1String(
"Qt.createQmlObject(): failed to create object: ");
1470 QV4::ScopedArrayObject qmlerrors(scope, v4->newArrayObject());
1471 QV4::ScopedObject qmlerror(scope);
1472 QV4::ScopedString s(scope);
1473 QV4::ScopedValue v(scope);
1474 for (
int ii = 0; ii < errors.size(); ++ii) {
1475 const QQmlError &error = errors.at(ii);
1476 errorstr += QLatin1String(
"\n ") + error.toString();
1477 qmlerror = v4->newObject();
1478 qmlerror->put((s = v4->newString(QStringLiteral(
"lineNumber"))), (v = QV4::Value::fromInt32(error.line())));
1479 qmlerror->put((s = v4->newString(QStringLiteral(
"columnNumber"))), (v = QV4::Value::fromInt32(error.column())));
1480 qmlerror->put((s = v4->newString(QStringLiteral(
"fileName"))), (v = v4->newString(error.url().toString())));
1481 qmlerror->put((s = v4->newString(QStringLiteral(
"message"))), (v = v4->newString(error.description())));
1482 qmlerrors->put(ii, qmlerror);
1485 v = v4->newString(errorstr);
1486 ScopedObject errorObject(scope, v4->newErrorObject(v));
1487 errorObject->put((s = v4->newString(QStringLiteral(
"qmlErrors"))), qmlerrors);
1488 return errorObject.asReturnedValue();
1492 QQmlRefPointer<QQmlContextData> context = v4Engine()->callingQmlContext();
1494 context = QQmlContextData::get(QQmlEnginePrivate::get(engine)->rootContext);
1497 QQmlContext *effectiveContext =
nullptr;
1498 if (context->isPragmaLibraryContext())
1499 effectiveContext = engine->rootContext();
1501 effectiveContext = context->asQQmlContext();
1502 Q_ASSERT(effectiveContext);
1507 QUrl resolvedUrl = url;
1508 if (url.isValid() && url.isRelative())
1509 resolvedUrl = context->resolvedUrl(url);
1512 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Missing parent object"));
1516 QQmlRefPointer<QQmlTypeData> typeData = v4Engine()->typeLoader()->getType(
1517 qml.toUtf8(), resolvedUrl, QQmlTypeLoader::Synchronous);
1519 if (!typeData->isCompleteOrError()) {
1520 v4Engine()->throwError(
1521 QStringLiteral(
"Qt.createQmlObject(): Failed to force synchronous loading "
1522 "of asynchronous URL '%1'").arg(resolvedUrl.toString()));
1526 QQmlComponent component(engine);
1527 QQmlComponentPrivate *componentPrivate = QQmlComponentPrivate::get(&component);
1528 componentPrivate->fromTypeData(typeData);
1529 componentPrivate->setProgress(1.0);
1531 Scope scope(v4Engine());
1532 if (component.isError()) {
1533 ScopedValue v(scope, Error::create(scope.engine, component.errors()));
1534 scope.engine->throwError(v);
1538 if (!component.isReady()) {
1539 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Component is not ready"));
1543 if (!effectiveContext->isValid()) {
1544 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Cannot create a component "
1545 "in an invalid context"));
1549 QObject *obj = component.beginCreate(effectiveContext);
1551 QQmlData::get(obj,
true)->explicitIndestructibleSet =
false;
1552 QQmlData::get(obj)->indestructible =
false;
1554 obj->setParent(parent);
1556 QList<QQmlPrivate::AutoParentFunction> functions = QQmlMetaType::parentFunctions();
1557 for (
int ii = 0; ii < functions.size(); ++ii) {
1558 if (QQmlPrivate::Parented == functions.at(ii)(obj, parent))
1562 component.completeCreate();
1564 if (component.isError()) {
1565 ScopedValue v(scope, Error::create(scope.engine, component.errors()));
1566 scope.engine->throwError(v);
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1645QQmlComponent *QtObject::createComponent(
const QUrl &url, QObject *parent)
const
1647 return createComponent(url, QQmlComponent::PreferSynchronous, parent);
1653 engine->throwError(QStringLiteral(
"Invalid compilation mode %1").arg(
int(mode)));
1657QQmlComponent *QtObject::createComponent(
const QUrl &url, QQmlComponent::CompilationMode mode,
1658 QObject *parent)
const
1660 if (mode != QQmlComponent::Asynchronous && mode != QQmlComponent::PreferSynchronous) {
1661 throw_invalid_compilation_mode(v4Engine(), mode);
1668 QQmlEngine *engine = qmlEngine();
1672 auto [context, effectiveContext] = getContexts();
1676 QQmlComponent *c =
new QQmlComponent(engine, context->resolvedUrl(url), mode, parent);
1677 QQmlComponentPrivate::get(c)->setCreationContext(std::move(effectiveContext));
1678 QQmlData::get(c,
true)->explicitIndestructibleSet =
false;
1679 QQmlData::get(c)->indestructible =
false;
1683QQmlComponent *QtObject::createComponent(
const QString &moduleUri,
const QString &typeName,
1684 QObject *parent)
const
1686 return createComponent(moduleUri, typeName, QQmlComponent::PreferSynchronous, parent);
1689QQmlComponent *QtObject::createComponent(
const QString &moduleUri,
const QString &typeName, QQmlComponent::CompilationMode mode, QObject *parent)
const
1691 if (mode != QQmlComponent::Asynchronous && mode != QQmlComponent::PreferSynchronous) {
1692 throw_invalid_compilation_mode(v4Engine(), mode);
1696 QQmlEngine *engine = qmlEngine();
1700 if (moduleUri.isEmpty() || typeName.isEmpty())
1703 auto [context, effectiveContext] = getContexts();
1707 QQmlComponent *c =
new QQmlComponent(engine, moduleUri, typeName, mode, parent);
1708 if (c->isError() && !parent && moduleUri.endsWith(u".qml")) {
1709 v4Engine()->throwTypeError(
1710 QStringLiteral(
"Invalid arguments; did you swap mode and parent"));
1712 QQmlComponentPrivate::get(c)->setCreationContext(std::move(effectiveContext));
1713 QQmlData::get(c,
true)->explicitIndestructibleSet =
false;
1714 QQmlData::get(c)->indestructible =
false;
1718#if QT_CONFIG(translation)
1719QString QtObject::uiLanguage()
const
1721 if (
const QJSEngine *e = jsEngine())
1722 return e->uiLanguage();
1726void QtObject::setUiLanguage(
const QString &uiLanguage)
1728 if (QJSEngine *e = jsEngine())
1729 e->setUiLanguage(uiLanguage);
1732QBindable<QString> QtObject::uiLanguageBindable()
1734 if (QJSEngine *e = jsEngine())
1735 return QBindable<QString>(&QJSEnginePrivate::get(e)->uiLanguage);
1736 return QBindable<QString>();
1740#if QT_CONFIG(qml_locale)
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761QLocale QtObject::locale()
const
1766QLocale QtObject::locale(
const QString &name)
const
1768 return QLocale(name);
1772void Heap::QQmlBindingFunction::init(
const QV4::JavaScriptFunctionObject *bindingFunction)
1774 Scope scope(bindingFunction->engine());
1775 ScopedContext context(scope, bindingFunction->scope());
1776 JavaScriptFunctionObject::init(context, bindingFunction->function());
1777 this->bindingFunction.set(internalClass->engine, bindingFunction->d());
1781 const FunctionObject *f,
const Value *,
const Value *,
int)
1784 return f->engine()->throwTypeError(QStringLiteral(
"Bindings must not be called directly."));
1789 QV4::CppStackFrame *frame = engine()->currentStackFrame;
1790 if (frame->v4Function)
1791 return QQmlSourceLocation(frame->source(), frame->lineNumber(), 0);
1793 return bindingFunction()->function->sourceLocation();
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839QJSValue QtObject::binding(
const QJSValue &function)
const
1841 const QV4::JavaScriptFunctionObject *f
1842 = QJSValuePrivate::asManagedType<JavaScriptFunctionObject>(&function);
1843 QV4::ExecutionEngine *e = v4Engine();
1845 return QJSValuePrivate::fromReturnedValue(
1848 "binding(): argument (binding expression) must be a function")));
1851 return QJSValuePrivate::fromReturnedValue(
1852 Encode(e->memoryManager->allocate<QQmlBindingFunction>(f)));
1855void QtObject::callLater(QQmlV4FunctionPtr args)
1857 m_engine->delayedCallQueue()->addUniquelyAndExecuteLater(m_engine, args);
1861
1862
1863
1864
1865
1866
1867double QtObject::enumStringToValue(
const QJSManagedValue &enumType,
const QString &string)
1869 return retrieveFromEnum<
double>(
1871 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1872 return type.scopedEnumValue(typeLoader, enumIndex, string, ok);
1873 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1874 return type.unscopedEnumValue(typeLoader, enumIndex, string, ok);
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890QString QtObject::enumValueToString(
const QJSManagedValue &enumType,
double value)
1893 if (std::isnan(value)) {
1894 m_engine->throwReferenceError(
"Invalid second argument, entry"_L1);
1898 return retrieveFromEnum<QString>(
1900 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1901 return type.scopedEnumKey(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1902 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1903 return type.unscopedEnumKey(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1908
1909
1910
1911
1912
1913
1914
1915QStringList QtObject::enumValueToStrings(
const QJSManagedValue &enumType,
double value)
1918 if (std::isnan(value)) {
1919 m_engine->throwReferenceError(
"Invalid second argument, entry"_L1);
1923 return retrieveFromEnum<QStringList>(
1925 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1926 return type.scopedEnumKeys(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1927 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1928 return type.unscopedEnumKeys(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1932QQmlPlatform *QtObject::platform()
1935 m_platform =
new QQmlPlatform(
this);
1939QQmlApplication *QtObject::application()
1943 m_application = QQml_guiProvider()->application(
this);
1945 return m_application;
1948QObject *QtObject::inputMethod()
const
1950 return QQml_guiProvider()->inputMethod();
1953QObject *QtObject::styleHints()
const
1955 return QQml_guiProvider()->styleHints();
1961 QV4::Scope scope(internalClass->engine);
1962 QV4::ScopedObject o(scope,
this);
1964 o->defineDefaultProperty(QStringLiteral(
"debug"), QV4::ConsoleObject::method_log);
1965 o->defineDefaultProperty(QStringLiteral(
"log"), QV4::ConsoleObject::method_log);
1966 o->defineDefaultProperty(QStringLiteral(
"info"), QV4::ConsoleObject::method_info);
1967 o->defineDefaultProperty(QStringLiteral(
"warn"), QV4::ConsoleObject::method_warn);
1968 o->defineDefaultProperty(QStringLiteral(
"error"), QV4::ConsoleObject::method_error);
1969 o->defineDefaultProperty(QStringLiteral(
"assert"), QV4::ConsoleObject::method_assert);
1971 o->defineDefaultProperty(QStringLiteral(
"count"), QV4::ConsoleObject::method_count);
1972 o->defineDefaultProperty(QStringLiteral(
"profile"), QV4::ConsoleObject::method_profile);
1973 o->defineDefaultProperty(QStringLiteral(
"profileEnd"), QV4::ConsoleObject::method_profileEnd);
1974 o->defineDefaultProperty(QStringLiteral(
"time"), QV4::ConsoleObject::method_time);
1975 o->defineDefaultProperty(QStringLiteral(
"timeEnd"), QV4::ConsoleObject::method_timeEnd);
1976 o->defineDefaultProperty(QStringLiteral(
"trace"), QV4::ConsoleObject::method_trace);
1977 o->defineDefaultProperty(QStringLiteral(
"exception"), QV4::ConsoleObject::method_exception);
1992 for (CppStackFrame *f = engine->currentStackFrame; f && i < 10; f = f->parentFrame(), ++i) {
1995 if (f->isJSTypesFrame() &&
static_cast<JSTypesStackFrame *>(f)->isTailCalling()) {
1996 stackFrame = QStringLiteral(
"[elided tail calls]");
1998 const int line = f->lineNumber();
1999 if (line != f->missingLineNumber()) {
2000 stackFrame = QStringLiteral(
"%1 (%2:%3)").arg(
2001 f->function(), f->source(), QString::number(qAbs(line)));
2003 stackFrame = QStringLiteral(
"%1 (%2)").arg(
2004 f->function(), f->source());
2009 stack += QLatin1Char(
'\n');
2010 stack += stackFrame;
2017 ScopedValue val(scope);
2019 alreadySeen.insert(array->d());
2021 ScopedObject detached(scope);
2022 if (Sequence *reference = array->as<Sequence>())
2023 detached = ReferenceObject::detached(reference->d());
2027 result += QLatin1Char(
'[');
2028 const uint length = detached->getLength();
2029 for (uint i = 0; i < length; ++i) {
2031 result += QLatin1Char(
',');
2032 val = detached->get(i);
2033 if (val->isManaged() && val->managed()->isArrayLike())
2034 if (!alreadySeen.contains(val->objectValue()->d()))
2035 result += serializeArray(val->objectValue(), v4, alreadySeen);
2037 result += QLatin1String(
"[Circular]");
2039 result += val->toQStringNoThrow();
2041 result += QLatin1Char(
']');
2043 alreadySeen.remove(array->d());
2050 const QLoggingCategory *loggingCategory =
nullptr;
2052 QV4::Scope scope(b);
2053 QV4::ExecutionEngine *v4 = scope.engine;
2057 if (
const QObjectWrapper* wrapper = argv[0].as<QObjectWrapper>()) {
2058 if (QQmlLoggingCategoryBase *category
2059 = qobject_cast<QQmlLoggingCategoryBase *>(wrapper->object())) {
2060 if (category->category())
2061 loggingCategory = category->category();
2063 THROW_GENERIC_ERROR(
"A QmlLoggingCatgory was provided without a valid name");
2070 for (
int i = start, ei = argc; i < ei; ++i) {
2072 result.append(QLatin1Char(
' '));
2074 QSet<QV4::Heap::Object *> alreadySeenElements;
2075 if (argv[i].isManaged() && argv[i].managed()->isArrayLike())
2076 result.append(serializeArray(argv[i].objectValue(), v4, alreadySeenElements));
2078 result.append(argv[i].toQStringNoThrow());
2082 result += QLatin1Char(
'\n') + jsStack(v4);
2084 if (!loggingCategory)
2085 loggingCategory = v4->qmlEngine() ? &lcQml() : &lcJs();
2086 QV4::CppStackFrame *frame = v4->currentStackFrame;
2087 const QByteArray baSource = frame ? frame->source().toUtf8() : QByteArray();
2088 const QByteArray baFunction = frame ? frame->function().toUtf8() : QByteArray();
2089 QMessageLogger logger(baSource.constData(), frame ? frame->lineNumber() : 0,
2090 baFunction.constData(), loggingCategory->categoryName());
2094 if (loggingCategory->isDebugEnabled())
2095 logger.debug(
"%s", result.toUtf8().constData());
2098 if (loggingCategory->isInfoEnabled())
2099 logger.info(
"%s", result.toUtf8().constData());
2102 if (loggingCategory->isWarningEnabled())
2103 logger.warning(
"%s", result.toUtf8().constData());
2106 if (loggingCategory->isCriticalEnabled())
2107 logger.critical(
"%s", result.toUtf8().constData());
2113 return Encode::undefined();
2118ReturnedValue
ConsoleObject::method_error(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2120 return writeToConsole(b, argv, argc, Error);
2123ReturnedValue
ConsoleObject::method_log(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2128 return writeToConsole(b, argv, argc, Log);
2131ReturnedValue
ConsoleObject::method_info(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2133 return writeToConsole(b, argv, argc, Info);
2136ReturnedValue
ConsoleObject::method_profile(
const FunctionObject *b,
const Value *,
const Value *,
int)
2138 QV4::Scope scope(b);
2139 QV4::ExecutionEngine *v4 = scope.engine;
2141 QV4::CppStackFrame *frame = v4->currentStackFrame;
2142 const QByteArray baSource = frame->source().toUtf8();
2143 const QByteArray baFunction = frame->function().toUtf8();
2144 QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData());
2145 QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>();
2147 logger.warning(
"Cannot start profiling because debug service is disabled. Start with -qmljsdebugger=port:XXXXX.");
2149 service->startProfiling(v4->jsEngine());
2150 logger.debug(
"Profiling started.");
2153 return QV4::Encode::undefined();
2156ReturnedValue
ConsoleObject::method_profileEnd(
const FunctionObject *b,
const Value *,
const Value *,
int)
2158 QV4::Scope scope(b);
2159 QV4::ExecutionEngine *v4 = scope.engine;
2161 QV4::CppStackFrame *frame = v4->currentStackFrame;
2162 const QByteArray baSource = frame->source().toUtf8();
2163 const QByteArray baFunction = frame->function().toUtf8();
2164 QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData());
2166 QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>();
2168 logger.warning(
"Ignoring console.profileEnd(): the debug service is disabled.");
2170 service->stopProfiling(v4->jsEngine());
2171 logger.debug(
"Profiling ended.");
2174 return QV4::Encode::undefined();
2177ReturnedValue
ConsoleObject::method_time(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2179 QV4::Scope scope(b);
2181 THROW_GENERIC_ERROR(
"console.time(): Invalid arguments");
2183 QString name = argv[0].toQStringNoThrow();
2184 scope.engine->startTimer(name);
2185 return QV4::Encode::undefined();
2188ReturnedValue
ConsoleObject::method_timeEnd(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2190 QV4::Scope scope(b);
2192 THROW_GENERIC_ERROR(
"console.timeEnd(): Invalid arguments");
2194 QString name = argv[0].toQStringNoThrow();
2196 qint64 elapsed = scope.engine->stopTimer(name, &wasRunning);
2198 qDebug(
"%s: %llims", qPrintable(name), elapsed);
2200 return QV4::Encode::undefined();
2203ReturnedValue
ConsoleObject::method_count(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2208 name = argv[0].toQStringNoThrow();
2211 QV4::ExecutionEngine *v4 = scope.engine;
2213 QV4::CppStackFrame *frame = v4->currentStackFrame;
2215 QString scriptName = frame->source();
2217 int value = v4->consoleCountHelper(scriptName, frame->lineNumber(), 0);
2218 QString message = name + QLatin1String(
": ") + QString::number(value);
2220 QMessageLogger(qPrintable(scriptName), frame->lineNumber(),
2221 qPrintable(frame->function()))
2222 .debug(
"%s", qPrintable(message));
2224 return QV4::Encode::undefined();
2227ReturnedValue
ConsoleObject::method_trace(
const FunctionObject *b,
const Value *,
const Value *,
int argc)
2229 QV4::Scope scope(b);
2231 THROW_GENERIC_ERROR(
"console.trace(): Invalid arguments");
2233 QV4::ExecutionEngine *v4 = scope.engine;
2235 QString stack = jsStack(v4);
2237 QV4::CppStackFrame *frame = v4->currentStackFrame;
2238 QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(),
2239 frame->function().toUtf8().constData())
2240 .debug(v4->qmlEngine() ? lcQml() : lcJs(),
"%s", qPrintable(stack));
2242 return QV4::Encode::undefined();
2245ReturnedValue
ConsoleObject::method_warn(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2247 return writeToConsole(b, argv, argc, Warn);
2250ReturnedValue
ConsoleObject::method_assert(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2252 QV4::Scope scope(b);
2254 THROW_GENERIC_ERROR(
"console.assert(): Missing argument");
2256 QV4::ExecutionEngine *v4 = scope.engine;
2258 if (!argv[0].toBoolean()) {
2260 for (
int i = 1, ei = argc; i < ei; ++i) {
2262 message.append(QLatin1Char(
' '));
2264 message.append(argv[i].toQStringNoThrow());
2267 QString stack = jsStack(v4);
2269 QV4::CppStackFrame *frame = v4->currentStackFrame;
2270 QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(),
2271 frame->function().toUtf8().constData())
2272 .critical(
"%s\n%s",qPrintable(message), qPrintable(stack));
2275 return QV4::Encode::undefined();
2278ReturnedValue
ConsoleObject::method_exception(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2280 QV4::Scope scope(b);
2282 THROW_GENERIC_ERROR(
"console.exception(): Missing argument");
2284 return writeToConsole(b, argv, argc, Error,
true);
2287void QV4::GlobalExtensions::init(Object *globalObject, QJSEngine::Extensions extensions)
2289 ExecutionEngine *v4 = globalObject->engine();
2292 if (extensions.testFlag(QJSEngine::TranslationExtension)) {
2293 #if QT_CONFIG(translation)
2294 globalObject->defineDefaultProperty(QStringLiteral(
"qsTranslate"), QV4::GlobalExtensions::method_qsTranslate);
2295 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TRANSLATE_NOOP"), QV4::GlobalExtensions::method_qsTranslateNoOp);
2296 globalObject->defineDefaultProperty(QStringLiteral(
"qsTr"), QV4::GlobalExtensions::method_qsTr);
2297 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TR_NOOP"), QV4::GlobalExtensions::method_qsTrNoOp);
2298 globalObject->defineDefaultProperty(QStringLiteral(
"qsTrId"), QV4::GlobalExtensions::method_qsTrId);
2299 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TRID_NOOP"), QV4::GlobalExtensions::method_qsTrIdNoOp);
2302 ScopedString qtName(scope, v4->newString(QStringLiteral(
"Qt")));
2303 ScopedObject qt(scope, globalObject->get(qtName));
2305 v4->createQtObject();
2308 scope.engine->stringPrototype()->defineDefaultProperty(QStringLiteral(
"arg"), QV4::GlobalExtensions::method_string_arg);
2312 if (extensions.testFlag(QJSEngine::ConsoleExtension)) {
2313 globalObject->defineDefaultProperty(QStringLiteral(
"print"), QV4::ConsoleObject::method_log);
2316 QV4::ScopedObject console(scope, globalObject->engine()->memoryManager->allocate<QV4::ConsoleObject>());
2317 globalObject->defineDefaultProperty(QStringLiteral(
"console"), console);
2320 if (extensions.testFlag(QJSEngine::GarbageCollectionExtension)) {
2321 globalObject->defineDefaultProperty(QStringLiteral(
"gc"), QV4::GlobalExtensions::method_gc);
2326#if QT_CONFIG(translation)
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347ReturnedValue GlobalExtensions::method_qsTranslate(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2349 QV4::Scope scope(b);
2351 THROW_GENERIC_ERROR(
"qsTranslate() requires at least two arguments");
2352 if (!argv[0].isString())
2353 THROW_GENERIC_ERROR(
"qsTranslate(): first argument (context) must be a string");
2354 if (!argv[1].isString())
2355 THROW_GENERIC_ERROR(
"qsTranslate(): second argument (sourceText) must be a string");
2356 if ((argc > 2) && !argv[2].isString())
2357 THROW_GENERIC_ERROR(
"qsTranslate(): third argument (disambiguation) must be a string");
2359 QString context = argv[0].toQStringNoThrow();
2360 QString text = argv[1].toQStringNoThrow();
2362 if (argc > 2) comment = argv[2].toQStringNoThrow();
2365 if (argc > i && argv[i].isString()) {
2366 qWarning(
"qsTranslate(): specifying the encoding as fourth argument is deprecated");
2372 n = argv[i].toInt32();
2374 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2375 if (ep->propertyCapture)
2376 ep->propertyCapture->captureTranslation();
2378 QString result = QCoreApplication::translate(context.toUtf8().constData(),
2379 text.toUtf8().constData(),
2380 comment.toUtf8().constData(),
2383 return Encode(scope.engine->newString(result));
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408ReturnedValue GlobalExtensions::method_qsTranslateNoOp(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2410 QV4::Scope scope(b);
2412 return QV4::Encode::undefined();
2414 return argv[1].asReturnedValue();
2417QString GlobalExtensions::currentTranslationContext(ExecutionEngine *engine)
2420 CppStackFrame *frame = engine->currentStackFrame;
2423 while (frame && context.isEmpty()) {
2424 if (ExecutableCompilationUnit *unit = frame->v4Function->executableCompilationUnit()) {
2425 auto translationContextIndex = unit->unitData()->translationContextIndex();
2426 if (translationContextIndex)
2427 context = unit->stringAt(*translationContextIndex);
2428 if (!context.isEmpty())
2430 QString fileName = unit->fileName();
2431 QUrl url(unit->fileName());
2432 if (url.isValid() && url.isRelative()) {
2433 context = url.fileName();
2435 context = QQmlFile::urlToLocalFileOrQrc(fileName);
2436 if (context.isEmpty() && fileName.startsWith(QLatin1String(
":/")))
2439 context = QFileInfo(context).completeBaseName();
2441 frame = frame->parentFrame();
2444 if (context.isEmpty()) {
2445 if (QQmlRefPointer<QQmlContextData> ctxt = engine->callingQmlContext()) {
2446 QString path = ctxt->urlString();
2447 int lastSlash = path.lastIndexOf(QLatin1Char(
'/'));
2448 int lastDot = path.lastIndexOf(QLatin1Char(
'.'));
2449 int length = lastDot - (lastSlash + 1);
2450 context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString();
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494ReturnedValue GlobalExtensions::method_qsTr(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2496 QV4::Scope scope(b);
2498 THROW_GENERIC_ERROR(
"qsTr() requires at least one argument");
2499 if (!argv[0].isString())
2500 THROW_GENERIC_ERROR(
"qsTr(): first argument (sourceText) must be a string");
2501 if ((argc > 1) && !argv[1].isString())
2502 THROW_GENERIC_ERROR(
"qsTr(): second argument (disambiguation) must be a string");
2503 if ((argc > 2) && !argv[2].isNumber())
2504 THROW_GENERIC_ERROR(
"qsTr(): third argument (n) must be a number");
2506 const QString context = currentTranslationContext(scope.engine);
2507 const QString text = argv[0].toQStringNoThrow();
2508 const QString comment = argc > 1 ? argv[1].toQStringNoThrow() : QString();
2509 const int n = argc > 2 ? argv[2].toInt32() : -1;
2511 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2512 if (ep->propertyCapture)
2513 ep->propertyCapture->captureTranslation();
2515 QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(),
2516 comment.toUtf8().constData(), n);
2518 return Encode(scope.engine->newString(result));
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543ReturnedValue GlobalExtensions::method_qsTrNoOp(
const FunctionObject *,
const Value *,
const Value *argv,
int argc)
2546 return QV4::Encode::undefined();
2548 return argv[0].asReturnedValue();
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582ReturnedValue GlobalExtensions::method_qsTrId(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2584 QV4::Scope scope(b);
2586 THROW_GENERIC_ERROR(
"qsTrId() requires at least one argument");
2587 if (!argv[0].isString())
2588 THROW_TYPE_ERROR_WITH_MESSAGE(
"qsTrId(): first argument (id) must be a string");
2589 if (argc > 1 && !argv[1].isNumber())
2590 THROW_TYPE_ERROR_WITH_MESSAGE(
"qsTrId(): second argument (n) must be a number");
2594 n = argv[1].toInt32();
2596 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2597 if (ep->propertyCapture)
2598 ep->propertyCapture->captureTranslation();
2600 return Encode(scope.engine->newString(qtTrId(argv[0].toQStringNoThrow().toUtf8().constData(), n)));
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619ReturnedValue GlobalExtensions::method_qsTrIdNoOp(
const FunctionObject *,
const Value *,
const Value *argv,
int argc)
2622 return QV4::Encode::undefined();
2624 return argv[0].asReturnedValue();
2629
2630
2631
2632
2633
2634
2635
2636
2637ReturnedValue GlobalExtensions::method_gc(
const FunctionObject *b,
const Value *,
const Value *,
int)
2639 auto mm = b->engine()->memoryManager;
2642 return QV4::Encode::undefined();
2645ReturnedValue GlobalExtensions::method_string_arg(
const FunctionObject *b,
const Value *thisObject,
const Value *argv,
int argc)
2647 QV4::Scope scope(b);
2649 THROW_GENERIC_ERROR(
"String.arg(): Invalid arguments");
2651 QString value = thisObject->toQString();
2653 QV4::ScopedValue arg(scope, argv[0]);
2654 if (arg->isInteger())
2655 RETURN_RESULT(scope.engine->newString(value.arg(arg->integerValue())));
2656 else if (arg->isDouble())
2657 RETURN_RESULT(scope.engine->newString(value.arg(arg->doubleValue())));
2658 else if (arg->isBoolean())
2659 RETURN_RESULT(scope.engine->newString(value.arg(arg->booleanValue())));
2661 RETURN_RESULT(scope.engine->newString(value.arg(arg->toQString())));
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2687#include "moc_qqmlbuiltinfunctions_p.cpp"
Combined button and popup list for selecting options.
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
DEFINE_OBJECT_VTABLE(QQmlBindingFunction)
static QByteArray convertVariantList(const QVariantList &data, QV4::ExecutionEngine *engine)
static QTime dateTimeToTime(const QDateTime &dateTime)
static QString serializeArray(Object *array, ExecutionEngine *v4, QSet< QV4::Heap::Object * > &alreadySeen)
void addParameters(QJSEngine *e, QJSValue &result, int i, T parameter, Others... others)
static QVariant constructFromJSValue(QJSEngine *e, QMetaType type, T... parameters)
void addParameters< double >(QJSEngine *, QJSValue &result, int i, double parameter)
static std::optional< QDate > dateFromString(const QString &string, QV4::ExecutionEngine *engine)
\qmlmethod string Qt::formatDate(datetime date, variant format, variant localeFormatOption)
static QV4::ReturnedValue throwInvalidCharacter(QV4::ExecutionEngine *engine)
DEFINE_OBJECT_VTABLE(ConsoleObject)
static ReturnedValue writeToConsole(const FunctionObject *b, const Value *argv, int argc, ConsoleLogTypes logType, bool printStack=false)
void addParameters(QJSEngine *e, QJSValue &result, int i, T parameter)
static QString jsStack(QV4::ExecutionEngine *engine)
static std::optional< QTime > timeFromString(const QString &string, QV4::ExecutionEngine *engine)
\qmlmethod string Qt::formatTime(datetime time, variant format, variant localeFormatOption)
static std::optional< QDateTime > dateTimeFromString(const QString &string, QV4::ExecutionEngine *engine)
\qmlmethod string Qt::formatDateTime(datetime dateTime, variant format, variant localeFormatOption)
static Q_DECL_COLD_FUNCTION void throw_invalid_compilation_mode(QV4::ExecutionEngine *engine, QQmlComponent::CompilationMode mode)
static QVariant colorVariantFromJSValue(const QJSValue &color, bool *ok)
Q_DECLARE_LOGGING_CATEGORY(lcQml)
Q_DECLARE_LOGGING_CATEGORY(lcJs)
QQmlSourceLocation currentLocation() const