This commit exposes the Permissions API to DOM Workers. It achieves this goal
by introducing a thread-safe bridge between `PermissionStatus` and the
`PermissionObserver`: the `PermissionStatusSink` object.
Actors:
- The `PermissionObserver` is a main-thread-only singleton that monitors
permission change events and propagates the notification to the right sink
objects.
- The `PermissionStatus` is the DOM object exposed to the global. It's not
thread-safe.
- The `PermissionStatusSink` is the new bridge introduced by this commit.
The `PermissionStatusSink` lifetime:
- This object is kept alive on the current thread by the `PermissionStatus` and
on the main thread by the `PermissionObserver`.
- The `PermissionStatus` creates the object on its creation thread. When
`PermissionStatus` object is released (or disconnected from the owner, it
disentangles itself from the `PermissionStatusSink`. The disentangle
operation triggers the un-registration procedure from the
`PermissionObserver` on the main thread.
- A weak `WorkerRef` is used to monitor the worker's lifetime.
Permission change notification:
- When the `PermissionObserver` is notified for a permission-change event, it
notifies all the `PermissionStatusSink`. This happens on the main thread (see
`MaybeUpdatedByOnMainThread` and `MaybeUpdatedByNotifyOnlyOnMainThread`).
- Using `MozPromise`, the `PermissionStatusSink` computes the permission action
(`PermissionChangedOnMainThread`) on the main thread, then informs the
parent `PermissionStatus` object on its creation thread.
- The `PermissionStatus` object converts the action to the DOM
`PermissionState` and dispatches an event.
Differential Revision: https://phabricator.services.mozilla.com/D224594
This commit exposes the Permissions API to DOM Workers. It achieves this goal
by introducing a thread-safe bridge between `PermissionStatus` and the
`PermissionObserver`: the `PermissionStatusSink` object.
Actors:
- The `PermissionObserver` is a main-thread-only singleton that monitors
permission change events and propagates the notification to the right sink
objects.
- The `PermissionStatus` is the DOM object exposed to the global. It's not
thread-safe.
- The `PermissionStatusSink` is the new bridge introduced by this commit.
The `PermissionStatusSink` lifetime:
- This object is kept alive on the current thread by the `PermissionStatus` and
on the main thread by the `PermissionObserver`.
- The `PermissionStatus` creates the object on its creation thread. When
`PermissionStatus` object is released (or disconnected from the owner, it
disentangles itself from the `PermissionStatusSink`. The disentangle
operation triggers the un-registration procedure from the
`PermissionObserver` on the main thread.
- A weak `WorkerRef` is used to monitor the worker's lifetime.
Permission change notification:
- When the `PermissionObserver` is notified for a permission-change event, it
notifies all the `PermissionStatusSink`. This happens on the main thread (see
`MaybeUpdatedByOnMainThread` and `MaybeUpdatedByNotifyOnlyOnMainThread`).
- Using `MozPromise`, the `PermissionStatusSink` computes the permission action
(`PermissionChangedOnMainThread`) on the main thread, then informs the
parent `PermissionStatus` object on its creation thread.
- The `PermissionStatus` object converts the action to the DOM
`PermissionState` and dispatches an event.
Differential Revision: https://phabricator.services.mozilla.com/D224594
This commit exposes the Permissions API to DOM Workers. It achieves this goal
by introducing a thread-safe bridge between `PermissionStatus` and the
`PermissionObserver`: the `PermissionStatusSink` object.
Actors:
- The `PermissionObserver` is a main-thread-only singleton that monitors
permission change events and propagates the notification to the right sink
objects.
- The `PermissionStatus` is the DOM object exposed to the global. It's not
thread-safe.
- The `PermissionStatusSink` is the new bridge introduced by this commit.
The `PermissionStatusSink` lifetime:
- This object is kept alive on the current thread by the `PermissionStatus` and
on the main thread by the `PermissionObserver`.
- The `PermissionStatus` creates the object on its creation thread. When
`PermissionStatus` object is released (or disconnected from the owner, it
disentangles itself from the `PermissionStatusSink`. The disentangle
operation triggers the un-registration procedure from the
`PermissionObserver` on the main thread.
- A weak `WorkerRef` is used to monitor the worker's lifetime.
Permission change notification:
- When the `PermissionObserver` is notified for a permission-change event, it
notifies all the `PermissionStatusSink`. This happens on the main thread (see
`MaybeUpdatedByOnMainThread` and `MaybeUpdatedByNotifyOnlyOnMainThread`).
- Using `MozPromise`, the `PermissionStatusSink` computes the permission action
(`PermissionChangedOnMainThread`) on the main thread, then informs the
parent `PermissionStatus` object on its creation thread.
- The `PermissionStatus` object converts the action to the DOM
`PermissionState` and dispatches an event.
Differential Revision: https://phabricator.services.mozilla.com/D224594
The current Create pattern looks like an effort to not have uninited PermissionStatus, but I'm planning to reuse DryCreatePermissionStatus for WebDriver purpose which doesn't need the observer and the query parts, so this works better for that.
Differential Revision: https://phabricator.services.mozilla.com/D199549
This means:
- Making creation function calls async
- Making GetPrincipal more specific
- Making PermissionState mState protected instead of private and virtualizing UpdateState so children can have custom update logic
Differential Revision: https://phabricator.services.mozilla.com/D182245
This means:
- Making creation function calls async
- Making GetPrincipal more specific
- Making PermissionState mState protected instead of private and virtualizing UpdateState so children can have custom update logic
Differential Revision: https://phabricator.services.mozilla.com/D182245