From 1524d724a44df06d7bcd8aa59690bde2beac38de Mon Sep 17 00:00:00 2001 From: fakin Date: Sat, 15 Aug 2020 20:38:53 -0700 Subject: [PATCH 1/5] add bindings for `Navigator` --- src/Webapi/Dom/Webapi__Dom__Navigator.re | 66 +++++++++++++++++++ src/Webapi/Dom/Webapi__Dom__Window.re | 3 +- src/Webapi/Webapi__Dom.re | 2 + .../Dom/Webapi__Dom__Navigator__test.re | 28 ++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/Webapi/Dom/Webapi__Dom__Navigator.re create mode 100644 tests/Webapi/Dom/Webapi__Dom__Navigator__test.re diff --git a/src/Webapi/Dom/Webapi__Dom__Navigator.re b/src/Webapi/Dom/Webapi__Dom__Navigator.re new file mode 100644 index 00000000..0310e907 --- /dev/null +++ b/src/Webapi/Dom/Webapi__Dom__Navigator.re @@ -0,0 +1,66 @@ +open Js.Typed_array; + + +type t; + +type clipboard; +type networkConnection; +type credentialsContainer; +type geolocation; +type mediaDevices; +type mediaSession; +type serviceWorkerContainer; +type xr; +type mediaKeySystemAccess; +type mediaKeySystemConfiguration; +type shareOptions; + +[@bs.get] external buildID : t => string = ""; +[@bs.get] external clipboard : t => clipboard = ""; +[@bs.get] external connection : t => networkConnection = ""; +[@bs.get] external cookieEnabled : t => bool = ""; +[@bs.get] external credentials : t => credentialsContainer = ""; +[@bs.get] external deviceMemory : t => float = ""; +[@bs.get] external geolocation : t => geolocation = ""; +[@bs.get] external language : t => string = ""; +[@bs.get] external maxTouchPoints : t => int = ""; +[@bs.get] external mediaDevices : t => mediaDevices = ""; +[@bs.get] external mediaSession : t => mediaSession = ""; +[@bs.get] external onLine : t => bool = ""; +[@bs.get] external oscpu : t => string = ""; +[@bs.get] external platform : t => string = ""; +[@bs.get] external productSub : t => string = ""; +[@bs.get] external serviceWorker : t => serviceWorkerContainer = ""; +[@bs.get] external vendor : t => string = ""; +[@bs.get] external vendorSub : t => string = ""; +[@bs.get] external webdriver : t => bool = ""; +[@bs.get] external xr : t => xr = ""; + +[@bs.send.pipe : t] external canShare : shareOptions => bool = ""; +[@bs.send.pipe : t] external registerProtocolHandler : (string, string, string) => unit = ""; +[@bs.send.pipe : t] external requestMediaKeySystemAccess : (string, list(mediaKeySystemConfiguration)) => Js.Promise.t(mediaKeySystemAccess) = ""; +[@bs.send.pipe : t] external sendBeacon : ( + string, + [@bs.unwrap] [ + | `ArrayBuffer(ArrayBuffer.t) + | `Int8Array(Int8Array.t) + | `Uint8Array(Uint8Array.t) + | `Uint8ClampedArray(Uint8ClampedArray.t) + | `Int16Array(Int16Array.t) + | `Uint16Array(Uint16Array.t) + | `Int32Array(Int32Array.t) + | `Uint32Array(Uint32Array.t) + | `Float32Array(Float32Array.t) + | `Float64Array(Float64Array.t) + | `DataView(DataView.t) + | `Blob(Webapi__Blob.t) + | `FormData(Fetch.FormData.t) + | `URLSearchParams(Webapi__Url.URLSearchParams.t) + | `String(string) + ]) => bool = ""; +[@bs.send.pipe : t] external share : shareOptions => Js.Promise.t(unit) = ""; +[@bs.send.pipe : t] external vibrate : ( + [@bs.unwrap] [ + | `Int(int) + | `IntList(list(int)) + ]) => bool = ""; diff --git a/src/Webapi/Dom/Webapi__Dom__Window.re b/src/Webapi/Dom/Webapi__Dom__Window.re index a7eb609d..9c876f96 100644 --- a/src/Webapi/Dom/Webapi__Dom__Window.re +++ b/src/Webapi/Dom/Webapi__Dom__Window.re @@ -4,7 +4,6 @@ type frameList; /* array-like, WindowProxy? */ type idleDeadline; /* Cooperative Scheduling of Background Tasks */ type locationbar; /* "bar object" */ type menubar; /* "bar object" */ -type navigator; type personalbar; /* "bar object" */ type screen; type scrollbars; /* "bar object" */ @@ -39,7 +38,7 @@ module Impl = (T: {type t;}) => { [@bs.get] external menubar : t_window => menubar = ""; [@bs.get] external name : t_window => string = ""; [@bs.set] external setName : (t_window, string) => unit = "name"; - [@bs.get] external navigator : t_window => navigator = ""; + [@bs.get] external navigator : t_window => Webapi__Dom__Navigator.t = ""; [@bs.get] [@bs.return nullable] external opener : t_window => option(Dom.window) = ""; [@bs.get] external outerWidth : t_window => int = ""; [@bs.get] external outerHeight : t_window => int = ""; diff --git a/src/Webapi/Webapi__Dom.re b/src/Webapi/Webapi__Dom.re index 8d658660..8f944746 100644 --- a/src/Webapi/Webapi__Dom.re +++ b/src/Webapi/Webapi__Dom.re @@ -38,6 +38,7 @@ module MouseEvent = Webapi__Dom__MouseEvent; module MutationObserver = Webapi__Dom__MutationObserver; module MutationRecord = Webapi__Dom__MutationRecord; module NamedNodeMap = Webapi__Dom__NamedNodeMap; +module Navigator = Webapi__Dom__Navigator; module Node = Webapi__Dom__Node; module NodeFilter = Webapi__Dom__NodeFilter; module NodeIterator = Webapi__Dom__NodeIterator; @@ -71,6 +72,7 @@ include Webapi__Dom__Types; [@bs.val] external document : Dom.document = "document"; [@bs.val] [@bs.scope "window"] external history : Dom.history = "history"; [@bs.val] [@bs.scope "window"] external location : Dom.location = "location"; +[@bs.val] [@bs.scope "window"] external navigator : Webapi__Dom__Navigator.t = "navigator"; /* Unimplemented interfaces (aka. "The TODO list") diff --git a/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re b/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re new file mode 100644 index 00000000..810cabb4 --- /dev/null +++ b/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re @@ -0,0 +1,28 @@ +open Webapi.Dom; +open Navigator; + +let _ = buildID(navigator); +let _ = clipboard(navigator); +let _ = connection(navigator); +let _ = cookieEnabled(navigator); +let _ = credentials(navigator); +let _ = deviceMemory(navigator); +let _ = geolocation(navigator); +let _ = language(navigator); +let _ = maxTouchPoints(navigator); +let _ = mediaDevices(navigator); +let _ = mediaSession(navigator); +let _ = onLine(navigator); +let _ = oscpu(navigator); +let _ = platform(navigator); +let _ = productSub(navigator); +let _ = serviceWorker(navigator); +let _ = vendor(navigator); +let _ = vendorSub(navigator); +let _ = webdriver(navigator); +let _ = xr(navigator); + +navigator |> registerProtocolHandler("web+burger", "https://burgers.example.com/?burger=%s", "Burger handler"); +navigator |> sendBeacon("/log", `String("a whole lotta burgers")); +navigator |> vibrate(`Int(200)); +navigator |> vibrate(`IntList([100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100])); From 498e63a8fab13cfb737bd89472f8c386653b729e Mon Sep 17 00:00:00 2001 From: fakin Date: Mon, 17 Aug 2020 12:32:13 -0700 Subject: [PATCH 2/5] alias existing `navigator` type to `Navigator.t` for backwards compat --- src/Webapi/Dom/Webapi__Dom__Window.re | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Webapi/Dom/Webapi__Dom__Window.re b/src/Webapi/Dom/Webapi__Dom__Window.re index 9c876f96..1ad2a6b7 100644 --- a/src/Webapi/Dom/Webapi__Dom__Window.re +++ b/src/Webapi/Dom/Webapi__Dom__Window.re @@ -4,6 +4,7 @@ type frameList; /* array-like, WindowProxy? */ type idleDeadline; /* Cooperative Scheduling of Background Tasks */ type locationbar; /* "bar object" */ type menubar; /* "bar object" */ +type navigator = Webapi__Dom__Navigator.t; type personalbar; /* "bar object" */ type screen; type scrollbars; /* "bar object" */ @@ -38,7 +39,7 @@ module Impl = (T: {type t;}) => { [@bs.get] external menubar : t_window => menubar = ""; [@bs.get] external name : t_window => string = ""; [@bs.set] external setName : (t_window, string) => unit = "name"; - [@bs.get] external navigator : t_window => Webapi__Dom__Navigator.t = ""; + [@bs.get] external navigator : t_window => navigator = ""; [@bs.get] [@bs.return nullable] external opener : t_window => option(Dom.window) = ""; [@bs.get] external outerWidth : t_window => int = ""; [@bs.get] external outerHeight : t_window => int = ""; From a0a18130d4315978487aa9a896071e4e286b65cc Mon Sep 17 00:00:00 2001 From: fakin Date: Mon, 17 Aug 2020 12:33:02 -0700 Subject: [PATCH 3/5] add `@since` jsdoc for Navigator and remove `Dom.navigator` --- src/Webapi/Webapi__Dom.re | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Webapi/Webapi__Dom.re b/src/Webapi/Webapi__Dom.re index 8f944746..298d0ba9 100644 --- a/src/Webapi/Webapi__Dom.re +++ b/src/Webapi/Webapi__Dom.re @@ -38,7 +38,10 @@ module MouseEvent = Webapi__Dom__MouseEvent; module MutationObserver = Webapi__Dom__MutationObserver; module MutationRecord = Webapi__Dom__MutationRecord; module NamedNodeMap = Webapi__Dom__NamedNodeMap; + +/** @since 0.20.0 */ module Navigator = Webapi__Dom__Navigator; + module Node = Webapi__Dom__Node; module NodeFilter = Webapi__Dom__NodeFilter; module NodeIterator = Webapi__Dom__NodeIterator; @@ -72,7 +75,6 @@ include Webapi__Dom__Types; [@bs.val] external document : Dom.document = "document"; [@bs.val] [@bs.scope "window"] external history : Dom.history = "history"; [@bs.val] [@bs.scope "window"] external location : Dom.location = "location"; -[@bs.val] [@bs.scope "window"] external navigator : Webapi__Dom__Navigator.t = "navigator"; /* Unimplemented interfaces (aka. "The TODO list") From 2ce11ea4487da45b19b2d2818bc64ac102431cb4 Mon Sep 17 00:00:00 2001 From: fakin Date: Mon, 17 Aug 2020 12:37:35 -0700 Subject: [PATCH 4/5] updating PR - omit deprecated/obsolete - comment out experimental - split `vibrate` into `vibrate` and `vibrateArray` - update tests --- .../Dom/Webapi__Dom__Navigator__test.js | 47 +++++++++++++++++++ src/Webapi/Dom/Webapi__Dom__Navigator.re | 41 ++++++++-------- .../Dom/Webapi__Dom__Navigator__test.re | 37 +++++---------- 3 files changed, 79 insertions(+), 46 deletions(-) create mode 100644 lib/js/tests/Webapi/Dom/Webapi__Dom__Navigator__test.js diff --git a/lib/js/tests/Webapi/Dom/Webapi__Dom__Navigator__test.js b/lib/js/tests/Webapi/Dom/Webapi__Dom__Navigator__test.js new file mode 100644 index 00000000..93f1eac7 --- /dev/null +++ b/lib/js/tests/Webapi/Dom/Webapi__Dom__Navigator__test.js @@ -0,0 +1,47 @@ +'use strict'; + + +var $$navigator = window.navigator; + +$$navigator.clipboard; + +$$navigator.cookieEnabled; + +$$navigator.geolocation; + +$$navigator.maxTouchPoints; + +$$navigator.mediaDevices; + +$$navigator.serviceWorker; + +$$navigator.vendor; + +$$navigator.registerProtocolHandler("web+burger", "https://burgers.example.com/?burger=%s", "Burger handler"); + +$$navigator.sendBeacon("/log", "a whole lotta burgers"); + +$$navigator.vibrate(200); + +$$navigator.vibrate([ + 100, + 30, + 100, + 30, + 100, + 30, + 200, + 30, + 200, + 30, + 200, + 30, + 100, + 30, + 100, + 30, + 100 + ]); + +exports.$$navigator = $$navigator; +/* navigator Not a pure module */ diff --git a/src/Webapi/Dom/Webapi__Dom__Navigator.re b/src/Webapi/Dom/Webapi__Dom__Navigator.re index 0310e907..ff810bfc 100644 --- a/src/Webapi/Dom/Webapi__Dom__Navigator.re +++ b/src/Webapi/Dom/Webapi__Dom__Navigator.re @@ -15,30 +15,32 @@ type mediaKeySystemAccess; type mediaKeySystemConfiguration; type shareOptions; -[@bs.get] external buildID : t => string = ""; [@bs.get] external clipboard : t => clipboard = ""; -[@bs.get] external connection : t => networkConnection = ""; +// [@bs.get] external connection : t => networkConnection = ""; /** experimental */ [@bs.get] external cookieEnabled : t => bool = ""; -[@bs.get] external credentials : t => credentialsContainer = ""; -[@bs.get] external deviceMemory : t => float = ""; +// [@bs.get] external credentials : t => credentialsContainer = ""; /** experimental */ +// [@bs.get] external deviceMemory : t => float = ""; /** experimental */ +// [@bs.get] external doNotTrack : t => string = ""; /** experimental */ [@bs.get] external geolocation : t => geolocation = ""; -[@bs.get] external language : t => string = ""; +// [@bs.get] external keyboard : t => keyboard = ""; /** experimental */ +// [@bs.get] external locks : t => lockManager = ""; /** experimental */ [@bs.get] external maxTouchPoints : t => int = ""; +// [@bs.get] external mediaCapabilities : t => mediaCapabilities = ""; /** experimental */ [@bs.get] external mediaDevices : t => mediaDevices = ""; -[@bs.get] external mediaSession : t => mediaSession = ""; -[@bs.get] external onLine : t => bool = ""; -[@bs.get] external oscpu : t => string = ""; -[@bs.get] external platform : t => string = ""; -[@bs.get] external productSub : t => string = ""; +// [@bs.get] external mediaSession : t => mediaSession = ""; /** experimental */ +// [@bs.get] external permissions : t => permissions = ""; /** experimental */ +// [@bs.get] external presentation : t => presentation = ""; /** experimental */ [@bs.get] external serviceWorker : t => serviceWorkerContainer = ""; [@bs.get] external vendor : t => string = ""; -[@bs.get] external vendorSub : t => string = ""; -[@bs.get] external webdriver : t => bool = ""; -[@bs.get] external xr : t => xr = ""; +// [@bs.get] external vendorSub : t => string = ""; /** non-standard */ +// [@bs.get] external wakeLock : t => wakeLock = ""; /** experimental */ +// [@bs.get] external webdriver : t => bool = ""; /** experimental */ +// [@bs.get] external xr : t => xr = ""; /** experimental */ -[@bs.send.pipe : t] external canShare : shareOptions => bool = ""; +// [@bs.send.pipe : t] external canShare : shareOptions => bool = ""; /** experimental */ +// [@bs.send.pipe : t] external getGamePads : unit => array(gamePad) = ""; /** experimental */ [@bs.send.pipe : t] external registerProtocolHandler : (string, string, string) => unit = ""; -[@bs.send.pipe : t] external requestMediaKeySystemAccess : (string, list(mediaKeySystemConfiguration)) => Js.Promise.t(mediaKeySystemAccess) = ""; +[@bs.send.pipe : t] external requestMediaKeySystemAccess : (string, array(mediaKeySystemConfiguration)) => Js.Promise.t(mediaKeySystemAccess) = ""; [@bs.send.pipe : t] external sendBeacon : ( string, [@bs.unwrap] [ @@ -58,9 +60,6 @@ type shareOptions; | `URLSearchParams(Webapi__Url.URLSearchParams.t) | `String(string) ]) => bool = ""; -[@bs.send.pipe : t] external share : shareOptions => Js.Promise.t(unit) = ""; -[@bs.send.pipe : t] external vibrate : ( - [@bs.unwrap] [ - | `Int(int) - | `IntList(list(int)) - ]) => bool = ""; +// [@bs.send.pipe : t] external share : shareOptions => Js.Promise.t(unit) = ""; /** experimental */ +[@bs.send.pipe : t] external vibrate : int => bool = "vibrate"; +[@bs.send.pipe : t] external vibrateArray : array(int) => bool = "vibrate"; diff --git a/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re b/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re index 810cabb4..96c4f61b 100644 --- a/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re +++ b/tests/Webapi/Dom/Webapi__Dom__Navigator__test.re @@ -1,28 +1,15 @@ open Webapi.Dom; -open Navigator; -let _ = buildID(navigator); -let _ = clipboard(navigator); -let _ = connection(navigator); -let _ = cookieEnabled(navigator); -let _ = credentials(navigator); -let _ = deviceMemory(navigator); -let _ = geolocation(navigator); -let _ = language(navigator); -let _ = maxTouchPoints(navigator); -let _ = mediaDevices(navigator); -let _ = mediaSession(navigator); -let _ = onLine(navigator); -let _ = oscpu(navigator); -let _ = platform(navigator); -let _ = productSub(navigator); -let _ = serviceWorker(navigator); -let _ = vendor(navigator); -let _ = vendorSub(navigator); -let _ = webdriver(navigator); -let _ = xr(navigator); +let navigator = Window.navigator(window); +let _ = Navigator.clipboard(navigator); +let _ = Navigator.cookieEnabled(navigator); +let _ = Navigator.geolocation(navigator); +let _ = Navigator.maxTouchPoints(navigator); +let _ = Navigator.mediaDevices(navigator); +let _ = Navigator.serviceWorker(navigator); +let _ = Navigator.vendor(navigator); -navigator |> registerProtocolHandler("web+burger", "https://burgers.example.com/?burger=%s", "Burger handler"); -navigator |> sendBeacon("/log", `String("a whole lotta burgers")); -navigator |> vibrate(`Int(200)); -navigator |> vibrate(`IntList([100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100])); +navigator |> Navigator.registerProtocolHandler("web+burger", "https://burgers.example.com/?burger=%s", "Burger handler"); +navigator |> Navigator.sendBeacon("/log", `String("a whole lotta burgers")); +navigator |> Navigator.vibrate(200); +navigator |> Navigator.vibrateArray([|100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100|]); From 9000d9fc65baf84f16f42a89eae67268bbe4758f Mon Sep 17 00:00:00 2001 From: fakin Date: Mon, 17 Aug 2020 12:37:59 -0700 Subject: [PATCH 5/5] bump version and update changelog --- CHANGELOG.md | 5 +++-- package.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42842ca1..e4635a51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,11 @@ -### 0.19.1 +### 0.20.0 +* Add bindings for `Navigator` +### 0.19.1 * Removed dev dependency on `bsdoc` to allow smooth installs on non-Mac OS ### 0.19.0 - * Added bindings to `ReadableStream` * Added `Webapi.Url.makeWith` * Deprecated `Webapi.Url.makeWithBase` in favor of `Webapi.Url.makeWith` diff --git a/package.json b/package.json index 610bb5f0..3ae2f5a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bs-webapi", - "version": "0.19.1", + "version": "0.20.0", "description": "Reason + BuckleScript bindings to DOM", "repository": { "type": "git",