|
@@ -0,0 +1,108 @@
|
|
|
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
+From: Rayan Kanso <[email protected]>
|
|
|
+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 <[email protected]>
|
|
|
+Reviewed-by: Richard Knoll <[email protected]>
|
|
|
+Cr-Original-Commit-Position: refs/heads/main@{#918109}
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3190112
|
|
|
+Reviewed-by: Victor-Gabriel Savu <[email protected]>
|
|
|
+Owners-Override: Victor-Gabriel Savu <[email protected]>
|
|
|
+Commit-Queue: Zakhar Voit <[email protected]>
|
|
|
+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<BackgroundFetchJobController> controller =
|
|
|
++ CreateJobController(registration_id, requests.size());
|
|
|
++
|
|
|
++ controller->StartRequest(requests[0], base::DoNothing());
|
|
|
++
|
|
|
++ controller->DidStartRequest(
|
|
|
++ requests[0]->download_guid(),
|
|
|
++ std::make_unique<BackgroundFetchResponse>(
|
|
|
++ std::vector<GURL>{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;
|
|
|
+
|