OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "modules/serviceworkers/WaitUntilObserver.h" | 5 #include "modules/serviceworkers/WaitUntilObserver.h" |
6 | 6 |
7 #include "bindings/core/v8/ScriptFunction.h" | 7 #include "bindings/core/v8/ScriptFunction.h" |
8 #include "bindings/core/v8/ScriptPromise.h" | 8 #include "bindings/core/v8/ScriptPromise.h" |
9 #include "bindings/core/v8/ScriptValue.h" | 9 #include "bindings/core/v8/ScriptValue.h" |
10 #include "bindings/core/v8/V8Binding.h" | 10 #include "bindings/core/v8/V8Binding.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 ResolveType m_resolveType; | 77 ResolveType m_resolveType; |
78 }; | 78 }; |
79 | 79 |
80 WaitUntilObserver* WaitUntilObserver::create(ExecutionContext* context, EventTyp
e type, int eventID) | 80 WaitUntilObserver* WaitUntilObserver::create(ExecutionContext* context, EventTyp
e type, int eventID) |
81 { | 81 { |
82 return new WaitUntilObserver(context, type, eventID); | 82 return new WaitUntilObserver(context, type, eventID); |
83 } | 83 } |
84 | 84 |
85 void WaitUntilObserver::willDispatchEvent() | 85 void WaitUntilObserver::willDispatchEvent() |
86 { | 86 { |
| 87 m_eventDispatchTime = WTF::currentTime(); |
87 // When handling a notificationclick event, we want to allow one window to | 88 // When handling a notificationclick event, we want to allow one window to |
88 // be focused or opened. These calls are allowed between the call to | 89 // be focused or opened. These calls are allowed between the call to |
89 // willDispatchEvent() and the last call to decrementPendingActivity(). If | 90 // willDispatchEvent() and the last call to decrementPendingActivity(). If |
90 // waitUntil() isn't called, that means between willDispatchEvent() and | 91 // waitUntil() isn't called, that means between willDispatchEvent() and |
91 // didDispatchEvent(). | 92 // didDispatchEvent(). |
92 if (m_type == NotificationClick) | 93 if (m_type == NotificationClick) |
93 getExecutionContext()->allowWindowInteraction(); | 94 getExecutionContext()->allowWindowInteraction(); |
94 | 95 |
95 incrementPendingActivity(); | 96 incrementPendingActivity(); |
96 } | 97 } |
(...skipping 27 matching lines...) Expand all Loading... |
124 incrementPendingActivity(); | 125 incrementPendingActivity(); |
125 scriptPromise.then( | 126 scriptPromise.then( |
126 ThenFunction::createFunction(scriptState, this, ThenFunction::Fulfilled)
, | 127 ThenFunction::createFunction(scriptState, this, ThenFunction::Fulfilled)
, |
127 ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected))
; | 128 ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected))
; |
128 } | 129 } |
129 | 130 |
130 WaitUntilObserver::WaitUntilObserver(ExecutionContext* context, EventType type,
int eventID) | 131 WaitUntilObserver::WaitUntilObserver(ExecutionContext* context, EventType type,
int eventID) |
131 : ContextLifecycleObserver(context) | 132 : ContextLifecycleObserver(context) |
132 , m_type(type) | 133 , m_type(type) |
133 , m_eventID(eventID) | 134 , m_eventID(eventID) |
134 , m_pendingActivity(0) | |
135 , m_hasError(false) | |
136 , m_eventDispatched(false) | |
137 , m_consumeWindowInteractionTimer(this, &WaitUntilObserver::consumeWindowInt
eraction) | 135 , m_consumeWindowInteractionTimer(this, &WaitUntilObserver::consumeWindowInt
eraction) |
138 { | 136 { |
139 } | 137 } |
140 | 138 |
141 void WaitUntilObserver::reportError(const ScriptValue& value) | 139 void WaitUntilObserver::reportError(const ScriptValue& value) |
142 { | 140 { |
143 // FIXME: Propagate error message to the client for onerror handling. | 141 // FIXME: Propagate error message to the client for onerror handling. |
144 NOTIMPLEMENTED(); | 142 NOTIMPLEMENTED(); |
145 | 143 |
146 m_hasError = true; | 144 m_hasError = true; |
147 } | 145 } |
148 | 146 |
149 void WaitUntilObserver::incrementPendingActivity() | 147 void WaitUntilObserver::incrementPendingActivity() |
150 { | 148 { |
151 ++m_pendingActivity; | 149 ++m_pendingActivity; |
152 } | 150 } |
153 | 151 |
154 void WaitUntilObserver::decrementPendingActivity() | 152 void WaitUntilObserver::decrementPendingActivity() |
155 { | 153 { |
156 ASSERT(m_pendingActivity > 0); | 154 ASSERT(m_pendingActivity > 0); |
157 if (!getExecutionContext() || (!m_hasError && --m_pendingActivity)) | 155 if (!getExecutionContext() || (!m_hasError && --m_pendingActivity)) |
158 return; | 156 return; |
159 | 157 |
160 ServiceWorkerGlobalScopeClient* client = ServiceWorkerGlobalScopeClient::fro
m(getExecutionContext()); | 158 ServiceWorkerGlobalScopeClient* client = ServiceWorkerGlobalScopeClient::fro
m(getExecutionContext()); |
161 WebServiceWorkerEventResult result = m_hasError ? WebServiceWorkerEventResul
tRejected : WebServiceWorkerEventResultCompleted; | 159 WebServiceWorkerEventResult result = m_hasError ? WebServiceWorkerEventResul
tRejected : WebServiceWorkerEventResultCompleted; |
162 switch (m_type) { | 160 switch (m_type) { |
163 case Activate: | 161 case Activate: |
164 client->didHandleActivateEvent(m_eventID, result); | 162 client->didHandleActivateEvent(m_eventID, result, m_eventDispatchTime); |
165 break; | 163 break; |
166 case Fetch: | 164 case Fetch: |
167 client->didHandleFetchEvent(m_eventID, result); | 165 client->didHandleFetchEvent(m_eventID, result, m_eventDispatchTime); |
168 break; | 166 break; |
169 case Install: | 167 case Install: |
170 client->didHandleInstallEvent(m_eventID, result); | 168 client->didHandleInstallEvent(m_eventID, result, m_eventDispatchTime); |
171 break; | 169 break; |
172 case Message: | 170 case Message: |
173 client->didHandleExtendableMessageEvent(m_eventID, result); | 171 client->didHandleExtendableMessageEvent(m_eventID, result, m_eventDispat
chTime); |
174 break; | 172 break; |
175 case NotificationClick: | 173 case NotificationClick: |
176 client->didHandleNotificationClickEvent(m_eventID, result); | 174 client->didHandleNotificationClickEvent(m_eventID, result, m_eventDispat
chTime); |
177 m_consumeWindowInteractionTimer.stop(); | 175 m_consumeWindowInteractionTimer.stop(); |
178 consumeWindowInteraction(nullptr); | 176 consumeWindowInteraction(nullptr); |
179 break; | 177 break; |
180 case NotificationClose: | 178 case NotificationClose: |
181 client->didHandleNotificationCloseEvent(m_eventID, result); | 179 client->didHandleNotificationCloseEvent(m_eventID, result, m_eventDispat
chTime); |
182 break; | 180 break; |
183 case Push: | 181 case Push: |
184 client->didHandlePushEvent(m_eventID, result); | 182 client->didHandlePushEvent(m_eventID, result, m_eventDispatchTime); |
185 break; | 183 break; |
186 case Sync: | 184 case Sync: |
187 client->didHandleSyncEvent(m_eventID, result); | 185 client->didHandleSyncEvent(m_eventID, result, m_eventDispatchTime); |
188 break; | 186 break; |
189 } | 187 } |
190 setContext(nullptr); | 188 setContext(nullptr); |
191 } | 189 } |
192 | 190 |
193 void WaitUntilObserver::consumeWindowInteraction(TimerBase*) | 191 void WaitUntilObserver::consumeWindowInteraction(TimerBase*) |
194 { | 192 { |
195 if (!getExecutionContext()) | 193 if (!getExecutionContext()) |
196 return; | 194 return; |
197 getExecutionContext()->consumeWindowInteraction(); | 195 getExecutionContext()->consumeWindowInteraction(); |
198 } | 196 } |
199 | 197 |
200 DEFINE_TRACE(WaitUntilObserver) | 198 DEFINE_TRACE(WaitUntilObserver) |
201 { | 199 { |
202 ContextLifecycleObserver::trace(visitor); | 200 ContextLifecycleObserver::trace(visitor); |
203 } | 201 } |
204 | 202 |
205 } // namespace blink | 203 } // namespace blink |
OLD | NEW |