summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsh919.park <sh919.park@samsung.com>2015-05-10 14:30:08 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-10 21:30:30 +0000
commit1593bf8e67c4e99be94a85bec217463961a9c07c (patch)
tree194083665c283a8b6da11a9c2859c0ec9f6a17d4
parentacfa566d3a46f7b9734241192c0c2cad5db24f9f (diff)
downloadchromium_src-1593bf8e67c4e99be94a85bec217463961a9c07c.zip
chromium_src-1593bf8e67c4e99be94a85bec217463961a9c07c.tar.gz
chromium_src-1593bf8e67c4e99be94a85bec217463961a9c07c.tar.bz2
Implement support for notification.vibrate
This patch implements support for notification.vibrate, which allow a Web developer to set the "vibrate" key when creating a notification, that will set up a vibration. This operation depends on the device capability. Currently this only works on Android. The Web Notification specification: https://notifications.spec.whatwg.org/#dom-notificationoptions-vibrate BUG=442132 Review URL: https://codereview.chromium.org/1054573002 Cr-Commit-Position: refs/heads/master@{#329082}
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java54
-rw-r--r--chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java32
-rw-r--r--chrome/browser/notifications/notification_ui_manager_android.cc4
-rw-r--r--chrome/browser/notifications/platform_notification_service_browsertest.cc25
-rw-r--r--chrome/browser/notifications/platform_notification_service_impl.cc1
-rw-r--r--chrome/browser/notifications/platform_notification_service_unittest.cc12
-rw-r--r--chrome/test/data/notifications/platform_notification_service.html8
-rw-r--r--content/browser/notifications/notification_database_data.proto3
-rw-r--r--content/browser/notifications/notification_database_data_conversions.cc11
-rw-r--r--content/browser/notifications/notification_database_data_unittest.cc11
-rw-r--r--content/browser/notifications/notification_message_filter.cc29
-rw-r--r--content/child/notifications/notification_data_conversions.cc3
-rw-r--r--content/child/notifications/notification_data_conversions_unittest.cc20
-rw-r--r--content/common/platform_notification_messages.h1
-rw-r--r--content/public/common/platform_notification_data.h4
-rw-r--r--ui/message_center/notification.cc1
-rw-r--r--ui/message_center/notification.h10
17 files changed, 221 insertions, 8 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
index 602d354..a74a24c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
@@ -293,6 +293,49 @@ public class NotificationUIManager {
}
/**
+ * Generates the notfiication defaults from vibrationPattern's size and silent.
+ *
+ * Use the system's default ringtone, vibration and indicator lights unless the notification
+ * has been marked as being silent.
+ * If a vibration pattern is set, the notification should use the provided pattern
+ * rather than the defaulting to system settings.
+ *
+ * @param vibrationPatternLength Vibration pattern's size for the Notification.
+ * @param silent Whether the default sound, vibration and lights should be suppressed.
+ * @return The generated notification's default value.
+ */
+ @VisibleForTesting
+ static int makeDefaults(int vibrationPatternLength, boolean silent) {
+ assert !silent || vibrationPatternLength == 0;
+
+ if (silent) return 0;
+
+ int defaults = Notification.DEFAULT_ALL;
+ if (vibrationPatternLength > 0) {
+ defaults &= ~Notification.DEFAULT_VIBRATE;
+ }
+ return defaults;
+ }
+
+ /**
+ * Generates the vibration pattern used in Android notification.
+ *
+ * Android takes a long array where the first entry indicates the number of milliseconds to wait
+ * prior to starting the vibration, whereas Chrome follows the syntax of the Web Vibration API.
+ *
+ * @param vibrationPattern Vibration pattern following the Web Vibration API syntax.
+ * @return Vibration pattern following the Android syntax.
+ */
+ @VisibleForTesting
+ static long[] makeVibrationPattern(int[] vibrationPattern) {
+ long[] pattern = new long[vibrationPattern.length + 1];
+ for (int i = 0; i < vibrationPattern.length; ++i) {
+ pattern[i + 1] = vibrationPattern[i];
+ }
+ return pattern;
+ }
+
+ /**
* Displays a notification with the given details.
*
* @param persistentNotificationId The persistent id of the notification.
@@ -306,11 +349,13 @@ public class NotificationUIManager {
* text by the Android notification system.
* @param icon Icon to be displayed in the notification. When this isn't a valid Bitmap, a
* default icon will be generated instead.
+ * @param vibrationPattern Vibration pattern following the Web Vibration syntax.
* @param silent Whether the default sound, vibration and lights should be suppressed.
+ * @see https://developer.android.com/reference/android/app/Notification.html
*/
@CalledByNative
private void displayNotification(long persistentNotificationId, String origin, String tag,
- String title, String body, Bitmap icon, boolean silent) {
+ String title, String body, Bitmap icon, int[] vibrationPattern, boolean silent) {
if (icon == null || icon.getWidth() == 0) {
icon = getIconGenerator().generateIconForUrl(origin, true);
}
@@ -351,9 +396,10 @@ public class NotificationUIManager {
.setTicker(createTickerText(title, body))
.setSubText(origin);
- // Use the system's default ringtone, vibration and indicator lights unless the notification
- // has been marked as being silent, for example because it's low priority.
- if (!silent) notificationBuilder.setDefaults(Notification.DEFAULT_ALL);
+ notificationBuilder.setDefaults(makeDefaults(vibrationPattern.length, silent));
+ if (vibrationPattern.length > 0) {
+ notificationBuilder.setVibrate(makeVibrationPattern(vibrationPattern));
+ }
String platformTag = makePlatformTag(persistentNotificationId, origin, tag);
mNotificationManager.notify(platformTag, PLATFORM_ID, notificationBuilder.build());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java
index b653417..71b1f91 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java
@@ -27,6 +27,7 @@ import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.JavaScriptUtils;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeoutException;
@@ -383,4 +384,35 @@ public class NotificationUIManagerTest extends ChromeShellTestBase {
assertNull(NotificationUIManager.getOriginFromTag(
"NotificationUIManager;SystemDownloadNotifier;42"));
}
+
+ /**
+ * Verifies that the makeDefaults method returns the generated notification defaults.
+ */
+ @SmallTest
+ @Feature({"Browser", "Notifications"})
+ public void testMakeDefaults() throws Exception {
+ // 0 should be returned if silent is true and vibration's length is 0.
+ assertEquals(0, NotificationUIManager.makeDefaults(0, true));
+
+ // Notification.DEFAULT_ALL should be returned if silent is false and
+ // vibration's length is 0.
+ assertEquals(Notification.DEFAULT_ALL,
+ NotificationUIManager.makeDefaults(0, false));
+
+ // Notification.DEFAULT_ALL & ~Notification.DEFAULT_VIBRATE should be returned
+ // if silent is false and vibration's length is greater than 0.
+ assertEquals(Notification.DEFAULT_ALL & ~Notification.DEFAULT_VIBRATE,
+ NotificationUIManager.makeDefaults(10, false));
+ }
+
+ /**
+ * Verifies that the makeVibrationPattern method returns vibration pattern used
+ * in Android notification.
+ */
+ @SmallTest
+ @Feature({"Browser", "Notifications"})
+ public void testMakeVibrationPattern() throws Exception {
+ assertTrue(Arrays.equals(new long[] {0, 100, 200, 300},
+ NotificationUIManager.makeVibrationPattern(new int[] {100, 200, 300})));
+ }
}
diff --git a/chrome/browser/notifications/notification_ui_manager_android.cc b/chrome/browser/notifications/notification_ui_manager_android.cc
index 1d8f482..4ee7219 100644
--- a/chrome/browser/notifications/notification_ui_manager_android.cc
+++ b/chrome/browser/notifications/notification_ui_manager_android.cc
@@ -130,6 +130,9 @@ void NotificationUIManagerAndroid::Add(const Notification& notification,
if (!icon_bitmap.isNull())
icon = gfx::ConvertToJavaBitmap(&icon_bitmap);
+ ScopedJavaLocalRef<jintArray> vibration_pattern =
+ base::android::ToJavaIntArray(env, notification.vibration_pattern());
+
Java_NotificationUIManager_displayNotification(
env,
java_object_.obj(),
@@ -139,6 +142,7 @@ void NotificationUIManagerAndroid::Add(const Notification& notification,
title.obj(),
body.obj(),
icon.obj(),
+ vibration_pattern.obj(),
notification.silent());
regenerated_notification_infos_[persistent_notification_id] =
diff --git a/chrome/browser/notifications/platform_notification_service_browsertest.cc b/chrome/browser/notifications/platform_notification_service_browsertest.cc
index 335e838..587f545 100644
--- a/chrome/browser/notifications/platform_notification_service_browsertest.cc
+++ b/chrome/browser/notifications/platform_notification_service_browsertest.cc
@@ -23,6 +23,7 @@
#include "content/public/test/browser_test_utils.h"
#include "net/base/filename_util.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
+#include "testing/gmock/include/gmock/gmock.h"
// -----------------------------------------------------------------------------
@@ -30,6 +31,8 @@
const int kIconWidth = 100;
const int kIconHeight = 100;
+const int kNotificationVibrationPattern[] = { 100, 200, 300 };
+
class PlatformNotificationServiceBrowserTest : public InProcessBrowserTest {
public:
PlatformNotificationServiceBrowserTest();
@@ -219,6 +222,28 @@ IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
}
IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
+ WebNotificationOptionsVibrationPattern) {
+ std::string script_result;
+
+ InfoBarResponder accepting_responder(GetInfoBarService(), true);
+ ASSERT_TRUE(RunScript("RequestPermission()", &script_result));
+ EXPECT_EQ("granted", script_result);
+
+ ASSERT_TRUE(RunScript("DisplayPersistentNotificationVibrate()",
+ &script_result));
+ EXPECT_EQ("ok", script_result);
+
+ ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+
+ const Notification& notification = ui_manager()->GetNotificationAt(0);
+ EXPECT_EQ("Title", base::UTF16ToUTF8(notification.title()));
+ EXPECT_EQ("Contents", base::UTF16ToUTF8(notification.message()));
+
+ EXPECT_THAT(notification.vibration_pattern(),
+ testing::ElementsAreArray(kNotificationVibrationPattern));
+}
+
+IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
CloseDisplayedPersistentNotification) {
std::string script_result;
diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc
index a2127fe..21baeb7 100644
--- a/chrome/browser/notifications/platform_notification_service_impl.cc
+++ b/chrome/browser/notifications/platform_notification_service_impl.cc
@@ -323,6 +323,7 @@ Notification PlatformNotificationServiceImpl::CreateNotificationFromData(
display_source, notification_data.tag, delegate);
notification.set_context_message(display_source);
+ notification.set_vibration_pattern(notification_data.vibration_pattern);
notification.set_silent(notification_data.silent);
// Web Notifications do not timeout.
diff --git a/chrome/browser/notifications/platform_notification_service_unittest.cc b/chrome/browser/notifications/platform_notification_service_unittest.cc
index 40a8eec..ee0e7c7 100644
--- a/chrome/browser/notifications/platform_notification_service_unittest.cc
+++ b/chrome/browser/notifications/platform_notification_service_unittest.cc
@@ -12,11 +12,14 @@
#include "content/public/browser/desktop_notification_delegate.h"
#include "content/public/common/platform_notification_data.h"
#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace {
+const int kNotificationVibrationPattern[] = { 100, 200, 300 };
+
#if !defined(OS_ANDROID)
const int64_t kPersistentNotificationId = 42;
#endif
@@ -157,9 +160,14 @@ TEST_F(PlatformNotificationServiceTest, PersistentNotificationDisplay) {
#endif // !defined(OS_ANDROID)
TEST_F(PlatformNotificationServiceTest, DisplayPageNotificationMatches) {
+ std::vector<int> vibration_pattern(
+ kNotificationVibrationPattern,
+ kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern));
+
content::PlatformNotificationData notification_data;
notification_data.title = base::ASCIIToUTF16("My notification's title");
notification_data.body = base::ASCIIToUTF16("Hello, world!");
+ notification_data.vibration_pattern = vibration_pattern;
notification_data.silent = true;
MockDesktopNotificationDelegate* delegate
@@ -179,6 +187,10 @@ TEST_F(PlatformNotificationServiceTest, DisplayPageNotificationMatches) {
base::UTF16ToUTF8(notification.title()));
EXPECT_EQ("Hello, world!",
base::UTF16ToUTF8(notification.message()));
+
+ EXPECT_THAT(notification.vibration_pattern(),
+ testing::ElementsAreArray(kNotificationVibrationPattern));
+
EXPECT_TRUE(notification.silent());
}
diff --git a/chrome/test/data/notifications/platform_notification_service.html b/chrome/test/data/notifications/platform_notification_service.html
index d0b4124..5d42c3c 100644
--- a/chrome/test/data/notifications/platform_notification_service.html
+++ b/chrome/test/data/notifications/platform_notification_service.html
@@ -61,6 +61,14 @@
});
}
+ // Displays a persistent notification with vibrate field.
+ function DisplayPersistentNotificationVibrate() {
+ DisplayPersistentNotification('Title', {
+ body: 'Contents',
+ vibrate: [100, 200, 300]
+ });
+ }
+
// Displays a persistent notification with a data: URL as its image.
function DisplayPersistentNotificationDataUrlImage() {
fetch('icon.png').then(function(response) {
diff --git a/content/browser/notifications/notification_database_data.proto b/content/browser/notifications/notification_database_data.proto
index 1fb6808..5d8fe20 100644
--- a/content/browser/notifications/notification_database_data.proto
+++ b/content/browser/notifications/notification_database_data.proto
@@ -21,7 +21,7 @@ message NotificationDatabaseDataProto {
// Actual data payload of the notification. This message is the protocol
// buffer meant to serialize the content::PlatformNotificationData structure.
//
- // Next tag: 8
+ // Next tag: 10
message NotificationData {
enum Direction {
LEFT_TO_RIGHT = 0;
@@ -34,6 +34,7 @@ message NotificationDatabaseDataProto {
optional string body = 4;
optional string tag = 5;
optional string icon = 6;
+ repeated int32 vibration_pattern = 9 [packed=true];
optional bool silent = 7;
optional bytes data = 8;
}
diff --git a/content/browser/notifications/notification_database_data_conversions.cc b/content/browser/notifications/notification_database_data_conversions.cc
index d656f7d..349b9c8 100644
--- a/content/browser/notifications/notification_database_data_conversions.cc
+++ b/content/browser/notifications/notification_database_data_conversions.cc
@@ -38,6 +38,13 @@ bool DeserializeNotificationDatabaseData(const std::string& input,
notification_data->body = base::UTF8ToUTF16(payload.body());
notification_data->tag = payload.tag();
notification_data->icon = GURL(payload.icon());
+
+ if (payload.vibration_pattern().size() > 0) {
+ notification_data->vibration_pattern.assign(
+ payload.vibration_pattern().begin(),
+ payload.vibration_pattern().end());
+ }
+
notification_data->silent = payload.silent();
if (payload.data().length()) {
@@ -67,6 +74,10 @@ bool SerializeNotificationDatabaseData(const NotificationDatabaseData& input,
payload->set_body(base::UTF16ToUTF8(notification_data.body));
payload->set_tag(notification_data.tag);
payload->set_icon(notification_data.icon.spec());
+
+ for (size_t i = 0; i < notification_data.vibration_pattern.size(); ++i)
+ payload->add_vibration_pattern(notification_data.vibration_pattern[i]);
+
payload->set_silent(notification_data.silent);
if (notification_data.data.size()) {
diff --git a/content/browser/notifications/notification_database_data_unittest.cc b/content/browser/notifications/notification_database_data_unittest.cc
index f57bfa8..2613108 100644
--- a/content/browser/notifications/notification_database_data_unittest.cc
+++ b/content/browser/notifications/notification_database_data_unittest.cc
@@ -6,6 +6,7 @@
#include "content/browser/notifications/notification_database_data.pb.h"
#include "content/browser/notifications/notification_database_data_conversions.h"
#include "content/public/browser/notification_database_data.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
@@ -19,9 +20,14 @@ const char kNotificationLang[] = "nl";
const char kNotificationBody[] = "Hello, world!";
const char kNotificationTag[] = "my_tag";
const char kNotificationIconUrl[] = "https://example.com/icon.png";
+const int kNotificationVibrationPattern[] = { 100, 200, 300 };
const unsigned char kNotificationData[] = { 0xdf, 0xff, 0x0, 0x0, 0xff, 0xdf };
TEST(NotificationDatabaseDataTest, SerializeAndDeserializeData) {
+ std::vector<int> vibration_pattern(
+ kNotificationVibrationPattern,
+ kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern));
+
std::vector<char> developer_data(
kNotificationData, kNotificationData + arraysize(kNotificationData));
@@ -33,6 +39,7 @@ TEST(NotificationDatabaseDataTest, SerializeAndDeserializeData) {
notification_data.body = base::ASCIIToUTF16(kNotificationBody);
notification_data.tag = kNotificationTag;
notification_data.icon = GURL(kNotificationIconUrl);
+ notification_data.vibration_pattern = vibration_pattern;
notification_data.silent = true;
notification_data.data = developer_data;
@@ -68,6 +75,10 @@ TEST(NotificationDatabaseDataTest, SerializeAndDeserializeData) {
EXPECT_EQ(notification_data.body, copied_notification_data.body);
EXPECT_EQ(notification_data.tag, copied_notification_data.tag);
EXPECT_EQ(notification_data.icon, copied_notification_data.icon);
+
+ EXPECT_THAT(copied_notification_data.vibration_pattern,
+ testing::ElementsAreArray(kNotificationVibrationPattern));
+
EXPECT_EQ(notification_data.silent, copied_notification_data.silent);
ASSERT_EQ(developer_data.size(), copied_notification_data.data.size());
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc
index 622fd1e..9b9d381 100644
--- a/content/browser/notifications/notification_message_filter.cc
+++ b/content/browser/notifications/notification_message_filter.cc
@@ -19,6 +19,26 @@
namespace content {
+namespace {
+
+const int kMinimumVibrationDurationMs = 1; // 1 millisecond
+const int kMaximumVibrationDurationMs = 10000; // 10 seconds
+
+PlatformNotificationData SanitizeNotificationData(
+ const PlatformNotificationData& notification_data) {
+ PlatformNotificationData sanitized_data = notification_data;
+
+ // Make sure that the vibration values are within reasonable bounds.
+ for (int& pattern : sanitized_data.vibration_pattern) {
+ pattern = std::min(kMaximumVibrationDurationMs,
+ std::max(kMinimumVibrationDurationMs, pattern));
+ }
+
+ return sanitized_data;
+}
+
+} // namespace
+
NotificationMessageFilter::NotificationMessageFilter(
int process_id,
PlatformNotificationContextImpl* notification_context,
@@ -101,7 +121,7 @@ void NotificationMessageFilter::OnShowPlatformNotification(
service->DisplayNotification(browser_context_,
origin,
icon,
- notification_data,
+ SanitizeNotificationData(notification_data),
delegate.Pass(),
&close_closure);
@@ -125,7 +145,10 @@ void NotificationMessageFilter::OnShowPersistentNotification(
NotificationDatabaseData database_data;
database_data.origin = origin;
database_data.service_worker_registration_id = service_worker_registration_id;
- database_data.notification_data = notification_data;
+
+ PlatformNotificationData sanitized_notification_data =
+ SanitizeNotificationData(notification_data);
+ database_data.notification_data = sanitized_notification_data;
// TODO(peter): Significantly reduce the amount of information we need to
// retain outside of the database for displaying notifications.
@@ -137,7 +160,7 @@ void NotificationMessageFilter::OnShowPersistentNotification(
request_id,
origin,
icon,
- notification_data));
+ sanitized_notification_data));
}
void NotificationMessageFilter::DidWritePersistentNotificationData(
diff --git a/content/child/notifications/notification_data_conversions.cc b/content/child/notifications/notification_data_conversions.cc
index 639e555..f5fe5bb 100644
--- a/content/child/notifications/notification_data_conversions.cc
+++ b/content/child/notifications/notification_data_conversions.cc
@@ -24,6 +24,8 @@ PlatformNotificationData ToPlatformNotificationData(
platform_data.body = web_data.body;
platform_data.tag = base::UTF16ToUTF8(web_data.tag);
platform_data.icon = GURL(web_data.icon.string());
+ platform_data.vibration_pattern.assign(web_data.vibrate.begin(),
+ web_data.vibrate.end());
platform_data.silent = web_data.silent;
platform_data.data.assign(web_data.data.begin(), web_data.data.end());
@@ -43,6 +45,7 @@ WebNotificationData ToWebNotificationData(
web_data.body = platform_data.body;
web_data.tag = blink::WebString::fromUTF8(platform_data.tag);
web_data.icon = blink::WebURL(platform_data.icon);
+ web_data.vibrate = platform_data.vibration_pattern;
web_data.silent = platform_data.silent;
web_data.data = platform_data.data;
diff --git a/content/child/notifications/notification_data_conversions_unittest.cc b/content/child/notifications/notification_data_conversions_unittest.cc
index daded25..c124e4f 100644
--- a/content/child/notifications/notification_data_conversions_unittest.cc
+++ b/content/child/notifications/notification_data_conversions_unittest.cc
@@ -8,6 +8,7 @@
#include "base/strings/utf_string_conversions.h"
#include "content/public/common/platform_notification_data.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebURL.h"
@@ -20,9 +21,14 @@ const char kNotificationLang[] = "nl";
const char kNotificationBody[] = "Hello, world!";
const char kNotificationTag[] = "my_tag";
const char kNotificationIconUrl[] = "https://example.com/icon.png";
+const int kNotificationVibrationPattern[] = { 100, 200, 300 };
const unsigned char kNotificationData[] = { 0xdf, 0xff, 0x0, 0x0, 0xff, 0xdf };
TEST(NotificationDataConversionsTest, ToPlatformNotificationData) {
+ std::vector<int> vibration_pattern(
+ kNotificationVibrationPattern,
+ kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern));
+
std::vector<char> developer_data(
kNotificationData, kNotificationData + arraysize(kNotificationData));
@@ -33,6 +39,7 @@ TEST(NotificationDataConversionsTest, ToPlatformNotificationData) {
blink::WebString::fromUTF8(kNotificationBody),
blink::WebString::fromUTF8(kNotificationTag),
blink::WebURL(GURL(kNotificationIconUrl)),
+ blink::WebVector<int>(vibration_pattern),
true /* silent */,
blink::WebVector<char>(developer_data));
@@ -46,6 +53,9 @@ TEST(NotificationDataConversionsTest, ToPlatformNotificationData) {
EXPECT_EQ(kNotificationIconUrl, platform_data.icon.spec());
EXPECT_TRUE(platform_data.silent);
+ EXPECT_THAT(platform_data.vibration_pattern,
+ testing::ElementsAreArray(kNotificationVibrationPattern));
+
ASSERT_EQ(developer_data.size(), platform_data.data.size());
for (size_t i = 0; i < developer_data.size(); ++i)
EXPECT_EQ(developer_data[i], platform_data.data[i]);
@@ -68,6 +78,10 @@ TEST(NotificationDataConversionsTest,
}
TEST(NotificationDataConversionsTest, ToWebNotificationData) {
+ std::vector<int> vibration_pattern(
+ kNotificationVibrationPattern,
+ kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern));
+
std::vector<char> developer_data(
kNotificationData, kNotificationData + arraysize(kNotificationData));
@@ -79,6 +93,7 @@ TEST(NotificationDataConversionsTest, ToWebNotificationData) {
platform_data.body = base::ASCIIToUTF16(kNotificationBody);
platform_data.tag = kNotificationTag;
platform_data.icon = GURL(kNotificationIconUrl);
+ platform_data.vibration_pattern = vibration_pattern;
platform_data.silent = true;
platform_data.data = developer_data;
@@ -90,6 +105,11 @@ TEST(NotificationDataConversionsTest, ToWebNotificationData) {
EXPECT_EQ(kNotificationBody, web_data.body);
EXPECT_EQ(kNotificationTag, web_data.tag);
EXPECT_EQ(kNotificationIconUrl, web_data.icon.string());
+
+ ASSERT_EQ(vibration_pattern.size(), web_data.vibrate.size());
+ for (size_t i = 0; i < vibration_pattern.size(); ++i)
+ EXPECT_EQ(vibration_pattern[i], web_data.vibrate[i]);
+
EXPECT_TRUE(web_data.silent);
ASSERT_EQ(developer_data.size(), web_data.data.size());
diff --git a/content/common/platform_notification_messages.h b/content/common/platform_notification_messages.h
index f21713f..009ff61 100644
--- a/content/common/platform_notification_messages.h
+++ b/content/common/platform_notification_messages.h
@@ -42,6 +42,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::PlatformNotificationData)
IPC_STRUCT_TRAITS_MEMBER(body)
IPC_STRUCT_TRAITS_MEMBER(tag)
IPC_STRUCT_TRAITS_MEMBER(icon)
+ IPC_STRUCT_TRAITS_MEMBER(vibration_pattern)
IPC_STRUCT_TRAITS_MEMBER(silent)
IPC_STRUCT_TRAITS_MEMBER(data)
IPC_STRUCT_TRAITS_END()
diff --git a/content/public/common/platform_notification_data.h b/content/public/common/platform_notification_data.h
index 5b608c0..40bd98d 100644
--- a/content/public/common/platform_notification_data.h
+++ b/content/public/common/platform_notification_data.h
@@ -51,6 +51,10 @@ struct CONTENT_EXPORT PlatformNotificationData {
// URL of the icon which is to be displayed with the notification.
GURL icon;
+ // Vibration pattern for the notification, following the syntax of the
+ // Vibration API. https://www.w3.org/TR/vibration/
+ std::vector<int> vibration_pattern;
+
// Whether default notification indicators (sound, vibration, light) should
// be suppressed.
bool silent = false;
diff --git a/ui/message_center/notification.cc b/ui/message_center/notification.cc
index 6056620..6633a01 100644
--- a/ui/message_center/notification.cc
+++ b/ui/message_center/notification.cc
@@ -46,6 +46,7 @@ RichNotificationData::RichNotificationData(const RichNotificationData& other)
should_make_spoken_feedback_for_popup_updates(
other.should_make_spoken_feedback_for_popup_updates),
clickable(other.clickable),
+ vibration_pattern(other.vibration_pattern),
silent(other.silent) {}
RichNotificationData::~RichNotificationData() {}
diff --git a/ui/message_center/notification.h b/ui/message_center/notification.h
index 060cdda..122cd67 100644
--- a/ui/message_center/notification.h
+++ b/ui/message_center/notification.h
@@ -50,6 +50,7 @@ class MESSAGE_CENTER_EXPORT RichNotificationData {
std::vector<ButtonInfo> buttons;
bool should_make_spoken_feedback_for_popup_updates;
bool clickable;
+ std::vector<int> vibration_pattern;
bool silent;
};
@@ -104,6 +105,15 @@ class MESSAGE_CENTER_EXPORT Notification {
int priority() const { return optional_fields_.priority; }
void set_priority(int priority) { optional_fields_.priority = priority; }
+ // This vibration_pattern property currently has no effect on
+ // non-Android platforms.
+ const std::vector<int>& vibration_pattern() const {
+ return optional_fields_.vibration_pattern;
+ }
+ void set_vibration_pattern(const std::vector<int>& vibration_pattern) {
+ optional_fields_.vibration_pattern = vibration_pattern;
+ }
+
// This property currently has no effect on non-Android platforms.
bool silent() const { return optional_fields_.silent; }
void set_silent(bool silent) { optional_fields_.silent = silent; }