fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(amazonq): serve webview assets without Jetty PathResource (#560) - #562

Merged
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path
Jun 18, 2026
Merged

fix(amazonq): serve webview assets without Jetty PathResource (#560)#562
laileni-aws merged 1 commit into
Amazon-Q-Developer:mainfrom
laileni-aws:fix/issue-560-windows-webview-path

Conversation

@laileni-aws

Copy link
Copy Markdown
Contributor

Problem

Closes#560.

On Eclipse 2026-06 (4.40.0) the Amazon Q chat (and login) view renders as a blank screen. The webview asset server throws:

java.nio.file.InvalidPathException: Invalid PathInContext: /amazonq-ui.js
...
Caused by: java.nio.file.InvalidPathException: Illegal char <:> at index 2:
/C:/Users/<user>/eclipse-workspace/.metadata/.plugins/amazon-q-eclipse/lsp/AmazonQAgentic/1.70.0/clients/amazonq-ui.js
at java.base/sun.nio.fs.WindowsPathParser.normalize(...)
at java.base/java.nio.file.Path.resolve(Path.java:516)
at org.eclipse.jetty.util.resource.PathResource.resolveSchemeSpecificPath(PathResource.java:315)
at org.eclipse.jetty.util.resource.PathResource.resolve(PathResource.java:296)

Root cause

WebviewAssetServer served the LSP-provided UI directory through Jetty's ResourceHandler + setBaseResource(<dir>). To serve a request such as GET /amazonq-ui.js, Jetty resolves the request path against the base resource via PathResource#resolve.

The Jetty version the plugin builds against (12.0.9, Eclipse 2024-06) implemented this with Paths.get(resolvedUri), which correctly handles a Windows file:///C:/... URI. The newer Jetty bundled with Eclipse 4.40.0 changed PathResource#resolve to delegate to resolveSchemeSpecificPath(...), which combines the request into a URI-style string (/C:/Users/.../amazonq-ui.js) and passes it to Path#resolve(String). On Windows that string is rejected — : is illegal at index 2 because of the leading / before the drive letter — so no asset is ever served and the webview stays blank.

Because the broken code lives in the Jetty bundle supplied by the Eclipse target platform, we can't fix it there; the plugin must stop relying on PathResource#resolve.

Fix

Replace the ResourceHandler with a small Handler.Abstract (StaticFileHandler) that serves files from the asset directory using java.nio:

  • resolves the request path relative to the base directory (baseDir.resolve(relativePath)), so the resulting path never contains a leading-slash + drive-letter sequence and stays valid on every platform;
  • keeps a path-traversal guard (resolved.startsWith(baseDir));
  • advertises content types by file extension (text/javascript, text/css, …).

The public API of WebviewAssetServer (resolve, getUri, stop), the ContextHandler, context path /, and the 127.0.0.1 virtual-host restriction are all unchanged, so ChatWebViewAssetProvider and ToolkitLoginWebViewAssetProvider need no changes.

org.eclipse.jetty.http (already a transitive dependency of org.eclipse.jetty.server) is added to Require-Bundle for HttpHeader / HttpStatus.

Testing

Added WebviewAssetServerTest (JUnit 5):

  • getContentType resolution (known extensions, case-insensitivity, unknown / missing extension fallback);
  • HTTP round-trip against the started server: serves a JS asset with the correct content type, serves a nested asset, and returns 404 for a missing asset.

Verified locally against the real Jetty 12.0.9 API (the version the plugin builds against):

  • javac -Xlint:all compiles cleanly;
  • all 5 tests pass;
  • Checkstyle (10.23.1, plugin/checkstyle.xml) reports no violations.

Note: I was unable to run the full mvn package Tycho build in my environment; the GitHub Actions sanity build will exercise it on this PR. The fix itself addresses a Windows-only code path; the regression test runs on all platforms and confirms the new serving mechanism works.

…-Q-Developer#560)
Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve
builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it
to Path#resolve, which throws InvalidPathException on Windows (illegal ':'
after the leading slash). This left the Amazon Q chat and login webviews
showing a blank screen.
Replace the ResourceHandler/PathResource-based asset serving with a small
java.nio-based handler that resolves the requested path relative to the
asset directory, which stays valid on every platform. The handler keeps a
path-traversal guard and advertises content types by extension. The public
API of WebviewAssetServer is unchanged, so callers are unaffected.
Adds WebviewAssetServerTest covering content-type resolution and HTTP
serving (asset retrieval, nested assets, and 404 handling).
@laileni-aws
laileni-aws marked this pull request as ready for review June 18, 2026 19:02
@laileni-aws
laileni-aws merged commit d38b578 into Amazon-Q-Developer:mainJun 18, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eclipse Amazon Q plugin (1.70.0) shows blank screen on Eclipse 2026-06 (4.40.0)

3 participants

@laileni-aws@ashishrp-aws@aseemxs