ここにいます: Unix プロジェクトページ > GtkMozEmbed: Mozilla の Gtk アプリケーションへの組み込み

GtkMozEmbed: Gtk Mozilla 組み込みウィジェット

はじめに

GtkMozEmbed は使いやすいウィジェットで、これを使えば Gtk アプリケーションに Mozilla ブラウザウィンドウを組み込むことができます。

使うときの敷居をできるだけ低くするため、使いやすくて単純明解であるように作られています。これは触れることのできる機能は全機能の約80%を含むべきであるということです。これは Mozilla の中枢をなす高度な機能を利用したければ、自分で組み込みウィジェットを書かねばならないということです。

将来(M16 の後)、私は組み込みウィジェットから基礎をなしている nsIWebBrowser の実装を扱えるようにするつもりです。これによって Mozilla の内部インターフェースが利用可能であることが必要な人達に、それを行う方法を提供します。

さらに、Gtk Mozilla 組み込みウィジェットを使うということは組み込みを行うコードが C++ に依存しないということです。これは C を好み C++ を嫌う人達にとって重要です。

質問/コメント、あるいは誤りの指摘はどのようなものであっても Christopher Blizzard <blizzard@mozilla.org> に送ってください。

関数リファレンス

gtkmozembed.h

extern GtkType      gtk_moz_embed_get_type         (void);
extern GtkWidget   *gtk_moz_embed_new              (void);
extern void         gtk_moz_embed_set_comp_path    (char *aPath);
extern void         gtk_moz_embed_load_url         (GtkMozEmbed *embed, const char *url);
extern void         gtk_moz_embed_stop_load        (GtkMozEmbed *embed);
extern gboolean     gtk_moz_embed_can_go_back      (GtkMozEmbed *embed);
extern gboolean     gtk_moz_embed_can_go_forward   (GtkMozEmbed *embed);
extern void         gtk_moz_embed_go_back          (GtkMozEmbed *embed);
extern void         gtk_moz_embed_go_forward       (GtkMozEmbed *embed);
extern void         gtk_moz_embed_render_data      (GtkMozEmbed *embed, 
						    const char *data, guint32 len,
						    const char *base_uri, const char *mime_type);
extern void         gtk_moz_embed_open_stream      (GtkMozEmbed *embed,
						    const char *base_uri, const char *mime_type);
extern void         gtk_moz_embed_append_data      (GtkMozEmbed *embed,
						    const char *data, guint32 len);
extern void         gtk_moz_embed_close_stream     (GtkMozEmbed *embed);
extern char        *gtk_moz_embed_get_link_message (GtkMozEmbed *embed);
extern char        *gtk_moz_embed_get_js_status    (GtkMozEmbed *embed);
extern char        *gtk_moz_embed_get_title        (GtkMozEmbed *embed);
extern char        *gtk_moz_embed_get_location     (GtkMozEmbed *embed);
extern void         gtk_moz_embed_reload           (GtkMozEmbed *embed, gint32 flags);
extern void         gtk_moz_embed_set_chrome_mask  (GtkMozEmbed *embed, guint32 flags);
extern guint32      gtk_moz_embed_get_chrome_mask  (GtkMozEmbed *embed);
    

gtkmozembed_internal.h

extern void gtk_moz_embed_get_nsIWebBrowser  (GtkMozEmbed *embed, nsIWebBrowser **retval);
    

gtk_moz_embed_new

引数: void
戻り値: GtkWidget *
この関数は新しい Gtk Mozilla 組み込みウィジェットを返します。 失敗した場合は NULL を返します。

gtk_moz_embed_set_comp_path

引数: const char *aPath
戻り値: void
この関数は最初のウィジェットが作成されるか XPCOM が初期化される前に呼ばれなければなりません。この関数によって mozilla コンポーネントへのパスを設定できます。

gtk_moz_embed_load_url

引数: GtkMozEmbed *embed
const char *url
戻り値: void
この関数の呼び出しで組み込みウィジェットへの url の読み込みが始まります。読み込みはすべて非同期です。url 引数は http://www.gnome.org のような形式にすべきです。

gtk_moz_embed_stop_load

引数: GtkMozEmbed *embed
戻り値: void
この関数によってウィジェットで読み込んでいるドキュメントの読み込みを止めることができます。

