Browsers now need you to get your users to grant permissions in their browsers for this to work. See "Permissions API" here: https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/readText#security
An example: https://stackoverflow.com/a/59954231/418057 When I run the code snippet, and press "paste", it give "NotAllowedError". On Monday, 26 December 2022 at 5:02:32 pm UTC+11 [email protected] wrote: > Hi Experts, > I am newbie with javascript and GWT, I want my function to return > clipboard data,for further use in application upon click of(tool button). > Is there any way to get the text read from clipboard, I am looking > something similar @Jim Douglas mentioned, with > $wnd.navigator.clipboard.readText() is working but I need the "pasted" text > to be returned to my native method call > > public static native String readText(){ > try{ > if($wnd.navigator.clipboard){ > var promise= $wnd.navigator.clipboard.readText(); > var resolve =function(text){ > console.log(text); // i want this text which i can see on > console(string) to be returned , Is it possible and how to achieve it any > hack to ge > } > } > } > } > > Please help, as i got stuck at this point for a while. Thanks. > On Wednesday, 16 October 2019 at 19:53:27 UTC+5:30 Jim Douglas wrote: > >> Oh wow, I completely missed that. Of course *navigator* is really >> *window.navigator*. JavaScript sample code almost always references >> *navigator*, not *window.navigator*, and I rarely think of that detail. >> Even after staring at that code for hours looking for something I might >> have missed, that never occurred to me. Thanks, Thomas; that's exactly what >> I was missing. With that simple change, this now works. >> >> >> On Wednesday, October 16, 2019 at 5:44:05 AM UTC-7, Thomas Broyer wrote: >>> >>> Have you tried with $wnd.navigator.clipboard? >>> >>> On Tuesday, October 15, 2019 at 10:40:04 PM UTC+2, Jim Douglas wrote: >>>> >>>> Ok, there are a few moving parts to this. Keeping it as short as >>>> possible, this is the new Clipboard API: >>>> >>>> https://developer.mozilla.org/en-US/docs/Web/API/Clipboard >>>> >>>> Support is extremely limited at the moment, but for now I'd be happy to >>>> get something working in Chrome: >>>> >>>> https://caniuse.com/#feat=mdn-api_clipboard >>>> >>>> Here's Google's live sample page: >>>> >>>> https://googlechrome.github.io/samples/async-clipboard/index.html >>>> >>>> For obvious reasons, there's a lot of paranoid security around >>>> JavaScript access to the clipboard. This is the specific detail I'm >>>> running >>>> into: >>>> >>>> >>>> https://stackoverflow.com/questions/56306153/domexception-on-calling-navigator-clipboard-readtext >>>> >>>> These APIs throw a security exception if document.hasFocus() is false. >>>> And I'm not seeing any way to honour that rule in a GWT app. In my >>>> production app, and in a tiny standalone GWT app I just generated for >>>> testing purposes, document.hasFocus() is always false ($doc.hasFocus() is >>>> true). >>>> >>>> For testing purposes, I generated the GWT StockWatcher demo app: >>>> >>>> http://www.gwtproject.org/doc/latest/tutorial/create.html >>>> >>>> Then I added some UI hooks for clipboard testing elements in >>>> StockWatcher.html: >>>> >>>> <h1>Web Application Starter Project</h1> >>>> >>>> >>>> <table align=*"center"*> >>>> >>>> <tr> >>>> >>>> <td colspan=*"2"* style="font-weight:*bold*;">Please enter >>>> your name:</td> >>>> >>>> </tr> >>>> >>>> <tr> >>>> >>>> <td id=*"nameFieldContainer"*></td> >>>> >>>> <td id=*"sendButtonContainer"*></td> >>>> >>>> </tr> >>>> >>>> <tr> >>>> >>>> <td colspan=*"2"* style="color:*red*;" id= >>>> *"errorLabelContainer"*></td> >>>> >>>> </tr> >>>> >>>> <tr> >>>> >>>> <td id=*"readTextField"*></td> >>>> >>>> <td id=*"readTextButton"*></td> >>>> >>>> </tr> >>>> >>>> <tr> >>>> >>>> <td id=*"writeTextField"*></td> >>>> >>>> <td id=*"writeTextButton"*></td> >>>> >>>> </tr> >>>> >>>> </table> >>>> >>>> And minimal testing UI in StockWatcher.java onModuleLoad: >>>> >>>> TextBox readText = *new* TextBox(); >>>> >>>> readText.setText("readText"); >>>> >>>> Button readTextButton = *new* Button("readText"); >>>> >>>> >>>> TextBox writeText = *new* TextBox(); >>>> >>>> writeText.setText("writeText"); >>>> >>>> Button writeTextButton = *new* Button("writeText"); >>>> >>>> >>>> >>>> RootPanel.*get*("readTextField").add(readText); >>>> >>>> RootPanel.*get*("readTextButton").add(readTextButton); >>>> >>>> >>>> >>>> RootPanel.*get*("writeTextField").add(writeText); >>>> >>>> RootPanel.*get*("writeTextButton").add(writeTextButton); >>>> >>>> readTextButton.addClickHandler(*new* ClickHandler() >>>> >>>> { >>>> >>>> *public* *void* onClick(ClickEvent event) >>>> >>>> { >>>> >>>> readText(); >>>> >>>> } >>>> >>>> }); >>>> >>>> >>>> >>>> writeTextButton.addClickHandler(*new* ClickHandler() >>>> >>>> { >>>> >>>> *public* *void* onClick(ClickEvent event) >>>> >>>> { >>>> >>>> writeText(writeText.getText()); >>>> >>>> } >>>> >>>> }); >>>> >>>> And corresponding JSNI functions to attempt to invoke the Clipboard API: >>>> >>>> >>>> >>>> *public* *native* *void* readText() >>>> >>>> /*-{ >>>> >>>> try >>>> >>>> { >>>> >>>> if (navigator.clipboard) >>>> >>>> { >>>> >>>> console.log('navigator.clipboard.readText()'); >>>> >>>> console.log('document.hasFocus()=' >>>> +document.hasFocus()); >>>> >>>> console.log('$doc.hasFocus()='+$doc.hasFocus()); >>>> >>>> var promise = navigator.clipboard.readText(); >>>> >>>> var resolve = function(text) { >>>> >>>> console.log(text); >>>> >>>> }; >>>> >>>> var reject = function(reason) { >>>> >>>> console.log('navigator.clipboard.readText failed: ' >>>> +reason); >>>> >>>> }; >>>> >>>> promise["catch"](reject); >>>> >>>> promise.then(resolve,reject)["catch"](reject); >>>> >>>> } >>>> >>>> else >>>> >>>> { >>>> >>>> console.log('This browser does not support >>>> navigator.clipboard.'); >>>> >>>> } >>>> >>>> } >>>> >>>> catch (e) >>>> >>>> { >>>> >>>> console.error(e,e.stack); >>>> >>>> } >>>> >>>> }-*/; >>>> >>>> >>>> >>>> >>>> *public* *native* *void* writeText(String p_text) >>>> >>>> /*-{ >>>> >>>> try >>>> >>>> { >>>> >>>> var _this = this; >>>> >>>> if (navigator.clipboard) >>>> >>>> { >>>> >>>> console.log('navigator.clipboard.writeText()'); >>>> >>>> console.log('document.hasFocus()=' >>>> +document.hasFocus()); >>>> >>>> console.log('$doc.hasFocus()='+$doc.hasFocus()); >>>> >>>> var promise = navigator.clipboard.writeText(p_text); >>>> >>>> var resolve = function(text) { >>>> >>>> console.log('navigator.clipboard.writeText '+text); >>>> >>>> }; >>>> >>>> var reject = function(reason) { >>>> >>>> console.log('navigator.clipboard.writeText failed: >>>> '+reason); >>>> >>>> }; >>>> >>>> promise["catch"](reject); >>>> >>>> promise.then(resolve,reject)["catch"](reject); >>>> >>>> } >>>> >>>> else >>>> >>>> { >>>> >>>> console.log('This browser does not support >>>> navigator.clipboard.'); >>>> >>>> } >>>> >>>> } >>>> >>>> catch (e) >>>> >>>> { >>>> >>>> console.error(e,e.stack); >>>> >>>> } >>>> >>>> }-*/; >>>> >>>> And I'm stuck on the same security error noted in that StackOverflow >>>> question, but with no obvious way to satisfy that requirement: >>>> >>>> navigator.clipboard.readText() >>>> >>>> document.hasFocus()=false >>>> >>>> $doc.hasFocus()=true >>>> >>>> navigator.clipboard.readText failed: NotAllowedError: Document is not >>>> focused. >>>> >>>> >>>> navigator.clipboard.writeText() >>>> >>>> document.hasFocus()=false >>>> >>>> $doc.hasFocus()=true >>>> >>>> navigator.clipboard.writeText failed: NotAllowedError: Document is not >>>> focused. >>>> >>>> >>>> >>>> Is there any way to make this work in GWT? >>>> >>> -- You received this message because you are subscribed to the Google Groups "GWT Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit/d488a888-3eca-40fe-8fbb-91ef2010091fn%40googlegroups.com.
