0

Revert "Enable 5 Protected Audience and Fenced Frame features in Mode A/B"

This reverts commit 7f52df769d.

Reason for revert: suspected culprit for b/381980101 and b/381977849

Bug: 381980101, 381977849

Original change's description:
> Enable 5 Protected Audience and Fenced Frame features in Mode A/B
>
> With the end of the Chrome-facilitated testing period, enable these features
> in Modes A and B to provide a more consistent developer experience and
> decrease the need for feature detection:
>  * PA Real Time Reporting
>  * PA multi-bid support
>  * PA deprecatedReplaceInURN via auction config
>  * PA multiple bidding contexts optimization
>  * FF allow cross-origin subframes to send reportEvent() beacons
>
> This was announced here:
>  https://groups.google.com/a/chromium.org/g/blink-dev/c/WgGGPElrG9o
>
> Change-Id: I7d26fb1ea908837557bf60cc8762245c409d0160
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6049396
> Auto-Submit: Paul Jensen <pauljensen@chromium.org>
> Reviewed-by: Shivani Sharma <shivanisha@chromium.org>
> Reviewed-by: Nasko Oskov <nasko@chromium.org>
> Commit-Queue: Nasko Oskov <nasko@chromium.org>
> Reviewed-by: Maks Orlovich <morlovich@chromium.org>
> Reviewed-by: Kent Tamura <tkent@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1390666}

Change-Id: I4cf77749fb95b8de9cdc412c674f7edb9c481edd
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6062886
Auto-Submit: Florian Jacky <fjacky@chromium.org>
Reviewed-by: Balazs Engedy <engedy@chromium.org>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Owners-Override: Florian Jacky <fjacky@chromium.org>
Commit-Queue: Balazs Engedy <engedy@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1390874}
This commit is contained in:
Florian Jacky
2024-12-03 09:17:33 +00:00
committed by Chromium LUCI CQ
parent cdf6d1e706
commit b550c350a6
41 changed files with 817 additions and 17 deletions
content
testing/variations
third_party/blink
common
public
renderer
core
html
fenced_frame
web_tests

