Propagate active ScriptOrModule with JobCallback Record S2
- Stage: Stage 2
- Status: Active
- ECMAScript edition: —
- Synchronized: Aug 28, 2026
- 中文译文 · Source repository
This proposal aims to align the active ScriptOrModule propagation so that it is determined at the time promise.then is called, rather than at HostEnqueuePromiseJob time, avoiding exposure of the internal [[PromiseState]]. It mandates propagation through promise jobs and FinalizationRegistry callbacks, matching HTML's existing HostMakeJobCallback behavior.
The README below comes from the upstream repository and may contain outdated stage or status metadata. Use the proposal details above as the current source of truth.
ecma262#3195
This is the repo for the nomative change of https://github.com/tc39/ecma262/pull/3195.
Status: Stage 2
Champions: Chengzhong Wu (@legendecas)
Motivation
The goal is avoid revealing internal slot [[PromiseState]] with
promise.then(onFulfill, onRejection) to the promise handlers by
host hook requirement.
ECMA262 HostEnqueuePromiseJob defines that a host must implement it as:
- Let scriptOrModule be GetActiveScriptOrModule() at the time HostEnqueuePromiseJob is invoked. If realm is not null, each time job is invoked the implementation must perform implementation-defined steps such that scriptOrModule is the active script or module at the time of job's invocation.
The timing of HostEnqueuePromiseJob depends on internal Promise
[[PromiseState]]. The motivation instead expect the ActiveScriptOrModule
been determined AT the time promise.then() is invoked.
That is, in the above example, the ActiveScriptOrModule for the handler at call site (1) should be "module A", and at call site (2) should be "module B".
HTML integration
HTML HostEnqueuePromiseJob doesn't follow the requirements of ecma262.
However, HTML spec defines that the active ScriptOrModule is saved at the time of HostMakeJobCallback is invoked rather than at the time of HostEnqueuePromiseJob is invoked. The two host hooks are invoked with the same active script or module consecutively.
This change also mandates that the active scripts are propagated through promise jobs and FinalizationRegistry cleanup callbacks.
For example, the following example uses HTML APIs that depends on the original script's incumbent document URL.
This proposed behavior exists in the HTML spec since HTML
HostMakeJobCallback already propagates the active script.
Proposed change
Checkout https://github.com/tc39/ecma262/pull/3195
The reality of the implementation status is:
- pending is resolve in inner iframe.
- f is iframe
setLocationHref.- outer: url is resolved to outer page.
- inner: url is resolved to inner iframe.
Conclusion:
- ECMA-262 and Safari reveal the
[[PromiseState]]. - Chrome/Firefox don't respect
.then(f)equals to.then(v => f(v)) - HTML and the proposed behavior have neither of those problems
The proposed change also fixes the inconsistent requirement on ecma262
HostEnqueuePromiseJob and HTML HostMakeJobCallback.