About WebKit, browsers and mail clients. And green cats.

Menu

The Evincehackfest took place last week from 23rd to 25th July in Strasbourg. Yes, 3 days only, but very productive in my opinion, I’ll summarize all the cool stuff we worked on.

HiDPI

This work was initially started by Owen, and then Germán kept the patches up to date with evince git master. I reviewed all the pending patches and updated the thumbnails one and the result is that evince doesn’t look blurry on HiDPI screens any more.

Evince running with GDK_SCALE=2

Recent View

This was a GSoC project of 2013, but the patch provided by the student was never in an “upstreamable” state. Again Germán, who always loved this feature, took care of the patch addressing my review comments. At the beginning of the hackfest most of the work has already been done, we only needed a few more review iterations during the hackfest to finally push this feature to master. The idea is to show the list of recent documents as an icon view with thumbnails and documents metadata. This view is loaded when evince is launched without any document replacing the useless empty window we had before. It also replaces the recent documents submenu in the gear menu.

UI improvements

The move to the header bar recently made the toolbar look a bit cluttered, mainly because the title might use a lot of space. We discussed several ideas to improve the header bar and implemented some of them:

Annotations

Giselle and Anuj, our GSoc students this year, worked on their projects to improve the annotations support in both Evince and poppler.

Anuj wrote some patches to add support for Free Text annotations to poppler glib API. After a couple of review iterations and discussions about the API, the patches are now in bugzilla waiting for a final review (I hope to find the time soon)

Comics backend

Juanjo Marín focused on the comics backend, working on a patch to use libarchive to uncompress the documents instead of spawning external command line tools.

Gestures

I started to review the gestures branch during the hackfest, patches looked clean and simple, but since I was not familiarized with the new GTK+ touch API and I didn’t have a touch screen to try it out either, I decided to wait after the hackfest and see it in action in garnacho’s laptop during GUADEC. Carlos explained to me how the touch API works in GTK+ and I could check it actually works great. The code doesn’t affect the normal use with the mouse, so the branch will be merged in master soon.

And of course not everything was hacking

THANKS!

Many thanks to Alexandre Franke for the local organization, everything worked perfectly. Of course thanks to the GNOME Foundation for sponsoring the GSoC students, Giselle and Anuj, and Igalia for sponsoring all the Igalians attending the hackfest. Thanks also to Epitech for allowing us to do the hackfest there before the GUADEC.

Today is the day of Midori 0.5.8. Dedicated to Adblock and WebKit2. Rather than trying to meet fixed dates as we used to, we selected which goals define if the cycle is done. No more no less.

As liked, fast and efficient our Adblock extension was, the original maintainer isn’t around anymore and flaws were accumulating on a code base that wasn’t very accessible anymore. So long story short Adblock is rewritten from C to Vala, several classes and files instead of one monolithic entity, plenty unit test cases and real whitelist support. Add to that a statusbar icon for easy flipping filtering on and off and seeing whether anything was blocked on the site. If you had problems with peculiar display problems whilst using Adblock, chances are good they’ll be gone with the upgrade. Adblock is as always shipped with Midori so just be sure to enable it in the Preferences!

In other news WebKit2 is making another big jump and closer to the finish line. Text selection behavior, favicons, support for multiple rendering processes, opening new windows and setting cache and cookie paths correctly. There’s still work to do in the areas of extensions and downloads in particular, but we’re getting there.

We have working spelling corrections again. Right-click an underlined word and pick a suggestion from the menu. It’s that simple.

Two new extensions implement Ctrl+Enter to complete www. and .com and a handy little notes panel which automatically saves one or more snippets as you make changes.

Aaaaaand we’ve got a brand new file type editor (MIME type on Linux). Finally the user is in control of how files open, either via the Preferences or the right-click “Open With…” menu item.

As always see the file Changelog for more details. And stick around for a bit if your package isn’t there yet, it can take a while.

DOM touch events support

WebKitWebView now processes the touch events happening in the widget to notify the DOM, making modern websites using DOM touch API properly work. Carlos Garnacho has taken a screencast to show it in action

Plugins cache

When the first page containing plugins was loaded, the UI process got blocked for some time, while the plugins were scanned. This was one of the most annoying bugs of WebKitGTK+ introduced in 2.0. Plugins are synchronously scanned on demand during the page load, and it’s something that can’t be avoided. WebKitGTK+ 2.4 uses a persistent cache to store information about all plugins, so that plugins are only scanned the first time or when they change.

WebKit1 deprecation

There’s one last thing I would like to mention. Even when WebKit1 API has been deprecated since we released WebKitGTK+ 2.0, we have kept shipping both APIs in our tarball releases. A decision hasn’t been made yet, but this is probably the last release including the WebKit1 API, we have plans to remove the WebKit1 code from trunk and move all the build bots to run only WebKit2 tests. We encourage everybody to port their applications to WebKit2, submitting bug reports if there’s anything preventing the switch, and of course we are happy to help on IRC, mailing list, etc.

