diff options
Diffstat (limited to 'chromium/content/browser/service_worker/service_worker_handle.cc')
-rw-r--r-- | chromium/content/browser/service_worker/service_worker_handle.cc | 62 |
1 files changed, 51 insertions, 11 deletions
diff --git a/chromium/content/browser/service_worker/service_worker_handle.cc b/chromium/content/browser/service_worker/service_worker_handle.cc index 1b87b9edab0..777cea9149d 100644 --- a/chromium/content/browser/service_worker/service_worker_handle.cc +++ b/chromium/content/browser/service_worker/service_worker_handle.cc @@ -11,6 +11,7 @@ #include "content/browser/service_worker/service_worker_type_converters.h" #include "content/common/service_worker/service_worker_types.h" #include "content/common/service_worker/service_worker_utils.h" +#include "content/public/browser/browser_thread.h" #include "content/public/common/browser_side_navigation_policy.h" namespace content { @@ -87,6 +88,9 @@ bool SetSourceClientInfo( return true; } +// The output |event| must be sent over Mojo immediately after this function +// returns. See ServiceWorkerHandle::CreateCompleteObjectInfoToSend() for +// details. bool SetSourceServiceWorkerInfo(scoped_refptr<ServiceWorkerVersion> worker, base::WeakPtr<ServiceWorkerProviderHost> source_service_worker_provider_host, @@ -98,9 +102,16 @@ bool SetSourceServiceWorkerInfo(scoped_refptr<ServiceWorkerVersion> worker, DCHECK_EQ(blink::mojom::ServiceWorkerProviderType::kForServiceWorker, source_service_worker_provider_host->provider_type()); - blink::mojom::ServiceWorkerObjectInfoPtr source_worker_info = + blink::mojom::ServiceWorkerObjectInfoPtr source_worker_info; + base::WeakPtr<ServiceWorkerHandle> service_worker_handle = worker->provider_host()->GetOrCreateServiceWorkerHandle( source_service_worker_provider_host->running_hosted_version()); + if (service_worker_handle) { + // CreateCompleteObjectInfoToSend() is safe because |source_worker_info| + // will be sent immediately by the caller of this function. + source_worker_info = + service_worker_handle->CreateCompleteObjectInfoToSend(); + } (*event)->source_info_for_service_worker = std::move(source_worker_info); // Hide the service worker url if the service worker has a unique origin. @@ -159,7 +170,6 @@ ServiceWorkerHandle::ServiceWorkerHandle( provider_host_(provider_host), provider_origin_(url::Origin::Create(provider_host->document_url())), provider_id_(provider_host->provider_id()), - handle_id_(context->GetNewServiceWorkerHandleId()), version_(std::move(version)), weak_ptr_factory_(this) { DCHECK(context_ && provider_host_ && version_); @@ -170,20 +180,37 @@ ServiceWorkerHandle::ServiceWorkerHandle( } ServiceWorkerHandle::~ServiceWorkerHandle() { + // TODO(crbug.com/838410): These CHECKs are temporary debugging for the linked + // bug. + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + CHECK(!in_dtor_); + in_dtor_ = true; + version_->RemoveListener(this); } void ServiceWorkerHandle::OnVersionStateChanged(ServiceWorkerVersion* version) { DCHECK(version); - provider_host_->SendServiceWorkerStateChangedMessage( - handle_id_, - mojo::ConvertTo<blink::mojom::ServiceWorkerState>(version->status())); + blink::mojom::ServiceWorkerState state = + mojo::ConvertTo<blink::mojom::ServiceWorkerState>(version->status()); + remote_objects_.ForAllPtrs( + [state](blink::mojom::ServiceWorkerObject* remote_object) { + remote_object->StateChanged(state); + }); } blink::mojom::ServiceWorkerObjectInfoPtr -ServiceWorkerHandle::CreateObjectInfo() { +ServiceWorkerHandle::CreateCompleteObjectInfoToSend() { + auto info = CreateIncompleteObjectInfo(); + blink::mojom::ServiceWorkerObjectAssociatedPtr remote_object; + info->request = mojo::MakeRequest(&remote_object); + remote_objects_.AddPtr(std::move(remote_object)); + return info; +} + +blink::mojom::ServiceWorkerObjectInfoPtr +ServiceWorkerHandle::CreateIncompleteObjectInfo() { auto info = blink::mojom::ServiceWorkerObjectInfo::New(); - info->handle_id = handle_id_; info->url = version_->script_url(); info->state = mojo::ConvertTo<blink::mojom::ServiceWorkerState>(version_->status()); @@ -192,6 +219,23 @@ ServiceWorkerHandle::CreateObjectInfo() { return info; } +void ServiceWorkerHandle::AddRemoteObjectPtrAndUpdateState( + blink::mojom::ServiceWorkerObjectAssociatedPtrInfo remote_object_ptr_info, + blink::mojom::ServiceWorkerState sent_state) { + DCHECK(remote_object_ptr_info.is_valid()); + blink::mojom::ServiceWorkerObjectAssociatedPtr remote_object; + remote_object.Bind(std::move(remote_object_ptr_info)); + auto state = + mojo::ConvertTo<blink::mojom::ServiceWorkerState>(version_->status()); + if (sent_state != state) + remote_object->StateChanged(state); + remote_objects_.AddPtr(std::move(remote_object)); +} + +base::WeakPtr<ServiceWorkerHandle> ServiceWorkerHandle::AsWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + void ServiceWorkerHandle::PostMessageToServiceWorker( ::blink::TransferableMessage message) { // When this method is called the encoded_message inside message could just @@ -248,10 +292,6 @@ void ServiceWorkerHandle::DispatchExtendableMessageEvent( NOTREACHED() << provider_host_->provider_type(); } -base::WeakPtr<ServiceWorkerHandle> ServiceWorkerHandle::AsWeakPtr() { - return weak_ptr_factory_.GetWeakPtr(); -} - void ServiceWorkerHandle::OnConnectionError() { // If there are still bindings, |this| is still being used. if (!bindings_.empty()) |