@ -2470,7 +2470,9 @@ class FencedFrameParameterizedBrowserTest : public FencedFrameBrowserTestBase {
{blink::features::kFencedFramesAPIChanges, {}},
{blink::features::kFencedFramesAutomaticBeaconCredentials, {}},
{blink::features::kFencedFramesLocalUnpartitionedDataAccess, {}},
{blink::features::kFencedFramesCrossOriginEventReporting, {}},
{blink::features::
kFencedFramesCrossOriginEventReportingUnlabeledTraffic,
{}},
{blink::features::kFencedFramesReportEventHeaderChanges, {}}},
{/* disabled_features */});
}
@ -6532,6 +6534,7 @@ class FencedFrameReportEventBrowserTest
kExceedMaxEventDataLength,
kUntrustedNetworkDisabled,
kCrossOriginNoHeader,
kCrossOriginModeAB
};
// Outcome of reportEvent.
@ -6567,6 +6570,9 @@ class FencedFrameReportEventBrowserTest
return "This document is cross-origin to the document that contains "
"reporting metadata, but the fenced frame's document was not "
"served with the 'Allow-Cross-Origin-Event-Reporting' header.";
case Step::Result::kCrossOriginModeAB:
return "Cross-origin reporting beacons are not supported with Mode A/B "
"Chrome-facilitated testing traffic.";
default:
return "";
}
@ -8386,6 +8392,70 @@ IN_PROC_BROWSER_TEST_F(
}
}
class FencedFrameReportEventFacilitatedTestingEnabledBrowserTest
: public FencedFrameReportEventBrowserTest {
public:
FencedFrameReportEventFacilitatedTestingEnabledBrowserTest() {
scoped_feature_list_.InitAndEnableFeature(
features::kCookieDeprecationFacilitatedTesting);
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
IN_PROC_BROWSER_TEST_F(
FencedFrameReportEventFacilitatedTestingEnabledBrowserTest,
NestedIframeCrossOriginNavigationWithOptIn) {
base::HistogramTester histogram_tester;
std::vector<Step> config = {
{
.is_embedder_initiated = true,
.is_opaque = true,
.destination = {"a.test",
"/set-header"
"?Supports-Loading-Mode: fenced-frame"
"&Allow-Cross-Origin-Event-Reporting: ?1"},
.report_event_result = Step::Result::kSuccess,
},
{
.is_target_nested_iframe = true,
.event = {/*type=*/"click", /*reporting_destination=*/"buyer",
/*data=*/"data", /*cross_origin_exposed=*/true},
.destination = {"b.test", "/fenced_frames/title1.html"},
.report_event_result = Step::Result::kCrossOriginModeAB,
},
};
RunTest(config);
}
IN_PROC_BROWSER_TEST_F(
FencedFrameReportEventFacilitatedTestingEnabledBrowserTest,
CustomURLNestedIframeCrossOriginNavigationWithOptIn) {
base::HistogramTester histogram_tester;
std::vector<Step> config = {
{
.is_embedder_initiated = true,
.is_opaque = true,
.use_custom_destination_url = true,
.destination = {"a.test",
"/set-header"
"?Supports-Loading-Mode: fenced-frame"
"&Allow-Cross-Origin-Event-Reporting: ?1"},
.report_event_result = Step::Result::kSuccess,
},
{
.is_target_nested_iframe = true,
.use_custom_destination_url = true,
.event = {/*type=*/"N/a", /*reporting_destination=*/"N/a",
/*data=*/"data", /*cross_origin_exposed=*/true},
.destination = {"b.test", "/fenced_frames/title1.html"},
.report_event_result = Step::Result::kCrossOriginModeAB,
},
};
RunTest(config);
}
// Parameterized on whether the feature is enabled or not.
class UUIDFrameTreeBrowserTest
: public FencedFrameBrowserTestBase,

@ -2531,7 +2531,9 @@ class InterestGroupAuction::BuyerHelper
}
if (base::FeatureList::IsEnabled(
blink::features::kFledgeRealTimeReporting)) {
blink::features::kFledgeRealTimeReporting) &&
!base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting)) {
if (!base::ranges::all_of(real_time_contributions,
HasValidRealTimeBucket)) {
mojo_bids.clear();
@ -5701,7 +5703,9 @@ void InterestGroupAuction::OnScoreAdComplete(
}
if (base::FeatureList::IsEnabled(
blink::features::kFledgeRealTimeReporting)) {
blink::features::kFledgeRealTimeReporting) &&
!base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting)) {
// Only keep real time reporting contributions when the seller is
// opted-in.
if (config_->non_shared_params.seller_real_time_reporting_type

@ -2286,6 +2286,20 @@ class InterestGroupMultiBidBrowserTest : public InterestGroupBrowserTest {
base::test::ScopedFeatureList feature_list_;
};
class InterestGroupMultiBidAndCookieDeprecationBrowserTest
: public InterestGroupBrowserTest {
public:
InterestGroupMultiBidAndCookieDeprecationBrowserTest() {
feature_list_.InitWithFeatures(
/*enabled_features=*/{blink::features::kFledgeMultiBid,
features::kCookieDeprecationFacilitatedTesting},
/*disabled_features=*/{});
}
protected:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
SameOriginJoinLeaveInterestGroup) {
GURL test_url_a = embedded_https_test_server().GetURL("a.test", "/echo");
@ -9373,6 +9387,149 @@ IN_PROC_BROWSER_TEST_F(
RunAuctionAndWaitForURLAndNavigateIframe(auction_config, expected_url);
}
class DeprecatedRenderURLReplacementsDisabledWithCookieDeprecationBrowserTest
: public InterestGroupBrowserTest {
public:
DeprecatedRenderURLReplacementsDisabledWithCookieDeprecationBrowserTest() {
feature_list_.InitWithFeatures(
/*enabled_features=*/{blink::features::
kFledgeDeprecatedRenderURLReplacements,
features::kCookieDeprecationFacilitatedTesting},
/*disabled_features=*/{});
}
protected:
base::test::ScopedFeatureList feature_list_;
};
// If both DeprecatedRenderURLReplacements and cookie deprecation trial are on,
// we turn DeprecatedRenderURLReplacements off, so it won't affect the study.
IN_PROC_BROWSER_TEST_F(
DeprecatedRenderURLReplacementsDisabledWithCookieDeprecationBrowserTest,
RenderURLReplacementsHaveNoEffect) {
GURL test_url =
embedded_https_test_server().GetURL("a.test", "/page_with_iframe.html");
ASSERT_TRUE(NavigateToURL(shell(), test_url));
url::Origin test_origin = url::Origin::Create(test_url);
GURL ad_url = GURL(embedded_https_test_server()
.GetURL("c.test", "/%%echo%%?${INTEREST_GROUP_NAME}")
.spec());
EXPECT_EQ(kSuccess,
JoinInterestGroupAndVerify(
/*owner=*/test_origin,
/*name=*/"cars",
/*priority=*/0.0, /*execution_mode=*/
blink::InterestGroup::ExecutionMode::kCompatibilityMode,
/*bidding_url=*/
embedded_https_test_server().GetURL(
"a.test", "/interest_group/bidding_logic.js"),
/*ads=*/{{{ad_url, R"({"ad":"metadata","here":[1,2]})"}}}));
for (bool use_promise : {false, true}) {
SCOPED_TRACE(use_promise);
ASSERT_TRUE(ExecJs(shell(), MaybePromiseFunction(use_promise)));
std::string auction_config = JsReplace(
R"({
seller: $1,
decisionLogicURL: $2,
interestGroupBuyers: [$1],
// Signal for verifying that what goes into scoreAd matches
// the deprecatedRenderURLReplacements.
sellerSignals: {deprecatedRenderURLReplacementsExpected: undefined},
deprecatedRenderURLReplacements:
maybePromise({$3: "render_cars", "%%echo%%": "echo"})
})",
test_origin,
embedded_https_test_server().GetURL(
"a.test",
"/interest_group/"
"decision_logic_deprecated_render_url_replacements_validator.js"),
"${INTEREST_GROUP_NAME}");
auto result = RunAuctionAndWait(auction_config,
/*execution_target=*/std::nullopt);
GURL urn_url = GURL(result.ExtractString());
EXPECT_TRUE(urn_url.is_valid());
EXPECT_EQ(url::kUrnScheme, urn_url.scheme_piece());
NavigateIframeAndCheckURL(web_contents(), urn_url, ad_url);
}
}
// If Cookie Deprecation Facilitated Testing is going on, it would by default
// disable deprecatedRenderURLReplacements. However if
// kAllowFledgeDeprecatedRenderURLReplacementsWithCookieDeprecationFacilitatedTesting
// is enabled, that should override the default and allow for
// deprecatedRenderURLReplacements to be enabled alongside the facilitated
// testing.
class DeprecatedRenderURLReplacementsEnabledWithCookieDeprecationBrowserTest
: public InterestGroupBrowserTest {
public:
DeprecatedRenderURLReplacementsEnabledWithCookieDeprecationBrowserTest() {
feature_list_.InitWithFeatures(
/*enabled_features=*/
{blink::features::kFledgeDeprecatedRenderURLReplacements,
blink::features::kAlwaysAllowFledgeDeprecatedRenderURLReplacements,
features::kCookieDeprecationFacilitatedTesting},
/*disabled_features=*/{});
}
protected:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(
DeprecatedRenderURLReplacementsEnabledWithCookieDeprecationBrowserTest,
RunAdAuctionWithWinnerWithRenderURLReplacements) {
GURL test_url =
embedded_https_test_server().GetURL("a.test", "/page_with_iframe.html");
ASSERT_TRUE(NavigateToURL(shell(), test_url));
url::Origin test_origin = url::Origin::Create(test_url);
GURL ad_url = GURL(embedded_https_test_server()
.GetURL("c.test", "/%%echo%%?${INTEREST_GROUP_NAME}")
.spec());
GURL expected_ad_url =
embedded_https_test_server().GetURL("c.test", "/echo?render_cars");
EXPECT_EQ(kSuccess,
JoinInterestGroupAndVerify(
/*owner=*/test_origin,
/*name=*/"cars",
/*priority=*/0.0, /*execution_mode=*/
blink::InterestGroup::ExecutionMode::kCompatibilityMode,
/*bidding_url=*/
embedded_https_test_server().GetURL(
"a.test", "/interest_group/bidding_logic.js"),
/*ads=*/{{{ad_url, R"({"ad":"metadata","here":[1,2]})"}}}));
for (bool use_promise : {false, true}) {
SCOPED_TRACE(use_promise);
ASSERT_TRUE(ExecJs(shell(), MaybePromiseFunction(use_promise)));
std::string auction_config = JsReplace(
R"({
seller: $1,
decisionLogicURL: $2,
interestGroupBuyers: [$1],
// Signal for verifying that what goes into scoreAd matches
// the deprecatedRenderURLReplacements.
sellerSignals: {deprecatedRenderURLReplacementsExpected:
{$3: "render_cars", "%%echo%%": "echo"}},
deprecatedRenderURLReplacements:
maybePromise({$3: "render_cars", "%%echo%%": "echo"})
})",
test_origin,
embedded_https_test_server().GetURL(
"a.test",
"/interest_group/"
"decision_logic_deprecated_render_url_replacements_validator.js"),
"${INTEREST_GROUP_NAME}");
auto result = RunAuctionAndWait(auction_config);
GURL urn_url = GURL(result.ExtractString());
EXPECT_TRUE(urn_url.is_valid());
EXPECT_EQ(url::kUrnScheme, urn_url.scheme_piece());
NavigateIframeAndCheckURL(web_contents(), urn_url, expected_ad_url);
}
}
class DeprecatedRenderURLReplacementsDisabledTest
: public InterestGroupBrowserTest {
public:
@ -17034,6 +17191,51 @@ IN_PROC_BROWSER_TEST_F(InterestGroupMultiBidBrowserTest,
"/echoall?report_bidder10"));
}
// If both multi-bid and cookie deprecation trial are on, we turn multibid off,
// so access to its configuration does not happen.
IN_PROC_BROWSER_TEST_F(InterestGroupMultiBidAndCookieDeprecationBrowserTest,
RunAdAuctionWithPerBuyerMultiBidLimit) {
const char kPublisher[] = "a.test";
const char kBidder[] = "b.test";
const char kSeller[] = "c.test";
GURL bidder_url = embedded_https_test_server().GetURL(kBidder, "/echo");
url::Origin bidder_origin = url::Origin::Create(bidder_url);
GURL ad1_url = embedded_https_test_server().GetURL(kBidder, "/ad1");
// Navigate to bidder site, and add an interest group.
ASSERT_TRUE(NavigateToURL(shell(), bidder_url));
EXPECT_EQ(kSuccess,
JoinInterestGroupAndVerify(
blink::TestInterestGroupBuilder(
/*owner=*/bidder_origin,
/*name=*/"cars")
.SetBiddingUrl(embedded_https_test_server().GetURL(
kBidder, "/interest_group/bidding_logic.js"))
.SetAds({{{ad1_url, /*metadata=*/std::nullopt}}})
.Build()));
// Navigate to publisher and run an ad auction.
ASSERT_TRUE(
NavigateToURL(shell(), embedded_https_test_server().GetURL(
kPublisher, "/page_with_iframe.html")));
GURL seller_logic_url = embedded_https_test_server().GetURL(
kSeller, "/interest_group/decision_logic.js");
const char kAuctionConfigTemplate[] = R"({
seller: $1,
decisionLogicURL: $2,
interestGroupBuyers: [$3],
get perBuyerMultiBidLimits() { throw "should not touch" },
})";
RunAuctionAndWaitForURLAndNavigateIframe(
JsReplace(kAuctionConfigTemplate, url::Origin::Create(seller_logic_url),
seller_logic_url, bidder_origin),
ad1_url);
}
// Validate that createAdRequest is available and be successfully called as part
// of PARAKEET.
IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, CreateAdRequestWorks) {
@ -26384,6 +26586,115 @@ IN_PROC_BROWSER_TEST_F(RealTimeReportingEnabledTest, FeatureDetection) {
<< all_result.error;
}
class RealTimeReportingAndCookieDeprecationEnabledTest
: public InterestGroupBrowserTest {
public:
RealTimeReportingAndCookieDeprecationEnabledTest() {
feature_list_.InitWithFeatures(
/*enabled_features=*/{blink::features::kFledgeRealTimeReporting,
features::kCookieDeprecationFacilitatedTesting},
/*disabled_features=*/{});
}
private:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(RealTimeReportingAndCookieDeprecationEnabledTest,
RealTimeReporting) {
const char kHostA[] = "a.test";
const char kHostB[] = "b.test";
GURL test_url =
embedded_https_test_server().GetURL(kHostA, "/page_with_iframe.html");
ASSERT_TRUE(NavigateToURL(shell(), test_url));
url::Origin test_origin = url::Origin::Create(test_url);
GURL ad_url =
embedded_https_test_server().GetURL(kHostA, "/echo?render_cars");
GURL ad2_url =
embedded_https_test_server().GetURL("c.test", "/echo?render_bikes");
url::Origin test_origin_b =
url::Origin::Create(embedded_https_test_server().GetURL(kHostB, "/echo"));
// IG "winner" should bid 2 and should have won the auction if it bids
// successfully, but it should fail to bid due to it calls undefined real time
// reporting API.
EXPECT_EQ(
kSuccess,
JoinInterestGroupAndVerify(
/*owner=*/test_origin,
/*name=*/"winner",
/*priority=*/0.0,
/*execution_mode=*/
blink::InterestGroup::ExecutionMode::kCompatibilityMode,
/*bidding_url=*/
embedded_https_test_server().GetURL(
kHostA,
"/interest_group/bidding_logic_with_real_time_reporting.js"),
/*ads=*/{{{ad_url, /*metadata=*/std::nullopt}}}));
EXPECT_EQ(kSuccess,
JoinInterestGroupAndVerify(
/*owner=*/test_origin,
/*name=*/"bikes",
/*priority=*/0.0,
/*execution_mode=*/
blink::InterestGroup::ExecutionMode::kCompatibilityMode,
/*bidding_url=*/
embedded_https_test_server().GetURL(
kHostA, "/interest_group/bidding_logic.js"),
/*ads=*/{{{ad2_url, /*metadata=*/std::nullopt}}}));
// IG "bikes" won the auction, since "winner" failed to bid.
std::string auction_config = JsReplace(
R"({
seller: $1,
decisionLogicURL: $2,
interestGroupBuyers: [$3],
sellerRealTimeReportingConfig: {type: 'default-local-reporting'},
perBuyerRealTimeReportingConfig: {
$3: {type: 'default-local-reporting'}
}
})",
test_origin_b,
embedded_https_test_server().GetURL(kHostB,
"/interest_group/decision_logic.js"),
test_origin);
RunAuctionAndWaitForURLAndNavigateIframe(auction_config, ad2_url);
WaitForUrl(embedded_https_test_server().GetURL("/echoall?report_seller"));
WaitForUrl(embedded_https_test_server().GetURL("/echoall?report_bidder"));
EXPECT_FALSE(HasServerSeenUrl(embedded_https_test_server().GetURL(
"a.test", "/.well-known/interest-group/real-time-report")));
// Seller didn't call real time reporting API, so it succeeded, but it
// does not send the default real time report although it opted in.
EXPECT_FALSE(HasServerSeenUrl(embedded_https_test_server().GetURL(
"b.test", "/.well-known/interest-group/real-time-report")));
const GURL kRealTimeReportUrls[] = {
embedded_https_test_server().GetURL(
"a.test", "/.well-known/interest-group/real-time-report"),
embedded_https_test_server().GetURL(
"b.test", "/.well-known/interest-group/real-time-report")};
for (const auto& report_url : kRealTimeReportUrls) {
EXPECT_FALSE(HasServerSeenUrl(report_url));
}
}
IN_PROC_BROWSER_TEST_F(RealTimeReportingAndCookieDeprecationEnabledTest,
FeatureDetection) {
const char kTestExpression[] = R"(
navigator.protectedAudience.queryFeatureSupport(
'realTimeReporting');
)";
GURL test_url =
embedded_https_test_server().GetURL("a.test", "/simple_page.html");
ASSERT_TRUE(NavigateToURL(shell(), test_url));
EXPECT_EQ(false, EvalJs(shell(), kTestExpression));
}
class RealTimeReportingDisabledTest : public InterestGroupBrowserTest {
public:
RealTimeReportingDisabledTest() {

@ -9808,13 +9808,28 @@ bool RenderFrameHostImpl::IsFencedFrameReportingFromRendererAllowed(
if (cross_origin_exposed &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReporting)) {
blink::features::
kFencedFramesCrossOriginEventReportingUnlabeledTraffic) &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReportingAllTraffic)) {
mojo::ReportBadMessage(
"Request to send cross-origin reporting beacons received while feature "
"not enabled.");
return false;
}
if (cross_origin_exposed &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReportingAllTraffic) &&
base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting)) {
AddMessageToConsole(
blink::mojom::ConsoleMessageLevel::kError,
"Cross-origin reporting beacons are not supported with Mode A/B "
"Chrome-facilitated testing traffic.");
return false;
}
if (!fenced_frame_properties.has_value() ||
!fenced_frame_properties->fenced_frame_reporter()) {
// No associated fenced frame reporter. This should have been captured

@ -685,6 +685,18 @@ void ResolveInvalidConfigurations() {
WebRuntimeFeatures::EnableFledge(false);
}
if (base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting)) {
WebRuntimeFeatures::EnableFledgeMultiBid(false);
WebRuntimeFeatures::EnableFledgeRealTimeReporting(false);
if (!base::FeatureList::IsEnabled(
blink::features::
kAlwaysAllowFledgeDeprecatedRenderURLReplacements)) {
WebRuntimeFeatures::EnableFledgeDeprecatedRenderURLReplacements(false);
}
}
// PermissionElement cannot be enabled without the support of the
// browser process.
if (!base::FeatureList::IsEnabled(blink::features::kPermissionElement)) {

@ -62,7 +62,8 @@ FencedFrameTestHelper::FencedFrameTestHelper() {
{features::kFencedFramesEnforceFocus, {}},
{blink::features::kFencedFramesAutomaticBeaconCredentials, {}},
{blink::features::kFencedFramesLocalUnpartitionedDataAccess, {}},
{blink::features::kFencedFramesCrossOriginEventReporting, {}},
{blink::features::kFencedFramesCrossOriginEventReportingUnlabeledTraffic,
{}},
{blink::features::kFencedFramesReportEventHeaderChanges, {}},
{blink::features::kExemptUrlFromNetworkRevocationForTesting, {}}},
{/* disabled_features */});

