Index: content/browser/service_worker/service_worker_controllee_request_handler.cc |
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc |
index 76e9c2d3139b242ea1acf4b0bc601f4edd6c3a0c..69492d564e47f5e081362adaf8dd6de418c8eccd 100644 |
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc |
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc |
@@ -14,6 +14,7 @@ |
#include "content/browser/service_worker/service_worker_provider_host.h" |
#include "content/browser/service_worker/service_worker_registration.h" |
#include "content/browser/service_worker/service_worker_response_info.h" |
+#include "content/browser/service_worker/service_worker_url_job_wrapper.h" |
#include "content/browser/service_worker/service_worker_url_request_job.h" |
#include "content/common/resource_request_body_impl.h" |
#include "content/common/service_worker/service_worker_types.h" |
@@ -34,7 +35,7 @@ namespace content { |
namespace { |
-bool MaybeForwardToServiceWorker(ServiceWorkerURLRequestJob* job, |
+bool MaybeForwardToServiceWorker(ServiceWorkerURLJobWrapper* job, |
const ServiceWorkerVersion* version) { |
DCHECK(job); |
DCHECK(version); |
@@ -50,14 +51,6 @@ bool MaybeForwardToServiceWorker(ServiceWorkerURLRequestJob* job, |
return false; |
} |
-ui::PageTransition GetPageTransition(net::URLRequest* request) { |
- const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
- // ResourceRequestInfo may not be set in some tests. |
- if (!info) |
- return ui::PAGE_TRANSITION_LINK; |
- return info->GetPageTransition(); |
-} |
- |
} // namespace |
ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler( |
@@ -140,16 +133,16 @@ net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( |
credentials_mode_, redirect_mode_, resource_type_, |
request_context_type_, frame_type_, body_, |
ServiceWorkerFetchType::FETCH, base::nullopt, this)); |
- job_ = job->GetWeakPtr(); |
+ url_job_ = base::MakeUnique<ServiceWorkerURLJobWrapper>(job->GetWeakPtr()); |
resource_context_ = resource_context; |
if (is_main_resource_load_) |
- PrepareForMainResource(request); |
+ PrepareForMainResource(request->url(), request->first_party_for_cookies()); |
else |
PrepareForSubResource(); |
- if (job_->ShouldFallbackToNetwork()) { |
+ if (url_job_->ShouldFallbackToNetwork()) { |
// If we know we can fallback to network at this point (in case |
// the storage lookup returned immediately), just destroy the job and return |
// NULL here to fallback to network. |
@@ -167,15 +160,15 @@ net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( |
} |
void ServiceWorkerControlleeRequestHandler::PrepareForMainResource( |
- const net::URLRequest* request) { |
- DCHECK(job_.get()); |
+ const GURL& url, |
+ const GURL& first_party_for_cookies) { |
+ DCHECK(!JobWasCanceled()); |
DCHECK(context_); |
DCHECK(provider_host_); |
TRACE_EVENT_ASYNC_BEGIN1( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), |
- "URL", request->url().spec()); |
+ url_job_.get(), "URL", url.spec()); |
// The corresponding provider_host may already have associated a registration |
// in redirect case, unassociate it now. |
provider_host_->DisassociateRegistration(); |
@@ -184,9 +177,9 @@ void ServiceWorkerControlleeRequestHandler::PrepareForMainResource( |
// registration while we're finding an existing registration. |
provider_host_->SetAllowAssociation(false); |
- stripped_url_ = net::SimplifyUrlForRequest(request->url()); |
+ stripped_url_ = net::SimplifyUrlForRequest(url); |
provider_host_->SetDocumentUrl(stripped_url_); |
- provider_host_->SetTopmostFrameUrl(request->first_party_for_cookies()); |
+ provider_host_->SetTopmostFrameUrl(first_party_for_cookies); |
context_->storage()->FindRegistrationForDocument( |
stripped_url_, base::Bind(&self::DidLookupRegistrationForMainResource, |
weak_factory_.GetWeakPtr())); |
@@ -196,8 +189,8 @@ void ServiceWorkerControlleeRequestHandler:: |
DidLookupRegistrationForMainResource( |
ServiceWorkerStatusCode status, |
scoped_refptr<ServiceWorkerRegistration> registration) { |
- // The job may have been canceled and then destroyed before this was invoked. |
- if (!job_) |
+ // The job may have been canceled before this was invoked. |
+ if (JobWasCanceled()) |
return; |
const bool need_to_update = !force_update_started_ && registration && |
@@ -206,12 +199,11 @@ void ServiceWorkerControlleeRequestHandler:: |
if (provider_host_ && !need_to_update) |
provider_host_->SetAllowAssociation(true); |
if (status != SERVICE_WORKER_OK || !provider_host_ || !context_) { |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
TRACE_EVENT_ASYNC_END1( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), |
- "Status", status); |
+ url_job_.get(), "Status", status); |
return; |
} |
DCHECK(registration.get()); |
@@ -232,24 +224,22 @@ void ServiceWorkerControlleeRequestHandler:: |
if (!GetContentClient()->browser()->AllowServiceWorker( |
registration->pattern(), provider_host_->topmost_frame_url(), |
resource_context_, web_contents_getter)) { |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
TRACE_EVENT_ASYNC_END2( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), |
- "Status", status, |
- "Info", "ServiceWorker is blocked"); |
+ url_job_.get(), "Status", status, "Info", "ServiceWorker is blocked"); |
return; |
} |
if (!provider_host_->IsContextSecureForServiceWorker()) { |
// TODO(falken): Figure out a way to surface in the page's DevTools |
// console that the service worker was blocked for security. |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
TRACE_EVENT_ASYNC_END1( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), "Info", "Insecure context"); |
+ url_job_.get(), "Info", "Insecure context"); |
return; |
} |
@@ -283,9 +273,8 @@ void ServiceWorkerControlleeRequestHandler:: |
TRACE_EVENT_ASYNC_END2( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), |
- "Status", status, |
- "Info", "Wait until finished SW activation"); |
+ url_job_.get(), "Status", status, "Info", |
+ "Wait until finished SW activation"); |
return; |
} |
@@ -297,13 +286,11 @@ void ServiceWorkerControlleeRequestHandler:: |
if (!active_version.get() || |
active_version->status() != ServiceWorkerVersion::ACTIVATED) { |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
TRACE_EVENT_ASYNC_END2( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), |
- "Status", status, |
- "Info", |
+ url_job_.get(), "Status", status, "Info", |
"ServiceWorkerVersion is not available, so falling back to network"); |
return; |
} |
@@ -312,15 +299,15 @@ void ServiceWorkerControlleeRequestHandler:: |
ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN); |
ServiceWorkerMetrics::CountControlledPageLoad( |
active_version->site_for_uma(), stripped_url_, is_main_frame_load_, |
- GetPageTransition(job_->request()), job_->request()->url_chain().size()); |
+ url_job_->GetPageTransition(), url_job_->GetURLChainSize()); |
bool is_forwarded = |
- MaybeForwardToServiceWorker(job_.get(), active_version.get()); |
+ MaybeForwardToServiceWorker(url_job_.get(), active_version.get()); |
TRACE_EVENT_ASYNC_END2( |
"ServiceWorker", |
"ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
- job_.get(), "Status", status, "Info", |
+ url_job_.get(), "Status", status, "Info", |
(is_forwarded) ? "Forwarded to the ServiceWorker" |
: "Skipped the ServiceWorker which has no fetch handler"); |
} |
@@ -328,8 +315,8 @@ void ServiceWorkerControlleeRequestHandler:: |
void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( |
ServiceWorkerRegistration* registration, |
ServiceWorkerVersion* version) { |
- // The job may have been canceled and then destroyed before this was invoked. |
- if (!job_) |
+ // The job may have been canceled before this was invoked. |
+ if (JobWasCanceled()) |
return; |
if (provider_host_) |
@@ -337,7 +324,7 @@ void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( |
if (version != registration->active_version() || |
version->status() != ServiceWorkerVersion::ACTIVATED || |
!provider_host_) { |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
return; |
} |
@@ -345,12 +332,12 @@ void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( |
ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN); |
ServiceWorkerMetrics::CountControlledPageLoad( |
version->site_for_uma(), stripped_url_, is_main_frame_load_, |
- GetPageTransition(job_->request()), job_->request()->url_chain().size()); |
+ url_job_->GetPageTransition(), url_job_->GetURLChainSize()); |
provider_host_->AssociateRegistration(registration, |
false /* notify_controllerchange */); |
- MaybeForwardToServiceWorker(job_.get(), version); |
+ MaybeForwardToServiceWorker(url_job_.get(), version); |
} |
void ServiceWorkerControlleeRequestHandler::DidUpdateRegistration( |
@@ -360,12 +347,12 @@ void ServiceWorkerControlleeRequestHandler::DidUpdateRegistration( |
int64_t registration_id) { |
DCHECK(force_update_started_); |
- // The job may have been canceled and then destroyed before this was invoked. |
- if (!job_) |
+ // The job may have been canceled before this was invoked. |
+ if (JobWasCanceled()) |
return; |
if (!context_) { |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
return; |
} |
if (status != SERVICE_WORKER_OK || |
@@ -390,12 +377,12 @@ void ServiceWorkerControlleeRequestHandler::DidUpdateRegistration( |
void ServiceWorkerControlleeRequestHandler::OnUpdatedVersionStatusChanged( |
const scoped_refptr<ServiceWorkerRegistration>& registration, |
const scoped_refptr<ServiceWorkerVersion>& version) { |
- // The job may have been canceled and then destroyed before this was invoked. |
- if (!job_) |
+ // The job may have been canceled before this was invoked. |
+ if (JobWasCanceled()) |
return; |
if (!context_) { |
- job_->FallbackToNetwork(); |
+ url_job_->FallbackToNetwork(); |
return; |
} |
if (version->status() == ServiceWorkerVersion::ACTIVATED || |
@@ -414,7 +401,7 @@ void ServiceWorkerControlleeRequestHandler::OnUpdatedVersionStatusChanged( |
} |
void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { |
- DCHECK(job_.get()); |
+ DCHECK(!JobWasCanceled()); |
DCHECK(context_); |
// When this request handler was created, the provider host had a controller |
@@ -427,11 +414,11 @@ void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { |
// TODO(falken): Figure out if |active_version| can change to |
// |controlling_version| and do it or document the findings. |
if (!provider_host_->active_version()) { |
- job_->FailDueToLostController(); |
+ url_job_->FailDueToLostController(); |
return; |
} |
- MaybeForwardToServiceWorker(job_.get(), provider_host_->active_version()); |
+ MaybeForwardToServiceWorker(url_job_.get(), provider_host_->active_version()); |
} |
void ServiceWorkerControlleeRequestHandler::OnPrepareToRestart() { |
@@ -471,7 +458,11 @@ void ServiceWorkerControlleeRequestHandler::MainResourceLoadFailed() { |
} |
void ServiceWorkerControlleeRequestHandler::ClearJob() { |
- job_.reset(); |
+ url_job_.reset(); |
+} |
+ |
+bool ServiceWorkerControlleeRequestHandler::JobWasCanceled() const { |
+ return !url_job_ || url_job_->WasCanceled(); |
} |
} // namespace content |