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

Side by Side Diff: content/browser/service_worker/service_worker_dispatcher_host.cc

Issue 1799413002: ServiceWorker: Release a reference when it fails to dispatch ExtendableMessageEvent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move_dispatch_extendable_message_event
Patch Set: fix build failures Created 4 years, 9 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 return; 694 return;
695 } 695 }
696 696
697 ServiceWorkerProviderHost* sender_provider_host = 697 ServiceWorkerProviderHost* sender_provider_host =
698 GetContext()->GetProviderHost(render_process_id_, provider_id); 698 GetContext()->GetProviderHost(render_process_id_, provider_id);
699 if (!sender_provider_host) { 699 if (!sender_provider_host) {
700 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE); 700 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE);
701 return; 701 return;
702 } 702 }
703 703
704 DispatchExtendableMessageEvent(
705 make_scoped_refptr(handle->version()), message, source_origin,
706 sent_message_ports, sender_provider_host,
707 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
708 }
709
710 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent(
711 scoped_refptr<ServiceWorkerVersion> worker,
712 const base::string16& message,
713 const url::Origin& source_origin,
714 const std::vector<TransferredMessagePort>& sent_message_ports,
715 ServiceWorkerProviderHost* sender_provider_host,
716 const StatusCallback& callback) {
704 for (const TransferredMessagePort& port : sent_message_ports) 717 for (const TransferredMessagePort& port : sent_message_ports)
705 MessagePortService::GetInstance()->HoldMessages(port.id); 718 MessagePortService::GetInstance()->HoldMessages(port.id);
706 719
707 switch (sender_provider_host->provider_type()) { 720 switch (sender_provider_host->provider_type()) {
708 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: 721 case SERVICE_WORKER_PROVIDER_FOR_WINDOW:
709 case SERVICE_WORKER_PROVIDER_FOR_WORKER: 722 case SERVICE_WORKER_PROVIDER_FOR_WORKER:
710 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: 723 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER:
711 service_worker_client_utils::GetClient( 724 service_worker_client_utils::GetClient(
712 sender_provider_host, 725 sender_provider_host,
713 base::Bind( 726 base::Bind(&ServiceWorkerDispatcherHost::
714 &ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent< 727 DispatchExtendableMessageEventInternal<
715 ServiceWorkerClientInfo>, 728 ServiceWorkerClientInfo>,
716 this, make_scoped_refptr(handle->version()), message, 729 this, worker, message, source_origin, sent_message_ports,
717 source_origin, sent_message_ports)); 730 callback));
718 break; 731 break;
719 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: 732 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER:
720 // TODO(nhiroki): Decrement a reference to ServiceWorkerHandle if starting
721 // worker fails (http://crbug.com/543198).
722 RunSoon(base::Bind( 733 RunSoon(base::Bind(
723 &ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent< 734 &ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal<
724 ServiceWorkerObjectInfo>, 735 ServiceWorkerObjectInfo>,
725 this, make_scoped_refptr(handle->version()), message, source_origin, 736 this, worker, message, source_origin, sent_message_ports, callback,
726 sent_message_ports,
727 sender_provider_host->GetOrCreateServiceWorkerHandle( 737 sender_provider_host->GetOrCreateServiceWorkerHandle(
728 sender_provider_host->running_hosted_version()))); 738 sender_provider_host->running_hosted_version())));
729 break; 739 break;
730 case SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME: 740 case SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME:
731 case SERVICE_WORKER_PROVIDER_UNKNOWN: 741 case SERVICE_WORKER_PROVIDER_UNKNOWN:
732 NOTREACHED() << sender_provider_host->provider_type(); 742 NOTREACHED() << sender_provider_host->provider_type();
733 break; 743 break;
734 } 744 }
735 } 745 }
736 746
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 ServiceWorkerRegistrationObjectInfo info; 869 ServiceWorkerRegistrationObjectInfo info;
860 ServiceWorkerVersionAttributes attrs; 870 ServiceWorkerVersionAttributes attrs;
861 GetRegistrationObjectInfoAndVersionAttributes( 871 GetRegistrationObjectInfoAndVersionAttributes(
862 provider_host->AsWeakPtr(), registration, &info, &attrs); 872 provider_host->AsWeakPtr(), registration, &info, &attrs);
863 873
864 Send(new ServiceWorkerMsg_AssociateRegistration(kDocumentMainThreadId, 874 Send(new ServiceWorkerMsg_AssociateRegistration(kDocumentMainThreadId,
865 provider_id, info, attrs)); 875 provider_id, info, attrs));
866 } 876 }
867 877
868 template <typename SourceInfo> 878 template <typename SourceInfo>
869 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent( 879 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal(
870 scoped_refptr<ServiceWorkerVersion> worker, 880 scoped_refptr<ServiceWorkerVersion> worker,
871 const base::string16& message, 881 const base::string16& message,
872 const url::Origin& source_origin, 882 const url::Origin& source_origin,
873 const std::vector<TransferredMessagePort>& sent_message_ports, 883 const std::vector<TransferredMessagePort>& sent_message_ports,
884 const StatusCallback& callback,
874 const SourceInfo& source_info) { 885 const SourceInfo& source_info) {
875 if (!source_info.IsValid()) { 886 if (!source_info.IsValid()) {
876 DidFailToDispatchExtendableMessageEvent(sent_message_ports, 887 DidFailToDispatchExtendableMessageEvent<SourceInfo>(
877 SERVICE_WORKER_ERROR_FAILED); 888 sent_message_ports, source_info, callback, SERVICE_WORKER_ERROR_FAILED);
878 return; 889 return;
879 } 890 }
880 worker->RunAfterStartWorker( 891 worker->RunAfterStartWorker(
881 ServiceWorkerMetrics::EventType::MESSAGE, 892 ServiceWorkerMetrics::EventType::MESSAGE,
882 base::Bind(&ServiceWorkerDispatcherHost:: 893 base::Bind(&ServiceWorkerDispatcherHost::
883 DispatchExtendableMessageEventAfterStartWorker, 894 DispatchExtendableMessageEventAfterStartWorker,
884 this, worker, message, source_origin, sent_message_ports, 895 this, worker, message, source_origin, sent_message_ports,
885 ExtendableMessageEventSource(source_info)), 896 ExtendableMessageEventSource(source_info), callback),
886 base::Bind( 897 base::Bind(
887 &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent, 898 &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent<
888 this, sent_message_ports)); 899 SourceInfo>,
900 this, sent_message_ports, source_info, callback));
889 } 901 }
890 902
891 void ServiceWorkerDispatcherHost:: 903 void ServiceWorkerDispatcherHost::
892 DispatchExtendableMessageEventAfterStartWorker( 904 DispatchExtendableMessageEventAfterStartWorker(
893 scoped_refptr<ServiceWorkerVersion> worker, 905 scoped_refptr<ServiceWorkerVersion> worker,
894 const base::string16& message, 906 const base::string16& message,
895 const url::Origin& source_origin, 907 const url::Origin& source_origin,
896 const std::vector<TransferredMessagePort>& sent_message_ports, 908 const std::vector<TransferredMessagePort>& sent_message_ports,
897 const ExtendableMessageEventSource& source) { 909 const ExtendableMessageEventSource& source,
910 const StatusCallback& callback) {
898 int request_id = 911 int request_id =
899 worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, 912 worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback);
900 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
901 913
902 MessagePortMessageFilter* filter = 914 MessagePortMessageFilter* filter =
903 worker->embedded_worker()->message_port_message_filter(); 915 worker->embedded_worker()->message_port_message_filter();
904 std::vector<int> new_routing_ids; 916 std::vector<int> new_routing_ids;
905 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); 917 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids);
906 918
907 ServiceWorkerMsg_ExtendableMessageEvent_Params params; 919 ServiceWorkerMsg_ExtendableMessageEvent_Params params;
908 params.message = message; 920 params.message = message;
909 params.source_origin = source_origin; 921 params.source_origin = source_origin;
910 params.message_ports = sent_message_ports; 922 params.message_ports = sent_message_ports;
911 params.new_routing_ids = new_routing_ids; 923 params.new_routing_ids = new_routing_ids;
912 params.source = source; 924 params.source = source;
913 925
914 // Hide the client url if the client has a unique origin. 926 // Hide the client url if the client has a unique origin.
915 if (source_origin.unique()) { 927 if (source_origin.unique()) {
916 if (params.source.client_info.IsValid()) 928 if (params.source.client_info.IsValid())
917 params.source.client_info.url = GURL(); 929 params.source.client_info.url = GURL();
918 else 930 else
919 params.source.service_worker_info.url = GURL(); 931 params.source.service_worker_info.url = GURL();
920 } 932 }
921 933
922 worker->DispatchSimpleEvent< 934 worker->DispatchSimpleEvent<
923 ServiceWorkerHostMsg_ExtendableMessageEventFinished>( 935 ServiceWorkerHostMsg_ExtendableMessageEventFinished>(
924 request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params)); 936 request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params));
925 } 937 }
926 938
939 template <typename SourceInfo>
927 void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent( 940 void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent(
928 const std::vector<TransferredMessagePort>& sent_message_ports, 941 const std::vector<TransferredMessagePort>& sent_message_ports,
942 const SourceInfo& source_info,
943 const StatusCallback& callback,
929 ServiceWorkerStatusCode status) { 944 ServiceWorkerStatusCode status) {
930 // Transfering the message ports failed, so destroy the ports. 945 // Transfering the message ports failed, so destroy the ports.
931 for (const TransferredMessagePort& port : sent_message_ports) 946 for (const TransferredMessagePort& port : sent_message_ports)
932 MessagePortService::GetInstance()->ClosePort(port.id); 947 MessagePortService::GetInstance()->ClosePort(port.id);
948 if (source_info.IsValid())
949 ReleaseSourceInfo(source_info);
950 callback.Run(status);
951 }
952
953 void ServiceWorkerDispatcherHost::ReleaseSourceInfo(
954 const ServiceWorkerClientInfo& source_info) {
955 // ServiceWorkerClientInfo is just a snapshot of the client. There is no need
956 // to do anything for it.
957 }
958
959 void ServiceWorkerDispatcherHost::ReleaseSourceInfo(
960 const ServiceWorkerObjectInfo& source_info) {
961 ServiceWorkerHandle* handle = handles_.Lookup(source_info.handle_id);
962 DCHECK(handle);
963 handle->DecrementRefCount();
964 if (handle->HasNoRefCount())
965 handles_.Remove(source_info.handle_id);
933 } 966 }
934 967
935 ServiceWorkerRegistrationHandle* 968 ServiceWorkerRegistrationHandle*
936 ServiceWorkerDispatcherHost::FindRegistrationHandle(int provider_id, 969 ServiceWorkerDispatcherHost::FindRegistrationHandle(int provider_id,
937 int64_t registration_id) { 970 int64_t registration_id) {
938 for (RegistrationHandleMap::iterator iter(&registration_handles_); 971 for (RegistrationHandleMap::iterator iter(&registration_handles_);
939 !iter.IsAtEnd(); iter.Advance()) { 972 !iter.IsAtEnd(); iter.Advance()) {
940 ServiceWorkerRegistrationHandle* handle = iter.GetCurrentValue(); 973 ServiceWorkerRegistrationHandle* handle = iter.GetCurrentValue();
941 if (handle->provider_id() == provider_id && 974 if (handle->provider_id() == provider_id &&
942 handle->registration()->id() == registration_id) { 975 handle->registration()->id() == registration_id) {
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 if (!handle) { 1423 if (!handle) {
1391 bad_message::ReceivedBadMessage(this, 1424 bad_message::ReceivedBadMessage(this,
1392 bad_message::SWDH_TERMINATE_BAD_HANDLE); 1425 bad_message::SWDH_TERMINATE_BAD_HANDLE);
1393 return; 1426 return;
1394 } 1427 }
1395 handle->version()->StopWorker( 1428 handle->version()->StopWorker(
1396 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 1429 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
1397 } 1430 }
1398 1431
1399 } // namespace content 1432 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698