Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Unified Diff: content/browser/service_worker/service_worker_provider_host.cc

Issue 2562523003: Set the document URL of ServiceWorkerProviderHost when redirected even if skip_service_worker is set (Closed)
Patch Set: incorporated shimazu's comment Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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>();
}

Powered by Google App Engine
This is Rietveld 408576698