Fenced Frames: [4/N] Fledge `runAdAuction()` yields a FencedFrameConfig
This CL doesn't fully implement the change advertised in the headline
(resolving a web-exposed FencedFrameConfig object in the Promise
returned from `runAdAuction()`); it is a refactoring in preparation for
that change.
This CL makes the RunAdAuction() IPC callback exclusively return an
optional `blink::FencedFrame::RedactedFencedFrameConfig` to the
renderer, where the `NavigationAuction` object is responsible for
pulling the internal URN off of this object and returning it to script.
This URN is identical to the URN that was previously returned to the
renderer via the same callback, hence the "refactoring" nature of this
CL.
To do this, we add a non-nullable URL member to the
blink.mojom.FencedFrameConfig struct, with appropriate validation and
unit testing.
A subsequent CL will modify the input dictionary to `runAdAuction()`
to give web developers the ability to express that they want a
full-blown config object returned to them in the `Promise` that
`runAdAuction()` resolves to, not just a URN. That CL will be easy to
write since the backing config will already be in place in the
renderer.
Bug: 1347953
Change-Id: I88a7ca0f8b59c7f31f9df406a8ef382c04d6c67d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4098955
Reviewed-by: Matt Menke <mmenke@chromium.org>
Commit-Queue: Dominic Farolino <dom@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Garrett Tanzer <gtanzer@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1083114}
diff --git a/content/browser/fenced_frame/fenced_frame_config.h b/content/browser/fenced_frame/fenced_frame_config.h
index 50a146c..5054be2 100644
--- a/content/browser/fenced_frame/fenced_frame_config.h
+++ b/content/browser/fenced_frame/fenced_frame_config.h
@@ -85,7 +85,7 @@
class FencedFrameURLMapping;
extern const char kUrnUuidPrefix[];
-GURL GenerateUrnUuid();
+GURL CONTENT_EXPORT GenerateUrnUuid();
using AdAuctionData = blink::FencedFrame::AdAuctionData;
using ReportingMetadata = blink::FencedFrame::FencedFrameReporting;
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
index 606db43..7918be0b 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -125,7 +125,8 @@
.first;
}
-void FencedFrameURLMapping::AssignFencedFrameURLAndInterestGroupInfo(
+blink::FencedFrame::RedactedFencedFrameConfig
+FencedFrameURLMapping::AssignFencedFrameURLAndInterestGroupInfo(
const GURL& urn_uuid,
const GURL& url,
AdAuctionData ad_auction_data,
@@ -166,6 +167,8 @@
config.reporting_metadata_.emplace(reporting_metadata,
VisibilityToEmbedder::kOpaque,
VisibilityToContent::kTransparent);
+
+ return config.RedactFor(FencedFrameEntity::kEmbedder);
}
absl::optional<GURL> FencedFrameURLMapping::GeneratePendingMappedURN() {
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h
index 6231424..fa249ad7 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.h
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -72,13 +72,18 @@
// Move pending mapped `urn_uuid` from `pending_urn_uuid_to_url_map_` to
// `urn_uuid_to_url_map_`. Then assign ad auction data as well as an ordered
// list of ad component URLs, provided by a bidder running an auction, to the
- // entry associated with the `urn_uuid`. These will to be made available to
- // any fenced frame navigated to the returned URN, via the InterestGroup API.
+ // entry associated with the `urn_uuid` and its associated
+ // `FencedFrameConfig`. These will to be made available to any fenced frame
+ // that gets navigated to the URN encapsulated inside the
+ // `RedactedFencedFrameConfig` that is returned from this method. Either this
+ // config or the internal URN inside of it is returned to script via the
+ // InterestGroup API. They used to perform the fenced frame navigation.
//
// `on_navigate_callback` should be run on navigation to `urn_uuid`.
//
// See https://github.com/WICG/turtledove/blob/main/FLEDGE.md
- void AssignFencedFrameURLAndInterestGroupInfo(
+ blink::FencedFrame::RedactedFencedFrameConfig
+ AssignFencedFrameURLAndInterestGroupInfo(
const GURL& urn_uuid,
const GURL& url,
AdAuctionData auction_data,
diff --git a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
index d10ddba..3e66fab 100644
--- a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
+++ b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
@@ -2,11 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h"
+#include <type_traits>
+
+#include "base/test/gtest_util.h"
#include "content/browser/fenced_frame/fenced_frame_config.h"
#include "mojo/public/cpp/test_support/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h"
+#include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h"
#include "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom.h"
namespace content {
@@ -111,6 +114,9 @@
{ \
/* Test an empty config */ \
type config; \
+ if constexpr (std::is_same<FencedFrameConfig, type>::value) { \
+ config.urn_.emplace(GenerateUrnUuid()); \
+ } \
TEST_PROPERTY_FOR_ENTITY_IS_DEFINED_IS_OPAQUE( \
type, property, Entity::kEmbedder, false, false, \
unredacted_redacted_equality_fn, redacted_redacted_equality_fn); \
@@ -195,9 +201,57 @@
return true; \
}
+TEST(FencedFrameConfigMojomTraitsTest, ConfigMojomTraitsInternalUrnTest) {
+ GURL test_url("test_url");
+
+ struct TestCase {
+ GURL urn;
+ bool pass = false;
+ } test_cases[] = {
+ {GURL(), false},
+ {GURL("https://example.com"), false},
+ {GURL("data:text/html<h1>MyWebsite"), false},
+ {GURL("urn:abcd:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"), false},
+ {GURL("urn:uuid:foo"), false},
+ {GURL("urn:uuid:f81d4faea7deca11d0aa765a00a0c91e6bf6"), false},
+ {GURL("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"), true},
+ {GenerateUrnUuid(), true},
+ };
+
+ for (const TestCase& test_case : test_cases) {
+ FencedFrameConfig browser_config(test_case.urn, test_url);
+ RedactedFencedFrameConfig input_config =
+ browser_config.RedactFor(FencedFrameEntity::kEmbedder);
+ RedactedFencedFrameConfig output_config;
+
+ if (test_case.pass) {
+ ASSERT_TRUE(
+ mojo::test::SerializeAndDeserialize<blink::mojom::FencedFrameConfig>(
+ input_config, output_config));
+ } else {
+ ASSERT_FALSE(
+ mojo::test::SerializeAndDeserialize<blink::mojom::FencedFrameConfig>(
+ input_config, output_config));
+ }
+ }
+}
+
+TEST(FencedFrameConfigMojomTraitsTest, ConfigMojomTraitsNullInternalUrnTest) {
+ FencedFrameConfig browser_config;
+ RedactedFencedFrameConfig input_config =
+ browser_config.RedactFor(FencedFrameEntity::kEmbedder);
+ RedactedFencedFrameConfig output_config;
+ EXPECT_DEATH(
+ mojo::test::SerializeAndDeserialize<blink::mojom::FencedFrameConfig>(
+ input_config, output_config),
+ "");
+}
+
TEST(FencedFrameConfigMojomTraitsTest, ConfigMojomTraitsTest) {
GURL test_url("test_url");
+ // See the above tests for `urn`.
+
// Test `mapped_url`.
{
auto eq_fn = [](const GURL& a, const GURL& b) { return a == b; };
@@ -248,7 +302,7 @@
// Test `nested_configs`.
{
- FencedFrameConfig test_nested_config(test_url);
+ FencedFrameConfig test_nested_config(GenerateUrnUuid(), test_url);
{
std::vector<FencedFrameConfig> test_nested_configs = {test_nested_config};
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index c316528..5d72cf2 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -315,7 +315,8 @@
auto* auction_result_metrics =
AdAuctionResultMetrics::GetOrCreateForPage(render_frame_host().GetPage());
if (!auction_result_metrics->ShouldRunAuction()) {
- std::move(callback).Run(/*manually_aborted=*/false, absl::nullopt);
+ std::move(callback).Run(/*manually_aborted=*/false,
+ /*config=*/absl::nullopt);
return;
}
@@ -326,7 +327,8 @@
// If pending mapped URN cannot be generated due to number of mappings has
// reached limit, stop the auction.
if (!urn_uuid.has_value()) {
- std::move(callback).Run(/*manually_aborted=*/false, absl::nullopt);
+ std::move(callback).Run(/*manually_aborted=*/false,
+ /*config=*/absl::nullopt);
return;
}
@@ -655,7 +657,7 @@
}
DCHECK(winning_group_ad_metadata.empty());
- std::move(callback).Run(manually_aborted, absl::nullopt);
+ std::move(callback).Run(manually_aborted, /*config=*/absl::nullopt);
if (auction_result_metrics) {
// `auction_result_metrics` can be null since PageUserData like
// AdAuctionResultMetrics isn't guaranteed to be destroyed after document
@@ -742,26 +744,28 @@
// the callback needs directly.
content::AdAuctionData ad_auction_data{winning_group_key.owner,
winning_group_key.name};
- fenced_frame_urls_map.AssignFencedFrameURLAndInterestGroupInfo(
- urn_uuid, render_url, std::move(ad_auction_data),
- base::BindRepeating(
- &SendSuccessfulAuctionReportsAndUpdateInterestGroups,
- /*has_sent_reports=*/base::Owned(std::make_unique<bool>(false)),
- private_aggregation_manager_, &GetInterestGroupManager(),
- main_frame_origin_, origin(), std::move(winning_group_key),
- std::move(winning_group_ad_metadata),
- base::Owned(
- std::make_unique<std::map<
- url::Origin, std::vector<auction_worklet::mojom::
+ blink::FencedFrame::RedactedFencedFrameConfig config =
+ fenced_frame_urls_map.AssignFencedFrameURLAndInterestGroupInfo(
+ urn_uuid, render_url, std::move(ad_auction_data),
+ base::BindRepeating(
+ &SendSuccessfulAuctionReportsAndUpdateInterestGroups,
+ /*has_sent_reports=*/base::Owned(std::make_unique<bool>(false)),
+ private_aggregation_manager_, &GetInterestGroupManager(),
+ main_frame_origin_, origin(), std::move(winning_group_key),
+ std::move(winning_group_ad_metadata),
+ base::Owned(
+ std::make_unique<
+ std::map<url::Origin,
+ std::vector<auction_worklet::mojom::
PrivateAggregationRequestPtr>>>(
- std::move(private_aggregation_requests))),
- std::move(report_urls), std::move(debug_win_report_urls),
- std::move(debug_loss_report_urls),
- std::move(interest_groups_that_bid), GetClientSecurityState(),
- GetRefCountedTrustedURLLoaderFactory()),
- ad_component_urls, ad_beacon_map);
+ std::move(private_aggregation_requests))),
+ std::move(report_urls), std::move(debug_win_report_urls),
+ std::move(debug_loss_report_urls),
+ std::move(interest_groups_that_bid), GetClientSecurityState(),
+ GetRefCountedTrustedURLLoaderFactory()),
+ ad_component_urls, ad_beacon_map);
- std::move(callback).Run(/*manually_aborted=*/false, urn_uuid);
+ std::move(callback).Run(/*manually_aborted=*/false, std::move(config));
}
void AdAuctionServiceImpl::MaybeLogPrivateAggregationFeature(
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
index f897cc7..aa4bb83 100644
--- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc
+++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -765,19 +765,25 @@
rfh, ad_auction_service_.BindNewPipeAndPassReceiver());
base::RunLoop run_loop;
- absl::optional<GURL> maybe_url;
+ absl::optional<blink::FencedFrame::RedactedFencedFrameConfig> maybe_config;
ad_auction_service_->RunAdAuction(
auction_config, mojo::NullReceiver(),
base::BindLambdaForTesting(
- [&run_loop, &maybe_url](bool manually_aborted,
- const absl::optional<GURL>& result) {
+ [&run_loop, &maybe_config](
+ bool manually_aborted,
+ const absl::optional<
+ blink::FencedFrame::RedactedFencedFrameConfig>& config) {
EXPECT_FALSE(manually_aborted);
- maybe_url = result;
+ maybe_config = config;
run_loop.Quit();
}));
ad_auction_service_.FlushForTesting();
run_loop.Run();
- return maybe_url;
+ if (!maybe_config) {
+ return absl::nullopt;
+ }
+ CHECK(maybe_config->urn().has_value());
+ return maybe_config->urn();
}
// Like RunAdAuctionAndFlushForFrame(), but uses the RenderFrameHost of the
@@ -5698,9 +5704,9 @@
base::BindLambdaForTesting(
[&one_auction_complete](
bool manually_aborted,
- const absl::optional<GURL>& ignored_result) {
- one_auction_complete.Run();
- }));
+ const absl::optional<
+ blink::FencedFrame::RedactedFencedFrameConfig>&
+ ignored_config) { one_auction_complete.Run(); }));
}
run_loop.Run();
diff --git a/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc b/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc
index dd51bfcf..b5253788 100644
--- a/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc
+++ b/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc
@@ -4,6 +4,7 @@
#include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h"
+#include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h"
#include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h"
#include "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom.h"
@@ -416,7 +417,9 @@
blink::FencedFrame::RedactedFencedFrameConfig>::
Read(blink::mojom::FencedFrameConfigDataView data,
blink::FencedFrame::RedactedFencedFrameConfig* out_config) {
- if (!data.ReadMappedUrl(&out_config->mapped_url_) ||
+ GURL urn_uuid;
+ if (!data.ReadUrnUuid(&urn_uuid) ||
+ !data.ReadMappedUrl(&out_config->mapped_url_) ||
!data.ReadContentSize(&out_config->content_size_) ||
!data.ReadContainerSize(&out_config->container_size_) ||
!data.ReadDeprecatedShouldFreezeInitialSize(
@@ -429,6 +432,11 @@
return false;
}
+ if (!blink::IsValidUrnUuidURL(urn_uuid)) {
+ return false;
+ }
+
+ out_config->urn_ = std::move(urn_uuid);
return true;
}
diff --git a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h
index 48a6443..5dfa7a8 100644
--- a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h
+++ b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h
@@ -223,6 +223,12 @@
struct BLINK_COMMON_EXPORT
StructTraits<blink::mojom::FencedFrameConfigDataView,
blink::FencedFrame::RedactedFencedFrameConfig> {
+ static const GURL& urn_uuid(
+ const blink::FencedFrame::RedactedFencedFrameConfig& config) {
+ // Whenever a redacted config is sent over an IPC, its `urn_` member is
+ // expected to be non-nullopt.
+ return config.urn_.value();
+ }
static const absl::optional<Prop<GURL>>& mapped_url(
const blink::FencedFrame::RedactedFencedFrameConfig& config) {
return config.mapped_url_;
diff --git a/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom b/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom
index 853374e..943e069 100644
--- a/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom
+++ b/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom
@@ -92,12 +92,15 @@
};
// The `FencedFrameConfig` struct is used to transfer a redacted version
-// (`blink::RedactedFencedFrameConfig`) of `content::FencedFrameConfig` across
-// processes. In brief, this is a collection of properties that the browser
-// process exposes to an embedder that may wish to load into a fenced frame.
-// The config will determine the fenced frame's behavior, but it may have
-// certain fields redacted (marked as opaque) in order to preserve privacy.
-// For example:
+// (`blink::RedactedFencedFrameConfig`) of `content::FencedFrameConfig` from the
+// browser process, to the renderer process, where the redaction process is
+// specific to whether the target renderer is either a fenced frame's embedder
+// or a frame inside the fenced frame tree. For more documentation on the
+// redaction process, see the comments above `content::FencedFrameConfig`. In
+// brief, this is a collection of properties that the browser process exposes to
+// an embedder that may wish to load into a fenced frame. The config will
+// determine the fenced frame's behavior, but it may have certain fields
+// redacted (marked as opaque) in order to preserve privacy. For example:
// * This object is returned to the caller of APIs that use fenced frames,
// so that they can inspect the (unredacted) information inside and then
// load it into a fenced frame.
@@ -105,6 +108,10 @@
// frame will be given access to these objects in order to load the nested
// configs.
struct FencedFrameConfig {
+ // This is the actual URL that will be loaded into the fenced frame when
+ // navigated to. It can be opaque because for the current use cases (FLEDGE,
+ // shared storage), we never want to expose anything about the actual resource
+ // beyond its existence, to the embedder of a fenced frame.
PotentiallyOpaqueURL? mapped_url;
PotentiallyOpaqueSize? container_size;
@@ -120,6 +127,14 @@
PotentiallyOpaqueSharedStorageBudgetMetadata? shared_storage_budget_metadata;
PotentiallyOpaqueReportingMetadata? reporting_metadata;
+
+ // This is the internal URN that represents this config in the browser-side
+ // `FencedFrameURLMapping`. When this config is navigated to via a fenced
+ // frame, it is this internal urn:uuid that we send to the browser to navigate
+ // to the actual browser-side `content::FencedFrameConfig` object that
+ // represents this instance of this struct. `blink::IsValidUrnUuidURL()` will
+ // always be true when called with this urn.
+ url.mojom.Url urn_uuid;
};
// The `FencedFrameProperties` struct is used to transfer a redacted version
diff --git a/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom b/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
index 8d38ff4d..d2bb9a4 100644
--- a/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
+++ b/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
@@ -4,6 +4,7 @@
module blink.mojom;
+import "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom";
import "third_party/blink/public/mojom/parakeet/ad_request.mojom";
import "third_party/blink/public/mojom/interest_group/interest_group_types.mojom";
import "url/mojom/origin.mojom";
@@ -49,12 +50,13 @@
// the interest groups owned by `interest_group_buyers` and the auction
// config `decision_logic_url`. The result of the auction is a URL for the
// winning ad creative, which the publisher page loads into a page or iframe
- // in the owner's domain. If no ad wins the auction, null is returned.
- // `manually_aborted` is set to true only if the auction was manually
- // cancelled successfully via a call to `abort_receiver->Abort()`.
+ // in the owner's domain. This URL is embedded inside `config` below. If no ad
+ // wins the auction, null is returned. `manually_aborted` is set to true only
+ // if the auction was manually cancelled successfully via a call to
+ // `abort_receiver->Abort()`.
RunAdAuction(AuctionAdConfig config,
pending_receiver<AbortableAdAuction>? abort_receiver)
- => (bool manually_aborted, url.mojom.Url? ad_display_url);
+ => (bool manually_aborted, FencedFrameConfig? config);
// Requests that the browser process create or overwrite persisted interest
// group keyed by `group.owner` and `group.name` with information from
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
index de7dd1b..3b707332 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -1785,7 +1785,8 @@
ScriptPromiseResolver* resolver,
std::unique_ptr<ScopedAbortState> scoped_abort_state,
bool manually_aborted,
- const absl::optional<KURL>& result_url) {
+ const absl::optional<FencedFrame::RedactedFencedFrameConfig>&
+ result_config) {
if (!resolver->GetExecutionContext() ||
resolver->GetExecutionContext()->IsContextDestroyed())
return;
@@ -1796,8 +1797,10 @@
if (manually_aborted) {
DCHECK(abort_signal && abort_signal->aborted());
resolver->Reject(abort_signal->reason(script_state));
- } else if (result_url) {
- resolver->Resolve(result_url);
+ } else if (result_config) {
+ DCHECK(result_config->mapped_url().has_value());
+ DCHECK(!result_config->mapped_url()->potentially_opaque_value.has_value());
+ resolver->Resolve(KURL(result_config->urn().value()));
} else {
resolver->Resolve(v8::Null(script_state->GetIsolate()));
}
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.h b/third_party/blink/renderer/modules/ad_auction/navigator_auction.h
index 7aeaf0e..05d992a 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.h
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.h
@@ -9,6 +9,7 @@
#include <memory>
#include "base/memory/scoped_refptr.h"
+#include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h"
#include "third_party/blink/public/mojom/interest_group/ad_auction_service.mojom-blink.h"
#include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom-blink.h"
#include "third_party/blink/renderer/core/frame/navigator.h"
@@ -182,10 +183,11 @@
void FinalizeAdComplete(ScriptPromiseResolver* resolver,
const absl::optional<KURL>& creative_url);
// Completion callback for Mojo call made by runAdAuction().
- void AuctionComplete(ScriptPromiseResolver*,
- std::unique_ptr<ScopedAbortState>,
- bool manually_aborted,
- const absl::optional<KURL>&);
+ void AuctionComplete(
+ ScriptPromiseResolver*,
+ std::unique_ptr<ScopedAbortState>,
+ bool manually_aborted,
+ const absl::optional<FencedFrame::RedactedFencedFrameConfig>&);
// Completion callback for Mojo call made by deprecatedURNToURL().
void GetURLFromURNComplete(ScriptPromiseResolver*,
const absl::optional<KURL>&);