@ -280,8 +280,16 @@ size_t GetNumberOfGroupByOriginContextsToKeep() {
if (base::FeatureList::IsEnabled(
blink::features::
kFledgeNumberBidderWorkletGroupByOriginContextsToKeep)) {
return blink::features::
kFledgeNumberBidderWorkletGroupByOriginContextsToKeepValue.Get();
// Avoid using multiple contexts for the testing population
// unless otherwise specified by
// kFledgeNumberBidderWorkletContextsIncludeFacilitedTesting.
if (blink::features::
kFledgeNumberBidderWorkletContextsIncludeFacilitedTesting.Get() ||
!base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting)) {
return blink::features::
kFledgeNumberBidderWorkletGroupByOriginContextsToKeepValue.Get();
}
}
return 1;
}
@ -481,7 +489,10 @@ bool BidderWorklet::IsComponentAdKAnon(
// static
bool BidderWorklet::SupportMultiBid() {
return base::FeatureList::IsEnabled(blink::features::kFledgeMultiBid);
// Multi-bid is auto-disabled in mode-A/B trials.
return base::FeatureList::IsEnabled(blink::features::kFledgeMultiBid) &&
!base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting);
}
void BidderWorklet::BeginGenerateBid(

@ -1188,6 +1188,20 @@ class BidderWorkletMultiBidDisabledTest : public BidderWorkletTest {
base::test::ScopedFeatureList feature_list_;
};
// kCookieDeprecationFacilitatedTesting disables kFledgeMultiBid.
class BidderWorkletMultiBidAndCookieDeprecationTest : public BidderWorkletTest {
public:
BidderWorkletMultiBidAndCookieDeprecationTest() {
feature_list_.InitWithFeatures(
/*enabled_features=*/{blink::features::kFledgeMultiBid,
features::kCookieDeprecationFacilitatedTesting},
/*disabled_features=*/{});
}
protected:
base::test::ScopedFeatureList feature_list_;
};
// Test the case the BidderWorklet pipe is closed before invoking the
// GenerateBidCallback. The invocation of the GenerateBidCallback is not
// observed, since the callback is on the pipe that was just closed. There
@ -2885,6 +2899,14 @@ TEST_F(BidderWorkletMultiBidDisabledTest, GenerateBidMultiBid) {
/*expected_bids=*/mojom::BidderWorkletBidPtr());
}
// Cookie disabling trial forces multibid off.
TEST_F(BidderWorkletMultiBidAndCookieDeprecationTest, GenerateBidMultiBid) {
RunGenerateBidWithReturnValueExpectingResult(
R"([{ad: "ad", bid: 1,
render: "https://response.test/"}])",
/*expected_bids=*/mojom::BidderWorkletBidPtr());
}
// Make sure that fields that are only available with multibid on aren't
// read when its off.
TEST_F(BidderWorkletMultiBidDisabledTest, ComponentTargetFieldsOnlyMultiBid) {
@ -2916,6 +2938,38 @@ TEST_F(BidderWorkletMultiBidDisabledTest, ComponentTargetFieldsOnlyMultiBid) {
expected_bid->Clone());
}
// Make sure that fields that are only available with multibid on aren't
// read when its forced off by kCookieDeprecationFacilitatedTesting.
TEST_F(BidderWorkletMultiBidAndCookieDeprecationTest,
ComponentTargetFieldsOnlyMultiBid) {
auto expected_bid = mojom::BidderWorkletBid::New(
auction_worklet::mojom::BidRole::kUnenforcedKAnon, "\"ad\"", 5,
/*bid_currency=*/std::nullopt,
/*ad_cost=*/std::nullopt,
blink::AdDescriptor(GURL("https://response.test/")),
/*selected_buyer_and_seller_reporting_id=*/std::nullopt,
/*ad_component_descriptors=*/std::nullopt,
/*modeling_signals=*/std::nullopt, base::TimeDelta());
RunGenerateBidWithReturnValueExpectingResult(
R"({ad: "ad", bid: 5,
render: {url: "https://response.test/"},
get numMandatoryAdComponents() {
throw 'used numMandatoryAdComponents';
}
})",
expected_bid->Clone());
RunGenerateBidWithReturnValueExpectingResult(
R"({ad: "ad", bid: 5,
render: {url: "https://response.test/"},
get targetNumAdComponents() {
throw 'used targetNumAdComponents';
}
})",
expected_bid->Clone());
}
// Make sure that fields that are only available with multibid on are read
// when it's on. This is mostly meant to validate the multibid=off
// version of the testcase; the actual functionality of the fields is tested

