Qt5 で大きく代わったモジュールとしては Qt Quick や QtGUI があげられますが、もう一つがこの QtWebKit になるでしょう。Qt5 では WebKit2 への移行が最初から予定されていましたが、このセッションではその詳細を Simon Hausmann が説明しました。
WebKit には 150 万行のコードがあり、(WebKit を含めた場合の) Qt 全体の約 30 %を占める非常に大きなモジュールとなっています。
セッションでは大きく以下の話題に分けて説明しました。
- WebCore
- Qt C++ API
- プロセス分離
- QML2 インテグレーション
- 今後の展望
WebCore
まずは WebCore の変更点ですが、多数に上るため詳細を知りたい人は planet.webkit.org を読んでくださいとのことでした。ここで例に挙げられたのは以下の項目です。よりきれいに、便利になったと考えればいいのでしょうか。
- CSS Regions
- Shadow DOM
- window.requestAnimationFrame()
- Remote web inspector
また、パフォーマンスについても字句解析やテキストレイアウト、querySelector 高速化に加えて、大量のメモリ削減を行ったそうです。メモリに関しては MB 単位で減らしたということでした。Qt4 での WebKit は遅くメモリを大量に使うとの不評も良く聞きましたが、汚名返上といったところでしょうか。
Qt C++ API
Qt の C++ API に関しては大きな変更はなく、基本的にはソースコード互換性があると考えて良いそうですが、QtGUI モジュールが GUI と Widgets に分かれたのと同様に、WebKit と WebKitWidgets の二つのライブラリに分離されました。
このため、従来のプログラムをそのままコンパイルする場合には .pro ファイルを
QT += webkit
から
QT += webkitwidgets
に変更する必要があります。
また、#include するヘッダーファイルの位置も変わったものがあるため、
#include <QtWebKit/QWebSettings>
のようなモジュールを付ける形ではなく、
#include <QWebSettings>
を使うようにとのことでした。後者は QtWidgets 関連でも問題になるので #include にはモジュール名は付けない方が良さそうです。
また、従来の QGraphicsView をベースにした描画システムは OpenGL を直接使うものに書き換えられました。これにより、より小さく、GPU を活用した描画が出来るようになったそうです。静的なコンテンツと動的なコンテンツのレイヤーを分けたり、ウィンドウに入りきらないような大きな画像などをタイル分割して複数のテクスチャーで扱うなど、様々なところでより速くするための工夫がされているようです。
プロセス分離
また、Qt4 までの WebKit はシングルスレッドで動作していたため、GUI の動作とバックエンド(ネットワーク、HTML解析など)の動作がそれぞれ影響し合い、レスポンスの改善に限界がありました。
このため、Qt5 では WebKit2 のプロセス分離機能を使って、UI プロセスと Web プロセスの二つに分け、互いに邪魔をしないようになりました。実際のデータは共有メモリを使って受け渡しをして、メッセージのやりとりはローカルソケットを用いるそうです。将来的には Web プロセスのサンドボックス化も検討しているとのことでした。
もっとも、プロセス分離による問題もあり、これまでは可能だったカスタマイズした QNetworkAccessManager を Web プロセスに適用させることが出来なくなっていて、将来的に解決したいとのことでした。
QML2 インテグレーション
Qt Quick 2 用の WebView エレメントの実装においては最小限の機能で実装していくことを方針として進めたそうで、Flickable エレメントを継承し、ピンチなどの対応を外した形で実装したそうです。
今後の展望
今後は WebKit をより不覚まで活用するためのローレベル API の実装などを検討しているそうです。
また、現状の QtWebKit にはオーディオ・ビデオ要素が動かなかったり、2D Canvas でアクセラレーションが効かないなどの問題点があるため、これらの解決も行っていくとのことでした。
まとめ
かなりの変更が加えられた Qt5 の QtWebKit モジュールはまだまだ問題点もありそうですが、触ってみるのが楽しみなものに仕上がってきているようです。余裕が出来れば Qt4 との比較を行ってみるのも面白いのではないでしょうか。