| 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 |