| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/notifications/NotificationData.h" | 5 #include "modules/notifications/NotificationData.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
| 8 #include "bindings/modules/v8/UnionTypesModules.h" | 8 #include "bindings/modules/v8/UnionTypesModules.h" |
| 9 #include "core/testing/NullExecutionContext.h" | 9 #include "core/testing/NullExecutionContext.h" |
| 10 #include "modules/notifications/Notification.h" | 10 #include "modules/notifications/Notification.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 const unsigned kNotificationVibrationUnnormalized[] = { 10, 1000000, 50, 42 }; | 39 const unsigned kNotificationVibrationUnnormalized[] = { 10, 1000000, 50, 42 }; |
| 40 const int kNotificationVibrationNormalized[] = { 10, 10000, 50 }; | 40 const int kNotificationVibrationNormalized[] = { 10, 10000, 50 }; |
| 41 | 41 |
| 42 class NotificationDataTest : public ::testing::Test { | 42 class NotificationDataTest : public ::testing::Test { |
| 43 public: | 43 public: |
| 44 void SetUp() override | 44 void SetUp() override |
| 45 { | 45 { |
| 46 m_executionContext = adoptRefWillBeNoop(new NullExecutionContext()); | 46 m_executionContext = adoptRefWillBeNoop(new NullExecutionContext()); |
| 47 } | 47 } |
| 48 | 48 |
| 49 ExecutionContext* executionContext() { return m_executionContext.get(); } | 49 ExecutionContext* getExecutionContext() { return m_executionContext.get(); } |
| 50 | 50 |
| 51 private: | 51 private: |
| 52 RefPtrWillBePersistent<ExecutionContext> m_executionContext; | 52 RefPtrWillBePersistent<ExecutionContext> m_executionContext; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 TEST_F(NotificationDataTest, ReflectProperties) | 55 TEST_F(NotificationDataTest, ReflectProperties) |
| 56 { | 56 { |
| 57 Vector<unsigned> vibrationPattern; | 57 Vector<unsigned> vibrationPattern; |
| 58 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNotificationVibration); ++i) | 58 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNotificationVibration); ++i) |
| 59 vibrationPattern.append(kNotificationVibration[i]); | 59 vibrationPattern.append(kNotificationVibration[i]); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 80 options.setVibrate(vibrationSequence); | 80 options.setVibrate(vibrationSequence); |
| 81 options.setTimestamp(kNotificationTimestamp); | 81 options.setTimestamp(kNotificationTimestamp); |
| 82 options.setRenotify(kNotificationRenotify); | 82 options.setRenotify(kNotificationRenotify); |
| 83 options.setSilent(kNotificationSilent); | 83 options.setSilent(kNotificationSilent); |
| 84 options.setRequireInteraction(kNotificationRequireInteraction); | 84 options.setRequireInteraction(kNotificationRequireInteraction); |
| 85 options.setActions(actions); | 85 options.setActions(actions); |
| 86 | 86 |
| 87 // TODO(peter): Test |options.data| and |notificationData.data|. | 87 // TODO(peter): Test |options.data| and |notificationData.data|. |
| 88 | 88 |
| 89 TrackExceptionState exceptionState; | 89 TrackExceptionState exceptionState; |
| 90 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 90 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 91 ASSERT_FALSE(exceptionState.hadException()); | 91 ASSERT_FALSE(exceptionState.hadException()); |
| 92 | 92 |
| 93 EXPECT_EQ(kNotificationTitle, notificationData.title); | 93 EXPECT_EQ(kNotificationTitle, notificationData.title); |
| 94 | 94 |
| 95 EXPECT_EQ(WebNotificationData::DirectionRightToLeft, notificationData.direct
ion); | 95 EXPECT_EQ(WebNotificationData::DirectionRightToLeft, notificationData.direct
ion); |
| 96 EXPECT_EQ(kNotificationLang, notificationData.lang); | 96 EXPECT_EQ(kNotificationLang, notificationData.lang); |
| 97 EXPECT_EQ(kNotificationBody, notificationData.body); | 97 EXPECT_EQ(kNotificationBody, notificationData.body); |
| 98 EXPECT_EQ(kNotificationTag, notificationData.tag); | 98 EXPECT_EQ(kNotificationTag, notificationData.tag); |
| 99 | 99 |
| 100 // TODO(peter): Test WebNotificationData.icon and WebNotificationAction.icon
when ExecutionContext::completeURL() works in this test. | 100 // TODO(peter): Test WebNotificationData.icon and WebNotificationAction.icon
when ExecutionContext::completeURL() works in this test. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 121 vibrationPattern.append(kNotificationVibration[i]); | 121 vibrationPattern.append(kNotificationVibration[i]); |
| 122 | 122 |
| 123 UnsignedLongOrUnsignedLongSequence vibrationSequence; | 123 UnsignedLongOrUnsignedLongSequence vibrationSequence; |
| 124 vibrationSequence.setUnsignedLongSequence(vibrationPattern); | 124 vibrationSequence.setUnsignedLongSequence(vibrationPattern); |
| 125 | 125 |
| 126 NotificationOptions options; | 126 NotificationOptions options; |
| 127 options.setVibrate(vibrationSequence); | 127 options.setVibrate(vibrationSequence); |
| 128 options.setSilent(true); | 128 options.setSilent(true); |
| 129 | 129 |
| 130 TrackExceptionState exceptionState; | 130 TrackExceptionState exceptionState; |
| 131 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 131 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 132 ASSERT_TRUE(exceptionState.hadException()); | 132 ASSERT_TRUE(exceptionState.hadException()); |
| 133 | 133 |
| 134 EXPECT_EQ("Silent notifications must not specify vibration patterns.", excep
tionState.message()); | 134 EXPECT_EQ("Silent notifications must not specify vibration patterns.", excep
tionState.message()); |
| 135 } | 135 } |
| 136 | 136 |
| 137 TEST_F(NotificationDataTest, RenotifyWithEmptyTag) | 137 TEST_F(NotificationDataTest, RenotifyWithEmptyTag) |
| 138 { | 138 { |
| 139 NotificationOptions options; | 139 NotificationOptions options; |
| 140 options.setTag(kNotificationEmptyTag); | 140 options.setTag(kNotificationEmptyTag); |
| 141 options.setRenotify(true); | 141 options.setRenotify(true); |
| 142 | 142 |
| 143 TrackExceptionState exceptionState; | 143 TrackExceptionState exceptionState; |
| 144 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 144 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 145 ASSERT_TRUE(exceptionState.hadException()); | 145 ASSERT_TRUE(exceptionState.hadException()); |
| 146 | 146 |
| 147 EXPECT_EQ("Notifications which set the renotify flag must specify a non-empt
y tag.", exceptionState.message()); | 147 EXPECT_EQ("Notifications which set the renotify flag must specify a non-empt
y tag.", exceptionState.message()); |
| 148 } | 148 } |
| 149 | 149 |
| 150 TEST_F(NotificationDataTest, InvalidIconUrls) | 150 TEST_F(NotificationDataTest, InvalidIconUrls) |
| 151 { | 151 { |
| 152 HeapVector<NotificationAction> actions; | 152 HeapVector<NotificationAction> actions; |
| 153 for (size_t i = 0; i < Notification::maxActions(); ++i) { | 153 for (size_t i = 0; i < Notification::maxActions(); ++i) { |
| 154 NotificationAction action; | 154 NotificationAction action; |
| 155 action.setAction(kNotificationActionAction); | 155 action.setAction(kNotificationActionAction); |
| 156 action.setTitle(kNotificationActionTitle); | 156 action.setTitle(kNotificationActionTitle); |
| 157 action.setIcon(kNotificationIconInvalid); | 157 action.setIcon(kNotificationIconInvalid); |
| 158 actions.append(action); | 158 actions.append(action); |
| 159 } | 159 } |
| 160 | 160 |
| 161 NotificationOptions options; | 161 NotificationOptions options; |
| 162 options.setIcon(kNotificationIconInvalid); | 162 options.setIcon(kNotificationIconInvalid); |
| 163 options.setActions(actions); | 163 options.setActions(actions); |
| 164 | 164 |
| 165 TrackExceptionState exceptionState; | 165 TrackExceptionState exceptionState; |
| 166 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 166 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 167 ASSERT_FALSE(exceptionState.hadException()); | 167 ASSERT_FALSE(exceptionState.hadException()); |
| 168 | 168 |
| 169 EXPECT_TRUE(notificationData.icon.isEmpty()); | 169 EXPECT_TRUE(notificationData.icon.isEmpty()); |
| 170 for (const auto& action : notificationData.actions) | 170 for (const auto& action : notificationData.actions) |
| 171 EXPECT_TRUE(action.icon.isEmpty()); | 171 EXPECT_TRUE(action.icon.isEmpty()); |
| 172 } | 172 } |
| 173 | 173 |
| 174 TEST_F(NotificationDataTest, VibrationNormalization) | 174 TEST_F(NotificationDataTest, VibrationNormalization) |
| 175 { | 175 { |
| 176 Vector<unsigned> unnormalizedPattern; | 176 Vector<unsigned> unnormalizedPattern; |
| 177 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNotificationVibrationUnnormalized);
++i) | 177 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNotificationVibrationUnnormalized);
++i) |
| 178 unnormalizedPattern.append(kNotificationVibrationUnnormalized[i]); | 178 unnormalizedPattern.append(kNotificationVibrationUnnormalized[i]); |
| 179 | 179 |
| 180 UnsignedLongOrUnsignedLongSequence vibrationSequence; | 180 UnsignedLongOrUnsignedLongSequence vibrationSequence; |
| 181 vibrationSequence.setUnsignedLongSequence(unnormalizedPattern); | 181 vibrationSequence.setUnsignedLongSequence(unnormalizedPattern); |
| 182 | 182 |
| 183 NotificationOptions options; | 183 NotificationOptions options; |
| 184 options.setVibrate(vibrationSequence); | 184 options.setVibrate(vibrationSequence); |
| 185 | 185 |
| 186 TrackExceptionState exceptionState; | 186 TrackExceptionState exceptionState; |
| 187 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 187 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 188 EXPECT_FALSE(exceptionState.hadException()); | 188 EXPECT_FALSE(exceptionState.hadException()); |
| 189 | 189 |
| 190 Vector<int> normalizedPattern; | 190 Vector<int> normalizedPattern; |
| 191 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNotificationVibrationNormalized); +
+i) | 191 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNotificationVibrationNormalized); +
+i) |
| 192 normalizedPattern.append(kNotificationVibrationNormalized[i]); | 192 normalizedPattern.append(kNotificationVibrationNormalized[i]); |
| 193 | 193 |
| 194 ASSERT_EQ(normalizedPattern.size(), notificationData.vibrate.size()); | 194 ASSERT_EQ(normalizedPattern.size(), notificationData.vibrate.size()); |
| 195 for (size_t i = 0; i < normalizedPattern.size(); ++i) | 195 for (size_t i = 0; i < normalizedPattern.size(); ++i) |
| 196 EXPECT_EQ(normalizedPattern[i], notificationData.vibrate[i]); | 196 EXPECT_EQ(normalizedPattern[i], notificationData.vibrate[i]); |
| 197 } | 197 } |
| 198 | 198 |
| 199 TEST_F(NotificationDataTest, DefaultTimestampValue) | 199 TEST_F(NotificationDataTest, DefaultTimestampValue) |
| 200 { | 200 { |
| 201 NotificationOptions options; | 201 NotificationOptions options; |
| 202 | 202 |
| 203 TrackExceptionState exceptionState; | 203 TrackExceptionState exceptionState; |
| 204 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 204 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 205 EXPECT_FALSE(exceptionState.hadException()); | 205 EXPECT_FALSE(exceptionState.hadException()); |
| 206 | 206 |
| 207 // The timestamp should be set to the current time since the epoch if it was
n't supplied by the developer. | 207 // The timestamp should be set to the current time since the epoch if it was
n't supplied by the developer. |
| 208 // "32" has no significance, but an equal comparison of the value could lead
to flaky failures. | 208 // "32" has no significance, but an equal comparison of the value could lead
to flaky failures. |
| 209 EXPECT_NEAR(notificationData.timestamp, WTF::currentTimeMS(), 32); | 209 EXPECT_NEAR(notificationData.timestamp, WTF::currentTimeMS(), 32); |
| 210 } | 210 } |
| 211 | 211 |
| 212 TEST_F(NotificationDataTest, DirectionValues) | 212 TEST_F(NotificationDataTest, DirectionValues) |
| 213 { | 213 { |
| 214 WTF::HashMap<String, WebNotificationData::Direction> mappings; | 214 WTF::HashMap<String, WebNotificationData::Direction> mappings; |
| 215 mappings.add("ltr", WebNotificationData::DirectionLeftToRight); | 215 mappings.add("ltr", WebNotificationData::DirectionLeftToRight); |
| 216 mappings.add("rtl", WebNotificationData::DirectionRightToLeft); | 216 mappings.add("rtl", WebNotificationData::DirectionRightToLeft); |
| 217 mappings.add("auto", WebNotificationData::DirectionAuto); | 217 mappings.add("auto", WebNotificationData::DirectionAuto); |
| 218 | 218 |
| 219 // Invalid values should default to "auto". | 219 // Invalid values should default to "auto". |
| 220 mappings.add("peter", WebNotificationData::DirectionAuto); | 220 mappings.add("peter", WebNotificationData::DirectionAuto); |
| 221 | 221 |
| 222 for (const String& direction : mappings.keys()) { | 222 for (const String& direction : mappings.keys()) { |
| 223 NotificationOptions options; | 223 NotificationOptions options; |
| 224 options.setDir(direction); | 224 options.setDir(direction); |
| 225 | 225 |
| 226 TrackExceptionState exceptionState; | 226 TrackExceptionState exceptionState; |
| 227 WebNotificationData notificationData = createWebNotificationData(executi
onContext(), kNotificationTitle, options, exceptionState); | 227 WebNotificationData notificationData = createWebNotificationData(getExec
utionContext(), kNotificationTitle, options, exceptionState); |
| 228 ASSERT_FALSE(exceptionState.hadException()); | 228 ASSERT_FALSE(exceptionState.hadException()); |
| 229 | 229 |
| 230 EXPECT_EQ(mappings.get(direction), notificationData.direction); | 230 EXPECT_EQ(mappings.get(direction), notificationData.direction); |
| 231 } | 231 } |
| 232 } | 232 } |
| 233 | 233 |
| 234 TEST_F(NotificationDataTest, MaximumActionCount) | 234 TEST_F(NotificationDataTest, MaximumActionCount) |
| 235 { | 235 { |
| 236 HeapVector<NotificationAction> actions; | 236 HeapVector<NotificationAction> actions; |
| 237 for (size_t i = 0; i < Notification::maxActions() + 2; ++i) { | 237 for (size_t i = 0; i < Notification::maxActions() + 2; ++i) { |
| 238 NotificationAction action; | 238 NotificationAction action; |
| 239 action.setAction(String::number(i)); | 239 action.setAction(String::number(i)); |
| 240 action.setTitle(kNotificationActionTitle); | 240 action.setTitle(kNotificationActionTitle); |
| 241 | 241 |
| 242 actions.append(action); | 242 actions.append(action); |
| 243 } | 243 } |
| 244 | 244 |
| 245 NotificationOptions options; | 245 NotificationOptions options; |
| 246 options.setActions(actions); | 246 options.setActions(actions); |
| 247 | 247 |
| 248 TrackExceptionState exceptionState; | 248 TrackExceptionState exceptionState; |
| 249 WebNotificationData notificationData = createWebNotificationData(executionCo
ntext(), kNotificationTitle, options, exceptionState); | 249 WebNotificationData notificationData = createWebNotificationData(getExecutio
nContext(), kNotificationTitle, options, exceptionState); |
| 250 ASSERT_FALSE(exceptionState.hadException()); | 250 ASSERT_FALSE(exceptionState.hadException()); |
| 251 | 251 |
| 252 // The stored actions will be capped to |maxActions| entries. | 252 // The stored actions will be capped to |maxActions| entries. |
| 253 ASSERT_EQ(Notification::maxActions(), notificationData.actions.size()); | 253 ASSERT_EQ(Notification::maxActions(), notificationData.actions.size()); |
| 254 | 254 |
| 255 for (size_t i = 0; i < Notification::maxActions(); ++i) { | 255 for (size_t i = 0; i < Notification::maxActions(); ++i) { |
| 256 WebString expectedAction = String::number(i); | 256 WebString expectedAction = String::number(i); |
| 257 EXPECT_EQ(expectedAction, notificationData.actions[i].action); | 257 EXPECT_EQ(expectedAction, notificationData.actions[i].action); |
| 258 } | 258 } |
| 259 } | 259 } |
| 260 | 260 |
| 261 } // namespace | 261 } // namespace |
| 262 } // namespace blink | 262 } // namespace blink |
| OLD | NEW |