ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

wxWebKitを使って、WebKitエンジン製の簡易なブラウザを作ってみる

最近、WebKitと その派生版が流行っておりまして、自分も色々と勉強中です。
で、WindowsWebKitを扱うのに便利なライブラリは無いかしら?と思って色々と調べていました。


で、現時点で、自分が理解した事を、簡単にメモしておきます。(嘘が入っているかも知れません)

  1. WebKitは外部からActiveXコントロール制御できない。
    どうやら商用でActiveXコントロール化した派生はあるようなんですが、WebKit自身はActiveXコントロール化されていない模様で、各種言語から CreateObject 等を使って外部から制御する事は出来ないようです。
  2. Windows版の内部実装は、COM実装されている模様。
    少なくとも、Windows版は AcitveXの基底技術である COMで実装されています。
    ただ、OLEオートメーションで必要なインタフェースを実装していないので、外部から制御できないと。
  3. WebKit技術を使ったライブラリは幾つかあるが、上記理由の為、実装が各ライブラリ専用に留まる。
    ライブラリ毎にWebKitが小分けになっているので、C#用のライブラリをセキュリティアップデートしたからと行って、QT用のライブラリの中身が入れ替わるという事は無いようです。
    イメージ的には、IEのライブラリはDLLに対するラッパー実装。WebKitのライブラリはスタティックLIB実装。って感じですかね。
  4. 派生ライブラリとしては、.NET用、wxWindows用、QT用、GTK用 等がある。
    ちなみに、各ライブラリ共 ほぼオレAPI化されており、互換性はあまり無いと思った方が良いと思います。
    (IEは、ActiveX化されているので、APIは ほぼ統一)


WebKitを調べる際、WebKitの外部制御のサンプル事例(Mac OS除く)が IEに比べて異様に少ないなぁと思ったのですが、通常だとC++言語+ソースコードを用意しないと手が出せない。各種ライブラリがオレ実装状態。じゃぁ、しょうがないなぁ。という感じですね。

上記状態からして、巷でよく見るように、WebKitIEを比べるのは意味が無いなぁ。と感じました。
実装形態が全く違う(汎用のIE、専用のWebKit)ので、速度やセキュリティに差が出るのは当然かなぁ、という感じです。

Windowsで使えそうな派生ライブラリ

で、話を戻しまして、Windows上でWebKitエンジンを簡易に使えるライブラリとして、どんなものがあるか少し調べてみました。
ちなみに、Pythonバインディング中心です。(他の言語は、あまり勉強していないので真面目に調べていません。ははは)


1.WebKitオリジナル
C++コンパイラを用意できるなら、WebKitの本家からソースコードをダウンロードしてきて、ビルド環境を揃えて、ビルド出来たら使えます。

正直難易度が高いです。


2..NET用ライブラリ
WebKit.NETという.NET用のライブラリを作っている所があります。


Windowsプログラマだったら、一番これが扱いやすいかな?と思います。
何しろ、ライブラリ一式をダウンロードした後、ファイルを展開し、アセンブリを参照して、フォームに WebKitコントロールを ぺたっと貼り付けるだけですからね。
APIも、IEを意識しているようで、かなり似せています。


3.Python用のwxWebKitライブラリ
まだプレビュー版ですが、wxWebKitというwxPythonWebKit専用ライブラリがあります。


おっPy派なら、多分これが扱いやすいかな?と思います。
とりあえず、Windowsインストーラー形式でライブラリが配布されているので、ぽんぽんインストールして、少しスクリプトを書くだけで使えますからね。
今回のネタは、これを使って簡易ブラウザを作っています。


4.Python用のpyWebKitGtkライブラリ
これも開発中のようですが、pyWebKitGtkというpyGTK用のライブラリがあります。


スクリーンショットを見るとWindowsでも扱えるようなのですが、ソースだけの配布なので少々難易度が高めです。
Wikiメーリングリストを眺め回してみたんですが、開発者の方々はLinuxメインのようで、Windowsポートについてあまり言及している箇所が見つからなかったんですね。


