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, |
| 531 const url::Origin& source_origin, |
530 const std::vector<TransferredMessagePort>& sent_message_ports, | 532 const std::vector<TransferredMessagePort>& sent_message_ports, |
531 const StatusCallback& callback) { | 533 const StatusCallback& callback) { |
532 for (const TransferredMessagePort& port : sent_message_ports) | 534 for (const TransferredMessagePort& port : sent_message_ports) |
533 MessagePortService::GetInstance()->HoldMessages(port.id); | 535 MessagePortService::GetInstance()->HoldMessages(port.id); |
534 RunAfterStartWorker( | 536 |
535 base::Bind( | 537 switch (sender_provider_host->provider_type()) { |
536 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, | 538 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: |
537 weak_factory_.GetWeakPtr(), message, sent_message_ports, callback), | 539 case SERVICE_WORKER_PROVIDER_FOR_WORKER: |
538 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); | 540 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: |
| 541 service_worker_client_utils::GetClient( |
| 542 sender_provider_host, |
| 543 base::Bind( |
| 544 &ServiceWorkerVersion::DispatchExtendableMessageEventInternal< |
| 545 ServiceWorkerClientInfo>, |
| 546 weak_factory_.GetWeakPtr(), message, source_origin, |
| 547 sent_message_ports, callback)); |
| 548 break; |
| 549 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: |
| 550 // TODO(nhiroki): Decrement a reference to ServiceWorkerHandle if starting |
| 551 // worker fails. Handles are managed by ServiceWorkerDispatcherHost, and |
| 552 // we might need to make a new path to ask the dispatcher host to release |
| 553 // the handle from ServiceWorkerVersion (http://crbug.com/543198). |
| 554 RunSoon(base::Bind( |
| 555 &ServiceWorkerVersion::DispatchExtendableMessageEventInternal< |
| 556 ServiceWorkerObjectInfo>, |
| 557 weak_factory_.GetWeakPtr(), message, source_origin, |
| 558 sent_message_ports, callback, |
| 559 sender_provider_host->GetOrCreateServiceWorkerHandle( |
| 560 sender_provider_host->running_hosted_version()))); |
| 561 break; |
| 562 case SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME: |
| 563 case SERVICE_WORKER_PROVIDER_UNKNOWN: |
| 564 NOTREACHED() << sender_provider_host->provider_type(); |
| 565 RunSoon(base::Bind(&RunErrorMessageCallback, sent_message_ports, callback, |
| 566 SERVICE_WORKER_ERROR_FAILED)); |
| 567 break; |
| 568 } |
539 } | 569 } |
540 | 570 |
541 void ServiceWorkerVersion::DispatchMessageEvent( | 571 void ServiceWorkerVersion::DispatchMessageEvent( |
542 const base::string16& message, | 572 const base::string16& message, |
543 const std::vector<TransferredMessagePort>& sent_message_ports, | 573 const std::vector<TransferredMessagePort>& sent_message_ports, |
544 const StatusCallback& callback) { | 574 const StatusCallback& callback) { |
545 for (const TransferredMessagePort& port : sent_message_ports) { | 575 for (const TransferredMessagePort& port : sent_message_ports) { |
546 MessagePortService::GetInstance()->HoldMessages(port.id); | 576 MessagePortService::GetInstance()->HoldMessages(port.id); |
547 } | 577 } |
548 | 578 |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 | 931 |
902 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( | 932 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( |
903 ServiceWorkerStatusCode status) { | 933 ServiceWorkerStatusCode status) { |
904 if (status != SERVICE_WORKER_OK) { | 934 if (status != SERVICE_WORKER_OK) { |
905 scoped_refptr<ServiceWorkerVersion> protect(this); | 935 scoped_refptr<ServiceWorkerVersion> protect(this); |
906 RunCallbacks(this, &start_callbacks_, | 936 RunCallbacks(this, &start_callbacks_, |
907 DeduceStartWorkerFailureReason(status)); | 937 DeduceStartWorkerFailureReason(status)); |
908 } | 938 } |
909 } | 939 } |
910 | 940 |
| 941 template <typename SourceInfo> |
| 942 void ServiceWorkerVersion::DispatchExtendableMessageEventInternal( |
| 943 const base::string16& message, |
| 944 const url::Origin& source_origin, |
| 945 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 946 const StatusCallback& callback, |
| 947 const SourceInfo& source_info) { |
| 948 if (!source_info.IsValid()) { |
| 949 RunErrorMessageCallback(sent_message_ports, callback, |
| 950 SERVICE_WORKER_ERROR_FAILED); |
| 951 return; |
| 952 } |
| 953 RunAfterStartWorker( |
| 954 base::Bind( |
| 955 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, |
| 956 weak_factory_.GetWeakPtr(), message, source_origin, |
| 957 sent_message_ports, ExtendableMessageEventSource(source_info), |
| 958 callback), |
| 959 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); |
| 960 } |
| 961 |
911 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( | 962 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( |
912 const base::string16& message, | 963 const base::string16& message, |
| 964 const url::Origin& source_origin, |
913 const std::vector<TransferredMessagePort>& sent_message_ports, | 965 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 966 const ExtendableMessageEventSource& source, |
914 const StatusCallback& callback) { | 967 const StatusCallback& callback) { |
915 int request_id = | 968 int request_id = |
916 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); | 969 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); |
917 | 970 |
918 MessagePortMessageFilter* filter = | 971 MessagePortMessageFilter* filter = |
919 embedded_worker_->message_port_message_filter(); | 972 embedded_worker_->message_port_message_filter(); |
920 std::vector<int> new_routing_ids; | 973 std::vector<int> new_routing_ids; |
921 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 974 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
922 | 975 |
| 976 ServiceWorkerMsg_ExtendableMessageEvent_Params params; |
| 977 params.message = message; |
| 978 params.source_origin = source_origin; |
| 979 params.message_ports = sent_message_ports; |
| 980 params.new_routing_ids = new_routing_ids; |
| 981 params.source = source; |
| 982 |
| 983 // Hide the client url if the client has a unique origin. |
| 984 if (source_origin.unique()) { |
| 985 if (params.source.client_info.IsValid()) |
| 986 params.source.client_info.url = GURL(); |
| 987 else |
| 988 params.source.service_worker_info.url = GURL(); |
| 989 } |
| 990 |
923 DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>( | 991 DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>( |
924 request_id, | 992 request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params)); |
925 ServiceWorkerMsg_ExtendableMessageEvent( | |
926 request_id, message, sent_message_ports, new_routing_ids)); | |
927 } | 993 } |
928 | 994 |
929 void ServiceWorkerVersion::OnGetClient(int request_id, | 995 void ServiceWorkerVersion::OnGetClient(int request_id, |
930 const std::string& client_uuid) { | 996 const std::string& client_uuid) { |
931 if (!context_) | 997 if (!context_) |
932 return; | 998 return; |
933 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", | 999 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", |
934 request_id, "client_uuid", client_uuid); | 1000 request_id, "client_uuid", client_uuid); |
935 ServiceWorkerProviderHost* provider_host = | 1001 ServiceWorkerProviderHost* provider_host = |
936 context_->GetProviderHostByClientID(client_uuid); | 1002 context_->GetProviderHostByClientID(client_uuid); |
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1724 void ServiceWorkerVersion::OnBeginEvent() { | 1790 void ServiceWorkerVersion::OnBeginEvent() { |
1725 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1791 if (should_exclude_from_uma_ || running_status() != RUNNING || |
1726 idle_time_.is_null()) { | 1792 idle_time_.is_null()) { |
1727 return; | 1793 return; |
1728 } | 1794 } |
1729 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1795 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1730 idle_time_); | 1796 idle_time_); |
1731 } | 1797 } |
1732 | 1798 |
1733 } // namespace content | 1799 } // namespace content |
OLD | NEW |