| Index: content/renderer/service_worker/service_worker_context_client.cc
|
| diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
|
| index 7f35834eeca9896a7383a15585bebda293f543f9..b29686eb93cb369b8f74bfccd49c854b5700b268 100644
|
| --- a/content/renderer/service_worker/service_worker_context_client.cc
|
| +++ b/content/renderer/service_worker/service_worker_context_client.cc
|
| @@ -57,6 +57,7 @@
|
| #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
|
| #include "third_party/WebKit/public/platform/WebString.h"
|
| #include "third_party/WebKit/public/platform/WebURLResponse.h"
|
| +#include "third_party/WebKit/public/platform/modules/background_fetch/WebBackgroundFetchSettledFetch.h"
|
| #include "third_party/WebKit/public/platform/modules/notifications/WebNotificationData.h"
|
| #include "third_party/WebKit/public/platform/modules/payments/WebPaymentAppRequest.h"
|
| #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerClientQueryOptions.h"
|
| @@ -162,6 +163,76 @@ ToWebServiceWorkerClientInfo(const ServiceWorkerClientInfo& client_info) {
|
| return web_client_info;
|
| }
|
|
|
| +// Converts the |request| to its equivalent type in the Blink API.
|
| +// TODO(peter): Remove this when the Mojo FetchAPIRequest type exists.
|
| +void ToWebServiceWorkerRequest(const ServiceWorkerFetchRequest& request,
|
| + blink::WebServiceWorkerRequest* web_request) {
|
| + DCHECK(web_request);
|
| +
|
| + web_request->setURL(blink::WebURL(request.url));
|
| + web_request->setMethod(blink::WebString::fromUTF8(request.method));
|
| + for (const auto& pair : request.headers) {
|
| + web_request->setHeader(blink::WebString::fromUTF8(pair.first),
|
| + blink::WebString::fromUTF8(pair.second));
|
| + }
|
| + if (!request.blob_uuid.empty()) {
|
| + web_request->setBlob(blink::WebString::fromASCII(request.blob_uuid),
|
| + request.blob_size);
|
| + }
|
| + web_request->setReferrer(
|
| + blink::WebString::fromUTF8(request.referrer.url.spec()),
|
| + request.referrer.policy);
|
| + web_request->setMode(GetBlinkFetchRequestMode(request.mode));
|
| + web_request->setIsMainResourceLoad(request.is_main_resource_load);
|
| + web_request->setCredentialsMode(
|
| + GetBlinkFetchCredentialsMode(request.credentials_mode));
|
| + web_request->setRedirectMode(
|
| + GetBlinkFetchRedirectMode(request.redirect_mode));
|
| + web_request->setRequestContext(
|
| + GetBlinkRequestContext(request.request_context_type));
|
| + web_request->setFrameType(GetBlinkFrameType(request.frame_type));
|
| + web_request->setClientId(blink::WebString::fromUTF8(request.client_id));
|
| + web_request->setIsReload(request.is_reload);
|
| +}
|
| +
|
| +// Converts |response| to its equivalent type in the Blink API.
|
| +// TODO(peter): Remove this when the Mojo FetchAPIResponse type exists.
|
| +void ToWebServiceWorkerResponse(const ServiceWorkerResponse& response,
|
| + blink::WebServiceWorkerResponse* web_response) {
|
| + DCHECK(web_response);
|
| +
|
| + std::vector<blink::WebURL> url_list;
|
| + for (const GURL& url : response.url_list)
|
| + url_list.push_back(blink::WebURL(url));
|
| +
|
| + web_response->setURLList(blink::WebVector<blink::WebURL>(url_list));
|
| + web_response->setStatus(static_cast<unsigned short>(response.status_code));
|
| + web_response->setStatusText(blink::WebString::fromUTF8(response.status_text));
|
| + web_response->setResponseType(response.response_type);
|
| + for (const auto& pair : response.headers) {
|
| + web_response->setHeader(blink::WebString::fromUTF8(pair.first),
|
| + blink::WebString::fromUTF8(pair.second));
|
| + }
|
| + if (!response.blob_uuid.empty()) {
|
| + web_response->setBlob(blink::WebString::fromASCII(response.blob_uuid),
|
| + response.blob_size);
|
| + }
|
| + web_response->setStreamURL(blink::WebURL(response.stream_url));
|
| + web_response->setError(response.error);
|
| + web_response->setResponseTime(response.response_time.ToInternalValue());
|
| + if (response.is_in_cache_storage) {
|
| + web_response->setCacheStorageCacheName(
|
| + blink::WebString::fromUTF8(response.cache_storage_cache_name));
|
| + }
|
| +
|
| + std::vector<blink::WebString> cors_exposed_header_names;
|
| + for (const auto& name : response.cors_exposed_header_names)
|
| + cors_exposed_header_names.push_back(blink::WebString::fromUTF8(name));
|
| +
|
| + web_response->setCorsExposedHeaderNames(
|
| + blink::WebVector<blink::WebString>(cors_exposed_header_names));
|
| +}
|
| +
|
| // Use this template in willDestroyWorkerContext to abort all the pending
|
| // events callbacks.
|
| template <typename T>
|
| @@ -190,6 +261,10 @@ struct ServiceWorkerContextClient::WorkerContextData {
|
| IDMap<std::unique_ptr<const DispatchBackgroundFetchAbortEventCallback>>;
|
| using BackgroundFetchClickEventCallbacksMap =
|
| IDMap<std::unique_ptr<const DispatchBackgroundFetchClickEventCallback>>;
|
| + using BackgroundFetchFailEventCallbacksMap =
|
| + IDMap<std::unique_ptr<const DispatchBackgroundFetchFailEventCallback>>;
|
| + using BackgroundFetchedEventCallbacksMap =
|
| + IDMap<std::unique_ptr<const DispatchBackgroundFetchedEventCallback>>;
|
| using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>;
|
| using PaymentRequestEventCallbacksMap =
|
| IDMap<std::unique_ptr<const PaymentRequestEventCallback>>;
|
| @@ -237,6 +312,12 @@ struct ServiceWorkerContextClient::WorkerContextData {
|
| // Pending callbacks for Background Fetch Click Events.
|
| BackgroundFetchClickEventCallbacksMap background_fetch_click_event_callbacks;
|
|
|
| + // Pending callbacks for Background Fetch Fail Events.
|
| + BackgroundFetchFailEventCallbacksMap background_fetch_fail_event_callbacks;
|
| +
|
| + // Pending callbacks for Background Fetched Events.
|
| + BackgroundFetchedEventCallbacksMap background_fetched_event_callbacks;
|
| +
|
| // Pending callbacks for Background Sync Events.
|
| SyncEventCallbacksMap sync_event_callbacks;
|
|
|
| @@ -578,6 +659,8 @@ void ServiceWorkerContextClient::willDestroyWorkerContext(
|
| AbortPendingEventCallbacks(context_->activate_event_callbacks);
|
| AbortPendingEventCallbacks(context_->background_fetch_abort_event_callbacks);
|
| AbortPendingEventCallbacks(context_->background_fetch_click_event_callbacks);
|
| + AbortPendingEventCallbacks(context_->background_fetch_fail_event_callbacks);
|
| + AbortPendingEventCallbacks(context_->background_fetched_event_callbacks);
|
| AbortPendingEventCallbacks(context_->sync_event_callbacks);
|
| AbortPendingEventCallbacks(context_->notification_click_event_callbacks);
|
| AbortPendingEventCallbacks(context_->notification_close_event_callbacks);
|
| @@ -703,6 +786,30 @@ void ServiceWorkerContextClient::didHandleBackgroundFetchClickEvent(
|
| context_->background_fetch_click_event_callbacks.Remove(request_id);
|
| }
|
|
|
| +void ServiceWorkerContextClient::didHandleBackgroundFetchFailEvent(
|
| + int request_id,
|
| + blink::WebServiceWorkerEventResult result,
|
| + double event_dispatch_time) {
|
| + const DispatchBackgroundFetchFailEventCallback* callback =
|
| + context_->background_fetch_fail_event_callbacks.Lookup(request_id);
|
| + DCHECK(callback);
|
| + callback->Run(EventResultToStatus(result),
|
| + base::Time::FromDoubleT(event_dispatch_time));
|
| + context_->background_fetch_fail_event_callbacks.Remove(request_id);
|
| +}
|
| +
|
| +void ServiceWorkerContextClient::didHandleBackgroundFetchedEvent(
|
| + int request_id,
|
| + blink::WebServiceWorkerEventResult result,
|
| + double event_dispatch_time) {
|
| + const DispatchBackgroundFetchedEventCallback* callback =
|
| + context_->background_fetched_event_callbacks.Lookup(request_id);
|
| + DCHECK(callback);
|
| + callback->Run(EventResultToStatus(result),
|
| + base::Time::FromDoubleT(event_dispatch_time));
|
| + context_->background_fetched_event_callbacks.Remove(request_id);
|
| +}
|
| +
|
| void ServiceWorkerContextClient::didHandleExtendableMessageEvent(
|
| int request_id,
|
| blink::WebServiceWorkerEventResult result,
|
| @@ -998,6 +1105,46 @@ void ServiceWorkerContextClient::DispatchBackgroundFetchClickEvent(
|
| request_id, blink::WebString::fromUTF8(tag), web_state);
|
| }
|
|
|
| +void ServiceWorkerContextClient::DispatchBackgroundFetchFailEvent(
|
| + const std::string& tag,
|
| + const std::vector<BackgroundFetchSettledFetch>& fetches,
|
| + const DispatchBackgroundFetchFailEventCallback& callback) {
|
| + TRACE_EVENT0("ServiceWorker",
|
| + "ServiceWorkerContextClient::DispatchBackgroundFetchFailEvent");
|
| + int request_id = context_->background_fetch_fail_event_callbacks.Add(
|
| + base::MakeUnique<DispatchBackgroundFetchFailEventCallback>(callback));
|
| +
|
| + blink::WebVector<blink::WebBackgroundFetchSettledFetch> web_fetches(
|
| + fetches.size());
|
| + for (size_t i = 0; i < fetches.size(); ++i) {
|
| + ToWebServiceWorkerRequest(fetches[i].request, &web_fetches[i].request);
|
| + ToWebServiceWorkerResponse(fetches[i].response, &web_fetches[i].response);
|
| + }
|
| +
|
| + proxy_->dispatchBackgroundFetchFailEvent(
|
| + request_id, blink::WebString::fromUTF8(tag), web_fetches);
|
| +}
|
| +
|
| +void ServiceWorkerContextClient::DispatchBackgroundFetchedEvent(
|
| + const std::string& tag,
|
| + const std::vector<BackgroundFetchSettledFetch>& fetches,
|
| + const DispatchBackgroundFetchedEventCallback& callback) {
|
| + TRACE_EVENT0("ServiceWorker",
|
| + "ServiceWorkerContextClient::DispatchBackgroundFetchedEvent");
|
| + int request_id = context_->background_fetched_event_callbacks.Add(
|
| + base::MakeUnique<DispatchBackgroundFetchedEventCallback>(callback));
|
| +
|
| + blink::WebVector<blink::WebBackgroundFetchSettledFetch> web_fetches(
|
| + fetches.size());
|
| + for (size_t i = 0; i < fetches.size(); ++i) {
|
| + ToWebServiceWorkerRequest(fetches[i].request, &web_fetches[i].request);
|
| + ToWebServiceWorkerResponse(fetches[i].response, &web_fetches[i].response);
|
| + }
|
| +
|
| + proxy_->dispatchBackgroundFetchedEvent(
|
| + request_id, blink::WebString::fromUTF8(tag), web_fetches);
|
| +}
|
| +
|
| void ServiceWorkerContextClient::DispatchExtendableMessageEvent(
|
| mojom::ExtendableMessageEventPtr event,
|
| const DispatchExtendableMessageEventCallback& callback) {
|
| @@ -1050,7 +1197,6 @@ void ServiceWorkerContextClient::DispatchFetchEvent(
|
| fetch_event_id, request.url, std::move(preload_handle))
|
| : nullptr;
|
| const bool navigation_preload_sent = !!preload_request;
|
| - blink::WebServiceWorkerRequest webRequest;
|
| TRACE_EVENT0("ServiceWorker",
|
| "ServiceWorkerContextClient::DispatchFetchEvent");
|
| context_->fetch_event_callbacks.AddWithID(
|
| @@ -1060,35 +1206,13 @@ void ServiceWorkerContextClient::DispatchFetchEvent(
|
| fetch_event_id);
|
| }
|
|
|
| - webRequest.setURL(blink::WebURL(request.url));
|
| - webRequest.setMethod(blink::WebString::fromUTF8(request.method));
|
| - for (ServiceWorkerHeaderMap::const_iterator it = request.headers.begin();
|
| - it != request.headers.end();
|
| - ++it) {
|
| - webRequest.setHeader(blink::WebString::fromUTF8(it->first),
|
| - blink::WebString::fromUTF8(it->second));
|
| - }
|
| - if (!request.blob_uuid.empty()) {
|
| - webRequest.setBlob(blink::WebString::fromASCII(request.blob_uuid),
|
| - request.blob_size);
|
| - }
|
| - webRequest.setReferrer(
|
| - blink::WebString::fromUTF8(request.referrer.url.spec()),
|
| - request.referrer.policy);
|
| - webRequest.setMode(GetBlinkFetchRequestMode(request.mode));
|
| - webRequest.setIsMainResourceLoad(request.is_main_resource_load);
|
| - webRequest.setCredentialsMode(
|
| - GetBlinkFetchCredentialsMode(request.credentials_mode));
|
| - webRequest.setRedirectMode(GetBlinkFetchRedirectMode(request.redirect_mode));
|
| - webRequest.setRequestContext(
|
| - GetBlinkRequestContext(request.request_context_type));
|
| - webRequest.setFrameType(GetBlinkFrameType(request.frame_type));
|
| - webRequest.setClientId(blink::WebString::fromUTF8(request.client_id));
|
| - webRequest.setIsReload(request.is_reload);
|
| + blink::WebServiceWorkerRequest web_request;
|
| + ToWebServiceWorkerRequest(request, &web_request);
|
| +
|
| if (request.fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) {
|
| - proxy_->dispatchForeignFetchEvent(fetch_event_id, webRequest);
|
| + proxy_->dispatchForeignFetchEvent(fetch_event_id, web_request);
|
| } else {
|
| - proxy_->dispatchFetchEvent(fetch_event_id, webRequest,
|
| + proxy_->dispatchFetchEvent(fetch_event_id, web_request,
|
| navigation_preload_sent);
|
| }
|
| }
|
|
|