5.QT用のWebKitライブラリ
QT用にもWebKitライブラリがあるようです。


が、まだ試していません。
QWebView クラスの説明では、WebKit云々と書いてあるので、多分使えると思います。

wxWebKitをインストールする

長い話でしたが、wxWebKitを使って、Pythonで簡易ブラウザを作ってみましょう。

今回は、Python 2.6を入れた後、以下のWindowsインストーラを入れました。

  • wxPython2.8-win32-unicode-2.8.10.1-py26.exe
  • wxWebKit-win32-wx2.8-Py2.6-preview1.exe


これを入れた後、Pythonを立ち上げて 以下を手打ちしてみて下さい。

$ python
Python 2.6.1 (r261:67517, Dec  4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>> import wx.webview
>>> app = wx.PySimpleApp()
>>> frame = wx.Frame(None)
>>> w = wx.webview.WebView(frame)
>>> w.LoadURL("http://www.google.com")
>>> frame.Show()
True
>>> app.MainLoop()

以下のウィンドウが表示されたらOKです。(ウィンドウが前面に出ないので、タスクバーをよく見てください)
1
1 posted by (C)wacky

結構簡単ですよね?

wxWebKitを使って、簡易ブラウザ

では、次に簡易ブラウザを作って見ましょう。
以下にコード例を示します。

# -*- coding: utf_8 -*-  
import sys
import pdb
import wx
import wx.webview

class MyWindow(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, u"WebViewを使ったWebブラウザ", size=(640,400) )
        
        box = wx.BoxSizer(wx.VERTICAL)
        sz1 = wx.BoxSizer(wx.HORIZONTAL)
        if True:
            self.urlLabel = wx.StaticText(self, -1, "URL:")
            self.urlText  = wx.TextCtrl(self, -1, "http://www.google.com", size=(300, 20) )

            self.goButton = wx.Button(self, label="GO!")
            self.Bind( wx.EVT_BUTTON, self.OnSubmit, self.goButton )
            
            sz1.Add(self.urlLabel, 0, wx.LEFT, 20)
            sz1.Add(self.urlText,  0, wx.LEFT, 20)
            sz1.Add(self.goButton, 0, wx.LEFT, 20)
        
        self.web = wx.webview.WebView(self, size=(300, 400))
        self.web.Bind(wx.webview.EVT_WEBVIEW_LOAD, self.OnLoad)
        
        box.Add(sz1, 0, wx.EXPAND)
        box.Add(self.web, 1, wx.EXPAND)
        
        self.SetSizer(box)
        self.SetAutoLayout(True)
        box.Fit(self)

    def OnSubmit(self, event):
        print "set URL:", self.urlText.GetValue()
        self.web.LoadURL(self.urlText.GetValue())
    
    def OnLoad(self, event):
        print "load state:", event.GetState()
        if event.GetState() == wx.webview.WEBVIEW_LOAD_DL_COMPLETED:
            o = self.web.GetMainFrame()
            html_code = o.GetPageSource()       # HTML code
            print type(html_code)
            print html_code.encode("cp932", "ignore")

if __name__=='__main__':
    app=wx.PySimpleApp()
    frame=MyWindow(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

上記コードを実行すると、以下のようになります。
2
2 posted by (C)wacky


たった、これだけのコードで、簡単なブラウザが作れました。

最後に

いかがでしたでしょうか?
WebKitを素のままで使うのは少々骨が折れますが、スクリプト言語サポートを介してなら、比較的簡単に制御できます。


ちなみにここまで書いておいて何ですが、リンクするだけでOKなWebKitライブラリのバイナリ版無いですかね?
ソースコードから何度もビルドしようとしているんですが、全然うまく行かないです。orz

2010/05/16: 追記

WebKitは外部からActiveXコントロール制御できない。」の所ですが、どうも「ActiveX登録すれば OLEオートメーションによる制御が可能」のような感じ。
register serverしたら、もしかしたらうまく出来るのかなぁ?