gtk_moz_embed_can_go_back

引数: GtkMozEmbed *embed
戻り値: gboolean
この関数はドキュメントの移動履歴で戻ることができるかどうかを返します。戻ることができる場合は TRUE を返し、できない場合は FALSE を返します。

gtk_moz_embed_can_go_forward

引数: GtkMozEmbed *embed
戻り値: gboolean
この関数はドキュメントの移動履歴で進むことができるかどうかを返します。進むことができる場合は TRUE を返し、できない場合は FALSE を返します。

gtk_moz_embed_go_back

引数: GtkMozEmbed *embed
戻り値: void
この関数はドキュメントの移動履歴で一つ分戻します。

gtk_moz_embed_go_forward

引数: GtkMozEmbed *embed
戻り値: void
この関数はドキュメントの移動履歴で一つ分進みます。

gtk_moz_embed_render_data

引数: GtkMozEmbed *embed
const char *data
guint32 len
const char *base_uri
const char *mime_type
戻り値: void
この関数によって大量のランダムなデータを受け取り、それをドキュメントにレンダリングできます。データとデータ長を渡す必要があります。base_uri はドキュメント内の内部参照を分析するのに使われ、mime_type は内部でどのようにドキュメントをレンダリングするのかを決めるのに使われます。

gtk_moz_embed_open_stream

引数: GtkMozEmbed *embed
const char *base_uri
const char *mime_type
戻り値: void
この関数は外部入力源から組み込みウィジェットへドキュメントを読み込み始めるのに使われます。内部リンクの分析のための base_uri やドキュメントの mime_type を渡す必要があります。

gtk_moz_embed_append_data

引数: GtkMozEmbed *embed
const char *data
guint32 len
戻り値: void
この関数によってウィジェットで既に開いたストリームへデータを追加できるようにします。ドキュメントに追加したいデータやその長さを渡す必要があります。

gtk_moz_embed_close_stream

引数: GtkMozEmbed *embed
戻り値: void
この関数は組み込みウィジェットへ手動でデータを追加するのに使用していたストリームを閉じます。

gtk_moz_embed_get_link_message

引数: GtkMozEmbed *embed
戻り値: char *
この関数は現在のリンクのメッセージがあればそれを返します。返された文字列は new で割り当てられたもので文字列を開放することは呼び手の責任です。

gtk_moz_embed_get_js_status

引数: GtkMozEmbed *embed
戻り値: char *
この関数は js_status メッセージがあればそれを返します。返された文字列は new で割り当てられたもので文字列を開放することは呼び手の責任です。

gtk_moz_embed_get_title

引数: GtkMozEmbed *embed
戻り値: char *
この関数はドキュメントの現在のタイトルを得ます。返された文字列は new で割り当てられたもので文字列を開放することは呼び手の責任です。

gtk_moz_embed_get_location

引数: GtkMozEmbed *embed
戻り値: char *
この関数はドキュメントの現在の場所を返します。文字列は new で割り当てられたもので文字列を開放することは呼び手の責任です。

gtk_moz_embed_reload

引数: GtkMozEmbed *embed
gint32 flags
戻り値: void
この関数はドキュメントの再読み込みをします。フラグ引数は再読み込みの振舞を制御するのに使われます。フラグ引数は以下の値の中の一つをとれます:
       GTK_MOZ_EMBED_FLAG_RELOADNORMAL
       GTK_MOZ_EMBED_FLAG_RELOADBYPASSCACHE
       GTK_MOZ_EMBED_FLAG_RELOADBYPASSPROXY
       GTK_MOZ_EMBED_FLAG_RELOADBYPASSPROXYANDCACHE

gtk_moz_embed_set_chrome_mask

