OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 return notification; | 130 return notification; |
131 } | 131 } |
132 | 132 |
133 Notification::Notification(ExecutionContext* context, | 133 Notification::Notification(ExecutionContext* context, |
134 Type type, | 134 Type type, |
135 const WebNotificationData& data) | 135 const WebNotificationData& data) |
136 : ActiveScriptWrappable(this), | 136 : ActiveScriptWrappable(this), |
137 ActiveDOMObject(context), | 137 ActiveDOMObject(context), |
138 m_type(type), | 138 m_type(type), |
139 m_state(State::Loading), | 139 m_state(State::Loading), |
140 m_data(data) { | 140 m_data(data), |
| 141 m_requestedClose(false) { |
141 DCHECK(notificationManager()); | 142 DCHECK(notificationManager()); |
142 } | 143 } |
143 | 144 |
144 Notification::~Notification() {} | 145 Notification::~Notification() {} |
145 | 146 |
146 void Notification::schedulePrepareShow() { | 147 void Notification::schedulePrepareShow() { |
147 DCHECK_EQ(m_state, State::Loading); | 148 DCHECK_EQ(m_state, State::Loading); |
148 DCHECK(!m_prepareShowMethodRunner); | 149 DCHECK(!m_prepareShowMethodRunner); |
149 | 150 |
150 m_prepareShowMethodRunner = | 151 m_prepareShowMethodRunner = |
151 AsyncMethodRunner<Notification>::create(this, &Notification::prepareShow); | 152 AsyncMethodRunner<Notification>::create(this, &Notification::prepareShow); |
152 m_prepareShowMethodRunner->runAsync(); | 153 m_prepareShowMethodRunner->runAsync(); |
153 } | 154 } |
154 | 155 |
155 void Notification::prepareShow() { | 156 void Notification::prepareShow() { |
156 DCHECK_EQ(m_state, State::Loading); | 157 DCHECK_EQ(m_state, State::Loading); |
157 if (NotificationManager::from(getExecutionContext())->permissionStatus() != | 158 if (NotificationManager::from(getExecutionContext())->permissionStatus() != |
158 mojom::blink::PermissionStatus::GRANTED) { | 159 mojom::blink::PermissionStatus::GRANTED) { |
159 dispatchErrorEvent(); | 160 dispatchEvent(Event::create(EventTypeNames::error)); |
160 return; | 161 return; |
161 } | 162 } |
162 | 163 |
163 m_loader = new NotificationResourcesLoader( | 164 m_loader = new NotificationResourcesLoader( |
164 WTF::bind(&Notification::didLoadResources, wrapWeakPersistent(this))); | 165 WTF::bind(&Notification::didLoadResources, wrapWeakPersistent(this))); |
165 m_loader->start(getExecutionContext(), m_data); | 166 m_loader->start(getExecutionContext(), m_data); |
166 } | 167 } |
167 | 168 |
168 void Notification::didLoadResources(NotificationResourcesLoader* loader) { | 169 void Notification::didLoadResources(NotificationResourcesLoader* loader) { |
169 DCHECK_EQ(loader, m_loader.get()); | 170 DCHECK_EQ(loader, m_loader.get()); |
170 | 171 |
171 SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); | 172 SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); |
172 DCHECK(origin); | 173 DCHECK(origin); |
173 | 174 |
174 notificationManager()->show(WebSecurityOrigin(origin), m_data, | 175 notificationManager()->show(WebSecurityOrigin(origin), m_data, |
175 loader->getResources(), this); | 176 loader->getResources(), this); |
176 m_loader.clear(); | 177 m_loader.clear(); |
177 | 178 |
178 m_state = State::Showing; | 179 m_state = State::Showing; |
179 } | 180 } |
180 | 181 |
181 void Notification::close() { | 182 void Notification::close() { |
182 if (m_state != State::Showing) | 183 if (m_state != State::Showing) { |
| 184 // TODO(peter): Abort the load instead of closing the notification after it'
s completed. |
| 185 if (m_state == State::Loading || m_notificationId.isEmpty()) |
| 186 m_requestedClose = true; |
| 187 |
183 return; | 188 return; |
| 189 } |
184 | 190 |
185 // Schedule the "close" event to be fired for non-persistent notifications. | 191 // Schedule the "close" event to be fired for non-persistent notifications. |
186 // Persistent notifications won't get such events for programmatic closes. | 192 // Persistent notifications won't get such events for programmatic closes. |
187 if (m_type == Type::NonPersistent) { | 193 if (m_type == Type::NonPersistent) { |
188 getExecutionContext()->postTask( | 194 getExecutionContext()->postTask( |
189 BLINK_FROM_HERE, createSameThreadTask(&Notification::dispatchCloseEvent, | 195 BLINK_FROM_HERE, |
190 wrapPersistent(this))); | 196 createSameThreadTask(&Notification::didCloseNotification, |
| 197 wrapPersistent(this))); |
191 m_state = State::Closing; | 198 m_state = State::Closing; |
192 | 199 } else { |
193 notificationManager()->close(this); | 200 m_state = State::Closed; |
194 return; | |
195 } | 201 } |
196 | 202 |
197 m_state = State::Closed; | |
198 | |
199 SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); | 203 SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); |
200 DCHECK(origin); | 204 DCHECK(origin); |
201 | 205 |
202 notificationManager()->closePersistent(WebSecurityOrigin(origin), m_data.tag, | 206 notificationManager()->close(WebSecurityOrigin(origin), m_data.tag, |
203 m_notificationId); | 207 m_notificationId); |
204 } | 208 } |
205 | 209 |
206 void Notification::dispatchShowEvent() { | 210 void Notification::didShowNotification(const WebString& notificationId) { |
| 211 DCHECK(m_notificationId.isEmpty()); |
| 212 m_notificationId = notificationId; |
| 213 |
207 dispatchEvent(Event::create(EventTypeNames::show)); | 214 dispatchEvent(Event::create(EventTypeNames::show)); |
| 215 |
| 216 if (m_requestedClose) |
| 217 close(); |
208 } | 218 } |
209 | 219 |
210 void Notification::dispatchClickEvent() { | 220 void Notification::didClickNotification() { |
211 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); | 221 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); |
212 ScopedWindowFocusAllowedIndicator windowFocusAllowed(getExecutionContext()); | 222 ScopedWindowFocusAllowedIndicator windowFocusAllowed(getExecutionContext()); |
213 dispatchEvent(Event::create(EventTypeNames::click)); | 223 dispatchEvent(Event::create(EventTypeNames::click)); |
214 } | 224 } |
215 | 225 |
216 void Notification::dispatchErrorEvent() { | 226 void Notification::didCloseNotification() { |
217 dispatchEvent(Event::create(EventTypeNames::error)); | |
218 } | |
219 | |
220 void Notification::dispatchCloseEvent() { | |
221 // The notification will be showing when the user initiated the close, or it w
ill be | 227 // The notification will be showing when the user initiated the close, or it w
ill be |
222 // closing if the developer initiated the close. | 228 // closing if the developer initiated the close. |
223 if (m_state != State::Showing && m_state != State::Closing) | 229 if (m_state != State::Showing && m_state != State::Closing) |
224 return; | 230 return; |
225 | 231 |
226 m_state = State::Closed; | 232 m_state = State::Closed; |
227 dispatchEvent(Event::create(EventTypeNames::close)); | 233 dispatchEvent(Event::create(EventTypeNames::close)); |
228 } | 234 } |
229 | 235 |
230 String Notification::title() const { | 236 String Notification::title() const { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 } | 402 } |
397 | 403 |
398 DEFINE_TRACE(Notification) { | 404 DEFINE_TRACE(Notification) { |
399 visitor->trace(m_prepareShowMethodRunner); | 405 visitor->trace(m_prepareShowMethodRunner); |
400 visitor->trace(m_loader); | 406 visitor->trace(m_loader); |
401 EventTargetWithInlineData::trace(visitor); | 407 EventTargetWithInlineData::trace(visitor); |
402 ActiveDOMObject::trace(visitor); | 408 ActiveDOMObject::trace(visitor); |
403 } | 409 } |
404 | 410 |
405 } // namespace blink | 411 } // namespace blink |
OLD | NEW |