- From: Marcos Cáceres <notifications@github.com>
- Date: Thu, 20 Feb 2025 14:08:34 -0800
- To: w3c/permissions <permissions@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/permissions/issues/460@github.com>
marcoscaceres created an issue (w3c/permissions#460)
(ChatGPT generated plan based on the tests we have)
This plan focuses **exclusively** on testing the Permissions API using the `geolocation` permission. By covering the scenarios below, we aim to ensure thorough coverage of how `navigator.permissions.query({ name: 'geolocation' })` behaves, including event firing, revocation, and usage in both Window and Worker contexts.
---
## 1. Event Model Expansion
**Goal**: Verify the `"change"` event for `PermissionStatus` objects works correctly under multiple conditions.
1. **Multiple Listeners**
- **Test**: Call `navigator.permissions.query({ name: 'geolocation' })` once, attach two or more listeners:
```js
status.addEventListener('change', /* ... */);
status.onchange = /* ... */;
```
Then force a state transition from `"prompt"` → `"granted"` (or `"denied"`) using `test_driver.set_permission(...)`.
- **Check**: Ensure all listeners fire exactly once when the state changes.
2. **Multi-step Transitions**
- **Test**: With a single `PermissionStatus`, step through multiple transitions:
1. **"prompt"** to **"granted"**
2. **"granted"** back to **"prompt"** (simulating revocation or expiry)
3. **"prompt"** to **"denied"**
- **Check**: Each state change fires exactly one `"change"` event, and no event fires if the state is forced to remain the same.
3. **Multiple Watchers**
- **Test**: Call `navigator.permissions.query({ name: 'geolocation' })` two or three times. Store each returned `PermissionStatus` in a separate variable, and attach `"change"` listeners to all.
- **Check**: When the permission state changes, all watchers receive the `"change"` event.
---
## 2. Worker Context
**Goal**: Ensure `navigator.permissions` behaves as expected in a Worker (i.e., `WorkerNavigator.permissions`).
1. **Basic Query in a Worker**
- **Test**: Spin up a dedicated or shared worker, call:
```js
self.navigator.permissions.query({ name: 'geolocation' })
```
and check the returned `PermissionStatus.state`.
- **Check**: Verify it matches the expected state (e.g., `"prompt"`, `"granted"`, or `"denied"`) depending on how you configure `test_driver.set_permission(...)`.
2. **Event Handling in a Worker**
- **Test**: Attach a `"change"` listener to the returned `PermissionStatus`, then force state changes.
- **Check**: The `"change"` event fires in the Worker’s context (or is consistently handled according to spec if any constraints apply).
---
## 3. Revocation & Lifetime Expiry
**Goal**: Confirm that *reverting* from `"granted"` to some other state also triggers `"change"` events.
1. **Manual Revocation Simulation**
- **Test**:
1. `test_driver.set_permission({ name: 'geolocation' }, 'granted')`.
2. Call `navigator.permissions.query({ name: 'geolocation' })` to confirm it’s `"granted"`.
3. Then forcibly set it to `"prompt"` or `"denied"`:
```js
test_driver.set_permission({ name: 'geolocation' }, 'denied');
```
- **Check**: Confirm the `PermissionStatus` object’s `"change"` event fires. Confirm `status.state` is `"denied"` after the event.
2. **(Optional) Artificial “Expiry”**
- If your test environment supports an “expiry-like” scenario, you can replicate it by setting `"granted"` → `"prompt"` after some time. You’d still use `test_driver.set_permission(...)` to automate that transition.
---
## 4. Non–Fully Active Documents
**Goal**: Ensure that a document losing “fully active” status stops receiving permission events and/or throws the appropriate exceptions.
1. **Iframe Removal**
- **Test**: Put a script in an iframe that calls `navigator.permissions.query({ name: 'geolocation' })`. Store the `PermissionStatus`, attach a `"change"` listener, then remove the iframe from the DOM.
- **Check**: When you call `test_driver.set_permission({ name: 'geolocation' }, 'granted')` afterwards, confirm that the removed iframe’s listener *does not* fire.
2. **Worker in a Removed Iframe**
- (If feasible) same idea, but from a Worker in that iframe.
---
## 5. WebDriver Extension Commands
**Goal**: Validate that the user agent’s WebDriver (or BiDi) implementation properly handles the `setPermission` command for geolocation.
1. **Success Path**
- **Test**:
1. `POST /session/:sessionId/permissions` with:
```json
{
"descriptor": { "name": "geolocation" },
"state": "granted"
}
```
2. Check that the command returns the correct success response (HTTP 200).
3. Query `navigator.permissions.query({ name: 'geolocation' })` in the same session; expect `"granted"`.
2. **Invalid Argument**
- **Test**:
1. `POST /session/:sessionId/permissions` with:
```json
{
"descriptor": { "name": "not-a-real-permission" },
"state": "granted"
}
```
2. Expect a 400 “invalid argument” error.
3. **Unsupported State**
- **Test**: If your UA refuses certain states, confirm the same error is returned.
---
## 6. Edge Cases
1. **No Change**
- **Test**: Force the same state that’s already in effect—e.g., from `"prompt"` → `"prompt"` again.
- **Check**: No `"change"` event fires.
2. **Invalid `PermissionDescriptor`**
- **Test**: `navigator.permissions.query({ name: '' })` or some obviously broken descriptor.
- **Check**: Must throw `TypeError` or `DOMException("InvalidStateError")` according to the spec rules.
---
## 7. Implementation Notes
- **Automation**: Most tests rely on `test_driver.set_permission({ name: 'geolocation' }, newState)` to transition the permission under test.
- **Cross-Browser**: Since geolocation is the only permission guaranteed across major browsers, all tests should revolve around `{ name: 'geolocation' }`.
- **WPT Integration**: Where possible, add these as new `.https.html` or `.https.any.js` files in the `permissions/` folder so they can run automatically in WPT infrastructures.
- **User Interaction**: The spec has a “prompt the user to choose” algorithm, but it’s not generally automatable. We can rely on direct state changes (like “prompt” → “granted”) via test harness commands.
---
## Summary
These tests—focusing solely on the `geolocation` permission—will expand coverage to include:
- More thorough event model checks (multiple listeners, multiple `PermissionStatus` objects).
- Worker usage tests.
- Revocation and lifetime-like expiration scenarios.
- Proper handling of non–fully active documents.
- Validation of the new WebDriver extension command for permissions.
- Edge case and error-condition testing.
By implementing these scenarios, we achieve a much more robust conformance suite for the Permissions spec as it applies to geolocation.
--
Reply to this email directly or view it on GitHub:
https://github.com/w3c/permissions/issues/460
You are receiving this because you are subscribed to this thread.
Message ID: <w3c/permissions/issues/460@github.com>
Received on Thursday, 20 February 2025 22:08:38 UTC