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
352 return QQml_colorProvider()->fromRgbF(r, g, b, a);
356
357
358
359
360
361QVariant QtObject::hsla(
double h,
double s,
double l,
double a)
const
364 h = qBound(0.0, h, 1.0);
365 s = qBound(0.0, s, 1.0);
366 l = qBound(0.0, l, 1.0);
367 a = qBound(0.0, a, 1.0);
369 return QQml_colorProvider()->fromHslF(h, s, l, a);
373
374
375
376
377
378
379
380QVariant QtObject::hsva(
double h,
double s,
double v,
double a)
const
383 h = qBound(0.0, h, 1.0);
384 s = qBound(0.0, s, 1.0);
385 v = qBound(0.0, v, 1.0);
386 a = qBound(0.0, a, 1.0);
388 return QQml_colorProvider()->fromHsvF(h, s, v, a);
392
393
394
395
396
397
398
399bool QtObject::colorEqual(
const QVariant &lhs,
const QVariant &rhs)
const
403 QVariant color1 = lhs;
404 if (color1.userType() == QMetaType::QString) {
405 color1 = QQmlStringConverters::colorFromString(color1.toString(), &ok);
407 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid color name"));
410 }
else if (color1.userType() != QMetaType::QColor) {
411 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid arguments"));
415 QVariant color2 = rhs;
416 if (color2.userType() == QMetaType::QString) {
417 color2 = QQmlStringConverters::colorFromString(color2.toString(), &ok);
419 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid color name"));
422 }
else if (color2.userType() != QMetaType::QColor) {
423 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid arguments"));
427 return color1 == color2;
431
432
433
434
435QRectF QtObject::rect(
double x,
double y,
double width,
double height)
const
437 return QRectF(x, y, width, height);
441
442
443
444
445QPointF QtObject::point(
double x,
double y)
const
447 return QPointF(x, y);
451
452
453
454
455QSizeF QtObject::size(
double w,
double h)
const
461
462
463
464
465
466
467
468
469QVariant QtObject::font(
const QJSValue &fontSpecifier)
const
471 if (!fontSpecifier.isObject()) {
472 v4Engine()->throwError(QStringLiteral(
"Qt.font(): Invalid arguments"));
477 const QVariant v = QQmlValueTypeProvider::createValueType(
478 fontSpecifier, QMetaType(QMetaType::QFont));
483 v4Engine()->throwError(QStringLiteral(
"Qt.font(): Invalid argument: "
484 "no valid font subproperties specified"));
491 result.setProperty(i, e->toScriptValue(parameter));
495void addParameters<
double>(QJSEngine *, QJSValue &result,
int i,
double parameter)
497 result.setProperty(i, QJSValue(parameter));
500template<
typename T,
typename ...Others>
501void addParameters(QJSEngine *e, QJSValue &result,
int i, T parameter, Others... others)
503 addParameters<T>(e, result, i, parameter);
504 addParameters<Others...>(e, result, ++i, others...);
507template<
typename ...T>
512 QJSValue params = e->newArray(
sizeof...(parameters));
513 addParameters(e, params, 0, parameters...);
514 const QVariant variant = QQmlValueTypeProvider::createValueType(params, type);
515 return variant.isValid() ? variant : QVariant(type);
519
520
521
522
523QVariant QtObject::vector2d(
double x,
double y)
const
525 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector2D), x, y);
529
530
531
532
533QVariant QtObject::vector3d(
double x,
double y,
double z)
const
535 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector3D), x, y, z);
539
540
541
542
543QVariant QtObject::vector4d(
double x,
double y,
double z,
double w)
const
545 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector4D), x, y, z, w);
549
550
551
552
553QVariant QtObject::quaternion(
double scalar,
double x,
double y,
double z)
const
555 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QQuaternion), scalar, x, y, z);
559
560
561
562
563QVariant QtObject::matrix4x4()
const
565 const QMetaType metaType(QMetaType::QMatrix4x4);
566 const QVariant variant = QQmlValueTypeProvider::createValueType(QJSValue(), metaType);
567 return variant.isValid() ? variant : QVariant(metaType);
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585QVariant QtObject::matrix4x4(
const QJSValue &value)
const
587 if (value.isObject()) {
588 QVariant v = QQmlValueTypeProvider::createValueType(
589 value, QMetaType(QMetaType::QMatrix4x4));
594 v4Engine()->throwError(QStringLiteral(
"Qt.matrix4x4(): Invalid argument: "
595 "not a valid matrix4x4 values array"));
600
601
602
603
604
605
606
607
608
609
610
611
612
613QVariant QtObject::matrix4x4(
double m11,
double m12,
double m13,
double m14,
614 double m21,
double m22,
double m23,
double m24,
615 double m31,
double m32,
double m33,
double m34,
616 double m41,
double m42,
double m43,
double m44)
const
618 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QMatrix4x4),
619 m11, m12, m13, m14, m21, m22, m23, m24,
620 m31, m32, m33, m34, m41, m42, m43, m44);
626 if (color.isString()) {
627 v = QQmlStringConverters::colorFromString(color.toString(), ok);
629 return QVariant::fromValue(
nullptr);
631 v = color.toVariant();
632 if (v.userType() != QMetaType::QColor) {
634 return QVariant::fromValue(
nullptr);
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657QVariant QtObject::lighter(
const QJSValue &color,
double factor)
const
660 const QVariant v = colorVariantFromJSValue(color, &ok);
661 return ok ? QQml_colorProvider()->lighter(v, factor) : v;
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680QVariant QtObject::darker(
const QJSValue &color,
double factor)
const
683 const QVariant v = colorVariantFromJSValue(color, &ok);
684 return ok ? QQml_colorProvider()->darker(v, factor) : v;
688
689
690
691
692
693
694QVariant QtObject::alpha(
const QJSValue &baseColor,
double value)
const
697 const QVariant v = colorVariantFromJSValue(baseColor, &ok);
698 return ok ? QQml_colorProvider()->alpha(v, value) : v;
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728QVariant QtObject::tint(
const QJSValue &baseColor,
const QJSValue &tintColor)
const
733 const QVariant v1 = colorVariantFromJSValue(baseColor, &ok);
738 const QVariant v2 = colorVariantFromJSValue(tintColor, &ok);
740 return ok ? QQml_colorProvider()->tint(v1, v2) : v2;
745QString formatDateTimeObjectUsingDateFormat(T formatThis, Qt::DateFormat format) {
749 case Qt::RFC2822Date:
750 case Qt::ISODateWithMs:
751 return formatThis.toString(format);
762 return dateTime.toLocalTime().time();
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
784 const QDate date = QDate::fromString(string, Qt::ISODate);
791 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
792 if (dateTime.isValid()) {
793 qCWarning(lcRootProperties())
794 << string <<
"is a date/time string being passed to formatDate()."
795 <<
"You should only pass date strings to formatDate().";
796 return dateTime.date();
802 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
803 if (dateTime.isValid())
804 return DateObject::dateTimeToDate(dateTime);
807 engine->throwError(QStringLiteral(
"Invalid argument passed to formatDate(): %1").arg(string));
811QString QtObject::formatDate(QDate date,
const QString &format)
const
813 return date.toString(format);
816QString QtObject::formatDate(QDate date, Qt::DateFormat format)
const
818 return formatDateTimeObjectUsingDateFormat(date, format);
821QString QtObject::formatDate(
const QDateTime &dateTime,
const QString &format)
const
823 return DateObject::dateTimeToDate(dateTime).toString(format);
826QString QtObject::formatDate(
const QString &string,
const QString &format)
const
828 if (
const auto qDate = dateFromString(string, v4Engine()))
829 return formatDate(qDate.value(), format);
834QString QtObject::formatDate(
const QDateTime &dateTime, Qt::DateFormat format)
const
836 return formatDateTimeObjectUsingDateFormat(DateObject::dateTimeToDate(dateTime), format);
839QString QtObject::formatDate(
const QString &string, Qt::DateFormat format)
const
841 if (
const auto qDate = dateFromString(string, v4Engine()))
842 return formatDate(qDate.value(), format);
847#if QT_CONFIG(qml_locale)
848QString QtObject::formatDate(QDate date,
const QLocale &locale,
849 QLocale::FormatType formatType)
const
851 return locale.toString(date, formatType);
854QString QtObject::formatDate(
const QDateTime &dateTime,
const QLocale &locale,
855 QLocale::FormatType formatType)
const
857 return locale.toString(DateObject::dateTimeToDate(dateTime), formatType);
860QString QtObject::formatDate(
const QString &string,
const QLocale &locale,
861 QLocale::FormatType formatType)
const
863 if (
const auto qDate = dateFromString(string, v4Engine()))
864 return locale.toString(qDate.value(), formatType);
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
889 const QTime time = QTime::fromString(string, Qt::ISODate);
896 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
897 if (dateTime.isValid()) {
898 qCWarning(lcRootProperties())
899 << string <<
"is a date/time string being passed to formatTime()."
900 <<
"You should only pass time strings to formatTime().";
901 return dateTime.time();
907 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
908 if (dateTime.isValid())
909 return dateTimeToTime(dateTime);
912 engine->throwError(QStringLiteral(
"Invalid argument passed to formatTime(): %1").arg(string));
916QString QtObject::formatTime(QTime time,
const QString &format)
const
918 return time.toString(format);
921QString QtObject::formatTime(
const QDateTime &dateTime,
const QString &format)
const
923 return dateTimeToTime(dateTime).toString(format);
926QString QtObject::formatTime(
const QString &time,
const QString &format)
const
929 if (
auto qTime = timeFromString(time, v4Engine()))
930 return formatTime(qTime.value(), format);
935QString QtObject::formatTime(QTime time, Qt::DateFormat format)
const
937 return formatDateTimeObjectUsingDateFormat(time, format);
940QString QtObject::formatTime(
const QDateTime &dateTime, Qt::DateFormat format)
const
942 return formatDateTimeObjectUsingDateFormat(dateTimeToTime(dateTime), format);
945QString QtObject::formatTime(
const QString &time, Qt::DateFormat format)
const
947 if (
auto qTime = timeFromString(time, v4Engine()))
948 return formatTime(qTime.value(), format);
953#if QT_CONFIG(qml_locale)
954QString QtObject::formatTime(QTime time,
const QLocale &locale,
955 QLocale::FormatType formatType)
const
957 return locale.toString(time, formatType);
960QString QtObject::formatTime(
const QDateTime &dateTime,
const QLocale &locale,
961 QLocale::FormatType formatType)
const
963 return locale.toString(dateTimeToTime(dateTime), formatType);
966QString QtObject::formatTime(
const QString &time,
const QLocale &locale,
967 QLocale::FormatType formatType)
const
969 if (
auto qTime = timeFromString(time, v4Engine()))
970 return locale.toString(qTime.value(), formatType);
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
1070
1071
1072
1073
1077 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
1078 if (dateTime.isValid())
1084 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
1085 if (dateTime.isValid())
1089 engine->throwError(QStringLiteral(
"Invalid argument passed to formatDateTime(): %1").arg(string));
1090 return std::nullopt;
1093QString QtObject::formatDateTime(
const QDateTime &dateTime,
const QString &format)
const
1095 return dateTime.toString(format);
1098QString QtObject::formatDateTime(
const QString &string,
const QString &format)
const
1101 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1102 return formatDateTime(qDateTime.value(), format);
1107QString QtObject::formatDateTime(
const QDateTime &dateTime, Qt::DateFormat format)
const
1109 return formatDateTimeObjectUsingDateFormat(dateTime, format);
1112QString QtObject::formatDateTime(
const QString &string, Qt::DateFormat format)
const
1115 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1116 return formatDateTime(qDateTime.value(), format);
1121#if QT_CONFIG(qml_locale)
1122QString QtObject::formatDateTime(
const QDateTime &dateTime,
const QLocale &locale,
1123 QLocale::FormatType formatType)
const
1125 return locale.toString(dateTime, formatType);
1128QString QtObject::formatDateTime(
const QString &string,
const QLocale &locale,
1129 QLocale::FormatType formatType)
const
1132 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1133 return formatDateTime(qDateTime.value(), locale, formatType);
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150bool QtObject::openUrlExternally(
const QUrl &url)
const
1152 return QQml_guiProvider()->openUrlExternally(resolvedUrl(url));
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165QUrl QtObject::url(
const QUrl &url)
const
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181QUrl QtObject::resolvedUrl(
const QUrl &url)
const
1183 if (QQmlRefPointer<QQmlContextData> ctxt = v4Engine()->callingQmlContext())
1184 return ctxt->resolvedUrl(url);
1185 if (QQmlEngine *engine = qmlEngine())
1186 return engine->baseUrl().resolved(url);
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200QUrl QtObject::resolvedUrl(
const QUrl &url, QObject *context)
const
1203 QQmlData *data = QQmlData::get(context);
1204 if (data && data->outerContext)
1205 return data->outerContext->resolvedUrl(url);
1208 if (QQmlEngine *engine = qmlEngine())
1209 return engine->baseUrl().resolved(url);
1214
1215
1216
1217
1218QStringList QtObject::fontFamilies()
const
1220 return QQml_guiProvider()->fontFamilies();
1224
1225
1226
1227QString QtObject::md5(
const QString &data)
const
1229 return QLatin1String(QCryptographicHash::hash(data.toUtf8(), QCryptographicHash::Md5).toHex());
1233
1234
1235
1236
1237
1238QString QtObject::btoa(
const QString &data)
const
1240 qWarning(
"Qt.btoa(string): This method is deprecated. "
1241 "Its output differs from the common Web API. "
1242 "Use the overloads that take array-likes.");
1243 return QLatin1String(data.toUtf8().toBase64());
1247
1248
1249
1250
1251
1252
1253QString QtObject::atob(
const QString &data)
const
1255 qWarning(
"Qt.atob(string): This method is deprecated. "
1256 "Its output differs from the common Web API. "
1257 "Use the overloads that take array-likes.");
1258 return QString::fromUtf8(QByteArray::fromBase64(data.toLatin1()));
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278QByteArray QtObject::btoa(
const QByteArray &data)
const
1280 return data.toBase64();
1285 QV4::Scope scope(engine);
1286 THROW_DOM(DOMEXCEPTION_INVALID_CHARACTER_ERR,
"Invalid character");
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306QByteArray QtObject::atob(
const QByteArray &data)
const
1309 = QByteArray::fromBase64Encoding(data, QByteArray::AbortOnBase64DecodingErrors);
1310 if (result.decodingStatus == QByteArray::Base64DecodingStatus::Ok)
1311 return result.decoded;
1313 throwInvalidCharacter(v4Engine());
1314 return QByteArray();
1319 const auto fail = [&]() {
1320 throwInvalidCharacter(engine);
1321 return QByteArray();
1326 const auto append = [&](
auto value) {
1327 if (value < 0 || value >= 256)
1329 result.append(
char(value));
1333 for (
const QVariant &entry : data) {
1334 switch (entry.typeId()) {
1335 case QMetaType::Char:
1336 result.append(*
static_cast<
const char *>(entry.constData()));
1338 case QMetaType::Int: {
1339 if (!append(*
static_cast<
const int *>(entry.constData())))
1343 case QMetaType::Double: {
1344 if (!append(*
static_cast<
const double *>(entry.constData())))
1348 case QMetaType::QString: {
1349 const QString *string =
static_cast<
const QString *>(entry.constData());
1350 if (string->length() != 1)
1352 if (!append(string->at(0).unicode()))
1365
1366
1367
1368
1369
1370
1371QByteArray QtObject::btoa(
const QVariantList &data)
const
1373 return btoa(convertVariantList(data, v4Engine()));
1377
1378
1379
1380
1381
1382
1383QByteArray QtObject::atob(
const QVariantList &data)
const
1385 return atob(convertVariantList(data, v4Engine()));
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399void QtObject::quit()
const
1401 if (QQmlEngine *engine = qmlEngine())
1402 QQmlEnginePrivate::get(engine)->sendQuit();
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417void QtObject::exit(
int retCode)
const
1419 if (QQmlEngine *engine = qmlEngine())
1420 QQmlEnginePrivate::get(engine)->sendExit(retCode);
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
1454
1455
1456
1457
1458QObject *QtObject::createQmlObject(
const QString &qml, QObject *parent,
const QUrl &url)
const
1460 QQmlEngine *engine = qmlEngine();
1462 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): "
1463 "Can only be called on a QML engine."));
1468 static ReturnedValue create(QV4::ExecutionEngine *v4,
const QList<QQmlError> &errors) {
1472 errorstr += QLatin1String(
"Qt.createQmlObject(): failed to create object: ");
1474 QV4::ScopedArrayObject qmlerrors(scope, v4->newArrayObject());
1475 QV4::ScopedObject qmlerror(scope);
1476 QV4::ScopedString s(scope);
1477 QV4::ScopedValue v(scope);
1478 for (
int ii = 0; ii < errors.size(); ++ii) {
1479 const QQmlError &error = errors.at(ii);
1480 errorstr += QLatin1String(
"\n ") + error.toString();
1481 qmlerror = v4->newObject();
1482 qmlerror->put((s = v4->newString(QStringLiteral(
"lineNumber"))), (v = QV4::Value::fromInt32(error.line())));
1483 qmlerror->put((s = v4->newString(QStringLiteral(
"columnNumber"))), (v = QV4::Value::fromInt32(error.column())));
1484 qmlerror->put((s = v4->newString(QStringLiteral(
"fileName"))), (v = v4->newString(error.url().toString())));
1485 qmlerror->put((s = v4->newString(QStringLiteral(
"message"))), (v = v4->newString(error.description())));
1486 qmlerrors->put(ii, qmlerror);
1489 v = v4->newString(errorstr);
1490 ScopedObject errorObject(scope, v4->newErrorObject(v));
1491 errorObject->put((s = v4->newString(QStringLiteral(
"qmlErrors"))), qmlerrors);
1492 return errorObject.asReturnedValue();
1496 QQmlRefPointer<QQmlContextData> context = v4Engine()->callingQmlContext();
1498 context = QQmlContextData::get(QQmlEnginePrivate::get(engine)->rootContext);
1501 QQmlContext *effectiveContext =
nullptr;
1502 if (context->isPragmaLibraryContext())
1503 effectiveContext = engine->rootContext();
1505 effectiveContext = context->asQQmlContext();
1506 Q_ASSERT(effectiveContext);
1511 QUrl resolvedUrl = url;
1512 if (url.isValid() && url.isRelative())
1513 resolvedUrl = context->resolvedUrl(url);
1516 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Missing parent object"));
1520 QQmlRefPointer<QQmlTypeData> typeData = v4Engine()->typeLoader()->getType(
1521 qml.toUtf8(), resolvedUrl, QQmlTypeLoader::Synchronous);
1523 if (!typeData->isCompleteOrError()) {
1524 v4Engine()->throwError(
1525 QStringLiteral(
"Qt.createQmlObject(): Failed to force synchronous loading "
1526 "of asynchronous URL '%1'").arg(resolvedUrl.toString()));
1530 QQmlComponent component(engine);
1531 QQmlComponentPrivate *componentPrivate = QQmlComponentPrivate::get(&component);
1532 componentPrivate->fromTypeData(typeData);
1533 componentPrivate->setProgress(1.0);
1535 Scope scope(v4Engine());
1536 if (component.isError()) {
1537 ScopedValue v(scope, Error::create(scope.engine, component.errors()));
1538 scope.engine->throwError(v);
1542 if (!component.isReady()) {
1543 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Component is not ready"));
1547 if (!effectiveContext->isValid()) {
1548 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Cannot create a component "
1549 "in an invalid context"));
1553 QObject *obj = component.beginCreate(effectiveContext);
1555 QQmlData::get(obj,
true)->explicitIndestructibleSet =
false;
1556 QQmlData::get(obj)->indestructible =
false;
1558 obj->setParent(parent);
1560 QList<QQmlPrivate::AutoParentFunction> functions = QQmlMetaType::parentFunctions();
1561 for (
int ii = 0; ii < functions.size(); ++ii) {
1562 if (QQmlPrivate::Parented == functions.at(ii)(obj, parent))
1566 component.completeCreate();
1568 if (component.isError()) {
1569 ScopedValue v(scope, Error::create(scope.engine, component.errors()));
1570 scope.engine->throwError(v);
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
1618
1619
1620
1621
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1649QQmlComponent *QtObject::createComponent(
const QUrl &url, QObject *parent)
const
1651 return createComponent(url, QQmlComponent::PreferSynchronous, parent);
1657 engine->throwError(QStringLiteral(
"Invalid compilation mode %1").arg(
int(mode)));
1661QQmlComponent *QtObject::createComponent(
const QUrl &url, QQmlComponent::CompilationMode mode,
1662 QObject *parent)
const
1664 if (mode != QQmlComponent::Asynchronous && mode != QQmlComponent::PreferSynchronous) {
1665 throw_invalid_compilation_mode(v4Engine(), mode);
1672 QQmlEngine *engine = qmlEngine();
1676 auto [context, effectiveContext] = getContexts();
1680 QQmlComponent *c =
new QQmlComponent(engine, context->resolvedUrl(url), mode, parent);
1681 QQmlComponentPrivate::get(c)->setCreationContext(std::move(effectiveContext));
1682 QQmlData::get(c,
true)->explicitIndestructibleSet =
false;
1683 QQmlData::get(c)->indestructible =
false;
1687QQmlComponent *QtObject::createComponent(
const QString &moduleUri,
const QString &typeName,
1688 QObject *parent)
const
1690 return createComponent(moduleUri, typeName, QQmlComponent::PreferSynchronous, parent);
1693QQmlComponent *QtObject::createComponent(
const QString &moduleUri,
const QString &typeName, QQmlComponent::CompilationMode mode, QObject *parent)
const
1695 if (mode != QQmlComponent::Asynchronous && mode != QQmlComponent::PreferSynchronous) {
1696 throw_invalid_compilation_mode(v4Engine(), mode);
1700 QQmlEngine *engine = qmlEngine();
1704 if (moduleUri.isEmpty() || typeName.isEmpty())
1707 auto [context, effectiveContext] = getContexts();
1711 QQmlComponent *c =
new QQmlComponent(engine, moduleUri, typeName, mode, parent);
1712 if (c->isError() && !parent && moduleUri.endsWith(u".qml")) {
1713 v4Engine()->throwTypeError(
1714 QStringLiteral(
"Invalid arguments; did you swap mode and parent"));
1716 QQmlComponentPrivate::get(c)->setCreationContext(std::move(effectiveContext));
1717 QQmlData::get(c,
true)->explicitIndestructibleSet =
false;
1718 QQmlData::get(c)->indestructible =
false;
1722#if QT_CONFIG(translation)
1723QString QtObject::uiLanguage()
const
1725 if (
const QJSEngine *e = jsEngine())
1726 return e->uiLanguage();
1730void QtObject::setUiLanguage(
const QString &uiLanguage)
1732 if (QJSEngine *e = jsEngine())
1733 e->setUiLanguage(uiLanguage);
1736QBindable<QString> QtObject::uiLanguageBindable()
1738 if (QJSEngine *e = jsEngine())
1739 return QBindable<QString>(&QJSEnginePrivate::get(e)->uiLanguage);
1740 return QBindable<QString>();
1744#if QT_CONFIG(qml_locale)
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765QLocale QtObject::locale()
const
1770QLocale QtObject::locale(
const QString &name)
const
1772 return QLocale(name);
1776void Heap::QQmlBindingFunction::init(
const QV4::JavaScriptFunctionObject *bindingFunction)
1778 Scope scope(bindingFunction->engine());
1779 ScopedContext context(scope, bindingFunction->scope());
1780 JavaScriptFunctionObject::init(context, bindingFunction->function());
1781 this->bindingFunction.set(internalClass->engine, bindingFunction->d());
1785 const FunctionObject *f,
const Value *,
const Value *,
int)
1788 return f->engine()->throwTypeError(QStringLiteral(
"Bindings must not be called directly."));
1793 QV4::CppStackFrame *frame = engine()->currentStackFrame;
1794 if (frame->v4Function)
1795 return QQmlSourceLocation(frame->source(), frame->lineNumber(), 0);
1797 return bindingFunction()->function->sourceLocation();
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
1839
1840
1841
1842
1843QJSValue QtObject::binding(
const QJSValue &function)
const
1845 const QV4::JavaScriptFunctionObject *f
1846 = QJSValuePrivate::asManagedType<JavaScriptFunctionObject>(&function);
1847 QV4::ExecutionEngine *e = v4Engine();
1849 return QJSValuePrivate::fromReturnedValue(
1852 "binding(): argument (binding expression) must be a function")));
1855 return QJSValuePrivate::fromReturnedValue(
1856 Encode(e->memoryManager->allocate<QQmlBindingFunction>(f)));
1859void QtObject::callLater(QQmlV4FunctionPtr args)
1861 m_engine->delayedCallQueue()->addUniquelyAndExecuteLater(m_engine, args);
1865
1866
1867
1868
1869
1870
1871double QtObject::enumStringToValue(
const QJSManagedValue &enumType,
const QString &string)
1873 return retrieveFromEnum<
double>(
1875 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1876 return type.scopedEnumValue(typeLoader, enumIndex, string, ok);
1877 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1878 return type.unscopedEnumValue(typeLoader, enumIndex, string, ok);
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894QString QtObject::enumValueToString(
const QJSManagedValue &enumType,
double value)
1897 if (std::isnan(value)) {
1898 m_engine->throwReferenceError(
"Invalid second argument, entry"_L1);
1902 return retrieveFromEnum<QString>(
1904 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1905 return type.scopedEnumKey(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1906 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1907 return type.unscopedEnumKey(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1912
1913
1914
1915
1916
1917
1918
1919QStringList QtObject::enumValueToStrings(
const QJSManagedValue &enumType,
double value)
1922 if (std::isnan(value)) {
1923 m_engine->throwReferenceError(
"Invalid second argument, entry"_L1);
1927 return retrieveFromEnum<QStringList>(
1929 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1930 return type.scopedEnumKeys(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1931 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1932 return type.unscopedEnumKeys(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1936QQmlPlatform *QtObject::platform()
1939 m_platform =
new QQmlPlatform(
this);
1943QQmlApplication *QtObject::application()
1947 m_application = QQml_guiProvider()->application(
this);
1949 return m_application;
1952QObject *QtObject::inputMethod()
const
1954 return QQml_guiProvider()->inputMethod();
1957QObject *QtObject::styleHints()
const
1959 return QQml_guiProvider()->styleHints();
1965 QV4::Scope scope(internalClass->engine);
1966 QV4::ScopedObject o(scope,
this);
1968 o->defineDefaultProperty(QStringLiteral(
"debug"), QV4::ConsoleObject::method_log);
1969 o->defineDefaultProperty(QStringLiteral(
"log"), QV4::ConsoleObject::method_log);
1970 o->defineDefaultProperty(QStringLiteral(
"info"), QV4::ConsoleObject::method_info);
1971 o->defineDefaultProperty(QStringLiteral(
"warn"), QV4::ConsoleObject::method_warn);
1972 o->defineDefaultProperty(QStringLiteral(
"error"), QV4::ConsoleObject::method_error);
1973 o->defineDefaultProperty(QStringLiteral(
"assert"), QV4::ConsoleObject::method_assert);
1975 o->defineDefaultProperty(QStringLiteral(
"count"), QV4::ConsoleObject::method_count);
1976 o->defineDefaultProperty(QStringLiteral(
"profile"), QV4::ConsoleObject::method_profile);
1977 o->defineDefaultProperty(QStringLiteral(
"profileEnd"), QV4::ConsoleObject::method_profileEnd);
1978 o->defineDefaultProperty(QStringLiteral(
"time"), QV4::ConsoleObject::method_time);
1979 o->defineDefaultProperty(QStringLiteral(
"timeEnd"), QV4::ConsoleObject::method_timeEnd);
1980 o->defineDefaultProperty(QStringLiteral(
"trace"), QV4::ConsoleObject::method_trace);
1981 o->defineDefaultProperty(QStringLiteral(
"exception"), QV4::ConsoleObject::method_exception);
1996 for (CppStackFrame *f = engine->currentStackFrame; f && i < 10; f = f->parentFrame(), ++i) {
1999 if (f->isJSTypesFrame() &&
static_cast<JSTypesStackFrame *>(f)->isTailCalling()) {
2000 stackFrame = QStringLiteral(
"[elided tail calls]");
2002 const int line = f->lineNumber();
2003 if (line != f->missingLineNumber()) {
2004 stackFrame = QStringLiteral(
"%1 (%2:%3)").arg(
2005 f->function(), f->source(), QString::number(qAbs(line)));
2007 stackFrame = QStringLiteral(
"%1 (%2)").arg(
2008 f->function(), f->source());
2013 stack += QLatin1Char(
'\n');
2014 stack += stackFrame;
2021 ScopedValue val(scope);
2023 alreadySeen.insert(array->d());
2025 ScopedObject detached(scope);
2026 if (Sequence *reference = array->as<Sequence>())
2027 detached = ReferenceObject::detached(reference->d());
2031 result += QLatin1Char(
'[');
2032 const uint length = detached->getLength();
2033 for (uint i = 0; i < length; ++i) {
2035 result += QLatin1Char(
',');
2036 val = detached->get(i);
2037 if (val->isManaged() && val->managed()->isArrayLike())
2038 if (!alreadySeen.contains(val->objectValue()->d()))
2039 result += serializeArray(val->objectValue(), v4, alreadySeen);
2041 result += QLatin1String(
"[Circular]");
2043 result += val->toQStringNoThrow();
2045 result += QLatin1Char(
']');
2047 alreadySeen.remove(array->d());
2054 const QLoggingCategory *loggingCategory =
nullptr;
2056 QV4::Scope scope(b);
2057 QV4::ExecutionEngine *v4 = scope.engine;
2061 if (
const QObjectWrapper* wrapper = argv[0].as<QObjectWrapper>()) {
2062 if (QQmlLoggingCategoryBase *category
2063 = qobject_cast<QQmlLoggingCategoryBase *>(wrapper->object())) {
2064 if (category->category())
2065 loggingCategory = category->category();
2067 THROW_GENERIC_ERROR(
"A QmlLoggingCatgory was provided without a valid name");
2074 for (
int i = start, ei = argc; i < ei; ++i) {
2076 result.append(QLatin1Char(
' '));
2078 QSet<QV4::Heap::Object *> alreadySeenElements;
2079 if (argv[i].isManaged() && argv[i].managed()->isArrayLike())
2080 result.append(serializeArray(argv[i].objectValue(), v4, alreadySeenElements));
2082 result.append(argv[i].toQStringNoThrow());
2086 result += QLatin1Char(
'\n') + jsStack(v4);
2088 if (!loggingCategory)
2089 loggingCategory = v4->qmlEngine() ? &lcQml() : &lcJs();
2090 QV4::CppStackFrame *frame = v4->currentStackFrame;
2091 const QByteArray baSource = frame ? frame->source().toUtf8() : QByteArray();
2092 const QByteArray baFunction = frame ? frame->function().toUtf8() : QByteArray();
2093 QMessageLogger logger(baSource.constData(), frame ? frame->lineNumber() : 0,
2094 baFunction.constData(), loggingCategory->categoryName());
2098 if (loggingCategory->isDebugEnabled())
2099 logger.debug(
"%s", result.toUtf8().constData());
2102 if (loggingCategory->isInfoEnabled())
2103 logger.info(
"%s", result.toUtf8().constData());
2106 if (loggingCategory->isWarningEnabled())
2107 logger.warning(
"%s", result.toUtf8().constData());
2110 if (loggingCategory->isCriticalEnabled())
2111 logger.critical(
"%s", result.toUtf8().constData());
2117 return Encode::undefined();
2122ReturnedValue
ConsoleObject::method_error(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2124 return writeToConsole(b, argv, argc, Error);
2127ReturnedValue
ConsoleObject::method_log(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2132 return writeToConsole(b, argv, argc, Log);
2135ReturnedValue
ConsoleObject::method_info(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2137 return writeToConsole(b, argv, argc, Info);
2140ReturnedValue
ConsoleObject::method_profile(
const FunctionObject *b,
const Value *,
const Value *,
int)
2142 QV4::Scope scope(b);
2143 QV4::ExecutionEngine *v4 = scope.engine;
2145 QV4::CppStackFrame *frame = v4->currentStackFrame;
2146 const QByteArray baSource = frame->source().toUtf8();
2147 const QByteArray baFunction = frame->function().toUtf8();
2148 QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData());
2149 QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>();
2151 logger.warning(
"Cannot start profiling because debug service is disabled. Start with -qmljsdebugger=port:XXXXX.");
2153 service->startProfiling(v4->jsEngine());
2154 logger.debug(
"Profiling started.");
2157 return QV4::Encode::undefined();
2160ReturnedValue
ConsoleObject::method_profileEnd(
const FunctionObject *b,
const Value *,
const Value *,
int)
2162 QV4::Scope scope(b);
2163 QV4::ExecutionEngine *v4 = scope.engine;
2165 QV4::CppStackFrame *frame = v4->currentStackFrame;
2166 const QByteArray baSource = frame->source().toUtf8();
2167 const QByteArray baFunction = frame->function().toUtf8();
2168 QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData());
2170 QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>();
2172 logger.warning(
"Ignoring console.profileEnd(): the debug service is disabled.");
2174 service->stopProfiling(v4->jsEngine());
2175 logger.debug(
"Profiling ended.");
2178 return QV4::Encode::undefined();
2181ReturnedValue
ConsoleObject::method_time(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2183 QV4::Scope scope(b);
2185 THROW_GENERIC_ERROR(
"console.time(): Invalid arguments");
2187 QString name = argv[0].toQStringNoThrow();
2188 scope.engine->startTimer(name);
2189 return QV4::Encode::undefined();
2192ReturnedValue
ConsoleObject::method_timeEnd(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2194 QV4::Scope scope(b);
2196 THROW_GENERIC_ERROR(
"console.timeEnd(): Invalid arguments");
2198 QString name = argv[0].toQStringNoThrow();
2200 qint64 elapsed = scope.engine->stopTimer(name, &wasRunning);
2202 qDebug(
"%s: %llims", qPrintable(name), elapsed);
2204 return QV4::Encode::undefined();
2207ReturnedValue
ConsoleObject::method_count(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2212 name = argv[0].toQStringNoThrow();
2215 QV4::ExecutionEngine *v4 = scope.engine;
2217 QV4::CppStackFrame *frame = v4->currentStackFrame;
2219 QString scriptName = frame->source();
2221 int value = v4->consoleCountHelper(scriptName, frame->lineNumber(), 0);
2222 QString message = name + QLatin1String(
": ") + QString::number(value);
2224 QMessageLogger(qPrintable(scriptName), frame->lineNumber(),
2225 qPrintable(frame->function()))
2226 .debug(
"%s", qPrintable(message));
2228 return QV4::Encode::undefined();
2231ReturnedValue
ConsoleObject::method_trace(
const FunctionObject *b,
const Value *,
const Value *,
int argc)
2233 QV4::Scope scope(b);
2235 THROW_GENERIC_ERROR(
"console.trace(): Invalid arguments");
2237 QV4::ExecutionEngine *v4 = scope.engine;
2239 QString stack = jsStack(v4);
2241 QV4::CppStackFrame *frame = v4->currentStackFrame;
2242 QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(),
2243 frame->function().toUtf8().constData())
2244 .debug(v4->qmlEngine() ? lcQml() : lcJs(),
"%s", qPrintable(stack));
2246 return QV4::Encode::undefined();
2249ReturnedValue
ConsoleObject::method_warn(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2251 return writeToConsole(b, argv, argc, Warn);
2254ReturnedValue
ConsoleObject::method_assert(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2256 QV4::Scope scope(b);
2258 THROW_GENERIC_ERROR(
"console.assert(): Missing argument");
2260 QV4::ExecutionEngine *v4 = scope.engine;
2262 if (!argv[0].toBoolean()) {
2264 for (
int i = 1, ei = argc; i < ei; ++i) {
2266 message.append(QLatin1Char(
' '));
2268 message.append(argv[i].toQStringNoThrow());
2271 QString stack = jsStack(v4);
2273 QV4::CppStackFrame *frame = v4->currentStackFrame;
2274 QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(),
2275 frame->function().toUtf8().constData())
2276 .critical(
"%s\n%s",qPrintable(message), qPrintable(stack));
2279 return QV4::Encode::undefined();
2282ReturnedValue
ConsoleObject::method_exception(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2284 QV4::Scope scope(b);
2286 THROW_GENERIC_ERROR(
"console.exception(): Missing argument");
2288 return writeToConsole(b, argv, argc, Error,
true);
2291void QV4::GlobalExtensions::init(Object *globalObject, QJSEngine::Extensions extensions)
2293 ExecutionEngine *v4 = globalObject->engine();
2296 if (extensions.testFlag(QJSEngine::TranslationExtension)) {
2297 #if QT_CONFIG(translation)
2298 globalObject->defineDefaultProperty(QStringLiteral(
"qsTranslate"), QV4::GlobalExtensions::method_qsTranslate);
2299 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TRANSLATE_NOOP"), QV4::GlobalExtensions::method_qsTranslateNoOp);
2300 globalObject->defineDefaultProperty(QStringLiteral(
"qsTr"), QV4::GlobalExtensions::method_qsTr);
2301 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TR_NOOP"), QV4::GlobalExtensions::method_qsTrNoOp);
2302 globalObject->defineDefaultProperty(QStringLiteral(
"qsTrId"), QV4::GlobalExtensions::method_qsTrId);
2303 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TRID_NOOP"), QV4::GlobalExtensions::method_qsTrIdNoOp);
2306 ScopedString qtName(scope, v4->newString(QStringLiteral(
"Qt")));
2307 ScopedObject qt(scope, globalObject->get(qtName));
2309 v4->createQtObject();
2312 scope.engine->stringPrototype()->defineDefaultProperty(QStringLiteral(
"arg"), QV4::GlobalExtensions::method_string_arg);
2316 if (extensions.testFlag(QJSEngine::ConsoleExtension)) {
2317 globalObject->defineDefaultProperty(QStringLiteral(
"print"), QV4::ConsoleObject::method_log);
2320 QV4::ScopedObject console(scope, globalObject->engine()->memoryManager->allocate<QV4::ConsoleObject>());
2321 globalObject->defineDefaultProperty(QStringLiteral(
"console"), console);
2324 if (extensions.testFlag(QJSEngine::GarbageCollectionExtension)) {
2325 globalObject->defineDefaultProperty(QStringLiteral(
"gc"), QV4::GlobalExtensions::method_gc);
2330#if QT_CONFIG(translation)
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351ReturnedValue GlobalExtensions::method_qsTranslate(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2353 QV4::Scope scope(b);
2355 THROW_GENERIC_ERROR(
"qsTranslate() requires at least two arguments");
2356 if (!argv[0].isString())
2357 THROW_GENERIC_ERROR(
"qsTranslate(): first argument (context) must be a string");
2358 if (!argv[1].isString())
2359 THROW_GENERIC_ERROR(
"qsTranslate(): second argument (sourceText) must be a string");
2360 if ((argc > 2) && !argv[2].isString())
2361 THROW_GENERIC_ERROR(
"qsTranslate(): third argument (disambiguation) must be a string");
2363 QString context = argv[0].toQStringNoThrow();
2364 QString text = argv[1].toQStringNoThrow();
2366 if (argc > 2) comment = argv[2].toQStringNoThrow();
2369 if (argc > i && argv[i].isString()) {
2370 qWarning(
"qsTranslate(): specifying the encoding as fourth argument is deprecated");
2376 n = argv[i].toInt32();
2378 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2379 if (ep->propertyCapture)
2380 ep->propertyCapture->captureTranslation();
2382 QString result = QCoreApplication::translate(context.toUtf8().constData(),
2383 text.toUtf8().constData(),
2384 comment.toUtf8().constData(),
2387 return Encode(scope.engine->newString(result));
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412ReturnedValue GlobalExtensions::method_qsTranslateNoOp(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2414 QV4::Scope scope(b);
2416 return QV4::Encode::undefined();
2418 return argv[1].asReturnedValue();
2421QString GlobalExtensions::currentTranslationContext(ExecutionEngine *engine)
2424 CppStackFrame *frame = engine->currentStackFrame;
2427 while (frame && context.isEmpty()) {
2428 if (ExecutableCompilationUnit *unit = frame->v4Function->executableCompilationUnit()) {
2429 auto translationContextIndex = unit->unitData()->translationContextIndex();
2430 if (translationContextIndex)
2431 context = unit->stringAt(*translationContextIndex);
2432 if (!context.isEmpty())
2434 QString fileName = unit->fileName();
2435 QUrl url(unit->fileName());
2436 if (url.isValid() && url.isRelative()) {
2437 context = url.fileName();
2439 context = QQmlFile::urlToLocalFileOrQrc(fileName);
2440 if (context.isEmpty() && fileName.startsWith(QLatin1String(
":/")))
2443 context = QFileInfo(context).completeBaseName();
2445 frame = frame->parentFrame();
2448 if (context.isEmpty()) {
2449 if (QQmlRefPointer<QQmlContextData> ctxt = engine->callingQmlContext()) {
2450 QString path = ctxt->urlString();
2451 int lastSlash = path.lastIndexOf(QLatin1Char(
'/'));
2452 int lastDot = path.lastIndexOf(QLatin1Char(
'.'));
2453 int length = lastDot - (lastSlash + 1);
2454 context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString();
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
2494
2495
2496
2497
2498ReturnedValue GlobalExtensions::method_qsTr(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2500 QV4::Scope scope(b);
2502 THROW_GENERIC_ERROR(
"qsTr() requires at least one argument");
2503 if (!argv[0].isString())
2504 THROW_GENERIC_ERROR(
"qsTr(): first argument (sourceText) must be a string");
2505 if ((argc > 1) && !argv[1].isString())
2506 THROW_GENERIC_ERROR(
"qsTr(): second argument (disambiguation) must be a string");
2507 if ((argc > 2) && !argv[2].isNumber())
2508 THROW_GENERIC_ERROR(
"qsTr(): third argument (n) must be a number");
2510 const QString context = currentTranslationContext(scope.engine);
2511 const QString text = argv[0].toQStringNoThrow();
2512 const QString comment = argc > 1 ? argv[1].toQStringNoThrow() : QString();
2513 const int n = argc > 2 ? argv[2].toInt32() : -1;
2515 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2516 if (ep->propertyCapture)
2517 ep->propertyCapture->captureTranslation();
2519 QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(),
2520 comment.toUtf8().constData(), n);
2522 return Encode(scope.engine->newString(result));
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547ReturnedValue GlobalExtensions::method_qsTrNoOp(
const FunctionObject *,
const Value *,
const Value *argv,
int argc)
2550 return QV4::Encode::undefined();
2552 return argv[0].asReturnedValue();
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
2582
2583
2584
2585
2586ReturnedValue GlobalExtensions::method_qsTrId(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2588 QV4::Scope scope(b);
2590 THROW_GENERIC_ERROR(
"qsTrId() requires at least one argument");
2591 if (!argv[0].isString())
2592 THROW_TYPE_ERROR_WITH_MESSAGE(
"qsTrId(): first argument (id) must be a string");
2593 if (argc > 1 && !argv[1].isNumber())
2594 THROW_TYPE_ERROR_WITH_MESSAGE(
"qsTrId(): second argument (n) must be a number");
2598 n = argv[1].toInt32();
2600 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2601 if (ep->propertyCapture)
2602 ep->propertyCapture->captureTranslation();
2604 return Encode(scope.engine->newString(qtTrId(argv[0].toQStringNoThrow().toUtf8().constData(), n)));
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623ReturnedValue GlobalExtensions::method_qsTrIdNoOp(
const FunctionObject *,
const Value *,
const Value *argv,
int argc)
2626 return QV4::Encode::undefined();
2628 return argv[0].asReturnedValue();
2633
2634
2635
2636
2637
2638
2639
2640
2641ReturnedValue GlobalExtensions::method_gc(
const FunctionObject *b,
const Value *,
const Value *,
int)
2643 auto mm = b->engine()->memoryManager;
2646 return QV4::Encode::undefined();
2649ReturnedValue GlobalExtensions::method_string_arg(
const FunctionObject *b,
const Value *thisObject,
const Value *argv,
int argc)
2651 QV4::Scope scope(b);
2653 THROW_GENERIC_ERROR(
"String.arg(): Invalid arguments");
2655 QString value = thisObject->toQString();
2657 QV4::ScopedValue arg(scope, argv[0]);
2658 if (arg->isInteger())
2659 RETURN_RESULT(scope.engine->newString(value.arg(arg->integerValue())));
2660 else if (arg->isDouble())
2661 RETURN_RESULT(scope.engine->newString(value.arg(arg->doubleValue())));
2662 else if (arg->isBoolean())
2663 RETURN_RESULT(scope.engine->newString(value.arg(arg->booleanValue())));
2665 RETURN_RESULT(scope.engine->newString(value.arg(arg->toQString())));
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2691#include "moc_qqmlbuiltinfunctions_p.cpp"
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