Клиент не отправил список суб-протоколов, но ваш сервер отправил обратно "chat" в качестве значения суб-протокола.Согласно стр. 19 спецификации IETF 6455 WebSocket (конец раздела 4.1 Требования к клиенту):
6. If the response includes a |Sec-WebSocket-Protocol| header field
and this header field indicates the use of a subprotocol that was
not present in the client's handshake (the server has indicated a
subprotocol not requested by the client), the client MUST _Fail
the WebSocket Connection_.
Сервер должен отправлять только заголовок "Sec-WebSocket-Protocol: SUBPROTOCOL" обратноклиенту, если клиент отправил на сервер заголовок «Sec-WebSocket-Protocol: SUBPROTOCOL, ...».Обратите внимание, что клиент может отправить список подпротоколов, и если это произойдет, сервер должен выбрать один из списка для ответа.
Возможно, Firefox и Chrome слишком мягки и не придерживаютсятекущая версия спецификации.