]>
git.proxmox.com Git - mirror_novnc.git/blob - tests/playback-ui.js
1 /* global VNC_frame_data, VNC_frame_encoding */
3 import * as WebUtil
from '../app/webutil.js';
4 import RecordingPlayer
from './playback.js';
9 function message(str
) {
10 const cell
= document
.getElementById('messages');
11 cell
.textContent
+= str
+ "\n";
12 cell
.scrollTop
= cell
.scrollHeight
;
16 const fname
= WebUtil
.getQueryVar('data', null);
19 return Promise
.reject("Must specify data=FOO in query string.");
22 message("Loading " + fname
);
24 return new Promise((resolve
, reject
) => {
25 const script
= document
.createElement("script");
26 script
.onload
= resolve
;
27 script
.onerror
= reject
;
28 document
.body
.appendChild(script
);
29 script
.src
= "../recordings/" + fname
;
34 const iterations
= WebUtil
.getQueryVar('iterations', 3);
35 document
.getElementById('iterations').value
= iterations
;
37 const mode
= WebUtil
.getQueryVar('mode', 3);
38 if (mode
=== 'realtime') {
39 document
.getElementById('mode2').checked
= true;
41 document
.getElementById('mode1').checked
= true;
44 message("VNC_frame_data.length: " + VNC_frame_data
.length
);
46 const startButton
= document
.getElementById('startButton');
47 startButton
.disabled
= false;
48 startButton
.addEventListener('click', start
);
50 frames
= VNC_frame_data
;
51 // Only present in older recordings
52 if (window
.VNC_frame_encoding
)
53 encoding
= VNC_frame_encoding
;
56 class IterationPlayer
{
57 constructor(iterations
, frames
, encoding
) {
58 this._iterations
= iterations
;
60 this._iteration
= undefined;
61 this._player
= undefined;
63 this._start_time
= undefined;
65 this._frames
= frames
;
66 this._encoding
= encoding
;
68 this._state
= 'running';
70 this.onfinish
= () => {};
71 this.oniterationfinish
= () => {};
72 this.rfbdisconnected
= () => {};
77 this._start_time
= (new Date()).getTime();
79 this._realtime
= mode
.startsWith('realtime');
80 this._trafficMgmt
= !mode
.endsWith('-no-mgmt');
82 this._nextIteration();
86 const player
= new RecordingPlayer(this._frames
, this._encoding
, this._disconnected
.bind(this));
87 player
.onfinish
= this._iterationFinish
.bind(this);
89 if (this._state
!== 'running') { return; }
92 if (this._iteration
> this._iterations
) {
97 player
.run(this._realtime
, this._trafficMgmt
);
101 const endTime
= (new Date()).getTime();
102 const totalDuration
= endTime
- this._start_time
;
104 const evt
= new Event('finish');
105 evt
.duration
= totalDuration
;
106 evt
.iterations
= this._iterations
;
110 _iterationFinish(duration
) {
111 const evt
= new Event('iterationfinish');
112 evt
.duration
= duration
;
113 evt
.number
= this._iteration
;
114 this.oniterationfinish(evt
);
116 this._nextIteration();
119 _disconnected(clean
, frame
) {
121 this._state
= 'failed';
124 const evt
= new Event('rfbdisconnected');
127 evt
.iteration
= this._iteration
;
129 this.onrfbdisconnected(evt
);
134 document
.getElementById('startButton').value
= "Running";
135 document
.getElementById('startButton').disabled
= true;
137 const iterations
= document
.getElementById('iterations').value
;
141 if (document
.getElementById('mode1').checked
) {
142 message(`Starting performance playback (fullspeed) [${iterations} iteration(s)]`);
145 message(`Starting realtime playback [${iterations} iteration(s)]`);
149 const player
= new IterationPlayer(iterations
, frames
, encoding
);
150 player
.oniterationfinish
= (evt
) => {
151 message(`Iteration ${evt.number} took ${evt.duration}ms`);
153 player
.onrfbdisconnected
= (evt
) => {
155 message(`noVNC sent disconnected during iteration ${evt.iteration} frame ${evt.frame}`);
158 player
.onfinish
= (evt
) => {
159 const iterTime
= parseInt(evt
.duration
/ evt
.iterations
, 10);
160 message(`${evt.iterations} iterations took ${evt.duration}ms (average ${iterTime}ms / iteration)`);
162 document
.getElementById('startButton').disabled
= false;
163 document
.getElementById('startButton').value
= "Start";
168 loadFile().then(enableUI
).catch(e
=> message("Error loading recording: " + e
));