Skip to content

Commit

Permalink
[sensors] Round off Ambient Light Sensor readouts to the nearest 50 Lux.
Browse files Browse the repository at this point in the history
There have been some concerns regarding the precision of readouts from the
Ambient Light Sensor. To decrease the entropy, we are rounding off the
illuminance value to the nearest 50 Lux to mitigate the known attack
vectors as summarized in [1].

Blink-specific sensor tests now use a ring buffer for readings needed for
sensor/ambient-light-sensor.html
Details: https://chromium-review.googlesource.com/c/chromium/src/+/1760954

[1] w3c/ambient-light#13 (comment)

Co-author: Raphael Kubo da Costa

Bug: 642731, 606766
Change-Id: Icc4cfa6b87bd5a87c2cac6ebe322201d7dda6c33
  • Loading branch information
riju authored and chromium-wpt-export-bot committed Aug 23, 2019
1 parent 00832c4 commit 0581acc
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions resources/chromium/generic_sensor_mocks.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ var GenericSensorTest = (() => {
this.binding_.setConnectionErrorHandler(() => {
this.reset();
});
this.readingsProducerFunction_ = null;
}

getDefaultConfiguration() {
Expand Down Expand Up @@ -64,6 +65,7 @@ var GenericSensorTest = (() => {
this.requestedFrequencies_ = [];
this.buffer_.fill(0);
this.binding_.close();
this.readingsProducerFunction_ = null;
}

startReading() {
Expand All @@ -81,6 +83,17 @@ var GenericSensorTest = (() => {
const maxFrequencyHz = this.requestedFrequencies_[0];
const timeoutMs = (1 / maxFrequencyHz) * 1000;
this.sensorReadingTimerId_ = window.setInterval(() => {
// By default, each reading will contain the same value (0), unless
// |readingsProducerFunction_| is defined, in which case its return
// value is used instead.
if (this.readingsProducerFunction_) {
const readings = this.readingsProducerFunction_();
if (!Array.isArray(readings)) {
throw new TypeError("The readings generator function must return " +
"an array");
}
this.buffer_.set(readings, 2);
}
// For all tests sensor reading should have monotonically
// increasing timestamp in seconds.
this.buffer_[1] = window.performance.now() * 0.001;
Expand All @@ -100,6 +113,13 @@ var GenericSensorTest = (() => {
get isReading() {
this.sensorReadingTimerId_ !== null;
}

// Can be used to make each reading produced by this sensor to come from
// |readingsProducer|, a function that returns an array that is passed to
// this.buffer_ and which represents a raw reading.
setReadingsProducerFunction(readingsProducerFunction) {
this.readingsProducerFunction_ = readingsProducerFunction;
}
}

// Class that mocks SensorProvider interface defined in
Expand Down Expand Up @@ -151,6 +171,17 @@ var GenericSensorTest = (() => {
maxAllowedFrequencyHz = 10;
}

// Chromium applies some rounding and other privacy-related measures that
// can cause ALS not to report a reading when it has not changed beyond a
// certain threshold compared to the previous illuminance value. Make
// each reading return a different value that is significantly different
// from the previous one.
if (type == device.mojom.SensorType.AMBIENT_LIGHT) {
this.activeSensor_.setReadingsProducerFunction(() => {
return [window.performance.now() * 100];
})
}

let initParams = new device.mojom.SensorInitParams({
sensor: sensorPtr,
clientRequest: mojo.makeRequest(this.activeSensor_.client_),
Expand Down

0 comments on commit 0581acc

Please sign in to comment.