[sensor] Set permissions in WPT tests

Thanks to the new set_permission method on test_runner, this CL
makes sure the sensor WPT tests with first granted permission and
adds tests for sensor permission status.

Change-Id: Id72e60f92043986c3fe3517faf0c79716a1f03c8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2104654
Reviewed-by: Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Commit-Queue: Wanming Lin <wanming.lin@intel.com>
Cr-Commit-Position: refs/heads/master@{#751207}
diff --git a/generic-sensor/generic-sensor-permission.https.html b/generic-sensor/generic-sensor-permission.https.html
new file mode 100644
index 0000000..a86ed5d
--- /dev/null
+++ b/generic-sensor/generic-sensor-permission.https.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>sensor: permission</title>
+<link rel="help" href="https://w3c.github.io/sensors/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script>
+
+"use strict";
+
+for (const entry of ['accelerometer', 'gyroscope',
+    'magnetometer', 'ambient-light-sensor']) {
+  promise_test(async t => {
+    await test_driver.set_permission({ name: entry }, 'denied', false);
+
+    const status = await navigator.permissions.query({ name: entry });
+    assert_class_string(status, "PermissionStatus");
+    assert_equals(status.state, "denied");
+  }, `Deny ${entry} permission should work.`);
+
+  promise_test(async t => {
+    await test_driver.set_permission({ name: entry }, 'granted', false);
+
+    const status = await navigator.permissions.query({ name: entry });
+    assert_class_string(status, "PermissionStatus");
+    assert_equals(status.state, "granted");
+  }, `Grant ${entry} permission should work.`);
+};
+
+</script>
\ No newline at end of file
diff --git a/generic-sensor/resources/generic-sensor-helpers.js b/generic-sensor/resources/generic-sensor-helpers.js
index afc2fad..ad11e58 100644
--- a/generic-sensor/resources/generic-sensor-helpers.js
+++ b/generic-sensor/resources/generic-sensor-helpers.js
@@ -20,6 +20,8 @@
     '/gen/mojo/public/mojom/base/string16.mojom.js',
     '/gen/services/device/public/mojom/sensor.mojom.js',
     '/gen/services/device/public/mojom/sensor_provider.mojom.js',
+    '/resources/testdriver.js',
+    '/resources/testdriver-vendor.js',
     '/resources/chromium/generic_sensor_mocks.js',
   ];
 
diff --git a/resources/chromium/generic_sensor_mocks.js b/resources/chromium/generic_sensor_mocks.js
index ac6043d..8f13420 100644
--- a/resources/chromium/generic_sensor_mocks.js
+++ b/resources/chromium/generic_sensor_mocks.js
@@ -309,18 +309,15 @@
       Object.freeze(this); // Make it immutable.
     }
 
-    initialize() {
+    async initialize() {
       if (testInternal.initialized)
         throw new Error('Call reset() before initialize().');
 
-      if (window.testRunner) {
-        // Grant sensor permissions for Chromium testrunner.
-        ['accelerometer', 'gyroscope',
-         'magnetometer', 'ambient-light-sensor'].forEach((entry) => {
-          window.testRunner.setPermission(entry, 'granted',
-                                          location.origin, location.origin);
-        });
-      }
+      // Grant sensor permissions for Chromium testdriver.
+      for (const entry of ['accelerometer', 'gyroscope',
+          'magnetometer', 'ambient-light-sensor']) {
+        await test_driver.set_permission({ name: entry }, 'granted', false);
+      };
 
       testInternal.sensorProvider = new MockSensorProvider;
       testInternal.initialized = true;