Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 1647323002: Move activate event dispatching out of ServiceWorkerVersion. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor-install-event
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698