2017年1月は新年早々いろいろ動きがありました。Firefox 51とChrome 56のリリース、Safari 10.1発表、Windows 10 Creator’s UpdateのEdge、WebKitにWebRTCとCredential Management API、Facebookとブラウザベンダー協力の話など、注目ニュースが満載です!
Firefox 51リリース
1月24日に、Firefox 51がリリースされました。
- Firefox Gets Better Video Gaming and Warns of Non-Secure Websites | The Mozilla Blog
- Firefox 51.0 リリースノート
WebGL 2のサポートや、非HTTPSなページ上のパスワードフォーム入力についてのUI改善が目玉ですが、すでに知っているところだと思うので、地味なところをとりあげます。
::placeholder
疑似要素と :placeholder-shown
擬似クラスが実装されました。input
要素やtextarea
要素の placeholder
属性で指定するプレースホルダ周りのスタイルを調整するためのものです。前者はプレースホルダのテキストを、後者はプレースホルダが表示されているときの要素(input
など)を表します。
SVGでは、xlink
接頭辞なしの href
属性がサポートされました。これまでSVG内で外部リソースを読み込んだりSVG内の要素を参照する際は、XLinkを使っていました。SVGがXMLのフォーマットというところに由来するのですが、名前空間の扱いの難やHTMLとの親和性などをふまえ、SVG 2.0で名前空間なしの属性が導入されました。
この名前空間なしの href
属性ですが、Internet ExplorerがSVGを初実装したIE9から使えます。SVGを実装するにあたって、検討段階だったSVG 2.0で取り入れたい機能の先行実装をさせたという話を以前SVG WGの人に聞いたことがあります。
SVGまわりでは、tabindex
属性や data-
属性に対応しました。使えなかったのに驚く方もいるかもしれませんが、これらはHTMLのグローバル属性だったので、SVGの要素では使えず、dataset
プロパティなどのアクセサリーもなかったのでした。これらもSVG 2.0で導入されたものです。
Chrome 56リリース
1月25日に、Chrome 56がリリースされました。
パフォーマンスの観点から、タッチイベントハンドラの passive
オプションがデフォルトで true
になりました。Android版Chromeでは多くの場合、スクロールがスムーズになるとのことです。
CSSでは、position: sticky
が復活しました。むかーしむかし実装されていたのですが、パフォーマンスの観点から削除されていたのでした。scroll
イベントを監視しなくてもよくなるので、パフォーマンス向上が期待できる機能です。
Web PaymentsのPayment Request APIに追加された canMakePayment()
メソッドがサポートされました。このメソッド、昨年AppleがWebでのApple Payを発表した祭、Web Paymentsにないものとして上げていたメソッドのひとつです。Web PaymentsのアクティビティにもAppleが関わり、APIの差異を埋めているようなので、今後に期待ですね。
他にも、border-image-repeat: space
がサポートされています。これでようやく実装がそろった感じですね。
Safari 10.1発表
macOS Sierra 10.12.4のベータ版が開発者向けに公開され、Safariが10.1にアップデートすることがわかりました。昨年春にリリースされたSafari 9.1のように、WebKitがアップグレードされ、新しい機能が導入されます。
APIの目玉はCustom Elementsでしょうか。Safari 10でもShadow DOMがサポートされたので、Web Componentsがまたさらに進みます。
ほかにも、Fetch APIやIndexed DB API 2.0, Gamepad APIがサポートされます。Gamepad APIはすこし意外ですね…ブラウザでゲームパッドを使うようなゲームを提供する顧客がいるのでしょうか?
JavaScriptでは、ES2017仕様のAsync Functionsや SharedArrayBuffer
に対応します。
HTMLでは、HTML 5のフォームバリデーション機能がついに実装されました。これまでもDOM上では検証していたのですが、invalidな際にフォームの送信をブロックするという挙動を実装していなかったのでした。
CSSではGrid Layoutが有効になります。リリース時期を春とすると、FirefoxやChromeと同時期になります。いっきに使いどころが増えそうです。
Windows 10 Creator’s UpdateのEdge
Microsoftのブログが活発に更新され、Windows 10 Creator’s Updateで提供される各種機能の紹介がされています。先月から引き続きいくつか取り上げます。
このエントリでは、タブのサムネイルや一時退避といったブラウザのUIの機能(Operaみたいですね)や、EPUB、Payment Requset APIのサポートなど、EdgeHTML 15で目玉になる機能をまとめています。
WebRTC 1.0は互換性のため実装を始めたもので、あくまでORTCを推奨していくという立場のようです。コーデックもVP8をサポートしましたが、ソフトウェアでコードのため電力消費やCPUの使用はH.264よりも高いとのこと。
他にも、Content Security Policy Level 2のサポート、フルカラー絵文字のサポートもあるようです。
WebKitにWebRTCとCredential Management API
Safari 10.1もうれしいですが、次期メジャーバージョンでも嬉しい機能が入りそうです。
ひとつは、WebRTCです。1月19日に、Appleのエンジニアによって、WebKitにWebRTCのライブラリがチェックインされました。
WebRTCについては、getUserMedia()
の実装が進んでいましたが、通信周りのAPIは特に進んでいませんでした。EdgeもEdgeHTMLでWebRTC (1.0)を実装しますが、ようやくといったところでしょうか。
コミットログを読むと、Chromeのソースコードをインポートして利用しており、Chromeとの互換性がなかなか期待できそうです。
もうひとつは、Credential Management APIです。1月24日に、AppleのエンジニアがWebKitにCredential Management APIを実装予定という旨のメールをメーリングリストに投稿しています。
Credential Management APIはパスワードやソーシャルログインなど、ユーザーの認証情報を抽象化して扱うAPIで、ログイン周りの煩雑さを解消できます。現在はChromeでのみ使えますが、Safariでも使えるようになるとモバイルでのログイン周りがとても便利になりそうです。
次期iPhoneで顔認証が導入されるといった噂を目にしていまし、信憑性が高まった気もします。
Facebookとブラウザベンダーの協力
Facebookの開発者ブログに、ブラウザベンダーと協力してFacebookへのリクエストを省力化したという話が掲載されています。あわせて、Chrome、Mozillaの開発者ブログでも紹介されています。
- This browser tweak saved 60% of requests to Facebook | Engineering Blog | Facebook Code
- Chromium Blog: Reload, reloaded: faster and leaner page reloads
- Using Immutable Caching To Speed Up The Web ★ Mozilla Hacks – the Web developer blog
Facebookは各種アセットを、ハッシュ付きURL+長大なキャッシュ有効時間というキャッシュ戦略で運用しています。キャッシュの有効時間が長ければ、ブラウザは再読込の際に同じリソースをダウンロードする確率が低くなるので、ネットワークにやさしいです。
しかし、これまでのHTTPキャッシュでは、ダウンロードは防げても、リクエスト自体は起こってしまっていました。パフォーマンスの観点からもうれしくありません。Facebookが自身のアクセスを解析したところ、全体の60%がそういったリクエストだったそうです。更に調べると、他のブラウザが13%〜22%だったのに対し、Chromeだけは63%ととても高い数値を示していたとのこと。
これを解消しようとFacebookのエンジニアがChromeチームに働きかけ、挙動を変更。結果63%だったものが24%まで減少したとのこと。
Firefoxでは、Chromeと同様の挙動変更を行わない代わりに、Cache-Control: immutable
という新しいヘッダの値を実装しました。このヘッダについては、Jxckさんが自身のブログにまとめているのでそちらをご覧ください。