Skip to content

Add Web Lock APIs #762

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions api-reports/2_12.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15716,6 +15716,23 @@ Location[JT] var protocol: String
Location[JT] def reload(): Unit
Location[JT] def replace(url: String): Unit
Location[JT] var search: String
Lock[JC] def mode: LockMode
Lock[JC] def name: String
LockInfo[JT] def clientId: String
LockInfo[JT] def mode: LockMode
LockInfo[JT] def name: String
LockManager[JC] def query(): js.Promise[LockManagerSnapshot]
LockManager[JC] def request(name: String, callback: js.Function1[Lock, js.Promise[Unit]]): js.Promise[Unit]
LockManager[JC] def request(name: String, options: LockOptions, callback: js.Function1[Lock, js.Promise[Unit]]): js.Promise[Unit]
LockManagerSnapshot[JT] def held: js.Array[LockInfo]
LockManagerSnapshot[JT] def pending: js.Array[LockInfo]
LockMode[JT]
LockMode[SO] val exclusive: LockMode
LockMode[SO] val shared: LockMode
LockOptions[JT] var ifAvailable: js.UndefOr[Boolean]
LockOptions[JT] var mode: js.UndefOr[LockMode]
LockOptions[JT] var signal: js.UndefOr[AbortSignal]
LockOptions[JT] var steal: js.UndefOr[Boolean]
MIMEType[JT]
MIMEType[SO] val `application/xhtml+xml` = "application/xhtml+xml".asInstanceOf[MIMEType]
MIMEType[SO] val `application/xml` = "application/xml".asInstanceOf[MIMEType]
Expand Down Expand Up @@ -16084,6 +16101,7 @@ Navigator[JC] def geolocation: Geolocation
Navigator[JC] def getGamepads(): js.Array[Gamepad]
Navigator[JC] def language: String
Navigator[JC] def languages: js.Array[String]
Navigator[JC] def locks: LockManager
Navigator[JC] def mediaDevices: MediaDevices
Navigator[JC] def onLine: Boolean
Navigator[JC] val permissions: Permissions
Expand All @@ -16102,6 +16120,7 @@ NavigatorID[JT] def platform: String
NavigatorID[JT] def userAgent: String
NavigatorLanguage[JT] def language: String
NavigatorLanguage[JT] def languages: js.Array[String]
NavigatorLocks[JT] def locks: LockManager
NavigatorOnLine[JT] def onLine: Boolean
NavigatorStorageUtils[JT]
NavigatorVibration[JT] def vibrate(duration: Double): Boolean
Expand Down
19 changes: 19 additions & 0 deletions api-reports/2_13.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15716,6 +15716,23 @@ Location[JT] var protocol: String
Location[JT] def reload(): Unit
Location[JT] def replace(url: String): Unit
Location[JT] var search: String
Lock[JC] def mode: LockMode
Lock[JC] def name: String
LockInfo[JT] def clientId: String
LockInfo[JT] def mode: LockMode
LockInfo[JT] def name: String
LockManager[JC] def query(): js.Promise[LockManagerSnapshot]
LockManager[JC] def request(name: String, callback: js.Function1[Lock, js.Promise[Unit]]): js.Promise[Unit]
LockManager[JC] def request(name: String, options: LockOptions, callback: js.Function1[Lock, js.Promise[Unit]]): js.Promise[Unit]
LockManagerSnapshot[JT] def held: js.Array[LockInfo]
LockManagerSnapshot[JT] def pending: js.Array[LockInfo]
LockMode[JT]
LockMode[SO] val exclusive: LockMode
LockMode[SO] val shared: LockMode
LockOptions[JT] var ifAvailable: js.UndefOr[Boolean]
LockOptions[JT] var mode: js.UndefOr[LockMode]
LockOptions[JT] var signal: js.UndefOr[AbortSignal]
LockOptions[JT] var steal: js.UndefOr[Boolean]
MIMEType[JT]
MIMEType[SO] val `application/xhtml+xml` = "application/xhtml+xml".asInstanceOf[MIMEType]
MIMEType[SO] val `application/xml` = "application/xml".asInstanceOf[MIMEType]
Expand Down Expand Up @@ -16084,6 +16101,7 @@ Navigator[JC] def geolocation: Geolocation
Navigator[JC] def getGamepads(): js.Array[Gamepad]
Navigator[JC] def language: String
Navigator[JC] def languages: js.Array[String]
Navigator[JC] def locks: LockManager
Navigator[JC] def mediaDevices: MediaDevices
Navigator[JC] def onLine: Boolean
Navigator[JC] val permissions: Permissions
Expand All @@ -16102,6 +16120,7 @@ NavigatorID[JT] def platform: String
NavigatorID[JT] def userAgent: String
NavigatorLanguage[JT] def language: String
NavigatorLanguage[JT] def languages: js.Array[String]
NavigatorLocks[JT] def locks: LockManager
NavigatorOnLine[JT] def onLine: Boolean
NavigatorStorageUtils[JT]
NavigatorVibration[JT] def vibrate(duration: Double): Boolean
Expand Down
12 changes: 12 additions & 0 deletions dom/src/main/scala-2/org/scalajs/dom/LockMode.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.scalajs.dom

