diff --git a/index.bs b/index.bs index 2cc3ce42..ab808254 100644 --- a/index.bs +++ b/index.bs @@ -866,6 +866,44 @@ it is not always *sufficient* to protect users from invasive behaviours, and seeking [meaningful consent](#consent) is also important. +

Handle non-fully-active documents (and destroyed execution contexts)

+ +When an <{iframe}> (or similar) is removed or navigated, +its document stops being [=Document/fully active=] +and its [=ECMAScript/execution contexts=] can get destroyed. +However, references to objects from that document +can remain reachable from other documents +or from other realms. + +Specifications should say what happens both at call time +and after an operation has begun: +otherwise background work may keep running after a page is gone, +UI can hang, and user agents diverge in abort/cleanup behavior. + +If the [=relevant global object=]'s [=associated Document=] +is not [=Document/fully active=] at call time, +then [=throw=], or return [=a promise rejected with=], +with {{InvalidStateError}}. + +If, after starting an asynchronous operation, +that [=associated Document=] becomes non-[=Document/fully active=] +or the [=relevant global object=]'s [=ECMAScript/execution context=] is destroyed, +abort the operation and reject with {{AbortError}}. +If the operation presents UI (e.g., a picker, chooser, or prompt), +dismiss it when the context becomes non-[=Document/fully active=] +and settle with {{AbortError}}. + +When [=queue a task|queueing=] subsequent work +(e.g., for an event, settling a promise, a time-based operation), +include an early exit: +if the [=associated Document=] is not [=Document/fully active=], +gracefully terminate the [=task=]. +Do not rely on garbage collection to define these semantics. + +See also: [[#support-non-fully-active]] for the BFCache case; +most of the same principles apply to detached iframes +and other torn-down [=All Execution Contexts/realms=]. +

Support non-fully active BFCached documents

Specify how your feature behaves @@ -1615,7 +1653,7 @@ Unlike dictionaries, interfaces: (i.e., one can check if it is an `instanceof` a particular class on the global scope), Defining an interface also exposes it on the global scope, allowing for the specification of static methods. -For example, the `canParse()` static method of the URL interface. +For example, the `canParse()` static method of the URL interface. ```JS if (URL.canParse(someURL)) {