chromium/third_party/blink/web_tests/http/tests/notifications/serviceworker-notificationclick-event-action-reflection.html

<!doctype html>
<html>
  <head>
    <title>Notifications: Action reflection in the "notificationclick" event.</title>
    <script src="../resources/testharness.js"></script>
    <script src="../resources/testharnessreport.js"></script>
    <script src="../serviceworker/resources/test-helpers.js"></script>
    <script src="resources/test-helpers.js"></script>
  </head>
  <body>
    <script>
      // Tests that the action property of the "notificationclick" event in the
      // Service Worker accurately reflects which action was activated, if any.

      async_test(function(test) {
          var scope = 'resources/scope/' + location.pathname;
          var script = 'instrumentation-service-worker.js';
          var port;

          var options = {
              actions: []
          };

          var expectedActions = [];
          for (var i = 0; i < Notification.maxActions; ++i) {
              var action = { action: 'action' + i, title: 'Action ' + i };
              options.actions.push(action);
              expectedActions.push(action.action);
          }
          // Expect empty string when main body of notification is activated.
          expectedActions.push('');

          testRunner.setPermission('notifications', 'granted', location.origin, location.origin);
          getActiveServiceWorkerWithMessagePort(test, script, scope).then(function(info) {
              port = info.port;
              // (1) Tell the Service Worker to display a Web Notification.
              return sendCommand(port, {
                  command: 'show',

                  title: scope,
                  options: options
              });
          }).then(function(data) {
              // (2) Confirm that the service worker displayed the notification successfully.
              assert_true(data.success, 'The notification must have been displayed.');

              // (3) Simulate a click on each button and on the notification body.
              for (var i = 0; i < options.actions.length; ++i)
                  testRunner.simulateWebNotificationClick(scope, i);
              testRunner.simulateWebNotificationClick(scope);

              port.addEventListener('message', function(event) {
                  // (4) Listen for confirmation from the Service Worker that the
                  // notification has been clicked on. Make sure that the action
                  // property set on the NotificationEvent object is as expected.
                  assert_equals(event.data.command, 'click', 'The notification was expected to be clicked.');

                  assert_equals(event.data.action, expectedActions.shift());

                  if (expectedActions.length === 0)
                      test.done();
              });
          }).catch(unreached_rejection(test));

      }, 'NotificationEvent action property should be reflect which action was clicked.');
    </script>
  </body>
</html>