text: (function() {
      var pending_set_permission_resolver = null;
      var shared_worker_port = null;
  
      set_pending_permission_resolver = function(value) {
          pending_set_permission_resolver = value;
      };
  
      run_pending_permission_resolver = function() {
          pending_set_permission_resolver();
          pending_set_permission_resolver = null;
      };
  
      send_from_shared_worker = function(message) {
          wait_for_port = function() {
              if (!shared_worker_port) {
                  setTimeout(wait_for_port);
                  return;
              }
              shared_worker_port.postMessage(message);
          };
          wait_for_port();
      };
  
      send_from_service_worker = function(message) {
          wait_for_activation = function() {
              if (!self.registration.active ||
                  self.registration.active.state != 'activated') {
                  setTimeout(wait_for_activation);
                  return;
              }
  
              self.clients.claim();
              self.clients.matchAll({ includeUncontrolled: true }).then(function(c) {
                  c[0].postMessage(message);
              });
          };
          wait_for_activation();
      };
  
      window_message_handler = function (message) {
          if (message.data.name != 'setPermission')
              return;
          testRunner.setPermission(message.data.permission,
                                   message.data.status,
                                   message.data.origin,
                                   message.data.embedding_origin);
  
          this.postMessage('setPermission_ACK');
      };
  
      // Setup message handlers.
      switch (get_current_scope()) {
          case 'Window':
              window.addEventListener('message', function(message) {
                  testRunner.setPermission(message.data.permission,
                                           message.data.status,
                                           message.data.origin,
                                           message.data.embedding_origin);
  
                  navigator.serviceWorker.getRegistration(get_script_href()).then(function(registration) {
                      registration.active.postMessage('setPermission_ACK');
                  });
              });
              break;
          case 'DedicatedWorker':
              self.addEventListener('message', function(message) {
                  if (message.data != 'setPermission_ACK')
                      return;
                  if (pending_set_permission_resolver)
                      run_pending_permission_resolver();
              });
              break;
          case 'SharedWorker':
              self.addEventListener('connect', function(e) {
                  shared_worker_port = e.ports[0];
                  shared_worker_port.addEventListener('message', function(message) {
                      if (message.data != 'setPermission_ACK')
                          return;
                      if (pending_set_permission_resolver)
                          run_pending_permission_resolver();
                  });
                  shared_worker_port.start();
              });
              break;
          case 'ServiceWorker':
              self.skipWaiting();
              self.addEventListener('message', function(message) {
                  if (message.data != 'setPermission_ACK')
                      return;
                  if (pending_set_permission_resolver)
                      run_pending_permission_resolver();
              });
              break;
      }
  })();
  
  function setPermission(permission, status, origin, embedding_origin) {
      var promise = new Promise(function(resolver) {
          set_pending_permission_resolver(resolver);
      });
  
      switch (get_current_scope()) {
          case 'Window':
              testRunner.setPermission(permission, status, origin, embedding_origin);
              run_pending_permission_resolver();
              return promise;
          case 'DedicatedWorker':
              self.postMessage({ name: 'setPermission',
                                 permission: permission,
                                 status: status,
                                 origin: origin,
                                 embedding_origin: embedding_origin });
              return promise;
          case 'SharedWorker':
              send_from_shared_worker({ name: 'setPermission',
                                        permission: permission,
                                        status: status,
                                        origin: origin,
                                        embedding_origin: embedding_origin });
              return promise;
          case 'ServiceWorker':
              send_from_service_worker({ name: 'setPermission',
                                         permission: permission,
                                         status: status,
                                         origin: origin,
                                         embedding_origin: embedding_origin });
              return promise;
      }
  
      throw new Error('unknown scope');
  }
  