引数: GtkMozEmbed *embed guint32 flags
戻り値: void
この関数はこのウィンドウに対する chrome マスクを設定するのに使われます。マスクは以下の値の任意の論理和に設定できます:
       GTK_MOZ_EMBED_FLAG_DEFAULTCHROME
       GTK_MOZ_EMBED_FLAG_WINDOWBORDERSON
       GTK_MOZ_EMBED_FLAG_WINDOWCLOSEON
       GTK_MOZ_EMBED_FLAG_WINDOWRESIZEON
       GTK_MOZ_EMBED_FLAG_MENUBARON
       GTK_MOZ_EMBED_FLAG_TOOLBARON
       GTK_MOZ_EMBED_FLAG_LOCATIONBARON
       GTK_MOZ_EMBED_FLAG_STATUSBARON
       GTK_MOZ_EMBED_FLAG_PERSONALTOOLBARON
       GTK_MOZ_EMBED_FLAG_SCROLLBARSON
       GTK_MOZ_EMBED_FLAG_TITLEBARON
       GTK_MOZ_EMBED_FLAG_EXTRACHROMEON
       GTK_MOZ_EMBED_FLAG_WINDOWRAISED
       GTK_MOZ_EMBED_FLAG_WINDOWLOWERED
       GTK_MOZ_EMBED_FLAG_CENTERSCREEN
       GTK_MOZ_EMBED_FLAG_DEPENDENT
       GTK_MOZ_EMBED_FLAG_MODAL
       GTK_MOZ_EMBED_FLAG_OPENASDIALOG
       GTK_MOZ_EMBED_FLAG_OPENASCHROME
       GTK_MOZ_EMBED_FLAG_ALLCHROME

gtk_moz_embed_get_chrome_mask

引数: GtkMozEmbed *embed
戻り値: guint32
この関数によってこのウィンドウに対する現在の chrome マスクが得られます。返すマスクに関して gtk_moz_embed_set_chrome_mask に対するドキュメントを見てください。

gtk_moz_embed_get_nsIWebBrowser

引数: GtkMozEmbed *embed
nsIWebBrowser **retval
戻り値: void
この関数によって基礎をなしているウィジェットに対する nsIWebBrowser を得ることができます。あらゆる優れた XPCOM 関数がするように、この関数は戻るときに nsIWebBrowser への参照を追加します。

シグナルリファレンス

link_message

関数プロトタイプ void link_message_cb (GtkMozEmbed *embed, gpointer data);
このシグナルはリンクメッセージが変わったときに発行されます。これはウェブページでユーザがリンク上でマウスを動かしたときに起きます。リンクメッセージの実際の値を得るのに gtk_moz_embed_get_link_message を使ってください。

js_status

関数プロトタイプ void js_status_cb (GtkMozEmbed *embed, gpointer data);
このシグナルは JavaScript ステータスメッセージが変わったときに発行されます。ステータスメッセージの実際の値を得るのに gtk_moz_embed_get_js_status を使ってください。

location

関数プロトタイプ void location_changed_cb (GtkMozEmbed *embed, gpointer data);
このシグナルはドキュメントの場所が変わったときはいつでも発行されます。場所の実際の値を得るのに gtk_moz_embed_get_location を使ってください。

title

関数プロトタイプ void title_changed_cb (GtkMozEmbed *embed, gpointer data);
このシグナルはドキュメントのタイトルが変わったときはいつでも発行されます。タイトルの実際の値を得るのに gtk_moz_embed_get_title の呼び出しを使ってください。

progress

関数プロトタイプ void progress_change_cb (GtkMozEmbed *embed, gint cur, gint max, gpointer data);
このシグナルはドキュメントの読み込みの進捗に変化があったときはいつでも発行されます。

cur の値はどれだけドキュメントがダウンロードされたのかを示します。

max の値はドキュメントの長さを示します。もし max の値が1よりも短ければ、ドキュメント全体の長さが決められません。

net_status [ 非推奨 - net_state を使ってください ]

関数プロトタイプ void net_status_change_cb (GtkMozEmbed *embed, gint flags, gpointer data);
このシグナルはネットワークの読み込みの状態に変化があるときに発行されます。 [ フラグについての情報をここに書き込んでください。 ]

net_state

関数プロトタイプ void net_state_change_cb (GtkMozEmbed *embed, gint flags, guint status, gpointer data);
このシグナルはドキュメントの読み込みの状態に変化があるときに発行されます。 [ フラグについての情報をここに書き込んでください。 ]【訳注: TestGtkEmbed.cpp に net_state_change_cb() 関数のプロトタイプと定義があります。また、gtkmozembed.h でフラグが定義されています。】

net_start

関数プロトタイプ void load_started_cb (GtkMozEmbed *embed, gpointer data);
このシグナルはドキュメントの読み込みが始まったときはいつでも発行されます。

net_stop

