From 9e69c84dea049704dd59ae321f1c735b2e432e4d Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Mon, 6 Sep 2021 02:58:54 +0000 Subject: [PATCH 1/2] Migrate beacon to dom --- api-reports/2_12.txt | 13 +++-- api-reports/2_13.txt | 13 +++-- src/main/scala/org/scalajs/dom/beacon.scala | 52 +++++++++++++++++ .../dom/experimental/beacon/package.scala | 57 +++++-------------- src/main/scala/org/scalajs/dom/lib.scala | 10 ++++ 5 files changed, 91 insertions(+), 54 deletions(-) create mode 100644 src/main/scala/org/scalajs/dom/beacon.scala diff --git a/api-reports/2_12.txt b/api-reports/2_12.txt index ab2a47ead..d0ce24aa2 100644 --- a/api-reports/2_12.txt +++ b/api-reports/2_12.txt @@ -275,6 +275,8 @@ AudioTrackList[JT] var onaddtrack: js.Function1[TrackEvent, _] AudioTrackList[JT] var onchange: js.Function1[js.Any, _] AudioTrackList[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit AudioTrackList[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit +BeaconNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean +BeaconWorkerNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean BeforeUnloadEvent[JC] def bubbles: Boolean BeforeUnloadEvent[JC] def cancelBubble: Boolean BeforeUnloadEvent[JC] def cancelable: Boolean @@ -14356,6 +14358,8 @@ Navigator[JC] def platform: String Navigator[JC] def userAgent: String Navigator[JC] def vibrate(duration: Double): Boolean Navigator[JC] def vibrate(pattern: js.Array[Double]): Boolean +Navigator[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator +Navigator[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator NavigatorContentUtils[JT] NavigatorGeolocation[JT] def geolocation: Geolocation NavigatorID[JT] def appName: String @@ -24309,11 +24313,10 @@ experimental/PointerLock.PointerLockElement[JT] def requestPointerLock(): Unit experimental/PointerLock.PointerLockMouseEvent[JT] def movementX: Double experimental/PointerLock.PointerLockMouseEvent[JT] def movementY: Double experimental/Vibration[SO] (@deprecated in 2.0.0) -experimental/beacon/package[SO] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean -experimental/beacon/package[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator -experimental/beacon/package[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator -experimental/beacon/package.BeaconNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean -experimental/beacon/package.BeaconWorkerNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean +experimental/beacon/package[SO] type BeaconNavigator = dom.BeaconNavigator (@deprecated in 2.0.0) +experimental/beacon/package[SO] type BeaconWorkerNavigator = dom.BeaconWorkerNavigator (@deprecated in 2.0.0) +experimental/beacon/package[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator (@deprecated in 2.0.0) +experimental/beacon/package[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator (@deprecated in 2.0.0) experimental/cachestorage/Cache[JC] def add(request: RequestInfo): js.Promise[Unit] experimental/cachestorage/Cache[JC] def addAll(requests: js.Array[RequestInfo]): js.Promise[Unit] experimental/cachestorage/Cache[JC] def delete(request: RequestInfo, options: js.UndefOr[CacheQueryOptions]?): js.Promise[Boolean] diff --git a/api-reports/2_13.txt b/api-reports/2_13.txt index ab2a47ead..d0ce24aa2 100644 --- a/api-reports/2_13.txt +++ b/api-reports/2_13.txt @@ -275,6 +275,8 @@ AudioTrackList[JT] var onaddtrack: js.Function1[TrackEvent, _] AudioTrackList[JT] var onchange: js.Function1[js.Any, _] AudioTrackList[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit AudioTrackList[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit +BeaconNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean +BeaconWorkerNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean BeforeUnloadEvent[JC] def bubbles: Boolean BeforeUnloadEvent[JC] def cancelBubble: Boolean BeforeUnloadEvent[JC] def cancelable: Boolean @@ -14356,6 +14358,8 @@ Navigator[JC] def platform: String Navigator[JC] def userAgent: String Navigator[JC] def vibrate(duration: Double): Boolean Navigator[JC] def vibrate(pattern: js.Array[Double]): Boolean +Navigator[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator +Navigator[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator NavigatorContentUtils[JT] NavigatorGeolocation[JT] def geolocation: Geolocation NavigatorID[JT] def appName: String @@ -24309,11 +24313,10 @@ experimental/PointerLock.PointerLockElement[JT] def requestPointerLock(): Unit experimental/PointerLock.PointerLockMouseEvent[JT] def movementX: Double experimental/PointerLock.PointerLockMouseEvent[JT] def movementY: Double experimental/Vibration[SO] (@deprecated in 2.0.0) -experimental/beacon/package[SO] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean -experimental/beacon/package[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator -experimental/beacon/package[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator -experimental/beacon/package.BeaconNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean -experimental/beacon/package.BeaconWorkerNavigator[JT] def sendBeacon(url: String, data: dom.BodyInit = null): Boolean +experimental/beacon/package[SO] type BeaconNavigator = dom.BeaconNavigator (@deprecated in 2.0.0) +experimental/beacon/package[SO] type BeaconWorkerNavigator = dom.BeaconWorkerNavigator (@deprecated in 2.0.0) +experimental/beacon/package[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator (@deprecated in 2.0.0) +experimental/beacon/package[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator (@deprecated in 2.0.0) experimental/cachestorage/Cache[JC] def add(request: RequestInfo): js.Promise[Unit] experimental/cachestorage/Cache[JC] def addAll(requests: js.Array[RequestInfo]): js.Promise[Unit] experimental/cachestorage/Cache[JC] def delete(request: RequestInfo, options: js.UndefOr[CacheQueryOptions]?): js.Promise[Boolean] diff --git a/src/main/scala/org/scalajs/dom/beacon.scala b/src/main/scala/org/scalajs/dom/beacon.scala new file mode 100644 index 000000000..cf1af0502 --- /dev/null +++ b/src/main/scala/org/scalajs/dom/beacon.scala @@ -0,0 +1,52 @@ +package org.scalajs.dom + +import org.scalajs.dom +import scala.scalajs.js + +/** The Beacon interface is used to schedule an asynchronous and non-blocking request to a web server. Beacon requests + * use the HTTP PUT method and requests typically do not require a response. Requests are guaranteed to be initiated + * before a page is unloaded and they are run to completion without requiring a blocking request (for example + * XMLHttpRequest). + * + * @see + * [[https://www.w3.org/TR/2016/WD-beacon-20160204/ Beacon W3C Working Draft]] + * @see + * [[https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API MDN Beacon API]] + */ +@js.native +trait BeaconNavigator extends js.Object { + + /** The navigator.sendBeacon() method can be used to asynchronously transfer small HTTP data from the User Agent to a + * web server. + * + * @param url + * The url parameter indicates the resolved URL where the data is to be transmitted. + * @param data + * The data parameter is the ArrayBufferView, Blob, DOMString, or FormData data that is to be transmitted. + */ + def sendBeacon(url: String, data: dom.BodyInit = null): Boolean = js.native +} + +/** The Beacon interface is used to schedule an asynchronous and non-blocking request to a web server. Beacon requests + * use the HTTP PUT method and requests typically do not require a response. Requests are guaranteed to be initiated + * before a page is unloaded and they are run to completion without requiring a blocking request (for example + * XMLHttpRequest). + * + * @see + * [[https://www.w3.org/TR/2016/WD-beacon-20160204/ Beacon W3C Working Draft]] + * @see + * [[https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API MDN Beacon API]] + */ +@js.native +trait BeaconWorkerNavigator extends js.Object { + + /** The navigator.sendBeacon() method can be used to asynchronously transfer small HTTP data from the User Agent to a + * web server. + * + * @param url + * The url parameter indicates the resolved URL where the data is to be transmitted. + * @param data + * The data parameter is the ArrayBufferView, Blob, DOMString, or FormData data that is to be transmitted. + */ + def sendBeacon(url: String, data: dom.BodyInit = null): Boolean = js.native +} diff --git a/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala b/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala index 330098f7a..502738e2d 100644 --- a/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala +++ b/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala @@ -1,54 +1,23 @@ -package org.scalajs.dom.experimental +package org.scalajs +package dom +package experimental -import org.scalajs.dom -import org.scalajs.dom.{Navigator, WorkerNavigator} import scala.language.implicitConversions -import scala.scalajs.js -/** The Beacon interface is used to schedule an asynchronous and non-blocking request to a web server. Beacon requests - * use the HTTP PUT method and requests typically do not require a response. Requests are guaranteed to be initiated - * before a page is unloaded and they are run to completion without requiring a blocking request (for example - * XMLHttpRequest). - * - * @see - * [[https://www.w3.org/TR/2016/WD-beacon-20160204/ Beacon W3C Working Draft]] - * @see - * [[https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API MDN Beacon API]] - */ package object beacon { - implicit def toBeaconNavigator(n: Navigator): BeaconNavigator = - n.asInstanceOf[BeaconNavigator] - - implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator = { - n.asInstanceOf[BeaconWorkerNavigator] - } + @deprecated("use dom.BeaconNavigator instead", "2.0.0") + type BeaconNavigator = dom.BeaconNavigator - @js.native - trait BeaconNavigator extends js.Object { + @deprecated("use dom.BeaconWorkerNavigator instead", "2.0.0") + type BeaconWorkerNavigator = dom.BeaconWorkerNavigator - /** The navigator.sendBeacon() method can be used to asynchronously transfer small HTTP data from the User Agent to - * a web server. - * - * @param url - * The url parameter indicates the resolved URL where the data is to be transmitted. - * @param data - * The data parameter is the ArrayBufferView, Blob, DOMString, or FormData data that is to be transmitted. - */ - def sendBeacon(url: String, data: dom.BodyInit = null): Boolean = js.native - } + @deprecated("use dom.Navigator.toBeaconNavigator instead", "2.0.0") + implicit def toBeaconNavigator(n: Navigator): BeaconNavigator = + Navigator.toBeaconNavigator(n) - @js.native - trait BeaconWorkerNavigator extends js.Object { + @deprecated("use dom.Navigator.toBeaconWorkerNavigator instead", "2.0.0") + implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator = + Navigator.toBeaconWorkerNavigator(n) - /** The navigator.sendBeacon() method can be used to asynchronously transfer small HTTP data from the User Agent to - * a web server. - * - * @param url - * The url parameter indicates the resolved URL where the data is to be transmitted. - * @param data - * The data parameter is the ArrayBufferView, Blob, DOMString, or FormData data that is to be transmitted. - */ - def sendBeacon(url: String, data: dom.BodyInit = null): Boolean = js.native - } } diff --git a/src/main/scala/org/scalajs/dom/lib.scala b/src/main/scala/org/scalajs/dom/lib.scala index 737320ab2..a7ef1b696 100644 --- a/src/main/scala/org/scalajs/dom/lib.scala +++ b/src/main/scala/org/scalajs/dom/lib.scala @@ -317,6 +317,16 @@ class Navigator def clipboard: Clipboard = js.native } +object Navigator { + + implicit def toBeaconNavigator(n: Navigator): BeaconNavigator = + n.asInstanceOf[BeaconNavigator] + + implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator = + n.asInstanceOf[BeaconWorkerNavigator] + +} + @js.native trait NodeSelector extends js.Object { From 0e62bff6b3f8f8eb95a3a55c7a54138335e9e9a7 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Mon, 6 Sep 2021 03:45:11 +0000 Subject: [PATCH 2/2] Move implicit to correct companion --- api-reports/2_12.txt | 2 +- api-reports/2_13.txt | 2 +- src/main/scala/org/scalajs/dom/WebWorkerTypes.scala | 7 +++++++ .../org/scalajs/dom/experimental/beacon/package.scala | 4 ++-- src/main/scala/org/scalajs/dom/lib.scala | 3 --- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/api-reports/2_12.txt b/api-reports/2_12.txt index d0ce24aa2..860690d3e 100644 --- a/api-reports/2_12.txt +++ b/api-reports/2_12.txt @@ -14359,7 +14359,6 @@ Navigator[JC] def userAgent: String Navigator[JC] def vibrate(duration: Double): Boolean Navigator[JC] def vibrate(pattern: js.Array[Double]): Boolean Navigator[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator -Navigator[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator NavigatorContentUtils[JT] NavigatorGeolocation[JT] def geolocation: Geolocation NavigatorID[JT] def appName: String @@ -24017,6 +24016,7 @@ WorkerNavigator[JT] def languages: js.Array[String] WorkerNavigator[JT] def onLine: Boolean WorkerNavigator[JT] def platform: String WorkerNavigator[JT] def userAgent: String +WorkerNavigator[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator WriteableState[JT] WriteableState[SO] val closed: WriteableState WriteableState[SO] val closing: WriteableState diff --git a/api-reports/2_13.txt b/api-reports/2_13.txt index d0ce24aa2..860690d3e 100644 --- a/api-reports/2_13.txt +++ b/api-reports/2_13.txt @@ -14359,7 +14359,6 @@ Navigator[JC] def userAgent: String Navigator[JC] def vibrate(duration: Double): Boolean Navigator[JC] def vibrate(pattern: js.Array[Double]): Boolean Navigator[SO] implicit def toBeaconNavigator(n: Navigator): BeaconNavigator -Navigator[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator NavigatorContentUtils[JT] NavigatorGeolocation[JT] def geolocation: Geolocation NavigatorID[JT] def appName: String @@ -24017,6 +24016,7 @@ WorkerNavigator[JT] def languages: js.Array[String] WorkerNavigator[JT] def onLine: Boolean WorkerNavigator[JT] def platform: String WorkerNavigator[JT] def userAgent: String +WorkerNavigator[SO] implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator WriteableState[JT] WriteableState[SO] val closed: WriteableState WriteableState[SO] val closing: WriteableState diff --git a/src/main/scala/org/scalajs/dom/WebWorkerTypes.scala b/src/main/scala/org/scalajs/dom/WebWorkerTypes.scala index 85fbdfce7..949cf7a19 100644 --- a/src/main/scala/org/scalajs/dom/WebWorkerTypes.scala +++ b/src/main/scala/org/scalajs/dom/WebWorkerTypes.scala @@ -1,5 +1,6 @@ package org.scalajs.dom +import scala.language.implicitConversions import scala.scalajs.js import scala.scalajs.js.annotation._ @@ -169,6 +170,12 @@ object DedicatedWorkerGlobalScope extends js.Object { @js.native trait WorkerNavigator extends NavigatorID with NavigatorOnLine with NavigatorLanguage +object WorkerNavigator { + + implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator = + n.asInstanceOf[BeaconWorkerNavigator] +} + /** The WorkerLocation interface defines the absolute location of the script executed by the Worker. Such an object is * initialized for each worker and is available via the WorkerGlobalScope.location property obtained by calling * window.self.location. diff --git a/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala b/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala index 502738e2d..b79a021f5 100644 --- a/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala +++ b/src/main/scala/org/scalajs/dom/experimental/beacon/package.scala @@ -16,8 +16,8 @@ package object beacon { implicit def toBeaconNavigator(n: Navigator): BeaconNavigator = Navigator.toBeaconNavigator(n) - @deprecated("use dom.Navigator.toBeaconWorkerNavigator instead", "2.0.0") + @deprecated("use dom.WorkerNavigator.toBeaconWorkerNavigator instead", "2.0.0") implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator = - Navigator.toBeaconWorkerNavigator(n) + WorkerNavigator.toBeaconWorkerNavigator(n) } diff --git a/src/main/scala/org/scalajs/dom/lib.scala b/src/main/scala/org/scalajs/dom/lib.scala index a7ef1b696..cf806d9a8 100644 --- a/src/main/scala/org/scalajs/dom/lib.scala +++ b/src/main/scala/org/scalajs/dom/lib.scala @@ -322,9 +322,6 @@ object Navigator { implicit def toBeaconNavigator(n: Navigator): BeaconNavigator = n.asInstanceOf[BeaconNavigator] - implicit def toBeaconWorkerNavigator(n: WorkerNavigator): BeaconWorkerNavigator = - n.asInstanceOf[BeaconWorkerNavigator] - } @js.native