From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Rayan Kanso Date: Wed, 29 Sep 2021 14:40:47 +0000 Subject: Use less-specific error codes for CORS-failing fetches (cherry picked from commit 26be5702dab1d98e4d4b076a73d4688d20c043be) Bug: 1245053 Change-Id: If0343157a3ba41a6c946b5f7401a9d114f834779 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3135676 Commit-Queue: Rayan Kanso Reviewed-by: Richard Knoll Cr-Original-Commit-Position: refs/heads/main@{#918109} Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3190112 Reviewed-by: Victor-Gabriel Savu Owners-Override: Victor-Gabriel Savu Commit-Queue: Zakhar Voit Cr-Commit-Position: refs/branch-heads/4430@{#1628} Cr-Branched-From: e5ce7dc4f7518237b3d9bb93cccca35d25216cbe-refs/heads/master@{#857950} diff --git a/content/browser/background_fetch/background_fetch_job_controller.cc b/content/browser/background_fetch/background_fetch_job_controller.cc index f424cadba0f42ce007c85a50b2bdb37a3a3a3499..0d08d1f744edd432c9615be811a60daff3b3c541 100644 --- a/content/browser/background_fetch/background_fetch_job_controller.cc +++ b/content/browser/background_fetch/background_fetch_job_controller.cc @@ -173,6 +173,8 @@ void BackgroundFetchJobController::DidStartRequest( // TODO(crbug.com/884672): Stop the fetch if the cross origin filter fails. BackgroundFetchCrossOriginFilter filter(registration_id_.origin(), *request); request->set_can_populate_body(filter.CanPopulateBody()); + if (!request->can_populate_body()) + has_failed_cors_request_ = true; } void BackgroundFetchJobController::DidUpdateRequest(const std::string& guid, @@ -253,7 +255,14 @@ uint64_t BackgroundFetchJobController::GetInProgressUploadedBytes() { void BackgroundFetchJobController::AbortFromDelegate( BackgroundFetchFailureReason failure_reason) { - failure_reason_ = failure_reason; + if (failure_reason == BackgroundFetchFailureReason::DOWNLOAD_TOTAL_EXCEEDED && + has_failed_cors_request_) { + // Don't expose that the download total has been exceeded. Use a less + // specific error. + failure_reason_ = BackgroundFetchFailureReason::FETCH_ERROR; + } else { + failure_reason_ = failure_reason; + } Finish(failure_reason_, base::DoNothing()); } diff --git a/content/browser/background_fetch/background_fetch_job_controller.h b/content/browser/background_fetch/background_fetch_job_controller.h index e635c86c1eb4237e2b107e3d6fae0242e99dcb4c..66a1c94e9dd79663fbc301c1c91918ef4ac67036 100644 --- a/content/browser/background_fetch/background_fetch_job_controller.h +++ b/content/browser/background_fetch/background_fetch_job_controller.h @@ -210,6 +210,10 @@ class CONTENT_EXPORT BackgroundFetchJobController blink::mojom::BackgroundFetchFailureReason failure_reason_ = blink::mojom::BackgroundFetchFailureReason::NONE; + // Whether one of the requests handled by the controller failed + // the CORS checks and should not have its response exposed. + bool has_failed_cors_request_ = false; + // Custom callback that runs after the controller is finished. FinishedCallback finished_callback_; diff --git a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc index b36154c40a7013bbd02e5a57a2a3c33f7d86775a..d98b2f13b4fdaec84cd4fc21117a38397219deed 100644 --- a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc +++ b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc @@ -434,6 +434,39 @@ TEST_F(BackgroundFetchJobControllerTest, Abort) { GetCompletionStatus(registration_id)); } +TEST_F(BackgroundFetchJobControllerTest, AbortDownloadExceededCrossOrigin) { + BackgroundFetchRegistrationId registration_id; + + auto requests = CreateRegistrationForRequests( + ®istration_id, {{GURL("https://example2.com/funny_cat.png"), "GET"}}, + /* auto_complete_requests= */ true); + + EXPECT_EQ(JobCompletionStatus::kRunning, + GetCompletionStatus(registration_id)); + + std::unique_ptr controller = + CreateJobController(registration_id, requests.size()); + + controller->StartRequest(requests[0], base::DoNothing()); + + controller->DidStartRequest( + requests[0]->download_guid(), + std::make_unique( + std::vector{GURL("https://example2.com/funny_cat.png")}, + nullptr)); + EXPECT_FALSE(requests[0]->can_populate_body()); + + controller->AbortFromDelegate( + blink::mojom::BackgroundFetchFailureReason::DOWNLOAD_TOTAL_EXCEEDED); + + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(JobCompletionStatus::kAborted, + GetCompletionStatus(registration_id)); + EXPECT_EQ(finished_requests_[registration_id], + blink::mojom::BackgroundFetchFailureReason::FETCH_ERROR); +} + TEST_F(BackgroundFetchJobControllerTest, Progress) { BackgroundFetchRegistrationId registration_id;