Index: third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html |
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..df51d47983be42dc6bfa12223d822098935cba81 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/push-subscription-options.html |
@@ -0,0 +1,146 @@ |
+<!DOCTYPE html> |
+<html> |
+ <head> |
+ <title>PushSubscriptionOptions should be correctly reflected on PushSubscription objects</title> |
+ <link rel="manifest" href="resources/push_manifest.json"> |
+ <script src="../resources/testharness.js"></script> |
+ <script src="../resources/testharnessreport.js"></script> |
+ <script src="../serviceworker/resources/test-helpers.js"></script> |
+ </head> |
+ <body> |
+ <script> |
+ // When running this test manually, grant permission when prompted. |
+ if (window.testRunner) |
+ testRunner.setPermission('push-messaging', 'granted', location.origin, location.origin); |
+ |
+ function assert_options_equals(actual_subscription, expected_options, description) { |
+ |
+ // PushSubscription should have: |
+ // [SameObject] readonly attribute PushSubscriptionOptions options; |
+ assert_true(actual_subscription instanceof window.PushSubscription, |
Peter Beverloo
2016/07/08 18:30:12
nit: why do you prefix these types with `window`?
johnme
2016/07/13 17:51:57
Done.
|
+ description + ": instanceof PushSubscription"); |
+ assert_inherits(actual_subscription, 'options', description); |
+ assert_readonly(actual_subscription, 'options', description); |
+ assert_equals(actual_subscription.options, actual_subscription.options, |
+ description + ": options [SameObject]"); |
+ var actual_options = actual_subscription.options; |
+ |
+ // PushSubscriptionOptions should have: |
+ // readonly attribute boolean userVisibleOnly; |
+ // [SameObject] readonly attribute ArrayBuffer? applicationServerKey; |
+ assert_true(actual_options instanceof window.PushSubscriptionOptions, |
+ description + ": options instanceof PushSubscriptionOptions"); |
+ assert_inherits(actual_options, 'userVisibleOnly', description); |
+ assert_inherits(actual_options, 'applicationServerKey', description); |
+ assert_readonly(actual_options, 'userVisibleOnly', description); |
+ assert_readonly(actual_options, 'applicationServerKey', description); |
+ assert_equals(actual_options.applicationServerKey, actual_options.applicationServerKey, |
+ description + ": applicationServerKey [SameObject]"); |
+ |
+ // PushSubscriptionOptions should match expected_options. |
+ assert_equals(actual_options.userVisibleOnly, expected_options.userVisibleOnly, |
+ description + ": userVisibleOnly"); |
+ if (!expected_options.applicationServerKey) { |
+ assert_equals(actual_options.applicationServerKey, null, |
+ description + ": applicationServerKey"); |
+ } else { |
+ assert_true(actual_options.applicationServerKey instanceof window.ArrayBuffer, |
+ description + ": applicationServerKey instanceof window.ArrayBuffer"); |
Peter Beverloo
2016/07/08 18:30:12
nit: alignment
johnme
2016/07/13 17:51:57
Done.
|
+ var actual_bytes = new Uint8Array(actual_options.applicationServerKey); |
+ var expected_bytes = new Uint8Array(expected_options.applicationServerKey); |
+ assert_equals(actual_bytes.byteLength, expected_bytes.byteLength, |
+ description + ": applicationServerKey byteLength"); |
+ for (var i = 0; i < expected_bytes.byteLength; i++) { |
+ assert_equals(actual_bytes[i], expected_bytes[i], |
+ description + ": applicationServerKey[" + i + "]"); |
+ } |
+ |
+ // The applicationServerKey is actually mutable, for good or |
+ // for bad (https://github.com/w3c/push-api/issues/198). |
Peter Beverloo
2016/07/08 18:30:12
no need to imply judgement calls in our code :)
johnme
2016/07/13 17:51:57
Done.
|
+ new Uint8Array(actual_options.applicationServerKey)[0] = 0x7F; |
+ assert_equals(new Uint8Array(actual_subscription.options.applicationServerKey)[0], 0x7F, |
+ description + ": applicationServerKey mutable"); |
+ } |
+ } |
+ |
+ const PUBLIC_KEY = [ |
+ 0x04, 0x56, 0x23, 0xC0, 0x45, 0xD7, 0x6C, 0x5D, 0x45, 0x1A, 0x29, |
+ 0x19, 0xAA, 0xE5, 0x02, 0x2F, 0x43, 0x55, 0xC2, 0x5C, 0x59, 0x86, |
+ 0x69, 0xA0, 0xAD, 0xD7, 0x2D, 0x54, 0x22, 0xD8, 0x43, 0xB6, 0xCD, |
+ 0xE3, 0x33, 0xB4, 0xBB, 0x66, 0x2F, 0x47, 0xE5, 0xE6, 0x20, 0xFF, |
+ 0x0E, 0x10, 0x7F, 0xCD, 0xA3, 0x44, 0x8C, 0x65, 0x54, 0x64, 0x7E, |
+ 0x25, 0xF3, 0x67, 0xF4, 0x7C, 0x4B, 0x0C, 0xBD, 0xCF, 0xF4 |
+ ]; |
+ var VAPID_OPTIONS = { |
Peter Beverloo
2016/07/08 18:30:12
const as you use on :66? Same on :78 and :83
johnme
2016/07/13 17:51:57
Done.
|
+ userVisibleOnly: true, |
+ applicationServerKey: new Uint8Array(PUBLIC_KEY) |
+ }; |
+ var SENDER_ID_OPTIONS = { |
+ userVisibleOnly: true, |
+ // This is equal to the gcm_sender_id in push_manifest.json |
+ applicationServerKey: new TextEncoder().encode('1234567890') |
+ }; |
+ var MANIFEST_OPTIONS = { |
+ userVisibleOnly: true |
+ }; |
+ |
+ // This test verifies that PushSubscriptionOptions is correctly |
+ // reflected on PushSubscription objects. |
+ promise_test(test => { |
+ var workerScript = 'resources/instrumentation-service-worker.js'; |
+ var workerScope = 'resources/scope/' + location.pathname; |
+ var pushManager; |
+ |
+ return service_worker_unregister_and_register(test, workerScript, workerScope) |
+ .then(serviceWorkerRegistration => { |
+ pushManager = serviceWorkerRegistration.pushManager; |
+ return wait_for_state(test, serviceWorkerRegistration.installing, 'activated'); |
+ }).then(() => { |
+ |
+ // 1. Test subscription with SENDER_ID_OPTIONS. |
+ // -------------------------------------------. |
+ return pushManager.subscribe(SENDER_ID_OPTIONS); |
+ }).then(pushSubscription => { |
+ assert_options_equals(pushSubscription, SENDER_ID_OPTIONS, |
+ "subscribe with SENDER_ID_OPTIONS"); |
+ return pushManager.getSubscription(); |
+ }).then(pushSubscription => { |
+ assert_options_equals(pushSubscription, SENDER_ID_OPTIONS, |
+ "getSubscription with SENDER_ID_OPTIONS"); |
+ return pushSubscription.unsubscribe(); |
+ }).then(unsubscribed => { |
+ assert_true(unsubscribed, "unsubscribed (with SENDER_ID_OPTIONS)"); |
+ |
+ // 2. Test subscription with VAPID_OPTIONS. |
+ // ---------------------------------------- |
+ return pushManager.subscribe(VAPID_OPTIONS); |
+ }).then(pushSubscription => { |
+ assert_options_equals(pushSubscription, VAPID_OPTIONS, |
+ "subscribe with VAPID_OPTIONS"); |
+ return pushManager.getSubscription(); |
+ }).then(pushSubscription => { |
+ assert_options_equals(pushSubscription, VAPID_OPTIONS, |
+ "getSubscription with VAPID_OPTIONS"); |
+ return pushSubscription.unsubscribe(); |
+ }).then(unsubscribed => { |
+ assert_true(unsubscribed, "unsubscribed (with VAPID_OPTIONS)"); |
+ |
+ // 3. Test subscription with MANIFEST_OPTIONS. |
+ // ------------------------------------------- |
+ return pushManager.subscribe(MANIFEST_OPTIONS); |
+ }).then(pushSubscription => { |
+ // Since MANIFEST_OPTIONS passed to subscribe has no |
+ // applicationServerKey, the sender ID from the manifest |
+ // should be reflected in the PushSubscriptionOptions. |
+ assert_options_equals(pushSubscription, SENDER_ID_OPTIONS, |
+ "subscribe with MANIFEST_OPTIONS"); |
+ return pushManager.getSubscription(); |
+ }).then(pushSubscription => { |
+ assert_options_equals(pushSubscription, SENDER_ID_OPTIONS, |
+ "getSubscription with MANIFEST_OPTIONS"); |
+ }); |
+ |
+ }, "PushSubscriptionOptions should be correctly reflected on PushSubscription objects"); |
+ </script> |
+ </body> |
+ </html> |
Peter Beverloo
2016/07/08 18:30:12
nit: -2 indent
johnme
2016/07/13 17:51:57
Done.
|