Fix VNC display rendering issue

- Disable viewport clipping to prevent large screens from being hidden
- Add proper handling of corrupted FramebufferUpdate messages
- Skip data for unsupported encodings to prevent data accumulation
- Add comprehensive debugging for message processing flow
- Fix infinite loop in rectangle processing for corrupted data
parent b6d4fdb0
This diff is collapsed.
...@@ -61,6 +61,8 @@ class Websock { ...@@ -61,6 +61,8 @@ class Websock {
this._sQlen = 0; this._sQlen = 0;
this._sQ = null; // Send queue this._sQ = null; // Send queue
this._socketFrameSeq = 0; // Sequence counter for socket debugging
this._eventHandlers = { this._eventHandlers = {
message: () => {}, message: () => {},
open: () => {}, open: () => {},
...@@ -336,7 +338,16 @@ class Websock { ...@@ -336,7 +338,16 @@ class Websock {
} }
_recvMessage(e) { _recvMessage(e) {
console.log("[VNC-WS] Received WebSocket message, data length:", e.data.byteLength || e.data.length);
// Log first 32 bytes for debugging
const dataArray = new Uint8Array(e.data);
const hexData = Array.from(dataArray.slice(0, Math.min(32, dataArray.length))).map(b => b.toString(16).padStart(2, '0')).join(' ');
console.log("[VNC-WS] First 32 bytes (hex):", hexData);
this._DecodeMessage(e.data); this._DecodeMessage(e.data);
console.log("[VNC-WS] After decode, rQlen:", this.rQlen, "rQi:", this._rQi);
if (this.rQlen > 0) { if (this.rQlen > 0) {
this._eventHandlers.message(); this._eventHandlers.message();
if (this._rQlen == this._rQi) { if (this._rQlen == this._rQi) {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
<script src="/novnc/util/int.js"></script> <script src="/novnc/util/int.js"></script>
<script src="/novnc/util/cursor.js"></script> <script src="/novnc/util/cursor.js"></script>
<script src="/novnc/util/md5.js"></script> <script src="/novnc/util/md5.js"></script>
<script src="/novnc/base64.js"></script>
<script src="/novnc/websock.js"></script> <script src="/novnc/websock.js"></script>
<script src="/novnc/des.js"></script> <script src="/novnc/des.js"></script>
<script src="/novnc/input/keysym.js"></script> <script src="/novnc/input/keysym.js"></script>
...@@ -200,8 +201,19 @@ ...@@ -200,8 +201,19 @@
<script> <script>
console.log('VNC page loaded'); console.log('VNC page loaded');
// Check if Base64 is loaded
setTimeout(function() {
console.log('[VNC-DEBUG] Checking if Base64 is defined:', typeof window.Base64);
if (typeof window.Base64 === 'undefined') {
console.error('[VNC-DEBUG] Base64 is not defined! This will cause JPEG decoding to fail.');
} else {
console.log('[VNC-DEBUG] Base64 is properly defined');
}
}, 100);
let rfb = null; let rfb = null;
let connected = false; let connected = false;
let socketFrameSeq = 0;
document.getElementById('connectBtn').addEventListener('click', connect); document.getElementById('connectBtn').addEventListener('click', connect);
document.getElementById('disconnectBtn').addEventListener('click', disconnect); document.getElementById('disconnectBtn').addEventListener('click', disconnect);
...@@ -266,8 +278,59 @@ function connect() { ...@@ -266,8 +278,59 @@ function connect() {
document.getElementById('connectBtn').disabled = true; document.getElementById('connectBtn').disabled = true;
document.getElementById('disconnectBtn').disabled = false; document.getElementById('disconnectBtn').disabled = false;
showNotification('VNC session connected', 'success'); showNotification('VNC session connected', 'success');
// Override WebSocket onmessage after connection to intercept messages
const originalOnMessage = rfb._sock.onmessage;
rfb._sock.onmessage = function(event) {
// Debug VNC socket data logging with base64 encoding and sequence numbers (first 20 frames only)
if (socketFrameSeq < 20) {
const bytes = event.data.byteLength || event.data.length;
const uint8 = new Uint8Array(event.data);
let binary = '';
for (let i = 0; i < uint8.length; i++) {
binary += String.fromCharCode(uint8[i]);
}
const b64Data = btoa(binary);
console.log(`[VNC-SOCKET-SERVER] Frame ${socketFrameSeq}: ${bytes} bytes -> base64: ${b64Data}`);
socketFrameSeq++;
}
// Call original handler
return originalOnMessage.call(this, event);
};
}); });
// Add debug logging for WebSocket messages
const originalSend = rfb._sock.send;
rfb._sock.send = function(data) {
console.log('[VNC-DEBUG] JavaScript sending data to WebSocket:', data.length, 'bytes');
if (data.length <= 32) {
const hex = Array.from(new Uint8Array(data)).map(b => b.toString(16).padStart(2, '0')).join(' ');
console.log('[VNC-DEBUG] Data (hex):', hex);
} else {
const hex = Array.from(new Uint8Array(data.slice(0, 32))).map(b => b.toString(16).padStart(2, '0')).join(' ');
console.log('[VNC-DEBUG] Data (first 32 bytes hex):', hex + '...');
}
// Log VNC message types
if (data.length > 0) {
const msgType = new Uint8Array(data)[0];
console.log('[VNC-DEBUG] JavaScript message type:', msgType);
switch (msgType) {
case 0: console.log('[VNC-DEBUG] -> SetPixelFormat'); break;
case 2: console.log('[VNC-DEBUG] -> SetEncodings'); break;
case 3: console.log('[VNC-DEBUG] -> FramebufferUpdateRequest'); break;
case 4: console.log('[VNC-DEBUG] -> KeyEvent'); break;
case 5: console.log('[VNC-DEBUG] -> PointerEvent'); break;
case 6: console.log('[VNC-DEBUG] -> ClientCutText'); break;
default: console.log('[VNC-DEBUG] -> Unknown message type'); break;
}
}
return originalSend.call(this, data);
};
rfb.addEventListener('disconnect', () => { rfb.addEventListener('disconnect', () => {
console.log('[VNC-DEBUG] VNC disconnected event fired'); console.log('[VNC-DEBUG] VNC disconnected event fired');
console.log('[VNC-DEBUG] Connection state:', rfb._rfbConnectionState); console.log('[VNC-DEBUG] Connection state:', rfb._rfbConnectionState);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment