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 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 if (running_status() == RUNNING) { | 519 if (running_status() == RUNNING) { |
520 DCHECK(start_callbacks_.empty()); | 520 DCHECK(start_callbacks_.empty()); |
521 task.Run(); | 521 task.Run(); |
522 return; | 522 return; |
523 } | 523 } |
524 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 524 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
525 error_callback, task)); | 525 error_callback, task)); |
526 } | 526 } |
527 | 527 |
528 void ServiceWorkerVersion::DispatchExtendableMessageEvent( | 528 void ServiceWorkerVersion::DispatchExtendableMessageEvent( |
| 529 ServiceWorkerProviderHost* sender_provider_host, |
529 const base::string16& message, | 530 const base::string16& message, |
530 const std::vector<TransferredMessagePort>& sent_message_ports, | 531 const std::vector<TransferredMessagePort>& sent_message_ports, |
531 const StatusCallback& callback) { | 532 const StatusCallback& callback) { |
532 for (const TransferredMessagePort& port : sent_message_ports) | 533 for (const TransferredMessagePort& port : sent_message_ports) |
533 MessagePortService::GetInstance()->HoldMessages(port.id); | 534 MessagePortService::GetInstance()->HoldMessages(port.id); |
534 RunAfterStartWorker( | 535 |
535 base::Bind( | 536 switch (sender_provider_host->provider_type()) { |
536 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, | 537 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: |
537 weak_factory_.GetWeakPtr(), message, sent_message_ports, callback), | 538 case SERVICE_WORKER_PROVIDER_FOR_WORKER: |
538 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); | 539 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: |
| 540 service_worker_client_utils::GetClient( |
| 541 sender_provider_host, |
| 542 base::Bind( |
| 543 &ServiceWorkerVersion::DispatchExtendableMessageEventInternal< |
| 544 ServiceWorkerClientInfo>, |
| 545 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
| 546 callback)); |
| 547 break; |
| 548 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: |
| 549 // TODO(nhiroki): Decrement a reference to ServiceWorkerHandle if starting |
| 550 // worker fails. Handles are managed by ServiceWorkerDispatcherHost, and |
| 551 // we might need to make a new path to ask the dispatcher host to release |
| 552 // the handle from ServiceWorkerVersion (http://crbug.com/543198). |
| 553 RunSoon(base::Bind( |
| 554 &ServiceWorkerVersion::DispatchExtendableMessageEventInternal< |
| 555 ServiceWorkerObjectInfo>, |
| 556 weak_factory_.GetWeakPtr(), message, sent_message_ports, callback, |
| 557 sender_provider_host->GetOrCreateServiceWorkerHandle( |
| 558 sender_provider_host->running_hosted_version()))); |
| 559 break; |
| 560 case SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME: |
| 561 case SERVICE_WORKER_PROVIDER_UNKNOWN: |
| 562 NOTREACHED() << sender_provider_host->provider_type(); |
| 563 RunSoon(base::Bind(&RunErrorMessageCallback, sent_message_ports, callback, |
| 564 SERVICE_WORKER_ERROR_FAILED)); |
| 565 break; |
| 566 } |
539 } | 567 } |
540 | 568 |
541 void ServiceWorkerVersion::DispatchMessageEvent( | 569 void ServiceWorkerVersion::DispatchMessageEvent( |
542 const base::string16& message, | 570 const base::string16& message, |
543 const std::vector<TransferredMessagePort>& sent_message_ports, | 571 const std::vector<TransferredMessagePort>& sent_message_ports, |
544 const StatusCallback& callback) { | 572 const StatusCallback& callback) { |
545 for (const TransferredMessagePort& port : sent_message_ports) { | 573 for (const TransferredMessagePort& port : sent_message_ports) { |
546 MessagePortService::GetInstance()->HoldMessages(port.id); | 574 MessagePortService::GetInstance()->HoldMessages(port.id); |
547 } | 575 } |
548 | 576 |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 | 929 |
902 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( | 930 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( |
903 ServiceWorkerStatusCode status) { | 931 ServiceWorkerStatusCode status) { |
904 if (status != SERVICE_WORKER_OK) { | 932 if (status != SERVICE_WORKER_OK) { |
905 scoped_refptr<ServiceWorkerVersion> protect(this); | 933 scoped_refptr<ServiceWorkerVersion> protect(this); |
906 RunCallbacks(this, &start_callbacks_, | 934 RunCallbacks(this, &start_callbacks_, |
907 DeduceStartWorkerFailureReason(status)); | 935 DeduceStartWorkerFailureReason(status)); |
908 } | 936 } |
909 } | 937 } |
910 | 938 |
| 939 template <typename SourceInfo> |
| 940 void ServiceWorkerVersion::DispatchExtendableMessageEventInternal( |
| 941 const base::string16& message, |
| 942 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 943 const StatusCallback& callback, |
| 944 const SourceInfo& source_info) { |
| 945 if (!source_info.IsValid()) { |
| 946 RunErrorMessageCallback(sent_message_ports, callback, |
| 947 SERVICE_WORKER_ERROR_FAILED); |
| 948 return; |
| 949 } |
| 950 RunAfterStartWorker( |
| 951 base::Bind( |
| 952 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, |
| 953 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
| 954 ExtendableMessageEventSource(source_info), callback), |
| 955 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); |
| 956 } |
| 957 |
911 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( | 958 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( |
912 const base::string16& message, | 959 const base::string16& message, |
913 const std::vector<TransferredMessagePort>& sent_message_ports, | 960 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 961 const ExtendableMessageEventSource& source, |
914 const StatusCallback& callback) { | 962 const StatusCallback& callback) { |
915 int request_id = | 963 int request_id = |
916 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); | 964 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); |
917 | 965 |
918 MessagePortMessageFilter* filter = | 966 MessagePortMessageFilter* filter = |
919 embedded_worker_->message_port_message_filter(); | 967 embedded_worker_->message_port_message_filter(); |
920 std::vector<int> new_routing_ids; | 968 std::vector<int> new_routing_ids; |
921 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 969 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
922 | 970 |
923 DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>( | 971 DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>( |
924 request_id, | 972 request_id, |
925 ServiceWorkerMsg_ExtendableMessageEvent( | 973 ServiceWorkerMsg_ExtendableMessageEvent( |
926 request_id, message, sent_message_ports, new_routing_ids)); | 974 request_id, message, sent_message_ports, new_routing_ids, source)); |
927 } | 975 } |
928 | 976 |
929 void ServiceWorkerVersion::OnGetClient(int request_id, | 977 void ServiceWorkerVersion::OnGetClient(int request_id, |
930 const std::string& client_uuid) { | 978 const std::string& client_uuid) { |
931 if (!context_) | 979 if (!context_) |
932 return; | 980 return; |
933 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", | 981 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", |
934 request_id, "client_uuid", client_uuid); | 982 request_id, "client_uuid", client_uuid); |
935 ServiceWorkerProviderHost* provider_host = | 983 ServiceWorkerProviderHost* provider_host = |
936 context_->GetProviderHostByClientID(client_uuid); | 984 context_->GetProviderHostByClientID(client_uuid); |
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 void ServiceWorkerVersion::OnBeginEvent() { | 1766 void ServiceWorkerVersion::OnBeginEvent() { |
1719 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1767 if (should_exclude_from_uma_ || running_status() != RUNNING || |
1720 idle_time_.is_null()) { | 1768 idle_time_.is_null()) { |
1721 return; | 1769 return; |
1722 } | 1770 } |
1723 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1771 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1724 idle_time_); | 1772 idle_time_); |
1725 } | 1773 } |
1726 | 1774 |
1727 } // namespace content | 1775 } // namespace content |
OLD | NEW |