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 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 MessagePortMessageFilter* filter = | 575 MessagePortMessageFilter* filter = |
576 embedded_worker_->message_port_message_filter(); | 576 embedded_worker_->message_port_message_filter(); |
577 std::vector<int> new_routing_ids; | 577 std::vector<int> new_routing_ids; |
578 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 578 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
579 ServiceWorkerStatusCode status = | 579 ServiceWorkerStatusCode status = |
580 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( | 580 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( |
581 message, sent_message_ports, new_routing_ids)); | 581 message, sent_message_ports, new_routing_ids)); |
582 RunSoon(base::Bind(callback, status)); | 582 RunSoon(base::Bind(callback, status)); |
583 } | 583 } |
584 | 584 |
585 void ServiceWorkerVersion::DispatchActivateEvent( | |
586 const StatusCallback& callback) { | |
587 OnBeginEvent(); | |
588 DCHECK_EQ(ACTIVATING, status()) << status(); | |
589 | |
590 if (running_status() != RUNNING) { | |
591 // Schedule calling this method after starting the worker. | |
592 StartWorker( | |
593 base::Bind(&RunTaskAfterStartWorker, | |
594 weak_factory_.GetWeakPtr(), | |
595 callback, | |
596 base::Bind(&self::DispatchActivateEventAfterStartWorker, | |
597 weak_factory_.GetWeakPtr(), | |
598 callback))); | |
599 } else { | |
600 DispatchActivateEventAfterStartWorker(callback); | |
601 } | |
602 } | |
603 | |
604 void ServiceWorkerVersion::DispatchFetchEvent( | 585 void ServiceWorkerVersion::DispatchFetchEvent( |
605 const ServiceWorkerFetchRequest& request, | 586 const ServiceWorkerFetchRequest& request, |
606 const base::Closure& prepare_callback, | 587 const base::Closure& prepare_callback, |
607 const FetchCallback& fetch_callback) { | 588 const FetchCallback& fetch_callback) { |
608 OnBeginEvent(); | 589 OnBeginEvent(); |
609 DCHECK_EQ(ACTIVATED, status()) << status(); | 590 DCHECK_EQ(ACTIVATED, status()) << status(); |
610 | 591 |
611 if (running_status() != RUNNING) { | 592 if (running_status() != RUNNING) { |
612 // Schedule calling this method after starting the worker. | 593 // Schedule calling this method after starting the worker. |
613 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 594 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
931 message, | 912 message, |
932 line_number, | 913 line_number, |
933 source_url)); | 914 source_url)); |
934 } | 915 } |
935 | 916 |
936 bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { | 917 bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
937 bool handled = true; | 918 bool handled = true; |
938 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerVersion, message) | 919 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerVersion, message) |
939 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients, | 920 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients, |
940 OnGetClients) | 921 OnGetClients) |
941 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, | |
942 OnActivateEventFinished) | |
943 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 922 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
944 OnFetchEventFinished) | 923 OnFetchEventFinished) |
945 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, | 924 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, |
946 OnOpenWindow) | 925 OnOpenWindow) |
947 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, | 926 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, |
948 OnSetCachedMetadata) | 927 OnSetCachedMetadata) |
949 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, | 928 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, |
950 OnClearCachedMetadata) | 929 OnClearCachedMetadata) |
951 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, | 930 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, |
952 OnPostMessageToClient) | 931 OnPostMessageToClient) |
(...skipping 14 matching lines...) Expand all Loading... |
967 | 946 |
968 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( | 947 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( |
969 ServiceWorkerStatusCode status) { | 948 ServiceWorkerStatusCode status) { |
970 if (status != SERVICE_WORKER_OK) { | 949 if (status != SERVICE_WORKER_OK) { |
971 scoped_refptr<ServiceWorkerVersion> protect(this); | 950 scoped_refptr<ServiceWorkerVersion> protect(this); |
972 RunCallbacks(this, &start_callbacks_, | 951 RunCallbacks(this, &start_callbacks_, |
973 DeduceStartWorkerFailureReason(status)); | 952 DeduceStartWorkerFailureReason(status)); |
974 } | 953 } |
975 } | 954 } |
976 | 955 |
977 void ServiceWorkerVersion::DispatchActivateEventAfterStartWorker( | |
978 const StatusCallback& callback) { | |
979 DCHECK_EQ(RUNNING, running_status()) | |
980 << "Worker stopped too soon after it was started."; | |
981 | |
982 int request_id = AddRequest(callback, &activate_requests_, REQUEST_ACTIVATE, | |
983 ServiceWorkerMetrics::EventType::ACTIVATE); | |
984 ServiceWorkerStatusCode status = | |
985 embedded_worker_->SendMessage(ServiceWorkerMsg_ActivateEvent(request_id)); | |
986 if (status != SERVICE_WORKER_OK) { | |
987 activate_requests_.Remove(request_id); | |
988 RunSoon(base::Bind(callback, status)); | |
989 } | |
990 } | |
991 | |
992 void ServiceWorkerVersion::OnGetClients( | 956 void ServiceWorkerVersion::OnGetClients( |
993 int request_id, | 957 int request_id, |
994 const ServiceWorkerClientQueryOptions& options) { | 958 const ServiceWorkerClientQueryOptions& options) { |
995 TRACE_EVENT_ASYNC_BEGIN2( | 959 TRACE_EVENT_ASYNC_BEGIN2( |
996 "ServiceWorker", "ServiceWorkerVersion::OnGetClients", request_id, | 960 "ServiceWorker", "ServiceWorkerVersion::OnGetClients", request_id, |
997 "client_type", options.client_type, "include_uncontrolled", | 961 "client_type", options.client_type, "include_uncontrolled", |
998 options.include_uncontrolled); | 962 options.include_uncontrolled); |
999 service_worker_client_utils::GetClients( | 963 service_worker_client_utils::GetClients( |
1000 weak_factory_.GetWeakPtr(), options, | 964 weak_factory_.GetWeakPtr(), options, |
1001 base::Bind(&ServiceWorkerVersion::OnGetClientsFinished, | 965 base::Bind(&ServiceWorkerVersion::OnGetClientsFinished, |
1002 weak_factory_.GetWeakPtr(), request_id)); | 966 weak_factory_.GetWeakPtr(), request_id)); |
1003 } | 967 } |
1004 | 968 |
1005 void ServiceWorkerVersion::OnGetClientsFinished(int request_id, | 969 void ServiceWorkerVersion::OnGetClientsFinished(int request_id, |
1006 ServiceWorkerClients* clients) { | 970 ServiceWorkerClients* clients) { |
1007 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 971 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
1008 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::OnGetClients", | 972 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::OnGetClients", |
1009 request_id, "The number of clients", clients->size()); | 973 request_id, "The number of clients", clients->size()); |
1010 | 974 |
1011 // When Clients.matchAll() is called on the script evaluation phase, the | 975 // When Clients.matchAll() is called on the script evaluation phase, the |
1012 // running status can be STARTING here. | 976 // running status can be STARTING here. |
1013 if (running_status() != STARTING && running_status() != RUNNING) | 977 if (running_status() != STARTING && running_status() != RUNNING) |
1014 return; | 978 return; |
1015 | 979 |
1016 embedded_worker_->SendMessage( | 980 embedded_worker_->SendMessage( |
1017 ServiceWorkerMsg_DidGetClients(request_id, *clients)); | 981 ServiceWorkerMsg_DidGetClients(request_id, *clients)); |
1018 } | 982 } |
1019 | 983 |
1020 void ServiceWorkerVersion::OnActivateEventFinished( | |
1021 int request_id, | |
1022 blink::WebServiceWorkerEventResult result) { | |
1023 DCHECK(ACTIVATING == status() || | |
1024 REDUNDANT == status()) << status(); | |
1025 TRACE_EVENT0("ServiceWorker", | |
1026 "ServiceWorkerVersion::OnActivateEventFinished"); | |
1027 | |
1028 PendingRequest<StatusCallback>* request = | |
1029 activate_requests_.Lookup(request_id); | |
1030 if (!request) { | |
1031 NOTREACHED() << "Got unexpected message: " << request_id; | |
1032 return; | |
1033 } | |
1034 ServiceWorkerStatusCode rv = SERVICE_WORKER_OK; | |
1035 if (result == blink::WebServiceWorkerEventResultRejected) | |
1036 rv = SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED; | |
1037 | |
1038 ServiceWorkerMetrics::RecordEventDuration( | |
1039 request->event_type, base::TimeTicks::Now() - request->start_time); | |
1040 | |
1041 scoped_refptr<ServiceWorkerVersion> protect(this); | |
1042 request->callback.Run(rv); | |
1043 RemoveCallbackAndStopIfRedundant(&activate_requests_, request_id); | |
1044 } | |
1045 | |
1046 void ServiceWorkerVersion::OnFetchEventFinished( | 984 void ServiceWorkerVersion::OnFetchEventFinished( |
1047 int request_id, | 985 int request_id, |
1048 ServiceWorkerFetchEventResult result, | 986 ServiceWorkerFetchEventResult result, |
1049 const ServiceWorkerResponse& response) { | 987 const ServiceWorkerResponse& response) { |
1050 TRACE_EVENT1("ServiceWorker", | 988 TRACE_EVENT1("ServiceWorker", |
1051 "ServiceWorkerVersion::OnFetchEventFinished", | 989 "ServiceWorkerVersion::OnFetchEventFinished", |
1052 "Request id", request_id); | 990 "Request id", request_id); |
1053 PendingRequest<FetchCallback>* request = fetch_requests_.Lookup(request_id); | 991 PendingRequest<FetchCallback>* request = fetch_requests_.Lookup(request_id); |
1054 if (!request) { | 992 if (!request) { |
1055 NOTREACHED() << "Got unexpected message: " << request_id; | 993 NOTREACHED() << "Got unexpected message: " << request_id; |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1611 return; | 1549 return; |
1612 if (running_status() == STOPPED || running_status() == STOPPING || | 1550 if (running_status() == STOPPED || running_status() == STOPPING || |
1613 !stop_callbacks_.empty()) { | 1551 !stop_callbacks_.empty()) { |
1614 return; | 1552 return; |
1615 } | 1553 } |
1616 | 1554 |
1617 embedded_worker_->StopIfIdle(); | 1555 embedded_worker_->StopIfIdle(); |
1618 } | 1556 } |
1619 | 1557 |
1620 bool ServiceWorkerVersion::HasInflightRequests() const { | 1558 bool ServiceWorkerVersion::HasInflightRequests() const { |
1621 return !activate_requests_.IsEmpty() || !fetch_requests_.IsEmpty() || | 1559 return !fetch_requests_.IsEmpty() || !custom_requests_.IsEmpty() || |
1622 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); | 1560 !streaming_url_request_jobs_.empty(); |
1623 } | 1561 } |
1624 | 1562 |
1625 void ServiceWorkerVersion::RecordStartWorkerResult( | 1563 void ServiceWorkerVersion::RecordStartWorkerResult( |
1626 ServiceWorkerStatusCode status) { | 1564 ServiceWorkerStatusCode status) { |
1627 base::TimeTicks start_time = start_time_; | 1565 base::TimeTicks start_time = start_time_; |
1628 ClearTick(&start_time_); | 1566 ClearTick(&start_time_); |
1629 | 1567 |
1630 if (context_) | 1568 if (context_) |
1631 context_->UpdateVersionFailureCount(version_id_, status); | 1569 context_->UpdateVersionFailureCount(version_id_, status); |
1632 | 1570 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1707 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", | 1645 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", |
1708 request, "Request id", request_id, "Event type", | 1646 request, "Request id", request_id, "Event type", |
1709 ServiceWorkerMetrics::EventTypeToString(event_type)); | 1647 ServiceWorkerMetrics::EventTypeToString(event_type)); |
1710 requests_.push(RequestInfo(request_id, request_type, event_type, expiration, | 1648 requests_.push(RequestInfo(request_id, request_type, event_type, expiration, |
1711 timeout_behavior)); | 1649 timeout_behavior)); |
1712 return request_id; | 1650 return request_id; |
1713 } | 1651 } |
1714 | 1652 |
1715 bool ServiceWorkerVersion::MaybeTimeOutRequest(const RequestInfo& info) { | 1653 bool ServiceWorkerVersion::MaybeTimeOutRequest(const RequestInfo& info) { |
1716 switch (info.type) { | 1654 switch (info.type) { |
1717 case REQUEST_ACTIVATE: | |
1718 return RunIDMapCallback(&activate_requests_, info.id, | |
1719 SERVICE_WORKER_ERROR_TIMEOUT); | |
1720 case REQUEST_FETCH: | 1655 case REQUEST_FETCH: |
1721 return RunIDMapCallback( | 1656 return RunIDMapCallback( |
1722 &fetch_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, | 1657 &fetch_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, |
1723 /* The other args are ignored for non-OK status. */ | 1658 /* The other args are ignored for non-OK status. */ |
1724 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); | 1659 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); |
1725 case REQUEST_CUSTOM: | 1660 case REQUEST_CUSTOM: |
1726 return RunIDMapCallback(&custom_requests_, info.id, | 1661 return RunIDMapCallback(&custom_requests_, info.id, |
1727 SERVICE_WORKER_ERROR_TIMEOUT); | 1662 SERVICE_WORKER_ERROR_TIMEOUT); |
1728 case NUM_REQUEST_TYPES: | 1663 case NUM_REQUEST_TYPES: |
1729 break; | 1664 break; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1826 if (!should_restart) { | 1761 if (!should_restart) { |
1827 // Let all start callbacks fail. | 1762 // Let all start callbacks fail. |
1828 RunCallbacks(this, &start_callbacks_, | 1763 RunCallbacks(this, &start_callbacks_, |
1829 DeduceStartWorkerFailureReason( | 1764 DeduceStartWorkerFailureReason( |
1830 SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | 1765 SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
1831 } | 1766 } |
1832 | 1767 |
1833 // Let all message callbacks fail (this will also fire and clear all | 1768 // Let all message callbacks fail (this will also fire and clear all |
1834 // callbacks for events). | 1769 // callbacks for events). |
1835 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. | 1770 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. |
1836 RunIDMapCallbacks(&activate_requests_, | |
1837 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); | |
1838 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, | 1771 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, |
1839 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 1772 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
1840 ServiceWorkerResponse()); | 1773 ServiceWorkerResponse()); |
1841 RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED); | 1774 RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED); |
1842 | 1775 |
1843 // Close all mojo services. This will also fire and clear all callbacks | 1776 // Close all mojo services. This will also fire and clear all callbacks |
1844 // for messages that are still outstanding for those services. | 1777 // for messages that are still outstanding for those services. |
1845 mojo_services_.clear(); | 1778 mojo_services_.clear(); |
1846 | 1779 |
1847 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1780 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
(...skipping 14 matching lines...) Expand all Loading... |
1862 void ServiceWorkerVersion::OnBeginEvent() { | 1795 void ServiceWorkerVersion::OnBeginEvent() { |
1863 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1796 if (should_exclude_from_uma_ || running_status() != RUNNING || |
1864 idle_time_.is_null()) { | 1797 idle_time_.is_null()) { |
1865 return; | 1798 return; |
1866 } | 1799 } |
1867 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1800 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1868 idle_time_); | 1801 idle_time_); |
1869 } | 1802 } |
1870 | 1803 |
1871 } // namespace content | 1804 } // namespace content |
OLD | NEW |