| 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 |
| 185 // it's completed. |
| 186 if (m_state == State::Loading || m_notificationId.isEmpty()) |
| 187 m_requestedClose = true; |
| 188 |
| 183 return; | 189 return; |
| 190 } |
| 184 | 191 |
| 185 // Schedule the "close" event to be fired for non-persistent notifications. | 192 // Schedule the "close" event to be fired for non-persistent notifications. |
| 186 // Persistent notifications won't get such events for programmatic closes. | 193 // Persistent notifications won't get such events for programmatic closes. |
| 187 if (m_type == Type::NonPersistent) { | 194 if (m_type == Type::NonPersistent) { |
| 188 getExecutionContext()->postTask( | 195 getExecutionContext()->postTask( |
| 189 BLINK_FROM_HERE, createSameThreadTask(&Notification::dispatchCloseEvent, | 196 BLINK_FROM_HERE, |
| 190 wrapPersistent(this))); | 197 createSameThreadTask(&Notification::didCloseNotification, |
| 198 wrapPersistent(this))); |
| 191 m_state = State::Closing; | 199 m_state = State::Closing; |
| 192 | 200 } else { |
| 193 notificationManager()->close(this); | 201 m_state = State::Closed; |
| 194 return; | |
| 195 } | 202 } |
| 196 | 203 |
| 197 m_state = State::Closed; | |
| 198 | |
| 199 SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); | 204 SecurityOrigin* origin = getExecutionContext()->getSecurityOrigin(); |
| 200 DCHECK(origin); | 205 DCHECK(origin); |
| 201 | 206 |
| 202 notificationManager()->closePersistent(WebSecurityOrigin(origin), m_data.tag, | 207 notificationManager()->close(WebSecurityOrigin(origin), m_data.tag, |
| 203 m_notificationId); | 208 m_notificationId); |
| 204 } | 209 } |
| 205 | 210 |
| 206 void Notification::dispatchShowEvent() { | 211 void Notification::didShowNotification(const WebString& notificationId) { |
| 212 DCHECK(m_notificationId.isEmpty()); |
| 213 m_notificationId = notificationId; |
| 214 |
| 207 dispatchEvent(Event::create(EventTypeNames::show)); | 215 dispatchEvent(Event::create(EventTypeNames::show)); |
| 216 |
| 217 if (m_requestedClose) |
| 218 close(); |
| 208 } | 219 } |
| 209 | 220 |
| 210 void Notification::dispatchClickEvent() { | 221 void Notification::didClickNotification() { |
| 211 UserGestureIndicator gestureIndicator( | 222 UserGestureIndicator gestureIndicator( |
| 212 UserGestureToken::create(UserGestureToken::NewGesture)); | 223 UserGestureToken::create(UserGestureToken::NewGesture)); |
| 224 |
| 213 ScopedWindowFocusAllowedIndicator windowFocusAllowed(getExecutionContext()); | 225 ScopedWindowFocusAllowedIndicator windowFocusAllowed(getExecutionContext()); |
| 214 dispatchEvent(Event::create(EventTypeNames::click)); | 226 dispatchEvent(Event::create(EventTypeNames::click)); |
| 215 } | 227 } |
| 216 | 228 |
| 217 void Notification::dispatchErrorEvent() { | 229 void Notification::didCloseNotification() { |
| 218 dispatchEvent(Event::create(EventTypeNames::error)); | 230 // The notification will be showing when the user initiated the close, or it |
| 219 } | 231 // will be closing if the developer initiated the close. |
| 220 | |
| 221 void Notification::dispatchCloseEvent() { | |
| 222 // The notification should be Showing if the user initiated the close, or it | |
| 223 // should be Closing if the developer initiated the close. | |
| 224 if (m_state != State::Showing && m_state != State::Closing) | 232 if (m_state != State::Showing && m_state != State::Closing) |
| 225 return; | 233 return; |
| 226 | 234 |
| 227 m_state = State::Closed; | 235 m_state = State::Closed; |
| 228 dispatchEvent(Event::create(EventTypeNames::close)); | 236 dispatchEvent(Event::create(EventTypeNames::close)); |
| 229 } | 237 } |
| 230 | 238 |
| 231 String Notification::title() const { | 239 String Notification::title() const { |
| 232 return m_data.title; | 240 return m_data.title; |
| 233 } | 241 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 } | 405 } |
| 398 | 406 |
| 399 DEFINE_TRACE(Notification) { | 407 DEFINE_TRACE(Notification) { |
| 400 visitor->trace(m_prepareShowMethodRunner); | 408 visitor->trace(m_prepareShowMethodRunner); |
| 401 visitor->trace(m_loader); | 409 visitor->trace(m_loader); |
| 402 EventTargetWithInlineData::trace(visitor); | 410 EventTargetWithInlineData::trace(visitor); |
| 403 ActiveDOMObject::trace(visitor); | 411 ActiveDOMObject::trace(visitor); |
| 404 } | 412 } |
| 405 | 413 |
| 406 } // namespace blink | 414 } // namespace blink |
| OLD | NEW |