@ -5309,7 +5309,8 @@ class ContextRecyclerRealTimeReportingEnabledTest : public ContextRecyclerTest {
base::test::ScopedFeatureList scoped_feature_list_;
};
// Exercise RealTimeReportingBindings.
// Exercise RealTimeReportingBindings, and make sure they are not available when
// kCookieDeprecationFacilitatedTesting is enabled.
TEST_F(ContextRecyclerRealTimeReportingEnabledTest, RealTimeReportingBindings) {
const char kScript[] = R"(
function test(args) {
@ -5696,4 +5697,79 @@ TEST_F(ContextRecyclerRealTimeReportingDisabledTest,
}
}
class ContextRecyclerRealTimeReportingAndCookieDeprecationEnabledTest
: public ContextRecyclerTest {
public:
ContextRecyclerRealTimeReportingAndCookieDeprecationEnabledTest() {
scoped_feature_list_.InitWithFeatures(
/*enabled_features=*/{blink::features::kFledgeRealTimeReporting,
features::kCookieDeprecationFacilitatedTesting},
/*disabled_features=*/{});
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
// Exercise RealTimeReportingBindings, and make sure they reset properly.
TEST_F(ContextRecyclerRealTimeReportingAndCookieDeprecationEnabledTest,
RealTimeReportingBindings) {
const char kScript[] = R"(
function test(args) {
realTimeReporting.contributeToHistogram(123,args);
}
function testLatency(args) {
realTimeReporting.contributeOnWorkletLatency(200, args);
}
)";
v8::Local<v8::UnboundScript> script = Compile(kScript);
ASSERT_FALSE(script.IsEmpty());
ContextRecycler context_recycler(helper_.get());
{
ContextRecyclerScope scope(context_recycler); // Initialize context
context_recycler.AddRealTimeReportingBindings();
}
{
ContextRecyclerScope scope(context_recycler);
std::vector<std::string> error_msgs;
gin::Dictionary dict = gin::Dictionary::CreateEmpty(helper_->isolate());
dict.Set("priorityWeight", 0.5);
Run(scope, script, "test", error_msgs,
gin::ConvertToV8(helper_->isolate(), dict));
EXPECT_THAT(
error_msgs,
ElementsAre("https://example.test/script.js:3 Uncaught ReferenceError: "
"realTimeReporting is not defined."));
EXPECT_TRUE(context_recycler.real_time_reporting_bindings()
->TakeRealTimeReportingContributions()
.empty());
}
{
ContextRecyclerScope scope(context_recycler);
std::vector<std::string> error_msgs;
gin::Dictionary dict = gin::Dictionary::CreateEmpty(helper_->isolate());
dict.Set("priorityWeight", 0.5);
dict.Set("latencyThreshold", 200);
Run(scope, script, "testLatency", error_msgs,
gin::ConvertToV8(helper_->isolate(), dict));
EXPECT_THAT(
error_msgs,
ElementsAre("https://example.test/script.js:6 Uncaught ReferenceError: "
"realTimeReporting is not defined."));
EXPECT_TRUE(context_recycler.real_time_reporting_bindings()
->TakeRealTimeReportingContributions()
.empty());
}
}
} // namespace auction_worklet

@ -106,8 +106,11 @@ RealTimeReportingBindings::~RealTimeReportingBindings() = default;
void RealTimeReportingBindings::AttachToContext(
v8::Local<v8::Context> context) {
// Don't enable real time reporting in Mode A/B traffic.
if (!base::FeatureList::IsEnabled(
blink::features::kFledgeRealTimeReporting)) {
blink::features::kFledgeRealTimeReporting) ||
base::FeatureList::IsEnabled(
features::kCookieDeprecationFacilitatedTesting)) {
return;
}

@ -9739,6 +9739,25 @@
]
}
],
"FencedFramesEnableCrossOriginEventReporting": [
{
"platforms": [
"android",
"chromeos",
"linux",
"mac",
"windows"
],
"experiments": [
{
"name": "Enabled",
"enable_features": [
"FencedFramesCrossOriginEventReportingUnlabeledTraffic"
]
}
]
}
],
"FencedFramesEnableReportEventHeaderChanges": [
{
"platforms": [

@ -54,6 +54,12 @@ BASE_FEATURE(kAdInterestGroupAPIRestrictedPolicyByDefault,
"AdInterestGroupAPIRestrictedPolicyByDefault",
base::FEATURE_DISABLED_BY_DEFAULT);
// Allow DeprecatedRenderURLReplacements when
// CookieDeprecationFacilitatedTesting is enabled.
BASE_FEATURE(kAlwaysAllowFledgeDeprecatedRenderURLReplacements,
"kAlwaysAllowFledgeDeprecatedRenderURLReplacements",
base::FEATURE_DISABLED_BY_DEFAULT);
// Block all MIDI access with the MIDI_SYSEX permission
BASE_FEATURE(kBlockMidiByDefault,
"BlockMidiByDefault",
@ -827,9 +833,17 @@ BASE_FEATURE(kFencedFrames, "FencedFrames", base::FEATURE_ENABLED_BY_DEFAULT);
// subframes. This requires opt-in both from the cross-origin subframe that is
// sending the beacon as well as the document that contains information about
// the reportEvent() endpoints.
BASE_FEATURE(kFencedFramesCrossOriginEventReporting,
"FencedFramesCrossOriginEventReporting",
// The "UnlabeledTraffic" flag only allows cross-origin reportEvent() beacons
// for non-Mode A/B 3PCD Chrome-facilitated testing traffic. See the
// "CookieDeprecationFacilitatedTesting" feature in
// `content/public/common/content_features.cc` for more information.
BASE_FEATURE(kFencedFramesCrossOriginEventReportingUnlabeledTraffic,
"FencedFramesCrossOriginEventReportingUnlabeledTraffic",
base::FEATURE_ENABLED_BY_DEFAULT);
// The "AllTraffic" flag allows the feature for all traffic regardless of label.
BASE_FEATURE(kFencedFramesCrossOriginEventReportingAllTraffic,
"FencedFramesCrossOriginEventReportingAllTraffic",
base::FEATURE_DISABLED_BY_DEFAULT);
// Temporarily un-disable credentials on fenced frame automatic beacons until
// third party cookie deprecation.
@ -985,6 +999,11 @@ BASE_FEATURE_PARAM(int,
&kFledgeNumberBidderWorkletGroupByOriginContextsToKeep,
"GroupByOriginContextLimit",
10);
BASE_FEATURE_PARAM(bool,
kFledgeNumberBidderWorkletContextsIncludeFacilitedTesting,
&kFledgeNumberBidderWorkletGroupByOriginContextsToKeep,
"IncludeFacilitatedTestingGroups",
false);
BASE_FEATURE(kFledgeAlwaysReuseBidderContext,
"FledgeAlwaysReuseBidderContext",

@ -44,6 +44,9 @@ BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE_PARAM(int,
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
kAdInterestGroupAPIRestrictedPolicyByDefault);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
kAlwaysAllowFledgeDeprecatedRenderURLReplacements);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLowerHighResolutionTimerThreshold);
// Allows running DevTools main thread debugger even when a renderer process
@ -458,7 +461,9 @@ BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE_PARAM(bool,
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kFencedFrames);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
kFencedFramesCrossOriginEventReporting);
kFencedFramesCrossOriginEventReportingUnlabeledTraffic);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
kFencedFramesCrossOriginEventReportingAllTraffic);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
kFencedFramesAutomaticBeaconCredentials);
@ -559,12 +564,17 @@ BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE_PARAM(
// If kFledgeNumberBidderWorkletGroupByOriginContextsToKeep is enabled,
// kFledgeNumberBidderWorkletGroupByOriginContextsToKeepValue sets the number of
// previously-used group-by-origin contexts to keep in case they can be reused
// in a bidder worklet. Defaulted to 1.
// in a bidder worklet. Defaulted to 1. A non-default value will only
// be used if kCookieDeprecationFacilitatedTesting is not enabled or if
// kFledgeNumberBidderWorkletContextsIncludeFacilitedTesting is enabled.
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
kFledgeNumberBidderWorkletGroupByOriginContextsToKeep);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE_PARAM(
int,
kFledgeNumberBidderWorkletGroupByOriginContextsToKeepValue);
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE_PARAM(
bool,
kFledgeNumberBidderWorkletContextsIncludeFacilitedTesting);
// Reuse a single V8 context to generate all bids in a bidder worklet.
BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kFledgeAlwaysReuseBidderContext);

