1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
// META: script=/resources/testdriver.js
// META: script=/common/utils.js
// META: script=resources/fledge-util.sub.js
// META: script=/common/subset-tests.js
// META: timeout=long
// META: variant=?1-last
"use strict;"
// This file contains tests for additional bids and negative targeting.
//
// TODO:
// - test that an negatively targeted additional bid is suppressed.
// - test that an incorrectly signed additional bid is not negative targeted.
// - test that an missing-signature additional bid is not negative targeted.
// - test that an additional bid with some correct signatures can be negative.
// negative targeted for those negative interest groups whose signatures
// match.
// - test an additional bid with multiple negative interest groups.
// - test that multiple negative interest groups with mismatched joining origins
// is not negative targeted.
// - test that additional bids can be fetched using an iframe navigation.
// - test that additional bids are not fetched using an iframe navigation for
// which the `adAuctionHeaders=true` attribute is not specified.
// - test that additional bids are not fetched using a Fetch request for which
// `adAuctionHeaders: true` is not specified.
// - test that an additional bid with an incorrect auction nonce is not used
// included in an auction. Same for seller and top-level seller.
// - test that correctly formatted additional bids are included in an auction
// when fetched alongside malformed additional bid headers by a Fetch
// request.
// - test that correctly formatted additional bids are included in an auction
// when fetched alongside malformed additional bid headers by an iframe
// navigation.
// - test that reportWin is not used for reporting an additional bid win.
// - test that additional bids can *not* be fetched from iframe subresource
// requests.
// - test that an auction nonce can only be used once, and a second auction
// trying to reuse an auction immediately fails.
// - test that an auction nonce must be created in the same window/tab as the
// call to runAdAuction.
// - test reportAdditionalBidWin with each of no metadata, null metadata, and
// an object metadata.
// - test that an auction running in one tab can't see an additional bid loaded
// in a new tab.
// - test that two auctions running with different nonces only get the
// additional bids fetched with their auction nonce.
// - test that two auctions running with different nonces only get the
// additional bids fetched with their auction nonce, when both additional
// bids are retrieved with one fetch.
// - test that a multiseller auction with two component auctions can direct
// additional bids to the correct component auctions.
// - test that two auctions running with different nonces only get the
// additional bids fetched with their auction nonce.
// - test that two auctions running with different nonces only get the
// additional bids fetched with their auction nonce, when both additional
// bids are retrieved with one fetch.
// - test that an additional bid can compete against an interest group bid and
// lose.
// - test that an additional bid can compete against an interest group bid and
// win.
// - test that a malformed additional bid causes that one additional bid to be
// ignored, but the rest of the auction (and other additional bids, even
// from the same fetch) continue on.
// - test (in join-leave-ad-interest-group.https.window.js) that an IG that
// provides `additionalBidKey` fails if the key fails to decode, or if
// that IG also provides `ads`, or if it provides `updateURL`.
// - test that an IG update cannot cause a regular interest group (one that
// does not provide `additionalBidKey`) to become a negative interest
// group (one that does provide `additionalBidKey`).
// - test (in auction-config-passed-to-worklets.https.window.js) that a
// multi-seller auction fails if the top-level auction provides
// a value for `additionalBids`.
// - test (in auction-config-passed-to-worklets.https.window.js) that an auction
// fails if it provides `additionalBids` but not `auctionNonce`, or if it
// provides `additionalBids` but not `interestGroupBuyers`.
// The auction is run with the seller being the same as the document origin.
// The request to fetch additional bids must be issued to the seller's origin
// for ad auction headers interception to associate it with this auction.
const SINGLE_SELLER_AUCTION_SELLER = window.location.origin;
// Single-seller auction with a single buyer who places a single additional
// bid. As the only bid, this wins.
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
const auctionNonce = await navigator.createAuctionNonce();
const seller = SINGLE_SELLER_AUCTION_SELLER;
const buyer = OTHER_ORIGIN1;
const additionalBid = createAdditionalBid(
uuid, auctionNonce, seller, buyer, 'horses', 1.99);
await runAdditionalBidTest(
test, uuid, [buyer], auctionNonce,
fetchAdditionalBids(seller, [additionalBid]),
/*highestScoringOtherBid=*/0,
/*winningAdditionalBidId=*/'horses');
}, 'single valid additional bid');
// Single-seller auction with a two buyers competing with additional bids.
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
const auctionNonce = await navigator.createAuctionNonce();
const seller = SINGLE_SELLER_AUCTION_SELLER;
const buyer1 = OTHER_ORIGIN1;
const additionalBid1 = createAdditionalBid(
uuid, auctionNonce, seller, buyer1, 'horses', 1.99);
const buyer2 = OTHER_ORIGIN2;
const additionalBid2 = createAdditionalBid(
uuid, auctionNonce, seller, buyer2, 'planes', 2.99);
await runAdditionalBidTest(
test, uuid, [buyer1, buyer2], auctionNonce,
fetchAdditionalBids(seller, [additionalBid1, additionalBid2]),
/*highestScoringOtherBid=*/1.99,
/*winningAdditionalBidId=*/'planes');
}, 'two valid additional bids');
// Same as the test above, except that this uses two Fetch requests instead of
// one to retrieve the additional bids.
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
const auctionNonce = await navigator.createAuctionNonce();
const seller = SINGLE_SELLER_AUCTION_SELLER;
const buyer1 = OTHER_ORIGIN1;
const additionalBid1 = createAdditionalBid(
uuid, auctionNonce, seller, buyer1, 'horses', 1.99);
const buyer2 = OTHER_ORIGIN2;
const additionalBid2 = createAdditionalBid(
uuid, auctionNonce, seller, buyer2, 'planes', 2.99);
await runAdditionalBidTest(
test, uuid, [buyer1, buyer2], auctionNonce,
Promise.all([
fetchAdditionalBids(seller, [additionalBid1]),
fetchAdditionalBids(seller, [additionalBid2])
]),
/*highestScoringOtherBid=*/1.99,
/*winningAdditionalBidId=*/'planes');
}, 'two valid additional bids from two distinct Fetch requests');
|