Apologies.  That stackoverflow example gets blocked due to cross origin.

Just ran a simple test:

<html>
<script>
async function readClipboard () {
  if (!navigator.clipboard) {
    // Clipboard API not available
    return
  }
  try {
    const text = await navigator.clipboard.readText();
    document.querySelector('.clipboard-content').innerText = text;
  } catch (err) {
    console.error('Failed to copy!', err)
  }
}

function updateClipboard() {
  // Here You Can Debug without DomException
  debugger
  const clipboard = document.querySelector('.clipboard-content').innerText;
  document.querySelector('.clipboard-content').innerText = 'Updated => ' + 
clipboard;
}
</script>

<body>
<button onclick="readClipboard()">Paste</button>
<p class="clipboard-content"></p>
<button onclick="updateClipboard()">Edit</button>
</body>
</html>

and it worked fine (browser popped up a message asking for permission).

On Thursday, 29 December 2022 at 5:02:34 pm UTC+11 Craig Mitchell wrote:

> 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/9856ced4-a191-499c-9118-edc72ef6831fn%40googlegroups.com.

Reply via email to