読者です 読者をやめる 読者になる 読者になる

Galaxy S6 EdgeのChromeがデフォルトでWebGL無効になっているので有効化する

手元のGalxy S6 Edge(DoCoMo版)のChromeが、WebGL無効状態になっていました。
バージョンは Chrome 42.0.2311.111 です。

WebGLが有効化どうかを確認する

http://get.webgl.org/ を開くと表示されます。

有効化する手順

無効になっている理由は分かりませんが、以下の手順で有効になりました。

  1. chrome://flags/ を開く
  2. 「ソフトウェアレンダリングリストをオーバーライド」の「有効にする」をタップf:id:arumani:20150521133732p:plain
  3. Chromeを再起動する

Playframework 1.2.4にパッチを当ててChrome 16でWebSocketを動かす

Playframework 1.2.4では、Chrome 16のWebSocketが動かない

Chromeのstable版であるChrome 16はWebSocketのプロトコルが最新のRFC 6455となっていて、Playframework 1.2.4では動きません(参考URL)。

しかし、今作っているChrome拡張でWebSocketを使いたい為なんとかならんかなと、Playframeworkで使用しているJboss nettyのソースを見てみました。すると1.2.4で対応しているHybi10とRFC 6455はかなり近い事が分かりました(あくまでnettyのソースを見た範囲での話ですが…)。
なので、今回WebSocketで使いたいのはテキストのやり取りだけだし、プロトコルのバージョンを無視すれば(Hybi10と同じ扱いにすれば)もしかして動くのではないか…?

パッチ当ててみた

https://github.com/playframework/play/blob/master/framework/src/play/server/PlayHandler.java#L1100
を変えました。

diff --git a/framework/src/play/server/PlayHandler.java b/framework/src/play/server/PlayHandler.java
index e30d097..365605a 100644
--- a/framework/src/play/server/PlayHandler.java
+++ b/framework/src/play/server/PlayHandler.java
@@ -1097,7 +1097,7 @@ public class PlayHandler extends SimpleChannelUpstreamHandler {

     private void upgradeResponseHybi10(HttpRequest req, HttpResponse res) {
         String version = req.getHeader("Sec-WebSocket-Version");
-        if(!"8".equals(version)) {
+        if(!"8".equals(version) && !"13".equals(version)) {
             res.setStatus(HttpResponseStatus.UPGRADE_REQUIRED);
             res.setHeader("Sec-WebSocket-Version", "8");

見ての通り、やっているのは「Sec-WebSocket-Versionが8だけでなく13の場合も処理を継続する」だけです。

サンプルが動いた!

Playframeworkのsampleにあるchatで、websocketモードにしてみたところ、これまでChrome16で動いていなかったのが、無事動作しました!

まあ他はまだ試していないのですが、取り敢えずテキストはやり取り出来そうだという事でいったんこれで使ってみようと思います。