Index: content/browser/service_worker/service_worker_provider_host.cc |
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc |
index d1e82aac54e748d217663ddfb4987b3b756821ad..a4339e9fe67e8eb0dd7f41c9e2c9bf6307eaa664 100644 |
--- a/content/browser/service_worker/service_worker_provider_host.cc |
+++ b/content/browser/service_worker/service_worker_provider_host.cc |
@@ -7,6 +7,7 @@ |
#include <utility> |
#include "base/guid.h" |
+#include "base/memory/ptr_util.h" |
#include "base/stl_util.h" |
#include "base/time/time.h" |
#include "content/browser/message_port_message_filter.h" |
@@ -27,6 +28,7 @@ |
#include "content/public/common/child_process_host.h" |
#include "content/public/common/content_client.h" |
#include "content/public/common/origin_util.h" |
+#include "net/base/url_util.h" |
namespace content { |
@@ -37,6 +39,38 @@ namespace { |
// going down. |
int g_next_navigation_provider_id = -2; |
+// A request handler derivative used to handle navigation requests when |
+// skip_service_worker flag is set. It tracks the document URL and sets the url |
+// to the provider host. |
+class ServiceWorkerURLTrackingRequestHandler |
+ : public ServiceWorkerRequestHandler { |
+ public: |
+ ServiceWorkerURLTrackingRequestHandler( |
+ base::WeakPtr<ServiceWorkerContextCore> context, |
+ base::WeakPtr<ServiceWorkerProviderHost> provider_host, |
+ base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
+ ResourceType resource_type) |
+ : ServiceWorkerRequestHandler(context, |
+ provider_host, |
+ blob_storage_context, |
+ resource_type) {} |
+ ~ServiceWorkerURLTrackingRequestHandler() override {} |
+ |
+ // Called via custom URLRequestJobFactory. |
+ net::URLRequestJob* MaybeCreateJob( |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate, |
+ ResourceContext* resource_context) override { |
+ const GURL stripped_url = net::SimplifyUrlForRequest(request->url()); |
+ provider_host_->SetDocumentUrl(stripped_url); |
+ provider_host_->SetTopmostFrameUrl(request->first_party_for_cookies()); |
+ return nullptr; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ServiceWorkerURLTrackingRequestHandler); |
+}; |
+ |
} // anonymous namespace |
ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( |
@@ -333,19 +367,24 @@ ServiceWorkerProviderHost::CreateRequestHandler( |
RequestContextType request_context_type, |
RequestContextFrameType frame_type, |
base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
- scoped_refptr<ResourceRequestBodyImpl> body) { |
+ scoped_refptr<ResourceRequestBodyImpl> body, |
+ bool skip_service_worker) { |
+ if (skip_service_worker) { |
+ if (!ServiceWorkerUtils::IsMainResourceType(resource_type)) |
+ return std::unique_ptr<ServiceWorkerRequestHandler>(); |
+ return base::MakeUnique<ServiceWorkerURLTrackingRequestHandler>( |
+ context_, AsWeakPtr(), blob_storage_context, resource_type); |
+ } |
if (IsHostToRunningServiceWorker()) { |
- return std::unique_ptr<ServiceWorkerRequestHandler>( |
- new ServiceWorkerContextRequestHandler( |
- context_, AsWeakPtr(), blob_storage_context, resource_type)); |
+ return base::MakeUnique<ServiceWorkerContextRequestHandler>( |
+ context_, AsWeakPtr(), blob_storage_context, resource_type); |
} |
if (ServiceWorkerUtils::IsMainResourceType(resource_type) || |
controlling_version()) { |
- return std::unique_ptr<ServiceWorkerRequestHandler>( |
- new ServiceWorkerControlleeRequestHandler( |
- context_, AsWeakPtr(), blob_storage_context, request_mode, |
- credentials_mode, redirect_mode, resource_type, |
- request_context_type, frame_type, body)); |
+ return base::MakeUnique<ServiceWorkerControlleeRequestHandler>( |
+ context_, AsWeakPtr(), blob_storage_context, request_mode, |
+ credentials_mode, redirect_mode, resource_type, request_context_type, |
+ frame_type, body); |
} |
return std::unique_ptr<ServiceWorkerRequestHandler>(); |
} |