Skip to content

Commit

Permalink
Pass unique_ptr endpoint_fetcher to ResponseHandler
Browse files Browse the repository at this point in the history
Ensure its lifetime across the request to avoid multiple simultaneous requests crashing

Bug: b:266989173
Change-Id: Ic038558ef46c69495dcf20b1c94a975f8c50645c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4199857
Commit-Queue: Kaiqi Liang <kaiqiliang@google.com>
Reviewed-by: Mehrab N <mehrab@chromium.org>
Reviewed-by: Jing Wang <jiwan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1098465}
  • Loading branch information
Kaiqi Liang authored and Chromium LUCI CQ committed Jan 30, 2023
1 parent 19745bd commit 1d9950c
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 16 deletions.
43 changes: 30 additions & 13 deletions chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ GifTenorApiFetcher::~GifTenorApiFetcher() = default;

void GifTenorApiFetcher::TenorGifsApiResponseHandler(
TenorGifsApiCallback callback,
std::unique_ptr<EndpointFetcher> endpoint_fetcher,
std::unique_ptr<EndpointResponse> response) {
data_decoder::DataDecoder::ParseJsonIsolated(
response->response,
Expand All @@ -194,6 +195,11 @@ void GifTenorApiFetcher::OnGifsJsonParsed(
TenorGifsApiCallback callback,
data_decoder::DataDecoder::ValueOrError result) {
const auto* gifs = FindList(result, "results");
if (!gifs) {
std::move(callback).Run(emoji_picker::mojom::TenorGifResponse::New(
"", std::vector<emoji_picker::mojom::GifResponsePtr>{}));
return;
}
const auto* next = result->FindStringKey("next");
std::move(callback).Run(emoji_picker::mojom::TenorGifResponse::New(
next ? *next : "", ParseGifs(gifs)));
Expand Down Expand Up @@ -229,17 +235,20 @@ void GifTenorApiFetcher::FetchCategories(
}
)");

endpoint_fetcher_ = endpoint_fetcher_creator_.Run(
auto endpoint_fetcher = endpoint_fetcher_creator_.Run(
url_loader_factory, GURL(kTenorBaseUrl).Resolve(kCategoriesApi),
kTrafficAnnotation);
endpoint_fetcher_->PerformRequest(
auto* const endpoint_fetcher_ptr = endpoint_fetcher.get();
endpoint_fetcher_ptr->PerformRequest(
base::BindOnce(&GifTenorApiFetcher::FetchCategoriesResponseHandler,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
std::move(endpoint_fetcher)),
nullptr);
}

void GifTenorApiFetcher::FetchCategoriesResponseHandler(
PageHandler::GetCategoriesCallback callback,
std::unique_ptr<EndpointFetcher> endpoint_fetcher,
std::unique_ptr<EndpointResponse> response) {
data_decoder::DataDecoder::ParseJsonIsolated(
response->response,
Expand All @@ -252,6 +261,7 @@ void GifTenorApiFetcher::OnCategoriesJsonParsed(
data_decoder::DataDecoder::ValueOrError result) {
const auto* tags = FindList(result, "tags");
if (!tags) {
std::move(callback).Run({});
return;
}

Expand Down Expand Up @@ -306,11 +316,13 @@ void GifTenorApiFetcher::FetchFeaturedGifs(
}
)");

endpoint_fetcher_ = endpoint_fetcher_creator_.Run(
auto endpoint_fetcher = endpoint_fetcher_creator_.Run(
url_loader_factory, GetUrl(kFeaturedApi, pos), kTrafficAnnotation);
endpoint_fetcher_->PerformRequest(
auto* const endpoint_fetcher_ptr = endpoint_fetcher.get();
endpoint_fetcher_ptr->PerformRequest(
base::BindOnce(&GifTenorApiFetcher::TenorGifsApiResponseHandler,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
std::move(endpoint_fetcher)),
nullptr);
}

Expand Down Expand Up @@ -352,11 +364,13 @@ void GifTenorApiFetcher::FetchGifSearch(
GURL url = GetUrl(kSearchApi, pos);
url = net::AppendQueryParameter(url, "q", query);

endpoint_fetcher_ = endpoint_fetcher_creator_.Run(url_loader_factory, url,
kTrafficAnnotation);
endpoint_fetcher_->PerformRequest(
auto endpoint_fetcher = endpoint_fetcher_creator_.Run(url_loader_factory, url,
kTrafficAnnotation);
auto* const endpoint_fetcher_ptr = endpoint_fetcher.get();
endpoint_fetcher_ptr->PerformRequest(
base::BindOnce(&GifTenorApiFetcher::TenorGifsApiResponseHandler,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
std::move(endpoint_fetcher)),
nullptr);
}

Expand Down Expand Up @@ -392,19 +406,22 @@ void GifTenorApiFetcher::FetchGifsByIds(
}
)");

endpoint_fetcher_ = endpoint_fetcher_creator_.Run(
auto endpoint_fetcher = endpoint_fetcher_creator_.Run(
url_loader_factory,
net::AppendQueryParameter(GURL(kTenorBaseUrl).Resolve(kPostsApi), "ids",
base::JoinString(ids, ",")),
kTrafficAnnotation);
endpoint_fetcher_->PerformRequest(
auto* const endpoint_fetcher_ptr = endpoint_fetcher.get();
endpoint_fetcher_ptr->PerformRequest(
base::BindOnce(&GifTenorApiFetcher::FetchGifsByIdsResponseHandler,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
std::move(endpoint_fetcher)),
nullptr);
}

void GifTenorApiFetcher::FetchGifsByIdsResponseHandler(
emoji_picker::mojom::PageHandler::GetGifsByIdsCallback callback,
std::unique_ptr<EndpointFetcher> endpoint_fetcher,
std::unique_ptr<EndpointResponse> response) {
data_decoder::DataDecoder::ParseJsonIsolated(
response->response,
Expand Down
9 changes: 6 additions & 3 deletions chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,26 +58,29 @@ class GifTenorApiFetcher {
const std::vector<std::string>& ids);

private:
std::unique_ptr<EndpointFetcher> endpoint_fetcher_;
const EndpointFetcherCreator endpoint_fetcher_creator_;
base::WeakPtrFactory<GifTenorApiFetcher> weak_ptr_factory_{this};

void FetchCategoriesResponseHandler(
emoji_picker::mojom::PageHandler::GetCategoriesCallback callback,
std::unique_ptr<EndpointFetcher> endpoint_fetcher,
std::unique_ptr<EndpointResponse> response);

void OnCategoriesJsonParsed(
emoji_picker::mojom::PageHandler::GetCategoriesCallback callback,
data_decoder::DataDecoder::ValueOrError result);

void TenorGifsApiResponseHandler(TenorGifsApiCallback callback,
std::unique_ptr<EndpointResponse> response);
void TenorGifsApiResponseHandler(
TenorGifsApiCallback callback,
std::unique_ptr<EndpointFetcher> endpoint_fetcher,
std::unique_ptr<EndpointResponse> response);

void OnGifsJsonParsed(TenorGifsApiCallback callback,
data_decoder::DataDecoder::ValueOrError result);

void FetchGifsByIdsResponseHandler(
emoji_picker::mojom::PageHandler::GetGifsByIdsCallback callback,
std::unique_ptr<EndpointFetcher> endpoint_fetcher,
std::unique_ptr<EndpointResponse> response);

void OnGifsByIdsJsonParsed(
Expand Down

0 comments on commit 1d9950c

Please sign in to comment.