3

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()
4

1 に答える 1

3

これにより、必要なバイトが得られるだけでなく、Pythonが認識せずにメモリから文字列を解放するため、使用したくありませんfree_to_bytes。これにより、プログラムがクラッシュします。残念ながら、実際にはバイナリ データを保持するように設計されていないため、対応するget_bytesメソッドはありません。GLib.String

実際、リソース ペイロードがGLib.String. 彼らは WebKit2 でこの間違いを修正したようです: http://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebResource.html

可能であれば、WebKit2 への切り替えを検討してください ( from gi.repository import WebKit2)。

于 2015-03-24T04:48:27.093 に答える