import scala.scalajs.js

@js.native
sealed trait LockMode extends js.Any

object LockMode {
val exclusive: LockMode = "exclusive".asInstanceOf[LockMode]

val shared: LockMode = "shared".asInstanceOf[LockMode]
}
11 changes: 11 additions & 0 deletions dom/src/main/scala-3/org/scalajs/dom/LockMode.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.scalajs.dom

import scala.scalajs.js

opaque type LockMode <: String = String

object LockMode {
val exclusive: LockMode = "exclusive"

val shared: LockMode = "shared"
}
23 changes: 23 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/Lock.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.scalajs.dom

import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobal

/** The [[Lock]] interface of the Web Locks API provides the name and mode of a lock. This may be a newly requested lock
* that is received in the callback to [[LockManager.request(name:String,callback:* LockManager.request]], or a record
* of an active or queued lock returned by [[LockManager.query]].
*/
@js.native
@JSGlobal
class Lock private[this] extends js.Object {

/** The access mode passed to [[LockManager.request(name:String,callback:* LockManager.request]] when the lock was
* requested.
*/
def mode: LockMode = js.native

/** The name passed to [[LockManager.request(name:String,callback:* LockManager.request]] when the lock was requested.
*/
def name: String = js.native

}
14 changes: 14 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/LockInfo.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.scalajs.dom

import scala.scalajs.js

@js.native
trait LockInfo extends js.Object {

def name: String = js.native

def mode: LockMode = js.native

def clientId: String = js.native

}
24 changes: 24 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/LockManager.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.scalajs.dom

import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobal

/** The [[LockManager]] interface of the Web Locks API provides methods for requesting a new [[Lock]] object and
* querying for an existing [[Lock]] object. To get an instance of [[LockManager]], call `navigator.locks`.
*/
@js.native
@JSGlobal
class LockManager private[this] extends js.Object {

/** Resolves with an object containing information about held and pending locks. */
def query(): js.Promise[LockManagerSnapshot] = js.native

/** Requests a [[Lock]] object with parameters specifying its name and characteristics. The requested [[Lock]] is
* passed to a callback, while the function itself returns a `Promise` that resolves with `undefined`.
*/
def request(name: String, callback: js.Function1[Lock, js.Promise[Unit]]): js.Promise[Unit] = js.native

def request(name: String, options: LockOptions,
callback: js.Function1[Lock, js.Promise[Unit]]): js.Promise[Unit] = js.native

}
15 changes: 15 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/LockManagerSnapshot.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.scalajs.dom

import scala.scalajs.js

/** an object containing a snapshot of the [[LockManager]] state */
@js.native
trait LockManagerSnapshot extends js.Object {

/** An array of [[Lock]] objects for held locks. */
def held: js.Array[LockInfo] = js.native

/** An array of [[Lock]] objects for pending lock requests. */
def pending: js.Array[LockInfo] = js.native

}
26 changes: 26 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/LockOptions.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.scalajs.dom

import scala.scalajs.js

/** An object describing characteristics of the lock you want to create. */
trait LockOptions extends js.Object {

/** Either `"exclusive"` or `"shared"`. The default value is `"exclusive"`. */
var mode: js.UndefOr[LockMode] = js.undefined

/** If `true`, the lock request will only be granted if it is not already held. If it cannot be granted, the callback
* will be invoked with `null` instead of a [[Lock]] instance. The default value is `false`.
*/
var ifAvailable: js.UndefOr[Boolean] = js.undefined

/** If `true`, then any held locks with the same name will be released, and the request will be granted, preempting
* any queued requests for it. The default value is `false`.
*/
var steal: js.UndefOr[Boolean] = js.undefined

/** An [[AbortSignal]] (the `signal` property of an [[AbortController]]); if specified and the [[AbortController]] is
* aborted, the lock request is dropped if it was not already granted.
*/
var signal: js.UndefOr[AbortSignal] = js.undefined

}
2 changes: 1 addition & 1 deletion dom/src/main/scala/org/scalajs/dom/Navigator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import scala.scalajs.js.annotation._
@JSGlobal
class Navigator
extends NavigatorID with NavigatorOnLine with NavigatorContentUtils with NavigatorGeolocation
with NavigatorStorageUtils with NavigatorLanguage with NavigatorVibration {
with NavigatorStorageUtils with NavigatorLanguage with NavigatorLocks with NavigatorVibration {

/** The Clipboard API adds to the Navigator interface the read-only clipboard property, which returns the Clipboard
* object used to read and write the clipboard's contents. The Clipboard API can be used to implement cut, copy, and
Expand Down
12 changes: 12 additions & 0 deletions dom/src/main/scala/org/scalajs/dom/NavigatorLocks.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.scalajs.dom

import scala.scalajs.js

@js.native
trait NavigatorLocks extends js.Object {

/** A [[LockManager]] object which provides methods for requesting a new [[Lock]] object and querying for an existing
* [[Lock]] object.
*/
def locks: LockManager = js.native
}