@ -119,7 +119,10 @@ void Fence::reportEventToDestinationEnum(const FenceEvent* event,
}
if (event->crossOriginExposed() &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReporting)) {
blink::features::
kFencedFramesCrossOriginEventReportingUnlabeledTraffic) &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReportingAllTraffic)) {
exception_state.ThrowTypeError(
"'crossOriginExposed' is not supported with reportEvent().");
return;
@ -193,7 +196,10 @@ void Fence::reportEventToDestinationURL(const FenceEvent* event,
}
if (event->crossOriginExposed() &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReporting)) {
blink::features::
kFencedFramesCrossOriginEventReportingUnlabeledTraffic) &&
!base::FeatureList::IsEnabled(
blink::features::kFencedFramesCrossOriginEventReportingAllTraffic)) {
exception_state.ThrowTypeError(
"'crossOriginExposed' is not supported with reportEvent().");
return;

@ -1066,6 +1066,7 @@
-virtual/fenced-frame-mparch/external/wpt/fenced-frame/permission-api-denied.https.html
-virtual/fenced-frame-mparch/external/wpt/fenced-frame/prerender.https.html
-virtual/fenced-frame-mparch/external/wpt/fenced-frame/resize-lock*
-virtual/fledge-disable-cookie-deprecation-testing/external/wpt/fledge/tentative/component-ads.https.window.html?11-15
-virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html
-virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-42.html
-virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-43.html

@ -1502,6 +1502,26 @@
],
"expires": "Mar 1, 2025"
},
"This virtual suite disables CookieDeprecationFacilitatedTesting while",
"enabling fledge flags, to test fledge features that are disabled when",
"CookieDeprecationFacilitatedTesting is enabled.",
{
"prefix": "fledge-disable-cookie-deprecation-testing",
"platforms": ["Linux", "Mac", "Win"],
"owners": ["ybourouphael@google.com", "behamilton@google.com", "mmenke@chromium.org", "pauljensen@chromium.org", "qingxinwu@google.com"],
"bases": [
"external/wpt/fledge/tentative/deprecated-render-url-replacements.https.window.js",
"external/wpt/fledge/tentative/auction-config-passed-to-worklets.https.window.js",
"external/wpt/fledge/tentative/auction-config.https.window.js",
"external/wpt/fledge/tentative/component-ads.https.window.js",
"external/wpt/fledge/tentative/component-auction.https.window.js"
],
"args": [
"--enable-features=InterestGroupStorage,PrivacySandboxAdsAPIsOverride,FencedFrames:implementation_type/mparch,FledgeConsiderKAnonymity",
"--disable-features=CookieDeprecationFacilitatedTesting"
],
"expires": "Jan 1, 2025"
},
{
"prefix": "fledge-bidding-and-auction",
"platforms": [

@ -0,0 +1,7 @@
This is a testharness.js-based test.
[FAIL] AuctionConfig.deprecatedRenderURLReplacements with brackets.
assert_true: Auction unexpectedly had no winner expected true got false
[FAIL] AuctionConfig.deprecatedRenderURLReplacements with percents.
assert_true: Auction unexpectedly had no winner expected true got false
Harness: the test ran to completion.

@ -0,0 +1,13 @@
This is a testharness.js-based test.
[FAIL] deprecatedRenderURLReplacements without end bracket is invalid.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] deprecatedRenderURLReplacements without percents and brackets.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] deprecatedRenderURLReplacements without dollar sign.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] deprecatedRenderURLReplacements without start bracket is invalid.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] deprecatedRenderURLReplacements mix and match is invalid.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
Harness: the test ran to completion.

