diff --git a/spec.bs b/spec.bs index 893ea04f..8cf749b0 100644 --- a/spec.bs +++ b/spec.bs @@ -197,6 +197,7 @@ dictionary AuctionAd { USVString buyerReportingId; USVString buyerAndSellerReportingId; + sequence selectableBuyerAndSellerReportingIds; sequence allowedReportingOrigins; DOMString adRenderId; }; @@ -419,6 +420,8 @@ This is detectable because it can change the set of fields that are read from th |igAd|'s [=interest group ad/buyer reporting ID=] to it. 1. If |ad|["{{AuctionAd/buyerAndSellerReportingId}}"] [=map/exists=], then set |igAd|'s [=interest group ad/buyer and seller reporting ID=] to it. + 1. If |ad|["{{AuctionAd/selectableBuyerAndSellerReportingIds}}"] [=map/exists=], + then set |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] to it. 1. If |ad|["{{AuctionAd/allowedReportingOrigins}}"] [=map/exists=]: 1. Let |allowedReportingOrigins| be a new [=list=] of [=origins=]. 1. [=list/For each=] |originStr| in |ad|["{{AuctionAd/allowedReportingOrigins}}"]: @@ -1885,21 +1888,8 @@ and a [=real time reporting contributions map=] |realTimeContributionsMap|: mechanism to bootstrap the k-anonymity count, otherwise no [=interest group/ads=] would ever trigger [=increment k-anonymity count=] and all ads would fail [=query k-anonymity count=]. - - 1. Let |originalAds| be |ig|'s [=interest group/ads=]. - 1. If |originalAds| is not null: - 1. Set |ig|'s [=interest group/ads=] to a new [=list=] of [=interest group ad=]. - 1. [=list/For each=] |ad| in |originalAds|: - 1. Compute |adHashCode| by getting the result of [=compute the key hash of ad=] given |ig| and |ad|. - 1. If [=query k-anonymity cache=] given |adHashCode| returns true, - [=list/append=] |ad| to |ig|'s [=interest group/ads=]. - 1. Let |originalAdComponents| be |ig|'s [=interest group/ad components=]. - 1. If |originalAdComponents| is not null: - 1. Set |ig|'s [=interest group/ad components=] to a new [=list=] of [=interest group ad=]. - 1. [=list/For each=] |adComponent| in |originalAdComponents|: - 1. Compute |componentAdHashCode| by getting the result of [=compute the key hash of component ad=] given |adComponent|. - 1. If [=query k-anonymity cache=] given |componentAdHashCode| returns true, - [=list/append=] |adComponent| to |ig|'s [=interest group/ad components=]. + 1. Let |kAnonRestrictedIG| be the result of running [=create a k-anon restricted deep copy of the interest group=] + given |ig|. 1. If |perBuyerCumulativeTimeout| is not null and is < |perBuyerTimeout|, then set |perBuyerTimeout| to |perBuyerCumulativeTimeout|. 1. Let |generateBidStartTime| be |settings|'s @@ -1908,12 +1898,10 @@ and a [=real time reporting contributions map=] |realTimeContributionsMap|: of running [=generate potentially multiple bids=] with |allTrustedBiddingSignals|, |crossOriginTrustedBiddingSignalsOrigin|, |auctionSignals|, a [=map/clone=] of |browserSignals|, |perBuyerSignals|, |directFromSellerSignalsForBuyer|, |perBuyerTimeout|, |expectedCurrency|, - 1 (for multiBidLimit), |ig|, |auctionStartTime|, and |settings|. + 1 (for multiBidLimit), |kAnonRestrictedIG|, |auctionStartTime|, and |settings|. Note: passing 1 for multiBidLimit limits the rerun to producing at most a single bid. - 1. Set |ig|'s [=interest group/ads=] to |originalAds|. - 1. Set |ig|'s [=interest group/ad components=] to |originalAdComponents|. 1. Let |generateBidDuration| be the [=duration from=] |generateBidStartTime| to |settings|'s [=environment settings object/current monotonic time=], in milliseconds. 1. If |perBuyerCumulativeTimeout| is not null, then decrement |perBuyerCumulativeTimeout| @@ -2015,6 +2003,15 @@ To convert to an AuctionAd sequence given a [=list=]-or-null |ads|: 1. Let |adIDL| be a new {{AuctionAd}}. 1. [=map/Set=] |adIDL|["{{AuctionAd/renderURL}}"] to the [=URL serializer|serialization=] of |ad|'s [=interest group ad/render url=]. + 1. If |ad|'s [=interest group ad/selectable buyer and seller reporting IDs=] is not null: + 1.[=map/Set=] |adIDL|["{{AuctionAd/selectableBuyerAndSellerReportingIds}}"] to + |ad|'s [=interest group ad/selectable buyer and seller reporting IDs=]. + 1. If |ad|'s [=interest group ad/buyer and seller reporting id=] is not null then + [=map/set=] |adIDL|["{{AuctionAd/buyerAndSellerReportingId}}"] to + |ad|'s [=interest group ad/buyer and seller reporting id=]. + 1. If |ad|'s [=interest group ad/buyer reporting id=] is not null then + [=map/set=] |adIDL|["{{AuctionAd/buyerReportingId}}"] to + |ad|'s [=interest group ad/buyer reporting id=]. 1. If |ad|'s [=interest group ad/size group=] is not null, then [=map/set=] |adIDL|["{{AuctionAd/sizeGroup}}"] to |ad|'s [=interest group ad/size group=]. 1. If |ad|'s [=interest group ad/metadata=] is not null, then [=map/set=] @@ -2663,11 +2660,18 @@ To report result given a [=leading bid info=] |leadingBidInfo|, a 1. Let |igAd| be the [=interest group ad=] from |winner|'s [=generated bid/interest group=]'s [=interest group/ads=] whose [=interest group ad/render url=] is |winner|'s [=generated bid/ad descriptor=]'s [=ad descriptor/url=]. - 1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] - [=map/exists=] and the result of [=query reporting ID k-anonymity count=] - given |winner|'s [=generated bid/interest group=] and |igAd| is true, then [=map/set=] - |browserSignals|["{{ReportingBrowserSignals/buyerAndSellerReportingId}}"] to |igAd|'s - [=interest group ad/buyer and seller reporting ID=]. + 1. If the |winner|'s [=generated bid/selected buyer and seller reporting ID=] is not null and the + result of running [=query reporting ID k-anonymity count=] with |winner|'s + [=generated bid/interest group=], |igAd|, and |winner|'s + [=generated bid/selected buyer and seller reporting ID=] is true: + 1. [=map/Set=] |browserSignals|["{{ReportingBrowserSignals/selectedBuyerAndSellerReportingId}}"] + to |winner|'s [=generated bid/selected buyer and seller reporting ID=]. + 1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is not null, [=map/set=] + |browserSignals|["{{ReportingBrowserSignals/buyerAndSellerReportingId}}"] to it. + 1. Otherwise, if the result of running [=query reporting ID k-anonymity count=] with |winner|'s + [=generated bid/interest group=], |igAd|, and null is true: + 1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is not null, [=map/set=] + |browserSignals|["{{ReportingBrowserSignals/buyerAndSellerReportingId}}"] to it. 1. Let |sellerReportingScriptFetcher| be the result of [=creating a new script fetcher=] with |config|'s [=auction config/decision logic url=] and |global|'s [=relevant settings object=]. 1. Let |sellerReportingScript| be the result of [=waiting for script body from a fetcher=] given @@ -2731,14 +2735,17 @@ a {{ReportingBrowserSignals}} |browserSignals|, a [=direct from seller signals=] [=generated bid/interest group=]'s [=interest group/ads=] whose [=interest group ad/render url=] is |winner|'s [=generated bid/ad descriptor=]'s [=ad descriptor/url=]. - 1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] - does not [=map/exist=] and the result of [=query reporting ID k-anonymity count=] given - |winner|'s [=generated bid/interest group=] and |igAd| is true: - 1. If |igAd|'s [=interest group ad/buyer reporting ID=] [=map/exists=], - [=map/set=] |reportWinBrowserSignals|["{{ReportWinBrowserSignals/buyerReportingId}}"] to - |igAd|'s [=interest group ad/buyer reporting ID=]. - 1. Otherwise, [=map/Set=] |reportWinBrowserSignals|["{{ReportWinBrowserSignals/interestGroupName}}"] - to |winner|'s [=generated bid/interest group=] [=interest group/name=]. + 1. If |winner|'s [=generated bid/selected buyer and seller reporting ID=] is not null: + 1. If |igAd|'s [=interest group ad/buyer reporting ID=] is not null, + [=map/set=] |reportWinBrowserSignals|["{{ReportWinBrowserSignals/buyerReportingId}}"] to it. + 1. Otherwise if the result of running [=query reporting ID k-anonymity count=] with + |winner|'s [=generated bid/interest group=], |igAd|, and null is true: + 1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is null: + 1. If |igAd|'s [=interest group ad/buyer reporting ID=] is not null, + [=map/set=] |reportWinBrowserSignals|["{{ReportWinBrowserSignals/buyerReportingId}}"] to + |igAd|'s [=interest group ad/buyer reporting ID=]. + 1. Otherwise, [=map/set=] |reportWinBrowserSignals|["{{ReportWinBrowserSignals/interestGroupName}}"] + to |winner|'s [=generated bid/interest group=] [=interest group/name=]. 1. Let |buyerReportingScriptFetcher| be the result of [=creating a new script fetcher=] with |winner|'s [=generated bid/interest group=]'s [=interest group/bidding url=] and |settings|. 1. Let |buyerReportingScript| be the result of [=waiting for script body from a fetcher=] given @@ -3987,6 +3994,36 @@ in the [=user agent=]'s [=interest group set=] and whose [=map/values=] are [=k- This allows the browser to rerun portions of an auction without incurring the delay (and added side channels) from querying the server during an auction. +
+ To create a k-anon restricted deep copy of the interest group given an [=interest group=] |ig|: + 1. Let |kAnonRestrictedIG| be a deep copy of |ig|. + 1. If |ig|'s [=interest group/ads=] is not null: + 1. Set |kAnonRestrictedIG|'s [=interest group/ads=] to an empty [=list=] of [=interest group ad=]. + 1. [=list/For each=] |igAd| of |ig|'s [=interest group/ads=]: + 1. Let |adHashCode| be the result of running [=compute the key hash of ad=] given |ig| and |igAd|. + 1. If [=query k-anonymity cache=] for |adHashCode| returns true: + 1. If |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] is not null: + 1. Let |kAnonRestrictedSelectableReportingIds| be a new empty [=list=] of [=string=]s. + 1. [=list/For each=] |selectableReportingId| in |igAd|'s + [=interest group ad/selectable buyer and seller reporting IDs=]: + 1. Let |reportingHashCode| be the result of [=computing the key hash of reporting ID=] + given |ig|, |igAd|, and |selectableReportingId|. + 1. If [=query k-anonymity cache=] for |reportingHashCode| returns true, then + [=list/Append=] |selectableReportingId| to |kAnonRestrictedSelectableReportingIds|. + 1. Set |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] to + |kAnonRestrictedSelectableReportingIds|. + 1. [=list/Append=] |igAd| to |kAnonRestrictedIG|'s [=interest group/ads=]. + 1. If |ig|'s [=interest group/ad components=] is not null: + 1. Set |kAnonRestrictedIG|'s [=interest group/ad components=] to an empty [=list=] of + [=interest group ad=]. + 1. [=list/For each=] |igAdComponent| of |ig|'s [=interest group/ad components=]: + 1. Let |adComponentHashCode| be the result of running [=compute the key hash of ad=] given |ig| and + |igAdComponent|. + 1. If [=query k-anonymity cache=] for |adComponentHashCode| returns true: + 1. [=list/Append=] |igAdComponent| to |kAnonRestrictedIG|'s [=interest group/ad components=]. + 1. Return |kAnonRestrictedIG|. +
+
To query k-anonymity count given a [=SHA-256=] |hashCode|: 1. If the [=k-anonymity server=] has recorded at least [=k-anonymity threshold=] users @@ -4004,49 +4041,77 @@ from querying the server during an auction.
- To compute the key hash of ad given an [=interest group=] |ig| and an [=interest group ad=] |igAd|: - 1. Let |keyString| be the [=k-anonymity key=] formed from the [=string/concatenation=] of the following strings separated with U+000A LF: + To compute the key hash of ad given an [=interest group=] |ig| and an [=interest group ad=] |igAd|: + 1. Let |keyString| be the [=k-anonymity key=] formed from the [=string/concatenation=] of the + following strings separated with U+000A LF: * "AdBid" * the [=serialization of an origin|serialization=] of |ig|'s [=interest group/owner=] * the [=URL serializer|serialization=] of |ig|'s [=interest group/bidding url=] * the [=URL serializer|serialization=] of |igAd|'s [=interest group ad/render url=]. - 1. Return the [=SHA-256=] hash of the [=ASCII encoding=] of |keyString|. + 1. Return the [=SHA-256=] hash of the [=ASCII encoding=] of |keyString|.
- To compute the key hash of reporting ID given an [=interest group=] |ig| and an - [=interest group ad=] |igAd|: - 1. Let |keyString| be a [=k-anonymity key=] formed from the [=string/concatenation=] of the following strings separated with U+000A (LF): + To compute the key part for one of multiple reporting ids given [=string=]-or-null |reportingId|: + 1. If |reportingId| is null, then return the [=string/concatenation=] of the following: + * U+0000 (NUL) + * U+0000 (NUL) + * U+0000 (NUL) + * U+0000 (NUL) + 1. Otherwise, return the [=string/concatenation=] of the following: + * U+0001 (SOH) + * The size of |reportingId|, interpreted as four 8-bit big-endian numbers, appended as bytes. + * |reportingId| +
- * "NameReport" +
+ To compute the key hash of reporting ID given an [=interest group=] |ig| and an + [=interest group ad=] |igAd|, and a [=string=]-or-null |selectedReportingId|: + 1. Let |middle| be the [=string/concatenation=] of the following strings separated with U+000A (LF): * the [=serialization of an origin|serialization=] of |ig|'s [=interest group/owner=] * the [=URL serializer|serialization=] of |ig|'s [=interest group/bidding url=] * the [=URL serializer|serialization=] of |igAd|'s [=interest group ad/render url=] - * If |igAd|'s [=interest group ad/buyer and seller reporting ID=] - [=map/exists=]: - * "BuyerAndSellerReportingId" - * |igAd|'s [=interest group ad/buyer and seller reporting ID=] - * Otherwise, if |igAd|'s [=interest group ad/buyer reporting ID=] - [=map/exists=]: - * "BuyerReportingId" - * |igAd|'s [=interest group ad/buyer reporting ID=] - * Otherwise: - * "IgName" - * |ig|'s [=interest group/name=]. - 1. Return the [=SHA-256=] hash of the [=ASCII encoding=] of |keyString|. + 1. Let |keyString| be an empty [=string=]. + 1. If |selectedReportingId| is not null, then set the |keyString| to be the [=string/concatenation=] + of the following strings separated with U+000A (LF): + * "SelectedBuyerAndSellerReportId" + * |middle| + * The result of [=compute the key part for one of multiple reporting ids=] given |selectedReportingId| + * The result of [=compute the key part for one of multiple reporting ids=] given |igAd|'s + [=interest group ad/buyer and seller reporting ID=] + * The result of [=compute the key part for one of multiple reporting ids=] given |igAd|'s + [=interest group ad/buyer reporting ID=] + 1. Otherwise: + 1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is not null, set |keyString| + to be the [=string/concatenation=] of the following strings separated with U+000A (LF): + * "BuyerAndSellerReportId" + * |middle| + * |igAd|'s [=interest group ad/buyer and seller reporting ID=] + 1. Otherwise if |igAd|'s [=interest group ad/buyer reporting ID=] is not null, set |keyString| + to be the [=string/concatenation=] of the following strings separated with U+000A (LF): + * "BuyerReportId" + * |middle| + * |igAd|'s [=interest group ad/buyer reporting ID=] + 1. Otherwise set |keyString| to be the [=string/concatenation=] of the following strings separated + with U+000A (LF): + * "NameReport" + * |middle| + * |igAd|'s [=interest group/name=] + 1. Return the [=SHA-256=] hash of the [=ASCII encoding=] of |keyString|.
To compute the key hash of component ad given an [=interest group ad=] |igAd|: 1. Let |keyString| be the [=string/concatenation=] of the following strings separated with U+000A LF: - 1. "ComponentBid" - 1. the [=URL serializer|serialization=] of |igAd|. + * "ComponentBid" + * the [=URL serializer|serialization=] of |igAd|. 1. Return the [=SHA-256=] hash of the [=ASCII encoding=] of |keyString|.
To query generated bid k-anonymity count given a [=generated bid=] |bid|: - 1. Compute the |adHashCode| following [=compute the key hash of ad=] with the |bid|'s [=generated bid/interest group=] and |bid|'s [=generated bid/ad descriptor=]. + 1. Compute the |adHashCode| following [=compute the key hash of ad=] with the |bid|'s [=generated bid/interest group=], + |bid|'s [=generated bid/ad descriptor=]. 1. If [=query k-anonymity cache=] for |adHashCode| returns false, return false. 1. If |bid|'s [=generated bid/ad component descriptors=] is not null: 1. [=set/For each=] |adComponentDescriptor| in |bid|'s @@ -4054,14 +4119,18 @@ from querying the server during an auction. 1. Compute the |componentAdHashCode| by getting the result of [=compute the key hash of component ad=] with |adComponentDescriptor|'s [=ad descriptor/url=]. 1. If [=query k-anonymity cache=] for |componentAdHashCode| returns false, return false. + 1. If |bid|'s [=generated bid/selected buyer and seller reporting ID=] is not null: + 1. Let |reportingHashCode| be the result of [=compute the key hash of reporting ID=] with the |bid|'s [=generated bid/interest group=], + the |bid|'s [=generated bid/selected buyer and seller reporting ID=]. + 1. If [=query k-anonymity cache=] for |reportingHashCode| returns false, return false. 1. Return true.
To query reporting ID k-anonymity count given an [=interest group=] - |ig| and [=interest group ad=] |igAd|: - 1. Let |keyHash| be the result of [=computing the key hash of reporting ID=] given |ig| and |igAd|. - 1. Return the result of [=query k-anonymity count|querying the k-anonymity count=] given |keyHash|. + |ig|, an [=interest group ad=] |igAd|, and a [=string=]-or-null |selectedReportingId|: + 1. Let |keyHash| be the result of [=computing the key hash of reporting ID=] given |ig|, |igAd|, and |selectedReportingId|. + 1. Return the result of [=query k-anonymity cache=] given |keyHash|.
@@ -4075,12 +4144,16 @@ from querying the server during an auction.
To update k-anonymity cache for interest group given an [=interest group=] |ig|: 1. [=list/For each=] |igAd| of |ig|'s [=interest group/ads=]: - 1. Compute the |adHashCode| following [=compute the key hash of ad=] for |ig| and |igAd|. + 1. Let |adHashCode| be the result of running [=compute the key hash of ad=] given |ig| and |igAd|. 1. Run [=update k-anonymity cache for key=] on |adHashCode|. - 1. Compute the |adReportingHashCode| following [=compute the key hash of reporting ID=]. + 1. Let |adReportingHashCode| be the result of [=computing the key hash of reporting ID=] given |ig|, |igAd|, and null. 1. Run [=update k-anonymity cache for key=] on |adReportingHashCode|. + 1. If |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] is not null: + 1. [=list/For each=] |selectableReportingId| in |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=]: + 1. Set |adReportingHashCode| be the result of [=computing the key hash of reporting ID=] given |ig|, |igAd|, and |selectableReportingId|. + 1. Run [=update k-anonymity cache for key=] on |adReportingHashCode|. 1. [=list/For each=] |componentAd| of |ig|'s [=interest group/ad components=]: - 1. Compute the |componentAdHashCode| following [=compute the key hash of component ad=] for |componentAd|. + 1. Let |componentAdHashCode| be the result of running [=compute the key hash of component ad=] given |componentAd|. 1. Run [=update k-anonymity cache for key=] on |componentAdHashCode|.
@@ -4612,6 +4685,7 @@ dictionary GenerateBidOutput { DOMString bidCurrency; (DOMString or AdRender) render; any ad; + USVString selectedBuyerAndSellerReportingId; sequence<(DOMString or AdRender)> adComponents; double adCost; unrestricted double modelingSignals; @@ -4699,6 +4773,9 @@ To convert GenerateBidOutput to generated bid given a {{GenerateBidOu 1. If |bidAd| is null, return failure. 1. Set |bid|'s [=generated bid/ad descriptor=] to |adDescriptor|. 1. Set |bid|'s [=generated bid/bid ad=] to |bidAd|. + 1. If |generateBidOutput|["{{GenerateBidOutput/selectedBuyerAndSellerReportingId}}"] [=map/exists=]: + 1. Set |bid|'s [=generated bid/selected buyer and seller reporting ID=] to + |generateBidOutput|["{{GenerateBidOutput/selectedBuyerAndSellerReportingId}}"]. 1. If |generateBidOutput|["{{GenerateBidOutput/adComponents}}"] [=map/exists=]: 1. Let |adComponents| be |generateBidOutput|["{{GenerateBidOutput/adComponents}}"]. 1. Return failure if any of the following conditions hold: @@ -5230,6 +5307,8 @@ navigating to another page. Some implementations, such as Chromium, have chosen |igAd|'s [=interest group ad/buyer reporting ID=] to it. 1. If |ad|["{{AuctionAd/buyerAndSellerReportingId}}"] [=map/exists=] then set |igAd|'s [=interest group ad/buyer and seller reporting ID=] to it. + 1. If |ad|["{{AuctionAd/selectableBuyerAndSellerReportingIds}}"] [=map/exists=] + then set |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] to it. 1. [=list/Append=] |igAd| to |igAds|. 1. If |igAds| is not [=list/is empty=]: 1. Set |ig|'s |interestGroupField| to |igAds|. @@ -5894,6 +5973,7 @@ dictionary ReportingBrowserSignals { USVString componentSeller; USVString buyerAndSellerReportingId; + USVString selectedBuyerAndSellerReportingId; }; @@ -5922,8 +6002,15 @@ dictionary ReportingBrowserSignals {
Copied from [=leading bid info/component seller=]
{{ReportingBrowserSignals/buyerAndSellerReportingId}}
Set if the winning ad had a [=interest group ad/buyer and seller reporting ID=] set in its - listing in the interest group, and that value was - [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with interest group owner, + listing in the interest group, and that value was + [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with interest group owner, + bidding script URL, [=ad creative=] URL, and + [=generated bid/selected buyer and seller reporting ID=]. +
{{ReportingBrowserSignals/selectedBuyerAndSellerReportingId}} +
A selected reporting id returned by "`generateBid()`". + Set if the winning bid had a [=generated bid/selected buyer and seller reporting ID=] set, + and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with + [=interest group ad/buyer and seller reporting ID=], interest group owner, bidding script URL, and [=ad creative=] URL. @@ -5975,17 +6062,25 @@ enum KAnonStatus { "passedAndEnforced", "passedNotEnforced", "belowThreshold", "
True if the interest group owner was the only bidder that made bids with the second highest score
{{ReportWinBrowserSignals/buyerReportingId}} -
Set if the winning ad had a [=interest group ad/buyer reporting ID=] but not a - [=interest group ad/buyer and seller reporting ID=] set in its listing in the interest group, - and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with - interest group owner, bidding script URL, and [=ad creative=] URL. +
There are two scenerios in which this can be set: + * Set if the winning ad had a [=interest group ad/buyer reporting ID=] but not a + [=interest group ad/buyer and seller reporting ID=] set in its listing in the interest group, + and the winning bid did not have [=generated bid/selected buyer and seller reporting ID=] set, + and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with + interest group owner, bidding script URL, [=ad creative=] URL, and null. + * Set if the wining bid had a [=generated bid/selected buyer and seller reporting ID=] and the + winning ad had a [=interest group ad/buyer reporting ID=] set in its listing in the + interest group, and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] + combined with [=interest group ad/buyer and seller reporting ID=], interest group owner, bidding + script URL, [=ad creative=] URL, and [=generated bid/selected buyer and seller reporting ID=].
{{ReportWinBrowserSignals/interestGroupName}} -
Only set if the tuple of interest group owner, name, bidding script URL and [=ad creative=] URL - - were [=query reporting ID k-anonymity count|jointly k-anonymous=], and the - winning ad had neither [=interest group ad/buyer and seller reporting ID=] - nor [=interest group ad/buyer reporting ID=] set in its listing in the interest group. +
Only set if all of the following are true: + * The combination of the [=interest group/owner=], [=interest group/name=], [=interest group/bidding url=], + [=ad creative=] URL, and null are [=query reporting ID k-anonymity count|jointly k-anonymous=]. + * The winning ad's [=interest group ad/buyer and seller reporting ID=] and + [=interest group ad/buyer reporting ID=] are null. + * The winning bid's [=generated bid/selected buyer and seller reporting ID=] is null.
{{ReportWinBrowserSignals/modelingSignals}}
A 0-4095 integer (12-bits) passed to `reportWin()`, with noising
{{ReportWinBrowserSignals/dataVersion}} @@ -6154,14 +6249,20 @@ An interest group ad is a [=struct=] with the following [=struct/item : metadata :: Null or a [=string=]. Extra arbitary information about this ad, passed to `generateBid()`. : buyer reporting ID - :: Null or a [=string=]. Will be passed in place of interest group name to [=report win=], subject + :: Null or a [=string=]. Will be passed in place of interest group name to [=report win=], + or alongside the [=generated bid/selected buyer and seller reporting ID=], subject to [=k-anonymity=] checks. Only meaningful in [=interest group/ads=], but ignored in [=interest group/ad components=]. : buyer and seller reporting ID :: Null or a [=string=]. Will be passed in place of interest group name or - [=interest group ad/buyer reporting ID=] to [=report win=] and [=report result=], subject to - [=k-anonymity=] checks. Only meaningful in [=interest group/ads=], but ignored in - [=interest group/ad components=]. + [=interest group ad/buyer reporting ID=], or alongside the + [=generated bid/selected buyer and seller reporting ID=], to [=report win=] and + [=report result=], subject to [=k-anonymity=] checks. Only meaningful in + [=interest group/ads=], but ignored in [=interest group/ad components=]. + : selectable buyer and seller reporting IDs + :: Null or a [=list=] of [=strings=]. A list of reporting ids which will be sent to `generateBid()`, + in order to allow `generateBid()` to return a [=generated bid/selected buyer and seller reporting ID=]. + Only meaningful in [=interest group/ads=], but ignored in [=interest group/ad components=]. : allowed reporting origins :: Null or a [=list=] of [=origins=]. A list of up to 10 reporting origins that can receive reports with registered macros. Each origin's [=origin/scheme=] must be "`https`" and each origin must be @@ -7047,6 +7148,17 @@ result of [=evaluating a bidding script=], or an [=additional bid=] provided by was specified, it will have exactly that many [=list/items=]) by the time the bid participates in the auction. Must be null if the interest group making this bid has a null [=interest group/ad components=] field. + : selected buyer and seller reporting ID + :: Null or [=string=]. The selected reporting id from the + [=interest group ad/selectable buyer and seller reporting IDs=] within the + [=generated bid/interest group=]. If present, this will be: + * Passed alongside [=interest group ad/buyer reporting ID=] and + [=interest group ad/buyer and seller reporting ID=] to [=report win=] + subject to [=k-anonymity=] checks. + * Passed alongside [=interest group ad/buyer and seller reporting ID=] + to [=report result=] subject to [=k-anonymity=] checks. + * Passed alongside [=interest group ad/buyer and seller reporting ID=] + to `scoreAd()`. : ad cost :: Null or a {{double}}. Advertiser click or conversion cost passed from `generateBid()` to `reportWin()`. Negative values will be ignored and not passed. Will be @@ -7117,10 +7229,15 @@ To adjust bid list based on k-anonymity given a [=list=] of [=generat 1. Set |bidCopy|'s [=generated bid/for k-anon auction=] to false. 1. [=Apply any component ads target to a bid=] given |bidCopy|. 1. [=list/Append=] |bidCopy| to |bidsToScore| - 1. If [=query generated bid k-anonymity count=] given |generatedBid| returns true: - - Issue: TODO: change to query k-anonymity cache instead. - (WICG/turtledove#1150) + 1. Let |selectedReportingId| be a [=string=]-or-null that is set to null. + 1. If |generatedBid|'s [=generated bid/selected buyer and seller reporting ID=] is not null, set + |selectedReportingId| to it. + 1. Let |igAd| be the [=interest group ad=] from |generatedBid|'s [=generated bid/interest group=]'s + [=interest group/ads=] whose [=interest group ad/render url=] is |generatedBid|'s + [=generated bid/ad descriptor=]'s [=ad descriptor/url=]. + 1. Let |isBidKAnon| be the result of [=query generated bid k-anonymity count=] given |generatedBid|. + 1. If |isBidKAnon| is true and running [=query reporting ID k-anonymity count=] with |generatedBid|'s + [=generated bid/interest group=], |igAd|, |selectedReportingId| is true: 1. [=list/Append=] |generatedBid| to |bidsToScore|. Note: Conceptually, a bid that's already k-anonymous is considered for both the k-anonymous and