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

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

Issue 717353004: ServiceWorker: Add support for .skipWaiting and controllerchange event(2/3) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: do not replace other registerations Created 6 years, 1 month 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 "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/strings/string16.h" 9 #include "base/strings/string16.h"
10 #include "content/browser/service_worker/embedded_worker_instance.h" 10 #include "content/browser/service_worker/embedded_worker_instance.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 const GURL& script_url, 94 const GURL& script_url,
95 int64 version_id, 95 int64 version_id,
96 base::WeakPtr<ServiceWorkerContextCore> context) 96 base::WeakPtr<ServiceWorkerContextCore> context)
97 : version_id_(version_id), 97 : version_id_(version_id),
98 registration_id_(kInvalidServiceWorkerVersionId), 98 registration_id_(kInvalidServiceWorkerVersionId),
99 script_url_(script_url), 99 script_url_(script_url),
100 status_(NEW), 100 status_(NEW),
101 context_(context), 101 context_(context),
102 script_cache_map_(this, context), 102 script_cache_map_(this, context),
103 is_doomed_(false), 103 is_doomed_(false),
104 skip_waiting_(false),
104 weak_factory_(this) { 105 weak_factory_(this) {
105 DCHECK(context_); 106 DCHECK(context_);
106 DCHECK(registration); 107 DCHECK(registration);
107 if (registration) { 108 if (registration) {
108 registration_id_ = registration->id(); 109 registration_id_ = registration->id();
109 scope_ = registration->pattern(); 110 scope_ = registration->pattern();
110 } 111 }
111 context_->AddLiveVersion(this); 112 context_->AddLiveVersion(this);
112 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); 113 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker();
113 embedded_worker_->AddListener(this); 114 embedded_worker_->AddListener(this);
114 } 115 }
115 116
116 ServiceWorkerVersion::~ServiceWorkerVersion() { 117 ServiceWorkerVersion::~ServiceWorkerVersion() {
117 embedded_worker_->RemoveListener(this); 118 embedded_worker_->RemoveListener(this);
118 if (context_) 119 if (context_)
119 context_->RemoveLiveVersion(version_id_); 120 context_->RemoveLiveVersion(version_id_);
120 // EmbeddedWorker's dtor sends StopWorker if it's still running. 121 // EmbeddedWorker's dtor sends StopWorker if it's still running.
121 } 122 }
122 123
123 void ServiceWorkerVersion::SetStatus(Status status) { 124 void ServiceWorkerVersion::SetStatus(Status status) {
124 if (status_ == status) 125 if (status_ == status)
125 return; 126 return;
126 127
127 // Schedule to stop worker after registration successfully completed. 128 // Schedule to stop worker after registration successfully completed.
128 if (status_ == ACTIVATING && status == ACTIVATED && !HasControllee()) 129 if (status_ == ACTIVATING && status == ACTIVATED && !HasControllee())
129 ScheduleStopWorker(); 130 ScheduleStopWorker();
130 131
131 status_ = status; 132 status_ = status;
132 133
134 if (skip_waiting_ && status_ == ACTIVATED) {
135 for (int request_id : pending_skip_waiting_requests_)
136 DidSkipWaiting(request_id);
137 pending_skip_waiting_requests_.clear();
138 }
139
133 std::vector<base::Closure> callbacks; 140 std::vector<base::Closure> callbacks;
134 callbacks.swap(status_change_callbacks_); 141 callbacks.swap(status_change_callbacks_);
135 for (std::vector<base::Closure>::const_iterator i = callbacks.begin(); 142 for (std::vector<base::Closure>::const_iterator i = callbacks.begin();
136 i != callbacks.end(); ++i) { 143 i != callbacks.end(); ++i) {
137 (*i).Run(); 144 (*i).Run();
138 } 145 }
139 146
140 FOR_EACH_OBSERVER(Listener, listeners_, OnVersionStateChanged(this)); 147 FOR_EACH_OBSERVER(Listener, listeners_, OnVersionStateChanged(this));
141 } 148 }
142 149
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, 551 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished,
545 OnFetchEventFinished) 552 OnFetchEventFinished)
546 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, 553 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished,
547 OnSyncEventFinished) 554 OnSyncEventFinished)
548 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, 555 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished,
549 OnPushEventFinished) 556 OnPushEventFinished)
550 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, 557 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished,
551 OnGeofencingEventFinished) 558 OnGeofencingEventFinished)
552 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, 559 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument,
553 OnPostMessageToDocument) 560 OnPostMessageToDocument)
561 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, OnSkipWaiting)
554 IPC_MESSAGE_UNHANDLED(handled = false) 562 IPC_MESSAGE_UNHANDLED(handled = false)
555 IPC_END_MESSAGE_MAP() 563 IPC_END_MESSAGE_MAP()
556 return handled; 564 return handled;
557 } 565 }
558 566
559 void ServiceWorkerVersion::OnStartMessageSent( 567 void ServiceWorkerVersion::OnStartMessageSent(
560 ServiceWorkerStatusCode status) { 568 ServiceWorkerStatusCode status) {
561 if (status != SERVICE_WORKER_OK) 569 if (status != SERVICE_WORKER_OK)
562 RunCallbacks(this, &start_callbacks_, status); 570 RunCallbacks(this, &start_callbacks_, status);
563 } 571 }
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 "Client id", client_id); 735 "Client id", client_id);
728 ServiceWorkerProviderHost* provider_host = 736 ServiceWorkerProviderHost* provider_host =
729 controllee_by_id_.Lookup(client_id); 737 controllee_by_id_.Lookup(client_id);
730 if (!provider_host) { 738 if (!provider_host) {
731 // The client may already have been closed, just ignore. 739 // The client may already have been closed, just ignore.
732 return; 740 return;
733 } 741 }
734 provider_host->PostMessage(message, sent_message_port_ids); 742 provider_host->PostMessage(message, sent_message_port_ids);
735 } 743 }
736 744
745 void ServiceWorkerVersion::OnSkipWaiting(int request_id) {
746 skip_waiting_ = true;
747 if (status_ != INSTALLED)
748 return DidSkipWaiting(request_id);
749
750 if (!context_)
751 return;
752 ServiceWorkerRegistration* registration =
753 context_->GetLiveRegistration(registration_id_);
754 if (!registration)
755 return;
756 if (pending_skip_waiting_requests_.empty())
757 registration->ActivateWaitingVersionWhenReady();
falken 2014/11/19 04:19:56 this seems to depend on the activation to happen a
xiang 2014/11/24 07:04:01 Done.
758 pending_skip_waiting_requests_.push_back(request_id);
759 }
760
761 void ServiceWorkerVersion::DidSkipWaiting(int request_id) {
762 if (running_status() == STARTING || running_status() == RUNNING)
763 embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id));
764 }
765
737 void ServiceWorkerVersion::ScheduleStopWorker() { 766 void ServiceWorkerVersion::ScheduleStopWorker() {
738 if (running_status() != RUNNING) 767 if (running_status() != RUNNING)
739 return; 768 return;
740 if (stop_worker_timer_.IsRunning()) { 769 if (stop_worker_timer_.IsRunning()) {
741 stop_worker_timer_.Reset(); 770 stop_worker_timer_.Reset();
742 return; 771 return;
743 } 772 }
744 stop_worker_timer_.Start( 773 stop_worker_timer_.Start(
745 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay), 774 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay),
746 base::Bind(&ServiceWorkerVersion::StopWorker, 775 base::Bind(&ServiceWorkerVersion::StopWorker,
747 weak_factory_.GetWeakPtr(), 776 weak_factory_.GetWeakPtr(),
748 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback))); 777 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)));
749 } 778 }
750 779
751 void ServiceWorkerVersion::DoomInternal() { 780 void ServiceWorkerVersion::DoomInternal() {
752 DCHECK(!HasControllee()); 781 DCHECK(!HasControllee());
753 SetStatus(REDUNDANT); 782 SetStatus(REDUNDANT);
754 StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 783 StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
755 if (!context_) 784 if (!context_)
756 return; 785 return;
757 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; 786 std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
758 script_cache_map_.GetResources(&resources); 787 script_cache_map_.GetResources(&resources);
759 context_->storage()->PurgeResources(resources); 788 context_->storage()->PurgeResources(resources);
760 } 789 }
761 790
762 } // namespace content 791 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698