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.

Reply via email to