WebThing - A modular webkit browser I. A HISTORICAL TREATISE ON WEB BROWSERS ===== | | ===== N THE BEGINNING the Web was void and without form. Then came Mosaic, which was the first of the graphical web browsers. Descended from Mosaic was Mozilla, oft known as Netscape, and their heretical offshoot Spyglass Mosaic. Netscape grew in power to become the dominant browser, but Microsoft used Spyglass to create Internet Explorer, which later Netscape's thunder through underhanded means. This would not be the last of Netscape, though. The world entered a dark age as Internet Explorer's influence grew throughout the land. But in a far away corner of the world, the legacy of Mozilla continued. Dwarves toiled in the darkest caves re-tooling Mozilla to challenge Internet Explorer, and it was through them that it was reborn as Phoenix. Er, Firebird. Wait, no, Firefox. Yes, definetly Firefox. As Firefox began to strike back, others emerged from the shadows to help fight. From the brightly colored fields of KDE came KHTML, which was transformed into WebKit by Apple's elves, and packaged into Safari by Apple's turtlenecked humans. From the wild north of Norway came Opera, which had actually been around since 1996, but nobody noticed it was there even though it was small and quick and generally better than everything else at the time. And from these a thousand fold have spawned: Chrome, Midori, Shiira, Camino, Arora, Epiphany, iCab, K-Meleon, Galeon, and many, many others. II. AN INFORMAL INTRODUCTION TO WEBTHING ===== | | ===== T IS FROM the WebKit line that WebThing descends. It is inspired largely by the Firefox add-on Vimperator, and the hyper-minimal WebKit browser uzbl. WebThing's strength is that it is highly modular -- parts of WebThing can be swapped out for others, or removed entirely. WebThing is a browser for tinkerers and hackers, for people who want to be able to customize things to the limit, and for anyone who believes they could do it better themselves. III. ON THE PROCUREMENT, ASSEMBLAGE, AND EXECUTION OF WEBTHING ===== | | | HE SOURCE FOR WebThing is currently only available from a git repository. If you're reading this, you can probably figure out how to check out the code. There is currently no support for compile-time configuration or installation. I'm not a fan of automake, and the project's complexity currently doesn't merit such finaglery. To compile WebThing, you will need: * A C compiler (configuration of libsoup cannot yet be done from .NET) * Mono 2.0+ (the adventurous may find that .NET works fine, too) * GTK# 2.12 (though it may work with previous versions, I have not tested them) * WebKit# built on a recent WebKit-Gtk (I used 1.1.8) WebKit requires a lot of things on its own -- you'll have a fun adventure getting it compiled, I'm sure. When you build WebKit#, you will have to copy webkit-sharp.dll into the same directory as WebThing. It does not seem to link properly otherwise. If anyone knows what's going on there, I'd be highly appreciative of a fix. Once the dependencies are satisfied, type 'make', and some magic should happen to produce a WebThingMain.exe with a host of dll files. From there, you should be able to run the WebThing script and the browser will launch. The default set of plugins creates a Vim-like browsing experience reminiscent of Vimperator (but not nearly as complete), or uzbl (but slightly less incomplete). IV. EXPLORING THE DARK DEPTHS OF WEBTHING ===== | | | HE source is divided roughly into two sections, the WebThing core, and plugins. It is my intent to keep the core as minimal as possible, implementing only the barest functionality. The functionality that makes up the user experience should be added into plugins. Also, plugins allow code to be separated into clean, easy-to-understand chunks. Clean separation of code was a failing of the uzbl project that in large part inspired WebThing. The core provides: * A bare WebKit control * Simple tab functionality through a GtkNotebook widget * Option parsing * Plugin loading * Facilities for attaching widgets to points in the window Here is the plugin set so far: * DefaultPage Loads a page specified on the command line, or else a default page * LoadProgress Places a small widget in the upper right corner that shows page loading progress * FFNav Implements Firefox-like navigation keys (Alt-Left and Right, Backspace, Ctrl-T, Ctrl-Tab, and Ctrl-W) * Vimish Implements Vim-like navigation keys (HJKL) and a command bar that allows opening URLs and configuring state V. THE ARCHITECTURE OF PLUGINS, AND THEIR REQUIREMENTS /~\ | | |---| | | PLUGIN IS a subclass of WebThingPlugin, which defines two functions that may be of interest to the developer: * Init(WebThing wt) - Called when WebThing is starting up, and passes a WebThing instance to the plugin * InitWebView(WebView wv) - Called when a new WebView is created, and passes a WebView instance to the plugin The WebThing class contains everything that WebThing is. Since the details are still very much in flux, I won't bother describing it just yet. At this point I would recommend anyone against writing plugins until the plugin API stabilizes. Comments, suggestions, and criticisms are welcome. VI. MEANS BY WHICH THE AUTHOR MAY BE CONTACTED | | |\ /| | \/ | | | Y EMAIL ADDRESS is bytex64@bytex64.net. I'm not yet ready to accept general patches, but patches for fixing bugs are welcome. Have fun!