History

Merge branch master into protocol_changes

HifiExperiments committed 2 years ago

Commit ee705d21 parent f9e729b370 files · +11827 −6045Browse files

Showing the changes to libraries/script-engine/src/ScriptManager.cpp (1 of 370 files). Show all

Unified · Split

libraries/script-engine/src/ScriptManager.cpp+132−25
@@ -225,7 +225,12 @@ QString encodeEntityIdIntoEntityUrl(const QString& url, const QString& entityID) · 224 unmodified lines
225225
226226 QString ScriptManager::logException(const ScriptValue& exception) {
227227 auto message = formatException(exception, _enableExtendedJSExceptions.get());
228− scriptErrorMessage(message);
228+ auto context = _engine->currentContext();
229+ if (context) {
230+ scriptErrorMessage(message, context->currentFileName(), context->currentLineNumber());
231+ } else {
232+ scriptErrorMessage(message, "", -1);
233+ }
229234 return message;
230235 }
231236
@@ -330,6 +335,11 @@ ScriptManager::ScriptManager(Context context, const QString& scriptContents, con · 98 unmodified lines
330335 });
331336 }
332337
338+ //Gather entity script messages for transmission when running server side.
339+ if (_type == Type::ENTITY_SERVER) {
340+ ;
341+ }
342+
333343 if (!_areMetaTypesInitialized) {
334344 initMetaTypes();
335345 }
@@ -468,10 +478,10 @@ void ScriptManager::waitTillDoneRunning(bool shutdown) { · 132 unmodified lines
468478 }
469479 }
470480 #else
471− auto startedWaiting = usecTimestampNow();
481+ //auto startedWaiting = usecTimestampNow();
472482 while (!_isDoneRunning) {
473483 // If the final evaluation takes too long, then tell the script engine to stop running
474− auto elapsedUsecs = usecTimestampNow() - startedWaiting;
484+ //auto elapsedUsecs = usecTimestampNow() - startedWaiting;
475485 // TODO: This part was very unsafe and was causing crashes all the time.
476486 // I disabled it for now until we find a safer solution.
477487 // With it disabled now we get clean shutdowns and restarts.
@@ -514,7 +524,7 @@ void ScriptManager::waitTillDoneRunning(bool shutdown) { · 36 unmodified lines
514524 }
515525 #endif
516526
517− scriptInfoMessage("Script Engine has stopped:" + getFilename());
527+ scriptInfoMessage("Script Engine has stopped:" + getFilename(), "", -1);
518528 }
519529 }
520530
@@ -532,6 +542,10 @@ QString ScriptManager::getFilename() const { · 11 unmodified lines
532542 return lastPart;
533543 }
534544
545+QString ScriptManager::getAbsoluteFilename() const {
546+ return _fileNameString;
547+}
548+
535549 bool ScriptManager::hasValidScriptSuffix(const QString& scriptFileName) {
536550 QFileInfo fileInfo(scriptFileName);
537551 QString scriptSuffixToLower = fileInfo.completeSuffix().toLower();
@@ -549,7 +563,7 @@ void ScriptManager::loadURL(const QUrl& scriptURL, bool reload) { · 11 unmodified lines
549563
550564 // Check that script has a supported file extension
551565 if (!hasValidScriptSuffix(_fileNameString)) {
552− scriptErrorMessage("File extension of file: " + _fileNameString + " is not a currently supported script type");
566+ scriptErrorMessage("File extension of file: " + _fileNameString + " is not a currently supported script type", _fileNameString, -1);
553567 emit errorLoadingScript(_fileNameString);
554568 return;
555569 }
@@ -559,7 +573,7 @@ void ScriptManager::loadURL(const QUrl& scriptURL, bool reload) { · 3 unmodified lines
559573 scriptCache->getScriptContents(url.toString(), [this](const QString& url, const QString& scriptContents, bool isURL, bool success, const QString&status) {
560574 qCDebug(scriptengine) << "loadURL" << url << status << QThread::currentThread();
561575 if (!success) {
562− scriptErrorMessage("ERROR Loading file (" + status + "):" + url);
576+ scriptErrorMessage("ERROR Loading file (" + status + "):" + url, url, -1);
563577 emit errorLoadingScript(_fileNameString);
564578 return;
565579 }
@@ -570,24 +584,54 @@ void ScriptManager::loadURL(const QUrl& scriptURL, bool reload) { · 4 unmodified lines
570584 }, reload, maxRetries);
571585 }
572586
573−void ScriptManager::scriptErrorMessage(const QString& message) {
587+void ScriptManager::scriptErrorMessage(const QString& message, const QString& fileName, int lineNumber) {
574588 qCCritical(scriptengine, "[%s] %s", qUtf8Printable(getFilename()), qUtf8Printable(message));
575589 emit errorMessage(message, getFilename());
590+ if (!currentEntityIdentifier.isInvalidID()) {
591+ emit errorEntityMessage(message, fileName, lineNumber, currentEntityIdentifier, isEntityServerScript());
592+ } else {
593+ if (isEntityServerScript()) {
594+ emit errorEntityMessage(message, fileName, lineNumber, EntityItemID(), isEntityServerScript());
595+ }
596+ }
576597 }
577598
578−void ScriptManager::scriptWarningMessage(const QString& message) {
599+void ScriptManager::scriptWarningMessage(const QString& message, const QString& fileName, int lineNumber) {
579600 qCWarning(scriptengine, "[%s] %s", qUtf8Printable(getFilename()), qUtf8Printable(message));
580601 emit warningMessage(message, getFilename());
602+ if (!currentEntityIdentifier.isInvalidID()) {
603+ emit warningEntityMessage(message, fileName, lineNumber, currentEntityIdentifier, isEntityServerScript());
604+ } else {
605+ if (isEntityServerScript()) {
606+ emit warningEntityMessage(message, fileName, lineNumber, EntityItemID(), isEntityServerScript());
607+ }
608+ }
581609 }
582610
583−void ScriptManager::scriptInfoMessage(const QString& message) {
611+void ScriptManager::scriptInfoMessage(const QString& message, const QString& fileName, int lineNumber) {
584612 qCInfo(scriptengine, "[%s] %s", qUtf8Printable(getFilename()), qUtf8Printable(message));
585613 emit infoMessage(message, getFilename());
614+ if (!currentEntityIdentifier.isInvalidID()) {
615+ emit infoEntityMessage(message, fileName, lineNumber, currentEntityIdentifier, isEntityServerScript());
616+ } else {
617+ if (isEntityServerScript()) {
618+ emit infoEntityMessage(message, fileName, lineNumber, EntityItemID(), isEntityServerScript());
619+ }
620+ }
586621 }
587622
588−void ScriptManager::scriptPrintedMessage(const QString& message) {
623+void ScriptManager::scriptPrintedMessage(const QString& message, const QString& fileName, int lineNumber) {
589624 qCDebug(scriptengine, "[%s] %s", qUtf8Printable(getFilename()), qUtf8Printable(message));
590625 emit printedMessage(message, getFilename());
626+ if (!currentEntityIdentifier.isInvalidID()) {
627+ emit printedEntityMessage(message, fileName, lineNumber, currentEntityIdentifier, isEntityServerScript());
628+ } else {
629+ if (isEntityServerScript()) {
630+ // TODO: Some callbacks like for example websockets one right now
631+ // don't set currentEntityIdentifier and there doesn't seem to be easy way to add it currently
632+ emit printedEntityMessage(message, fileName, lineNumber, EntityItemID(), isEntityServerScript());
633+ }
634+ }
591635 }
592636
593637 void ScriptManager::clearDebugLogWindow() {
@@ -912,7 +956,7 @@ void ScriptManager::run() { · 318 unmodified lines
912956 return; // bail early - avoid setting state in init(), as evaluate() will bail too
913957 }
914958
915− scriptInfoMessage("Script Engine starting:" + getFilename());
959+ scriptInfoMessage("Script Engine starting:" + getFilename(), getFilename(), -1);
916960
917961 if (!_isInitialized) {
918962 init();
@@ -1064,7 +1108,7 @@ void ScriptManager::run() { · 145 unmodified lines
10641108 _engine->clearExceptions();
10651109 }
10661110 }
1067− scriptInfoMessage("Script Engine stopping:" + getFilename());
1111+ scriptInfoMessage("Script Engine stopping:" + getFilename(), getFilename(), -1);
10681112
10691113 stopAllTimers(); // make sure all our timers are stopped if the script is ending
10701114 emit scriptEnding();
@@ -1139,7 +1183,7 @@ void ScriptManager::updateMemoryCost(const qint64& deltaSize) { · 68 unmodified lines
11391183
11401184 void ScriptManager::timerFired() {
11411185 if (isStopped()) {
1142− scriptWarningMessage("Script.timerFired() while shutting down is ignored... parent script:" + getFilename());
1186+ scriptWarningMessage("Script.timerFired() while shutting down is ignored... parent script:" + getFilename(), getFilename(), -1);
11431187 return; // bail early
11441188 }
11451189
@@ -1206,7 +1250,14 @@ QTimer* ScriptManager::setupTimerWithInterval(const ScriptValue& function, int i · 60 unmodified lines
12061250
12071251 QTimer* ScriptManager::setInterval(const ScriptValue& function, int intervalMS) {
12081252 if (isStopped()) {
1209− scriptWarningMessage("Script.setInterval() while shutting down is ignored... parent script:" + getFilename());
1253+ int lineNumber = -1;
1254+ QString fileName = getFilename();
1255+ auto context = _engine->currentContext();
1256+ if (context) {
1257+ lineNumber = context->currentLineNumber();
1258+ fileName = context->currentFileName();
1259+ }
1260+ scriptWarningMessage("Script.setInterval() while shutting down is ignored... parent script:" + getFilename(), fileName, lineNumber);
12101261 return NULL; // bail early
12111262 }
12121263
@@ -1215,7 +1266,14 @@ QTimer* ScriptManager::setInterval(const ScriptValue& function, int intervalMS) · 2 unmodified lines
12151266
12161267 QTimer* ScriptManager::setTimeout(const ScriptValue& function, int timeoutMS) {
12171268 if (isStopped()) {
1218− scriptWarningMessage("Script.setTimeout() while shutting down is ignored... parent script:" + getFilename());
1269+ int lineNumber = -1;
1270+ QString fileName = getFilename();
1271+ auto context = _engine->currentContext();
1272+ if (context) {
1273+ lineNumber = context->currentLineNumber();
1274+ fileName = context->currentFileName();
1275+ }
1276+ scriptWarningMessage("Script.setTimeout() while shutting down is ignored... parent script:" + getFilename(), fileName, lineNumber);
12191277 return NULL; // bail early
12201278 }
12211279
@@ -1281,7 +1339,7 @@ QUrl ScriptManager::resourcesPath() const { · 59 unmodified lines
12811339 }
12821340
12831341 void ScriptManager::print(const QString& message) {
1284− emit printedMessage(message, getFilename());
1342+ emit scriptPrintedMessage(message, getFilename(), engine()->currentContext()->currentLineNumber());
12851343 }
12861344
12871345
@@ -1651,8 +1709,15 @@ void ScriptManager::include(const QStringList& includeFiles, const ScriptValue& · 363 unmodified lines
16511709 return;
16521710 }
16531711 if (isStopped()) {
1712+ int lineNumber = -1;
1713+ QString fileName = getFilename();
1714+ auto context = _engine->currentContext();
1715+ if (context) {
1716+ lineNumber = context->currentLineNumber();
1717+ fileName = context->currentFileName();
1718+ }
16541719 scriptWarningMessage("Script.include() while shutting down is ignored... includeFiles:"
1655− + includeFiles.join(",") + "parent script:" + getFilename());
1720+ + includeFiles.join(",") + "parent script:" + getFilename(), fileName, lineNumber);
16561721 return; // bail early
16571722 }
16581723 QList<QUrl> urls;
@@ -1665,8 +1730,15 @@ void ScriptManager::include(const QStringList& includeFiles, const ScriptValue& · 6 unmodified lines
16651730 thisURL = expandScriptUrl(QUrl::fromLocalFile(expandScriptPath(file)));
16661731 QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation();
16671732 if (!defaultScriptsLoc.isParentOf(thisURL)) {
1733+ int lineNumber = -1;
1734+ QString fileName = getFilename();
1735+ auto context = _engine->currentContext();
1736+ if (context) {
1737+ lineNumber = context->currentLineNumber();
1738+ fileName = context->currentFileName();
1739+ }
16681740 //V8TODO this probably needs to be done per context, otherwise file cannot be included again in a module
1669− scriptWarningMessage("Script.include() -- skipping" + file + "-- outside of standard libraries");
1741+ scriptWarningMessage("Script.include() -- skipping" + file + "-- outside of standard libraries", fileName, lineNumber);
16701742 continue;
16711743 }
16721744 isStandardLibrary = true;
@@ -1676,8 +1748,15 @@ void ScriptManager::include(const QStringList& includeFiles, const ScriptValue& · 3 unmodified lines
16761748
16771749 bool disallowOutsideFiles = thisURL.isLocalFile() && !isStandardLibrary && !currentSandboxURL.isLocalFile();
16781750 if (disallowOutsideFiles && !PathUtils::isDescendantOf(thisURL, currentSandboxURL)) {
1751+ int lineNumber = -1;
1752+ QString fileName = currentSandboxURL.toString();
1753+ auto context = _engine->currentContext();
1754+ if (context) {
1755+ lineNumber = context->currentLineNumber();
1756+ fileName = context->currentFileName();
1757+ }
16791758 scriptWarningMessage("Script.include() ignoring file path" + thisURL.toString()
1680− + "outside of original entity script" + currentSandboxURL.toString());
1759+ + "outside of original entity script" + currentSandboxURL.toString(), fileName, lineNumber);
16811760 } else {
16821761 // We could also check here for CORS, but we don't yet.
16831762 // It turns out that QUrl.resolve will not change hosts and copy authority, so we don't need to check that here.
@@ -1699,7 +1778,14 @@ void ScriptManager::include(const QStringList& includeFiles, const ScriptValue& · 15 unmodified lines
16991778 for (QUrl url : urls) {
17001779 QString contents = data[url];
17011780 if (contents.isNull()) {
1702− scriptErrorMessage("Error loading file (" + status[url] +"): " + url.toString());
1781+ int lineNumber = -1;
1782+ QString fileName = url.toString();
1783+ auto context = _engine->currentContext();
1784+ if (context) {
1785+ lineNumber = context->currentLineNumber();
1786+ fileName = context->currentFileName();
1787+ }
1788+ scriptErrorMessage("Error loading file (" + status[url] +"): " + url.toString(), fileName, lineNumber);
17031789 } else {
17041790 std::lock_guard<std::recursive_mutex> lock(_lock);
17051791 if (!_includedURLs.contains(url)) {
@@ -1719,7 +1805,14 @@ void ScriptManager::include(const QStringList& includeFiles, const ScriptValue& · 13 unmodified lines
17191805 _engine->clearExceptions();
17201806 }
17211807 } else {
1722− scriptPrintedMessage("Script.include() skipping evaluation of previously included url:" + url.toString());
1808+ int lineNumber = -1;
1809+ QString fileName = url.toString();
1810+ auto context = _engine->currentContext();
1811+ if (context) {
1812+ lineNumber = context->currentLineNumber();
1813+ fileName = context->currentFileName();
1814+ }
1815+ scriptPrintedMessage("Script.include() skipping evaluation of previously included url:" + url.toString(), fileName, lineNumber);
17231816 }
17241817 }
17251818 }
@@ -1748,8 +1841,15 @@ void ScriptManager::include(const QStringList& includeFiles, const ScriptValue& · 22 unmodified lines
17481841
17491842 void ScriptManager::include(const QString& includeFile, const ScriptValue& callback) {
17501843 if (isStopped()) {
1844+ int lineNumber = -1;
1845+ QString fileName = currentSandboxURL.toString();
1846+ auto context = _engine->currentContext();
1847+ if (context) {
1848+ lineNumber = context->currentLineNumber();
1849+ fileName = context->currentFileName();
1850+ }
17511851 scriptWarningMessage("Script.include() while shutting down is ignored... includeFile:"
1752− + includeFile + "parent script:" + getFilename());
1852+ + includeFile + "parent script:" + getFilename(), fileName, lineNumber);
17531853 return; // bail early
17541854 }
17551855
@@ -1765,14 +1865,21 @@ void ScriptManager::load(const QString& loadFile) { · 9 unmodified lines
17651865 if (!_engine->IS_THREADSAFE_INVOCATION(__FUNCTION__)) {
17661866 return;
17671867 }
1868+ int lineNumber = -1;
1869+ QString fileName = getFilename();
1870+ auto context = _engine->currentContext();
1871+ if (context) {
1872+ lineNumber = context->currentLineNumber();
1873+ fileName = context->currentFileName();
1874+ }
17681875 if (isStopped()) {
17691876 scriptWarningMessage("Script.load() while shutting down is ignored... loadFile:"
1770− + loadFile + "parent script:" + getFilename());
1877+ + loadFile + "parent script:" + getFilename(), fileName, lineNumber);
17711878 return; // bail early
17721879 }
17731880 if (!currentEntityIdentifier.isInvalidID()) {
17741881 scriptWarningMessage("Script.load() from entity script is ignored... loadFile:"
1775− + loadFile + "parent script:" + getFilename() + "entity: " + currentEntityIdentifier.toString());
1882+ + loadFile + "parent script:" + getFilename() + "entity: " + currentEntityIdentifier.toString(), fileName, lineNumber);
17761883 return; // bail early
17771884 }
17781885
@@ -2440,7 +2547,7 @@ void ScriptManager::refreshFileScript(const EntityItemID& entityID) { · 661 unmodified lines
24402547 QString filePath = QUrl(details.scriptText).toLocalFile();
24412548 auto lastModified = QFileInfo(filePath).lastModified().toMSecsSinceEpoch();
24422549 if (lastModified > details.lastModified) {
2443− scriptInfoMessage("Reloading modified script " + details.scriptText);
2550+ scriptInfoMessage("Reloading modified script " + details.scriptText, filePath, -1);
24442551 loadEntityScript(entityID, details.scriptText, true);
24452552 }
24462553 }