diff --git a/api-reports/2_12.txt b/api-reports/2_12.txt index 8396ab12c..012879d00 100644 --- a/api-reports/2_12.txt +++ b/api-reports/2_12.txt @@ -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] @@ -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 @@ -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 diff --git a/api-reports/2_13.txt b/api-reports/2_13.txt index 8396ab12c..012879d00 100644 --- a/api-reports/2_13.txt +++ b/api-reports/2_13.txt @@ -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] @@ -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 @@ -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 diff --git a/dom/src/main/scala-2/org/scalajs/dom/LockMode.scala b/dom/src/main/scala-2/org/scalajs/dom/LockMode.scala new file mode 100644 index 000000000..983aa872b --- /dev/null +++ b/dom/src/main/scala-2/org/scalajs/dom/LockMode.scala @@ -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] +} diff --git a/dom/src/main/scala-3/org/scalajs/dom/LockMode.scala b/dom/src/main/scala-3/org/scalajs/dom/LockMode.scala new file mode 100644 index 000000000..dd9a0e88d --- /dev/null +++ b/dom/src/main/scala-3/org/scalajs/dom/LockMode.scala @@ -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" +} diff --git a/dom/src/main/scala/org/scalajs/dom/Lock.scala b/dom/src/main/scala/org/scalajs/dom/Lock.scala new file mode 100644 index 000000000..a10116fec --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/Lock.scala @@ -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 + +} diff --git a/dom/src/main/scala/org/scalajs/dom/LockInfo.scala b/dom/src/main/scala/org/scalajs/dom/LockInfo.scala new file mode 100644 index 000000000..77af64c44 --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/LockInfo.scala @@ -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 + +} diff --git a/dom/src/main/scala/org/scalajs/dom/LockManager.scala b/dom/src/main/scala/org/scalajs/dom/LockManager.scala new file mode 100644 index 000000000..18824c008 --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/LockManager.scala @@ -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 + +} diff --git a/dom/src/main/scala/org/scalajs/dom/LockManagerSnapshot.scala b/dom/src/main/scala/org/scalajs/dom/LockManagerSnapshot.scala new file mode 100644 index 000000000..fab149b9b --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/LockManagerSnapshot.scala @@ -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 + +} diff --git a/dom/src/main/scala/org/scalajs/dom/LockOptions.scala b/dom/src/main/scala/org/scalajs/dom/LockOptions.scala new file mode 100644 index 000000000..11dd844fc --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/LockOptions.scala @@ -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 + +} diff --git a/dom/src/main/scala/org/scalajs/dom/Navigator.scala b/dom/src/main/scala/org/scalajs/dom/Navigator.scala index df1cd004b..d1fb21598 100644 --- a/dom/src/main/scala/org/scalajs/dom/Navigator.scala +++ b/dom/src/main/scala/org/scalajs/dom/Navigator.scala @@ -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 diff --git a/dom/src/main/scala/org/scalajs/dom/NavigatorLocks.scala b/dom/src/main/scala/org/scalajs/dom/NavigatorLocks.scala new file mode 100644 index 000000000..664ca299d --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/NavigatorLocks.scala @@ -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 +}