Xpra: Ticket #2312: clipboard images with html5 client

We want to transfer the pixel data as image/png and set it as best we can using setData or newer methods (#1844).

See THE DEFINITIVE GUIDE TO COPYING AND PASTING IN JAVASCRIPT

The difficulty here is that because the html5 clibpoard is greedy, we need to choose png as soon as we get the clipboard event so we can send the binary data with the token.

Some pointers in ticket:812#comment:29



Mon, 03 Jun 2019 04:01:33 GMT - Antoine Martin: status, description changed


Mon, 03 Jun 2019 06:31:48 GMT - Antoine Martin:

More pointers:

Raising #1844.


Mon, 03 Jun 2019 10:38:09 GMT - Antoine Martin:

As per Chrome Platform Status: Asynchronous Clipboard API: Support for images and other data types is still under development.


Mon, 03 Jun 2019 10:43:09 GMT - Antoine Martin:

MDN: Clipboard: only Firefox has support for read() and write. (since Firefox 63)


Mon, 03 Jun 2019 11:09:36 GMT - Antoine Martin:

Firefox only: clipboard.setImageData The image is provided as an ArrayBuffer? containing the encoded image. JPEG and PNG formats are supported.

Chrome: chrome.clipboard setImageData : Since Chrome 76. Warning: this is the current Dev channel.


Tue, 04 Jun 2019 08:35:29 GMT - Antoine Martin:

The image API is now available in chrome beta: https://bugs.chromium.org/p/chromium/issues/detail?id=150835#c118 This can also be enabled in M75 (released in stable tomorrow) through enabling the experimental flag here: chrome://flags/#enable-experimental-web-platform-features (use this as a link)


Tue, 04 Jun 2019 15:28:05 GMT - Antoine Martin: attachment set

test page that crashes the chrome tab


Tue, 04 Jun 2019 15:34:59 GMT - Antoine Martin: attachment set

support for images in and out with latest chrome - almost working


Tue, 04 Jun 2019 15:38:07 GMT - Antoine Martin:

The patch above almost works, but there is a problem with chrome: the tabs crash... reproducer in attachment/ticket/2312/clipboard.html.

With the new read() and write() API calls, we could modify the new clipboard code to work more like the regular X11 asynchronous clipboard and return the list of data types it supports, without bundling the data with it. Saving lots of bandwidth and making it more reliable when there are multiple options: the client application can then choose the format most suitable instead of us picking one. This would require a reversible mapping from clipboard data types to the wire ones. Tricky?

It would be useful to collect the list of mimetypes we can get from the async API so we can handle them properly rather than assuming we just get UTF8 for text and image/png for images.


Related links:


Thu, 06 Jun 2019 03:55:41 GMT - Antoine Martin:

Merged the image transfer clipboard code (disabled by default) in r22857. (so it won't bitrot)


Wed, 03 Jul 2019 17:03:43 GMT - Antoine Martin:

chrome bug reported here: clipboard.write can crash the tab


Thu, 25 Jul 2019 13:51:48 GMT - Antoine Martin:

They claim that the bug has been fixed, but it's still present in the latest beta builds. Version 76.0.3809.80 (Official Build) beta (64-bit)

Also, the png data from the example I have given is clearly valid, so it should not be throwing a DOMException in the first place: bug 981006: comment 22


Fri, 26 Jul 2019 05:16:04 GMT - Antoine Martin: attachment set

working clipboard image copy


Fri, 26 Jul 2019 08:07:33 GMT - Antoine Martin: owner, status changed

Updates:

Tested by:

Things to consider:

@afarr: this should be of interest to you


Thu, 19 Sep 2019 19:54:13 GMT - alas:

Just as an FYI - Chrome 76 now seems to be stable (76.0.3809.132), but testing without nocicing the enabling detail of comment6... it is still failing.


Fri, 20 Sep 2019 00:40:55 GMT - Antoine Martin:

it is still failing.

Does it work if you enable the experimental features as per comment:6?


Mon, 21 Oct 2019 10:53:39 GMT - Antoine Martin:

Warning: see ticket:1844#comment:13 (Firefox is a no go, IE / MS Edge use the legacy code)


Thu, 24 Oct 2019 22:19:51 GMT - alas:

Decided to update to 4.0 and try - 4.0-r24232 with Chrome 77 on Windows 7 as html5 client (did not explicitly enable the experimental features).

Launched the fedora 30 server with my favorite command.

xpra start :13 --no-daemon --bind-tcp=0.0.0.0:1234 --bind-ws=0.0.0.0:1237 --start-child=xterm --start-child=xterm --exit-with-children

... then launched chromium-browser from an xterm and tried to copy one of the images from https://www.techjunkie.com/setup-64-bit-guest-virtualbox/ and paste it into a word doc (.txt files don't take pasted images so word seems simplest?).

Oddly, it looks like I was seeing behavior similar to that with attempts to copy/paste from an in-session launched Firefox browser (#2452).

I copied one of the images locally, and pasted into word doc locally - successfully.

I then copied the site address and pasted it into the address bar of a new tab of the server-side running chromium-browser... that was also successful.

I then tried to copy the same image, then tried to paste it into the word doc... and it pasted the url of the site, rather than an image. (Technically, it triggered the tracebacks in #2463, and I accidentally copied some of that content, then pasted that into the word doc... then went back to copy the image... and it STILL wound up pasting the url... which means either that the right-click copy image option is simply not doing anything... and the server-side clipboard didn't update when copying or pasting the accidental copy of the traceback... and the second attempt to right-click copy the image somehow resulted in the url that was last pasted ... still... being the contents of the clipboard, or perhaps that copy attempt server-side is what re-sync'd those previous clipboard contents into the local clipboard?)

It also fails when trying from a server-side Firefox.

It also fails pasting into a server-side gedit (not sure it would ever work with gedit)... but then I noticed that I also can't paste text into a gedit application server-side... not even clipboard content from a server-side chromium-browser to the server-side gedit.

In any case, the traceback seems to also be causing issues with rendering of text, so I'll leave this test here.


Fri, 25 Oct 2019 02:05:52 GMT - Antoine Martin:

That's an unlucky coincidence, there was a regression in r24231, fixed in r24247. See #2461

The 3.0.1 builds had been fixed, the 4.0 beta builds had not..


Tue, 29 Oct 2019 22:10:30 GMT - alas: owner changed

Tried some more with 3.0.1-r24252 fedora 30 server with Chrome 77 on Windows 7. Didn't switch the experimental property on (but shouldn't need to with Chrome 77 I suspect).

Clipboard behavior for text is as mentioned in #2452 - but I am still unable to copy/paste images from inside the session out to any local applications.

I tried to copy images from chromium-browser or firefox server-side and then paste into word or paint locally with no luck.

I then tried downloading an image to the fedora server and opening it server side with pinta to edit, selecting regions and copying them to the clipboard... which I was then able to paste into server-side email composition fields (using the right-click paste option only, never successfully with keyboard shortcuts)... but when trying to then paste into word locally I usually get nothing, but occasionally I get the text 'image.png', and sometimes get a little 'OBJ' text icon surrounded by a dotted frame? Trying to paste into paint I get an object frame with a ? inside.

Meanwhile, trying to copy an image locally (the xpra icon, why not?) and paste it into an email compose field or Pinta application fails... in the case of trying to paste into an email compose field I see a warning about more than 30 requests...

2019-10-29 15:03:59,345 Warning: more than 30 clipboard requests per second!
2019-10-29 15:04:00,845 Warning: remote clipboard request timed out
2019-10-29 15:04:00,846  request id 95, selection=CLIPBOARD, target=STRING
2019-10-29 15:04:04,114 Warning: more than 30 clipboard requests per second!
2019-10-29 15:04:05,614 Warning: remote clipboard request timed out
2019-10-29 15:04:05,615  request id 143, selection=CLIPBOARD, target=text/plain;charset=utf-8
2019-10-29 15:04:07,498 Warning: more than 30 clipboard requests per second!
2019-10-29 15:04:08,999 Warning: remote clipboard request timed out
2019-10-29 15:04:08,999  request id 179, selection=CLIPBOARD, target=text/plain;charset=utf-8

While, trying to paste into pinta I get a warning that there is no image in the clipboard, and I get this in the server logs.

2019-10-29 15:07:00,152 Warning: PRIMARY selection request for 'UTF8_STRING' timed out
2019-10-29 15:07:00,152  request 51 at time=0

I guess I'll pass this back - is there a debug flag in particular I should enable perhaps?


Tue, 29 Oct 2019 22:27:04 GMT - alas:

Fancy that - I suppose -d clipboard might be a good start?

Looks like there's a traceback when I open a lawn gnome image in pinta, select a portion of the image, and use the 'copy' button to load it to the clipboard.

2019-10-29 15:13:52,987 Request timed out: timeout('timed out')
2019-10-29 15:14:01,536 setting keyboard layout to 'us'
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Internal error:   Could not resolve keysym XF86MonBrightnessCycle
> Internal error:   Could not resolve keysym XF86RotationLockToggle
Errors from xkbcomp are not fatal to the X server
2019-10-29 15:14:03,611 client   1 broadway decoder initialized
2019-10-29 15:14:19,202 client   1 broadway decoder initialized
2019-10-29 15:14:23,226 client   1 broadway decoder initialized
2019-10-29 15:14:23,773 client   1 broadway decoder initialized
2019-10-29 15:14:26,155 client   1 broadway decoder initialized
2019-10-29 15:14:28,682 client   1 broadway decoder initialized
2019-10-29 15:14:28,846 client   1 broadway decoder initialized
2019-10-29 15:14:30,992 client   1 broadway decoder initialized
/usr/lib64/python3.7/site-packages/gi/overrides/Gtk.py:1630: Warning: g_object_ref: assertion 'G_IS_OBJECT (object)' failed
  return _Gtk_main(*args, **kwargs)
2019-10-29 15:14:35,838 client   1 broadway decoder initialized
2019-10-29 15:14:40,944 client   1 broadway decoder initialized
2019-10-29 15:14:42,861 do_xpra_selection_clear(<X11:SelectionClear {'send_event': '0', 'serial': '0x2f9e', 'delivered_to': '0x400008', 'window': '0x400008', 'selection': 'CLIPBOARD', 'time': '907255702'}>)
2019-10-29 15:14:42,861 do_xpra_selection_clear(<X11:SelectionClear {'send_event': '0', 'serial': '0x2f9e', 'delivered_to': '0x400008', 'window': '0x400008', 'selection': 'CLIPBOARD', 'time': '907255702'}>) was owned=True
2019-10-29 15:14:42,862 do_owner_changed()
2019-10-29 15:14:42,862 do_xpra_xfixes_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x2f9e', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0xa00581', 'selection': 'CLIPBOARD', 'timestamp': '907255707', 'selection_timestamp': '907255702'}>)
2019-10-29 15:14:42,862 do_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x2f9e', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0xa00581', 'selection': 'CLIPBOARD', 'timestamp': '907255707', 'selection_timestamp': '907255702'}>) owned=False, was False, enabled=True, can-send=True
2019-10-29 15:14:42,862 get_contents(TARGETS, <function ClipboardProxy.schedule_emit_token.<locals>.got_targets at 0x7fe2992a3560>, 0) owned=False, have-token=False
2019-10-29 15:14:42,863 requesting local XConvertSelection from 'Pinta' as 'TARGETS' into 'CLIPBOARD-TARGETS'
2019-10-29 15:14:42,864 do_xpra_property_notify_event(<X11:PropertyNotify {'send_event': '0', 'serial': '0x2faa', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '907255710'}>)
2019-10-29 15:14:42,864 do_property_notify(<X11:PropertyNotify {'send_event': '0', 'serial': '0x2faa', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '907255710'}>)
2019-10-29 15:14:42,864 CLIPBOARD-TARGETS='\x9f\x01\x00\x00\x00\x00\x00\x00\x9e\x01\x00\x0 .. 00\x00\x00\x00\x00¯\x01\x00\x00\x00\x00\x00\x00' (ATOM : 32)
2019-10-29 15:14:42,865 filter_data(TARGETS, ATOM, 32, ..)
2019-10-29 15:14:42,865 got_local_contents: calling <function ClipboardProxy.schedule_emit_token.<locals>.got_targets at 0x7fe2992a3560>('ATOM', 32, '"b\'\\\\x9f\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x9e .. 0\\\\x00\\\\xaf\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\'"'), time=0
2019-10-29 15:14:42,865 got_targets: ('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TARGETS', 'image/png', 'image/bmp', 'image/x-bmp', 'image/x-MS-bmp', 'image/x-icon', 'image/x-ico', 'image/x-win-bitmap', 'image/vnd.microsoft.icon', 'application/ico', 'image/ico', 'image/icon', 'text/ico', 'image/jpeg', 'image/tiff')
2019-10-29 15:14:42,866 _send_clipboard_token_handler(X11ClipboardProxy(CLIPBOARD), "(('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TAR .. con', 'text/ico', 'image/jpeg', 'image/tiff'),)")
2019-10-29 15:14:42,866 do_xpra_property_notify_event(<X11:PropertyNotify {'send_event': '0', 'serial': '0x2fad', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '907255711'}>)
2019-10-29 15:14:42,866 do_property_notify(<X11:PropertyNotify {'send_event': '0', 'serial': '0x2fad', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '907255711'}>)
2019-10-29 15:14:42,867 do_property_notify() property 'CLIPBOARD-TARGETS' is gone?
Traceback (most recent call last):
  File "/usr/lib64/python3.7/site-packages/xpra/x11/gtk_x11/clipboard.py", line 578, in do_property_notify
    dtype, dformat = X11Window.GetWindowPropertyType(self.xid, event.atom, True)
  File "xpra/x11/bindings/window_bindings.pyx", line 1173, in xpra.x11.bindings.window_bindings.X11WindowBindingsInstance.GetWindowPropertyType
