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

Unified Diff: third_party/WebKit/LayoutTests/fast/dom/Geolocation/resources/geolocation-mock.js

Issue 1948033003: Convert most geolocation layout tests to use a JS mock implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permission-disconnect
Patch Set: Created 4 years, 7 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/fast/dom/Geolocation/resources/geolocation-mock.js
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Geolocation/resources/geolocation-mock.js b/third_party/WebKit/LayoutTests/fast/dom/Geolocation/resources/geolocation-mock.js
new file mode 100644
index 0000000000000000000000000000000000000000..c1d7d4cfd47ab23d546789a22c573cd91db426ea
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/Geolocation/resources/geolocation-mock.js
@@ -0,0 +1,186 @@
+/*
+ * geolocation-mock contains a mock implementation of GeolocationService and
+ * PermissionService.
+ */
+
+"use strict";
+
+let geolocationServiceMock = loadMojoModules(
+ 'geolocationServiceMock',
+ ['third_party/WebKit/public/platform/modules/geolocation/geolocation.mojom',
+ 'third_party/WebKit/public/platform/modules/permissions/permission.mojom',
+ 'third_party/WebKit/public/platform/modules/permissions/permission_status.mojom',
+ 'mojo/public/js/router',
+ ]).then(mojo => {
+ let [geolocation, permission, permissionStatus, router] =
+ mojo.modules;
+
+ class GeolocationServiceMock {
+ constructor(serviceRegistry) {
+ serviceRegistry.addServiceOverrideForTesting(
+ geolocation.GeolocationService.name,
+ handle => this.connectGeolocation_(handle));
+
+ serviceRegistry.addServiceOverrideForTesting(
+ permission.PermissionService.name,
+ handle => this.connectPermission_(handle));
+
+ this.serviceRegistry_ = serviceRegistry;
+
+ /**
+ * The next geoposition to return in response to a queryNextPosition()
+ * call.
+ */
+ this.geoposition_ = null;
+
+ /**
+ * A pending request for permission awaiting a decision to be set via a
+ * setGeolocationPermission call.
+ *
+ * @type {?Function}
+ */
+ this.pendingPermissionRequest_ = null;
+
+ /**
+ * The status to respond to permission requests with. If set to ASK, then
+ * permission requests will block until setGeolocationPermission is called
+ * to allow or deny permission requests.
+ *
+ * @type {!permissionStatus.PermissionStatus}
+ */
+ this.permissionStatus_ = permissionStatus.PermissionStatus.ASK;
+ this.rejectPermissionConnections_ = false;
+ this.rejectGeolocationConnections_ = false;
+ }
+
+ connectGeolocation_(handle) {
+ if (this.rejectGeolocationConnections_) {
+ mojo.core.close(handle);
+ return;
+ }
+ this.geolocationStub_ = new geolocation.GeolocationService.stubClass(
+ this);
+ this.geolocationRouter_ = new router.Router(handle);
+ this.geolocationRouter_.setIncomingReceiver(this.geolocationStub_);
+ }
+
+ connectPermission_(handle) {
+ if (this.rejectPermissionConnections_) {
+ mojo.core.close(handle);
+ return;
+ }
+ this.permissionStub_ = new permission.PermissionService.stubClass(this);
+ this.permissionRouter_ = new router.Router(handle);
+ this.permissionRouter_.setIncomingReceiver(this.permissionStub_);
+ }
+
+ setHighAccuracy(highAccuracy) {
+ // FIXME: We need to add some tests regarding "high accuracy" mode.
+ // See https://bugs.webkit.org/show_bug.cgi?id=49438
+ }
+
+ /**
+ * A mock implementation of GeolocationService.queryNextPosition(). This
+ * returns the position set by a call to setGeolocationPosition() or
+ * setGeolocationPositionUnavailableError().
+ */
+ queryNextPosition() {
+ if (!this.geoposition_) {
+ this.setGeolocationPositionUnavailableError(
+ 'Test error: position not set before call to queryNextPosition()');
+ }
+ let geoposition = this.geoposition_;
+ this.geoposition_ = null;
+ return Promise.resolve({geoposition});
+ }
+
+ /**
+ * Sets the position to return to the next queryNextPosition() call. If any
+ * queryNextPosition() requests are outstanding, they will all receive the
+ * position set by this call.
+ */
+ setGeolocationPosition(latitude, longitude, accuracy, altitude,
+ altitudeAccuracy, heading, speed) {
+ this.geoposition_ = new geolocation.Geoposition();
+ this.geoposition_.latitude = latitude;
+ this.geoposition_.longitude = longitude;
+ this.geoposition_.accuracy = accuracy;
+ this.geoposition_.altitude = altitude;
+ this.geoposition_.altitude_accuracy = altitudeAccuracy;
+ this.geoposition_.heading = heading;
+ this.geoposition_.speed = speed;
+ this.geoposition_.timestamp = new Date().getTime() / 1000;
+ this.geoposition_.error_message = '';
+ this.geoposition_.valid = true;
+ }
+
+ /**
+ * Sets the error message to return to the next queryNextPosition() call. If
+ * any queryNextPosition() requests are outstanding, they will all receive
+ * the error set by this call.
+ */
+ setGeolocationPositionUnavailableError(message) {
+ this.geoposition_ = new geolocation.Geoposition();
+ this.geoposition_.valid = false;
+ this.geoposition_.error_message = message;
+ this.geoposition_.error_code =
+ geolocation.Geoposition.ErrorCode.POSITION_UNAVAILABLE;
+ }
+
+ /**
+ * Reject any connection requests for the permission service. This will
+ * trigger a connection error in the client.
+ */
+ rejectPermissionConnections() {
+ this.rejectPermissionConnections_ = true;
+ }
+
+ /**
+ * Reject any connection requests for the geolocation service. This will
+ * trigger a connection error in the client.
+ */
+ rejectGeolocationConnections() {
+ this.rejectGeolocationConnections_ = true;
+ }
+
+ /**
+ * A mock implementation of PermissionService.requestPermission(). This
+ * returns the result set by a call to setGeolocationPermission(), waiting
+ * for a call if necessary. Any permission request that is not for
+ * geolocation is always denied.
+ */
+ requestPermission(permissionName) {
+ if (permissionName != permission.PermissionName.GEOLOCATION)
+ 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;
+ }
+
+ /**
+ * Sets whether the next geolocation permission request should be allowed.
+ */
+ setGeolocationPermission(allowed) {
+ this.permissionStatus_ = allowed ?
+ permissionStatus.PermissionStatus.GRANTED :
+ permissionStatus.PermissionStatus.DENIED;
+ this.runPermissionCallback_();
+ }
+
+ }
+ return new GeolocationServiceMock(mojo.frameServiceRegistry);
+});

Powered by Google App Engine
This is Rietveld 408576698