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