xpra.x11.bindings.window_bindings.BadPropertyType: None type

Meanwhile, copying the xpra icon from a server-side chromium-browser, the logs for the copy event seem 'happy'.

2019-10-29 15:18:10,310 do_xpra_xfixes_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x5363', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0xe00020', 'selection': 'CLIPBOARD', 'timestamp': '907463155', 'selection_timestamp': '907463155'}>)
2019-10-29 15:18:10,311 do_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x5363', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0xe00020', 'selection': 'CLIPBOARD', 'timestamp': '907463155', 'selection_timestamp': '907463155'}>) owned=False, was False, enabled=True, can-send=True
2019-10-29 15:18:10,311 _send_clipboard_token_handler(X11ClipboardProxy(CLIPBOARD), "(('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TAR .. con', 'text/ico', 'image/jpeg', 'image/tiff'),)")

But, even just trying to paste that image into a gmail compose field, still server side, there seem to be some errors nested into the clipboard logs.

2019-10-29 15:18:38,425 process clipboard token selection=CLIPBOARD, local clipboard name=CLIPBOARD, proxy=X11ClipboardProxy(CLIPBOARD)
2019-10-29 15:18:38,425 wire selection to raw, encoding=bytes, type=UTF8_STRING, format=8, len(data)=4955
2019-10-29 15:18:38,425 got token, selection=CLIPBOARD, targets=[b'UTF8_STRING', b'text/plain'], target data={'UTF8_STRING': ('UTF8_STRING', 8, b'2019-10-29 15:13:52,987 Request timed out: timeout(\'timed out\')\r\n2019-10-29 15:14:01,536 setting keyboard layout to \'us\'\r\nThe XKEYBOARD keymap compiler (xkbcomp) reports:\r\n> Internal error:   Could not resolve keysym XF86MonBrightnessCycle\r\n> Internal error:   Could not resolve keysym XF86RotationLockToggle\r\nErrors from xkbcomp are not fatal to the X server\r\n2019-10-29 15:14:03,611 client   1 broadway decoder initialized\r\n2019-10-29 15:14:19,202 client   1 broadway decoder initialized\r\n2019-10-29 15:14:23,226 client   1 broadway decoder initialized\r\n2019-10-29 15:14:23,773 client   1 broadway decoder initialized\r\n2019-10-29 15:14:26,155 client   1 broadway decoder initialized\r\n2019-10-29 15:14:28,682 client   1 broadway decoder initialized\r\n2019-10-29 15:14:28,846 client   1 broadway decoder initialized\r\n2019-10-29 15:14:30,992 client   1 broadway decoder initialized\r\n/usr/lib64/python3.7/site-packages/gi/overrides/Gtk.py:1630: Warning: g_object_ref: assertion \'G_IS_OBJECT (object)\' failed\r\n  return _Gtk_main(*args, **kwargs)\r\n2019-10-29 15:14:35,838 client   1 broadway decoder initialized\r\n2019-10-29 15:14:40,944 client   1 broadway decoder initialized\r\n2019-10-29 15:14:42,861 do_xpra_selection_clear(<X11:SelectionClear {\'send_event\': \'0\', \'serial\': \'0x2f9e\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'selection\': \'CLIPBOARD\', \'time\': \'907255702\'}>)\r\n2019-10-29 15:14:42,861 do_xpra_selection_clear(<X11:SelectionClear {\'send_event\': \'0\', \'serial\': \'0x2f9e\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'selection\': \'CLIPBOARD\', \'time\': \'907255702\'}>) was owned=True\r\n2019-10-29 15:14:42,862 do_owner_changed()\r\n2019-10-29 15:14:42,862 do_xpra_xfixes_selection_notify_event(<X11:XFSelectionNotify {\'send_event\': \'0\', \'serial\': \'0x2f9e\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'subtype\': \'0\', \'owner\': \'0xa00581\', \'selection\': \'CLIPBOARD\', \'timestamp\': \'907255707\', \'selection_timestamp\': \'907255702\'}>)\r\n2019-10-29 15:14:42,862 do_selection_notify_event(<X11:XFSelectionNotify {\'send_event\': \'0\', \'serial\': \'0x2f9e\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'subtype\': \'0\', \'owner\': \'0xa00581\', \'selection\': \'CLIPBOARD\', \'timestamp\': \'907255707\', \'selection_timestamp\': \'907255702\'}>) owned=False, was False, enabled=True, can-send=True\r\n2019-10-29 15:14:42,862 get_contents(TARGETS, <function ClipboardProxy.schedule_emit_token.<locals>.got_targets at 0x7fe2992a3560>, 0) owned=False, have-token=False\r\n2019-10-29 15:14:42,863 requesting local XConvertSelection from \'Pinta\' as \'TARGETS\' into \'CLIPBOARD-TARGETS\'\r\n2019-10-29 15:14:42,864 do_xpra_property_notify_event(<X11:PropertyNotify {\'send_event\': \'0\', \'serial\': \'0x2faa\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'atom\': \'CLIPBOARD-TARGETS\', \'time\': \'907255710\'}>)\r\n2019-10-29 15:14:42,864 do_property_notify(<X11:PropertyNotify {\'send_event\': \'0\', \'serial\': \'0x2faa\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'atom\': \'CLIPBOARD-TARGETS\', \'time\': \'907255710\'}>)\r\n2019-10-29 15:14:42,864 CLIPBOARD-TARGETS=\'\\x9f\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x9e\\x01\\x00\\x0 .. 00\\x00\\x00\\x00\\x00\xc2\xaf\\x01\\x00\\x00\\x00\\x00\\x00\\x00\' (ATOM : 32)\r\n2019-10-29 15:14:42,865 filter_data(TARGETS, ATOM, 32, ..)\r\n2019-10-29 15:14:42,865 got_local_contents: calling <function ClipboardProxy.schedule_emit_token.<locals>.got_targets at 0x7fe2992a3560>(\'ATOM\', 32, \'"b\\\'\\\\\\\\x9f\\\\\\\\x01\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x9e .. 0\\\\\\\\x00\\\\\\\\xaf\\\\\\\\x01\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\'"\'), time=0\r\n2019-10-29 15:14:42,865 got_targets: (\'TIMESTAMP\', \'TARGETS\', \'MULTIPLE\', \'SAVE_TARGETS\', \'image/png\', \'image/bmp\', \'image/x-bmp\', \'image/x-MS-bmp\', \'image/x-icon\', \'image/x-ico\', \'image/x-win-bitmap\', \'image/vnd.microsoft.icon\', \'application/ico\', \'image/ico\', \'image/icon\', \'text/ico\', \'image/jpeg\', \'image/tiff\')\r\n2019-10-29 15:14:42,866 _send_clipboard_token_handler(X11ClipboardProxy(CLIPBOARD), "((\'TIMESTAMP\', \'TARGETS\', \'MULTIPLE\', \'SAVE_TAR .. con\', \'text/ico\', \'image/jpeg\', \'image/tiff\'),)")\r\n2019-10-29 15:14:42,866 do_xpra_property_notify_event(<X11:PropertyNotify {\'send_event\': \'0\', \'serial\': \'0x2fad\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'atom\': \'CLIPBOARD-TARGETS\', \'time\': \'907255711\'}>)\r\n2019-10-29 15:14:42,866 do_property_notify(<X11:PropertyNotify {\'send_event\': \'0\', \'serial\': \'0x2fad\', \'delivered_to\': \'0x400008\', \'window\': \'0x400008\', \'atom\': \'CLIPBOARD-TARGETS\', \'time\': \'907255711\'}>)\r\n2019-10-29 15:14:42,867 do_property_notify() property \'CLIPBOARD-TARGETS\' is gone?\r\nTraceback (most recent call last):\r\n  File "/usr/lib64/python3.7/site-packages/xpra/x11/gtk_x11/clipboard.py", line 578, in do_property_notify\r\n    dtype, dformat = X11Window.GetWindowPropertyType(self.xid, event.atom, True)\r\n  File "xpra/x11/bindings/window_bindings.pyx", line 1173, in xpra.x11.bindings.window_bindings.X11WindowBindingsInstance.GetWindowPropertyType\r\nxpra.x11.bindings.window_bindings.BadPropertyType: None type\r\n')}, claim=True, can-receive=True
2019-10-29 15:18:38,425 got_contents('TARGETS', 'ATOM', 32, '"b\'\\\\xe7\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\xfd\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\'"') pending=
2019-10-29 15:18:38,425 got_contents('UTF8_STRING', 'UTF8_STRING', 8, "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''") pending=
2019-10-29 15:18:38,426 claim_selection: set selection owner returned 1, owner=0x400008
2019-10-29 15:18:38,426 claim_selection: sending message to root window
2019-10-29 15:18:38,426 claim_selection: done, owned=True
2019-10-29 15:18:38,426 do_xpra_xfixes_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x698a', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0x400008', 'selection': 'CLIPBOARD', 'timestamp': '907491272', 'selection_timestamp': '907491272'}>)
2019-10-29 15:18:38,427 do_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x698a', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0x400008', 'selection': 'CLIPBOARD', 'timestamp': '907491272', 'selection_timestamp': '907491272'}>) owned=True, was True, enabled=True, can-send=True
2019-10-29 15:18:38,429 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x6994', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,429 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x6994', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,429 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=TARGETS, prop=CHROME_SELECTION
2019-10-29 15:18:38,429 using existing TARGETS value as response: ('UTF8_STRING', 'text/plain')
2019-10-29 15:18:38,430 set_selection_response(<GdkX11.X11Window object at 0x7fe2987164b0 (GdkX11Window at 0x55785c32ea30)>, TARGETS, CHROME_SELECTION, ATOM, 32, "'ç\\x00\\x00\\x00\\x00\\x00\\x00\\x00ý\\x01\\x00\\x00\\x00\\x00\\x00\\x00'", 0)
2019-10-29 15:18:38,430 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x699e', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'UTF8_STRING', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,430 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x699e', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'UTF8_STRING', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,431 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=UTF8_STRING, prop=CHROME_SELECTION
2019-10-29 15:18:38,431 send_clipboard_request_handler(X11ClipboardProxy(CLIPBOARD), 'CLIPBOARD', 'UTF8_STRING')
2019-10-29 15:18:38,431 send_clipboard_request id=0
2019-10-29 15:18:38,440 process clipboard contents, selection=CLIPBOARD, type=UTF8_STRING, format=8
2019-10-29 15:18:38,440 wire selection to raw, encoding=bytes, type=UTF8_STRING, format=8, len(data)=4955
2019-10-29 15:18:38,441 clipboard wire -> raw: ('UTF8_STRING', 8, 'bytes', "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''") -> 'b\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\r\\n\''
2019-10-29 15:18:38,441 clipboard got contents(0, 'UTF8_STRING', 8, "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''"): proxy=X11ClipboardProxy(CLIPBOARD) for selection=CLIPBOARD
2019-10-29 15:18:38,441 got_contents('UTF8_STRING', 'UTF8_STRING', 8, "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''") pending=(<GdkX11.X11Window object at 0x7fe2ba021050 (GdkX11Window at 0x55785c32ea30)>, 'CHROME_SELECTION', 0)
2019-10-29 15:18:38,441 setting response '2019-10-29 15:13:52,987 Request timed out: time .. .window_bindings.BadPropertyType: None type\r\n' to property CHROME_SELECTION of window 'Chromium clipboard' as UTF8_STRING
2019-10-29 15:18:38,442 set_selection_response(<GdkX11.X11Window object at 0x7fe2ba021050 (GdkX11Window at 0x55785c32ea30)>, UTF8_STRING, CHROME_SELECTION, UTF8_STRING, 8, "'2019-10-29 15:13:52,987 Request timed out: time .. .window_bindings.BadPropertyType: None type\\r\\n'", 0)
2019-10-29 15:18:38,442 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69a5', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,442 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69a5', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,443 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=TARGETS, prop=CHROME_SELECTION
2019-10-29 15:18:38,443 using existing TARGETS value as response: ('UTF8_STRING', 'text/plain')
2019-10-29 15:18:38,443 set_selection_response(<GdkX11.X11Window object at 0x7fe2992d61e0 (GdkX11Window at 0x55785c32ea30)>, TARGETS, CHROME_SELECTION, ATOM, 32, "'ç\\x00\\x00\\x00\\x00\\x00\\x00\\x00ý\\x01\\x00\\x00\\x00\\x00\\x00\\x00'", 0)
2019-10-29 15:18:38,444 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69ab', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,444 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69ab', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,444 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=TARGETS, prop=CHROME_SELECTION
2019-10-29 15:18:38,444 using existing TARGETS value as response: ('UTF8_STRING', 'text/plain')
2019-10-29 15:18:38,444 set_selection_response(<GdkX11.X11Window object at 0x7fe2ba021050 (GdkX11Window at 0x55785c32ea30)>, TARGETS, CHROME_SELECTION, ATOM, 32, "'ç\\x00\\x00\\x00\\x00\\x00\\x00\\x00ý\\x01\\x00\\x00\\x00\\x00\\x00\\x00'", 0)
2019-10-29 15:18:38,447 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69b1', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,447 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69b1', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,447 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=TARGETS, prop=CHROME_SELECTION
2019-10-29 15:18:38,448 using existing TARGETS value as response: ('UTF8_STRING', 'text/plain')
2019-10-29 15:18:38,448 set_selection_response(<GdkX11.X11Window object at 0x7fe2992d61e0 (GdkX11Window at 0x55785c32ea30)>, TARGETS, CHROME_SELECTION, ATOM, 32, "'ç\\x00\\x00\\x00\\x00\\x00\\x00\\x00ý\\x01\\x00\\x00\\x00\\x00\\x00\\x00'", 0)
2019-10-29 15:18:38,448 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69b7', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,448 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69b7', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'TARGETS', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,449 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=TARGETS, prop=CHROME_SELECTION
2019-10-29 15:18:38,449 using existing TARGETS value as response: ('UTF8_STRING', 'text/plain')
2019-10-29 15:18:38,449 set_selection_response(<GdkX11.X11Window object at 0x7fe2ba021050 (GdkX11Window at 0x55785c32ea30)>, TARGETS, CHROME_SELECTION, ATOM, 32, "'ç\\x00\\x00\\x00\\x00\\x00\\x00\\x00ý\\x01\\x00\\x00\\x00\\x00\\x00\\x00'", 0)
2019-10-29 15:18:38,450 do_xpra_selection_request(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69bd', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'UTF8_STRING', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,450 do_selection_request_event(<X11:SelectionRequest {'send_event': '0', 'serial': '0x69bd', 'delivered_to': '0x400008', 'window': '0x400008', 'requestor': '0xe00020', 'selection': 'CLIPBOARD', 'target': 'UTF8_STRING', 'property': 'CHROME_SELECTION', 'time': '0'}>)
2019-10-29 15:18:38,450 clipboard request for CLIPBOARD from window 0xe00020: 'Chromium clipboard', target=UTF8_STRING, prop=CHROME_SELECTION
2019-10-29 15:18:38,450 send_clipboard_request_handler(X11ClipboardProxy(CLIPBOARD), 'CLIPBOARD', 'UTF8_STRING')
2019-10-29 15:18:38,450 send_clipboard_request id=1
2019-10-29 15:18:38,462 process clipboard contents, selection=CLIPBOARD, type=UTF8_STRING, format=8
2019-10-29 15:18:38,462 wire selection to raw, encoding=bytes, type=UTF8_STRING, format=8, len(data)=4955
2019-10-29 15:18:38,463 clipboard wire -> raw: ('UTF8_STRING', 8, 'bytes', "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''") -> 'b\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\r\\n\''
2019-10-29 15:18:38,463 clipboard got contents(1, 'UTF8_STRING', 8, "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''"): proxy=X11ClipboardProxy(CLIPBOARD) for selection=CLIPBOARD
2019-10-29 15:18:38,463 got_contents('UTF8_STRING', 'UTF8_STRING', 8, "'b\\'2019-10-29 15:13:52,987 Request timed out: t .. dow_bindings.BadPropertyType: None type\\\\r\\\\n\\''") pending=(<GdkX11.X11Window object at 0x7fe2992d61e0 (GdkX11Window at 0x55785c32ea30)>, 'CHROME_SELECTION', 0)
2019-10-29 15:18:38,463 setting response '2019-10-29 15:13:52,987 Request timed out: time .. .window_bindings.BadPropertyType: None type\r\n' to property CHROME_SELECTION of window 'Chromium clipboard' as UTF8_STRING
2019-10-29 15:18:38,464 set_selection_response(<GdkX11.X11Window object at 0x7fe2992d61e0 (GdkX11Window at 0x55785c32ea30)>, UTF8_STRING, CHROME_SELECTION, UTF8_STRING, 8, "'2019-10-29 15:13:52,987 Request timed out: time .. .window_bindings.BadPropertyType: None type\\r\\n'", 0)

After repeating the copy of the xpra icon to test results of pasting into local word - the above logs text was pasted again... so the copy event server-side is failing to sync any contents to the local clipboard.


Wed, 30 Oct 2019 02:33:53 GMT - Antoine Martin: status changed


Thu, 31 Oct 2019 11:26:31 GMT - Antoine Martin: owner, status changed

I tried it with a Fedora 31 client and it worked perfectly on the first attempt (not something that happens every day!):

Here's what the debug log shows ("clipboard" debugging enabled on the connect.html page):

clipboard copy event, clipboard buffer= Version 78.0.3904.70 (Official Build) beta (64-bit)
clipboard token received
targets= ["image/png"]
target= image/png is valid: true
dtype= image/png dformat= 8 wire-encoding= bytes
png image received
created blob Blob {size: 4154, type: "image/png"}
created ClipboardItem ClipboardItem {types: Array(1)}
created ClipboardItem list [ClipboardItem]
copied png image to clipboard

Then I tried it on win7... and nothing!? Because navigator.clipboard returns null. r24328 will now log a message to the javascript console when that happens. Then I remembered that I had to use https instead of http when connecting to something other than localhost (after telling chrome that yes, I do want to trust this self-signed cert), and things just worked as expected. (same steps as above, Chrome 78)

Note: your browser is likely to ask you about allowing xpra to access the clipboard. If you somehow refuse, it won't ask again and things just won't work from then on... I'm not saying that this is the case here, just something to be aware of.

You can verify that the client's browser has support for copying images on the server using:

$ xpra info | grep clipboard.preferred-targets
features.clipboard.preferred-targets=('UTF8_STRING', 'TEXT', 'STRING', 'text/plain', 'image/png')

image/png should be in that list.


Tue, 12 Nov 2019 22:42:45 GMT - alas: owner changed

Ok, tried again with the 4.0-r24412 & a Firefox html5 local client on Windows 7 - the image wouldn't sync across clipboards.

Connected a session with my usual launch command and used server-side chromium-browser to search for and then copy a random lawn gnome image (https://ak1.ostkcdn.com/images/products/25491413/Lawn-Gnome-Statue-Fun-Classic-Style-Resin-Figurine-by-Pure-Garden-cd4b7582-e54f-48f1-af8e-fdf45816efe3.jpg). Then opened a gmail compose server-side and pasted the image, just to be sure it was on the clipboard server-side (success). Then I try to paste into a Word doc server side (Windows 7 still)... and the image hasn't sync'd (pastes previous local clipboard contents).

This is the only thing I saw in server-side logs with -d clipboard on the initial copy (prior to then successfully pasting into an email compose field also server-side, then failing to paste locally - with the last local clipboard contents being pasted).

2019-11-12 14:24:01,479 do_xpra_selection_clear(<X11:SelectionClear {'send_event': '0', 'serial': '0x33565', 'delivered_to': '0x400008', 'window': '0x400008', 'selection': 'CLIPBOARD', 'time': '2117414325'}>)
2019-11-12 14:24:01,479 do_xpra_selection_clear(<X11:SelectionClear {'send_event': '0', 'serial': '0x33565', 'delivered_to': '0x400008', 'window': '0x400008', 'selection': 'CLIPBOARD', 'time': '2117414325'}>) was owned=True
2019-11-12 14:24:01,479 do_owner_changed()
2019-11-12 14:24:01,480 do_xpra_xfixes_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x33565', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0xc00013', 'selection': 'CLIPBOARD', 'timestamp': '2117414325', 'selection_timestamp': '2117414325'}>)
2019-11-12 14:24:01,480 do_selection_notify_event(<X11:XFSelectionNotify {'send_event': '0', 'serial': '0x33565', 'delivered_to': '0x400008', 'window': '0x400008', 'subtype': '0', 'owner': '0xc00013', 'selection': 'CLIPBOARD', 'timestamp': '2117414325', 'selection_timestamp': '2117414325'}>) owned=False, was False (owner=0xc00013, xid=0x400008), enabled=True, can-send=True
2019-11-12 14:24:01,480 get_contents(TARGETS, <function ClipboardProxy.schedule_emit_token.<locals>.got_targets at 0x7f4a99fb5050>, 0) owned=False, have-token=True
2019-11-12 14:24:01,481 requesting local XConvertSelection from 'Chromium clipboard' as 'TARGETS' into 'CLIPBOARD-TARGETS'
2019-11-12 14:24:01,483 do_xpra_property_notify_event(<X11:PropertyNotify {'send_event': '0', 'serial': '0x3356d', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '2117414328'}>)
2019-11-12 14:24:01,483 do_property_notify(<X11:PropertyNotify {'send_event': '0', 'serial': '0x3356d', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '2117414328'}>)
2019-11-12 14:24:01,483 CLIPBOARD-TARGETS='°\x01\x00\x00\x00\x00\x00\x00¬\x01\x00\x00\x00\x00\x00\x00»\x01\x00\x00\x00\x00\x00\x00±\x01\x00\x00\x00\x00\x00\x00\x03\x02\x00\x00\x00\x00\x00\x00\x06\x02\x00\x00\x00\x00\x00\x00' (ATOM : 32)
2019-11-12 14:24:01,483 filter_data(TARGETS, ATOM, 32, ..)
2019-11-12 14:24:01,484 got_local_contents: calling <function ClipboardProxy.schedule_emit_token.<locals>.got_targets at 0x7f4a99fb5050>('ATOM', 32, '"b\'\\\\xb0\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\xac .. 0\\\\x00\\\\x06\\\\x02\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\'"'), time=0
2019-11-12 14:24:01,484 got_targets: ('TIMESTAMP', 'TARGETS', 'SAVE_TARGETS', 'MULTIPLE', 'image/png', 'text/html')
2019-11-12 14:24:01,484 _send_clipboard_token_handler(X11ClipboardProxy(CLIPBOARD), "(('TIMESTAMP', 'TARGETS', 'SAVE_TARGETS', 'MULTIPLE', 'image/png', 'text/html'),)")
2019-11-12 14:24:01,484 send_clipboard(..) elapsed=576.25, clipboard_stats=deque([6410635.822382213, 6410641.766373358, 6411105.245907546, 6411119.406499787, 6411161.556260954, 6411164.748102415, 6411288.185891677, 6411288.186992626, 6411288.201407011, 6411289.568077561, 6411290.813128681, 6411290.826592322, 6411290.902166607, 6411290.93848819, 6411290.970695954, 6411291.00528176, 6411291.017244221, 6411291.038554933, 6411291.139444348, 6411291.152267763, 6411291.169749976, 6411291.286961208, 6411291.301308555, 6411291.407992555, 6411291.420898717, 6411292.029266213, 6411293.4333047, 6411307.051857186, 6411758.545258376, 6411785.531189892, 6411785.532562669, 6411785.772228449, 6411785.774665381, 6411787.312388716, 6411787.313757252, 6411787.495702833, 6411787.496698294, 6411789.28657857, 6411789.287618754, 6411790.391921602, 6411790.393708369, 6411791.384715191, 6411791.385943395, 6411791.576032442, 6411791.577460813, 6411794.928734997, 6411794.929651577, 6411795.098225768, 6411795.099534948, 6411796.66393757, 6411796.664532306, 6411798.696638875, 6411798.697570383, 6411802.257570389, 6411802.258443794, 6411803.841420424, 6411803.843981347, 6411803.995102557, 6411803.995874328, 6411805.380417482, 6411805.382159206, 6411805.525773787, 6411805.526433178, 6411806.513143294, 6411806.51458742, 6411810.396396796, 6411810.397772128, 6411821.507831331, 6411821.509012889, 6411823.267092553, 6411823.268759068, 6411823.27182877, 6411823.273376611, 6411865.47803727, 6411955.209652601, 6412072.896325849, 6412079.031785918, 6412079.054244, 6412095.487443926, 6412104.684653642, 6412104.698647541, 6412110.184897615, 6412110.195919079, 6412121.961130032, 6412162.03124144, 6412167.924017167, 6412167.938166605, 6412266.111611625, 6412358.475633465, 6412381.628620358], maxlen=90)
2019-11-12 14:24:01,485 do_xpra_property_notify_event(<X11:PropertyNotify {'send_event': '0', 'serial': '0x33572', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '2117414330'}>)
2019-11-12 14:24:01,486 do_property_notify(<X11:PropertyNotify {'send_event': '0', 'serial': '0x33572', 'delivered_to': '0x400008', 'window': '0x400008', 'atom': 'CLIPBOARD-TARGETS', 'time': '2117414330'}>)
2019-11-12 14:24:01,486 do_property_notify() property 'CLIPBOARD-TARGETS' is gone?
Traceback (most recent call last):
  File "/usr/lib64/python3.7/site-packages/xpra/x11/gtk_x11/clipboard.py", line 574, in do_property_notify
    dtype, dformat = X11Window.GetWindowPropertyType(self.xid, event.atom, True)
  File "xpra/x11/bindings/window_bindings.pyx", line 1171, in xpra.x11.bindings.window_bindings.X11WindowBindingsInstance.GetWindowPropertyType
