Skip to content

Commit 0c99763

Browse files
committed
Handle non-binary image streams
1 parent 914e525 commit 0c99763

File tree

3 files changed

+53
-18
lines changed

3 files changed

+53
-18
lines changed

lib/matplotlib/backends/backend_webagg.py

Lines changed: 16 additions & 3 deletions
Original file line numberOriginal file lineDiff line numberDiff line change
@@ -375,6 +375,8 @@ def get(self, fignum, format):
375
self.write(buffer.getvalue())
375
self.write(buffer.getvalue())
376

376

377
class WebSocket(tornado.websocket.WebSocketHandler):
377
class WebSocket(tornado.websocket.WebSocketHandler):
378+
supports_binary = True
379+
378
def open(self, fignum):
380
def open(self, fignum):
379
self.fignum = int(fignum)
381
self.fignum = int(fignum)
380
manager = Gcf.get_fig_manager(self.fignum)
382
manager = Gcf.get_fig_manager(self.fignum)
@@ -388,8 +390,14 @@ def on_close(self):
388

390

389
def on_message(self, message):
391
def on_message(self, message):
390
message = json.loads(message)
392
message = json.loads(message)
391-
canvas = Gcf.get_fig_manager(self.fignum).canvas
393+
# The 'supports_binary' message is on a client-by-client
392-
canvas.handle_event(message)
394+
# basis. The others affect the (shared) canvas as a
395+
# whole.
396+
if message['type'] == 'supports_binary':
397+
self.supports_binary = message['value']
398+
else:
399+
canvas = Gcf.get_fig_manager(self.fignum).canvas
400+
canvas.handle_event(message)
393

401

394
def send_event(self, event_type, **kwargs):
402
def send_event(self, event_type, **kwargs):
395
payload = {'type': event_type}
403
payload = {'type': event_type}
@@ -399,7 +407,12 @@ def send_event(self, event_type, **kwargs):
399
def send_image(self):
407
def send_image(self):
400
canvas = Gcf.get_fig_manager(self.fignum).canvas
408
canvas = Gcf.get_fig_manager(self.fignum).canvas
401
diff = canvas.get_diff_image()
409
diff = canvas.get_diff_image()
402-
self.write_message(diff, binary=True)
410+
if self.supports_binary:
411+
self.write_message(diff, binary=True)
412+
else:
413+
data_uri = "data:image/png;base64,{0}".format(
414+
diff.encode('base64').replace('\n', ''))
415+
self.write_message(data_uri)
403

416

404
def __init__(self):
417
def __init__(self):
405
super(WebAggApplication, self).__init__([
418
super(WebAggApplication, self).__init__([

lib/matplotlib/backends/web_static/mpl.css

Lines changed: 1 addition & 1 deletion
Original file line numberOriginal file lineDiff line numberDiff line change
@@ -1,6 +1,6 @@
1
.mpl-message {
1
.mpl-message {
2
float:right;
2
float:right;
3-
vertical-align:text-center;
3+
vertical-align:middle;
4
}
4
}
5

5

6
.mpl-toolbar-spacer {
6
.mpl-toolbar-spacer {

lib/matplotlib/backends/web_static/mpl.js

Lines changed: 36 additions & 14 deletions
Original file line numberOriginal file lineDiff line numberDiff line change
@@ -17,28 +17,50 @@ window.onload = function() {
17
} else if (typeof(MozWebSocket) !== 'undefined') {
17
} else if (typeof(MozWebSocket) !== 'undefined') {
18
this.WebSocket = MozWebSocket;
18
this.WebSocket = MozWebSocket;
19
} else {
19
} else {
20-
alert('Your browser does not have WebSocket support, please try Chrome, Safari or Firefox ≥ 6. Firefox 4 and 5 are also supported by you have to enable WebSockets in about:config.');
20+
alert('Your browser does not have WebSocket support.' +
21+
'Please try Chrome, Safari or Firefox ≥ 6. ' +
22+
'Firefox 4 and 5 are also supported but you ' +
23+
'have to enable WebSockets in about:config.');
21
};
24
};
22

25

23
var message = document.getElementById("mpl-message");
26
var message = document.getElementById("mpl-message");
24
var canvas = document.getElementById("mpl-canvas");
27
var canvas = document.getElementById("mpl-canvas");
25

28

26
ws = new this.WebSocket(ws_url("ws"));
29
ws = new this.WebSocket(ws_url("ws"));
30+
31+
var supports_binary = (ws.binaryType != undefined);
32+
33+
ws.onopen = function () {
34+
ws.send(JSON.stringify(
35+
{type: 'supports_binary',
36+
value: supports_binary}));
37+
}
38+
27
ws.onmessage = function (evt) {
39
ws.onmessage = function (evt) {
28-
if (evt.data instanceof Blob) {
40+
console.log("message " + evt.data);
29-
/* FIXME: We get "Resource interpreted as Image but
41+
30-
* transferred with MIME type text/plain:" errors on
42+
if (supports_binary) {
31-
* Chrome. But how to set the MIME type? It doesn't seem
43+
if (evt.data instanceof Blob) {
32-
* to be part of the websocket stream */
44+
/* FIXME: We get "Resource interpreted as Image but
33-
evt.data.type = "image/png";
45+
* transferred with MIME type text/plain:" errors on
34-
46+
* Chrome. But how to set the MIME type? It doesn't seem
35-
/* Free the memory for the previous frames */
47+
* to be part of the websocket stream */
36-
if (imageObj.src) {
48+
evt.data.type = "image/png";
37-
(window.URL || window.webkitURL).revokeObjectURL(imageObj.src);
49+
50+
/* Free the memory for the previous frames */
51+
if (imageObj.src) {
52+
(window.URL || window.webkitURL).revokeObjectURL(imageObj.src);
53+
}
54+
55+
imageObj.src = (window.URL || window.webkitURL).createObjectURL(evt.data);
56+
return;
57+
}
58+
} else {
59+
if (evt.data.slice(0, 21) == "data:image/png;base64") {
60+
console.log("got image");
61+
imageObj.src = evt.data;
62+
return;
38
}
63
}
39-
40-
imageObj.src = (window.URL || window.webkitURL).createObjectURL(evt.data);
41-
return;
42
}
64
}
43

65

44
var msg = JSON.parse(evt.data);
66
var msg = JSON.parse(evt.data);

0 commit comments

Comments
 (0)