1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# Changelog
All notable changes to the WebX11 Chat Widget are recorded here.
## 1.0.1 — 2026-11-09
Security and mobile fixes found by a review that rendered hostile model output in Chromium.
- **Critical: attribute injection in linkified replies.** `escapeHtml()` escaped `& < >` by
round-tripping through `textContent`, which does not escape a double quote — so a reply containing
`https://x.test/"onclick="alert(1)//` produced a real `<a onclick=…>` and fired `alert(1)` when
clicked. Escaping now covers `"` and `'` as well. Proven both ways: the 1.0.0 file fired a dialog,
this one renders only `href/target/rel` and stays silent.
- **The launcher covered the Send button at 390 px**, making the widget unusable on a phone (the
click was intercepted by the 56 px bubble). The launcher is now hidden while the panel is open.
- Requests get an idle timeout (`idleTimeoutMs`, default 60 s, re-armed on every chunk) so a gateway
that accepts and never answers cannot leave the input disabled forever.
- An empty stream or an HTML error page returned with status 200 now shows an error line instead of
an empty bubble; a JSON body without stream framing is accepted as a whole reply.
- Closing the panel restores the host page's own `body` overflow value instead of clearing it.
- Accessibility: `aria-expanded` / `aria-controls` on the launcher, focus returns to it on Escape,
the demo page no longer blocks zoom (`user-scalable=no` removed).
## 1.0.0 — 2026-11-09
First packaged release.
- Standalone `src/widget.html`: bubble, popup/fullscreen panel, streaming
answers, quick-reply chips, clickable links / e-mail / phone detection,
XSS-safe rendering (user input escaped, model output escaped before
formatting), reduced-motion and keyboard/Escape support.
- External configuration via `config.js`; every option has a documented
default in `src/config.example.js`.
- `accentColor` theming with automatic readable text colour.
- Optional system-prompt URL (`promptUrl` + `promptVersion`) with inline
`systemPrompt` fallback.
- Robust NDJSON stream reader (buffers partial lines across chunks).
- No hardcoded host, no bundled credentials, no third-party assets.
- Docs: README, usage guide with CORS troubleshooting, commercial license.
|