xpra.x11.bindings.window_bindings.BadPropertyType: None type

Double checked and I'm getting the same behavior with Chrome local html5 client.

I guess I'll pass this back to you to look at once you decide what to do with the other last clipboard details.


Wed, 13 Nov 2019 17:30:22 GMT - Antoine Martin: owner changed

Testing was slightly hampered by #2479.

Then I try to paste into a Word doc server side (Windows 7 still)

I assume you mean client side here, as there's no msword you can install server side on Linux. (well, there is via wine, but let's not go there). And I can't use your steps as I don't have msword installed on my win7 vm. I have tested using my steps from comment:20, and those still work fine. Then I tried copying from a Firefox window instead of eog, and that also worked fine.

So please try those first as baseline, and only after that, try your test with gmail and word. When you can't paste into gimp, it will show a warning at the bottom of the content window explaining why. In both cases, please enable "clipboard" debugging on the connect page. As per comment:20, this should show png image received on the server's -d clipboard output.

As with #1844 and #2452: https + grant clipboard-access permissions are required.


Wed, 20 Nov 2019 23:46:34 GMT - alas: owner changed

Re-tested with 4.0-r24461, using Chrome 78 on Windows 7 HTML5 client, and the new usual command to launch the server.

It worked!

I'm not sure what the eog mentioned in comment:20 is, but I went back to my trick of launching chromium-browser server side, searching for lawn gnomes, click a search result, open the image in a new tab, then right-click to copy the image.

I then opened a pinta window server-side and used the paste button to confirm the image was on the clipboard server-side.

I then successfully paste the image into a word doc (support for pasting images being the whole reason I opened the application)... using the right-click menu or control-v. I'm also able to copy test locally, paste server-side, then copy an image and paste back locally.

Then I checked Firefox (apparently because I'm a glutton for punishment) - I presume you are not surprised to hear that it wasn't possible to sync the images to the Firefox HTML5 client clipboard.

I'll reassign this to you to decide whether this should be closed and left to rest for a while, before tackling other HTML5 client types... or if you want to just keep using this ticket.


Thu, 12 Dec 2019 08:52:31 GMT - Antoine Martin: status changed; resolution set

Let's close this. Firefox is unlikely to support images soon. (too many permission hoops to go through)


Fri, 29 May 2020 06:53:09 GMT - Antoine Martin:

For others this may work: Copy image to clipboard: using html with an embedded image as base64?


Sat, 23 Jan 2021 05:47:56 GMT - migration script:

this ticket has been moved to: https://github.com/Xpra-org/xpra/issues/2312