OLD | NEW |
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_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <string> | 10 #include <string> |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 if (running_status() == RUNNING) { | 531 if (running_status() == RUNNING) { |
532 DCHECK(start_callbacks_.empty()); | 532 DCHECK(start_callbacks_.empty()); |
533 task.Run(); | 533 task.Run(); |
534 return; | 534 return; |
535 } | 535 } |
536 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 536 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
537 error_callback, task)); | 537 error_callback, task)); |
538 } | 538 } |
539 | 539 |
540 void ServiceWorkerVersion::DispatchExtendableMessageEvent( | 540 void ServiceWorkerVersion::DispatchExtendableMessageEvent( |
| 541 ServiceWorkerProviderHost* sender_provider_host, |
541 const base::string16& message, | 542 const base::string16& message, |
542 const std::vector<TransferredMessagePort>& sent_message_ports, | 543 const std::vector<TransferredMessagePort>& sent_message_ports, |
543 const StatusCallback& callback) { | 544 const StatusCallback& callback) { |
544 for (const TransferredMessagePort& port : sent_message_ports) | 545 for (const TransferredMessagePort& port : sent_message_ports) |
545 MessagePortService::GetInstance()->HoldMessages(port.id); | 546 MessagePortService::GetInstance()->HoldMessages(port.id); |
546 RunAfterStartWorker( | 547 |
547 base::Bind( | 548 switch (sender_provider_host->provider_type()) { |
548 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, | 549 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: |
549 weak_factory_.GetWeakPtr(), message, sent_message_ports, callback), | 550 case SERVICE_WORKER_PROVIDER_FOR_WORKER: |
550 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); | 551 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: |
| 552 service_worker_client_utils::GetClient( |
| 553 sender_provider_host, |
| 554 base::Bind( |
| 555 &ServiceWorkerVersion::DispatchExtendableMessageEventInternal< |
| 556 ServiceWorkerClientInfo>, |
| 557 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
| 558 callback)); |
| 559 break; |
| 560 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: |
| 561 // TODO(nhiroki): Decrement a reference to ServiceWorkerHandle if starting |
| 562 // worker fails. Handles are managed by ServiceWorkerDispatcherHost, and |
| 563 // we might need to make a new path to ask the dispatcher host to release |
| 564 // the handle from ServiceWorkerVersion (http://crbug.com/543198). |
| 565 RunSoon(base::Bind( |
| 566 &ServiceWorkerVersion::DispatchExtendableMessageEventInternal< |
| 567 ServiceWorkerObjectInfo>, |
| 568 weak_factory_.GetWeakPtr(), message, sent_message_ports, callback, |
| 569 sender_provider_host->GetOrCreateServiceWorkerHandle( |
| 570 sender_provider_host->running_hosted_version()))); |
| 571 break; |
| 572 case SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME: |
| 573 case SERVICE_WORKER_PROVIDER_UNKNOWN: |
| 574 NOTREACHED() << sender_provider_host->provider_type(); |
| 575 RunSoon(base::Bind(&RunErrorMessageCallback, sent_message_ports, callback, |
| 576 SERVICE_WORKER_ERROR_FAILED)); |
| 577 break; |
| 578 } |
551 } | 579 } |
552 | 580 |
553 void ServiceWorkerVersion::DispatchMessageEvent( | 581 void ServiceWorkerVersion::DispatchMessageEvent( |
554 const base::string16& message, | 582 const base::string16& message, |
555 const std::vector<TransferredMessagePort>& sent_message_ports, | 583 const std::vector<TransferredMessagePort>& sent_message_ports, |
556 const StatusCallback& callback) { | 584 const StatusCallback& callback) { |
557 for (const TransferredMessagePort& port : sent_message_ports) { | 585 for (const TransferredMessagePort& port : sent_message_ports) { |
558 MessagePortService::GetInstance()->HoldMessages(port.id); | 586 MessagePortService::GetInstance()->HoldMessages(port.id); |
559 } | 587 } |
560 | 588 |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 | 943 |
916 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( | 944 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( |
917 ServiceWorkerStatusCode status) { | 945 ServiceWorkerStatusCode status) { |
918 if (status != SERVICE_WORKER_OK) { | 946 if (status != SERVICE_WORKER_OK) { |
919 scoped_refptr<ServiceWorkerVersion> protect(this); | 947 scoped_refptr<ServiceWorkerVersion> protect(this); |
920 RunCallbacks(this, &start_callbacks_, | 948 RunCallbacks(this, &start_callbacks_, |
921 DeduceStartWorkerFailureReason(status)); | 949 DeduceStartWorkerFailureReason(status)); |
922 } | 950 } |
923 } | 951 } |
924 | 952 |
| 953 template <typename SourceInfo> |
| 954 void ServiceWorkerVersion::DispatchExtendableMessageEventInternal( |
| 955 const base::string16& message, |
| 956 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 957 const StatusCallback& callback, |
| 958 const SourceInfo& source_info) { |
| 959 if (!source_info.IsValid()) { |
| 960 RunErrorMessageCallback(sent_message_ports, callback, |
| 961 SERVICE_WORKER_ERROR_FAILED); |
| 962 return; |
| 963 } |
| 964 RunAfterStartWorker( |
| 965 base::Bind( |
| 966 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, |
| 967 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
| 968 ExtendableMessageEventSource(source_info), callback), |
| 969 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); |
| 970 } |
| 971 |
925 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( | 972 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( |
926 const base::string16& message, | 973 const base::string16& message, |
927 const std::vector<TransferredMessagePort>& sent_message_ports, | 974 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 975 const ExtendableMessageEventSource& source, |
928 const StatusCallback& callback) { | 976 const StatusCallback& callback) { |
929 int request_id = | 977 int request_id = |
930 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); | 978 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); |
931 | 979 |
932 MessagePortMessageFilter* filter = | 980 MessagePortMessageFilter* filter = |
933 embedded_worker_->message_port_message_filter(); | 981 embedded_worker_->message_port_message_filter(); |
934 std::vector<int> new_routing_ids; | 982 std::vector<int> new_routing_ids; |
935 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 983 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
936 | 984 |
937 DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>( | 985 DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>( |
938 request_id, | 986 request_id, |
939 ServiceWorkerMsg_ExtendableMessageEvent( | 987 ServiceWorkerMsg_ExtendableMessageEvent( |
940 request_id, message, sent_message_ports, new_routing_ids)); | 988 request_id, message, sent_message_ports, new_routing_ids, source)); |
941 } | 989 } |
942 | 990 |
943 void ServiceWorkerVersion::OnGetClient(int request_id, | 991 void ServiceWorkerVersion::OnGetClient(int request_id, |
944 const std::string& client_uuid) { | 992 const std::string& client_uuid) { |
945 if (!context_) | 993 if (!context_) |
946 return; | 994 return; |
947 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", | 995 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", |
948 request_id, "client_uuid", client_uuid); | 996 request_id, "client_uuid", client_uuid); |
949 ServiceWorkerProviderHost* provider_host = | 997 ServiceWorkerProviderHost* provider_host = |
950 context_->GetProviderHostByClientID(client_uuid); | 998 context_->GetProviderHostByClientID(client_uuid); |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 void ServiceWorkerVersion::OnBeginEvent() { | 1821 void ServiceWorkerVersion::OnBeginEvent() { |
1774 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1822 if (should_exclude_from_uma_ || running_status() != RUNNING || |
1775 idle_time_.is_null()) { | 1823 idle_time_.is_null()) { |
1776 return; | 1824 return; |
1777 } | 1825 } |
1778 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1826 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1779 idle_time_); | 1827 idle_time_); |
1780 } | 1828 } |
1781 | 1829 |
1782 } // namespace content | 1830 } // namespace content |
OLD | NEW |