Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: Source/modules/notifications/NotificationDataTest.cpp

Issue 1260793007: Generalize validation of developer input for Web Notifications (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix actions Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "modules/notifications/NotificationData.h"
7
8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/modules/v8/UnionTypesModules.h"
10 #include "core/testing/NullExecutionContext.h"
11 #include "modules/notifications/Notification.h"
12 #include "modules/notifications/NotificationOptions.h"
13 #include "wtf/HashMap.h"
14 #include "wtf/Vector.h"
15 #include <gtest/gtest.h>
16
17 namespace blink {
18 namespace {
19
20 const char kNotificationTitle[] = "My Notification";
21
22 const char kNotificationDir[] = "rtl";
23 const char kNotificationLang[] = "nl";
24 const char kNotificationBody[] = "Hello, world";
25 const char kNotificationTag[] = "my_tag";
26 const char kNotificationIcon[] = "https://example.com/icon.png";
27 const unsigned kNotificationVibration[] = { 42, 10, 20, 30, 40 };
28 const bool kNotificationSilent = false;
29
30 const char kNotificationActionAction[] = "my_action";
31 const char kNotificationActionTitle[] = "My Action";
32
33 const unsigned kNotificationVibrationUnnormalized[] = { 10, 1000000, 50, 42 };
34 const int kNotificationVibrationNormalized[] = { 10, 10000, 50 };
35
36 class NotificationDataTest : public ::testing::Test {
37 public:
38 void SetUp() override
39 {
40 m_executionContext = adoptRefWillBeNoop(new NullExecutionContext());
41 }
42
43 ExecutionContext* executionContext() { return m_executionContext.get(); }
44
45 private:
46 RefPtrWillBePersistent<ExecutionContext> m_executionContext;
47 };
48
49 TEST_F(NotificationDataTest, ReflectProperties)
50 {
51 Vector<unsigned> vibrationPattern;
52 for (size_t i = 0; i < arraysize(kNotificationVibration); ++i)
53 vibrationPattern.append(kNotificationVibration[i]);
54
55 UnsignedLongOrUnsignedLongSequence vibrationSequence;
56 vibrationSequence.setUnsignedLongSequence(vibrationPattern);
57
58 HeapVector<NotificationAction> actions;
59 for (size_t i = 0; i < Notification::maxActions(); ++i) {
60 NotificationAction action;
61 action.setAction(kNotificationActionAction);
62 action.setTitle(kNotificationActionTitle);
63
64 actions.append(action);
65 }
66
67 NotificationOptions options;
68 options.setDir(kNotificationDir);
69 options.setLang(kNotificationLang);
70 options.setBody(kNotificationBody);
71 options.setTag(kNotificationTag);
72 options.setIcon(kNotificationIcon);
73 options.setVibrate(vibrationSequence);
74 options.setSilent(kNotificationSilent);
75 options.setActions(actions);
76
77 // TODO(peter): Test |options.data| and |notificationData.data|.
78
79 TrackExceptionState exceptionState;
80 WebNotificationData notificationData = createWebNotificationData(executionCo ntext(), kNotificationTitle, options, exceptionState);
81 ASSERT_FALSE(exceptionState.hadException());
82
83 EXPECT_EQ(kNotificationTitle, notificationData.title);
84
85 EXPECT_EQ(WebNotificationData::DirectionRightToLeft, notificationData.direct ion);
86 EXPECT_EQ(kNotificationLang, notificationData.lang);
87 EXPECT_EQ(kNotificationBody, notificationData.body);
88 EXPECT_EQ(kNotificationTag, notificationData.tag);
89
90 // TODO(peter): Test notificationData.icon when ExecutionContext::completeUR L() works in this test.
91
92 ASSERT_EQ(vibrationPattern.size(), notificationData.vibrate.size());
93 for (size_t i = 0; i < vibrationPattern.size(); ++i)
94 EXPECT_EQ(vibrationPattern[i], static_cast<unsigned>(notificationData.vi brate[i]));
95
96 EXPECT_EQ(kNotificationSilent, notificationData.silent);
97 EXPECT_EQ(actions.size(), notificationData.actions.size());
98 }
99
100 TEST_F(NotificationDataTest, SilentNotificationWithVibration)
101 {
102 Vector<unsigned> vibrationPattern;
103 for (size_t i = 0; i < arraysize(kNotificationVibration); ++i)
104 vibrationPattern.append(kNotificationVibration[i]);
105
106 UnsignedLongOrUnsignedLongSequence vibrationSequence;
107 vibrationSequence.setUnsignedLongSequence(vibrationPattern);
108
109 NotificationOptions options;
110 options.setVibrate(vibrationSequence);
111 options.setSilent(true);
112
113 TrackExceptionState exceptionState;
114 WebNotificationData notificationData = createWebNotificationData(executionCo ntext(), kNotificationTitle, options, exceptionState);
115 ASSERT_TRUE(exceptionState.hadException());
116
117 EXPECT_EQ("Silent notifications must not specify vibration patterns.", excep tionState.message());
118 }
119
120 TEST_F(NotificationDataTest, InvalidIconUrl)
121 {
122 NotificationOptions options;
123 options.setIcon("https://invalid:icon:url");
124
125 TrackExceptionState exceptionState;
126 WebNotificationData notificationData = createWebNotificationData(executionCo ntext(), kNotificationTitle, options, exceptionState);
127 ASSERT_FALSE(exceptionState.hadException());
128
129 EXPECT_TRUE(notificationData.icon.isEmpty());
130 }
131
132 TEST_F(NotificationDataTest, VibrationNormalization)
133 {
134 Vector<unsigned> unnormalizedPattern;
135 for (size_t i = 0; i < arraysize(kNotificationVibrationUnnormalized); ++i)
136 unnormalizedPattern.append(kNotificationVibrationUnnormalized[i]);
137
138 UnsignedLongOrUnsignedLongSequence vibrationSequence;
139 vibrationSequence.setUnsignedLongSequence(unnormalizedPattern);
140
141 NotificationOptions options;
142 options.setVibrate(vibrationSequence);
143
144 TrackExceptionState exceptionState;
145 WebNotificationData notificationData = createWebNotificationData(executionCo ntext(), kNotificationTitle, options, exceptionState);
146 EXPECT_FALSE(exceptionState.hadException());
147
148 Vector<int> normalizedPattern;
149 for (size_t i = 0; i < arraysize(kNotificationVibrationNormalized); ++i)
150 normalizedPattern.append(kNotificationVibrationNormalized[i]);
151
152 ASSERT_EQ(normalizedPattern.size(), notificationData.vibrate.size());
153 for (size_t i = 0; i < normalizedPattern.size(); ++i)
154 EXPECT_EQ(normalizedPattern[i], notificationData.vibrate[i]);
155 }
156
157 TEST_F(NotificationDataTest, DirectionValues)
158 {
159 WTF::HashMap<String, WebNotificationData::Direction> mappings;
160 mappings.add("ltr", WebNotificationData::DirectionLeftToRight);
161 mappings.add("rtl", WebNotificationData::DirectionRightToLeft);
162 mappings.add("auto", WebNotificationData::DirectionAuto);
163
164 // Invalid values should default to "auto".
165 mappings.add("peter", WebNotificationData::DirectionAuto);
166
167 for (const String& direction : mappings.keys()) {
168 NotificationOptions options;
169 options.setDir(direction);
170
171 TrackExceptionState exceptionState;
172 WebNotificationData notificationData = createWebNotificationData(executi onContext(), kNotificationTitle, options, exceptionState);
173 ASSERT_FALSE(exceptionState.hadException());
174
175 EXPECT_EQ(mappings.get(direction), notificationData.direction);
176 }
177 }
178
179 TEST_F(NotificationDataTest, RequiredActionProperties)
180 {
181 NotificationOptions options;
182
183 // The NotificationAction.action property is required.
184 {
185 NotificationAction action;
186 action.setTitle(kNotificationActionTitle);
187
188 HeapVector<NotificationAction> actions;
189 actions.append(action);
190
191 options.setActions(actions);
192
193 TrackExceptionState exceptionState;
194 WebNotificationData notificationData = createWebNotificationData(executi onContext(), kNotificationTitle, options, exceptionState);
195 ASSERT_TRUE(exceptionState.hadException());
196 EXPECT_EQ("NotificationAction `action` must not be empty.", exceptionSta te.message());
197 }
198
199 // The NotificationAction.title property is required.
200 {
201 NotificationAction action;
202 action.setAction(kNotificationActionAction);
203
204 HeapVector<NotificationAction> actions;
205 actions.append(action);
206
207 options.setActions(actions);
208
209 TrackExceptionState exceptionState;
210 WebNotificationData notificationData = createWebNotificationData(executi onContext(), kNotificationTitle, options, exceptionState);
211 ASSERT_TRUE(exceptionState.hadException());
212 EXPECT_EQ("NotificationAction `title` must not be empty.", exceptionStat e.message());
213 }
214 }
215
216 TEST_F(NotificationDataTest, MaximumActionCount)
217 {
218 HeapVector<NotificationAction> actions;
219 for (size_t i = 0; i < Notification::maxActions() + 2; ++i) {
220 NotificationAction action;
221 action.setAction(String::number(i));
222 action.setTitle(kNotificationActionTitle);
223
224 actions.append(action);
225 }
226
227 NotificationOptions options;
228 options.setActions(actions);
229
230 TrackExceptionState exceptionState;
231 WebNotificationData notificationData = createWebNotificationData(executionCo ntext(), kNotificationTitle, options, exceptionState);
232 ASSERT_FALSE(exceptionState.hadException());
233
234 // The stored actions will be capped to |maxActions| entries.
235 ASSERT_EQ(Notification::maxActions(), notificationData.actions.size());
236
237 for (size_t i = 0; i < Notification::maxActions(); ++i) {
238 WebString expectedAction = String::number(i);
239 EXPECT_EQ(expectedAction, notificationData.actions[i].action);
240 }
241 }
242
243 } // namespace
244 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698