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
324
325
326QVariant QtObject::color(
const QString &name)
const
329 const QVariant v = QQmlStringConverters::colorFromString(name, &ok);
333 v4Engine()->throwError(QStringLiteral(
"\"%1\" is not a valid color name").arg(name));
334 return QVariant::fromValue(
nullptr);
338
339
340
341
342
343
344
345QVariant QtObject::rgba(
double r,
double g,
double b,
double a)
const
347 r = qBound(0.0, r, 1.0);
348 g = qBound(0.0, g, 1.0);
349 b = qBound(0.0, b, 1.0);
350 a = qBound(0.0, a, 1.0);
352 return QQml_colorProvider()->fromRgbF(r, g, b, a);
356
357
358
359
360
361
362
363QVariant QtObject::hsla(
double h,
double s,
double l,
double a)
const
366 h = qBound(0.0, h, 1.0);
367 s = qBound(0.0, s, 1.0);
368 l = qBound(0.0, l, 1.0);
369 a = qBound(0.0, a, 1.0);
371 return QQml_colorProvider()->fromHslF(h, s, l, a);
375
376
377
378
379
380
381
382
383QVariant QtObject::hsva(
double h,
double s,
double v,
double a)
const
386 h = qBound(0.0, h, 1.0);
387 s = qBound(0.0, s, 1.0);
388 v = qBound(0.0, v, 1.0);
389 a = qBound(0.0, a, 1.0);
391 return QQml_colorProvider()->fromHsvF(h, s, v, a);
395
396
397
398
399
400
401
402
403
404bool QtObject::colorEqual(
const QVariant &lhs,
const QVariant &rhs)
const
408 QVariant color1 = lhs;
409 if (color1.userType() == QMetaType::QString) {
410 color1 = QQmlStringConverters::colorFromString(color1.toString(), &ok);
412 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid color name"));
415 }
else if (color1.userType() != QMetaType::QColor) {
416 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid arguments"));
420 QVariant color2 = rhs;
421 if (color2.userType() == QMetaType::QString) {
422 color2 = QQmlStringConverters::colorFromString(color2.toString(), &ok);
424 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid color name"));
427 }
else if (color2.userType() != QMetaType::QColor) {
428 v4Engine()->throwError(QStringLiteral(
"Qt.colorEqual(): Invalid arguments"));
432 return color1 == color2;
436
437
438
439
440QRectF QtObject::rect(
double x,
double y,
double width,
double height)
const
442 return QRectF(x, y, width, height);
446
447
448
449
450QPointF QtObject::point(
double x,
double y)
const
452 return QPointF(x, y);
456
457
458
459
460QSizeF QtObject::size(
double w,
double h)
const
466
467
468
469
470
471
472
473
474QVariant QtObject::font(
const QJSValue &fontSpecifier)
const
476 if (!fontSpecifier.isObject()) {
477 v4Engine()->throwError(QStringLiteral(
"Qt.font(): Invalid arguments"));
482 const QVariant v = QQmlValueTypeProvider::createValueType(
483 fontSpecifier, QMetaType(QMetaType::QFont));
488 v4Engine()->throwError(QStringLiteral(
"Qt.font(): Invalid argument: "
489 "no valid font subproperties specified"));
496 result.setProperty(i, e->toScriptValue(parameter));
500void addParameters<
double>(QJSEngine *, QJSValue &result,
int i,
double parameter)
502 result.setProperty(i, QJSValue(parameter));
505template<
typename T,
typename ...Others>
506void addParameters(QJSEngine *e, QJSValue &result,
int i, T parameter, Others... others)
508 addParameters<T>(e, result, i, parameter);
509 addParameters<Others...>(e, result, ++i, others...);
512template<
typename ...T>
517 QJSValue params = e->newArray(
sizeof...(parameters));
518 addParameters(e, params, 0, parameters...);
519 const QVariant variant = QQmlValueTypeProvider::createValueType(params, type);
520 return variant.isValid() ? variant : QVariant(type);
524
525
526
527
528QVariant QtObject::vector2d(
double x,
double y)
const
530 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector2D), x, y);
534
535
536
537
538QVariant QtObject::vector3d(
double x,
double y,
double z)
const
540 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector3D), x, y, z);
544
545
546
547
548QVariant QtObject::vector4d(
double x,
double y,
double z,
double w)
const
550 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QVector4D), x, y, z, w);
554
555
556
557
558QVariant QtObject::quaternion(
double scalar,
double x,
double y,
double z)
const
560 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QQuaternion), scalar, x, y, z);
564
565
566
567
568QVariant QtObject::matrix4x4()
const
570 const QMetaType metaType(QMetaType::QMatrix4x4);
571 const QVariant variant = QQmlValueTypeProvider::createValueType(QJSValue(), metaType);
572 return variant.isValid() ? variant : QVariant(metaType);
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590QVariant QtObject::matrix4x4(
const QJSValue &value)
const
592 if (value.isObject()) {
593 QVariant v = QQmlValueTypeProvider::createValueType(
594 value, QMetaType(QMetaType::QMatrix4x4));
599 v4Engine()->throwError(QStringLiteral(
"Qt.matrix4x4(): Invalid argument: "
600 "not a valid matrix4x4 values array"));
605
606
607
608
609
610
611
612
613
614
615
616
617
618QVariant QtObject::matrix4x4(
double m11,
double m12,
double m13,
double m14,
619 double m21,
double m22,
double m23,
double m24,
620 double m31,
double m32,
double m33,
double m34,
621 double m41,
double m42,
double m43,
double m44)
const
623 return constructFromJSValue(jsEngine(), QMetaType(QMetaType::QMatrix4x4),
624 m11, m12, m13, m14, m21, m22, m23, m24,
625 m31, m32, m33, m34, m41, m42, m43, m44);
631 if (color.isString()) {
632 v = QQmlStringConverters::colorFromString(color.toString(), ok);
634 return QVariant::fromValue(
nullptr);
636 v = color.toVariant();
637 if (v.userType() != QMetaType::QColor) {
639 return QVariant::fromValue(
nullptr);
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664QVariant QtObject::lighter(
const QJSValue &color,
double factor)
const
667 const QVariant v = colorVariantFromJSValue(color, &ok);
668 return ok ? QQml_colorProvider()->lighter(v, factor) : v;
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689QVariant QtObject::darker(
const QJSValue &color,
double factor)
const
692 const QVariant v = colorVariantFromJSValue(color, &ok);
693 return ok ? QQml_colorProvider()->darker(v, factor) : v;
697
698
699
700
701
702
703
704
705QVariant QtObject::alpha(
const QJSValue &baseColor,
double value)
const
708 const QVariant v = colorVariantFromJSValue(baseColor, &ok);
709 return ok ? QQml_colorProvider()->alpha(v, value) : v;
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741QVariant QtObject::tint(
const QJSValue &baseColor,
const QJSValue &tintColor)
const
746 const QVariant v1 = colorVariantFromJSValue(baseColor, &ok);
751 const QVariant v2 = colorVariantFromJSValue(tintColor, &ok);
753 return ok ? QQml_colorProvider()->tint(v1, v2) : v2;
758QString formatDateTimeObjectUsingDateFormat(T formatThis, Qt::DateFormat format) {
762 case Qt::RFC2822Date:
763 case Qt::ISODateWithMs:
764 return formatThis.toString(format);
775 return dateTime.toLocalTime().time();
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
797 const QDate date = QDate::fromString(string, Qt::ISODate);
804 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
805 if (dateTime.isValid()) {
806 qCWarning(lcRootProperties())
807 << string <<
"is a date/time string being passed to formatDate()."
808 <<
"You should only pass date strings to formatDate().";
809 return dateTime.date();
815 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
816 if (dateTime.isValid())
817 return DateObject::dateTimeToDate(dateTime);
820 engine->throwError(QStringLiteral(
"Invalid argument passed to formatDate(): %1").arg(string));
824QString QtObject::formatDate(QDate date,
const QString &format)
const
826 return date.toString(format);
829QString QtObject::formatDate(QDate date, Qt::DateFormat format)
const
831 return formatDateTimeObjectUsingDateFormat(date, format);
834QString QtObject::formatDate(
const QDateTime &dateTime,
const QString &format)
const
836 return DateObject::dateTimeToDate(dateTime).toString(format);
839QString QtObject::formatDate(
const QString &string,
const QString &format)
const
841 if (
const auto qDate = dateFromString(string, v4Engine()))
842 return formatDate(qDate.value(), format);
847QString QtObject::formatDate(
const QDateTime &dateTime, Qt::DateFormat format)
const
849 return formatDateTimeObjectUsingDateFormat(DateObject::dateTimeToDate(dateTime), format);
852QString QtObject::formatDate(
const QString &string, Qt::DateFormat format)
const
854 if (
const auto qDate = dateFromString(string, v4Engine()))
855 return formatDate(qDate.value(), format);
860#if QT_CONFIG(qml_locale)
861QString QtObject::formatDate(QDate date,
const QLocale &locale,
862 QLocale::FormatType formatType)
const
864 return locale.toString(date, formatType);
867QString QtObject::formatDate(
const QDateTime &dateTime,
const QLocale &locale,
868 QLocale::FormatType formatType)
const
870 return locale.toString(DateObject::dateTimeToDate(dateTime), formatType);
873QString QtObject::formatDate(
const QString &string,
const QLocale &locale,
874 QLocale::FormatType formatType)
const
876 if (
const auto qDate = dateFromString(string, v4Engine()))
877 return locale.toString(qDate.value(), formatType);
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
902 const QTime time = QTime::fromString(string, Qt::ISODate);
909 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
910 if (dateTime.isValid()) {
911 qCWarning(lcRootProperties())
912 << string <<
"is a date/time string being passed to formatTime()."
913 <<
"You should only pass time strings to formatTime().";
914 return dateTime.time();
920 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
921 if (dateTime.isValid())
922 return dateTimeToTime(dateTime);
925 engine->throwError(QStringLiteral(
"Invalid argument passed to formatTime(): %1").arg(string));
929QString QtObject::formatTime(QTime time,
const QString &format)
const
931 return time.toString(format);
934QString QtObject::formatTime(
const QDateTime &dateTime,
const QString &format)
const
936 return dateTimeToTime(dateTime).toString(format);
939QString QtObject::formatTime(
const QString &time,
const QString &format)
const
942 if (
auto qTime = timeFromString(time, v4Engine()))
943 return formatTime(qTime.value(), format);
948QString QtObject::formatTime(QTime time, Qt::DateFormat format)
const
950 return formatDateTimeObjectUsingDateFormat(time, format);
953QString QtObject::formatTime(
const QDateTime &dateTime, Qt::DateFormat format)
const
955 return formatDateTimeObjectUsingDateFormat(dateTimeToTime(dateTime), format);
958QString QtObject::formatTime(
const QString &time, Qt::DateFormat format)
const
960 if (
auto qTime = timeFromString(time, v4Engine()))
961 return formatTime(qTime.value(), format);
966#if QT_CONFIG(qml_locale)
967QString QtObject::formatTime(QTime time,
const QLocale &locale,
968 QLocale::FormatType formatType)
const
970 return locale.toString(time, formatType);
973QString QtObject::formatTime(
const QDateTime &dateTime,
const QLocale &locale,
974 QLocale::FormatType formatType)
const
976 return locale.toString(dateTimeToTime(dateTime), formatType);
979QString QtObject::formatTime(
const QString &time,
const QLocale &locale,
980 QLocale::FormatType formatType)
const
982 if (
auto qTime = timeFromString(time, v4Engine()))
983 return locale.toString(qTime.value(), formatType);
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
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1090 const QDateTime dateTime = QDateTime::fromString(string, Qt::ISODate);
1091 if (dateTime.isValid())
1097 const QDateTime dateTime = DateObject::stringToDateTime(string, engine);
1098 if (dateTime.isValid())
1102 engine->throwError(QStringLiteral(
"Invalid argument passed to formatDateTime(): %1").arg(string));
1103 return std::nullopt;
1106QString QtObject::formatDateTime(
const QDateTime &dateTime,
const QString &format)
const
1108 return dateTime.toString(format);
1111QString QtObject::formatDateTime(
const QString &string,
const QString &format)
const
1114 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1115 return formatDateTime(qDateTime.value(), format);
1120QString QtObject::formatDateTime(
const QDateTime &dateTime, Qt::DateFormat format)
const
1122 return formatDateTimeObjectUsingDateFormat(dateTime, format);
1125QString QtObject::formatDateTime(
const QString &string, Qt::DateFormat format)
const
1128 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1129 return formatDateTime(qDateTime.value(), format);
1134#if QT_CONFIG(qml_locale)
1135QString QtObject::formatDateTime(
const QDateTime &dateTime,
const QLocale &locale,
1136 QLocale::FormatType formatType)
const
1138 return locale.toString(dateTime, formatType);
1141QString QtObject::formatDateTime(
const QString &string,
const QLocale &locale,
1142 QLocale::FormatType formatType)
const
1145 if (
const auto qDateTime = dateTimeFromString(string, v4Engine()))
1146 return formatDateTime(qDateTime.value(), locale, formatType);
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163bool QtObject::openUrlExternally(
const QUrl &url)
const
1165 return QQml_guiProvider()->openUrlExternally(resolvedUrl(url));
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178QUrl QtObject::url(
const QUrl &url)
const
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194QUrl QtObject::resolvedUrl(
const QUrl &url)
const
1196 if (QQmlRefPointer<QQmlContextData> ctxt = v4Engine()->callingQmlContext())
1197 return ctxt->resolvedUrl(url);
1198 if (QQmlEngine *engine = qmlEngine())
1199 return engine->baseUrl().resolved(url);
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213QUrl QtObject::resolvedUrl(
const QUrl &url, QObject *context)
const
1216 QQmlData *data = QQmlData::get(context);
1217 if (data && data->outerContext)
1218 return data->outerContext->resolvedUrl(url);
1221 if (QQmlEngine *engine = qmlEngine())
1222 return engine->baseUrl().resolved(url);
1227
1228
1229
1230
1231QStringList QtObject::fontFamilies()
const
1233 return QQml_guiProvider()->fontFamilies();
1237
1238
1239
1240QString QtObject::md5(
const QString &data)
const
1242 return QLatin1String(QCryptographicHash::hash(data.toUtf8(), QCryptographicHash::Md5).toHex());
1246
1247
1248
1249
1250
1251QString QtObject::btoa(
const QString &data)
const
1253 qWarning(
"Qt.btoa(string): This method is deprecated. "
1254 "Its output differs from the common Web API. "
1255 "Use the overloads that take array-likes.");
1256 return QLatin1String(data.toUtf8().toBase64());
1260
1261
1262
1263
1264
1265
1266QString QtObject::atob(
const QString &data)
const
1268 qWarning(
"Qt.atob(string): This method is deprecated. "
1269 "Its output differs from the common Web API. "
1270 "Use the overloads that take array-likes.");
1271 return QString::fromUtf8(QByteArray::fromBase64(data.toLatin1()));
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291QByteArray QtObject::btoa(
const QByteArray &data)
const
1293 return data.toBase64();
1298 QV4::Scope scope(engine);
1299 THROW_DOM(DOMEXCEPTION_INVALID_CHARACTER_ERR,
"Invalid character");
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319QByteArray QtObject::atob(
const QByteArray &data)
const
1322 = QByteArray::fromBase64Encoding(data, QByteArray::AbortOnBase64DecodingErrors);
1323 if (result.decodingStatus == QByteArray::Base64DecodingStatus::Ok)
1324 return result.decoded;
1326 throwInvalidCharacter(v4Engine());
1327 return QByteArray();
1332 const auto fail = [&]() {
1333 throwInvalidCharacter(engine);
1334 return QByteArray();
1339 const auto append = [&](
auto value) {
1340 if (value < 0 || value >= 256)
1342 result.append(
char(value));
1346 for (
const QVariant &entry : data) {
1347 switch (entry.typeId()) {
1348 case QMetaType::Char:
1349 result.append(*
static_cast<
const char *>(entry.constData()));
1351 case QMetaType::Int: {
1352 if (!append(*
static_cast<
const int *>(entry.constData())))
1356 case QMetaType::Double: {
1357 if (!append(*
static_cast<
const double *>(entry.constData())))
1361 case QMetaType::QString: {
1362 const QString *string =
static_cast<
const QString *>(entry.constData());
1363 if (string->length() != 1)
1365 if (!append(string->at(0).unicode()))
1378
1379
1380
1381
1382
1383
1384QByteArray QtObject::btoa(
const QVariantList &data)
const
1386 return btoa(convertVariantList(data, v4Engine()));
1390
1391
1392
1393
1394
1395
1396QByteArray QtObject::atob(
const QVariantList &data)
const
1398 return atob(convertVariantList(data, v4Engine()));
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412void QtObject::quit()
const
1414 if (QQmlEngine *engine = qmlEngine())
1415 QQmlEnginePrivate::get(engine)->sendQuit();
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430void QtObject::exit(
int retCode)
const
1432 if (QQmlEngine *engine = qmlEngine())
1433 QQmlEnginePrivate::get(engine)->sendExit(retCode);
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471QObject *QtObject::createQmlObject(
const QString &qml, QObject *parent,
const QUrl &url)
const
1473 QQmlEngine *engine = qmlEngine();
1475 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): "
1476 "Can only be called on a QML engine."));
1481 static ReturnedValue create(QV4::ExecutionEngine *v4,
const QList<QQmlError> &errors) {
1485 errorstr += QLatin1String(
"Qt.createQmlObject(): failed to create object: ");
1487 QV4::ScopedArrayObject qmlerrors(scope, v4->newArrayObject());
1488 QV4::ScopedObject qmlerror(scope);
1489 QV4::ScopedString s(scope);
1490 QV4::ScopedValue v(scope);
1491 for (
int ii = 0; ii < errors.size(); ++ii) {
1492 const QQmlError &error = errors.at(ii);
1493 errorstr += QLatin1String(
"\n ") + error.toString();
1494 qmlerror = v4->newObject();
1495 qmlerror->put((s = v4->newString(QStringLiteral(
"lineNumber"))), (v = QV4::Value::fromInt32(error.line())));
1496 qmlerror->put((s = v4->newString(QStringLiteral(
"columnNumber"))), (v = QV4::Value::fromInt32(error.column())));
1497 qmlerror->put((s = v4->newString(QStringLiteral(
"fileName"))), (v = v4->newString(error.url().toString())));
1498 qmlerror->put((s = v4->newString(QStringLiteral(
"message"))), (v = v4->newString(error.description())));
1499 qmlerrors->put(ii, qmlerror);
1502 v = v4->newString(errorstr);
1503 ScopedObject errorObject(scope, v4->newErrorObject(v));
1504 errorObject->put((s = v4->newString(QStringLiteral(
"qmlErrors"))), qmlerrors);
1505 return errorObject.asReturnedValue();
1509 QQmlRefPointer<QQmlContextData> context = v4Engine()->callingQmlContext();
1511 context = QQmlContextData::get(QQmlEnginePrivate::get(engine)->rootContext);
1514 QQmlContext *effectiveContext =
nullptr;
1515 if (context->isPragmaLibraryContext())
1516 effectiveContext = engine->rootContext();
1518 effectiveContext = context->asQQmlContext();
1519 Q_ASSERT(effectiveContext);
1524 QUrl resolvedUrl = url;
1525 if (url.isValid() && url.isRelative())
1526 resolvedUrl = context->resolvedUrl(url);
1529 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Missing parent object"));
1533 QQmlRefPointer<QQmlTypeData> typeData = v4Engine()->typeLoader()->getType(
1534 qml.toUtf8(), resolvedUrl, QQmlTypeLoader::Synchronous);
1536 if (!typeData->isCompleteOrError()) {
1537 v4Engine()->throwError(
1538 QStringLiteral(
"Qt.createQmlObject(): Failed to force synchronous loading "
1539 "of asynchronous URL '%1'").arg(resolvedUrl.toString()));
1543 QQmlComponent component(engine);
1544 QQmlComponentPrivate *componentPrivate = QQmlComponentPrivate::get(&component);
1545 componentPrivate->fromTypeData(typeData);
1546 componentPrivate->setProgress(1.0);
1548 Scope scope(v4Engine());
1549 if (component.isError()) {
1550 ScopedValue v(scope, Error::create(scope.engine, component.errors()));
1551 scope.engine->throwError(v);
1555 if (!component.isReady()) {
1556 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Component is not ready"));
1560 if (!effectiveContext->isValid()) {
1561 v4Engine()->throwError(QStringLiteral(
"Qt.createQmlObject(): Cannot create a component "
1562 "in an invalid context"));
1566 QObject *obj = component.beginCreate(effectiveContext);
1568 QQmlData::get(obj,
true)->explicitIndestructibleSet =
false;
1569 QQmlData::get(obj)->indestructible =
false;
1571 obj->setParent(parent);
1573 QList<QQmlPrivate::AutoParentFunction> functions = QQmlMetaType::parentFunctions();
1574 for (
int ii = 0; ii < functions.size(); ++ii) {
1575 if (QQmlPrivate::Parented == functions.at(ii)(obj, parent))
1579 component.completeCreate();
1581 v4Engine()->trimCompilationUnitsForUrl(resolvedUrl);
1582 if (component.isError()) {
1583 ScopedValue v(scope, Error::create(scope.engine, component.errors()));
1584 scope.engine->throwError(v);
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
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1663QQmlComponent *QtObject::createComponent(
const QUrl &url, QObject *parent)
const
1665 return createComponent(url, QQmlComponent::PreferSynchronous, parent);
1671 engine->throwError(QStringLiteral(
"Invalid compilation mode %1").arg(
int(mode)));
1675QQmlComponent *QtObject::createComponent(
const QUrl &url, QQmlComponent::CompilationMode mode,
1676 QObject *parent)
const
1678 if (mode != QQmlComponent::Asynchronous && mode != QQmlComponent::PreferSynchronous) {
1679 throw_invalid_compilation_mode(v4Engine(), mode);
1686 QQmlEngine *engine = qmlEngine();
1690 auto [context, effectiveContext] = getContexts();
1694 QQmlComponent *c =
new QQmlComponent(engine, context->resolvedUrl(url), mode, parent);
1695 QQmlComponentPrivate::get(c)->setCreationContext(std::move(effectiveContext));
1696 QQmlData::get(c,
true)->explicitIndestructibleSet =
false;
1697 QQmlData::get(c)->indestructible =
false;
1701QQmlComponent *QtObject::createComponent(
const QString &moduleUri,
const QString &typeName,
1702 QObject *parent)
const
1704 return createComponent(moduleUri, typeName, QQmlComponent::PreferSynchronous, parent);
1707QQmlComponent *QtObject::createComponent(
const QString &moduleUri,
const QString &typeName, QQmlComponent::CompilationMode mode, QObject *parent)
const
1709 if (mode != QQmlComponent::Asynchronous && mode != QQmlComponent::PreferSynchronous) {
1710 throw_invalid_compilation_mode(v4Engine(), mode);
1714 QQmlEngine *engine = qmlEngine();
1718 if (moduleUri.isEmpty() || typeName.isEmpty())
1721 auto [context, effectiveContext] = getContexts();
1725 QQmlComponent *c =
new QQmlComponent(engine, moduleUri, typeName, mode, parent);
1726 if (c->isError() && !parent && moduleUri.endsWith(u".qml")) {
1727 v4Engine()->throwTypeError(
1728 QStringLiteral(
"Invalid arguments; did you swap mode and parent"));
1730 QQmlComponentPrivate::get(c)->setCreationContext(std::move(effectiveContext));
1731 QQmlData::get(c,
true)->explicitIndestructibleSet =
false;
1732 QQmlData::get(c)->indestructible =
false;
1736#if QT_CONFIG(translation)
1737QString QtObject::uiLanguage()
const
1739 if (
const QJSEngine *e = jsEngine())
1740 return e->uiLanguage();
1744void QtObject::setUiLanguage(
const QString &uiLanguage)
1746 if (QJSEngine *e = jsEngine())
1747 e->setUiLanguage(uiLanguage);
1750QBindable<QString> QtObject::uiLanguageBindable()
1752 if (QJSEngine *e = jsEngine())
1753 return QBindable<QString>(&QJSEnginePrivate::get(e)->uiLanguage);
1754 return QBindable<QString>();
1758#if QT_CONFIG(qml_locale)
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779QLocale QtObject::locale()
const
1784QLocale QtObject::locale(
const QString &name)
const
1786 return QLocale(name);
1790void Heap::QQmlBindingFunction::init(
const QV4::JavaScriptFunctionObject *bindingFunction)
1792 Scope scope(bindingFunction->engine());
1793 ScopedContext context(scope, bindingFunction->scope());
1794 JavaScriptFunctionObject::init(context, bindingFunction->function());
1795 this->bindingFunction.set(internalClass->engine, bindingFunction->d());
1799 const FunctionObject *f,
const Value *,
const Value *,
int)
1802 return f->engine()->throwTypeError(QStringLiteral(
"Bindings must not be called directly."));
1807 QV4::CppStackFrame *frame = engine()->currentStackFrame;
1808 if (frame->v4Function)
1809 return QQmlSourceLocation(frame->source(), frame->lineNumber(), 0);
1811 return bindingFunction()->function->sourceLocation();
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
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857QJSValue QtObject::binding(
const QJSValue &function)
const
1859 const QV4::JavaScriptFunctionObject *f
1860 = QJSValuePrivate::asManagedType<JavaScriptFunctionObject>(&function);
1861 QV4::ExecutionEngine *e = v4Engine();
1863 return QJSValuePrivate::fromReturnedValue(
1866 "binding(): argument (binding expression) must be a function")));
1869 return QJSValuePrivate::fromReturnedValue(
1870 Encode(e->memoryManager->allocate<QQmlBindingFunction>(f)));
1873void QtObject::callLater(QQmlV4FunctionPtr args)
1875 m_engine->delayedCallQueue()->addUniquelyAndExecuteLater(m_engine, args);
1879
1880
1881
1882
1883
1884
1885double QtObject::enumStringToValue(
const QJSManagedValue &enumType,
const QString &string)
1887 return retrieveFromEnum<
double>(
1889 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1890 return type.scopedEnumValue(typeLoader, enumIndex, string, ok);
1891 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1892 return type.unscopedEnumValue(typeLoader, enumIndex, string, ok);
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908QString QtObject::enumValueToString(
const QJSManagedValue &enumType,
double value)
1911 if (std::isnan(value)) {
1912 m_engine->throwReferenceError(
"Invalid second argument, entry"_L1);
1916 return retrieveFromEnum<QString>(
1918 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1919 return type.scopedEnumKey(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1920 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1921 return type.unscopedEnumKey(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1926
1927
1928
1929
1930
1931
1932
1933QStringList QtObject::enumValueToStrings(
const QJSManagedValue &enumType,
double value)
1936 if (std::isnan(value)) {
1937 m_engine->throwReferenceError(
"Invalid second argument, entry"_L1);
1941 return retrieveFromEnum<QStringList>(
1943 [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1944 return type.scopedEnumKeys(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1945 }, [&](
const QQmlType &type, QQmlTypeLoader *typeLoader,
int enumIndex,
bool *ok) {
1946 return type.unscopedEnumKeys(typeLoader, enumIndex, QtPrivate::qSaturateRound(value), ok);
1950QQmlPlatform *QtObject::platform()
1953 m_platform =
new QQmlPlatform(
this);
1957QQmlApplication *QtObject::application()
1961 m_application = QQml_guiProvider()->application(
this);
1963 return m_application;
1966QObject *QtObject::inputMethod()
const
1968 return QQml_guiProvider()->inputMethod();
1971QObject *QtObject::styleHints()
const
1973 return QQml_guiProvider()->styleHints();
1979 QV4::Scope scope(internalClass->engine);
1980 QV4::ScopedObject o(scope,
this);
1982 o->defineDefaultProperty(QStringLiteral(
"debug"), QV4::ConsoleObject::method_log);
1983 o->defineDefaultProperty(QStringLiteral(
"log"), QV4::ConsoleObject::method_log);
1984 o->defineDefaultProperty(QStringLiteral(
"info"), QV4::ConsoleObject::method_info);
1985 o->defineDefaultProperty(QStringLiteral(
"warn"), QV4::ConsoleObject::method_warn);
1986 o->defineDefaultProperty(QStringLiteral(
"error"), QV4::ConsoleObject::method_error);
1987 o->defineDefaultProperty(QStringLiteral(
"assert"), QV4::ConsoleObject::method_assert);
1989 o->defineDefaultProperty(QStringLiteral(
"count"), QV4::ConsoleObject::method_count);
1990 o->defineDefaultProperty(QStringLiteral(
"profile"), QV4::ConsoleObject::method_profile);
1991 o->defineDefaultProperty(QStringLiteral(
"profileEnd"), QV4::ConsoleObject::method_profileEnd);
1992 o->defineDefaultProperty(QStringLiteral(
"time"), QV4::ConsoleObject::method_time);
1993 o->defineDefaultProperty(QStringLiteral(
"timeEnd"), QV4::ConsoleObject::method_timeEnd);
1994 o->defineDefaultProperty(QStringLiteral(
"trace"), QV4::ConsoleObject::method_trace);
1995 o->defineDefaultProperty(QStringLiteral(
"exception"), QV4::ConsoleObject::method_exception);
2010 for (CppStackFrame *f = engine->currentStackFrame; f && i < 10; f = f->parentFrame(), ++i) {
2013 if (f->isJSTypesFrame() &&
static_cast<JSTypesStackFrame *>(f)->isTailCalling()) {
2014 stackFrame = QStringLiteral(
"[elided tail calls]");
2016 const int line = f->lineNumber();
2017 if (line != f->missingLineNumber()) {
2018 stackFrame = QStringLiteral(
"%1 (%2:%3)").arg(
2019 f->function(), f->source(), QString::number(qAbs(line)));
2021 stackFrame = QStringLiteral(
"%1 (%2)").arg(
2022 f->function(), f->source());
2027 stack += QLatin1Char(
'\n');
2028 stack += stackFrame;
2035 ScopedValue val(scope);
2037 alreadySeen.insert(array->d());
2039 ScopedObject detached(scope);
2040 if (Sequence *reference = array->as<Sequence>())
2041 detached = ReferenceObject::detached(reference->d());
2045 result += QLatin1Char(
'[');
2046 const uint length = detached->getLength();
2047 for (uint i = 0; i < length; ++i) {
2049 result += QLatin1Char(
',');
2050 val = detached->get(i);
2051 if (val->isManaged() && val->managed()->isArrayLike())
2052 if (!alreadySeen.contains(val->objectValue()->d()))
2053 result += serializeArray(val->objectValue(), v4, alreadySeen);
2055 result += QLatin1String(
"[Circular]");
2057 result += val->toQStringNoThrow();
2059 result += QLatin1Char(
']');
2061 alreadySeen.remove(array->d());
2068 const QLoggingCategory *loggingCategory =
nullptr;
2070 QV4::Scope scope(b);
2071 QV4::ExecutionEngine *v4 = scope.engine;
2075 if (
const QObjectWrapper* wrapper = argv[0].as<QObjectWrapper>()) {
2076 if (QQmlLoggingCategoryBase *category
2077 = qobject_cast<QQmlLoggingCategoryBase *>(wrapper->object())) {
2078 if (category->category())
2079 loggingCategory = category->category();
2081 THROW_GENERIC_ERROR(
"A QmlLoggingCatgory was provided without a valid name");
2088 for (
int i = start, ei = argc; i < ei; ++i) {
2090 result.append(QLatin1Char(
' '));
2092 QSet<QV4::Heap::Object *> alreadySeenElements;
2093 if (argv[i].isManaged() && argv[i].managed()->isArrayLike())
2094 result.append(serializeArray(argv[i].objectValue(), v4, alreadySeenElements));
2096 result.append(argv[i].toQStringNoThrow());
2100 result += QLatin1Char(
'\n') + jsStack(v4);
2102 if (!loggingCategory)
2103 loggingCategory = v4->qmlEngine() ? &lcQml() : &lcJs();
2104 QV4::CppStackFrame *frame = v4->currentStackFrame;
2105 const QByteArray baSource = frame ? frame->source().toUtf8() : QByteArray();
2106 const QByteArray baFunction = frame ? frame->function().toUtf8() : QByteArray();
2107 QMessageLogger logger(baSource.constData(), frame ? frame->lineNumber() : 0,
2108 baFunction.constData(), loggingCategory->categoryName());
2112 if (loggingCategory->isDebugEnabled())
2113 logger.debug(
"%s", result.toUtf8().constData());
2116 if (loggingCategory->isInfoEnabled())
2117 logger.info(
"%s", result.toUtf8().constData());
2120 if (loggingCategory->isWarningEnabled())
2121 logger.warning(
"%s", result.toUtf8().constData());
2124 if (loggingCategory->isCriticalEnabled())
2125 logger.critical(
"%s", result.toUtf8().constData());
2131 return Encode::undefined();
2136ReturnedValue
ConsoleObject::method_error(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2138 return writeToConsole(b, argv, argc, Error);
2141ReturnedValue
ConsoleObject::method_log(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2146 return writeToConsole(b, argv, argc, Log);
2149ReturnedValue
ConsoleObject::method_info(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2151 return writeToConsole(b, argv, argc, Info);
2154ReturnedValue
ConsoleObject::method_profile(
const FunctionObject *b,
const Value *,
const Value *,
int)
2156 QV4::Scope scope(b);
2157 QV4::ExecutionEngine *v4 = scope.engine;
2159 QV4::CppStackFrame *frame = v4->currentStackFrame;
2160 const QByteArray baSource = frame->source().toUtf8();
2161 const QByteArray baFunction = frame->function().toUtf8();
2162 QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData());
2163 QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>();
2165 logger.warning(
"Cannot start profiling because debug service is disabled. Start with -qmljsdebugger=port:XXXXX.");
2167 service->startProfiling(v4->jsEngine());
2168 logger.debug(
"Profiling started.");
2171 return QV4::Encode::undefined();
2174ReturnedValue
ConsoleObject::method_profileEnd(
const FunctionObject *b,
const Value *,
const Value *,
int)
2176 QV4::Scope scope(b);
2177 QV4::ExecutionEngine *v4 = scope.engine;
2179 QV4::CppStackFrame *frame = v4->currentStackFrame;
2180 const QByteArray baSource = frame->source().toUtf8();
2181 const QByteArray baFunction = frame->function().toUtf8();
2182 QMessageLogger logger(baSource.constData(), frame->lineNumber(), baFunction.constData());
2184 QQmlProfilerService *service = QQmlDebugConnector::service<QQmlProfilerService>();
2186 logger.warning(
"Ignoring console.profileEnd(): the debug service is disabled.");
2188 service->stopProfiling(v4->jsEngine());
2189 logger.debug(
"Profiling ended.");
2192 return QV4::Encode::undefined();
2195ReturnedValue
ConsoleObject::method_time(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2197 QV4::Scope scope(b);
2199 THROW_GENERIC_ERROR(
"console.time(): Invalid arguments");
2201 QString name = argv[0].toQStringNoThrow();
2202 scope.engine->startTimer(name);
2203 return QV4::Encode::undefined();
2206ReturnedValue
ConsoleObject::method_timeEnd(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2208 QV4::Scope scope(b);
2210 THROW_GENERIC_ERROR(
"console.timeEnd(): Invalid arguments");
2212 QString name = argv[0].toQStringNoThrow();
2214 qint64 elapsed = scope.engine->stopTimer(name, &wasRunning);
2216 qDebug(
"%s: %llims", qPrintable(name), elapsed);
2218 return QV4::Encode::undefined();
2221ReturnedValue
ConsoleObject::method_count(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2226 name = argv[0].toQStringNoThrow();
2229 QV4::ExecutionEngine *v4 = scope.engine;
2231 QV4::CppStackFrame *frame = v4->currentStackFrame;
2233 QString scriptName = frame->source();
2235 int value = v4->consoleCountHelper(scriptName, frame->lineNumber(), 0);
2236 QString message = name + QLatin1String(
": ") + QString::number(value);
2238 QMessageLogger(qPrintable(scriptName), frame->lineNumber(),
2239 qPrintable(frame->function()))
2240 .debug(
"%s", qPrintable(message));
2242 return QV4::Encode::undefined();
2245ReturnedValue
ConsoleObject::method_trace(
const FunctionObject *b,
const Value *,
const Value *,
int argc)
2247 QV4::Scope scope(b);
2249 THROW_GENERIC_ERROR(
"console.trace(): Invalid arguments");
2251 QV4::ExecutionEngine *v4 = scope.engine;
2253 QString stack = jsStack(v4);
2255 QV4::CppStackFrame *frame = v4->currentStackFrame;
2256 QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(),
2257 frame->function().toUtf8().constData())
2258 .debug(v4->qmlEngine() ? lcQml() : lcJs(),
"%s", qPrintable(stack));
2260 return QV4::Encode::undefined();
2263ReturnedValue
ConsoleObject::method_warn(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2265 return writeToConsole(b, argv, argc, Warn);
2268ReturnedValue
ConsoleObject::method_assert(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2270 QV4::Scope scope(b);
2272 THROW_GENERIC_ERROR(
"console.assert(): Missing argument");
2274 QV4::ExecutionEngine *v4 = scope.engine;
2276 if (!argv[0].toBoolean()) {
2278 for (
int i = 1, ei = argc; i < ei; ++i) {
2280 message.append(QLatin1Char(
' '));
2282 message.append(argv[i].toQStringNoThrow());
2285 QString stack = jsStack(v4);
2287 QV4::CppStackFrame *frame = v4->currentStackFrame;
2288 QMessageLogger(frame->source().toUtf8().constData(), frame->lineNumber(),
2289 frame->function().toUtf8().constData())
2290 .critical(
"%s\n%s",qPrintable(message), qPrintable(stack));
2293 return QV4::Encode::undefined();
2296ReturnedValue
ConsoleObject::method_exception(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2298 QV4::Scope scope(b);
2300 THROW_GENERIC_ERROR(
"console.exception(): Missing argument");
2302 return writeToConsole(b, argv, argc, Error,
true);
2305void QV4::GlobalExtensions::init(Object *globalObject, QJSEngine::Extensions extensions)
2307 ExecutionEngine *v4 = globalObject->engine();
2310 if (extensions.testFlag(QJSEngine::TranslationExtension)) {
2311 #if QT_CONFIG(translation)
2312 globalObject->defineDefaultProperty(QStringLiteral(
"qsTranslate"), QV4::GlobalExtensions::method_qsTranslate);
2313 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TRANSLATE_NOOP"), QV4::GlobalExtensions::method_qsTranslateNoOp);
2314 globalObject->defineDefaultProperty(QStringLiteral(
"qsTr"), QV4::GlobalExtensions::method_qsTr);
2315 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TR_NOOP"), QV4::GlobalExtensions::method_qsTrNoOp);
2316 globalObject->defineDefaultProperty(QStringLiteral(
"qsTrId"), QV4::GlobalExtensions::method_qsTrId);
2317 globalObject->defineDefaultProperty(QStringLiteral(
"QT_TRID_NOOP"), QV4::GlobalExtensions::method_qsTrIdNoOp);
2320 ScopedString qtName(scope, v4->newString(QStringLiteral(
"Qt")));
2321 ScopedObject qt(scope, globalObject->get(qtName));
2323 v4->createQtObject();
2326 scope.engine->stringPrototype()->defineDefaultProperty(QStringLiteral(
"arg"), QV4::GlobalExtensions::method_string_arg);
2330 if (extensions.testFlag(QJSEngine::ConsoleExtension)) {
2331 globalObject->defineDefaultProperty(QStringLiteral(
"print"), QV4::ConsoleObject::method_log);
2334 QV4::ScopedObject console(scope, globalObject->engine()->memoryManager->allocate<QV4::ConsoleObject>());
2335 globalObject->defineDefaultProperty(QStringLiteral(
"console"), console);
2338 if (extensions.testFlag(QJSEngine::GarbageCollectionExtension)) {
2339 globalObject->defineDefaultProperty(QStringLiteral(
"gc"), QV4::GlobalExtensions::method_gc);
2344#if QT_CONFIG(translation)
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365ReturnedValue GlobalExtensions::method_qsTranslate(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2367 QV4::Scope scope(b);
2369 THROW_GENERIC_ERROR(
"qsTranslate() requires at least two arguments");
2370 if (!argv[0].isString())
2371 THROW_GENERIC_ERROR(
"qsTranslate(): first argument (context) must be a string");
2372 if (!argv[1].isString())
2373 THROW_GENERIC_ERROR(
"qsTranslate(): second argument (sourceText) must be a string");
2374 if ((argc > 2) && !argv[2].isString())
2375 THROW_GENERIC_ERROR(
"qsTranslate(): third argument (disambiguation) must be a string");
2377 QString context = argv[0].toQStringNoThrow();
2378 QString text = argv[1].toQStringNoThrow();
2380 if (argc > 2) comment = argv[2].toQStringNoThrow();
2383 if (argc > i && argv[i].isString()) {
2384 qWarning(
"qsTranslate(): specifying the encoding as fourth argument is deprecated");
2390 n = argv[i].toInt32();
2392 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2393 if (ep->propertyCapture)
2394 ep->propertyCapture->captureTranslation();
2396 QString result = QCoreApplication::translate(context.toUtf8().constData(),
2397 text.toUtf8().constData(),
2398 comment.toUtf8().constData(),
2401 return Encode(scope.engine->newString(result));
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426ReturnedValue GlobalExtensions::method_qsTranslateNoOp(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2428 QV4::Scope scope(b);
2430 return QV4::Encode::undefined();
2432 return argv[1].asReturnedValue();
2435QString GlobalExtensions::currentTranslationContext(ExecutionEngine *engine)
2438 CppStackFrame *frame = engine->currentStackFrame;
2441 while (frame && context.isEmpty()) {
2442 if (ExecutableCompilationUnit *unit = frame->v4Function->executableCompilationUnit()) {
2443 auto translationContextIndex = unit->unitData()->translationContextIndex();
2444 if (translationContextIndex)
2445 context = unit->stringAt(*translationContextIndex);
2446 if (!context.isEmpty())
2448 QString fileName = unit->fileName();
2449 QUrl url(unit->fileName());
2450 if (url.isValid() && url.isRelative()) {
2451 context = url.fileName();
2453 context = QQmlFile::urlToLocalFileOrQrc(fileName);
2454 if (context.isEmpty() && fileName.startsWith(QLatin1String(
":/")))
2457 context = QFileInfo(context).completeBaseName();
2459 frame = frame->parentFrame();
2462 if (context.isEmpty()) {
2463 if (QQmlRefPointer<QQmlContextData> ctxt = engine->callingQmlContext()) {
2464 QString path = ctxt->urlString();
2465 int lastSlash = path.lastIndexOf(QLatin1Char(
'/'));
2466 int lastDot = path.lastIndexOf(QLatin1Char(
'.'));
2467 int length = lastDot - (lastSlash + 1);
2468 context = (lastSlash > -1) ? path.mid(lastSlash + 1, (length > -1) ? length : -1) : QString();
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512ReturnedValue GlobalExtensions::method_qsTr(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2514 QV4::Scope scope(b);
2516 THROW_GENERIC_ERROR(
"qsTr() requires at least one argument");
2517 if (!argv[0].isString())
2518 THROW_GENERIC_ERROR(
"qsTr(): first argument (sourceText) must be a string");
2519 if ((argc > 1) && !argv[1].isString())
2520 THROW_GENERIC_ERROR(
"qsTr(): second argument (disambiguation) must be a string");
2521 if ((argc > 2) && !argv[2].isNumber())
2522 THROW_GENERIC_ERROR(
"qsTr(): third argument (n) must be a number");
2524 const QString context = currentTranslationContext(scope.engine);
2525 const QString text = argv[0].toQStringNoThrow();
2526 const QString comment = argc > 1 ? argv[1].toQStringNoThrow() : QString();
2527 const int n = argc > 2 ? argv[2].toInt32() : -1;
2529 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2530 if (ep->propertyCapture)
2531 ep->propertyCapture->captureTranslation();
2533 QString result = QCoreApplication::translate(context.toUtf8().constData(), text.toUtf8().constData(),
2534 comment.toUtf8().constData(), n);
2536 return Encode(scope.engine->newString(result));
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561ReturnedValue GlobalExtensions::method_qsTrNoOp(
const FunctionObject *,
const Value *,
const Value *argv,
int argc)
2564 return QV4::Encode::undefined();
2566 return argv[0].asReturnedValue();
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600ReturnedValue GlobalExtensions::method_qsTrId(
const FunctionObject *b,
const Value *,
const Value *argv,
int argc)
2602 QV4::Scope scope(b);
2604 THROW_GENERIC_ERROR(
"qsTrId() requires at least one argument");
2605 if (!argv[0].isString())
2606 THROW_TYPE_ERROR_WITH_MESSAGE(
"qsTrId(): first argument (id) must be a string");
2607 if (argc > 1 && !argv[1].isNumber())
2608 THROW_TYPE_ERROR_WITH_MESSAGE(
"qsTrId(): second argument (n) must be a number");
2612 n = argv[1].toInt32();
2614 if (QQmlEnginePrivate *ep = (scope.engine->qmlEngine() ? QQmlEnginePrivate::get(scope.engine->qmlEngine()) :
nullptr))
2615 if (ep->propertyCapture)
2616 ep->propertyCapture->captureTranslation();
2618 return Encode(scope.engine->newString(qtTrId(argv[0].toQStringNoThrow().toUtf8().constData(), n)));
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637ReturnedValue GlobalExtensions::method_qsTrIdNoOp(
const FunctionObject *,
const Value *,
const Value *argv,
int argc)
2640 return QV4::Encode::undefined();
2642 return argv[0].asReturnedValue();
2647
2648
2649
2650
2651
2652
2653
2654
2655ReturnedValue GlobalExtensions::method_gc(
const FunctionObject *b,
const Value *,
const Value *,
int)
2657 auto mm = b->engine()->memoryManager;
2660 return QV4::Encode::undefined();
2663ReturnedValue GlobalExtensions::method_string_arg(
const FunctionObject *b,
const Value *thisObject,
const Value *argv,
int argc)
2665 QV4::Scope scope(b);
2667 THROW_GENERIC_ERROR(
"String.arg(): Invalid arguments");
2669 QString value = thisObject->toQString();
2671 QV4::ScopedValue arg(scope, argv[0]);
2672 if (arg->isInteger())
2673 RETURN_RESULT(scope.engine->newString(value.arg(arg->integerValue())));
2674 else if (arg->isDouble())
2675 RETURN_RESULT(scope.engine->newString(value.arg(arg->doubleValue())));
2676 else if (arg->isBoolean())
2677 RETURN_RESULT(scope.engine->newString(value.arg(arg->booleanValue())));
2679 RETURN_RESULT(scope.engine->newString(value.arg(arg->toQString())));
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2705#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