Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: third_party/WebKit/LayoutTests/sensor/resources/sensor-helpers.js

Issue 2458453002: [sensors] Add Permission guard to the generic sensor apis.
Patch Set: rebase + blink reformat Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/sensor/resources/sensor-helpers.js
diff --git a/third_party/WebKit/LayoutTests/sensor/resources/sensor-helpers.js b/third_party/WebKit/LayoutTests/sensor/resources/sensor-helpers.js
index 0a9949d26e1f72f5fcb9de4d1215d88e5b728ace..8e1709d01ac8638427faa10792cf0f9316042e4c 100644
--- a/third_party/WebKit/LayoutTests/sensor/resources/sensor-helpers.js
+++ b/third_party/WebKit/LayoutTests/sensor/resources/sensor-helpers.js
@@ -18,260 +18,330 @@ class CallbackWrapper {
}
function sensor_mocks(mojo) {
- return define('Generic Sensor API mocks', [
- 'mojo/public/js/core',
- 'mojo/public/js/bindings',
- 'device/generic_sensor/public/interfaces/sensor_provider.mojom',
- 'device/generic_sensor/public/interfaces/sensor.mojom',
- ], (core, bindings, sensor_provider, sensor) => {
-
- // Helper function that returns resolved promise with result.
- function sensorResponse(success) {
- return Promise.resolve({success});
- }
-
- // Class that mocks Sensor interface defined in sensor.mojom
- class MockSensor {
- constructor(sensorRequest, handle, offset, size, reportingMode) {
- this.client_ = null;
- this.start_should_fail_ = false;
- this.reporting_mode_ = reportingMode;
- this.sensor_reading_timer_id_ = null;
- this.update_reading_function_ = null;
- this.reading_updates_count_ = 0;
- this.suspend_called_ = null;
- this.resume_called_ = null;
- this.add_configuration_called_ = null;
- this.remove_configuration_called_ = null;
- this.active_sensor_configurations_ = [];
- let rv = core.mapBuffer(handle, offset, size,
- core.MAP_BUFFER_FLAG_NONE);
- assert_equals(rv.result, core.RESULT_OK, "Failed to map shared buffer");
- this.buffer_array_ = rv.buffer;
- this.buffer_ = new Float64Array(this.buffer_array_);
- this.resetBuffer();
- this.binding_ = new bindings.Binding(sensor.Sensor, this,
- sensorRequest);
- this.binding_.setConnectionErrorHandler(() => {
- this.reset();
- });
- }
-
- // Returns default configuration.
- getDefaultConfiguration() {
- return Promise.resolve({frequency: 5});
- }
-
- reading_updates_count() {
- return this.reading_updates_count_;
- }
- // Adds configuration for the sensor and starts reporting fake data
- // through update_reading_function_ callback.
- addConfiguration(configuration) {
- assert_not_equals(configuration, null, "Invalid sensor configuration.");
-
- this.active_sensor_configurations_.push(configuration);
- // Sort using descending order.
- this.active_sensor_configurations_.sort(
- (first, second) => { return second.frequency - first.frequency });
-
- if (!this.start_should_fail_ )
- this.startReading();
-
- if (this.add_configuration_called_ != null)
- this.add_configuration_called_(this);
-
- return sensorResponse(!this.start_should_fail_);
- }
-
- // Removes sensor configuration from the list of active configurations and
- // stops notification about sensor reading changes if
- // active_sensor_configurations_ is empty.
- removeConfiguration(configuration) {
- if (this.remove_configuration_called_ != null) {
- this.remove_configuration_called_(this);
- }
-
- let index = this.active_sensor_configurations_.indexOf(configuration);
- if (index !== -1) {
- this.active_sensor_configurations_.splice(index, 1);
- } else {
- return sensorResponse(false);
- }
-
- if (this.active_sensor_configurations_.length === 0)
- this.stopReading();
-
- return sensorResponse(true);
- }
-
- // Suspends sensor.
- suspend() {
- this.stopReading();
- if (this.suspend_called_ != null) {
- this.suspend_called_(this);
- }
- }
-
- // Resumes sensor.
- resume() {
- assert_equals(this.sensor_reading_timer_id_, null);
- this.startReading();
- if (this.resume_called_ != null) {
- this.resume_called_(this);
- }
- }
-
- // Mock functions
-
- // Resets mock Sensor state.
- reset() {
- this.stopReading();
-
- this.reading_updates_count_ = 0;
- this.start_should_fail_ = false;
- this.update_reading_function_ = null;
- this.active_sensor_configurations_ = [];
- this.suspend_called_ = null;
- this.resume_called_ = null;
- this.add_configuration_called_ = null;
- this.remove_configuration_called_ = null;
- this.resetBuffer();
- core.unmapBuffer(this.buffer_array_);
- this.buffer_array_ = null;
- this.binding_.close();
- }
-
- // Zeroes shared buffer.
- resetBuffer() {
- for (let i = 0; i < this.buffer_.length; ++i) {
- this.buffer_[i] = 0;
- }
- }
-
- // Sets callback that is used to deliver sensor reading updates.
- setUpdateSensorReadingFunction(update_reading_function) {
- this.update_reading_function_ = update_reading_function;
- return Promise.resolve(this);
- }
-
- // Sets flag that forces sensor to fail when addConfiguration is invoked.
- setStartShouldFail(should_fail) {
- this.start_should_fail_ = should_fail;
- }
-
- // Returns resolved promise if suspend() was called, rejected otherwise.
- suspendCalled() {
- return new Promise((resolve, reject) => {
- this.suspend_called_ = resolve;
- });
- }
+ return define(
+ 'Generic Sensor API mocks',
+ [
+ 'mojo/public/js/core',
+ 'mojo/public/js/bindings',
+ 'device/generic_sensor/public/interfaces/sensor_provider.mojom',
+ 'device/generic_sensor/public/interfaces/sensor.mojom',
+ 'third_party/WebKit/public/platform/modules/permissions/permission.mojom',
+ 'third_party/WebKit/public/platform/modules/permissions/permission_status.mojom',
+ ],
+ (core, bindings, sensor_provider, sensor, permission,
+ permissionStatus) => {
+
+ // Helper function that returns resolved promise with result.
+ function sensorResponse(success) { return Promise.resolve({success}); }
+
+ class MockPermissionService {
+ constructor() {
+ this.permissionStatus_ = permissionStatus.PermissionStatus.ASK;
+ this.pendingPermissionRequest_ = null;
+ this.rejectPermissionConnections_ = false;
+ this.binding_ =
+ new bindings.Binding(permission.PermissionService, this);
+ }
+
+ // Binds object to mojo message pipe
+ bindToPipe(pipe) {
+ this.binding_.bind(pipe);
+ this.binding_.setConnectionErrorHandler(() => { this.reset(); });
+ }
+
+ // Resets state of MockPermissionService between test runs.
+ reset() {
+ this.permissionStatus_ = permissionStatus.PermissionStatus.ASK;
+ this.binding_.close();
+ }
+
+ requestPermission(permissionDescriptor) {
+ if (permissionDescriptor.name != permission.PermissionName.SENSORS)
+ return Promise.resolve(permissionStatus.PermissionStatus.DENIED);
+
+ return new Promise(resolve => {
+ if (this.pendingPermissionRequest_)
+ this.pendingPermissionRequest_(
+ permissionStatus.PermissionStatus.ASK);
+ this.pendingPermissionRequest_ = resolve;
+ this.runPermissionCallback_();
+ });
+ }
+
+ runPermissionCallback_() {
+ if (this.permissionStatus_ ==
+ permissionStatus.PermissionStatus.ASK ||
+ !this.pendingPermissionRequest_)
+ return;
+
+ this.pendingPermissionRequest_({status: this.permissionStatus_});
+ this.permissionStatus_ = permissionStatus.PermissionStatus.ASK;
+ this.pendingPermissionRequest_ = null;
+ }
+
+ setSensorPermission(allowed) {
+ this.permissionStatus_ = allowed ?
+ permissionStatus.PermissionStatus.GRANTED :
+ permissionStatus.PermissionStatus.DENIED;
+ this.runPermissionCallback_();
+ }
+
+ rejectPermissionConnections() {
+ this.rejectPermissionConnections_ = true;
+ }
+
+ } // End of MockPermissionService
+
+ // Class that mocks Sensor interface defined in sensor.mojom
+ class MockSensor {
+ constructor(sensorRequest, handle, offset, size, reportingMode) {
+ this.client_ = null;
+ this.expects_modified_reading_ = false;
+ this.start_should_fail_ = false;
+ this.reporting_mode_ = reportingMode;
+ this.sensor_reading_timer_id_ = null;
+ this.update_reading_function_ = null;
+ this.reading_updates_count_ = 0;
+ this.suspend_called_ = null;
+ this.resume_called_ = null;
+ this.add_configuration_called_ = null;
+ this.remove_configuration_called_ = null;
+ this.active_sensor_configurations_ = [];
+ let rv =
+ core.mapBuffer(handle, offset, size, core.MAP_BUFFER_FLAG_NONE);
+ assert_equals(
+ rv.result, core.RESULT_OK, 'Failed to map shared buffer');
+ this.buffer_array_ = rv.buffer;
+ this.buffer_ = new Float64Array(this.buffer_array_);
+ this.resetBuffer();
+ this.binding_ =
+ new bindings.Binding(sensor.Sensor, this, sensorRequest);
+ this.binding_.setConnectionErrorHandler(() => { this.reset(); });
+ }
+
+ // Returns default configuration.
+ getDefaultConfiguration() { return Promise.resolve({frequency: 5}); }
+
+ reading_updates_count() { return this.reading_updates_count_; }
+ // Adds configuration for the sensor and starts reporting fake data
+ // through update_reading_function_ callback.
+ addConfiguration(configuration) {
+ assert_not_equals(
+ configuration, null, 'Invalid sensor configuration.');
+
+ this.active_sensor_configurations_.push(configuration);
+ // Sort using descending order.
+ this.active_sensor_configurations_.sort(
+ (first, second) => {return second.frequency - first.frequency});
+
+ if (!this.start_should_fail_)
+ this.startReading();
+
+ if (this.add_configuration_called_ != null)
+ this.add_configuration_called_(this);
+
+ return sensorResponse(!this.start_should_fail_);
+ }
+
+ // Removes sensor configuration from the list of active configurations
+ // and
+ // stops notification about sensor reading changes if
+ // active_sensor_configurations_ is empty.
+ removeConfiguration(configuration) {
+ if (this.remove_configuration_called_ != null) {
+ this.remove_configuration_called_(this);
+ }
- // Returns resolved promise if resume() was called, rejected otherwise.
- resumeCalled() {
- return new Promise((resolve, reject) => {
- this.resume_called_ = resolve;
- });
- }
+ let index =
+ this.active_sensor_configurations_.indexOf(configuration);
+ if (index !== -1) {
+ this.active_sensor_configurations_.splice(index, 1);
+ } else {
+ return sensorResponse(false);
+ }
- // Resolves promise when addConfiguration() is called.
- addConfigurationCalled() {
- return new Promise((resolve, reject) => {
- this.add_configuration_called_ = resolve;
- });
- }
+ if (this.active_sensor_configurations_.length === 0)
+ this.stopReading();
- // Resolves promise when removeConfiguration() is called.
- removeConfigurationCalled() {
- return new Promise((resolve, reject) => {
- this.remove_configuration_called_ = resolve;
- });
- }
+ return sensorResponse(true);
+ }
- startReading() {
- if (this.update_reading_function_ != null) {
- this.stopReading();
- let max_frequency_used =
- this.active_sensor_configurations_[0].frequency;
- let timeout = (1 / max_frequency_used) * 1000;
- this.sensor_reading_timer_id_ = window.setInterval(() => {
- if (this.update_reading_function_) {
- this.update_reading_function_(this.buffer_);
- this.reading_updates_count_++;
+ // Suspends sensor.
+ suspend() {
+ this.stopReading();
+ if (this.suspend_called_ != null) {
+ this.suspend_called_(this);
}
- if (this.reporting_mode_ === sensor.ReportingMode.ON_CHANGE) {
- this.client_.sensorReadingChanged();
+ }
+
+ // Resumes sensor.
+ resume() {
+ assert_equals(this.sensor_reading_timer_id_, null);
+ this.startReading();
+ if (this.resume_called_ != null) {
+ this.resume_called_(this);
}
- }, timeout);
- }
- }
+ }
+
+ // Mock functions
+
+ // Resets mock Sensor state.
+ reset() {
+ this.stopReading();
+
+ this.expects_modified_reading_ = false;
+ this.reading_updates_count_ = 0;
+ this.start_should_fail_ = false;
+ this.update_reading_function_ = null;
+ this.active_sensor_configurations_ = [];
+ this.suspend_called_ = null;
+ this.resume_called_ = null;
+ this.add_configuration_called_ = null;
+ this.remove_configuration_called_ = null;
+ this.resetBuffer();
+ core.unmapBuffer(this.buffer_array_);
+ this.buffer_array_ = null;
+ this.binding_.close();
+ }
+
+ // Zeroes shared buffer.
+ resetBuffer() {
+ for (let i = 0; i < this.buffer_.length; ++i) {
+ this.buffer_[i] = 0;
+ }
+ }
+
+ // Sets callback that is used to deliver sensor reading updates.
+ setUpdateSensorReadingFunction(update_reading_function) {
+ this.update_reading_function_ = update_reading_function;
+ return Promise.resolve(this);
+ }
+
+ // Sets flag that forces sensor to fail when addConfiguration is
+ // invoked.
+ setStartShouldFail(should_fail) {
+ this.start_should_fail_ = should_fail;
+ }
+
+ // Sets flags that asks for a modified reading values at each
+ // iteration
+ // to initiate 'onchange' event broadcasting.
+ setExpectsModifiedReading(expects_modified_reading) {
+ this.expects_modified_reading_ = expects_modified_reading;
+ }
+
+ // Returns resolved promise if suspend() was called, rejected
+ // otherwise.
+ suspendCalled() {
+ return new Promise(
+ (resolve, reject) => { this.suspend_called_ = resolve; });
+ }
+
+ // Returns resolved promise if resume() was called, rejected
+ // otherwise.
+ resumeCalled() {
+ return new Promise(
+ (resolve, reject) => { this.resume_called_ = resolve; });
+ }
+
+ // Resolves promise when addConfiguration() is called.
+ addConfigurationCalled() {
+ return new Promise((resolve, reject) => {
+ this.add_configuration_called_ = resolve;
+ });
+ }
+
+ // Resolves promise when removeConfiguration() is called.
+ removeConfigurationCalled() {
+ return new Promise((resolve, reject) => {
+ this.remove_configuration_called_ = resolve;
+ });
+ }
+
+ startReading() {
+ if (this.update_reading_function_ != null) {
+ this.stopReading();
+ let max_frequency_used =
+ this.active_sensor_configurations_[0].frequency;
+ let timeout = (1 / max_frequency_used) * 1000;
+ this.sensor_reading_timer_id_ = window.setInterval(() => {
+ if (this.update_reading_function_) {
+ this.update_reading_function_(
+ this.buffer_, this.expects_modified_reading_,
+ this.reading_updates_count_);
+ this.reading_updates_count_++;
+ }
+ if (this.reporting_mode_ === sensor.ReportingMode.ON_CHANGE) {
+ this.client_.sensorReadingChanged();
+ }
+ }, timeout);
+ }
+ }
- stopReading() {
- if (this.sensor_reading_timer_id_ != null) {
- window.clearInterval(this.sensor_reading_timer_id_);
- this.sensor_reading_timer_id_ = null;
+ stopReading() {
+ if (this.sensor_reading_timer_id_ != null) {
+ window.clearInterval(this.sensor_reading_timer_id_);
+ this.sensor_reading_timer_id_ = null;
+ }
+ }
}
- }
-
- }
-
- // Helper function that returns resolved promise for getSensor() function.
- function getSensorResponse(init_params, client_request) {
- return Promise.resolve({init_params, client_request});
- }
-
- // Class that mocks SensorProvider interface defined in
- // sensor_provider.mojom
- class MockSensorProvider {
- constructor() {
- this.reading_size_in_bytes_ =
- sensor_provider.SensorInitParams.kReadBufferSizeForTests;
- this.shared_buffer_size_in_bytes_ = this.reading_size_in_bytes_ *
- sensor.SensorType.LAST;
- let rv =
- core.createSharedBuffer(
- this.shared_buffer_size_in_bytes_,
- core.CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE);
- assert_equals(rv.result, core.RESULT_OK, "Failed to create buffer");
- this.shared_buffer_handle_ = rv.handle;
- this.active_sensor_ = null;
- this.get_sensor_should_fail_ = false;
- this.resolve_func_ = null;
- this.is_continuous_ = false;
- this.max_frequency_ = 60;
- this.min_frequency_ = 1;
- this.binding_ = new bindings.Binding(sensor_provider.SensorProvider,
- this);
- }
- // Returns initialized Sensor proxy to the client.
- getSensor(type, request) {
- if (this.get_sensor_should_fail_) {
- var ignored = new sensor.SensorClientPtr();
- return getSensorResponse(null, bindings.makeRequest(ignored));
+ // Helper function that returns resolved promise for getSensor()
+ // function.
+ function getSensorResponse(init_params, client_request) {
+ return Promise.resolve({init_params, client_request});
}
- let offset =
+ // Class that mocks SensorProvider interface defined in
+ // sensor_provider.mojom
+ class MockSensorProvider {
+ constructor() {
+ this.reading_size_in_bytes_ =
+ sensor_provider.SensorInitParams.kReadBufferSizeForTests;
+ this.shared_buffer_size_in_bytes_ =
+ this.reading_size_in_bytes_ * sensor.SensorType.LAST;
+ let rv = core.createSharedBuffer(
+ this.shared_buffer_size_in_bytes_,
+ core.CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE);
+ assert_equals(rv.result, core.RESULT_OK, 'Failed to create buffer');
+ this.shared_buffer_handle_ = rv.handle;
+ this.active_sensor_ = null;
+ this.get_sensor_should_fail_ = false;
+ this.resolve_func_ = null;
+ this.is_continuous_ = false;
+ this.max_frequency_ = 60;
+ this.binding_ =
+ new bindings.Binding(sensor_provider.SensorProvider, this);
+ }
+
+ // Returns initialized Sensor proxy to the client.
+ getSensor(type, request) {
+ if (this.get_sensor_should_fail_) {
+ var ignored = new sensor.SensorClientPtr();
+ return getSensorResponse(null, bindings.makeRequest(ignored));
+ }
+
+ let offset =
(sensor.SensorType.LAST - type) * this.reading_size_in_bytes_;
- let reporting_mode = sensor.ReportingMode.ON_CHANGE;
- if (this.is_continuous_) {
- reporting_mode = sensor.ReportingMode.CONTINUOUS;
- }
+ let reporting_mode = sensor.ReportingMode.ON_CHANGE;
+ if (this.is_continuous_) {
+ reporting_mode = sensor.ReportingMode.CONTINUOUS;
+ }
- if (this.active_sensor_ == null) {
- let mockSensor = new MockSensor(request, this.shared_buffer_handle_,
- offset, this.reading_size_in_bytes_, reporting_mode);
- this.active_sensor_ = mockSensor;
- }
+ if (this.active_sensor_ == null) {
+ let mockSensor = new MockSensor(
+ request, this.shared_buffer_handle_, offset,
+ this.reading_size_in_bytes_, reporting_mode);
+ this.active_sensor_ = mockSensor;
+ }
- let rv =
- core.duplicateBufferHandle(
- this.shared_buffer_handle_,
- core.DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE);
+ let rv = core.duplicateBufferHandle(
+ this.shared_buffer_handle_,
+ core.DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE);
- assert_equals(rv.result, core.RESULT_OK);
+ assert_equals(rv.result, core.RESULT_OK);
- let default_config = {frequency: 5};
+ let default_config = {frequency: 5};
let init_params =
new sensor_provider.SensorInitParams(
@@ -282,61 +352,58 @@ function sensor_mocks(mojo) {
minimum_frequency: this.min_frequency_,
maximum_frequency: this.max_frequency_});
- if (this.resolve_func_ !== null) {
- this.resolve_func_(this.active_sensor_);
- }
-
- this.active_sensor_.client_ = new sensor.SensorClientPtr();
- return getSensorResponse(
- init_params, bindings.makeRequest(this.active_sensor_.client_));
- }
-
- // Binds object to mojo message pipe
- bindToPipe(pipe) {
- this.binding_.bind(pipe);
- this.binding_.setConnectionErrorHandler(() => {
- this.reset();
- });
- }
+ if (this.resolve_func_ !== null) {
+ this.resolve_func_(this.active_sensor_);
+ }
- // Mock functions
+ this.active_sensor_.client_ = new sensor.SensorClientPtr();
+ return getSensorResponse(
+ init_params, bindings.makeRequest(this.active_sensor_.client_));
+ }
- // Resets state of mock SensorProvider between test runs.
- reset() {
- if (this.active_sensor_ != null) {
- this.active_sensor_.reset();
- this.active_sensor_ = null;
- }
+ // Binds object to mojo message pipe
+ bindToPipe(pipe) {
+ this.binding_.bind(pipe);
+ this.binding_.setConnectionErrorHandler(() => { this.reset(); });
+ }
- this.get_sensor_should_fail_ = false;
- this.resolve_func_ = null;
- this.max_frequency_ = 60;
- this.min_frequency_ = 1;
- this.is_continuous_ = false;
- this.binding_.close();
- }
+ // Mock functions
- // Sets flag that forces mock SensorProvider to fail when getSensor() is
- // invoked.
- setGetSensorShouldFail(should_fail) {
- this.get_sensor_should_fail_ = should_fail;
- }
+ // Resets state of mock SensorProvider between test runs.
+ reset() {
+ if (this.active_sensor_ != null) {
+ this.active_sensor_.reset();
+ this.active_sensor_ = null;
+ }
- // Returns mock sensor that was created in getSensor to the layout test.
- getCreatedSensor() {
- if (this.active_sensor_ != null) {
- return Promise.resolve(this.active_sensor_);
- }
+ this.get_sensor_should_fail_ = false;
+ this.resolve_func_ = null;
+ this.max_frequency_ = 60;
+ this.is_continuous_ = false;
+ this.min_frequency_ = 1;
+ this.binding_.close();
+ }
+
+ // Sets flag that forces mock SensorProvider to fail when getSensor()
+ // is
+ // invoked.
+ setGetSensorShouldFail(should_fail) {
+ this.get_sensor_should_fail_ = should_fail;
+ }
+
+ // Returns mock sensor that was created in getSensor to the layout
+ // test.
+ getCreatedSensor() {
+ if (this.active_sensor_ != null) {
+ return Promise.resolve(this.active_sensor_);
+ }
- return new Promise((resolve, reject) => {
- this.resolve_func_ = resolve;
- });
- }
+ return new Promise(
+ (resolve, reject) => { this.resolve_func_ = resolve; });
+ }
- // Forces sensor to use |reporting_mode| as an update mode.
- setContinuousReportingMode() {
- this.is_continuous_ = true;
- }
+ // Forces sensor to use |reporting_mode| as an update mode.
+ setContinuousReportingMode() { this.is_continuous_ = true; }
// Sets the maximum frequency for a concrete sensor.
setMaximumSupportedFrequency(frequency) {
@@ -348,18 +415,22 @@ function sensor_mocks(mojo) {
this.min_frequency_ = frequency;
}
}
-
- let mockSensorProvider = new MockSensorProvider;
- mojo.frameInterfaces.addInterfaceOverrideForTesting(
- sensor_provider.SensorProvider.name,
- pipe => {
- mockSensorProvider.bindToPipe(pipe);
+ let mockSensorProvider = new MockSensorProvider;
+ let mockPermissionService = new MockPermissionService;
+ mojo.frameInterfaces.addInterfaceOverrideForTesting(
+ sensor_provider.SensorProvider.name,
+ pipe => { mockSensorProvider.bindToPipe(pipe); });
+
+ mojo.frameInterfaces.addInterfaceOverrideForTesting(
+ permission.PermissionService.name,
+ pipe => { mockPermissionService.bindToPipe(pipe); });
+
+ return Promise.resolve({
+ mockSensorProvider: mockSensorProvider,
+ mockPermissionService: mockPermissionService,
});
- return Promise.resolve({
- mockSensorProvider: mockSensorProvider,
- });
- });
+ });
}
function sensor_test(func, name, properties) {

Powered by Google App Engine
This is Rietveld 408576698