Skip to content

Commit

Permalink
Merge pull request #855 from overte-org/fix/script_require_bg
Browse files Browse the repository at this point in the history
Fix require behavior for modules
  • Loading branch information
ksuprynowicz committed Mar 5, 2024
2 parents 22faf21 + 931b222 commit e9e63ef
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 1 deletion.
5 changes: 5 additions & 0 deletions libraries/script-engine/src/v8/ScriptEngineV8.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,11 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
}
// "Script" API is context-dependent, so it needs to be recreated for each new context
registerGlobalObject("Script", new ScriptManagerScriptingInterface(_manager), ScriptEngine::ScriptOwnership);
auto Script = globalObject().property("Script");
auto require = Script.property("require");
auto resolve = Script.property("_requireResolve");
require.setProperty("resolve", resolve, ScriptValue::ReadOnly | ScriptValue::Undeletable);
globalObject().setProperty("require", require, ScriptValue::ReadOnly | ScriptValue::Undeletable);

// Script.require properties need to be copied, since that's where the Script.require cache is
// Get source and destination Script.require objects
Expand Down
34 changes: 33 additions & 1 deletion tests/script-engine/src/ScriptEngineNetworkedTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ ScriptManagerPointer ScriptEngineNetworkedTests::makeManager(const QString &scri
return sm;
}

void ScriptEngineNetworkedTests::testRequire() {
void ScriptEngineNetworkedTests::testScriptRequire() {
auto sm = makeManager(
"print(\"Starting\");"
"Script.require('./tests/c.js');"
Expand Down Expand Up @@ -153,6 +153,38 @@ void ScriptEngineNetworkedTests::testRequire() {
}
}

void ScriptEngineNetworkedTests::testRequire() {
auto sm = makeManager(
"print(\"Starting\");"
"require('./tests/c_require.js');"
"print(\"Done\");"
"Script.stop(true);", "testRequire.js");
QStringList printed;
QStringList expected {"Starting", "Value from A: 6", "Value from B: 6", "Done"};


QVERIFY(!sm->isRunning());
QVERIFY(!sm->isStopped());
QVERIFY(!sm->isFinished());

connect(sm.get(), &ScriptManager::printedMessage, [&printed](const QString& message, const QString& engineName){
printed.append(message);
});


qInfo() << "About to run script";
sm->run();

QVERIFY(!sm->isRunning());
QVERIFY(!sm->isStopped());
QVERIFY(sm->isFinished());

QVERIFY(printed.length() == expected.length());
for(int i=0;i<printed.length();i++) {
QString nomatch = QString("Result '%1' didn't match expected '%2'").arg(printed[i]).arg(expected[i]);
QVERIFY2(printed[i] == expected[i], qPrintable(nomatch));
}
}


void ScriptEngineNetworkedTests::testRequireInfinite() {
Expand Down
1 change: 1 addition & 0 deletions tests/script-engine/src/ScriptEngineNetworkedTests.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class ScriptEngineNetworkedTests : public QObject {
private slots:
void initTestCase();
void testRequire();
void testScriptRequire();
void testRequireInfinite();


Expand Down
6 changes: 6 additions & 0 deletions tests/script-engine/src/tests/b_require.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

// b.js
var a = require('./a.js');
a.value += 1;
console.log('message from b');
module.exports = a.value;
6 changes: 6 additions & 0 deletions tests/script-engine/src/tests/c_require.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

// c.js
var a = require('./a.js');
var b = require('./b_require.js');
print("Value from A: " + a.value);
print("Value from B: " + b);

0 comments on commit e9e63ef

Please sign in to comment.