From 915c20fedc0bce593d620e27719252389e043823 Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Fri, 9 Aug 2024 08:37:43 -0600 Subject: [PATCH 1/4] Handle Clipboard being undefined in insecure contexts --- src/Web/Clipboard/Clipboard.js | 10 ++++++++-- src/Web/Clipboard/Clipboard.purs | 8 ++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Web/Clipboard/Clipboard.js b/src/Web/Clipboard/Clipboard.js index 1808ff6..03d2429 100644 --- a/src/Web/Clipboard/Clipboard.js +++ b/src/Web/Clipboard/Clipboard.js @@ -1,6 +1,12 @@ -export function clipboard(navigator) { +export function clipboardWrapper(just, nothing, navigator) { return function () { - return navigator.clipboard; + var clp = navigator.clipboard; + if (typeof clp === 'undefined') { + // This is expected if we don't have a SecureContext (see w3 spec). + return nothing; + } else { + return just(clp); + } }; } diff --git a/src/Web/Clipboard/Clipboard.purs b/src/Web/Clipboard/Clipboard.purs index 6d3c6af..6af7cd6 100644 --- a/src/Web/Clipboard/Clipboard.purs +++ b/src/Web/Clipboard/Clipboard.purs @@ -2,7 +2,8 @@ module Web.Clipboard where import Prelude -import Data.Maybe (Maybe) +import Data.Function.Uncurried (Fn3, runFn3) +import Data.Maybe (Maybe(..)) import Effect (Effect) import Promise (Promise) import Unsafe.Coerce (unsafeCoerce) @@ -10,7 +11,10 @@ import Web.Event.Internal.Types (EventTarget) import Web.HTML (Navigator) import Web.Internal.FFI (unsafeReadProtoTagged) -foreign import clipboard :: Navigator -> Effect Clipboard +foreign import clipboardWrapper :: Fn3 (forall a. a -> Maybe a) (forall a. Maybe a) Navigator (Effect (Maybe Clipboard)) + +clipboard :: Navigator -> Effect (Maybe Clipboard) +clipboard = runFn3 clipboardWrapper Just Nothing foreign import data Clipboard :: Type From 1ab4fcf2121ad4644049ef3eeac0ba5666a0625b Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Fri, 9 Aug 2024 08:40:37 -0600 Subject: [PATCH 2/4] Add changelog entry for Maybeness of window.clipboard --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a4733f..ad2136d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ Notable changes to this project are documented in this file. The format is based Breaking changes: +- `clipboard` now returns `Effect (Maybe Clipboard)` instead of `Effect Clipboard`. + This is because insecure contexts don't have the clipboard available, see + [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/clipboard). + New features: Bugfixes: From 7ec28485f3d4fd52d683a0c3bd436bcf5aa3bed1 Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Fri, 9 Aug 2024 09:57:04 -0600 Subject: [PATCH 3/4] Add explicit export list --- src/Web/Clipboard/Clipboard.purs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Web/Clipboard/Clipboard.purs b/src/Web/Clipboard/Clipboard.purs index 6af7cd6..916a683 100644 --- a/src/Web/Clipboard/Clipboard.purs +++ b/src/Web/Clipboard/Clipboard.purs @@ -1,4 +1,11 @@ -module Web.Clipboard where +module Web.Clipboard + ( clipboard + , Clipboard + , toEventTarget + , fromEventTarget + , readText + , writeText + ) where import Prelude From 19d872bf16749d1d7921fe7f168428c964042b15 Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Fri, 9 Aug 2024 12:35:10 -0600 Subject: [PATCH 4/4] Use double quotes for string literal --- src/Web/Clipboard/Clipboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Web/Clipboard/Clipboard.js b/src/Web/Clipboard/Clipboard.js index 03d2429..ff60356 100644 --- a/src/Web/Clipboard/Clipboard.js +++ b/src/Web/Clipboard/Clipboard.js @@ -1,7 +1,7 @@ export function clipboardWrapper(just, nothing, navigator) { return function () { var clp = navigator.clipboard; - if (typeof clp === 'undefined') { + if (typeof clp === "undefined") { // This is expected if we don't have a SecureContext (see w3 spec). return nothing; } else {