GObject イントロスペクション (Python 2.7 および PyGObject 3.14) を通じて GTK3 を使用して Python で記述されたアプリケーションがあります。WebKit を使用して Web ページをロードし、ロードしたすべてのリソースのコンテンツにアクセスしようとしています。ページの読み込みに使用している WebKitWebView オブジェクトのresource-load-finishedシグナルに接続することで、これを実現できます。
シグナル ハンドラー内で、web_resource パラメーターでWebKitWebResourceオブジェクトを使用して、読み込まれたデータにアクセスします。get_data() から返された GLib.GString に NULL バイトが含まれていない場合、すべて正常に機能します。data.str を使用して必要なものにアクセスできます。ただし、データに NULL バイトが含まれている場合 (ロードされたリソースの MIME タイプがイメージであることが多い場合)、data.len は正しいですが、data.str には最初の NULL バイトまでのデータしか含まれていません。GLib.GBytes インスタンスを返す data.free_to_bytes() を呼び出すことで raw バイトにアクセスできますが、シグナル ハンドラがアプリケーション segfaults を返すと、. ロードされたリソース内のすべてのデータにアクセスしようとしています。
次のコードが問題のデモンストレーションに役立つことを願っています。
from gi.repository import Gtk
from gi.repository import WebKit
def signal_resource_load_finished(webview, frame, resource):
gstring = resource.get_data()
print(resource.get_mime_type())
desired_len = gstring.len
# gstring.str is missing data because it returns the data up to the first NULL byte
assert(gstring.str == desired_len) # this assertion fails
# calling this causes a segfault after the handler returns, but the data is accessible from gbytes.get_data()
#gbytes = gstring.free_to_bytes()
#assert(len(gbytes.get_data()) == desired_len) # this assertion succeeds before the segfault
return
webview = WebKit.WebView()
webview.connect('resource-load-finished', signal_resource_load_finished)
webview.connect('load-finished', Gtk.main_quit)
# lol cat for demo purposes of a resource containing NULL bytes (mime type: image/png)
webview.load_uri('http://images5.fanpop.com/image/photos/30600000/-Magical-Kitty-lol-cats-30656645-1280-800.png')
Gtk.main()