Commit 3a1bdfce authored by Rayan Kanso's avatar Rayan Kanso Committed by Commit Bot

[Background Fetch] Report initialization errors per registration.

Collect errors per registration on initialization, and clear the corrupt
data if applicable.

Change-Id: I4f8da3c389e70a6d041c72a0e08c3ae1b5a85051
Reviewed-on: https://chromium-review.googlesource.com/1141881
Commit-Queue: Rayan Kanso <rayankans@chromium.org>
Reviewed-by: default avatarPeter Beverloo <peter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#576461}
parent 2f15bf14
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
#include "base/task_scheduler/post_task.h" #include "base/task_scheduler/post_task.h"
#include "base/task_scheduler/task_traits.h" #include "base/task_scheduler/task_traits.h"
#include "content/browser/background_fetch/background_fetch.pb.h" #include "content/browser/background_fetch/background_fetch.pb.h"
#include "content/browser/background_fetch/background_fetch_data_manager.h"
#include "content/browser/background_fetch/storage/database_helpers.h" #include "content/browser/background_fetch/storage/database_helpers.h"
#include "content/browser/background_fetch/storage/mark_registration_for_deletion_task.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "third_party/blink/public/common/manifest/manifest.h" #include "third_party/blink/public/common/manifest/manifest.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
...@@ -36,7 +38,6 @@ class InitializationSubTask : public DatabaseTask { ...@@ -36,7 +38,6 @@ class InitializationSubTask : public DatabaseTask {
// The results to report. // The results to report.
BackgroundFetchInitializationData* initialization_data; BackgroundFetchInitializationData* initialization_data;
blink::mojom::BackgroundFetchError* error;
}; };
InitializationSubTask(DatabaseTaskHost* host, InitializationSubTask(DatabaseTaskHost* host,
...@@ -46,7 +47,6 @@ class InitializationSubTask : public DatabaseTask { ...@@ -46,7 +47,6 @@ class InitializationSubTask : public DatabaseTask {
sub_task_init_(sub_task_init), sub_task_init_(sub_task_init),
done_closure_(std::move(done_closure)) { done_closure_(std::move(done_closure)) {
DCHECK(sub_task_init_.initialization_data); DCHECK(sub_task_init_.initialization_data);
DCHECK(sub_task_init_.error);
} }
~InitializationSubTask() override = default; ~InitializationSubTask() override = default;
...@@ -54,7 +54,7 @@ class InitializationSubTask : public DatabaseTask { ...@@ -54,7 +54,7 @@ class InitializationSubTask : public DatabaseTask {
protected: protected:
void FinishWithError(blink::mojom::BackgroundFetchError error) override { void FinishWithError(blink::mojom::BackgroundFetchError error) override {
if (error != blink::mojom::BackgroundFetchError::NONE) if (error != blink::mojom::BackgroundFetchError::NONE)
*sub_task_init_.error = error; sub_task_init_.initialization_data->error = error;
std::move(done_closure_).Run(); std::move(done_closure_).Run();
Finished(); // Destroys |this|. Finished(); // Destroys |this|.
} }
...@@ -150,10 +150,10 @@ class GetRequestsTask : public InitializationSubTask { ...@@ -150,10 +150,10 @@ class GetRequestsTask : public InitializationSubTask {
proto::BackgroundFetchCompletedRequest completed_request; proto::BackgroundFetchCompletedRequest completed_request;
if (!completed_request.ParseFromString(serialized_completed_request) || if (!completed_request.ParseFromString(serialized_completed_request) ||
sub_task_init().unique_id != completed_request.unique_id()) { sub_task_init().unique_id != completed_request.unique_id()) {
*sub_task_init().error = FinishWithError(blink::mojom::BackgroundFetchError::STORAGE_ERROR);
blink::mojom::BackgroundFetchError::STORAGE_ERROR; return;
continue;
} }
active_requests_to_delete.push_back(ActiveRequestKey( active_requests_to_delete.push_back(ActiveRequestKey(
completed_request.unique_id(), completed_request.request_index())); completed_request.unique_id(), completed_request.request_index()));
} }
...@@ -203,9 +203,8 @@ class GetRequestsTask : public InitializationSubTask { ...@@ -203,9 +203,8 @@ class GetRequestsTask : public InitializationSubTask {
for (const std::string& serialized_active_request : data) { for (const std::string& serialized_active_request : data) {
proto::BackgroundFetchActiveRequest active_request; proto::BackgroundFetchActiveRequest active_request;
if (!active_request.ParseFromString(serialized_active_request)) { if (!active_request.ParseFromString(serialized_active_request)) {
*sub_task_init().error = FinishWithError(blink::mojom::BackgroundFetchError::STORAGE_ERROR);
blink::mojom::BackgroundFetchError::STORAGE_ERROR; return;
continue;
} }
DCHECK_EQ(sub_task_init().unique_id, active_request.unique_id()); DCHECK_EQ(sub_task_init().unique_id, active_request.unique_id());
sub_task_init().initialization_data->active_fetch_guids.push_back( sub_task_init().initialization_data->active_fetch_guids.push_back(
...@@ -425,7 +424,8 @@ class FillBackgroundFetchInitializationDataTask : public InitializationSubTask { ...@@ -425,7 +424,8 @@ class FillBackgroundFetchInitializationDataTask : public InitializationSubTask {
base::BindOnce( base::BindOnce(
[](base::WeakPtr<FillBackgroundFetchInitializationDataTask> task) { [](base::WeakPtr<FillBackgroundFetchInitializationDataTask> task) {
if (task) if (task)
task->FinishWithError(*task->sub_task_init().error); task->FinishWithError(
task->sub_task_init().initialization_data->error);
}, },
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
AddSubTask(std::make_unique<FillFromMetadataTask>(this, sub_task_init(), AddSubTask(std::make_unique<FillFromMetadataTask>(this, sub_task_init(),
...@@ -486,12 +486,10 @@ void GetInitializationDataTask::DidGetRegistrations( ...@@ -486,12 +486,10 @@ void GetInitializationDataTask::DidGetRegistrations(
} }
base::RepeatingClosure barrier_closure = base::BarrierClosure( base::RepeatingClosure barrier_closure = base::BarrierClosure(
user_data.size(), base::BindOnce( user_data.size(),
[](base::WeakPtr<GetInitializationDataTask> task) { base::BindOnce(&GetInitializationDataTask::FinishWithError,
if (task) weak_factory_.GetWeakPtr(),
task->FinishWithError(task->error_); blink::mojom::BackgroundFetchError::NONE));
},
weak_factory_.GetWeakPtr()));
for (const auto& ud : user_data) { for (const auto& ud : user_data) {
auto insertion_result = initialization_data_map_.emplace( auto insertion_result = initialization_data_map_.emplace(
...@@ -502,7 +500,7 @@ void GetInitializationDataTask::DidGetRegistrations( ...@@ -502,7 +500,7 @@ void GetInitializationDataTask::DidGetRegistrations(
this, this,
InitializationSubTask::SubTaskInit{ InitializationSubTask::SubTaskInit{
ud.first, ud.second, ud.first, ud.second,
&insertion_result.first->second /* initialization_data */, &error_}, &insertion_result.first->second /* initialization_data */},
barrier_closure)); barrier_closure));
} }
} }
...@@ -510,8 +508,24 @@ void GetInitializationDataTask::FinishWithError( ...@@ -510,8 +508,24 @@ void GetInitializationDataTask::FinishWithError(
blink::mojom::BackgroundFetchError error) { blink::mojom::BackgroundFetchError error) {
std::vector<BackgroundFetchInitializationData> results; std::vector<BackgroundFetchInitializationData> results;
results.reserve(initialization_data_map_.size()); results.reserve(initialization_data_map_.size());
for (auto& id : initialization_data_map_)
results.emplace_back(std::move(id.second)); for (auto& data : initialization_data_map_) {
if (data.second.error == blink::mojom::BackgroundFetchError::NONE) {
// If we successfully extracted all the data, move it to the
// initialization vector to be handed over to create a controller.
results.emplace_back(std::move(data.second));
} else if (!data.second.registration_id.developer_id().empty()) {
// There was an error in getting the initialization data
// (e.g. corrupt data, SWDB error). If the Developer ID of the fetch
// is available, mark the registration for deletion.
// Note that the Developer ID isn't available if the metadata extraction
// failed.
// TODO(crbug.com/865388): Getting the Developer ID should be possible
// since it is part of the key for when we got the Unique ID.
AddDatabaseTask(std::make_unique<MarkRegistrationForDeletionTask>(
data_manager(), data.second.registration_id, base::DoNothing()));
}
}
std::move(callback_).Run(error, std::move(results)); std::move(callback_).Run(error, std::move(results));
Finished(); // Destroys |this|. Finished(); // Destroys |this|.
......
...@@ -39,6 +39,10 @@ struct CONTENT_EXPORT BackgroundFetchInitializationData { ...@@ -39,6 +39,10 @@ struct CONTENT_EXPORT BackgroundFetchInitializationData {
std::vector<std::string> active_fetch_guids; std::vector<std::string> active_fetch_guids;
std::string ui_title; std::string ui_title;
// The error, if any, when getting the registration data.
blink::mojom::BackgroundFetchError error =
blink::mojom::BackgroundFetchError::NONE;
DISALLOW_COPY_AND_ASSIGN(BackgroundFetchInitializationData); DISALLOW_COPY_AND_ASSIGN(BackgroundFetchInitializationData);
}; };
...@@ -83,10 +87,6 @@ class GetInitializationDataTask : public DatabaseTask { ...@@ -83,10 +87,6 @@ class GetInitializationDataTask : public DatabaseTask {
// Map from the unique_id to the initialization data. // Map from the unique_id to the initialization data.
InitializationDataMap initialization_data_map_; InitializationDataMap initialization_data_map_;
// The error to report with |callback_|.
blink::mojom::BackgroundFetchError error_ =
blink::mojom::BackgroundFetchError::NONE;
base::WeakPtrFactory<GetInitializationDataTask> base::WeakPtrFactory<GetInitializationDataTask>
weak_factory_; // Keep as last. weak_factory_; // Keep as last.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment