From df0689ba6bbeedd4211ea362f711b18a0e7db424 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 7 Sep 2021 10:06:11 +0000 Subject: [PATCH 1/4] Implement polyfill for JSDOM --- .../org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala b/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala index 33ac1b4..e58c7b1 100644 --- a/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala +++ b/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala @@ -134,6 +134,13 @@ object MacrotaskExecutor extends ExecutionContextExecutor { channel.port2.postMessage(handle) () } + } else if (js.typeOf(js.Dynamic.global.Node) != Undefined) { // JSDOM sandbox + val setImmediate = js.Dynamic.global.Node.constructor("return setImmediate")() + + { k => + setImmediate(k) + () + } } else { // we don't try to look for process.nextTick since scalajs doesn't support old node // we're also not going to bother fast-pathing for IE6; just fall through From 0c1a7a6465915a0dec64f21d537a2eeec4f67ebe Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 7 Sep 2021 10:07:07 +0000 Subject: [PATCH 2/4] Re-enable clamping test --- .../macrotaskexecutor/MacrotaskExecutorSuite.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/test/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutorSuite.scala b/core/src/test/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutorSuite.scala index 883dd61..328f25b 100644 --- a/core/src/test/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutorSuite.scala +++ b/core/src/test/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutorSuite.scala @@ -32,15 +32,15 @@ class MacrotaskExecutorSuite extends FunSuite { else Future.unit.flatMap(_ => loop(n - 1)).map(_ + 1) - // val start = System.currentTimeMillis() - // val MinimumClamp = 10000 * 2 * 4 // HTML5 specifies a 4ms clamp (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout#Minimum.2F_maximum_delay_and_timeout_nesting) + val start = System.currentTimeMillis() + val MinimumClamp = 10000 * 2 * 4 // HTML5 specifies a 4ms clamp (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout#Minimum.2F_maximum_delay_and_timeout_nesting) loop(10000) flatMap { res => Future { - // val end = System.currentTimeMillis() + val end = System.currentTimeMillis() assert(res == 10000) - // assert((end - start).toDouble / MinimumClamp < 0.25) // we should beat the clamping by at least 4x even on slow environments + assert((end - start).toDouble / MinimumClamp < 0.25) // we should beat the clamping by at least 4x even on slow environments } } } From eb0ef222dac0f6ecf0be9b71748a6410f7bc8580 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 7 Sep 2021 10:26:17 +0000 Subject: [PATCH 3/4] Make detection logic more robust --- .../scalajs/macrotaskexecutor/MacrotaskExecutor.scala | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala b/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala index e58c7b1..3da1ef2 100644 --- a/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala +++ b/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala @@ -134,8 +134,14 @@ object MacrotaskExecutor extends ExecutionContextExecutor { channel.port2.postMessage(handle) () } - } else if (js.typeOf(js.Dynamic.global.Node) != Undefined) { // JSDOM sandbox - val setImmediate = js.Dynamic.global.Node.constructor("return setImmediate")() + } else if ( + js.typeOf( + js.Dynamic.global.navigator + ) != Undefined && js.Dynamic.global.navigator.userAgent + .asInstanceOf[js.UndefOr[String]] + .exists(_.contains("jsdom")) + ) { + val setImmediate = js.Dynamic.global.Node.constructor("return setImmediate")() { k => setImmediate(k) From 3d53d7aa565ed666b336631f69ccd1af4e85f40b Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 7 Sep 2021 10:28:21 +0000 Subject: [PATCH 4/4] formatting (please send help) --- .../macrotaskexecutor/MacrotaskExecutor.scala | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala b/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala index 3da1ef2..02f18ad 100644 --- a/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala +++ b/core/src/main/scala/org/scalajs/macrotaskexecutor/MacrotaskExecutor.scala @@ -135,14 +135,15 @@ object MacrotaskExecutor extends ExecutionContextExecutor { () } } else if ( - js.typeOf( - js.Dynamic.global.navigator - ) != Undefined && js.Dynamic.global.navigator.userAgent - .asInstanceOf[js.UndefOr[String]] - .exists(_.contains("jsdom")) - ) { - val setImmediate = js.Dynamic.global.Node.constructor("return setImmediate")() - + js.typeOf( + js.Dynamic.global.navigator + ) != Undefined && js.Dynamic.global.navigator.userAgent + .asInstanceOf[js.UndefOr[String]] + .exists(_.contains("jsdom")) + ) { + val setImmediate = + js.Dynamic.global.Node.constructor("return setImmediate")() + { k => setImmediate(k) ()