From cffbb174712d7ef7f936a3d7630a220a50952035 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 28 Jan 2023 07:50:56 +0000 Subject: [PATCH 1/3] Add `LockManager` and friends --- api-reports/2_12.txt | 19 +++++++++++++ api-reports/2_13.txt | 19 +++++++++++++ dom/.scala-build/.scalafmt.conf | 28 +++++++++++++++++++ .../scala-2/org/scalajs/dom/LockMode.scala | 12 ++++++++ .../scala-3/org/scalajs/dom/LockMode.scala | 11 ++++++++ dom/src/main/scala/org/scalajs/dom/Lock.scala | 20 +++++++++++++ .../main/scala/org/scalajs/dom/LockInfo.scala | 14 ++++++++++ .../scala/org/scalajs/dom/LockManager.scala | 24 ++++++++++++++++ .../org/scalajs/dom/LockManagerSnapshot.scala | 15 ++++++++++ .../scala/org/scalajs/dom/LockOptions.scala | 26 +++++++++++++++++ .../scala/org/scalajs/dom/Navigator.scala | 2 +- .../org/scalajs/dom/NavigatorLocks.scala | 12 ++++++++ 12 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 dom/.scala-build/.scalafmt.conf create mode 100644 dom/src/main/scala-2/org/scalajs/dom/LockMode.scala create mode 100644 dom/src/main/scala-3/org/scalajs/dom/LockMode.scala create mode 100644 dom/src/main/scala/org/scalajs/dom/Lock.scala create mode 100644 dom/src/main/scala/org/scalajs/dom/LockInfo.scala create mode 100644 dom/src/main/scala/org/scalajs/dom/LockManager.scala create mode 100644 dom/src/main/scala/org/scalajs/dom/LockManagerSnapshot.scala create mode 100644 dom/src/main/scala/org/scalajs/dom/LockOptions.scala create mode 100644 dom/src/main/scala/org/scalajs/dom/NavigatorLocks.scala 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/.scala-build/.scalafmt.conf b/dom/.scala-build/.scalafmt.conf new file mode 100644 index 000000000..ad8fcac64 --- /dev/null +++ b/dom/.scala-build/.scalafmt.conf @@ -0,0 +1,28 @@ +version = "3.7.1" +runner.dialect = scala213source3 +project.git = true +style = Scala.js +project.includeFilters = ["src/main/scala/org/scalajs/.*\\.scala"] +maxColumn = 120 + +danglingParentheses.callSite = false +danglingParentheses.ctrlSite = false +danglingParentheses.defnSite = false +docstrings.oneline = fold +docstrings.style = SpaceAsterisk +literals.hexDigits = Upper +literals.scientific = Upper +newlines.afterCurlyLambdaParams = never +newlines.alwaysBeforeElseAfterCurlyIf = false +newlines.beforeCurlyLambdaParams = never +newlines.topLevelStatements = [before] +optIn.forceBlankLineBeforeDocstring = true + +rewrite.sortModifiers.order = [ + "override", "final", "implicit", + "sealed", "abstract", + "private", "protected", + "open", "opaque", "infix", + "transparent", "inline", + "lazy" +] 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..aa393b066 --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/Lock.scala @@ -0,0 +1,20 @@ +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]], 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]] when the lock was requested. */ + def mode: LockMode = js.native + + /** The name passed to [[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..c73d8f626 --- /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 [[js.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 +} From 7081bbdae66601aa3612f42e174bb60eae556c8a Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sat, 28 Jan 2023 18:11:53 +0000 Subject: [PATCH 2/3] Fix scaladoc linking --- dom/src/main/scala/org/scalajs/dom/Lock.scala | 11 +++++++---- dom/src/main/scala/org/scalajs/dom/LockManager.scala | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/dom/src/main/scala/org/scalajs/dom/Lock.scala b/dom/src/main/scala/org/scalajs/dom/Lock.scala index aa393b066..a10116fec 100644 --- a/dom/src/main/scala/org/scalajs/dom/Lock.scala +++ b/dom/src/main/scala/org/scalajs/dom/Lock.scala @@ -4,17 +4,20 @@ 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]], or a record of an active or queued lock returned by - * [[LockManager.query]]. + * 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]] when the lock was requested. */ + /** 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]] when the lock was requested. */ + /** 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/LockManager.scala b/dom/src/main/scala/org/scalajs/dom/LockManager.scala index c73d8f626..18824c008 100644 --- a/dom/src/main/scala/org/scalajs/dom/LockManager.scala +++ b/dom/src/main/scala/org/scalajs/dom/LockManager.scala @@ -14,7 +14,7 @@ class LockManager private[this] extends js.Object { 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 [[js.Promise]] that resolves with `undefined`. + * 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 From a8f46df3fcfac7faa664b8678ce96381d4cb6021 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sun, 29 Jan 2023 01:30:54 +0000 Subject: [PATCH 3/3] Cast out imposter scalafmt conf --- dom/.scala-build/.scalafmt.conf | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 dom/.scala-build/.scalafmt.conf diff --git a/dom/.scala-build/.scalafmt.conf b/dom/.scala-build/.scalafmt.conf deleted file mode 100644 index ad8fcac64..000000000 --- a/dom/.scala-build/.scalafmt.conf +++ /dev/null @@ -1,28 +0,0 @@ -version = "3.7.1" -runner.dialect = scala213source3 -project.git = true -style = Scala.js -project.includeFilters = ["src/main/scala/org/scalajs/.*\\.scala"] -maxColumn = 120 - -danglingParentheses.callSite = false -danglingParentheses.ctrlSite = false -danglingParentheses.defnSite = false -docstrings.oneline = fold -docstrings.style = SpaceAsterisk -literals.hexDigits = Upper -literals.scientific = Upper -newlines.afterCurlyLambdaParams = never -newlines.alwaysBeforeElseAfterCurlyIf = false -newlines.beforeCurlyLambdaParams = never -newlines.topLevelStatements = [before] -optIn.forceBlankLineBeforeDocstring = true - -rewrite.sortModifiers.order = [ - "override", "final", "implicit", - "sealed", "abstract", - "private", "protected", - "open", "opaque", "infix", - "transparent", "inline", - "lazy" -]