From 9c15ec14a34a118a24eccb16bd915b5f0541ba15 Mon Sep 17 00:00:00 2001 From: Garrett Tanzer Date: Wed, 19 Apr 2023 19:50:07 +0000 Subject: [PATCH 1/6] elaborate on reporting objects --- spec.bs | 167 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 134 insertions(+), 33 deletions(-) diff --git a/spec.bs b/spec.bs index a37f0cfd..efdb71c4 100644 --- a/spec.bs +++ b/spec.bs @@ -467,9 +467,14 @@ A size is a struct with non-negative integ "size">width and non-negative integer height. TODO: Maybe change the numeric type. -An interest group descriptor is a struct with owner, which is a string, and name, which is a string. +An interest group descriptor is a struct with the following [=struct/items=]: +
+ : owner + :: a [=string=] + + : name + :: a [=string=] +
An exhaustive set of sandbox flags is a [=sandboxing flag set=]. @@ -477,38 +482,104 @@ set=]. An exhaustive set of permissions is a [=list=] of [=policy-controlled features=]. -A fenced frame reporter is TODO: Specify the type for this. +A fenced frame reporting map is a [=map=] whose [=map/keys=] +are {{FenceReportingDestination}}s and whose [=map/values=] are either `"pending"`, or [=maps=] +whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=]. + +A fenced frame reporting metadata is a struct with the following [=struct/items=]: +
+ : fenced frame reporting map + :: a [=fencedframetype/fenced frame reporting map=] + + : direct seller is seller + :: a boolean +
- In order to report an event, run these steps: + In order to finalize a reporting destination, given a [=fencedframetype/fenced + frame reporting map=] |reporting map|, a {{FenceReportingDestination}} |destination|, and a + [=map=] |destination map| whose [=map/keys=] are [=strings=] and whose [=map/values=] are + [=urls=], run these steps: - 1. TODO: fill this in + 1. [=Assert=] that |reporting map|[|destination|] is `"pending"`. + + 1. [=map/Set=] |reporting map|[|destination|] to |destination map|.
+A fenced frame reporter is a struct with the following [=struct/items=]: +
+ : fenced frame reporting map reference + :: a reference to a [=fencedframetype/fenced frame reporting map=] + TODO: Handle pointers/references in a more spec-y way + + : direct seller is seller + :: a boolean + + : automatic beacon data + :: null, or a struct with the following [=struct/items=]: +
+ : eventData + :: a [=string=] + + : destination + :: a [=list=] of {{FenceReportingDestination}}s +
+
+
- In order to report a private aggregation event, run these steps: + In order to report an event using a [=fencedframetype/fenced frame reporter=] + |reporter| with a {{FenceReportingDestination}} |destination|, [=string=] |eventType|, and + [=string=] |eventData|, run these steps: + + 1. If |destination| is `"direct-seller"`: + + 1. If |reporter|'s [=fenced frame reporter/direct seller is seller=] is true, set + |destination| to `"seller"`. + + 1. Otherwise, set |destination| to `"component-seller"`. + + 1. Let |reporting map| be |reporter|'s [=fenced frame reporter/fenced frame reporting map + reference=]. + + 1. If |reporting map|[|destination|] does not [=map/exist=], return. + + 1. If |reporting map|[|destination|] is `"pending"`, return and asynchronously wait until it is + no longer pending. + TODO: Specify the waiting properly. - 1. TODO: Fill this in + 1. If |reporting map|[|destination|]|eventType| does not [=map/exist=], return. + + 1. Let |destination url| be |reporting map|[|destination|]|eventType|. + + 1. Send a beacon with |eventData| to |destination url|. + TODO: specify the beacon send
- In order to set automatic beacon data, run these steps: + In order to report a private aggregation event using a [=fencedframetype/fenced frame reporter=] + |reporter| with a [=string=] |event|, run these steps: - 1. TODO: Fill this in + 1. |reporter| |event| TODO: Fill this in
-An exfiltration budget metadata is a struct containing an -origin, which is an [=origin=]; and an amount to debit, which is a non-negative valid -floating point number. +An exfiltration budget metadata is a struct with the following [=struct/items=]: +
+ : origin + :: an [=origin=] -An exfiltration budget metadata reference is a struct -containing an origin, which is an -[=origin=]; and an amount to debit -reference, which is a mutable reference to a non-negative valid floating point number. -TODO: are mutable references a thing in spec? + : amount to debit + :: a non-negative valid floating point number +
-An embedder shared storage context is a string. +An exfiltration budget metadata reference is a struct with the following [=struct/items=]: +
+ : origin + :: an [=origin=] + + : amount to debit reference + :: a mutable reference to a non-negative valid floating point number + TODO: Handle pointers/references in a more specy-y way +
A partition nonce is an [=implementation-defined=] value. @@ -561,10 +632,10 @@ A fenced frame config is a struct with the following [=struct/ : visibility :: a [=visibility=] - : fenced frame reporter + : fenced frame reporting metadata :: null, or a struct with the following fields: - : value - :: a [=fencedframetype/fenced frame reporter=] + : value + :: a [=fencedframetype/fenced frame reporting metadata=] : visibility :: a [=visibility=] @@ -586,7 +657,7 @@ A fenced frame config is a struct with the following [=struct/ :: a [=visibility=] : embedder shared storage context - :: null, or an [=fencedframetype/embedder shared storage context=] + :: null, or a [=string=]

The [=fenced frame config instance=] [=struct=]

@@ -612,7 +683,7 @@ A fenced frame config instance is a struct with the following : effective permissions :: null, or an [=fencedframetype/exhaustive set of permissions=] - : fenced frame reporter TODO: including automatic beacon info + : fenced frame reporter :: null, or a [=fencedframetype/fenced frame reporter=] : exfiltration budget metadata reference @@ -626,7 +697,7 @@ A fenced frame config instance is a struct with the following :: a [=partition nonce=] : embedder shared storage context - :: null, or an [=fencedframetype/embedder shared storage context=] + :: null, or a [=string=]
@@ -656,13 +727,32 @@ A fenced frame config instance is a struct with the following [=fenced frame config/effective permissions=]'s [=effective permissions/value=] : [=fenced frame config instance/fenced frame reporter=] - :: |config|'s TODO: Fill this in + :: + 1. If |config|'s [=fenced frame config/fenced frame reporting metadata=]'s [=fenced frame + reporting metadata/value=] is null, set to null. + + 1. Otherwise, set to a [=fencedframetype/fenced frame reporter=] with the following + members: + + : [=fenced frame reporter/fenced frame reporting map reference=] + :: a reference to |config|'s [=fenced frame config/fenced frame reporting metadata=]'s + [=fenced frame reporting metadata/value=]'s [=fenced frame reporting metadata/fenced + frame reporting map=] + + : [=fenced frame reporter/direct seller is seller=] + :: |config|'s [=fenced frame config/fenced frame reporting metadata=]'s [=fenced frame + reporting metadata/value=]'s [=fenced frame reporting metadata/direct seller is + seller=] + + : [=fenced frame reporter/automatic beacon data=] + :: null : [=fenced frame config instance/exfiltration budget metadata reference=] :: 1. If |config|'s [=fenced frame config/exfiltration budget metadata=] is null, set to null. 1. Otherwise, set to a [=fencedframetype/exfiltration budget metadata reference=]: + : [=exfiltration budget metadata reference/origin=] :: |config|'s [=fenced frame config/exfiltration budget metadata=]'s [=exfiltration budget metadata/value=]'s [=exfiltration budget metadata/origin=] @@ -835,17 +925,22 @@ Several APIs specific to fenced frames are defined on the {{Fence}} interface. 1. If |instance|'s [=fenced frame config instance/fenced frame reporter=] is null, then return. - 1. If |event| is a {{DOMString}}, run [=report a private aggregation event=] with |event| and - |instance|'s [=fenced frame config instance/fenced frame reporter=]. + 1. If |event| is a {{DOMString}}, run [=report a private aggregation event=] using |instance|'s + [=fenced frame config instance/fenced frame reporter=] with |event|. - 1. If |event| is a {{FenceEvent}}, run [=report an event=] with |event| and |instance|'s - [=fenced frame config instance/fenced frame reporter=]. + 1. If |event| is a {{FenceEvent}}, [=list/For each=] |destination| of |event|'s {{FenceEvent/destination}}: + + 1. Run [=report an event=] using |instance|'s [=fenced frame config instance/fenced frame + reporter=] with |destination|, |event|'s {{FenceEvent/eventType}}, and |event|'s + {{FenceEvent/eventData}}.
The setReportEventDataForAutomaticBeacons(|event|) method steps are: + 1. If |event|'s {{FenceEvent/eventType}} is not `"reserved.top_navigation"`, return. + 1. Let |instance| be [=this=]'s [=relevant global object=]'s [=associated Document=]'s [=node navigable=]'s [=navigable/traversable navigable=]'s [=fenced frame config instance=]. @@ -857,8 +952,14 @@ Several APIs specific to fenced frames are defined on the {{Fence}} interface. 1. If |instance|'s [=fenced frame config instance/fenced frame reporter=] is null, then return. - 1. Run [=set automatic beacon data=] with |event| and |instance|'s - [=fenced frame config instance/fenced frame reporter=]. + 1. Set |instance|'s [=fenced frame config instance/fenced frame reporter=]'s [=fenced frame + reporter/automatic beacon data=] to a struct with the following members: + + : eventData + :: |event|'s {{FenceEvent/eventData}} + + : destination + :: |event|'s {{FenceEvent/destination}}
From f105d3090bbd2e16f614c6780c5325570ea167cc Mon Sep 17 00:00:00 2001 From: Dominic Farolino Date: Thu, 20 Apr 2023 15:30:44 -0400 Subject: [PATCH 2/6] Wrapping --- spec.bs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/spec.bs b/spec.bs index efdb71c4..89f7bc3d 100644 --- a/spec.bs +++ b/spec.bs @@ -467,7 +467,9 @@ A size is a struct with non-negative integ "size">width and non-negative integer height. TODO: Maybe change the numeric type. -An interest group descriptor is a struct with the following [=struct/items=]: +An interest group descriptor is a struct with the following +[=struct/items=]: +
: owner :: a [=string=] @@ -486,7 +488,9 @@ A fenced frame reporting map is a [=map=] are {{FenceReportingDestination}}s and whose [=map/values=] are either `"pending"`, or [=maps=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=]. -A fenced frame reporting metadata is a struct with the following [=struct/items=]: +A fenced frame reporting metadata is a struct with the +following [=struct/items=]: +
: fenced frame reporting map :: a [=fencedframetype/fenced frame reporting map=] @@ -506,7 +510,9 @@ A fenced frame reporting metadata is a str 1. [=map/Set=] |reporting map|[|destination|] to |destination map|.
-A fenced frame reporter is a struct with the following [=struct/items=]: +A fenced frame reporter is a struct with the following +[=struct/items=]: +
: fenced frame reporting map reference :: a reference to a [=fencedframetype/fenced frame reporting map=] From 5378759bc381308f8595000351535d944f367142 Mon Sep 17 00:00:00 2001 From: Garrett Tanzer Date: Thu, 4 May 2023 16:49:47 +0000 Subject: [PATCH 3/6] merge --- spec.bs | 104 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 37 deletions(-) diff --git a/spec.bs b/spec.bs index 89f7bc3d..45d2389b 100644 --- a/spec.bs +++ b/spec.bs @@ -484,42 +484,61 @@ set=]. An exhaustive set of permissions is a [=list=] of [=policy-controlled features=]. -A fenced frame reporting map is a [=map=] whose [=map/keys=] -are {{FenceReportingDestination}}s and whose [=map/values=] are either `"pending"`, or [=maps=] -whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=]. - -A fenced frame reporting metadata is a struct with the -following [=struct/items=]: +A pending event is a struct with the following [=struct/items=]: +
+ : destination + :: a {{FenceReportingDestination}} -
- : fenced frame reporting map - :: a [=fencedframetype/fenced frame reporting map=] + : eventType + :: a [=string=] - : direct seller is seller - :: a boolean + : eventData + :: a [=string=]
+A fenced frame reporting map is a [=map=] whose [=map/keys=] +are {{FenceReportingDestination}}s and whose [=map/values=] are either [=lists=] of +[=fencedframetype/pending events=] (which are used to represent events that need to be reported +asynchronously, because the metadata has not been finalized yet), or [=maps=] whose [=map/keys=] +are [=strings=] and whose [=map/values=] are [=urls=] (which are used to represent the actual +metadata once it is finalized). +
In order to finalize a reporting destination, given a [=fencedframetype/fenced frame reporting map=] |reporting map|, a {{FenceReportingDestination}} |destination|, and a [=map=] |destination map| whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=], run these steps: - 1. [=Assert=] that |reporting map|[|destination|] is `"pending"`. + 1. [=Assert=] that |reporting map|[|destination|] is a [=list=] (i.e. that |destination|'s + metadata has not yet been finalized. + + 1. Let |pending event list| be |reporting map|[|destination|]. 1. [=map/Set=] |reporting map|[|destination|] to |destination map|. + + 1. [=list/For each=] |pending event| of |pending event list|: + + 1. [=Send a beacon=] with |destination map|, |pending event|'s [=pending event/eventType=], + and |pending event|'s [=pending event/eventData=].
-A fenced frame reporter is a struct with the following -[=struct/items=]: +A fenced frame reporting metadata is a struct with the +following [=struct/items=]: -
- : fenced frame reporting map reference - :: a reference to a [=fencedframetype/fenced frame reporting map=] - TODO: Handle pointers/references in a more spec-y way +
+ : fenced frame reporting map + :: a [=fencedframetype/fenced frame reporting map=] : direct seller is seller :: a boolean +
+ +A fenced frame reporter is a struct with the following +[=struct/items=]: +
+ : fenced frame reporting metadata reference + :: a mutable reference to a [=fencedframetype/fenced frame reporting metadata=] + TODO: Handle pointers/references in a more spec-y way : automatic beacon data :: null, or a struct with the following [=struct/items=]: @@ -532,6 +551,19 @@ A fenced frame reporter is a struct with t
+
+ In order to send a beacon with a [=map=] |destination map| whose [=map/keys=] are + [=strings=] and whose [=map/values=] are [=urls=], a [=string=] |eventType|, and a [=string=] + |eventData|, run these steps: + + 1. If |destination map|[|eventType|] does not [=map/exist=], return. + + 1. Let |destination url| be |destination map|[|eventType|]. + + 1. Send a beacon with |eventData| to |destination url|. + TODO: specify the beacon send +
+
In order to report an event using a [=fencedframetype/fenced frame reporter=] |reporter| with a {{FenceReportingDestination}} |destination|, [=string=] |eventType|, and @@ -539,26 +571,30 @@ A fenced frame reporter is a struct with t 1. If |destination| is `"direct-seller"`: - 1. If |reporter|'s [=fenced frame reporter/direct seller is seller=] is true, set - |destination| to `"seller"`. + 1. If |reporter|'s [=fenced frame reporter/fenced frame reporting metadata reference=]'s + [=fenced frame reporting metadata/direct seller is seller=] is true, set |destination| to + `"seller"`. 1. Otherwise, set |destination| to `"component-seller"`. - 1. Let |reporting map| be |reporter|'s [=fenced frame reporter/fenced frame reporting map - reference=]. + 1. Let |reporting map| be a mutable reference to |reporter|'s [=fenced frame reporter/fenced + frame reporting metadata reference=]'s [=fenced frame reporting metadata/fenced frame + reporting map=]. 1. If |reporting map|[|destination|] does not [=map/exist=], return. - 1. If |reporting map|[|destination|] is `"pending"`, return and asynchronously wait until it is - no longer pending. - TODO: Specify the waiting properly. + 1. If |reporting map|[|destination|] is a [=list=]: - 1. If |reporting map|[|destination|]|eventType| does not [=map/exist=], return. + 1. [=list/Extend=] |reporting map|[|destination|] with a [=fencedframetype/pending event=] + whose [=pending event/destination=] is |destination|, [=pending event/eventType=] is + |eventType|, and [=pending event/eventData=] is |eventData|. - 1. Let |destination url| be |reporting map|[|destination|]|eventType|. + 1. Return. (The pending event will be sent asynchronously.) - 1. Send a beacon with |eventData| to |destination url|. - TODO: specify the beacon send + 1. [=Assert=] that |reporting map|[|destination|] is a [=map=] (i.e. that |destination|'s + metadata has been finalized). + + 1. [=Send a beacon=] with |reporting map|[|destination|], |eventType|, and |eventData|.
@@ -740,15 +776,9 @@ A fenced frame config instance is a struct with the following 1. Otherwise, set to a [=fencedframetype/fenced frame reporter=] with the following members: - : [=fenced frame reporter/fenced frame reporting map reference=] + : [=fenced frame reporter/fenced frame reporting metadata reference=] :: a reference to |config|'s [=fenced frame config/fenced frame reporting metadata=]'s - [=fenced frame reporting metadata/value=]'s [=fenced frame reporting metadata/fenced - frame reporting map=] - - : [=fenced frame reporter/direct seller is seller=] - :: |config|'s [=fenced frame config/fenced frame reporting metadata=]'s [=fenced frame - reporting metadata/value=]'s [=fenced frame reporting metadata/direct seller is - seller=] + [=fenced frame reporting metadata/value=] : [=fenced frame reporter/automatic beacon data=] :: null From c93ee9383294a3b0c76540f11f13ed9777619a27 Mon Sep 17 00:00:00 2001 From: Dominic Farolino Date: Thu, 4 May 2023 18:10:27 -0400 Subject: [PATCH 4/6] Small nits or fixes --- spec.bs | 55 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/spec.bs b/spec.bs index 55b01b8d..8d835114 100644 --- a/spec.bs +++ b/spec.bs @@ -568,11 +568,11 @@ A pending event is a struct with the follo
A fenced frame reporting map is a [=map=] whose [=map/keys=] -are {{FenceReportingDestination}}s and whose [=map/values=] are either [=lists=] of -[=fencedframetype/pending events=] (which are used to represent events that need to be reported -asynchronously, because the metadata has not been finalized yet), or [=maps=] whose [=map/keys=] -are [=strings=] and whose [=map/values=] are [=urls=] (which are used to represent the actual -metadata once it is finalized). +are {{FenceReportingDestination}}s and whose [=map/values=] are either: + * [=lists=] of [=fencedframetype/pending events=] (which are used to represent events that need to + be reported asynchronously, because the metadata has not been finalized yet); or + * [=maps=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=] (which are used + to represent the actual metadata once it is finalized).
In order to finalize a reporting destination, given a [=fencedframetype/fenced @@ -580,8 +580,8 @@ metadata once it is finalized). [=map=] |destination map| whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=], run these steps: - 1. [=Assert=] that |reporting map|[|destination|] is a [=list=] (i.e. that |destination|'s - metadata has not yet been finalized. + 1. [=Assert=] that |reporting map|[|destination|] is a [=list=] (i.e., that |destination|'s + metadata has not yet been finalized). 1. Let |pending event list| be |reporting map|[|destination|]. @@ -632,7 +632,8 @@ A fenced frame reporter is a struct with t 1. Let |destination url| be |destination map|[|eventType|]. 1. Send a beacon with |eventData| to |destination url|. - TODO: specify the beacon send + + Issue: Specify the [[FETCH]] integration for sending this request.
@@ -648,19 +649,29 @@ A fenced frame reporter is a struct with t 1. Otherwise, set |destination| to `"component-seller"`. - 1. Let |reporting map| be a mutable reference to |reporter|'s [=fenced frame reporter/fenced - frame reporting metadata reference=]'s [=fenced frame reporting metadata/fenced frame - reporting map=]. + 1. Let |reporting map| be a reference to |reporter|'s [=fenced frame reporter/fenced frame + reporting metadata reference=]'s [=fenced frame reporting metadata/fenced frame reporting + map=]. 1. If |reporting map|[|destination|] does not [=map/exist=], return. 1. If |reporting map|[|destination|] is a [=list=]: - 1. [=list/Extend=] |reporting map|[|destination|] with a [=fencedframetype/pending event=] - whose [=pending event/destination=] is |destination|, [=pending event/eventType=] is - |eventType|, and [=pending event/eventData=] is |eventData|. + 1. Let |newEvent| be a new [=fencedframetype/pending event=] with the following: + : [=pending event/destination=] + :: |destination| + + : [=pending event/eventType=] + :: |eventType| + + : [=pending event/eventData=] + :: |eventData| + + 1. [=list/Append=] |newEvent| to |reporting map|[|destination|]. + + 1. Return. - 1. Return. (The pending event will be sent asynchronously.) + Note: The pending event will be sent asynchronously. 1. [=Assert=] that |reporting map|[|destination|] is a [=map=] (i.e. that |destination|'s metadata has been finalized). @@ -669,13 +680,15 @@ A fenced frame reporter is a struct with t
- In order to report a private aggregation event using a [=fencedframetype/fenced frame reporter=] - |reporter| with a [=string=] |event|, run these steps: + In order to report a private aggregation event using a [=fencedframetype/fenced frame + reporter=] |reporter| with a [=string=] |event|, run these steps: 1. |reporter| |event| TODO: Fill this in
-An exfiltration budget metadata is a struct with the following [=struct/items=]: +An exfiltration budget metadata is a struct with the following +[=struct/items=]: +
: origin :: an [=origin=] @@ -684,7 +697,9 @@ An exfiltration budget metadata is a struc :: a non-negative valid floating point number
-An exfiltration budget metadata reference is a struct with the following [=struct/items=]: +An exfiltration budget metadata reference is a struct with the +following [=struct/items=]: +
: origin :: an [=origin=] @@ -1054,7 +1069,7 @@ Several APIs specific to fenced frames are defined on the {{Fence}} interface. 1. If |event| is a {{DOMString}}, run [=report a private aggregation event=] using |instance|'s [=fenced frame config instance/fenced frame reporter=] with |event|. - 1. If |event| is a {{FenceEvent}}, [=list/For each=] |destination| of |event|'s {{FenceEvent/destination}}: + 1. If |event| is a {{FenceEvent}}, [=list/for each=] |destination| of |event|'s {{FenceEvent/destination}}: 1. Run [=report an event=] using |instance|'s [=fenced frame config instance/fenced frame reporter=] with |destination|, |event|'s {{FenceEvent/eventType}}, and |event|'s From c844b717173a27260c010e57f9db8439aaf23e53 Mon Sep 17 00:00:00 2001 From: Garrett Tanzer Date: Thu, 4 May 2023 18:14:41 -0400 Subject: [PATCH 5/6] Fix bad merge --- spec.bs | 3 --- 1 file changed, 3 deletions(-) diff --git a/spec.bs b/spec.bs index 8d835114..7423a7a4 100644 --- a/spec.bs +++ b/spec.bs @@ -552,9 +552,6 @@ An interest group descriptor is a struct w An exhaustive set of sandbox flags is a [=sandboxing flag set=]. -An exhaustive set of permissions is a [=list=] of -[=policy-controlled features=]. - A pending event is a struct with the following [=struct/items=]:
: destination From bdd49d6c434fb8e4a2798be63fce5a3097e9d722 Mon Sep 17 00:00:00 2001 From: Garrett Tanzer Date: Fri, 5 May 2023 16:00:53 +0000 Subject: [PATCH 6/6] add note --- spec.bs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spec.bs b/spec.bs index 7423a7a4..e1d31e00 100644 --- a/spec.bs +++ b/spec.bs @@ -571,6 +571,18 @@ are {{FenceReportingDestination}}s and whose [=map/values=] are either: * [=maps=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=urls=] (which are used to represent the actual metadata once it is finalized). +Note: This representation is meant to allow config-generating APIs to reduce latency by resolving +the values of reporting destinations asynchronously, after they've already constructed and returned +the fenced frame config (and even after the config has been loaded, and event reports have been +generated inside the fenced frame). When the config-generating API declares the [=fencedframetype/ +fenced frame reporting map=], they can mark certain destinations as pending using an empty +[=list=], and then maintain a reference to the map for later. If the fenced frame attempts to +[=report an event=] to a destination while it is still pending, it stores the event in this +[=list=] for later handling. When the config-generating API or its callback eventually [=finalizes +a reporting destination=] through the reference it kept, it will handle all of the pending events +stored in the [=list=]. If the destination is never finalized, then the pending events will never +be sent. +
In order to finalize a reporting destination, given a [=fencedframetype/fenced frame reporting map=] |reporting map|, a {{FenceReportingDestination}} |destination|, and a