go-webkit2 provides Go bindings for the WebKitGTK+ 2 API. It permits headless operation of WebKit as well as embedding a WebView in a GTK+ application.
- Go >= 1.2rc1 (due to #3250)
- GTK+ 3.10+
- WebKitGTK+ >= 2.0.0
You can specify Go build tags to omit bindings in
gotk3 for later versions of GTK
(e.g., go build -tags gtk_3_10
).
sudo apt-get install libwebkit2gtk-3.0-dev
Pass -tags gtk_3_10
to the go tool if you have GTK 3.10 installed.
sudo add-apt-repository ppa:gnome3-team/gnome3-staging
sudo apt-get update
sudo apt-get install libwebkit2gtk-3.0-dev
sudo add-apt-repository ppa:gnome3-team/gnome3
sudo apt-get update
sudo apt-get install libwebkit2gtk-3.0-dev
sudo pacman -S webkitgtk
Make sure you install WebKitGTK+ 2, not version 1. After installation, you
should have an include file that satisfies #include <webkit2/webkit2.h>
.
package webkit2_test
import (
"fmt"
"github.com/conformal/gotk3/glib"
"github.com/conformal/gotk3/gtk"
"github.com/sourcegraph/go-webkit2/webkit2"
"github.com/sqs/gojs"
"runtime"
)
func Example() {
runtime.LockOSThread()
gtk.Init(nil)
webView := webkit2.NewWebView()
defer webView.Destroy()
webView.Connect("load-failed", func() {
fmt.Println("Load failed.")
})
webView.Connect("load-changed", func(ctx *glib.CallbackContext) {
loadEvent := webkit2.LoadEvent(ctx.Arg(0).Int())
switch loadEvent {
case webkit2.LoadFinished:
fmt.Println("Load finished.")
fmt.Printf("Title: %q\n", webView.Title())
fmt.Printf("URI: %s\n", webView.URI())
webView.RunJavaScript("window.location.hostname", func(val *gojs.Value, err error) {
if err != nil {
fmt.Println("JavaScript error.")
} else {
fmt.Printf("Hostname (from JavaScript): %q\n", val)
}
gtk.MainQuit()
})
}
})
glib.IdleAdd(func() bool {
webView.LoadURI("https://www.google.com/")
return false
})
gtk.Main()
// output:
// Load finished.
// Title: "Google"
// URI: https://www.google.com/
// Hostname (from JavaScript): "www.google.com"
}
See the documentation and the test files for usage information and examples.
For more information about the underlying WebKitGTK+ 2 API, refer to the WebKit2 docs.
The included webkit-eval-js
program runs the contents of a JavaScript file in the context of
a web page. Run with:
$ go get -tags gtk_3_10 github.com/sourcegraph/go-webkit2/webkit-eval-js
$ webkit-eval-js https://example.com scriptfile.js
For example:
$ echo document.title | webkit-eval-js https://google.com /dev/stdin
"Google"
The following projects use go-webkit2:
- WebLoop - headless WebKit with a Go API
go test ./webkit2
Note: The tests require an X display. If you are not running in a graphical environment, you can use Xvfb:
Xvfb :1 &
export DISPLAY=:1
go test ./webkit2
- Implement more of the WebKitGTK+ 2 API. Right now, only certain parts of it are implemented.
- Set up CI testing. This is difficult because all of the popular CI services run older versions of Ubuntu that make it difficult to install WebKitGTK+ >= 2.0.0.
- Create example applications.
- Fix memory leaks where C strings are allocated and not freed.
See the AUTHORS file for a list of contributors.
Submit contributions via GitHub pull request. Patches should include tests and should pass golint.