The avid user may have noticed the release is overdue, although scheduling a release over new year’s eve was probably a lost bet to begin with, so that’s why. The good news is we got some extra bug fixing time.

So what did we get done? A good amount of clean-up including a revamped notebook – this is tech jargon for the tabs UI – with the goal of reducing bugs due to different build configuration, regardless of whether one is using GTK+2, GTK+3, Granite or Windows. A good deal of dead code could be dropped and many things simplified. There’s also a new Database abstraction which you don’t see on the outside but improves error handling and reduces bugs by unifying how things are done.

Now this is all nice and boring, are there any actual changes? Yes! Session management, nicknamed tabby, again gets smarter about reacting to crashes by not loading the faulty website and running commands on the command line properly. Private browsing has also benefited from some bug fixing, such as not wrongly attempting to load favicons from disk and enabling the sidepanel, for example for downloads (or other panels from extensions, for the brave ones who use the command line to enable extensions in private browsing).

Oddly enough one very small feature we got which I find amazingly useful myself ever since it’s there: Close Tabs to the Right. You wouldn’t think it does much, but if you’re applying a workflow of search and open as many results tabs as you can, and suddenly find all but one very much obsolete, this is exactly what you need.

As always see the file Changelog for more details. And stick around for a bit if your package isn’t there yet, it can take a while.

The current experimental build has had mostly positive feedback so it will be the basis for the upcoming Midori 0.5.7 for Windows. As described in detail earlier WebKit and GStreamer were updated. This also contains the latest featureset from trunk which is entering freeze now. This includes refactored tabs, better font defaults, and a number of smaller fixes. Any testing now can help findings bugs before the next release!

Known Issues

Dark shadow on inactive buttons (gtk3 style issue)

Cursor does not change appearance on links/ textarreas (webkitgtk3 issue)

As every year many ideas came up during the WebKitGTK+ hackfest presentation, but this time there was one we all were very excited about, the multiple web processes support. Apple developers already implemented the support for multiple web processes in WebKit, which is mostly cross platform, but it requires the network process support to properly work (we need a common network process where cookies, HTTP cache, etc are shared for all web processes in the same web context). Soup based WebKit ports don’t implement the network process yet, so the goal of the hackfest became to complete the network process implementation previously started by EFL and Nix guys, as a first step to enable the multiple web processes support. Around 10 people were working on this goal during the whole hackfest, meeting from time to time to track the status of the tasks and assigning new ones.

Andy updated some of the patches already waiting for a review and set up github repo with all those patches so that we all could work without dealing with individual patches.

Sergio updated the patch proposed by Balazs to implement the bits required to connect the network process with the web process using UNIX domain sockets.

After all this awesome work we managed to have the basic support, with MiniBrowser perfectly rendering pages and allowing navigation using the network process. But as expected, there were some bugs and missing features, so I ran the WebKit2 unit tests and we took failing tests to investigate why they were failing and how to fix them.

Adrian submitted a patch to add new API to select the process model that will be used when the network process support is finished. He is also working on the problems of having multiple instances of the web extensions.

So, we are actually far from having a complete and stable network process support, but it’s a huge step forward. The good news is that once we have network process implemented, the multiple web processes support will work automatically just by selecting the multiple web process model.

All this sounds like a lot of work done, but that’s only a small part of what has happened this week in Coruña:

Martin and Gustavo made moreparts of WebKit actually build with the cmake build.

And I’m sure I’m missing more great stuff done that I could not follow closely. It’s definitely been a very productive hackfest that it would haven’t been possible without the sponsors, Igalia and the GNOME Foundation. Thanks!

Our new session management nicknamed tabby need a little bit more polish so we decided to go for a double length release cycle. This is a proper rewrite of the tab loading at startup and for the first time fully aware of multiple windows, able to load most recently used websites first and smart enough to not block GUI updates. If that’s not impressive enough it designed to get a sync backend and session management GUI is already work in progress, though it’s not ready for the spot light yet.

We also made the switch from WAF to cmake. What does this mean to end users? Nothin much. But to developers and contributors it means a lot. A big motivation was frustration from package maintainers with several aspects of WAF such as compatibility and the need to ship a binary blob. And in fact most contributors never got the hang of it. cmake on the other hand seems to win people over for not so obvious reasons. It’s in many ways tailored towards doing what it does while giving decent error behavior.

We also went with GApplication aka GLib.Application. No more choice between Unique and our own custom sockets implementation, which means less bugs due to different code paths and code possibly being disabled in some builds. It’s notably not Gtk.Application because we’re still crazy enough to support GTK+2 on its last breath which mainly means no use of new features that didn’t exist before either.

As always see the file Changelog for more details. And stick around for a bit if your package isn’t there yet, it can take a while.