@ -0,0 +1,7 @@
This is a testharness.js-based test.
[FAIL] perBuyerRealTimeReportingConfig has invalid buyer
assert_true: did not get expected error: [object FencedFrameConfig] expected true got false
[FAIL] perBuyerRealTimeReportingConfig has no type
assert_true: did not get expected error: [object FencedFrameConfig] expected true got false
Harness: the test ran to completion.

@ -0,0 +1,11 @@
This is a testharness.js-based test.
[FAIL] deprecatedRenderURLReplacements missing start percent is invalid.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] deprecatedRenderURLReplacements single percents is invalid.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] deprecatedRenderURLReplacements without end percents is invalid.
assert_true: did not get expected error type: [object FencedFrameConfig] expected true got false
[FAIL] sellerRealTimeReportingConfig has no type
assert_true: did not get expected error: [object FencedFrameConfig] expected true got false
Harness: the test ran to completion.

@ -0,0 +1,11 @@
This is a testharness.js-based test.
[FAIL] component ad with render url replacements with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%EXAMPLE-MACRO%%/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_post&id=bidder_beacon_1, body: ok"]
[FAIL] component ad with render url replacements with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO}/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_post&id=bidder_beacon_1, body: ok"]
[FAIL] component ad with render url replacements with multiple replacements.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO-1}/%%EXAMPLE-MACRO-2%%/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP-1/SSP-2/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_post&id=bidder_beacon_1, body: ok"]
[FAIL] component ad with render url replacements with multiple replacements, and multiple component ads.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO-1}/%%EXAMPLE-MACRO-2%%/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP-1/SSP-2/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP-1/SSP-2/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP-1/SSP-2/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_post&id=bidder_beacon_1, body: ok"]
Harness: the test ran to completion.

