From 816a4c7f246ae7036b70e22250507360d558eb3e Mon Sep 17 00:00:00 2001 From: Samuel Mannehed Date: Fri, 22 May 2026 16:51:37 +0200 Subject: [PATCH 1/3] Remove validation exception for "scrollbar-gutter" This issue has now been fixed in https://validator.w3.org/nu, see: https://github.com/w3c/css-validator/issues/473 --- utils/validate | 8 -------- 1 file changed, 8 deletions(-) diff --git a/utils/validate b/utils/validate index 3f5cb871..aea0e524 100755 --- a/utils/validate +++ b/utils/validate @@ -50,14 +50,6 @@ for fn in "$@"; do error=$(echo $line | cut -d ":" -f 4-) case $error in - *"\"scrollbar-gutter\": Property \"scrollbar-gutter\" doesn't exist.") - # FIXME: https://github.com/validator/validator/issues/1788 - echo "Ignoring below error on line ${line_start}," \ - "the scrollbar-gutter property actually exist and is widely" \ - "supported:" - echo $error - continue - ;; *"\"clip-path\": \"path("*) # FIXME: https://github.com/validator/validator/issues/1786 echo "Ignoring below error on line ${line_start}," \ From 4bce309c3b8ee19a2a8f722ae1129dd9ebbe2435 Mon Sep 17 00:00:00 2001 From: Samuel Mannehed Date: Fri, 22 May 2026 17:59:54 +0200 Subject: [PATCH 2/3] Fix broken clipboard unittests We can't compare with a new CustomEvent, lets check the call arguments instead. The field is also called "text". --- tests/test.rfb.js | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/tests/test.rfb.js b/tests/test.rfb.js index 7aa54cd0..8d3a9717 100644 --- a/tests/test.rfb.js +++ b/tests/test.rfb.js @@ -3485,7 +3485,7 @@ describe('Remote Frame Buffer protocol client', function () { expectedStr )).to.be.true; expect(dispatchEventSpy.calledWith( - new CustomEvent("clipboard", {detail: {expectedStr: expectedStr}}) + new CustomEvent("clipboard", {detail: {text: expectedStr}}) )).to.be.false; }); @@ -3506,9 +3506,8 @@ describe('Remote Frame Buffer protocol client', function () { expect(client._asyncClipboard.writeClipboard.calledOnceWith( expectedStr )).to.be.true; - expect(dispatchEventSpy.calledOnceWith( - new CustomEvent("clipboard", {detail: {expectedStr: expectedStr}}) - )).to.be.true; + expect(dispatchEventSpy.args[0][0].type).to.equal("clipboard"); + expect(dispatchEventSpy.args[0][0].detail.text).to.equal(expectedStr); }); }); @@ -3587,7 +3586,7 @@ describe('Remote Frame Buffer protocol client', function () { expectedData )).to.be.true; expect(dispatchEventSpy.calledOnceWith( - new CustomEvent("clipboard", {detail: {expectedData: expectedData}}) + new CustomEvent("clipboard", {detail: {text: expectedData}}) )).to.be.false; }); it('should dispatch a clipboard event following unsuccessful async write clipboard', async function () { @@ -3615,9 +3614,8 @@ describe('Remote Frame Buffer protocol client', function () { expect(client._asyncClipboard.writeClipboard.calledOnceWith( expectedData )).to.be.true; - expect(dispatchEventSpy.calledOnceWith( - new CustomEvent("clipboard", {detail: {expectedData: expectedData}}) - )).to.be.true; + expect(dispatchEventSpy.args[0][0].type).to.equal("clipboard"); + expect(dispatchEventSpy.args[0][0].detail.text).to.equal(expectedData); }); describe('Handle Provide', function () { @@ -3646,9 +3644,8 @@ describe('Remote Frame Buffer protocol client', function () { expect(client._asyncClipboard.writeClipboard.calledOnceWith( expectedData )).to.be.true; - expect(dispatchEventSpy.calledOnceWith( - new CustomEvent("clipboard", {detail: {expectedData: expectedData}}) - )).to.be.true; + expect(dispatchEventSpy.args[0][0].type).to.equal("clipboard"); + expect(dispatchEventSpy.args[0][0].detail.text).to.equal(expectedData); }); it('should update clipboard with correct escape characters from a Provide message ', async function () { @@ -3677,9 +3674,8 @@ describe('Remote Frame Buffer protocol client', function () { expect(client._asyncClipboard.writeClipboard.calledOnceWith( expectedData )).to.be.true; - expect(dispatchEventSpy.calledOnceWith( - new CustomEvent("clipboard", {detail: {expectedData: expectedData}}) - )).to.be.true; + expect(dispatchEventSpy.args[0][0].type).to.equal("clipboard"); + expect(dispatchEventSpy.args[0][0].detail.text).to.equal(expectedData); }); it('should be able to handle large Provide messages', async function () { @@ -3708,9 +3704,8 @@ describe('Remote Frame Buffer protocol client', function () { expect(client._asyncClipboard.writeClipboard.calledOnceWith( expectedData )).to.be.true; - expect(dispatchEventSpy.calledOnceWith( - new CustomEvent("clipboard", {detail: {expectedData: expectedData}}) - )).to.be.true; + expect(dispatchEventSpy.args[0][0].type).to.equal("clipboard"); + expect(dispatchEventSpy.args[0][0].detail.text).to.equal(expectedData); }); }); From 5c2025d5a68d3f35cd1c06a8d88fcba06e0f8abb Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Fri, 22 May 2026 20:07:04 +0200 Subject: [PATCH 3/3] Only focus username field if empty https://github.com/novnc/noVNC/pull/2057 --- app/ui.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/ui.js b/app/ui.js index 24d32d55..df046d20 100644 --- a/app/ui.js +++ b/app/ui.js @@ -1288,13 +1288,13 @@ const UI = { let inputFocus = "none"; if (e.detail.types.indexOf("username") === -1) { document.getElementById("noVNC_username_block").classList.add("noVNC_hidden"); - } else { - inputFocus = inputFocus === "none" ? "noVNC_username_input" : inputFocus; + } else if (document.getElementById("noVNC_username_input").value === "") { + inputFocus = "noVNC_username_input"; } if (e.detail.types.indexOf("password") === -1) { document.getElementById("noVNC_password_block").classList.add("noVNC_hidden"); - } else { - inputFocus = inputFocus === "none" ? "noVNC_password_input" : inputFocus; + } else if (inputFocus === "none") { + inputFocus = "noVNC_password_input"; } document.getElementById('noVNC_credentials_dlg') .classList.add('noVNC_open');