diff --git a/spec.bs b/spec.bs index a5ba144f5..0cf9370e5 100644 --- a/spec.bs +++ b/spec.bs @@ -58,7 +58,8 @@ spec: RFC8941; urlPrefix: https://httpwg.org/specs/rfc8941.html for: structured header text: boolean; url: boolean text: integer; url: integer - text: boolean; url: boolean + text: list; url: list + text: string; url: string spec: WebAssembly; urlPrefix: https://webassembly.github.io/spec/core/ type: dfn urlPrefix: appendix/embedding.html @@ -303,21 +304,17 @@ This is detectable because it can change the set of fields that are read from th "{{GenerateBidInterestGroup/updateURL}}" [=interest group/update url=] - - "{{GenerateBidInterestGroup/trustedBiddingSignalsURL}}" - [=interest group/trusted bidding signals url=] - 1. If |group| [=map/contains=] |groupMember|: - 1. Let |parsedUrl| be the result of running the [=URL parser=] on |group|[|groupMember|]. - 1. [=exception/Throw=] a {{TypeError}} if any of the following conditions hold: - * |parsedUrl| is failure; - * |parsedUrl| is not [=same origin=] with |interestGroup|'s [=interest group/owner=]; - * |parsedUrl| [=includes credentials=]; - * |parsedUrl| [=url/fragment=] is not null. + 1. Let |parsedUrl| be the result of running [=parse and verify a bidding code or update URL=] + on |group|[|groupMember|] and |interestGroup|'s [=interest group/owner=]. + 1. If |parsedUrl| is failure, then [=exception/throw=] a {{TypeError}}. 1. Set |interestGroup|'s |interestGroupField| to |parsedUrl|. - 1. If |interestGroup|'s [=interest group/trusted bidding signals url=]'s [=url/query=] is not - null, then [=exception/throw=] a {{TypeError}}. + 1. If |group|["{{GenerateBidInterestGroup/trustedBiddingSignalsURL}}"] [=map/exists=]: + 1. Let |parsedUrl| be the result of running [=parse and verify a trusted signals URL=] on + |group|[{{GenerateBidInterestGroup/trustedBiddingSignalsURL}}]. + 1. If |parsedUrl| is failure, then [=exception/throw=] a {{TypeError}}. + 1. Set |interestGroup|'s [=interest group/trusted bidding signals url=] to |parsedUrl|. 1. If |group|["{{GenerateBidInterestGroup/trustedBiddingSignalsKeys}}"] [=map/exists=], then set |interestGroup|'s [=interest group/trusted bidding signals keys=] to |group|["{{GenerateBidInterestGroup/trustedBiddingSignalsKeys}}"]. @@ -1061,11 +1058,9 @@ To validate and convert auction ad config given an {{AuctionAdConfig} [=auction config/seller=], then return failure. 1. Set |auctionConfig|'s [=auction config/decision logic url=] to |decisionLogicURL|. 1. If |config|["{{AuctionAdConfig/trustedScoringSignalsURL}}"] [=map/exists=]: - 1. Let |trustedScoringSignalsURL| be the result of running the [=URL parser=] on + 1. Let |trustedScoringSignalsURL| be the result of [=parse and verify a trusted signals URL=] on |config|["{{AuctionAdConfig/trustedScoringSignalsURL}}"]. - 1. If |trustedScoringSignalsURL| is failure, or it is not [=same origin=] with |auctionConfig|'s - [=auction config/seller=], then return failure. - 1. [=Assert=]: |trustedScoringSignalsURL|'s [=url/scheme=] is "`https`". + 1. If |trustedScoringSignalsURL| is failure, return failure. 1. Set |auctionConfig|'s [=auction config/trusted scoring signals url=] to |trustedScoringSignalsURL|. 1. If |config|["{{AuctionAdConfig/maxTrustedScoringSignalsURLLength}}"] [=map/exists=]: @@ -1463,7 +1458,8 @@ To check if required seller capabilities are permitted given an [=auc
-To generate potentially multiple bids given an [=ordered map=]-or-null |allTrustedBiddingSignals|, +To generate potentially multiple bids given an [=ordered map=]-or-null +|allTrustedBiddingSignals|, and an [=origin=]-or-null |crossOriginTrustedBiddingSignalsOrigin|, a [=string=] |auctionSignals|, a {{BiddingBrowserSignals}} |browserSignals|, a [=string=]-or-null |perBuyerSignals|, a {{DirectFromSellerSignalsForBuyer}} |directFromSellerSignalsForBuyer|, a [=duration=] |perBuyerTimeout| in milliseconds, a [=currency tag=] |expectedCurrency|, an {{unsigned short}} @@ -1490,8 +1486,8 @@ a {{DirectFromSellerSignalsForBuyer}} |directFromSellerSignalsForBuyer|, a [=dur 1. [=map/Set=] |prevWinIDL|["{{PreviousWin/adJSON}}"] to |prevWin|'s [=previous win/ad json=]. 1. [=list/Append=] |prevWinIDL| to |prevWins|. 1. [=map/Set=] |browserSignals|["{{BiddingBrowserSignals/prevWinsMs}}"] to |prevWins|. - 1. Let |biddingScript| be the result of [=fetching script=] with |ig|'s - [=interest group/bidding url=]. + 1. Let « |biddingScript|, ignored » be the result of [=fetching script=] with + |ig|'s [=interest group/bidding url=]. 1. If |biddingScript| is failure, return failure. 1. If |ig|'s [=interest group/bidding wasm helper url=] is not null: 1. Let |wasmModuleObject| be the result of [=fetching WebAssembly=] with |ig|'s @@ -1506,9 +1502,21 @@ a {{DirectFromSellerSignalsForBuyer}} |directFromSellerSignalsForBuyer|, a [=dur 1. [=list/For each=] |key| of |ig|'s [=interest group/trusted bidding signals keys=]: 1. If |allTrustedBiddingSignals|[|key|] [=map/exists=], then [=map/set=] |trustedBiddingSignals|[|key|] to |allTrustedBiddingSignals|[|key|]. + 1. Let |sameOriginTrustedBiddingSignals| be null. + 1. Let |crossOriginTrustedBiddingSignals| be null. + 1. If |trustedBiddingSignals| is not null: + 1. If |crossOriginTrustedBiddingSignalsOrigin| is null, then set + |sameOriginTrustedBiddingSignals| to |trustedBiddingSignals|. + 1. Otherwise: + 1. Set |crossOriginTrustedBiddingSignals| to a new [=ordered map=] whose [=map/keys=] are + [=strings=] and whose [=map/values=] are {{any}}. + 1. Let |originKey| be the [=serialization of an origin|serialization=] of + |crossOriginTrustedBiddingSignalsOrigin|. + 1. [=map/Set=] |crossOriginTrustedBiddingSignalsOrigin|[|originKey|] to |trustedBiddingSignals|. 1. Return the result of [=evaluating a bidding script=] with |biddingScript|, |multiBidLimit|, |ig|, |expectedCurrency|, - |igGenerateBid|, |auctionSignals|, |perBuyerSignals|, |trustedBiddingSignals|, |browserSignals|, - |directFromSellerSignalsForBuyer|, and |perBuyerTimeout|. + |igGenerateBid|, |auctionSignals|, |perBuyerSignals|, |sameOriginTrustedBiddingSignals|, + |crossOriginTrustedBiddingSignals|, |browserSignals|, |directFromSellerSignalsForBuyer|. + and |perBuyerTimeout|.
@@ -1519,8 +1527,8 @@ To generate and score bids given an [=auction config=] |auctionConfig |bidDebugReportInfoList|: 1. [=Assert=] that these steps are running [=in parallel=]. 1. Let |auctionStartTime| be the [=current wall time=]. -1. Let |decisionLogicScript| be the result of [=fetching script=] with |auctionConfig|'s - [=auction config/decision logic url=]. +1. Let « |decisionLogicScript|, |allowCrossOriginTrustedScoringSignalsFrom| » be the result of + [=fetching script=] with |auctionConfig|'s [=auction config/decision logic url=]. 1. If |decisionLogicScript| is failure, return null. 1. Let |seller| be |auctionConfig|'s [=auction config/seller=]. 1. Let « |bidGenerators|, |negativeTargetInfo| » be the result of running @@ -1552,12 +1560,12 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. If |compWinnerInfo|'s [=leading bid info/leading bid=] is not null, then run [=score and rank a bid=] with |auctionConfig|, |compWinnerInfo|'s [=leading bid info/leading bid=], |leadingBidInfo|, |decisionLogicScript|, - null, "top-level-auction", null, and |topLevelOrigin|. + |allowCrossOriginTrustedScoringSignalsFrom|, null, "top-level-auction", null, and |topLevelOrigin|. 1. If |compWinnerInfo|'s [=leading bid info/leading non-k-anon-enforced bid=] is not null, then run [=score and rank a bid=] with |auctionConfig|, |compWinnerInfo|'s [=leading bid info/leading non-k-anon-enforced bid=], - |leadingBidInfo|, |decisionLogicScript|, null, "top-level-auction", null, - and |topLevelOrigin|. + |leadingBidInfo|, |decisionLogicScript|, |allowCrossOriginTrustedScoringSignalsFrom|, null, + "top-level-auction", null, and |topLevelOrigin|. 1. Decrement |pendingComponentAuctions| by 1. 1. Wait until |pendingComponentAuctions| is 0. 1. If |leadingBidInfo|'s [=leading bid info/leading bid=] is null, return null. @@ -1623,8 +1631,8 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Let |pendingAdditionalBids| be the [=list/size=] of |additionalBids|. 1. [=list/For each=] |additionalBid| of |additionalBids|, run the following steps [=in parallel=]: 1. [=Score and rank a bid=] with |auctionConfig|, |additionalBid|, |leadingBidInfo|, - |decisionLogicScript|, null, |auctionLevel|, |componentAuctionExpectedCurrency|, and - |topLevelOrigin|. + |decisionLogicScript|, |allowCrossOriginTrustedScoringSignalsFrom|, null, |auctionLevel|, + |componentAuctionExpectedCurrency|, and |topLevelOrigin|. 1. Decrement |pendingAdditionalBids| by 1. 1. Let |settings| be |global|'s [=relevant settings object=]. 1. [=map/For each=] |buyer| → |perBuyerGenerator| of |bidGenerators|, @@ -1673,6 +1681,9 @@ To generate and score bids given an [=auction config=] |auctionConfig to the result of running [=is debugging only in cooldown or lockout=] with |buyer|. 1. [=map/For each=] |slotSizeQueryParam| → |perSlotSizeQueryParam| of |perBuyerGenerator|: 1. [=map/For each=] |signalsUrl| → |perSignalsUrlGenerator| of |perSlotSizeQueryParam|: + 1. Let |crossOriginTrustedBiddingSignalsOrigin| be null. + 1. If |buyer| is not [=same origin=] with |signalsUrl|'s [=url/origin=], then set + |crossOriginTrustedBiddingSignalsOrigin| to |signalsUrl|'s [=url/origin=]. 1. Let |trustedBiddingSignalsBatcher| be a new [=trusted bidding signals batcher=]. 1. Let |fetchSignalStartTime| be |settings|'s [=environment settings object/current monotonic time=]. 1. [=map/For each=] joiningOrigin → |groups| of |perSignalsUrlGenerator|: @@ -1680,7 +1691,7 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. [=Batch or fetch trusted bidding signals=] given |trustedBiddingSignalsBatcher|, |ig|, |signalsUrl|, |buyerExperimentGroupId|, |topLevelOrigin|, and |slotSizeQueryParam|. 1. [=Fetch the current outstanding trusted signals batch=] given |trustedBiddingSignalsBatcher|, - |signalsUrl|, |buyerExperimentGroupId|, |topLevelOrigin|, and |slotSizeQueryParam|. + |signalsUrl|, |buyer|, |buyerExperimentGroupId|, |topLevelOrigin|, and |slotSizeQueryParam|. 1. [=Process updateIfOlderThanMs=] with |buyer|, and |trustedBiddingSignalsBatcher|'s [=trusted bidding signals batcher/all per interest group data=]. 1. Let |fetchSignalDuration| be the [=duration from=] |fetchSignalStartTime| to |settings|'s @@ -1705,11 +1716,17 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Set |dataVersion| to |trustedBiddingSignalsBatcher|'s [=trusted bidding signals batcher/data versions=] [|ig|'s [=interest group/name=]]. 1. Set |allTrustedBiddingSignals| to [=trusted bidding signals batcher/all trusted bidding signals=]. - 1. If |dataVersion| is not null, then [=map/set=] |browserSignals|["{{BiddingBrowserSignals/dataVersion}}"] to |dataVersion|. - 1. Otherwise, [=map/remove=] |browserSignals|["{{BiddingBrowserSignals/dataVersion}}"]. + 1. [=map/Remove=] |browserSignals|["{{BiddingBrowserSignals/dataVersion}}"]. + 1. [=map/Remove=] |browserSignals|["{{BiddingBrowserSignals/crossOriginDataVersion}}"]. + 1. If |dataVersion| is not null: + 1. If |crossOriginTrustedBiddingSignalsOrigin| is not null, then [=map/set=] + |browserSignals|["{{BiddingBrowserSignals/crossOriginDataVersion}}"] to |dataVersion|. + 1. Otherwise, [=map/set=] |browserSignals|["{{BiddingBrowserSignals/dataVersion}}"] to + |dataVersion|. 1. Let « |bidsBatch|, |bidDebugReportInfo| » be the result of [=generate potentially multiple bids=] given - |allTrustedBiddingSignals|, |auctionSignals|, a [=map/clone=] of |browserSignals|, - |perBuyerSignals|, |directFromSellerSignalsForBuyer|, |perBuyerTimeout|, + |allTrustedBiddingSignals|, |crossOriginTrustedBiddingSignalsOrigin|, |auctionSignals|, + a [=map/clone=] of |browserSignals|, |perBuyerSignals|, + |directFromSellerSignalsForBuyer|, |perBuyerTimeout|, |expectedCurrency|, |multiBidLimit|, |ig|, and |auctionStartTime|. 1. Let |generateBidDuration| be the [=duration from=] |generateBidStartTime| to |settings|'s [=environment settings object/current monotonic time=], in milliseconds. @@ -1748,7 +1765,8 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Let |generateBidStartTime| be |settings|'s [=environment settings object/current monotonic time=]. 1. Set « |generatedBids|, |bidDebugReportInfo| » to the result of [=generate potentially multiple bids=] given - |allTrustedBiddingSignals|, |auctionSignals|, a [=map/clone=] of |browserSignals|, + |allTrustedBiddingSignals|, |crossOriginTrustedBiddingSignalsOrigin|, |auctionSignals|, + a [=map/clone=] of |browserSignals|, |perBuyerSignals|, |directFromSellerSignalsForBuyer|, |perBuyerTimeout|, |expectedCurrency|, 1 (for multiBidLimit), |ig|, and |auctionStartTime|. @@ -1771,7 +1789,8 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. If |bidToScore|'s [=generated bid/for k-anon auction=] is true, [=list/append=] |bidToScore|'s [=generated bid/interest group=] to |bidIgs|. 1. [=Score and rank a bid=] with |auctionConfig|, |bidToScore|, |leadingBidInfo|, - |decisionLogicScript|, |directFromSellerSignalsForSeller|, |dataVersion|, |auctionLevel|, + |decisionLogicScript|, |allowCrossOriginTrustedScoringSignalsFrom|, + |directFromSellerSignalsForSeller|, |dataVersion|, |auctionLevel|, |componentAuctionExpectedCurrency|, and |topLevelOrigin|. 1. Decrement |pendingBuyers| by 1. 1. Wait until both |pendingBuyers| and |pendingAdditionalBids| are 0. @@ -1856,55 +1875,96 @@ To convert to an AuctionAd sequence given a [=list=]-or-null |ads|:
-To score and rank a bid given an [=auction config=] |auctionConfig|, a [=generated bid=] -|generatedBid|, a [=bid debug reporting info=] |bidDebugReportInfo|, a [=leading bid info=] |leadingBidInfo|, a [=string=] |decisionLogicScript|, a -{{DirectFromSellerSignalsForSeller}} |directFromSellerSignalsForSeller|, an {{unsigned long}}-or-null -|biddingDataVersion|, an enum |auctionLevel|, which is "single-level-auction", "top-level-auction", -or "component-auction", a [=currency tag=] |componentAuctionExpectedCurrency|, and an [=origin=] -|topLevelOrigin|: - +To fetch and decode trusted scoring signals given an [=auction config=] |auctionConfig|, +a [=generated bid=] |generatedBid|, a [=list=] of [=origins=] +|allowCrossOriginTrustedScoringSignalsFrom|, and an [=origin=] |topLevelOrigin|: + +1. Let |crossOriginTrustedScoringSignalsOrigin| be null. +1. Let |sameOriginTrustedScoringSignals| be null. +1. Let |crossOriginTrustedScoringSignals| be null. +1. Let |scoringDataVersion| be null. 1. Let |renderURL| be [=URL serializer|serialized=] |generatedBid|'s [=generated bid/ad descriptor=]'s [=ad descriptor/url=]. 1. Let |adComponentRenderURLs| be a new empty [=list=]. 1. If |generatedBid|'s [=generated bid/ad component descriptors=] is not null: - 1. [=list/For each=] |adComponentDescriptor| in |generatedBid|'s - [=generated bid/ad component descriptors=]: + 1. [=list/For each=] |adComponentDescriptor| in |generatedBid|'s [=generated bid/ad component + descriptors=]: 1. [=list/Append=] [=URL serializer|serialized=] |adComponentDescriptor|'s [=ad descriptor/url=] to |adComponentRenderURLs|. -1. Let |fullSignalsUrl| be the result of [=building trusted scoring signals url=] with |auctionConfig|'s - [=auction config/trusted scoring signals url=], «|renderURL|», |adComponentRenderURLs|, - |auctionConfig|'s [=auction config/seller experiment group id=], and |topLevelOrigin|. - - Implementations may batch requests by collecting render URLs and ad component render URLs - from multiple invocations of [=score and rank a bid=] and passing them all to a single invocation - of [=building trusted scoring signals url=] to get a |scoringSignalsUrl|. By employing this approach, - the [=string/length=] of [=URL serializer|serialized=] |scoringSignalsUrl| must not exceed the - - [=auction config/max trusted scoring signals url length=] of the auction. In cases where the length - limit is exceeded, the request must be divided into smaller pieces to comply with the length restriction. - However, note that a single request is always considered valid, regardless of whether its length exceeds - the auction's [=auction config/max trusted scoring signals url length=]. - - - The network response has to be parsed to pull out the pieces relevant to each - [=evaluating a scoring script|evaluation of a scoring script=]. -1. Let |trustedScoringSignals| be null. -1. Let «|allTrustedScoringSignals|, ignored, |scoringDataVersion|» be the result of [=fetching - trusted signals=] with |fullSignalsUrl| and false. -1. If |allTrustedScoringSignals| is an [=ordered map=]: - 1. Set |trustedScoringSignals| to a new empty [=map=]. - 1. [=map/Set=] |trustedScoringSignals|["`renderURL`"] to a new empty [=map=]. - 1. If |allTrustedScoringSignals|["`renderURLs`"] [=map/exists=] and - |allTrustedScoringSignals|["`renderURLs`"][|renderURL|] [=map/exists=], then [=map/set=] |trustedScoringSignals|["`renderURL`"][|renderURL|] to - |allTrustedScoringSignals|["`renderURLs`"][|renderURL|]. - 1. If |adComponentRenderURLs| is not [=list/empty=]: - 1. Let |adComponentRenderURLsValue| be a new empty [=map=]. - 1. If |allTrustedScoringSignals|["`adComponentRenderURLs`"] [=map/exists=], [=set/for each=] - |adComponentRenderURL| in |adComponentRenderURLs|: - 1. If |allTrustedScoringSignals|["`adComponentRenderURLs`"][|adComponentRenderURL|] - [=map/exists=], then [=map/set=] |adComponentRenderURLsValue|[|adComponentRenderURL|] to - |allTrustedScoringSignals|["`adComponentRenderURLs`"][|adComponentRenderURL|]. - 1. [=map/Set=] |trustedScoringSignals|["`adComponentRenderURLs`"] to |adComponentRenderURLsValue|. +1. Let |fullSignalsUrl| be null. +1. If |auctionConfig|'s [=auction config/trusted scoring signals url=] is not null: + 1. Set |fullSignalsUrl| be the result of [=building trusted scoring signals url=] with |auctionConfig|'s + [=auction config/trusted scoring signals url=], «|renderURL|», |adComponentRenderURLs|, + |auctionConfig|'s [=auction config/seller experiment group id=], and |topLevelOrigin|. + + Implementations may batch trusted scoring signals + requests with same [=auction config/trusted scoring signals url=], |auctionConfig|'s + [=auction config/seller experiment group id=], and |topLevelOrigin| by collecting render URLs + and ad component render URLs from multiple invocations of [=score and rank a bid=] and passing + them all to a single invocation of [=building trusted scoring signals url=] to get a + |scoringSignalsUrl|. Requests may not be combined if the resulting combination's + [=string/length=] of [=URL serializer|serialized=] |scoringSignalsUrl| exceeds the [=auction + config/max trusted scoring signals url length=] of the auction; however this limit does not + apply if no combining has taken place. + + The network response has to be parsed to pull out the pieces relevant to each + [=evaluating a scoring script|evaluation of a scoring script=]. + + These requests may also begin before the script fetch, but requests cross-origin to the + script origin must not happen until [:Ad-Auction-Allow-Trusted-Scoring-Signals-From:] header on + the script is received, parsed, and determined to authorize such a fetch. + 1. If |fullSignalsUrl|'s [=url/origin=] is not [=same origin=] with |auctionConfig|'s + [=auction config/seller=], then: + 1. Set |crossOriginTrustedScoringSignalsOrigin| to |fullSignalsUrl|'s [=url/origin=]. + 1. If |allowCrossOriginTrustedScoringSignalsFrom| does not [=list/contain=] + |crossOriginTrustedScoringSignalsOrigin|: + 1. Set |crossOriginTrustedScoringSignalsOrigin| to null. + 1. Set |fullSignalsUrl| to null. +1. If |fullSignalsUrl| is not null: + 1. Let |allTrustedScoringSignals| be null. + 1. Set «|allTrustedScoringSignals|, + ignored, |scoringDataVersion|» to the result of [=fetching trusted signals=] + with |fullSignalsUrl|, |auctionConfig|'s [=auction config/seller=], and false. + 1. If |allTrustedScoringSignals| is an [=ordered map=]: + 1. Let |trustedScoringSignals| be a new empty [=map=]. + 1. [=map/Set=] |trustedScoringSignals|["`renderURL`"] to a new empty [=map=]. + 1. If |allTrustedScoringSignals|["`renderURLs`"] [=map/exists=] and + |allTrustedScoringSignals|["`renderURLs`"][|renderURL|] [=map/exists=], then [=map/set=] + |trustedScoringSignals|["`renderURL`"][|renderURL|] to + |allTrustedScoringSignals|["`renderURLs`"][|renderURL|]. + 1. If |adComponentRenderURLs| is not [=list/empty=]: + 1. Let |adComponentRenderURLsValue| be a new empty [=map=]. + 1. If |allTrustedScoringSignals|["`adComponentRenderURLs`"] [=map/exists=], [=set/for each=] + |adComponentRenderURL| in |adComponentRenderURLs|: + 1. If |allTrustedScoringSignals|["`adComponentRenderURLs`"][|adComponentRenderURL|] + [=map/exists=], then [=map/set=] |adComponentRenderURLsValue|[|adComponentRenderURL|] to + |allTrustedScoringSignals|["`adComponentRenderURLs`"][|adComponentRenderURL|]. + 1. [=map/Set=] |trustedScoringSignals|["`adComponentRenderURLs`"] to |adComponentRenderURLsValue|. + 1. If |crossOriginTrustedScoringSignalsOrigin| is null, set |sameOriginTrustedScoringSignals| + to |trustedScoringSignals|. + 1. Otherwise: + 1. Set |crossOriginTrustedScoringSignals| to a new [=map=]. + 1. Let |originKey| be the [=serialization of an origin|serialization=] given + |crossOriginTrustedScoringSignalsOrigin|. + 1. [=map/Set=] |crossOriginTrustedScoringSignals|[|originKey|] to |trustedScoringSignals|. +1. Return «|crossOriginTrustedScoringSignalsOrigin|, |sameOriginTrustedScoringSignals|, + |crossOriginTrustedScoringSignals|, |scoringDataVersion|» + +
+ +
+To score and rank a bid given an [=auction config=] |auctionConfig|, a [=generated bid=] +|generatedBid|, a [=bid debug reporting info=] |bidDebugReportInfo|, a [=leading bid info=] |leadingBidInfo|, +a [=string=] |decisionLogicScript|, a [=list=] or [=origins=] |allowCrossOriginTrustedScoringSignalsFrom|, +a {{DirectFromSellerSignalsForSeller}} |directFromSellerSignalsForSeller|, an {{unsigned long}}-or-null +|biddingDataVersion|, an enum |auctionLevel|, which is "single-level-auction", "top-level-auction", +or "component-auction", a [=currency tag=] |componentAuctionExpectedCurrency|, and an [=origin=] +|topLevelOrigin|: + +1. Let «|crossOriginTrustedScoringSignalsOrigin|, |sameOriginTrustedScoringSignals|, + |crossOriginTrustedScoringSignals|, |scoringDataVersion|» be the result of [=fetch and + decode trusted scoring signals=] given |auctionConfig|, |generatedBid|, + |allowCrossOriginTrustedScoringSignalsFrom|, |topLevelOrigin|. 1. Let |adMetadata| be |generatedBid|'s [=generated bid/ad=]. 1. Let |bidValue| be |generatedBid|'s [=generated bid/bid=]. 1. If |generatedBid|'s [=generated bid/modified bid=] is not null, then set |bidValue| to @@ -1929,7 +1989,11 @@ or "component-auction", a [=currency tag=] |componentAuctionExpectedCurrency|, a
The result of [=serializing a currency tag=] with |generatedBid|'s [=generated bid/bid=]'s [=bid with currency/currency=]
{{ScoringBrowserSignals/dataVersion}} -
|scoringDataVersion| if it is not null, {{undefined}} otherwise +
|scoringDataVersion| if it is not null and |crossOriginTrustedScoringSignalsOrigin| is null, + unset otherwise. +
{{ScoringBrowserSignals/crossOriginDataVersion}} +
|scoringDataVersion| if it is not null and |crossOriginTrustedScoringSignalsOrigin| is not + null, unset otherwise.
{{ScoringBrowserSignals/adComponents}}
|generatedBid|'s [=generated bid/ad component descriptors=] [=converted to a string sequence=]
{{ScoringBrowserSignals/forDebuggingOnlyInCooldownOrLockout}} @@ -1939,8 +2003,8 @@ or "component-auction", a [=currency tag=] |componentAuctionExpectedCurrency|, a 1. Let « |scoreAdResult|, |debugWinReportUrl|, |debugLossReportUrl| » be the result of [=evaluating a scoring script=] with |decisionLogicScript|, |adMetadata|, |bidValue|'s [=bid with currency/value=], |auctionConfig|'s [=auction config/config idl=], - |trustedScoringSignals|, |browserSignals|, |directFromSellerSignalsForSeller|, and - |auctionConfig|'s [=auction config/seller timeout=]. + |sameOriginTrustedScoringSignals|, |crossOriginTrustedScoringSignals|, |browserSignals|, + |directFromSellerSignalsForSeller|, and |auctionConfig|'s [=auction config/seller timeout=]. 1. If |auctionLevel| is "top-level-auction": 1. Set |bidDebugReportInfo|'s [=bid debug reporting info/top level seller debug loss report url=] to |debugLossReportUrl|. @@ -2116,6 +2180,24 @@ To validate fetching response given a [=response=] |response|, null, 1. Return true.
+The Ad-Auction-Allow-Trusted-Scoring-Signals-From HTTP response header is a +[=structured header=] whose value must be a [=structured header/list=] of [=structured header/strings=]. + +
+To parse allowed trusted scoring signals origins given a [=header list=] |headerList|: + + 1. Let |parsedHeader| be the result of [=header list/getting a structured field value=] + given [:Ad-Auction-Allow-Trusted-Scoring-Signals-From:] and "`list`" from |headerList|. + 1. If |parsedHeader| is null, return an empty [=list=]. + 1. Let |result| be a new [=list=] of [=origins=]. + 1. [=list/For each=] |entry| in |parsedHeader|: + 1. If |entry| is not a [=string=], return an empty [=list=]. + 1. Let |parsedEntry| be the result of [=parsing an https origin=] on |entry|. + 1. If |parsedEntry| is failure, return an empty [=list=]. + 1. [=list/Append=] |parsedEntry| to |result|. + 1. Return |result|. +
+
To fetch script given a [=URL=] |url|: 1. Let |request| be a new [=request=] with the following properties: @@ -2140,14 +2222,30 @@ To fetch script given a [=URL=] |url|: Issue: Stop using "`no-cors`" mode where possible (WICG/turtledove#667). 1. Let |script| be null. - 1. [=Fetch=] |request| with [=fetch/useParallelQueue=] set to true, and - [=fetch/processResponseConsumeBody=] set to the following steps given a [=response=] |response| - and null, failure, or a [=byte sequence=] |responseBody|: - 1. If [=validate fetching response=] with |response|, |responseBody| and "`text/javascript`" - returns false, set |script| to failure and return. - 1. Set |script| to |responseBody|. + 1. Let |allowCrossOriginTrustedScoringSignalsFrom| be an empty [=list=]. + 1. Let |fetchController| be the result of [=fetching=] |request| with [=fetch/useParallelQueue=] + set to true, and [=fetch/processResponse=] set to the following steps given + a [=response=] |response|: + 1. If the result of [=validating fetching response headers=] given |response| is false: + 1. [=fetch controller/Abort=] |fetchController|. + 1. Set |script| to failure. + 1. Return. + 1. Set |allowCrossOriginTrustedScoringSignalsFrom| to the result of [=parsing allowed trusted + scoring signals origins=] given |response|'s [=response/header list=]. + 1. Let |bodyStream| be |response|’s [=response/body=]’s [=body/stream=]. + 1. Let |bodyReader| be result of [=ReadableStream/getting a reader=] from |bodyStream|. + 1. Let |successSteps| be a set of steps that take a [=byte sequence=] |responseBody|, and + perform the following: + 1. If [=validate fetching response mime and body=] with |response|, |responseBody| and + "`text/javascript`" returns false, set |script| to failure. + 1. Otherwise, set |script| to |responseBody|. + 1. Let |failureSteps| be a set of steps that take an [=exception=] e, and + perform the following: + 1. Set |script| to failure. + 1. [=ReadableStreamDefaultReader/Read all bytes=] from |bodyReader|, given |successSteps| + and |failureSteps|. 1. Wait for |script| to be set. - 1. Return |script|. + 1. Return « |script|, |allowCrossOriginTrustedScoringSignalsFrom| ».
@@ -2192,17 +2290,20 @@ The X-fledge-bidding-signals-format-version is a [=structured header=] whose value must be an [=structured header/integer=].
-To fetch trusted signals given a [=URL=] |url|, and a [=boolean=] |isBiddingSignal|: +To fetch trusted signals given a [=URL=] |url|, an [=origin=] |scriptOrigin|, +and a [=boolean=] |isBiddingSignal|: 1. Let |request| be a new [=request=] with the following properties: : [=request/URL=] :: |url| + : [=request/origin=] + :: |scriptOrigin| : [=request/header list=] :: «`Accept`: `application/json`» : [=request/client=] :: `null` : [=request/mode=] - :: "`no-cors`" + :: "`cors`" : [=request/referrer=] :: "`no-referrer`" : [=request/credentials mode=] @@ -2213,8 +2314,6 @@ To fetch trusted signals given a [=URL=] |url|, and a [=boolean=] |is Issue: One of the side-effects of a `null` client for this subresource request is it neuters all service worker interceptions, despite not having to set the service workers mode. - Issue: Stop using "`no-cors`" mode where possible - (WICG/turtledove#667). 1. Let |signals| be null. 1. Let |dataVersion| be null. 1. Let |formatVersion| be null. @@ -2522,8 +2621,8 @@ To report result given a [=leading bid info=] |leadingBidInfo|, a 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. Let |sellerReportingScript| be the result of [=fetching script=] with |config|'s - [=auction config/decision logic url=]. + 1. Let « |sellerReportingScript|, ignored » be the result of [=fetching script=] + with |config|'s [=auction config/decision logic url=]. 1. Let « |sellerSignals|, |reportUrl|, |reportingBeaconMap|, ignored » be the result of [=evaluating a reporting script=] with |sellerReportingScript|, "`reportResult`", |config|'s [=auction config/config idl=]'s {{AuctionAdConfig/reportingTimeout}}, and @@ -2591,8 +2690,8 @@ a {{ReportingBrowserSignals}} |browserSignals|, and a [=direct from seller signa |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 |buyerReportingScript| be the result of [=fetching script=] with |winner|'s - [=generated bid/interest group=]'s [=interest group/bidding url=]. + 1. Let « |buyerReportingScript|, ignored » be the result of [=fetching script=] + with |winner|'s [=generated bid/interest group=]'s [=interest group/bidding url=]. 1. Let |reportFunctionName| be "`reportWin`". 1. If |winner|'s [=generated bid/provided as additional bid=] is true: 1. Set |reportFunctionName| be "`reportAdditionalBidWin`". @@ -3434,9 +3533,9 @@ of the following global objects: |multiBidLimit|, an [=interest group=] |ig|, a [=currency tag=] |expectedCurrency|, a {{GenerateBidInterestGroup}} |igGenerateBid|, a [=string=]-or-null |auctionSignals|, a [=string=]-or-null |perBuyerSignals|, an [=ordered map=]-or-null - |trustedBiddingSignals|, a {{BiddingBrowserSignals}} |browserSignals|, - a {{DirectFromSellerSignalsForBuyer}} |directFromSellerSignalsForBuyer| and an integer millisecond - [=duration=] |timeout|: + |sameOriginTrustedBiddingSignals|, an [=ordered map=]-or-null |crossOriginTrustedBiddingSignals|, + a {{BiddingBrowserSignals}} |browserSignals|, a {{DirectFromSellerSignalsForBuyer}} + |directFromSellerSignalsForBuyer|, and an integer millisecond [=duration=] |timeout|: 1. Let |realm| be the result of [=creating a new script runner realm=] given {{InterestGroupBiddingScriptRunnerGlobalScope}}. @@ -3461,14 +3560,18 @@ of the following global objects: |auctionSignals| if |auctionSignals| is not null, otherwise {{undefined}}. 1. Let |perBuyerSignalsJS| be the result of [=parsing a JSON string to a JavaScript value=] given |perBuyerSignals| if |perBuyerSignals| is not null, otherwise {{undefined}}. - 1. Let |trustedBiddingSignalsJS| be |trustedBiddingSignals| [=converted to ECMAScript values=]. + 1. Let |sameOriginTrustedBiddingSignalsJS| be |sameOriginTrustedBiddingSignals| + [=converted to ECMAScript values=]. 1. Let |browserSignalsJS| be |browserSignals| [=converted to ECMAScript values=]. - 1. Let |directFromSellerSignalsJs| be |directFromSellerSignalsForBuyer| + 1. Let |directFromSellerSignalsJS| be |directFromSellerSignalsForBuyer| [=converted to ECMAScript values=]. + 1. Let |crossOriginTrustedBiddingSignalsJS| be |crossOriginTrustedBiddingSignals| + [=converted to ECMAScript values=]. 1. Let |startTime| be |settings|'s [=environment settings object/current monotonic time=]. 1. Let |result| be the result of [=evaluating a script=] with |realm|, |script|, "`generateBid`", - « |igJS|, |auctionSignalsJS|, |perBuyerSignalsJS|, |trustedBiddingSignalsJS|, |browserSignalsJS|, - |directFromSellerSignalsJs| », and |timeout|. + « |igJS|, |auctionSignalsJS|, |perBuyerSignalsJS|, |sameOriginTrustedBiddingSignalsJS|, + |browserSignalsJS|, |directFromSellerSignalsJS|, |crossOriginTrustedBiddingSignalsJS| », + and |timeout|. 1. Let |duration| be |settings|'s [=environment settings object/current monotonic time=] minus |startTime| in milliseconds. 1. If |global|'s [=InterestGroupBiddingScriptRunnerGlobalScope/priority=] is not null and not failure: @@ -3515,21 +3618,25 @@ of the following global objects:
To evaluate a scoring script given a [=string=] |script|, a [=string=] |adMetadata|, - a {{double}} |bidValue|, an {{AuctionAdConfig}} |auctionConfigIDL|, an [=ordered map=] - |trustedScoringSignals|, a {{ScoringBrowserSignals}} |browserSignals|, a - {{DirectFromSellerSignalsForSeller}} |directFromSellerSignalsForSeller|, and an integer - millisecond [=duration=] |timeout|: + a {{double}} |bidValue|, an {{AuctionAdConfig}} |auctionConfigIDL|, an [=ordered map=]-or-null + |sameOriginTrustedScoringSignals|, an [=ordered map=]-or-null |crossOriginTrustedScoringSignals|, + {{ScoringBrowserSignals}} |browserSignals|, a {{DirectFromSellerSignalsForSeller}} + |directFromSellerSignalsForSeller|, and an integer millisecond [=duration=] |timeout|: 1. Let |realm| be the result of [=creating a new script runner realm=] given {{InterestGroupScoringScriptRunnerGlobalScope}}. 1. Let |browserSignalsJS| be |browserSignals| [=converted to ECMAScript values=]. 1. Let |auctionConfigJS| be |auctionConfigIDL| [=converted to ECMAScript values=]. - 1. Let |trustedScoringSignalsJS| be |trustedScoringSignals| [=converted to ECMAScript values=]. + 1. Let |sameOriginTrustedScoringSignalsJS| be |sameOriginTrustedScoringSignals| + [=converted to ECMAScript values=]. + 1. Let |crossOriginTrustedScoringSignalsJS| be |crossOriginTrustedScoringSignals| + [=converted to ECMAScript values=]. 1. Let |directFromSellerSignalsJs| be |directFromSellerSignalsForSeller| [=converted to ECMAScript values=]. 1. Let |scoreAdResult| be the result of [=evaluating a script=] with |realm|, |script|, "`scoreAd`", - «|adMetadata|, |bidValue|, |auctionConfigJS|, |trustedScoringSignalsJS|, |browserSignalsJS|, - |directFromSellerSignalsJs|», and |timeout|. + «|adMetadata|, |bidValue|, |auctionConfigJS|, |sameOriginTrustedScoringSignalsJS|, + |browserSignalsJS|, |directFromSellerSignalsJs|, |crossOriginTrustedScoringSignalsJS|», + and |timeout|. 1. Let |debugWinReportUrl| be |global|'s [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug win report url=] if it's not failure, null otherwise. @@ -4202,9 +4309,8 @@ navigating to another page. Some implementations, such as Chromium, have chosen
"`biddingLogicURL`"
"`biddingWasmHelperURL`"
"`updateURL`" -
"`trustedBiddingSignalsURL`"
- 1. For each |groupMember| and |interestGroupField| in the following table + 1. For each |groupMember| and |interestGroupField|, in the following table @@ -4219,21 +4325,22 @@ navigating to another page. Some implementations, such as Chromium, have chosen - - - -
Group memberInterest group field
"`updateURL`" [=interest group/update url=]
"`trustedBiddingSignalsURL`"[=interest group/trusted bidding signals url=]
- 1. Let |parsedURL| be the result of running the [=URL parser=] on |value|. 1. If |key| is not |groupMember|, [=iteration/continue=]. - 1. Jump to the step labeled Abort update - if any of the following conditions hold: - * |parsedURL| is failure; - * |parsedURL|'s [=url/origin=] is not [=same origin=] with |ig|'s - [=interest group/owner=]; - * |parsedURL| [=includes credentials=]; - * |parsedURL| [=url/fragment=] is not null. - 1. Set |ig|'s |interestGroupField| to |parsedURL|. + 1. If |value| is a [=string=]: + 1. Let |parsedURL| be the result of [=parse and verify a bidding code or update URL=] + on |value| and |ig|'s [=interest group/owner=]. + 1. If |parsedURL| is failure, jump to the step labeled + Abort update + 1. Set |ig|'s |interestGroupField| to |parsedURL|. + +
"`trustedBiddingSignalsURL`"
+
+ 1. If |value| is a [=string=]: + 1. Let |parsedURL| be the result of [=parse and verify a trusted signals URL=] on |value|. + 1. If |parsedURL| is failure, jump to the step labeled + Abort update + 1. Set |ig|'s [=interest group/trusted bidding signals url=] to |parsedURL|.
"`trustedBiddingSignalsKeys`"
@@ -4379,8 +4486,11 @@ The queryFeatureSupport(feature) method :: 40 : "deprecatedRenderURLReplacements" :: true + : "permitCrossOriginTrustedSignals" + :: true : "reportingTimeout" :: true +1. If |feature| is "*", then return |featuresTable|. 1. If |featuresTable|[|feature|] [=map/exists=], then return |featuresTable|[|feature|]. 1. Return `undefined`. @@ -4465,6 +4575,33 @@ The estimated size of an [=interest group=] |ig| 1. Return the [=URL serializer|serialization=] of |url|.
+
+ To parse and verify a bidding code or update URL given a [=string=] |input| and an + [=origin=] |igOwner|: + + 1. Let |parsedUrl| be the result of running the [=URL parser=] on |input|. + 1. Return failure if any of the following conditions hold: + * |parsedUrl| is failure; + * |parsedUrl|'s [=url/origin=] is not [=same origin=] with |igOwner|; + * |parsedUrl| [=includes credentials=]; + * |parsedUrl|'s [=url/fragment=] is not null. + 1. [=Assert=]: |parsedUrl|'s [=url/scheme=] is "`https`". + 1. Return |parsedUrl|. +
+ +
+ To parse and verify a trusted signals URL given a [=string=] |input|: + + 1. Let |parsedUrl| be the result of running the [=URL parser=] on |input|. + 1. Return failure if any of the following conditions hold: + * |parsedUrl| is failure; + * |parsedUrl|'s [=url/scheme=] is not "`https`"; + * |parsedUrl| [=includes credentials=]; + * |parsedUrl|'s [=url/fragment=] is not null; + * |parsedUrl|'s [=url/query=] is not null. + 1. Return |parsedUrl|. +
+
To round a value given a {{double}} |value|: @@ -4855,6 +4992,7 @@ dictionary BiddingBrowserSignals { sequence prevWinsMs; object wasmHelper; unsigned long dataVersion; + unsigned long crossOriginDataVersion; boolean forDebuggingOnlyInCooldownOrLockout = false; }; @@ -4867,6 +5005,7 @@ dictionary ScoringBrowserSignals { record renderSize; unsigned long dataVersion; + unsigned long crossOriginDataVersion; sequence adComponents; boolean forDebuggingOnlyInCooldownOrLockout = false; }; @@ -5093,10 +5232,6 @@ An interest group is a [=struct=] with the following [=struct/items=] : trusted bidding signals url :: Null or a [=URL=]. Provide a mechanism for making real-time data available for use at bidding time. See [=building trusted bidding signals url=]. -

- When non-null, the [=interest group/trusted bidding signals url=]'s [=origin=] will always be - [=same origin=] with [=interest group/owner=]. -

: trusted bidding signals keys :: Null or a [=list=] of [=strings=]. See [=building trusted bidding signals url=]. : trusted bidding signals slot size mode @@ -5239,10 +5374,6 @@ An auction config is a [=struct=] with the following [=struct/items=] Provide a mechanism for making real-time data (information about a specific [=ad creative=]) available for use at [=evaluate a scoring script|scoring=] time, e.g. the results of some ad scanning system. -

- When non-null, the [=auction config/trusted scoring signals url=]'s [=origin=] will always be - [=same origin=] with [=auction config/seller=]. -

: max trusted scoring signals url length :: A {{long}} integer, initially 0. Indicates the maximum trusted scoring signals fetch url length for the auction config. 0 means no limit. @@ -5542,9 +5673,9 @@ To append to a bidding signals per-interest group data map given an [
To fetch the current outstanding trusted signals batch given a -[=trusted bidding signals batcher=] |trustedBiddingSignalsBatcher|, a [=URL=] |signalsUrl|, an -{{unsigned short}}-or-null |experimentGroupId|, an [=origin=] |topLevelOrigin|, -and a [=string=] |slotSizeQueryParam|: +[=trusted bidding signals batcher=] |trustedBiddingSignalsBatcher|, a [=URL=] |signalsUrl|, +an [=origin=] |scriptOrigin|, an {{unsigned short}}-or-null |experimentGroupId|, +an [=origin=] |topLevelOrigin|, and a [=string=] |slotSizeQueryParam|: 1. If |signalsUrl| is null, return. 1. Let |biddingSignalsUrl| be the result of [=building trusted bidding signals url=] with @@ -5552,7 +5683,7 @@ and a [=string=] |slotSizeQueryParam|: |trustedBiddingSignalsBatcher|'s [=trusted bidding signals batcher/ig names=], |experimentGroupId|, |topLevelOrigin|, and |slotSizeQueryParam|. 1. Let « |partialTrustedBiddingSignals|, |partialPerInterestGroupData|, |dataVersion| » be the - result of [=fetching trusted signals=] with |biddingSignalsUrl| and true. + result of [=fetching trusted signals=] with |biddingSignalsUrl|, |scriptOrigin|, and true. 1. If |partialTrustedBiddingSignals| is not null: 1. [=map/For each=] |key| → |value| in |partialTrustedBiddingSignals|, [=map/set=] |trustedBiddingSignalsBatcher|'s [=trusted bidding signals batcher/all trusted bidding @@ -5573,9 +5704,9 @@ and a [=string=] |slotSizeQueryParam|:
To batch or fetch trusted bidding signals given a [=trusted bidding signals batcher=] -|trustedBiddingSignalsBatcher|, [=interest group=] |ig|, a [=URL=] |signalsUrl|, an -{{unsigned short}}-or-null |experimentGroupId|, an [=origin=] |topLevelOrigin|, -and a [=string=] |slotSizeQueryParam|: +|trustedBiddingSignalsBatcher|, [=interest group=] |ig|, a [=URL=] |signalsUrl|, +an [=origin=] |scriptOrigin| an {{unsigned short}}-or-null |experimentGroupId|, +an [=origin=] |topLevelOrigin|, and a [=string=] |slotSizeQueryParam|: 1. If |signalsUrl| is null: 1. [=map/Set=] |trustedBiddingSignalsBatcher|'s [=trusted bidding signals batcher/no signals flags=] @@ -5614,7 +5745,7 @@ and a [=string=] |slotSizeQueryParam|: |putativeLengthLimit|. 1. Otherwise: 1. [=Fetch the current outstanding trusted signals batch=] given |trustedBiddingSignalsBatcher|, - |signalsUrl|, |experimentGroupId|, |topLevelOrigin|, |slotSizeQueryParam|. + |signalsUrl|, |scriptOrigin|, |experimentGroupId|, |topLevelOrigin|, |slotSizeQueryParam|. 1. If |ig|'s [=interest group/trusted bidding signals keys=] is not null, set |trustedBiddingSignalsBatcher|'s [=trusted bidding signals batcher/keys=] to a [=list/clone=] of |ig|'s [=interest group/trusted bidding signals keys=].