Index: content/browser/background_fetch/background_fetch_service_impl.cc |
diff --git a/content/browser/background_fetch/background_fetch_service_impl.cc b/content/browser/background_fetch/background_fetch_service_impl.cc |
index 582827e4c4da1b7ced6d64310ccd89142f78bcf7..c15a5de62d1857b9979b4ab3d726ff57004cab92 100644 |
--- a/content/browser/background_fetch/background_fetch_service_impl.cc |
+++ b/content/browser/background_fetch/background_fetch_service_impl.cc |
@@ -8,6 +8,8 @@ |
#include "base/memory/ptr_util.h" |
#include "base/optional.h" |
#include "content/browser/background_fetch/background_fetch_context.h" |
+#include "content/browser/background_fetch/background_fetch_registration_id.h" |
+#include "content/browser/bad_message.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
#include "content/common/background_fetch/background_fetch_types.h" |
#include "content/public/browser/browser_thread.h" |
@@ -16,25 +18,34 @@ |
namespace content { |
+namespace { |
+ |
+// Maximum length of a developer-provided tag for a Background Fetch. |
+constexpr size_t kMaxTagLength = 1024 * 1024; |
+ |
+// Maximum length of a developer-provided title for a Background Fetch. |
+constexpr size_t kMaxTitleLength = 1024 * 1024; |
+ |
+} // namespace |
+ |
// static |
void BackgroundFetchServiceImpl::Create( |
+ int render_process_id, |
scoped_refptr<BackgroundFetchContext> background_fetch_context, |
- scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, |
blink::mojom::BackgroundFetchServiceRequest request) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- mojo::MakeStrongBinding(base::MakeUnique<BackgroundFetchServiceImpl>( |
- std::move(background_fetch_context), |
- std::move(service_worker_context)), |
- std::move(request)); |
+ mojo::MakeStrongBinding( |
+ base::MakeUnique<BackgroundFetchServiceImpl>( |
+ render_process_id, std::move(background_fetch_context)), |
+ std::move(request)); |
} |
BackgroundFetchServiceImpl::BackgroundFetchServiceImpl( |
- scoped_refptr<BackgroundFetchContext> background_fetch_context, |
- scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) |
- : background_fetch_context_(std::move(background_fetch_context)), |
- service_worker_context_(std::move(service_worker_context)) { |
+ int render_process_id, |
+ scoped_refptr<BackgroundFetchContext> background_fetch_context) |
+ : render_process_id_(render_process_id), |
+ background_fetch_context_(std::move(background_fetch_context)) { |
DCHECK(background_fetch_context_); |
- DCHECK(service_worker_context_); |
} |
BackgroundFetchServiceImpl::~BackgroundFetchServiceImpl() = default; |
@@ -45,18 +56,29 @@ void BackgroundFetchServiceImpl::Fetch(int64_t service_worker_registration_id, |
const BackgroundFetchOptions& options, |
const FetchCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- |
- // TODO(peter): Create a new job with the BackgroundFetchContext for the |
- // given tag, requests and options. For now we return a registration that's |
- // based on the given |options|, to make sure round-trip is covered. |
- |
- BackgroundFetchRegistration registration; |
- registration.tag = tag; |
- registration.icons = options.icons; |
- registration.title = options.title; |
- registration.total_download_size = options.total_download_size; |
- |
- callback.Run(blink::mojom::BackgroundFetchError::NONE, registration); |
+ if (!ValidateTag(tag)) { |
+ callback.Run(blink::mojom::BackgroundFetchError::INVALID_ARGUMENT, |
+ base::nullopt /* registration */); |
+ return; |
+ } |
+ |
+ BackgroundFetchRegistrationId registration_id(service_worker_registration_id, |
+ origin, tag); |
+ |
+ // TODO(peter): Remove once https://codereview.chromium.org/2762303002/ lands. |
+ std::vector<ServiceWorkerFetchRequest> requests; |
+ requests.emplace_back(GURL("https://example.com/image.png"), "POST", |
+ ServiceWorkerHeaderMap(), Referrer(), |
+ false /* is_reload */); |
+ |
+ if (!ValidateRequests(requests)) { |
+ callback.Run(blink::mojom::BackgroundFetchError::INVALID_ARGUMENT, |
+ base::nullopt /* registration */); |
+ return; |
+ } |
+ |
+ background_fetch_context_->StartFetch(registration_id, requests, options, |
+ callback); |
} |
void BackgroundFetchServiceImpl::UpdateUI( |
@@ -66,6 +88,10 @@ void BackgroundFetchServiceImpl::UpdateUI( |
const std::string& title, |
const UpdateUICallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (!ValidateTag(tag) || !ValidateTitle(title)) { |
+ callback.Run(blink::mojom::BackgroundFetchError::INVALID_ARGUMENT); |
+ return; |
+ } |
// TODO(peter): Get the BackgroundFetchJobController for the |
// {service_worker_registration_id, tag} pair and call UpdateUI() on it. |
@@ -78,6 +104,10 @@ void BackgroundFetchServiceImpl::Abort(int64_t service_worker_registration_id, |
const std::string& tag, |
const AbortCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (!ValidateTag(tag)) { |
+ callback.Run(blink::mojom::BackgroundFetchError::INVALID_ARGUMENT); |
+ return; |
+ } |
// TODO(peter): Get the BackgroundFetchJobController for the |
// {service_worker_registration_id, tag} pair and call Abort() on it. |
@@ -91,6 +121,11 @@ void BackgroundFetchServiceImpl::GetRegistration( |
const std::string& tag, |
const GetRegistrationCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (!ValidateTag(tag)) { |
+ callback.Run(blink::mojom::BackgroundFetchError::INVALID_ARGUMENT, |
+ base::nullopt /* registration */); |
+ return; |
+ } |
// TODO(peter): Get the registration for {service_worker_registration_id, tag} |
// and construct a BackgroundFetchRegistrationPtr for it. |
@@ -111,4 +146,35 @@ void BackgroundFetchServiceImpl::GetTags(int64_t service_worker_registration_id, |
std::vector<std::string>()); |
} |
+bool BackgroundFetchServiceImpl::ValidateTag(const std::string& tag) { |
+ if (tag.empty() || tag.size() > kMaxTagLength) { |
+ bad_message::ReceivedBadMessage(render_process_id_, |
+ bad_message::BFSI_INVALID_TAG); |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+bool BackgroundFetchServiceImpl::ValidateRequests( |
+ const std::vector<ServiceWorkerFetchRequest>& requests) { |
+ if (requests.empty()) { |
+ bad_message::ReceivedBadMessage(render_process_id_, |
+ bad_message::BFSI_INVALID_REQUESTS); |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+bool BackgroundFetchServiceImpl::ValidateTitle(const std::string& title) { |
+ if (title.empty() || title.size() > kMaxTitleLength) { |
+ bad_message::ReceivedBadMessage(render_process_id_, |
+ bad_message::BFSI_INVALID_TITLE); |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
} // namespace content |