@ -0,0 +1,11 @@
This is a testharness.js-based test.
[FAIL] Replacements with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO}/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_component", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_top"]
[FAIL] Replacements with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%EXAMPLE-MACRO%%/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_component", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_top"]
[FAIL] Replacements with multiple replacements.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO1}/%%EXAMPLE-MACRO2%%/" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP1/SSP2/", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_component", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_top"]
[FAIL] deprecatedRenderURLReplacements cause error if passed in top level auction and component auction.
promise_test: Unhandled rejection with value: "Exception unexpectedly not thrown."
Harness: the test ran to completion.

@ -0,0 +1,13 @@
This is a testharness.js-based test.
[FAIL] Replacements with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO}" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Replacements with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%EXAMPLE-MACRO%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Multiple replacements within a URL.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${EXAMPLE-MACRO1}/%%EXAMPLE-MACRO2%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=SSP1/SSP2", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Recursive and reduce size with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${${${1}}}" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${${1}}", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Recursive and increase size with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${1}" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${${1}}", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
Harness: the test ran to completion.

@ -0,0 +1,11 @@
This is a testharness.js-based test.
[FAIL] Replacements use a single pass with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%1%%%%2%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%2%%%%1%%", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Multiple instances of same substitution string with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%1%%%%1%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%2%%%%2%%", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Case sensativity.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%FOO%%%%foo%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%FOO%%%%bar%%", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Super macro, a macro with a macro inside it basically, with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%%%foo%%%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=foo", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
Harness: the test ran to completion.