関数プロトタイプ void load_finished_cb (GtkMozEmbed *embed, gpointer data);
このシグナルはドキュメントの読み込みが完了したときはいつでも発行されます。

new_window

関数プロトタイプ void new_window_cb (GtkMozEmbed *embed, GtkMozEmbed **retval, guint chromemask, gpointer data);
このシグナルはドキュメントによってあたらしいトップレベルドキュメントが要求されたときはいつでも発行されます。これは JavaScript で window.open() が呼ばれた場合に起きます。このシグナルに応答することで新しいトップレベルウィンドウを chrome で囲むことができます。

新しく作成した GtkMozEmbed オブジェクトを retval を通して返すべきです。

visibility

関数プロトタイプ void visibility_cb (GtkMozEmbed *embed, gboolean visibility, gpointer data);
このシグナルは問題のトップレベルウィンドウを表示するか隠す必要があるときに発行されます。visibility 引数が TRUE の場合はウィンドウは表示されるはずです。FALSE の場合は隠されるはずです。

destroy_browser

関数プロトタイプ void destroy_brsr_cb (GtkMozEmbed *embed, gpointer data);
このシグナルはドキュメントがトップレベルウィンドウを閉じるように要求したときに発行されます。これは JavaScript で window.close() が呼ばれた場合に起こります。

open_uri

関数プロトタイプ gint open_uri_cb (GtkMozEmbed *embed, const char *uri, gpointer data);
このシグナルは、例えばウェブページ内のリンクをクリックしたときなど、ドキュメントが新しいドキュメントを読み込もうとしたときに発行されます。このシグナルにより組み込みをする人は新しいドキュメントが読み込まれないようにする手段を得ます。uri 引数は読み込まれることになる uri です。

このシグナルから TRUE を返した場合、新しいドキュメントは読み込まれません。FALSE を返した場合は新しいドキュメントを読み込みます。これはやや直感に反します。Mozilla のエンジンが新しいドキュメントの読み込みを中断したいかどうか尋ねているとして考えてください。TRUE を返すことで「このドキュメントを読み込むな。」と言っていることになります。

FAQ

古くさい Mozilla のスクロールバーの代わりに Gtk ネイティブなスクロールバーをどのように使うのですか。

簡単な解答は使えないというものです。他のフォーラムでじっくり議論された理由で Mozilla は独自のネイティブなスクロールバーを使っています。将来には gtk スクロールバーのルックアンドフィールを作る他の答えがあるかもしれません。この問題に引き続き注目してください。

作成したフォームの出力をどのように捕捉するのですか。

まだこれはできません。 [ ここにバグ番号を書いてください。【訳注: #129321がこれに相当すると思われます】 ]

ドキュメント内の画像や他のリソースの読み込みを捕捉する方法はありますか。

ドキュメント内の画像やマルチメディアリソースを Mozilla が取得方法のわからない他のリソースから取ってくるかもしれない場合に、コンテンツの一部を手動でレンダリングすることになるかもしれないので、この質問がなされます。この意見は、プロトコルハンドラ全体を書かずにこれをできるようにし、組み込みインターフェースやある種のコールバックを通してメディアタイプに対するドキュメントハンドラへデータを得られるようにしたいというものです。

Mozilla のアーキテクチャーではまだこれを行えませんがこの機能を使えるようにするバグがあります。 [ ここにバグ番号を挿入してください。 ]

改訂情報

M17

net_status フラグは新しいフラグを持つ net_state シグナルで置き換えられました。これは mozilla 内のプログレスリスナーの根本的な変更によるものです。

新しい関数 gtk_moz_embed_set_comp_path が追加されました。

gtkmozembed_internal.h ヘッダを追加しました。これにより mozilla に特化したデータを得ることができます。mozilla のすべてのヘッダーがインストールされていなくてもウィジェットを使えることはよいことなので、gtkmozembed.h とは分かれています。

新しい関数 gtk_moz_embed_get_nsIWebBrowser が追加されました。

M16

M16 で勇敢ではないプログラマでも使える組み込みウィジェットの最初のバージョンに達しました。

最後のリリースから次の関数が追加されました:

次のシグナルが追加されました:

既知の問題:

M15

組み込みウィジェットの最初のリリース。url の読み込み以外あまりできません。Gtk のフォーカスモデルでうまく動かず、けっこうクラッシュしやすいです。

Blizzard