Chromium Code Reviews| 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 18 matching lines...) Expand all Loading... | |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "modules/notifications/Notification.h" | 32 #include "modules/notifications/Notification.h" |
| 33 | 33 |
| 34 #include "bindings/core/v8/ExceptionState.h" | 34 #include "bindings/core/v8/ExceptionState.h" |
| 35 #include "bindings/core/v8/ScriptState.h" | 35 #include "bindings/core/v8/ScriptState.h" |
| 36 #include "bindings/core/v8/ScriptValue.h" | 36 #include "bindings/core/v8/ScriptValue.h" |
| 37 #include "bindings/core/v8/ScriptWrappable.h" | 37 #include "bindings/core/v8/ScriptWrappable.h" |
| 38 #include "bindings/core/v8/SerializedScriptValueFactory.h" | 38 #include "bindings/core/v8/SerializedScriptValueFactory.h" |
| 39 #include "bindings/modules/v8/UnionTypesModules.h" | |
|
timvolodine
2015/04/13 11:55:18
is this still needed?
Sanghyun Park
2015/04/13 13:35:08
Oops, This is my fault.
I'll remove..
| |
| 39 #include "core/dom/Document.h" | 40 #include "core/dom/Document.h" |
| 40 #include "core/dom/ExecutionContext.h" | 41 #include "core/dom/ExecutionContext.h" |
| 41 #include "core/dom/ExecutionContextTask.h" | 42 #include "core/dom/ExecutionContextTask.h" |
| 42 #include "core/dom/ScopedWindowFocusAllowedIndicator.h" | 43 #include "core/dom/ScopedWindowFocusAllowedIndicator.h" |
| 43 #include "core/events/Event.h" | 44 #include "core/events/Event.h" |
| 44 #include "core/frame/UseCounter.h" | 45 #include "core/frame/UseCounter.h" |
| 45 #include "modules/notifications/NotificationOptions.h" | 46 #include "modules/notifications/NotificationOptions.h" |
| 46 #include "modules/notifications/NotificationPermissionClient.h" | 47 #include "modules/notifications/NotificationPermissionClient.h" |
| 47 #include "platform/RuntimeEnabledFeatures.h" | 48 #include "platform/RuntimeEnabledFeatures.h" |
| 48 #include "platform/UserGestureIndicator.h" | 49 #include "platform/UserGestureIndicator.h" |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 70 exceptionState.throwTypeError("Illegal constructor. Use ServiceWorkerReg istration.showNotification() instead."); | 71 exceptionState.throwTypeError("Illegal constructor. Use ServiceWorkerReg istration.showNotification() instead."); |
| 71 return nullptr; | 72 return nullptr; |
| 72 } | 73 } |
| 73 | 74 |
| 74 // The Web Notification constructor may not be used in Service Worker contex ts. | 75 // The Web Notification constructor may not be used in Service Worker contex ts. |
| 75 if (context->isServiceWorkerGlobalScope()) { | 76 if (context->isServiceWorkerGlobalScope()) { |
| 76 exceptionState.throwTypeError("Illegal constructor."); | 77 exceptionState.throwTypeError("Illegal constructor."); |
| 77 return nullptr; | 78 return nullptr; |
| 78 } | 79 } |
| 79 | 80 |
| 81 // If options's silent is true, and options's vibrate is present, throw a Ty peError exception. | |
| 82 if (options.hasVibrate() && options.silent()) { | |
| 83 exceptionState.throwTypeError("Slient notification must not specify vibr ation patterns."); | |
| 84 return nullptr; | |
| 85 } | |
| 86 | |
| 80 RefPtr<SerializedScriptValue> data; | 87 RefPtr<SerializedScriptValue> data; |
| 81 if (options.hasData()) { | 88 if (options.hasData()) { |
| 82 data = SerializedScriptValueFactory::instance().create(options.data(), n ullptr, exceptionState, options.data().isolate()); | 89 data = SerializedScriptValueFactory::instance().create(options.data(), n ullptr, exceptionState, options.data().isolate()); |
| 83 if (exceptionState.hadException()) | 90 if (exceptionState.hadException()) |
| 84 return nullptr; | 91 return nullptr; |
| 85 } | 92 } |
| 86 | 93 |
| 87 Notification* notification = new Notification(title, context); | 94 Notification* notification = new Notification(title, context); |
| 88 | 95 |
| 89 notification->setBody(options.body()); | 96 notification->setBody(options.body()); |
| 90 notification->setTag(options.tag()); | 97 notification->setTag(options.tag()); |
| 91 notification->setLang(options.lang()); | 98 notification->setLang(options.lang()); |
| 92 notification->setDir(options.dir()); | 99 notification->setDir(options.dir()); |
| 100 notification->setVibrate(NavigatorVibration::sanitizeVibrationPattern(option s.vibrate())); | |
| 93 notification->setSilent(options.silent()); | 101 notification->setSilent(options.silent()); |
| 94 notification->setSerializedData(data.release()); | 102 notification->setSerializedData(data.release()); |
| 95 if (options.hasIcon()) { | 103 if (options.hasIcon()) { |
| 96 KURL iconUrl = options.icon().isEmpty() ? KURL() : context->completeURL( options.icon()); | 104 KURL iconUrl = options.icon().isEmpty() ? KURL() : context->completeURL( options.icon()); |
| 97 if (!iconUrl.isEmpty() && iconUrl.isValid()) | 105 if (!iconUrl.isEmpty() && iconUrl.isValid()) |
| 98 notification->setIconUrl(iconUrl); | 106 notification->setIconUrl(iconUrl); |
| 99 } | 107 } |
| 100 | 108 |
| 101 String insecureOriginMessage; | 109 String insecureOriginMessage; |
| 102 UseCounter::Feature feature = context->securityOrigin()->canAccessFeatureReq uiringSecureOrigin(insecureOriginMessage) | 110 UseCounter::Feature feature = context->securityOrigin()->canAccessFeatureReq uiringSecureOrigin(insecureOriginMessage) |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 115 notification->setPersistentId(persistentId); | 123 notification->setPersistentId(persistentId); |
| 116 notification->setDir(data.direction == WebNotificationData::DirectionLeftToR ight ? "ltr" : "rtl"); | 124 notification->setDir(data.direction == WebNotificationData::DirectionLeftToR ight ? "ltr" : "rtl"); |
| 117 notification->setLang(data.lang); | 125 notification->setLang(data.lang); |
| 118 notification->setBody(data.body); | 126 notification->setBody(data.body); |
| 119 notification->setTag(data.tag); | 127 notification->setTag(data.tag); |
| 120 notification->setSilent(data.silent); | 128 notification->setSilent(data.silent); |
| 121 | 129 |
| 122 if (!data.icon.isEmpty()) | 130 if (!data.icon.isEmpty()) |
| 123 notification->setIconUrl(data.icon); | 131 notification->setIconUrl(data.icon); |
| 124 | 132 |
| 133 if (!data.vibrate.isEmpty()) { | |
| 134 NavigatorVibration::VibrationPattern pattern; | |
| 135 pattern.appendRange(data.vibrate.begin(), data.vibrate.end()); | |
| 136 notification->setVibrate(pattern); | |
| 137 } | |
| 138 | |
| 125 const WebVector<char>& dataBytes = data.data; | 139 const WebVector<char>& dataBytes = data.data; |
| 126 if (!dataBytes.isEmpty()) { | 140 if (!dataBytes.isEmpty()) { |
| 127 notification->setSerializedData(SerializedScriptValueFactory::instance() .createFromWireBytes(dataBytes.data(), dataBytes.size())); | 141 notification->setSerializedData(SerializedScriptValueFactory::instance() .createFromWireBytes(dataBytes.data(), dataBytes.size())); |
| 128 notification->serializedData()->registerMemoryAllocatedWithCurrentScript Context(); | 142 notification->serializedData()->registerMemoryAllocatedWithCurrentScript Context(); |
| 129 } | 143 } |
| 130 | 144 |
| 131 notification->setState(NotificationStateShowing); | 145 notification->setState(NotificationStateShowing); |
| 132 notification->suspendIfNeeded(); | 146 notification->suspendIfNeeded(); |
| 133 return notification; | 147 return notification; |
| 134 } | 148 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 SecurityOrigin* origin = executionContext()->securityOrigin(); | 181 SecurityOrigin* origin = executionContext()->securityOrigin(); |
| 168 ASSERT(origin); | 182 ASSERT(origin); |
| 169 | 183 |
| 170 // FIXME: Do CSP checks on the associated notification icon. | 184 // FIXME: Do CSP checks on the associated notification icon. |
| 171 WebNotificationData::Direction dir = m_dir == "rtl" ? WebNotificationData::D irectionRightToLeft : WebNotificationData::DirectionLeftToRight; | 185 WebNotificationData::Direction dir = m_dir == "rtl" ? WebNotificationData::D irectionRightToLeft : WebNotificationData::DirectionLeftToRight; |
| 172 | 186 |
| 173 // The lifetime and availability of non-persistent notifications is tied to the page | 187 // The lifetime and availability of non-persistent notifications is tied to the page |
| 174 // they were created by, and thus the data doesn't have to be known to the e mbedder. | 188 // they were created by, and thus the data doesn't have to be known to the e mbedder. |
| 175 Vector<char> emptyDataWireBytes; | 189 Vector<char> emptyDataWireBytes; |
| 176 | 190 |
| 177 WebNotificationData notificationData(m_title, dir, m_lang, m_body, m_tag, m_ iconUrl, m_silent, emptyDataWireBytes); | 191 WebNotificationData notificationData(m_title, dir, m_lang, m_body, m_tag, m_ iconUrl, m_vibrate, m_silent, emptyDataWireBytes); |
| 178 notificationManager()->show(WebSerializedOrigin(*origin), notificationData, this); | 192 notificationManager()->show(WebSerializedOrigin(*origin), notificationData, this); |
| 179 | 193 |
| 180 m_state = NotificationStateShowing; | 194 m_state = NotificationStateShowing; |
| 181 } | 195 } |
| 182 | 196 |
| 183 void Notification::close() | 197 void Notification::close() |
| 184 { | 198 { |
| 185 if (m_state != NotificationStateShowing) | 199 if (m_state != NotificationStateShowing) |
| 186 return; | 200 return; |
| 187 | 201 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 222 { | 236 { |
| 223 // The notification will be showing when the user initiated the close, or it will be | 237 // The notification will be showing when the user initiated the close, or it will be |
| 224 // closing if the developer initiated the close. | 238 // closing if the developer initiated the close. |
| 225 if (m_state != NotificationStateShowing && m_state != NotificationStateClosi ng) | 239 if (m_state != NotificationStateShowing && m_state != NotificationStateClosi ng) |
| 226 return; | 240 return; |
| 227 | 241 |
| 228 m_state = NotificationStateClosed; | 242 m_state = NotificationStateClosed; |
| 229 dispatchEvent(Event::create(EventTypeNames::close)); | 243 dispatchEvent(Event::create(EventTypeNames::close)); |
| 230 } | 244 } |
| 231 | 245 |
| 246 NavigatorVibration::VibrationPattern Notification::vibrate(bool& isNull) const | |
| 247 { | |
| 248 isNull = m_vibrate.isEmpty(); | |
| 249 return m_vibrate; | |
| 250 } | |
| 251 | |
| 232 TextDirection Notification::direction() const | 252 TextDirection Notification::direction() const |
| 233 { | 253 { |
| 234 // FIXME: Resolve dir()=="auto" against the document. | 254 // FIXME: Resolve dir()=="auto" against the document. |
| 235 return dir() == "rtl" ? RTL : LTR; | 255 return dir() == "rtl" ? RTL : LTR; |
| 236 } | 256 } |
| 237 | 257 |
| 238 String Notification::permissionString(WebNotificationPermission permission) | 258 String Notification::permissionString(WebNotificationPermission permission) |
| 239 { | 259 { |
| 240 switch (permission) { | 260 switch (permission) { |
| 241 case WebNotificationPermissionAllowed: | 261 case WebNotificationPermissionAllowed: |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 304 return ScriptValue(scriptState, m_serializedData->deserialize(scriptState->i solate())); | 324 return ScriptValue(scriptState, m_serializedData->deserialize(scriptState->i solate())); |
| 305 } | 325 } |
| 306 | 326 |
| 307 DEFINE_TRACE(Notification) | 327 DEFINE_TRACE(Notification) |
| 308 { | 328 { |
| 309 RefCountedGarbageCollectedEventTargetWithInlineData<Notification>::trace(vis itor); | 329 RefCountedGarbageCollectedEventTargetWithInlineData<Notification>::trace(vis itor); |
| 310 ActiveDOMObject::trace(visitor); | 330 ActiveDOMObject::trace(visitor); |
| 311 } | 331 } |
| 312 | 332 |
| 313 } // namespace blink | 333 } // namespace blink |
| OLD | NEW |