@ -0,0 +1,7 @@
This is a testharness.js-based test.
[FAIL] Super macro, with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${${foo}}" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=foo", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Super macro, with both.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${%%foo%%}%%${bar}%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=foobar", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
Harness: the test ran to completion.

@ -0,0 +1,11 @@
This is a testharness.js-based test.
[FAIL] Replacements use a single pass with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${1}${2}" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=${2}${1}", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Multiple instances of same substitution string with brackets.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id={${1}${1}}" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id={${2}${2}}"]
[FAIL] Recursive and reduce size with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%%%1%%%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%1%%", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
[FAIL] Recursive and increase size with percents.
assert_in_array: value "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%1%%" not in array ["https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=%%%%1%%%%", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=bidder_report_1", "https://web-platform.test:8444/fledge/tentative/resources/request-tracker.py?uuid=<uuid>&dispatch=track_get&id=seller_report_1"]
Harness: the test ran to completion.

@ -33,7 +33,6 @@ subsetTest(promise_test, async test => {
"adComponentsLimit": 40,
"joinCount": 1,
"bidCount": 0,
"multiBidLimit": 1,
"prevWinsMs": []
}
let biddingLogicURL = createBiddingScriptURL(

@ -0,0 +1,13 @@
This is a testharness.js-based test.
[FAIL] Real time reporting different buyer and seller both opted-in and called api.
assert_true: Auction unexpectedly had no winner expected true got false
[FAIL] Real time reporting buyer opted-in but not seller.
assert_true: Auction unexpectedly had no winner expected true got false
[FAIL] Real time reporting seller opted-in but not buyer.
assert_true: Auction unexpectedly had no winner expected true got false
[FAIL] Real time reporting different buyer and seller both opted-in but did not call api.
promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of null (reading 'length')"
[FAIL] Real time reporting both called api but did not opt-in.
assert_true: Auction unexpectedly had no winner expected true got false
Harness: the test ran to completion.

@ -0,0 +1,9 @@
This is a testharness.js-based test.
[FAIL] Real time reporting buyer and seller same origin.
assert_true: Auction unexpectedly had no winner expected true got false
[FAIL] Real time reporting both winning and losing buyers opted-in.
assert_true: Auction unexpectedly had no winner expected true got false
[FAIL] Real time reporting one buyer opted-in but not the other.
assert_true: Auction unexpectedly had no winner expected true got false
Harness: the test ran to completion.

@ -0,0 +1,6 @@
monorail: {
component: "Chromium > Blink > InterestGroups"
}
buganizer_public: {
component_id: 1456359
}

@ -0,0 +1,9 @@
This directory is to test some Protected Audience (https://github.com/WICG/turtledove/blob/main/FLEDGE.md) features with `CookieDeprecationFacilitatedTesting` turned off.
If the `CookieDeprecationFacilitatedTesting` flag is on, we turn off:
* `FledgeDeprecatedRenderURLReplacements`.
* `FledgeRealTimeReporting`
This virtual test is needed to disable `CookieDeprecationFacilitatedTesting` to allow for:
* `FledgeDeprecatedRenderURLReplacements` to be enabled to test deprecatedRenderURLReplacements.
* `FledgeRealTimeReporting` to be enabled to test real time reporting API.

@ -0,0 +1,3 @@
This is a testharness.js-based test.
Harness: the test ran to completion.

@ -0,0 +1,3 @@
This is a testharness.js-based test.
Harness: the test ran to completion.

@ -0,0 +1,3 @@
This is a testharness.js-based test.
Harness: the test ran to completion.

@ -0,0 +1,3 @@
This is a testharness.js-based test.
Harness: the test ran to completion.

@ -0,0 +1,3 @@
This is a testharness.js-based test.
Harness: the test ran to completion.

@ -0,0 +1,3 @@
This is a testharness.js-based test.
Harness: the test ran to completion.