<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet WebKit</title>
	<link rel="self" href="http://planet.webkit.org/atom.xml"/>
	<link href="http://planet.webkit.org/"/>
	<id>http://planet.webkit.org/atom.xml</id>
	<updated>2008-06-30T17:18:25+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Cameron Zwarich is a WebKit Reviewer</title>
		<link href="http://webkit.org/blog/196/cameron-zwarich-is-a-webkit-reviewer/"/>
		<id>http://webkit.org/blog/?p=196</id>
		<updated>2008-06-23T20:58:10+00:00</updated>
		<content type="html">&lt;p&gt;Cameron Zwarich is now a qualified WebKit Reviewer. Cameron has been doing amazing work on the JavaScript implementation and was one of the core developers on the new bytecode engine. He has also branched out into other areas of the code and squashed bugs of all varieties. Please join me in congratulating Cameron on his reviewer status and thanking him for all of his contributions to WebKit.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The cost of a bug fix</title>
		<link href="http://blog.squidy.info/2008/06/12/the-cost-of-a-bug-fix/en/"/>
		<id>http://blog.squidy.info/2008/06/12/the-cost-of-a-bug-fix/fr/</id>
		<updated>2008-06-12T19:41:59+00:00</updated>
		<content type="html">&lt;p&gt;Every fix doesn&amp;#8217;t call for a blog post, but this one deserves it.  It all started when &lt;a href=&quot;http://blogs.gnome.org/jjongsma/&quot;&gt;Jonathon Jongsma&lt;/a&gt; found a way to make text disappear in QtWebKit on May 27th.  So he raised a &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=19279&quot;&gt;bug&lt;/a&gt;.  He and I started working on fixing it.  We rapidly found that WebKitGtk was also affected, but it was unreproducible on the Mac port.&lt;/p&gt;
&lt;p&gt;We dove into the code: &amp;#8220;grep selection&amp;#8221;, GraphicsContext::drawText(), Font::drawText()&amp;#8230; but nothing was really different (there) in the Qt or Gtk port which could explain why the text wasn&amp;#8217;t being redrawn when changing the selection.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s when I discovered git bisect.  Since we had established that the bug wasn&amp;#8217;t there when QtWebKit was snapshot for Qt 4.4.0, I had a good place to start.  So after recompiling QtWebKit some 15 times (yes, it took around 3 work days!), it pointed me to this &lt;a href=&quot;http://trac.webkit.org/changeset/32660&quot;&gt;changeset&lt;/a&gt;.  Lucky for us, it was related to the bug (text rendering).&lt;/p&gt;
&lt;p&gt;After some digging into the patch, I contacted the author, Dan Bernstein at Apple, and we looked at it together.  In little time, he was able to find how to reproduce it on the Mac too.  This was now a WebKit wide bug!  Some back traces later and some trials: we came up with this &lt;a href=&quot;http://trac.webkit.org/changeset/34414&quot;&gt;fix&lt;/a&gt;. Pretty simple, isn&amp;#8217;t it?  barely 16 chars.  Yet, these 16 chars cost around 1200$* in direct labour time and 3 engineers were involved.&lt;/p&gt;
&lt;p&gt;Some will say this could have been prevented with proper tests.  It happens that it was a special case on the Mac, but all other ports always went through it.  Dan now added a pixel test.&lt;/p&gt;
&lt;p&gt;The morals of the story are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; bug fixing is costly (haven&amp;#8217;t we heard that in school?)&lt;/li&gt;
&lt;li&gt;you never know when someone will hunt you back about your patch&lt;/li&gt;
&lt;li&gt;git is a cool beast (in fact, it just convinced me to use it)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One question lasts: how come it took over a month and a half before someone found it? &lt;img src=&quot;http://blog.squidy.info/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;* This number is based on market mean hourly rate since exact rates are unknown&lt;/p&gt;
&lt;h3&gt;Side note on the WebKit party&lt;/h3&gt;
&lt;p&gt;It was really cool to get to San Francisco and finally meet IRL other WebKit devs.   Kudos for the &lt;a href=&quot;http://webkit.org/blog/187/third-annual-webkit-open-source-party/&quot;&gt;event&lt;/a&gt;!&lt;/p&gt;</content>
		<author>
			<name>Pierre-Luc Beaudoin</name>
			<uri>http://blog.squidy.info</uri>
		</author>
		<source>
			<title type="html">Pierre-Luc Beaudoin » WebKit</title>
			<subtitle type="html">Métro, boulot, amigos est mon crédo</subtitle>
			<link rel="self" href="http://blog.squidy.info/category/webkit/feed/en/"/>
			<id>http://blog.squidy.info/category/webkit/feed/en/</id>
			<updated>2008-06-30T17:18:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit Meta: A new standard for in-game web content</title>
		<link href="http://www.atoker.com/blog/2008/06/12/webkit-meta-a-new-standard-for-in-game-web-content/"/>
		<id>http://www.atoker.com/blog/?p=111</id>
		<updated>2008-06-12T09:35:20+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://meta.nuanti.com&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-113&quot; title=&quot;meta&quot; src=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/06/meta.png&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;150&quot; height=&quot;42&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Over the last few months, our browser team at &lt;a href=&quot;http://www.nuanti.com/&quot;&gt;Nuanti Ltd.&lt;/a&gt; has been developing &lt;em&gt;Meta&lt;/em&gt;, a brand new &lt;a href=&quot;http://webkit.org/&quot;&gt;WebKit&lt;/a&gt; port suited to embedding in OpenGL and 3D applications. The work is being driven by &lt;a href=&quot;http://lindenlab.com/&quot;&gt;Linden Lab&lt;/a&gt;, who are eagerly investigating WebKit for use in &lt;a href=&quot;http://secondlife.com/&quot;&gt;Second Life&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While producing &lt;em&gt;Meta&lt;/em&gt; we&amp;#8217;ve paid great attention to resolving the technical and practical limitations encountered with other web content engines.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-116&quot; title=&quot;ubrowser-webkit&quot; src=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/06/ubrowser-webkit.jpg&quot; alt=&quot;&quot; width=&quot;450&quot; height=&quot;304&quot; /&gt;&lt;br /&gt;
&lt;small&gt;&lt;a href=&quot;http://ubrowser.com/&quot;&gt;uBrowser&lt;/a&gt; running with the WebKit &lt;em&gt;Meta&lt;/em&gt; engine&lt;/small&gt;&lt;/p&gt;
&lt;h3&gt;High performance, low resource usage&lt;/h3&gt;
&lt;p&gt;&lt;img class=&quot;size-full wp-image-114 alignright&quot; title=&quot;squirrelfish&quot; src=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/06/squirrelfish.png&quot; alt=&quot;&quot; width=&quot;108&quot; height=&quot;68&quot; /&gt;&lt;em&gt;Meta&lt;/em&gt; is built around WebKit, the same engine used in web browsers like &lt;a href=&quot;http://www.apple.com/safari/&quot;&gt;Safari&lt;/a&gt; and &lt;a href=&quot;http://live.gnome.org/Epiphany/WebKit&quot;&gt;Epiphany&lt;/a&gt;, and features some of the fastest content rendering around as well as nippy JavaScript execution with the state of the art &lt;a href=&quot;http://webkit.org/blog/189/announcing-squirrelfish/&quot;&gt;SquirrelFish VM&lt;/a&gt;. The JavaScript SDK is available independently of the web renderer for sandboxed client-side game scripting and automation.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also highly scalable. Some applications may need only a single browser context but virtual worlds often need to support hundreds of web views or more, each with active content. To optimize for this use case, we&amp;#8217;ve cut down resource usage to an absolute minimum and tuned performance across the board.&lt;/p&gt;
&lt;h3&gt;Stable, easy to use cross-platform SDK&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Meta&lt;/em&gt; features a single, rock-solid API that works identically on all supported platforms including Windows, OS X and Linux. The SDK is tailored specifically to embedding and allows tight integration (shared main loop or operation in a separate rendering thread, for example) and hooks to permit seamless visual integration and extension. There is no global setup or initialization and the number of views can be adjusted dynamically to meet resource constraints.&lt;/p&gt;
&lt;h3&gt;Minimal dependencies&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Meta&lt;/em&gt; doesn&amp;#8217;t need to use a conventional UI toolkit and doesn&amp;#8217;t need any access to the underlying windowing system or the user&amp;#8217;s filesystem to do its job, so we&amp;#8217;ve done away with these concepts almost entirely. It adds only a few megabytes to the overall redistributable application&amp;#8217;s installed footprint and won&amp;#8217;t interfere with any pre-installed web browsers on the user&amp;#8217;s machine.&lt;/p&gt;
&lt;h3&gt;Open Source, no licensing fees&lt;/h3&gt;
&lt;p&gt;In the short term, we&amp;#8217;ll be maintaining &lt;em&gt;Meta&lt;/em&gt; in a public branch and putting out SDK builds, demo applications and developer documentation. Nuanti will be offering commercial and community support and is anticipating involvement from the gaming industry and homebrew programmers.&lt;/p&gt;
&lt;p&gt;In the mid term, we&amp;#8217;ll submit &lt;em&gt;Meta&lt;/em&gt; as an official component of the WebKit Open Source project, where our developers are already actively involved in maintaining various subsystems.&lt;/p&gt;
&lt;h3&gt;Find out more&lt;/h3&gt;
&lt;p&gt;Today we&amp;#8217;re launching &lt;a href=&quot;http://meta.nuanti.com&quot;&gt;meta.nuanti.com&lt;/a&gt; and two mailing lists to get developers talking. We&amp;#8217;re looking to make this site a focal point for embedders, choc-full of technical details, code samples and other resources.&lt;/p&gt;</content>
		<author>
			<name>Alp Toker</name>
			<uri>http://www.atoker.com/blog</uri>
		</author>
		<source>
			<title type="html">Alp Toker » WebKit</title>
			<subtitle type="html">There is a third way</subtitle>
			<link rel="self" href="http://www.atoker.com/blog/category/webkit/feed/"/>
			<id>http://www.atoker.com/blog/category/webkit/feed/</id>
			<updated>2008-06-12T10:00:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Qt Jambi 4.4.0 Released!</title>
		<link href="http://labs.trolltech.com/blogs/2008/06/10/qt-jambi-440-released/"/>
		<id>http://labs.trolltech.com/blogs/2008/06/10/qt-jambi-440-released/</id>
		<updated>2008-06-10T09:13:27+00:00</updated>
		<content type="html">&lt;p&gt;So the time is finally here. Qt 4.4.0 was released a few weeks ago and as promised Qt Jambi is right behind. A lot of effort has gone into this one, in addition to supporting all the new Qt features, like Phonon, Webkit, Widgets in Graphics View, XQuery and Qt Concurrent, we also have a seriously improved deployment system, JDBC support and a compile-time checked signal-slot approach for the paranoid. Its a good time to be a Java developer I tell yah! We already mentioned all the featuers in the &lt;a href=&quot;http://labs.trolltech.com/blogs/2008/03/12/qt-jambi-44-preview-released/&quot;&gt;Qt Jambi 4.4.0 Preview Blog&lt;/a&gt; so we won&amp;#8217;t repeat ourselves here&amp;#8230; (There is a danger in linking to eskils blog, as it links to others again, which again links to others, which in the end proves to be a fairly complex graph, but then again&amp;#8230; we are engineers and like that kind of stuff)&lt;/p&gt;
&lt;p&gt;Under the cover we&amp;#8217;ve also done quite some work. We also did an overhaul of the garbage collection and memory management subsystem and hopefully ironed out all the bumps and dents. We&amp;#8217;ve also done some work on the build system, so that our users that build from source have a bit more substantial buildsystem to work with. Previously it was a complex install document, which has been replaced by a simple &lt;code&gt;ant&lt;/code&gt; command which just does it all&amp;#8230; I was very happy to see that the deployment system &amp;#038; ANT build scripts works well enough for the webstart to look like a plain, normal webstart app: &lt;/p&gt;
&lt;p&gt;&lt;code&gt;  &amp;lt;resources&amp;gt;&lt;br /&gt;
    &amp;lt;j2se version=&quot;1.5+&quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;jar href=&quot;qtjambi-examples-4.4.0_01.jar&quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;jar href=&quot;qtjambi-4.4.0_01.jar&quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/resources&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;resources os=&quot;Windows&quot; arch=&quot;x86&quot;&amp;gt;&lt;br /&gt;
    &amp;lt;j2se version=&quot;1.5+&quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;jar href=&quot;qtjambi-win32-msvc2005-4.4.0_01.jar&quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/resources&amp;gt;&lt;/p&gt;
&lt;p&gt;No magic nativejar or anything like that, just the qtjambi-win32-msvc2005-4.4.0_01.jar in the classpath and that is enough to load it, jpeg and svg plugins and all. The good thing is that the files included in the webstart are produced directly by the ant script with all dependencies etc set up properly&amp;#8230; (well&amp;#8230; almost properly, it took us an evening last week to get it really working, but now it works properly). Because of the fixes to memory management and deployment Eskil and I got these offical diplomas:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chaos.troll.no/~gunnar/diplomas.jpg&quot; alt=&quot;Absolutely last load issue fixed and Last memory managment bug&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So, what more is there to say&amp;#8230; Try the &lt;a href=&quot;http://dist.trolltech.com/developer/download/webstart/index.html&quot;&gt;webstart&lt;/a&gt; with its new demos, download the packages and start hacking!&lt;/p&gt;
&lt;p&gt;-&lt;br /&gt;
The Qt Jambi Team&lt;/p&gt;</content>
		<author>
			<name>gunnar</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Trolltech Labs Blogs</title>
			<subtitle type="html">the ramblings of engineers</subtitle>
			<link rel="self" href="http://labs.trolltech.com/blogs/feed/atom/?cat=9"/>
			<id>http://labs.trolltech.com/blogs/feed/atom/?cat=9</id>
			<updated>2008-06-30T17:18:15+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Announcing SquirrelFish</title>
		<link href="http://webkit.org/blog/189/announcing-squirrelfish/"/>
		<id>http://webkit.org/blog/?p=189</id>
		<updated>2008-06-03T01:37:06+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img width=&quot;30%&quot; src=&quot;http://webkit.org/blog-files/squirrelfish.png&quot; alt=&quot;SquirrelFish Mascot&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;“Hello, Internet!”&lt;/h3&gt;
&lt;p&gt;WebKit’s core JavaScript engine just got a new interpreter, code-named SquirrelFish.&lt;/p&gt;
&lt;p&gt;SquirrelFish is fast—much faster than WebKit’s previous interpreter. Check out the numbers. On the &lt;a href=&quot;http://webkit.org/perf/sunspider-0.9/sunspider.html&quot;&gt;SunSpider JavaScript benchmark&lt;/a&gt;, SquirrelFish is 1.6 times faster than WebKit&amp;#8217;s previous interpreter.&lt;/p&gt;
&lt;div&gt;&lt;strong&gt;SunSpider runs per minute&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/squirrelfish-webkit-graph.png&quot; alt=&quot;bar graph of SunSpider runs&quot; /&gt;&lt;/p&gt;
&lt;div&gt;&lt;em&gt;Longer bars are better.&lt;/em&gt;&lt;/div&gt;
&lt;h3&gt;What Is SquirrelFish?&lt;/h3&gt;
&lt;p&gt;SquirrelFish is a register-based, direct-threaded, high-level bytecode engine, with a sliding register window calling convention. It lazily generates bytecodes from a syntax tree, using a simple one-pass compiler with built-in copy propagation.&lt;/p&gt;
&lt;p&gt;SquirrelFish owes a lot of its design to some of the latest research in the field of efficient virtual machines, including research done by Professor M. Anton Ertl, et al, Professor David Gregg, et al, and the developers of the Lua programming language.&lt;/p&gt;
&lt;p&gt;Some great introductory reading on these topics includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://citeseer.ist.psu.edu/cache/papers/cs/32018/http:zSzzSzwww.jilp.orgzSzvol5zSzv5paper12.pdf/ertl03structure.pdf&quot;&gt;The Structure and Performance of Efficient Interpreters&lt;/a&gt; &lt;em&gt;(Introduces the fundamentals of virtual machine design and explains the importance of direct threading)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sagecertification.org/events/vee05/full_papers/p153-yunhe.pdf&quot;&gt;Virtual Machine Showdown: Stack Versus Registers&lt;/a&gt; &lt;em&gt;(Details the benefits of register machines, and the importance of copy propagation)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tecgraf.puc-rio.br/~lhf/ftp/doc/jucs05.pdf&quot;&gt;The Implementation of Lua 5.0&lt;/a&gt; &lt;em&gt;(Outlines the implementation of a real-world register-based bytecode engine, with a sliding register window calling convention)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve also pored over stacks of terrible books and papers on these topics. I’ll spare you those.&lt;/p&gt;
&lt;h3&gt;Why It’s Fast&lt;/h3&gt;
&lt;p&gt;Like the interpreters for many scripting languages, WebKit’s previous JavaScript interpreter was a simple syntax tree walker. To execute a program, it would first parse the program into a tree of statements and expressions. For example, the expression “&lt;code&gt;x + y&lt;/code&gt;” might parse to&lt;/p&gt;
&lt;pre&gt;
        +
      /   \
     x     y
&lt;/pre&gt;
&lt;p&gt;Having created a syntax tree, the interpreter would recursively visit the nodes in the tree, performing their operations and propagating execution state. This execution model incurred a few types of run-time cost.&lt;/p&gt;
&lt;p&gt;First, a syntax tree describes a program’s grammatical structure, not the operations needed to execute it. Therefore, during execution, the interpreter would repeatedly visit nodes that did no useful work. For example, for the block “&lt;code&gt;{ x++; }&lt;/code&gt;”, the interpreter would first visit the block node “{&amp;#8230;}”, which did nothing, and then visit its first child, the increment node “&lt;code&gt;x++&lt;/code&gt;”, which incremented x.&lt;/p&gt;
&lt;p&gt;Second, even nodes that did useful work were expensive to visit. Each visit required a virtual function call and return, which meant a couple of indirect memory reads to retrieve the function being called, and two indirect branches—one for the call, and one for the return. On modern hardware, “indirect” is a synonym for “slow”, since indirection tends to defeat caching and branch prediction.&lt;/p&gt;
&lt;p&gt;Third, to propagate execution state between nodes, the interpreter had to pass around a bunch of data. For example, when processing a subtree involving a local variable, the interpreter would copy the variable’s value between all the nodes in the subtree. So, starting at the “&lt;code&gt;x&lt;/code&gt;” part of the expression “&lt;code&gt;f((x) + 1)&lt;/code&gt;”, a variable node “&lt;code&gt;x&lt;/code&gt;” would return x to a parentheses node “&lt;code&gt;(x)&lt;/code&gt;”, which would return x to a plus node “&lt;code&gt;(x) + 1&lt;/code&gt;”. Then, the plus node would return (x) + 1 to an argument list node “&lt;code&gt;((x) + 1)&lt;/code&gt;”, which would copy that value into an argument list object, which, in turn, it would pass to the function node for f. Sheesh!&lt;/p&gt;
&lt;p&gt;In our first rounds of optimization, we squeezed out as much performance as we could without changing this underlying architecture. Doing so allowed us to regression test each optimization we wrote. It also set a very high bar for any replacement technology. Finally, having realized the full potential of the syntax tree architecture, we switched to bytecode.&lt;/p&gt;
&lt;p&gt;SquirrelFish’s bytecode engine elegantly eliminates almost all of the overhead of a tree-walking interpreter. First, a bytecode stream exactly describes the operations needed to execute a program. Compiling to bytecode implicitly strips away irrelevant grammatical structure. Second, a bytecode dispatch is a single direct memory read, followed by a single indirect branch. Therefore, executing a bytecode instruction is much faster than visiting a syntax tree node. Third, with the syntax tree gone, the interpreter no longer needs to propagate execution state between syntax tree nodes.&lt;/p&gt;
&lt;p&gt;The bytecode’s register representation and calling convention work together to produce other speedups, as well. For example, jumping to the first instruction in a JavaScript function, which used to require two C++ function calls, one of them virtual, now requires just a single bytecode dispatch. At the same time, the bytecode compiler, which knows how to strip away many forms of intermediate copying, can often arrange to pass arguments to a JavaScript function without any copying.&lt;/p&gt;
&lt;h3&gt;Just the Beginning&lt;/h3&gt;
&lt;p&gt;In a typical compiler, conversion to bytecode is just a means to an end, not an end in itself. The purpose of the conversion is to “lower” an abstract tree of grammatical constructs to a concrete vector of execution primitives, the latter form being more amenable to well-known optimization techniques.&lt;/p&gt;
&lt;p&gt;Therefore, though we’re very happy with SquirrelFish’s current performance, we also believe that it’s just the beginning. Some of the compile-time optimizations we’re looking at, now that we have a bytecode representation, include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;constant folding
&lt;/li&gt;
&lt;li&gt;more aggressive copy propagation
&lt;/li&gt;
&lt;li&gt;type inference—both exact and speculative
&lt;/li&gt;
&lt;li&gt;specialization based on expression context—especially void and boolean context
&lt;/li&gt;
&lt;li&gt;peephole optimization
&lt;/li&gt;
&lt;li&gt;escape analysis
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is an interesting problem space. Since many scripts on the web are executed once and then thrown away, we need to invent versions of these optimizations that are simple and efficient. Moreover, since JavaScript is such a dynamic language, we also need to invent versions of these optimizations that are resilient in the context of an unknown environment.&lt;/p&gt;
&lt;p&gt;We’re also looking at further optimizing the virtual machine, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;constant pool instructions
&lt;/li&gt;
&lt;li&gt;superinstructions
&lt;/li&gt;
&lt;li&gt;instructions with implicit register operands
&lt;/li&gt;
&lt;li&gt;advanced dispatch techniques, like instruction duplication and context threading
&lt;/li&gt;
&lt;li&gt;getting computed goto working on Windows
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Performance on Windows has extra room to grow because the interpreter on Windows is not direct-threaded yet. In place of computed goto, it uses a switch statement inside a loop.&lt;/p&gt;
&lt;h3&gt;Getting Involved&lt;/h3&gt;
&lt;p&gt;If you’re interested in compilers or virtual machines, this is a great project to join. We’re moving quickly, so the best way to come up to speed is to log on to our &lt;a href=&quot;irc://irc.freenode.net/#webkit&quot;&gt;IRC channel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As always, testing out &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;nightly builds&lt;/a&gt; and &lt;a href=&quot;http://webkit.org/quality/reporting.html&quot;&gt;reporting bugs&lt;/a&gt; is also a great help.&lt;/p&gt;
&lt;h3&gt;Extra Bonus Updates&lt;/h3&gt;
&lt;p&gt;We&amp;#8217;ve got some extra bonus info: very early draft &lt;a href=&quot;http://webkit.org/specs/squirrelfish-bytecode.html&quot;&gt;documentation of the SquirrelFish VM&amp;#8217;s opcodes&lt;/a&gt;. For those of you who know about VMs, you may find this enlightening, for those who don&amp;#8217;t, you may find it is simpler than you expect.&lt;/p&gt;
&lt;p&gt;In addition, we have a detailed &lt;a href=&quot;http://paste.lisp.org/display/61622&quot;&gt;comparison of Safari 3.1 vs. SquirrelFish&lt;/a&gt;, looking at the individual tests, it is interesting to see which sped up the most. If you look at this &lt;a href=&quot;http://paste.lisp.org/display/61624&quot;&gt;comparison to Safari 3.0&lt;/a&gt;, you can see that we&amp;#8217;ve sped up 4.34x overall since Safari 3, and have improved some kinds of code by over an order of magnitude.&lt;/p&gt;
&lt;p&gt;SquirrelFish around the web: There&amp;#8217;s lots of interesting discussion in the &lt;a href=&quot;http://reddit.com/r/programming/info/6ltfo/comments/&quot;&gt;reddit article about this post&lt;/a&gt;. And posts from key SquirrelFish developer &lt;a href=&quot;http://summerofjsc.blogspot.com/2008/06/squirrelfish-has-landed.html&quot;&gt;Cameron Zwarich has performance data and other info&lt;/a&gt;, as does occasional WebKit contributor &lt;a href=&quot;http://www.satine.org/archives/2008/06/03/squirrelfish-is-faster-than-tamarin/&quot;&gt;Charles Ying&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">SquirrelFish has landed!</title>
		<link href="http://summerofjsc.blogspot.com/2008/06/squirrelfish-has-landed.html"/>
		<id>tag:blogger.com,1999:blog-3250715558587888159.post-1151538207506691206</id>
		<updated>2008-06-02T23:35:21+00:00</updated>
		<content type="html">&lt;div&gt;Hey, everybody. I’m a &lt;a href=&quot;http://code.google.com/soc/2008/&quot;&gt;Google Summer of Code&lt;/a&gt; student this year, working on performance improvements for JavaScriptCore, WebKit’s JavaScript interpreter. The official WebKit blog just &lt;a href=&quot;http://webkit.org/blog/189/announcing-squirrelfish/&quot;&gt;announced SquirrelFish&lt;/a&gt;, our incremental rewrite of JavaScriptCore. In just about two months, we went from an AST-based interpreter to an optimized bytecode interpreter, achieving a substantial performance improvement in the process. Ever since it landed, people have been asking for comparisons between bleeding edge versions of the leading browsers, so here are some &lt;a href=&quot;http://webkit.org/perf/sunspider-0.9/sunspider.html&quot;&gt;SunSpider&lt;/a&gt; numbers:&lt;/div&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;WebKit r34318:&lt;/td&gt;&lt;td&gt;2248.0 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Firefox 3.0 RC1:&lt;/td&gt;&lt;td&gt;3288.0 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Opera Snapshot 4844:&lt;/td&gt;&lt;td&gt;6012.2 ms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;This means that WebKit is 1.46 times faster than Firefox, and 2.67 times faster than Opera. The machine I used for testing is a 2.16 GHz Core 2 Duo MacBook Pro running Mac OS X 10.5.3.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The development process was a real blast. I got a chance to work with some great programmers while improving software that is widely used. There isn’t much more that one can ask for in the world of open source, or software development in general. We really worked well as a team, helping one other with writing patches, code review, running performance tests, and just giving general encouragement. I was finishing my master's thesis at the same time, so there wasn’t a dull moment in my life.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Much of this work was done before the accepted students for Summer of Code were announced, and the SquirrelFish branch merged a few days before the program officially started, so I think I’ve been doing a pretty good job on my project so far. Since the merge, we have been brainstorming further performance improvements, and we are getting to work on implementing them. I'll try to post about some of the things we do on this blog from time to time.&lt;/div&gt;</content>
		<author>
			<name>Cameron Zwarich</name>
			<email>noreply@blogger.com</email>
			<uri>http://summerofjsc.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Summer of JavaScriptCore</title>
			<link rel="self" href="http://summerofjsc.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3250715558587888159</id>
			<updated>2008-06-05T22:00:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Bringing Web Inspector to Linux</title>
		<link href="http://labs.trolltech.com/blogs/2008/06/02/bringing-web-inspector-to-linux/"/>
		<id>http://labs.trolltech.com/blogs/2008/06/02/bringing-web-inspector-to-linux/</id>
		<updated>2008-06-02T08:09:24+00:00</updated>
		<content type="html">&lt;p&gt;For web developers, when it comes to debugging the web applications, tools like &lt;a href=&quot;http://www.getfirebug.com/&quot;&gt;Firebug for Firefox&lt;/a&gt;, &lt;a href=&quot;http://webkit.org/blog/108/yet-another-one-more-thing-a-new-web-inspector/&quot;&gt;Safari Web Inspector&lt;/a&gt; and the recently introduced &lt;a href=&quot;http://www.opera.com/products/dragonfly/&quot;&gt;Opera Dragonfly&lt;/a&gt; can be handy and very useful. These kinds of tools offers the possibility to trace the DOM, verify the corresponding (computed) CSS, check network usage and resource loading performance, debug JavaScript, etc.&lt;/p&gt;
&lt;p&gt;As for the Web Inspector (which is technically a WebKit feature), it is written in HTML/CSS/JavaScript except for the rather small platform-specific InspectorClient code. As Holger has &lt;a href=&quot;http://zecke.blogspot.com/2007/12/inspecting-web.html&quot;&gt;mentioned before&lt;/a&gt;, with QtWebKit it is very easy to bring WebInspector into any QtWebKit-based browser, such as the &lt;a href=&quot;http://labs.trolltech.com/blogs/2008/03/05/webkit-demobrowser/&quot;&gt;Demo Browser&lt;/a&gt; (shipped with Qt 4.4) or its successor &lt;a href=&quot;http://arora-browser.org&quot;&gt;Arora&lt;/a&gt;. Since these browsers are available on several platforms, it also means now you can use Web Inspector on Linux (*). Using either the Demo Browser or Arora, just open the menu &lt;em&gt;Tools, Enable Web Inspector&lt;/em&gt; and you are ready. After loading any web site, right click on the web page to find the menu item &lt;em&gt;Inspect&lt;/em&gt; that will launch the Web Inspector.&lt;/p&gt;
&lt;p&gt;The screenshot below gives the unsurprising proof of Web Inspector on Linux (click to enlarge):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/ariyahidayat/2495418856/sizes/o/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3256/2495418856_a16703b3b9.jpg&quot; title=&quot;Web Inspector on Linux&quot; alt=&quot;Web Inspector on Linux&quot; border=&quot;0&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the example, I was trying to find out the potential slow-down in SpeedCrunch website. It was easy to spot that the Slideshow JavaScript (slideshow.js) takes around 200 ms. If this particular JavaScript code can be deferred, the web page would have been 200 ms faster.&lt;/p&gt;
&lt;p&gt;What about other WebKit-based application? If your application is using QtWebKit, it is almost trivial to enable the Web Inspector. You can use the action available from &lt;a href=&quot;http://doc.trolltech.com/4.4/qwebview.html#pageAction&quot;&gt;QWebView::pageAction&lt;/a&gt; or trigger it directly using &lt;a href=&quot;http://doc.trolltech.com/4.4/qwebview.html#triggerPageAction&quot;&gt;QWebView::triggerPageAction&lt;/a&gt;, in both cases passing  &lt;a href=&quot;http://doc.trolltech.com/4.4/qwebpage.html#WebAction-enum&quot;&gt;QWebPage::InspectElement&lt;/a&gt; as the action. Easy enough, isn&amp;#8217;t it?&lt;/p&gt;
&lt;p&gt;Happy inspecting!&lt;/p&gt;
&lt;p&gt;(*) Before, it is only possible if you run &lt;a href=&quot;http://wine-review.blogspot.com/2008/03/safari-on-linux-with-wine.html&quot;&gt;Safari under Wine&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>ariya</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Trolltech Labs Blogs</title>
			<subtitle type="html">the ramblings of engineers</subtitle>
			<link rel="self" href="http://labs.trolltech.com/blogs/feed/atom/?cat=9"/>
			<id>http://labs.trolltech.com/blogs/feed/atom/?cat=9</id>
			<updated>2008-06-30T17:18:15+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Safari Hits 6.25% Market Share</title>
		<link href="http://webkit.org/blog/188/safari-hits-622-market-share/"/>
		<id>http://webkit.org/blog/?p=188</id>
		<updated>2008-06-01T05:04:52+00:00</updated>
		<content type="html">&lt;p&gt;The latest &lt;a href=&quot;http://marketshare.hitslink.com/report.aspx?qprid=0&quot;&gt;browser market share data&lt;/a&gt; is in, and Safari has hit 6.25%, breaking 6% for the first time. Last month&amp;#8217;s share was 5.81%, so this is a significant increase. It was only nine months ago that &lt;a href=&quot;http://webkit.org/blog/123/safari-achieves-5-market-share/&quot;&gt;Safari broke 5%&lt;/a&gt;. Safari market share has now almost tripled from &lt;a href=&quot;http://marketshare.hitslink.com/report.aspx?qprid=0&amp;qpmr=15&amp;qpdt=1&amp;qpct=3&amp;qpcal=1&amp;qptimeframe=Y&amp;qpsp=2005&quot;&gt;2.14% in June 2005&lt;/a&gt;, when the WebKit Open Source project launched.&lt;/p&gt;
&lt;p&gt;This growth, combined with recent WebKit adoption in projects such as the &lt;a href=&quot;http://www.torchmobile.com/&quot;&gt;Iris Browser&lt;/a&gt;, &lt;a href=&quot;http://trolltech.com/webkit/webkit-announce&quot;&gt;Qt 4.4&lt;/a&gt;, &lt;a href=&quot;http://ajaxian.com/archives/another-webkit-win-with-android&quot;&gt;Android&lt;/a&gt;, &lt;a href=&quot;http://www.adobe.com/products/air/tools/&quot;&gt;Adobe AIR&lt;/a&gt;, &lt;a href=&quot;http://live.gnome.org/Epiphany/WebKit&quot;&gt;Epiphany&lt;/a&gt;, &lt;a href=&quot;http://aseigo.blogspot.com/2008/02/loading-random-widgets.html&quot;&gt;KDE Plasma&lt;/a&gt;, &lt;a href=&quot;http://www.zathras.de/angelweb/blog-icab-goes-webkit.htm&quot;&gt;iCab&lt;/a&gt; and more, is breathtaking and shows huge positive momentum for the WebKit project. Thanks and congratulations to everyone who has contributed to the project.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Third Annual WebKit Open Source Party</title>
		<link href="http://webkit.org/blog/187/third-annual-webkit-open-source-party/"/>
		<id>http://webkit.org/blog/?p=187</id>
		<updated>2008-05-28T19:08:10+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s that time of year again! Web developers, WebKit hackers, browser developers, or anyone with an interest in cool technology should come have a drink and some snacks, and meet WebKit contributors from Apple and around the world. This event is open to anyone who is interested, free of charge.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t miss out on the nerd party of the century!!!!&lt;/p&gt;
&lt;h4&gt;Details&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Place:&lt;/strong&gt; Thirsty Bear Restaurant &amp;#038; Brewery &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;hl=en&amp;q=thirsty+bear+brewing+co,+san+francisco,+ca&amp;ie=UTF8&amp;ll=37.788692,-122.412071&amp;spn=0.036289,0.058966&amp;z=14&amp;iwloc=A&amp;om=1&quot;&gt;(map)&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date:&lt;/strong&gt; Tuesday, June 10th&lt;br /&gt;
&lt;strong&gt;Time:&lt;/strong&gt; 7:30 PM&lt;br /&gt;
&lt;a href=&quot;http://upcoming.yahoo.com/event/735290/?ps=5&quot;&gt;upcoming.org&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Bit Rot</title>
		<link href="http://lwat.blogspot.com/2008/05/bit-rot.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-3512226750919659377</id>
		<updated>2008-05-28T14:43:45+00:00</updated>
		<content type="html">After a nearly two-month self-imposed death march in &quot;the real world&quot;, I've gotten back to my WebKit hacking.  As expected, several aspects of the build process were broken, but it was exciting to see the massive progress on almost all fronts.&lt;br /&gt;&lt;br /&gt;First, daddy-o Hyatt managed to get CSS gradients working nicely, and I'm pleased to report that this came through in the Cairo build flawlessly:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bp3.blogger.com/_hInRJC0BnDo/SD24fhdmVlI/AAAAAAAAAEY/IBJAKRZKb6E/s1600-h/generated_gradients.png&quot;&gt;&lt;img src=&quot;http://bp3.blogger.com/_hInRJC0BnDo/SD24fhdmVlI/AAAAAAAAAEY/IBJAKRZKb6E/s320/generated_gradients.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5205519596008134226&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second, Dave implemented shadows for fonts, which also works properly:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bp2.blogger.com/_hInRJC0BnDo/SD25PRdmVmI/AAAAAAAAAEg/Om16uCNbw_I/s1600-h/shadow.png&quot;&gt;&lt;img src=&quot;http://bp2.blogger.com/_hInRJC0BnDo/SD25PRdmVmI/AAAAAAAAAEg/Om16uCNbw_I/s320/shadow.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5205520416346887778&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, image reflection is working:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bp3.blogger.com/_hInRJC0BnDo/SD29whdmVnI/AAAAAAAAAEo/NPbS6VS05Jc/s1600-h/reflect.png&quot;&gt;&lt;img src=&quot;http://bp3.blogger.com/_hInRJC0BnDo/SD29whdmVnI/AAAAAAAAAEo/NPbS6VS05Jc/s320/reflect.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5205525385624049266&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's really amazing how much functionality is present in a modern web engine, and that so much of it works without having to do much under the Cairo-backed Windows build.&lt;br /&gt;&lt;br /&gt;To recreate this build on your own (and I hope you do so we can verify everything is getting properly committed to the archive) you will have to add a few pending patches to the WebKit SVN source tree.:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;As before, you will need to add &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17730&quot;&gt;17730&lt;/a&gt; to get cURL support, as well as some odds-and-ends in &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=17484&quot;&gt;17484&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You may still want to extend &lt;strong&gt;build-webkit&lt;/strong&gt; with the &lt;strong&gt;--cairo&lt;/strong&gt; flag, as coded in &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17952&quot;&gt;17952&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</content>
		<author>
			<name>Brent</name>
			<email>noreply@blogger.com</email>
			<uri>http://lwat.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Lambda, Where Art Thou?</title>
			<link rel="self" href="http://lwat.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2008-06-09T19:30:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Top Secret, Hush Hush!</title>
		<link href="http://labs.trolltech.com/blogs/2008/05/13/top-secret-hush-hush/"/>
		<id>http://labs.trolltech.com/blogs/2008/05/13/top-secret-hush-hush/</id>
		<updated>2008-05-13T13:31:02+00:00</updated>
		<content type="html">&lt;p&gt;So, after Simon &lt;a href=&quot;http://labs.trolltech.com/blogs/2008/05/09/qtwebkit-development-update-5/&quot;&gt;snitched on me&lt;/a&gt; and leaked highly sensitive information about my top-secret project, I guess it&amp;#8217;s finally time to spill the beans.&lt;/p&gt;
&lt;p&gt;Yes, it is true. For the past few months I have been semi-secretly working on &lt;del&gt;taking over the world&lt;/del&gt; implementing support for the &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/&quot;&gt;HTML5&lt;/a&gt; &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/#video&quot;&gt;&lt;code&gt;video&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/#audio&quot;&gt;&lt;code&gt;audio&lt;/code&gt;&lt;/a&gt; elements in the Qt port of WebKit, using Phonon as the media backend. This adds QtWebKit to the list of &lt;a href=&quot;http://www.bluishcoder.co.nz/2007/08/firefox-video-element-patch-version-4.html&quot;&gt;cool&lt;/a&gt; &lt;a href=&quot;http://dev.opera.com/articles/view/a-call-for-video-on-the-web-opera-vid/&quot;&gt;browsers&lt;/a&gt; &lt;a href=&quot;http://webkit.org/blog/140/html5-media-support/&quot;&gt;that&lt;/a&gt; &lt;a href=&quot;http://arstechnica.com/journals/linux.ars/2007/12/16/html5-video-support-in-gtkwebkit&quot;&gt;support&lt;/a&gt; this feature.&lt;/p&gt;
&lt;p&gt;The introduction of a special purpose media element in the HTML5 draft allows embedding of audio and video content into web pages without resorting to using the generic &lt;code&gt;object&lt;/code&gt; tag with some random plugin-based player. It&amp;#8217;s as easy as this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;video src=&quot;foobar.ogg&quot;&amp;gt;Fallback content here.&amp;lt;/video&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The media element also comes with a scripting API, making it easy to roll your own player interface if you want to (or use the default one provided by the user agent by adding the &lt;code&gt;controls&lt;/code&gt; attribute).&lt;/p&gt;
&lt;p&gt;Employing Phonon to implement the playback started out as my &amp;#8220;hey-welcome-to-Trolltech-here-is-a-fun-task-for-you&amp;#8221;-project, but turned out to also be a good test-case for the implementation of the various Phonon backends we are doing here at Trolltech.  The project was momentarily put on ice while we were busy stabilizing the 4.4 release, but now that 4.4 is out the door it&amp;#8217;s time to get back in the saddle. &lt;/p&gt;
&lt;p&gt;Some of the tasks currently in the pipeline are Win and Mac support (which is still largely untested), full screen support using overlays (for speed), routing the data through an &lt;a href=&quot;http://doc.trolltech.com/4.4/qiodevice.html&quot;&gt;IODevice&lt;/a&gt; rather than just passing a URL (which will help buffering and let us ensure that per-site credentials will work), plus implementing more of the default UI controls.&lt;/p&gt;
&lt;p&gt;Initial support is already in WebKit trunk for those of you who want to try it out, and the finished result will be in Qt 4.5. Here&amp;#8217;s a screenshot, for you pixel peepers out there:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chaos.troll.no/~tavestbo/webkit/mediaelement/screenshot.png&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Tor Arne Vestbø</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Trolltech Labs Blogs</title>
			<subtitle type="html">the ramblings of engineers</subtitle>
			<link rel="self" href="http://labs.trolltech.com/blogs/feed/atom/?cat=9"/>
			<id>http://labs.trolltech.com/blogs/feed/atom/?cat=9</id>
			<updated>2008-06-30T17:18:15+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">QtWebKit Development Update</title>
		<link href="http://labs.trolltech.com/blogs/2008/05/09/qtwebkit-development-update-5/"/>
		<id>http://labs.trolltech.com/blogs/2008/05/09/qtwebkit-development-update-5/</id>
		<updated>2008-05-09T13:44:01+00:00</updated>
		<content type="html">&lt;p&gt;As part of Qt 4.4 we have now made our very first release! &lt;img src=&quot;http://labs.trolltech.com/blogs/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:-D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Shortly before the release we finished merging all our changes back to the Subversion trunk branch, where we are working directly now. We will continue to maintain and bugfix the code in the Qt 4.4.x release series, but we try to make the changes in trunk first and then backport changes as they fit.&lt;/p&gt;
&lt;p&gt;Our current goal is to catch up with the architectural changes that happened in trunk and maintain the layout tests. Holger for example fixed the HTML Canvas after some internal API changes. Ariya started working on Netscape plugins for Windows and Tor Arne I heard is polishing a secret feature he&amp;#8217;s been semi-secretly working on for a while now in not-so-secret trunk. I heard rumors that he&amp;#8217;s going to secretly blog about the secret feature soon, so stay tuned.&lt;/p&gt;
&lt;p&gt;Big props also to Marc and the guys at Collabora for landing the initial support for Netscape plugins for the X11 Qt and Gtk ports in WebKit trunk! Great job!&lt;/p&gt;
&lt;p&gt;On the application side Urs Wolfer&amp;#8217;s Google Summer of Code project for &lt;a href=&quot;http://code.google.com/soc/2008/kde/appinfo.html?csaid=D25DB53529044836&quot;&gt;integrating QtWebKit into KDE&lt;/a&gt; has been accepted. Congrats Urs! Feel free to stop by in #webkit and bug us if you have questions &lt;img src=&quot;http://labs.trolltech.com/blogs/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Simon</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Trolltech Labs Blogs</title>
			<subtitle type="html">the ramblings of engineers</subtitle>
			<link rel="self" href="http://labs.trolltech.com/blogs/feed/atom/?cat=9"/>
			<id>http://labs.trolltech.com/blogs/feed/atom/?cat=9</id>
			<updated>2008-06-30T17:18:15+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Reporting WebKit Security Bugs</title>
		<link href="http://webkit.org/blog/184/reporting-webkit-security-bugs/"/>
		<id>http://webkit.org/blog/?p=184</id>
		<updated>2008-05-08T02:22:23+00:00</updated>
		<content type="html">&lt;p&gt;Security is a top priority for the WebKit project.  As contributors to the project have grown, it has become apparent that we need a process for safely reporting security vulnerabilities to the WebKit project in addition to the process for &lt;a href=&quot;http://www.apple.com/support/security/&quot;&gt;reporting vulnerabilities&lt;/a&gt; to Apple.  Today, we are announcing a new mailing list for this purpose, &lt;a href=&quot;mailto:security@webkit.org&quot;&gt;security@webkit.org&lt;/a&gt;.  In addition, you can now safely report vulnerabilities over https to our bug tracker, &lt;a href=&quot;https://bugs.webkit.org&quot;&gt;https://bugs.webkit.org&lt;/a&gt;, by placing the bug in the Security component.  The people privy to the mailing list and the Security component are members of the Security group.  It currently includes vendors shipping products that include WebKit, active port owners and trusted security experts.  If you are shipping a product that includes WebKit and would like to be notified of security issues, please email &lt;a href=&quot;mailto:security@webkit.org&quot;&gt;security@webkit.org&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CSS Reflections</title>
		<link href="http://webkit.org/blog/182/css-reflections/"/>
		<id>http://webkit.org/blog/?p=182</id>
		<updated>2008-04-29T21:07:33+00:00</updated>
		<content type="html">&lt;p&gt;WebKit now supports reflections in CSS.  Continuing the trend of using adorable baby photos to make features appear more impressive, let me introduce Kate again. &lt;img src=&quot;http://webkit.org/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/kate-reflected.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A &lt;i&gt;reflection&lt;/i&gt; is a replica of the original object with its own specific transform and mask.  The &lt;i&gt;box-reflect&lt;/i&gt; property can be used to specify the specialized transform and mask that should be used for the replica.&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;-webkit-box-reflect: &amp;lt;direction&amp;gt; &amp;lt;offset&amp;gt; &amp;lt;mask-box-image&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;direction&amp;gt;&lt;/tt&gt; can be one of &lt;tt&gt;above&lt;/tt&gt;, &lt;tt&gt;below&lt;/tt&gt;, &lt;tt&gt;left&lt;/tt&gt; or &lt;tt&gt;right&lt;/tt&gt;.&lt;br /&gt;
&lt;tt&gt;&amp;lt;offset&amp;gt;&lt;/tt&gt; is a length or percentage that specifies the distance of the reflection from the edge of the original border box (using the direction specified). It can be omitted, in which case it defaults to 0.&lt;br /&gt;
&lt;tt&gt;&amp;lt;mask-box-image&amp;gt;&lt;/tt&gt; is a mask-box-image that can be used to overlay the reflection.  If omitted, the reflection has no mask.&lt;/p&gt;
&lt;p&gt;Reflections will update automatically as the source changes.  If you hover over links, you&amp;#8217;ll see the hover effect happen in the reflection.  If you reflect the &lt;tt&gt;&amp;lt;video&amp;gt;&lt;/tt&gt; element, you will see the video playing in the reflection.&lt;/p&gt;
&lt;p&gt;Giving an element a reflection has the effect of creating a stacking context (so it joins opacity, masks and transforms).  The reflection is non-interactive, so from the point of view of hit testing, it&amp;#8217;s like it isn&amp;#8217;t there.  The reflection will have no effect on layout (other than being part of a container&amp;#8217;s overflow), and can be thought of as similar to &lt;tt&gt;box-shadow&lt;/tt&gt; in this respect.&lt;/p&gt;
&lt;p&gt;The example above uses a gradient mask.  Here is the sample code:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;img src=&amp;#8221;bubbles.jpg&amp;#8221; style=&amp;#8221;border:5px solid white;-webkit-box-reflect:below 5px -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0.5, transparent), to(white));&amp;#8221;&amp;gt;&lt;/tt&gt;&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Arora &amp;#038; QtWebKit Trunk</title>
		<link href="http://labs.trolltech.com/blogs/2008/04/28/arora-qtwebkit-trunk/"/>
		<id>http://labs.trolltech.com/blogs/2008/04/28/arora-qtwebkit-trunk/</id>
		<updated>2008-04-28T11:15:45+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;Arora&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The demo browser in Qt 4.4 has obtained a lot of attention and interest.  Now that 4.4 is almost out I have forked it and started a new project called &lt;a href=&quot;http://code.google.com/p/arora/&quot;&gt;Arora&lt;/a&gt; where development can continue, features can be added, and anyone who wants can contribute.  The source code is in a Git repository and is currently hosted on &lt;a href=&quot;http://github.com/icefox/arora/tree/master&quot;&gt;github&lt;/a&gt;.  Along with some improvements and features there are autotest and manual tests.  Git (and GitHub) makes it pretty easy for new developers to a project to fork off a branch to develop features that can be later merged back into the project.  Feel free to grab the source and add the feature that you miss the most or take one of the fun items off the TODO list.  To any artists out there we need an icon to match the new name.  Given that this is a fork of the demo future news on Arora will be on the project&amp;#8217;s home page or on the &lt;a href=&quot;http://arorabrowser.blogspot.com/&quot;&gt;Arora blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QtWebKit &amp;#038; WebKit trunk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In an effort to stabilize QtWebKit before the 4.4 release QtWebKit was forked from WebKit about six months ago. This is why the acid3 test score in Qt4.4 didn&amp;#8217;t match the latest Safari. Now that 4.4 is almost out the door work has begun on integrating the changes into WebKit trunk for 4.5.  Not everything is in yet, but already a lot works and it is very exciting.  I&amp;#8217;ll let this screen shot speak for itself:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2008/04/acid3.png&quot; alt=&quot;acid3.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The remaining failing tests mostly relate to SVG Fonts.  If you are interested in helping out feel free to join #webkit or #qtwebkit on freenode.  Instructions on how to build Arora with QtWebKit trunk can be found in the &lt;a href=&quot;http://code.google.com/p/arora/wiki/source&quot;&gt;Arora source wiki page.&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Benjamin Meyer</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Trolltech Labs Blogs</title>
			<subtitle type="html">the ramblings of engineers</subtitle>
			<link rel="self" href="http://labs.trolltech.com/blogs/feed/atom/?cat=9"/>
			<id>http://labs.trolltech.com/blogs/feed/atom/?cat=9</id>
			<updated>2008-06-30T17:18:15+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CSS Masks</title>
		<link href="http://webkit.org/blog/181/css-masks/"/>
		<id>http://webkit.org/blog/?p=181</id>
		<updated>2008-04-24T19:53:46+00:00</updated>
		<content type="html">&lt;p&gt;WebKit now supports alpha masks in CSS.  Masks allow you to overlay the content of a box with a pattern that can be used to knock out portions of that box in the final display.  In other words, you can clip to complex shapes based off the alpha of an image.&lt;/p&gt;
&lt;p&gt;Here is a snapshot of the Speed Racer movie trailer clipped to the Safari compass icon.  This is in fact a mask applied to the &lt;tt&gt;&amp;lt;video&amp;gt;&lt;/tt&gt; element.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/maskspeedracer.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We have introduced new properties to provide Web designers with a lot of control over these masks and how they are applied.  The new properties are analogous to the background and border-image properties that already exist.&lt;/p&gt;
&lt;p&gt;-webkit-mask (background)&lt;br /&gt;
-webkit-mask-attachment (background-attachment)&lt;br /&gt;
-webkit-mask-clip (background-clip)&lt;br /&gt;
-webkit-mask-origin (background-origin)&lt;br /&gt;
-webkit-mask-image (background-image)&lt;br /&gt;
-webkit-mask-repeat (background-repeat)&lt;br /&gt;
-webkit-mask-composite (background-composite)&lt;br /&gt;
-webkit-mask-box-image (border-image)&lt;/p&gt;
&lt;p&gt;Use of a mask results in a stacking context being created (similar to how opacity and transforms work).  The mask will therefore overlay the child and all of its descendants, and at a minimum will knock out everything outside the border box of the object.&lt;/p&gt;
&lt;p&gt;From a Web designer&amp;#8217;s perspective, think of the mask as being constructed the way the backgrounds and border-image of a box are constructed.  Multiple backgrounds are stacking on top of one another (possibly overlapping) with their own tiling and clipping rules.  A border-image can then potentially be stretched or tiled over the backgrounds.&lt;/p&gt;
&lt;p&gt;The final resultant image built from putting all of the mask images together, tiling them, stretching them, etc., then becomes the mask used to clip the content.  Alpha values of 0 in the mask mean that nothing should be drawn.  Alpha values of 1 mean the content should display normally.  Anything in between ends up partially transparent.&lt;/p&gt;
&lt;p&gt;One key difference between &lt;tt&gt;mask-box-image&lt;/tt&gt; and its border-image counterpart is that it doesn&amp;#8217;t attempt to fit itself to border widths.  It will just render the corners unscaled and tile/stretch itself into the border box without regard for the border itself.  This lets you easily use nine-piece-image effects as masks on elements without borders (often image or video elements).&lt;/p&gt;
&lt;p&gt;Here are two sample images.  The source image that we want to mask and then the image that we will use as the mask.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/kate.png&quot; /&gt; &lt;img src=&quot;http://webkit.org/blog-files/vignette-mask.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We can place a mask on the image element simply by doing this:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;img src=&amp;#8221;kate.png&amp;#8221; style=&amp;#8221;-webkit-mask-box-image: url(mask.png) 75 stretch;&amp;#8221;&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;The result looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/kate-vignette-mask.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;CSS gradients can be used as the mask image source as well.  In the following example a linear gradient is used to achieve a fade effect.  For example:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;img src=&amp;#8221;kate.png&amp;#8221; style=&amp;#8221;-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1), to(rgba(0,0,0,0))&amp;#8221;&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/kate-gradient.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Masks respect the border-radius curves of an object.  We can add a border-radius to the previous example, and have both the gradient fade effect with rounded corners.&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;img src=&amp;#8221;kate.png&amp;#8221; style=&amp;#8221;-webkit-border-radius: 10px; -webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1), to(rgba(0,0,0,0))&amp;#8221;&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/kate-gradient-rounded.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;SVG images can be used as masks.  For example, a partially transparent circle:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/circle.svg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;can be applied as a mask like so:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&amp;lt;img src=&amp;#8221;kate.png&amp;#8221; style=&amp;#8221;-webkit-mask-image: url(circle.svg)&amp;#8221;&amp;gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;The end result is shown below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/kate-circle.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All of the power of the multiple background and border-image syntax is at your disposal when building masks!&lt;/p&gt;
&lt;p&gt;As usual leave feedback in the comments and file bugs on any problems you notice at &lt;a href=&quot;http://bugs.webkit.org/&quot;&gt;http://bugs.webkit.org/&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit GSoC Students Announced</title>
		<link href="http://webkit.org/blog/178/webkit-gsoc-students-announced/"/>
		<id>http://webkit.org/blog/?p=178</id>
		<updated>2008-04-21T20:10:59+00:00</updated>
		<content type="html">&lt;p&gt;Google has released the &lt;a href=&quot;http://code.google.com/soc/2008/webkit/about.html&quot;&gt;list of students&lt;/a&gt; they will be sponsoring to work on WebKit as part of the &lt;a href=&quot;http://code.google.com/soc/2008/&quot;&gt;Google Summer of Code&lt;/a&gt; this year.  Congratulations to all of the students.  We look forward to working with you closely this summer!&lt;/p&gt;
&lt;p&gt;Thank you again to all the great students who applied!  Unfortunately we had over twice as many applications as we had funding slots from Google.  You&amp;#8217;re certainly all welcome to come hack with us in &lt;a href=&quot;irc://freenode.net#webkit&quot;&gt;#webkit&lt;/a&gt; any time.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://google-opensource.blogspot.com/2008/04/announcing-accepted-student-proposals.html&quot;&gt;Google&amp;#8217;s official announcement&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Acid3 final touches</title>
		<link href="http://www.atoker.com/blog/2008/04/21/acid3-final-touches/"/>
		<id>http://www.atoker.com/blog/?p=109</id>
		<updated>2008-04-21T02:38:37+00:00</updated>
		<content type="html">&lt;p&gt;Recently we&amp;#8217;ve been working to finish off and land the &lt;a href=&quot;http://www.atoker.com/blog/2008/03/27/webkit-gets-100-on-acid3/&quot;&gt;last couple of fixes&lt;/a&gt; to get a perfect pixel-for-pixel match against the reference &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3&lt;/a&gt; rendering in &lt;a href=&quot;http://live.gnome.org/WebKitGtk&quot;&gt;WebKit/GTK+&lt;/a&gt;. I believe we&amp;#8217;re the first project to achieve this on Linux &amp;#8212; congratulations to everyone on the team!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/04/acid3-shadow.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-110&quot; title=&quot;acid3-shadow&quot; src=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/04/acid3-shadow-300x266.png&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;266&quot; /&gt;&lt;br /&gt;
Epiphany using WebKit r32284&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We also recently announced &lt;a href=&quot;http://mail.gnome.org/archives/desktop-devel-list/2008-April/msg00134.html&quot;&gt;our plans&lt;/a&gt; to align more closely with the &lt;a href=&quot;http://www.gnome.org/&quot;&gt;GNOME desktop&lt;/a&gt; and &lt;a href=&quot;http://www.gnome.org/mobile/&quot;&gt;mobile platform&lt;/a&gt;. To this end we&amp;#8217;re making a few technology and organisational changes that I hope to discuss in an upcoming post.&lt;/p&gt;</content>
		<author>
			<name>Alp Toker</name>
			<uri>http://www.atoker.com/blog</uri>
		</author>
		<source>
			<title type="html">Alp Toker » WebKit</title>
			<subtitle type="html">There is a third way</subtitle>
			<link rel="self" href="http://www.atoker.com/blog/category/webkit/feed/"/>
			<id>http://www.atoker.com/blog/category/webkit/feed/</id>
			<updated>2008-06-12T10:00:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CSS Canvas Drawing</title>
		<link href="http://webkit.org/blog/176/css-canvas-drawing/"/>
		<id>http://webkit.org/blog/?p=176</id>
		<updated>2008-04-17T19:33:40+00:00</updated>
		<content type="html">&lt;p&gt;Currently the set of images you can use from CSS consists of the following:&lt;/p&gt;
&lt;p&gt;Bitmap Images (PNG, GIF, JPG)&lt;br /&gt;
SVG Images&lt;br /&gt;
Gradients&lt;/p&gt;
&lt;p&gt;A notable missing ability when compared with explicit DOM content is programmatic drawing into CSS images.  The &lt;tt&gt;&amp;lt;canvas&amp;gt;&lt;/tt&gt; element represents a foreground bitmap image that can be drawn into programmatically, but - aside from inefficient hacks involving &lt;tt&gt;toDataURL&lt;/tt&gt; - there hasn&amp;#8217;t been any way to draw into the image buffers used by CSS images.&lt;/p&gt;
&lt;p&gt;Until now!&lt;/p&gt;
&lt;p&gt;In the latest nightlies, you can try out a new feature: the ability to specify named image buffers in CSS and then to draw into them programmatically from JavaScript.  Here&amp;#8217;s how it works.&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;background: -webkit-canvas(mycanvas);&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Instead of specifying an image URL, you specify a canvas and an identifier to use for that canvas.  The following new API on documents can then be used to obtain a drawing context for that canvas.&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;CanvasRenderingContext getCSSCanvasContext(in DOMString contextType, in DOMString identifier, in long width, in long height);&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;There is only one CSS canvas for a given global identifier per document.  When you obtain the drawing context you also specify the size.  The canvas will not be cleared as long as you repeatedly request the same size.  Specifying a new size is equivalent to the kind of behavior you&amp;#8217;d expect if you resized a &amp;lt;canvas&amp;gt; element, and so the canvas buffer will be cleared.&lt;/p&gt;
&lt;p&gt;All objects that observe a CSS canvas of the same name are sharing that canvas.  This means that (similar to how animated GIFs work), you can do animations and have them happen in lockstep on all the clients of the canvas.  Drawing changes will be propagated to all clients automatically.&lt;/p&gt;
&lt;p&gt;Here is an example:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests/fast/canvas/canvas-bg.html?format=raw&quot;&gt;Canvas as Background Image&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Introducing CSS Gradients</title>
		<link href="http://webkit.org/blog/175/introducing-css-gradients/"/>
		<id>http://webkit.org/blog/?p=175</id>
		<updated>2008-04-14T20:39:49+00:00</updated>
		<content type="html">&lt;p&gt;WebKit now supports gradients specified in CSS.  There are two types of gradients: linear gradients and radial gradients.&lt;/p&gt;
&lt;p&gt;The syntax is as follows:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;-webkit-gradient(&amp;lt;type&amp;gt;, &amp;lt;point&amp;gt; [, &amp;lt;radius&amp;gt;]?, &amp;lt;point&amp;gt; [, &amp;lt;radius&amp;gt;]? [, &amp;lt;stop&amp;gt;]*)&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;The type of a gradient is either &lt;tt&gt;linear&lt;/tt&gt; or &lt;tt&gt;radial&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;A point is a pair of space-separated values.  The syntax supports numbers, percentages or the keywords top, bottom, left and right for point values.&lt;/p&gt;
&lt;p&gt;A radius is a number and may only be specified when the gradient type is radial.&lt;/p&gt;
&lt;p&gt;A stop is a function, &lt;tt&gt;color-stop&lt;/tt&gt;, that takes two arguments, the stop value (either a percentage or a number between 0 and 1.0), and a color (any valid CSS color).  In addition the shorthand functions &lt;tt&gt;from&lt;/tt&gt; and &lt;tt&gt;to&lt;/tt&gt; are supported.  These functions only require a color argument and are equivalent to &lt;tt&gt;color-stop(0, &amp;#8230;)&lt;/tt&gt; and color-stop(1.0, &amp;#8230;) respectively.&lt;/p&gt;
&lt;p&gt;Paraphrasing the HTML5 spec and adjusting the language slightly to not be canvas-specific:&lt;/p&gt;
&lt;p&gt;&amp;#8220;The color of the gradient at each stop is the color specified for that stop. Between each such stop, the colors and the alpha component must be linearly interpolated over the RGBA space without premultiplying the alpha value to find the color to use at that offset. Before the first stop, the color must be the color of the first stop. After the last stop, the color must be the color of the last stop. When there are no stops, the gradient is transparent black.&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;If multiple stops are added at the same offset on a gradient, they must be placed in the order added, with the first one closest to the start of the gradient, and each subsequent one infinitesimally further along towards the end point (in effect causing all but the first and last stop added at each point to be ignored).&amp;#8221;&lt;/p&gt;
&lt;p&gt;The points of a linear gradient specify a line.  Linear gradients must be rendered such that at and before the starting point the color at offset 0 is used, that at and after the ending point the color at offset 1 is used, and that all points on a line perpendicular to the line that crosses the start and end points have the color at the point where those two lines cross (with the colors coming from the interpolation described above).&lt;/p&gt;
&lt;p&gt;If x0 = x1 and y0 = y1, then the linear gradient must paint nothing.&lt;/p&gt;
&lt;p&gt;For a radial gradient, the first two arguments represent a start circle with origin (x0, y0) and radius r0, and the next two arguments represent an end circle with origin (x1, y1) and radius r1. &lt;/p&gt;
&lt;p&gt;Radial gradients must be rendered by following these steps:&lt;/p&gt;
&lt;p&gt;If x0 = x1 and y0 = y1 and r0 = r1, then the radial gradient must paint nothing. Abort these steps.&lt;/p&gt;
&lt;p&gt;Let x(ω) = (x1-x0)ω + x0&lt;/p&gt;
&lt;p&gt;Let y(ω) = (y1-y0)ω + y0&lt;/p&gt;
&lt;p&gt;Let r(ω) = (r1-r0)ω + r0&lt;/p&gt;
&lt;p&gt;Let the color at ω be the color of the gradient at offset 0.0 for all values of ω less than 0.0, the color at offset 1.0 for all values of ω greater than 1.0, and the color at the given offset for values of ω in the range 0.0 ≤ ω ≤ 1.0&lt;/p&gt;
&lt;p&gt;For all values of ω where r(ω) &gt; 0, starting with the value of ω nearest to positive infinity and ending with the value of ω nearest to negative infinity, draw the circumference of the circle with radius r(ω) at position (x(ω), y(ω)), with the color at ω, but only painting on the parts of the surface that have not yet been painted on by earlier circles in this step for this rendering of the gradient.&lt;/p&gt;
&lt;p&gt;This effectively creates a cone, touched by the two circles defined in the creation of the gradient, with the part of the cone before the start circle (0.0) using the color of the first offset, the part of the cone after the end circle (1.0) using the color of the last offset, and areas outside the cone untouched by the gradient (transparent black).&amp;#8221;&lt;/p&gt;
&lt;p&gt;So what exactly is a gradient in CSS?  It is an image, usable anywhere that image URLs were used before.  That&amp;#8217;s right&amp;#8230; &lt;i&gt;anywhere.&lt;/i&gt;  &lt;img src=&quot;http://webkit.org/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;You can use gradients in the following places:&lt;/p&gt;
&lt;p&gt;background-image&lt;br /&gt;
border-image&lt;br /&gt;
list-style-image&lt;br /&gt;
content property&lt;/p&gt;
&lt;h4&gt;Gradients as Backgrounds&lt;/h4&gt;
&lt;p&gt;When specifying a gradient as a background, the gradient becomes a background tile.  If no size is specified, then the gradient will size to the box specified by the background-origin CSS3 property.  This value defaults to padding, so you the gradient will be as large as the padding-box. This is equivalent to a specified background-size of 100% in both directions.&lt;/p&gt;
&lt;p&gt;If you want to achieve effects like tiling of a vertical gradient using a narrow strip, you should specify background-size to give the gradient tile an explicit size.&lt;/p&gt;
&lt;p&gt;Gradients used as backgrounds will respect full page zoom, acquiring sharper resolution as the page is zoomed in.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests//fast/gradients/simple-gradients.html?format=raw&quot;&gt;Background Gradients Example&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Border Image Gradients&lt;/h4&gt;
&lt;p&gt;Gradients can be used as border images.  The most sensible use for them is specifying only horizontal or only vertical borders (and splitting the gradients up between the top and bottom or left and right borders).&lt;/p&gt;
&lt;p&gt;The size of the gradient image is always the size of the border box.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests//fast/gradients/border-image-gradient.html?format=raw&quot;&gt;Border Image Gradient Example&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;List Bullet Gradients&lt;/h4&gt;
&lt;p&gt;Gradients can be specified as list bullets.  One problem with list bullet gradients is that there is currently no way in WebKit to specify the size of the marker box.  Therefore the size of the image cannot be specified.  WebKit has therefore chosen a default size based off the current font size of the list item.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests//fast/gradients/list-item-gradient.html?format=raw&quot;&gt;List Item Gradients Example&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Generated Content Gradients&lt;/h4&gt;
&lt;p&gt;Gradients can be used inside the content property.  The image will fill the available width and height of its containing block.  Therefore when using gradients inside ::before and ::after content with a specified size, it is important to set the display type to block or inline-block.&lt;/p&gt;
&lt;p&gt;Gradients can also be used to do image replacement, so can be used with the img element in HTML or to replace the contents of other elements like spans and divs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://trac.webkit.org/projects/webkit/browser/trunk/LayoutTests//fast/gradients/generated-gradients.html?format=raw&quot;&gt;Generated Content Gradients Example&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Final Notes&lt;/h4&gt;
&lt;p&gt;WebKit now supports a generic architecture for generated images, making it easy to add new generator effects to CSS in the future (lenticular halos, checkerboards, starbursts, etc.).  The rules for sizing of these generated images will match whatever is decided for SVG content with no intrinsic size (the two are sharing the same rules right now).&lt;/p&gt;
&lt;p&gt;We encourage you to try gradients out and file bugs if you see any unexpected or weird behavior.  They will degrade safely in other browsers as long as you use multiple declarations (e.g., specify the image in one declaration and the gradient in a following declaration).&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Summer of Code projects for browser hackers</title>
		<link href="http://www.atoker.com/blog/2008/04/06/summer-of-code-projects-for-browser-hackers/"/>
		<id>http://www.atoker.com/blog/2008/04/06/summer-of-code-projects-for-browser-hackers/</id>
		<updated>2008-04-06T20:40:39+00:00</updated>
		<content type="html">&lt;p&gt;With the revised deadline for &lt;a href=&quot;http://code.google.com/soc/2008/&quot;&gt;Google Summer of Code &amp;#8216;08&lt;/a&gt; student applications looming, we&amp;#8217;ve been getting a lot of interest in browser-related student projects. I&amp;#8217;ve put together a list of some of my favourite ideas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://live.gnome.org/SummerOfCode2008/Ideas&quot;&gt;GNOME ideas&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Epiphany
&lt;ul&gt;
&lt;li&gt;Desktop integration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://live.gnome.org/SummerOfCode2008/Ideas/CompleteBookmarkHistoryIntegration&quot;&gt;Bookmark and history integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JavaScript debugger based on Drosera / Web Inspector&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Evolution
&lt;ul&gt;
&lt;li&gt;Bug tracking aid&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://live.gnome.org/Empathy/SoC2008&quot;&gt;Empathy&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;WebKit Adium theme support&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Desktop widgets&lt;/li&gt;
&lt;li&gt;Integrated web app launcher&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://trac.webkit.org/projects/webkit/wiki/Google%20Summer%20of%20Code%202008&quot;&gt;WebKit ideas&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Cairo SVG backend completion&lt;/li&gt;
&lt;li&gt;GTK+ port test suite completion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mono-project.com/StudentProjects&quot;&gt;Mono ideas&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;WebKit-based HTML editor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If in doubt, &lt;em&gt;now&amp;#8217;s the time&lt;/em&gt; to submit proposals. Already-listed ideas are the most likely to get mentored but students are free to propose their own ideas as well. Proposals for incremental improvements will tend to be favoured over ideas for completely new applications, but a proof of concept and/or roadmap can help when submitting plans for larger projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; There&amp;#8217;s no need to keep asking about the status of an application on IRC/private mail etc. It&amp;#8217;s a busy time for the upstream developers but they&amp;#8217;ll get back in touch as soon as possible.&lt;/p&gt;</content>
		<author>
			<name>Alp Toker</name>
			<uri>http://www.atoker.com/blog</uri>
		</author>
		<source>
			<title type="html">Alp Toker » WebKit</title>
			<subtitle type="html">There is a third way</subtitle>
			<link rel="self" href="http://www.atoker.com/blog/category/webkit/feed/"/>
			<id>http://www.atoker.com/blog/category/webkit/feed/</id>
			<updated>2008-06-12T10:00:19+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">cURL, Grokking those URL's</title>
		<link href="http://lwat.blogspot.com/2008/03/curl-grokking-those-urls.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-3873258017386862825</id>
		<updated>2008-04-03T18:42:15+00:00</updated>
		<content type="html">&lt;a href=&quot;http://bp2.blogger.com/_hInRJC0BnDo/R-QiUD5Ue5I/AAAAAAAAAEQ/QRERXkDCtEc/s1600-h/curl.png&quot;&gt;&lt;img src=&quot;http://bp2.blogger.com/_hInRJC0BnDo/R-QiUD5Ue5I/AAAAAAAAAEQ/QRERXkDCtEc/s320/curl.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5180303199421365138&quot; /&gt;&lt;/a&gt;With help from Daniel Zucker at Wake3.com, the wxWindows and GTK+ teams, and the folks on #webkit we've finally got a building version of WebKit that does not rely on CFNetwork.  Instead, it uses the same &lt;a href=&quot;http://curl.haxx.se&quot;&gt;cURL&lt;/a&gt; backend as wxWindows and GTK+ to handle network interaction, URL parsing, and so forth.&lt;br /&gt;&lt;br /&gt;Currently this work is pending review at &lt;a href=&quot;http://webkit.org&quot;&gt;WebKit.org&lt;/a&gt;, under &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17730&quot;&gt;17730&lt;/a&gt; and &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17985&quot;&gt;&lt;strike&gt;17985&lt;/strike&gt;&lt;/a&gt;.  I've also extended the &lt;strong&gt;build-webkit&lt;/strong&gt; interface to support a new &lt;strong&gt;--cairo&lt;/strong&gt; flag that generates a &lt;a href=&quot;http://www.cairographics.org&quot;&gt;Cairo&lt;/a&gt;/&lt;a href=&quot;http://curl.haxx.se&quot;&gt;cURL&lt;/a&gt; build.  You can find this (also pending) under &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17952&quot;&gt;17952&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note that you will probably need to apply some final WebKit patches to get a clean build.  See &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17484&quot;&gt;17484&lt;/a&gt; for this handful of changes.</content>
		<author>
			<name>Brent</name>
			<email>noreply@blogger.com</email>
			<uri>http://lwat.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Lambda, Where Art Thou?</title>
			<link rel="self" href="http://lwat.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2008-06-09T19:30:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Scenes from an Acid Test</title>
		<link href="http://webkit.org/blog/174/scenes-from-an-acid-test/"/>
		<id>http://webkit.org/blog/174/scenes-from-an-acid-test/</id>
		<updated>2008-03-28T07:44:09+00:00</updated>
		<content type="html">&lt;p&gt;In our earlier &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3&lt;/a&gt; post, I mentioned that the final test we passed, test 79, was super tough. This test covered many details of SVG text layout and font support. To pass it, we had to fix many bugs. Unless you are a hardocore standards geek you may not find all these details exciting, but since we talked a bit about our other recent fixes, I thought I&amp;#8217;d tell the story. This subtest was originally contributed by &lt;a href=&quot;http://mcc.id.au/&quot;&gt;Cameron McCormack&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Bug 1: DOM Support for the altGlyph element&lt;/h4&gt;
&lt;p&gt;I started on test 79 as a weekend hacking lark. While I have hacked a little on the SVG code, it wasn&amp;#8217;t my top area of expertise, and I hadn&amp;#8217;t looked at the text layout code at all, so I figured it would be an interesting learning experience. Little did I know that we&amp;#8217;d end up racing to fix it.&lt;/p&gt;
&lt;p&gt;The first failure we saw on test 79 was that getNumberOfCharacters on an SVG &lt;code&gt;&amp;lt;text&gt;&lt;/code&gt; element gave an answer that was off by one. The test hinted that this could be due to improper handling of UTF-16 (something covered in the &lt;a href=&quot;http://www.w3.org/2003/01/REC-SVG11-20030114-errata&quot;&gt;SVG 1.1 Errata&lt;/a&gt;). However, on further study, I realized that our UTF-16 handling was right, but the &lt;code&gt;&amp;lt;text&gt;&lt;/code&gt; element contained an &lt;code&gt;&amp;lt;altGlyph&gt;&lt;/code&gt; element which we did not recognize, and therefore, according to SVG rules, did not render. For those who are new to text layout, a &amp;#8220;glyph&amp;#8221; refers to a particular symbol that will be drawn on the screen - most often every character has its own glyph, but it can get more complicated than that.&lt;/p&gt;
&lt;p&gt;So, as a first step, in &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31240&quot;&gt;r31240&lt;/a&gt; I made &lt;code&gt;&amp;lt;altGlyph&gt;&lt;/code&gt; fully recognized by the engine and allowed it to render initially as a &lt;code&gt;&amp;lt;tspan&gt;&lt;/code&gt; element. That&amp;#8217;s sort of SVG&amp;#8217;s equivalent of an HTML &lt;code&gt;&amp;lt;span&gt;&lt;/code&gt;, it just renders its text contents.&lt;/p&gt;
&lt;p&gt;After landing the fix, I saw that the code testing character positions got a bad position for character 2.&lt;/p&gt;
&lt;h4&gt;Interlude: Modified Test Case&lt;/h4&gt;
&lt;p&gt;At this point, I realized that we&amp;#8217;d probably get a lot of bad positions, and it would help to see all the problems at one go, instead of one at a time. Acid3 only reports the first failure on any given test. So I saved off a local copy, hacked it to report every failure on test 79, and changed it to test the spaces between characters instead of the character positions. Any error in measuring one character would propagate to all subsequent characters, so it was more useful to look at the differences in positions (&amp;#8221;advances&amp;#8221; in typography lingo). This immediately made it obvious that by far the most common failure was failure to support multi-character glyphs in SVG Fonts correctly. &lt;/p&gt;
&lt;h4&gt;Bug 2: Multi-character Glyphs&lt;/h4&gt;
&lt;p&gt;SVG has a feature to allow specification of glyphs that match more than one character. You can use this to do things like create &lt;a href=&quot;http://en.wikipedia.org/wiki/Ligature_(typography)&quot;&gt;ligatures&lt;/a&gt;. For example, it is common for proportional fonts to include a special glyph for the combination &amp;#8220;fi&amp;#8221;, since those letters can look nicer if drawn together in a special way.&lt;/p&gt;
&lt;p&gt;We had the basics of code to support this. However, the problem was that our code only measured one character at a time. There was no way for the font code to decide to pick a glyph for more than one character because it only saw one at a time, and there was no way for it to report back how many characters a glyph matched. So even though the drawing code sort of got this right, the metrics were based on one-character glyphs. In &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31310&quot;&gt;r31310&lt;/a&gt; I fixed this.&lt;/p&gt;
&lt;h4&gt;Interlude: Studying the Test Case&lt;/h4&gt;
&lt;p&gt;After this fix, I studied the test case to classify the remaining failures. I realized there was probably more than one bug, and if I documented them other people could help, or just continue the bug for me if I did not have time.&lt;/p&gt;
&lt;p&gt;I found four separate remaining bugs: incorrect priority of SVG glyph matching (it picked the longest match instead of the first), failure to consider the &lt;code&gt;xml:lang&lt;/code&gt; attribute in glyph matching, failure to support explicit kerning pairs, and failure to render the actual alternate glyph selected by altGlyph.&lt;/p&gt;
&lt;h4&gt;Bugs 3 &amp;#038; 4: Glyph Selection&lt;/h4&gt;
&lt;p&gt;After studying the SVG spec for text, I realized that the data structure we were using for glyph selection was not right. SVG fonts require you to pick the first glyph that matches, in the order in which they are specified, with a number of different rules in addition to text (you have to consider language and the multiple forms of Arabic characters for instance). We just had a hashtable of glyphs, and looked for a candidate by checking possible character runs from longest to shortest. That matched in the wrong priority, and did not properly handle lang at all.&lt;/p&gt;
&lt;p&gt;I decided to change the GlyphMap to an n-ary &lt;a href=&quot;http://en.wikipedia.org/wiki/Trie&quot;&gt;trie&lt;/a&gt; (or &amp;#8220;prefix tree&amp;#8221;), with a vector of possible glyphs at each node, and a hashtable for child nodes. I also stored a &amp;#8220;priority&amp;#8221; value based on the position of the glyph in the tree. To do lookup, I would walk the trie one character at a time based on available characters, collecting all the glyphs found at each level. Next, the glyphs are sorted by priority. Finally, this vector of candidate glyphs is scanned to find the first that matches the additional constraints such as Arabic form. &lt;/p&gt;
&lt;h4&gt;Opera Brings its &amp;#8220;A&amp;#8221; Game&lt;/h4&gt;
&lt;p&gt;Making a fancy new data structure was a fair bit more complicated than my last two fixes, so I was hacking on this for a couple of days. On Wednesday morning, I heard that Opera was going to announce an Acid3 score of 98/100. The WebKit developers who had been noodling on Acid3 realized that we had fixes in progress for most of the remaining issues, and could likely pass the test by the end of the day, and get it out there.&lt;/p&gt;
&lt;p&gt;At this point, I would like to commend the Opera developers for their achievement. At the time they posted the 100/100 screenshot, we had no idea there was a &lt;a href=&quot;http://ln.hixie.ch/?start=1206578003&amp;count=1&quot;&gt;bug in test 79&lt;/a&gt;, and hoped at best to be the first to release a 100/100 public build, and both our teams could get some credit and positive exposure. It was not until we were fixing the very last bug in our code that we spotted the bug in the test, as you&amp;#8217;ll see below.&lt;/p&gt;
&lt;p&gt;Anyway, once we realized it was game on and Opera was much further ahead than we expected, we decided to complete our fixes. Eric fixed handling of charset encoding errors in XML, Antti got two SMIL test fixes in, and I cleaned this patch up, made a regression test, and landed it in &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31324&quot;&gt;r31324&lt;/a&gt; and &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31325&quot;&gt;r31325&lt;/a&gt;. (We have a policy that every fix has to come with an automated regression test, no matter how much we&amp;#8217;d like to rush - this is so we can move faster in the long run, by having a comprehensive regression test suite that will catch mistakes. Even with all that I had a bit of a commit oops but the team caught it right away, thus the two revisions.)&lt;/p&gt;
&lt;h4&gt;Bug 5: altGlyph Rendering&lt;/h4&gt;
&lt;p&gt;At this point, I had a problem. Niko, who had originally written the SVG font and text code, was busy with school, and I&amp;#8217;d just learned all about the SVG text system by fixing these bugs, so I was the top expert and sort of on the hook. But there were two bugs left on these test, and neither was trivial to fix. I decided to split the remaining work with rendering master Dave Hyatt. I asked him to take on the altGlyph fix while I took care of kerning.&lt;/p&gt;
&lt;p&gt;It turned out there were actually two different problems here. The altGlyph lookup was by ID, but somehow the glyph element wasn&amp;#8217;t getting into the id map. With help from Darin and others on the team, Hyatt managed to figure out that we were handling the &amp;#8220;id&amp;#8221; attribute improperly for the SVG &lt;code&gt;&amp;lt;glyph&gt;&lt;/code&gt; element.&lt;/p&gt;
&lt;p&gt;The second problem was actually choosing the alternate glyph and using it for metrics and rendering. This turned out to be simpler than it might seem, as it could be handled almost entirely in the SVG font machinery.&lt;/p&gt;
&lt;p&gt;You can see the gory details of Hyatt&amp;#8217;s fix in &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31338&quot;&gt;r31338&lt;/a&gt;. I helped him out with the test case for this, and for a while he thought his code was broken because I sent him a test that showed red boxes when it passes. Kids, never do this in your browser tests. Green for pass, red for fail.&lt;/p&gt;
&lt;h4&gt;Bug 6: Kerning&lt;/h4&gt;
&lt;p&gt;The final bug was support for kerning. It was pretty easy to add support to the SVG DOM for the &lt;code&gt;&amp;lt;hkern&gt;&lt;/code&gt; element, and to build up a vector of kerning pairs. What was tricky was storing enough info to decide when a kerning pair applied, and the match algorithm to help determine applicability. Kerning pairs can be specified in two ways in the SVG spec, by Unicode value or glyph name.&lt;/p&gt;
&lt;p&gt;Darin was looking over my shoulder as I was reading the spec, because I hoped for his help on part of this, the matching algorithm. It was at this point we realized the test had a bug. It had an &lt;code&gt;&amp;lt;hkern&gt;&lt;/code&gt; element with a &lt;code&gt;u1&lt;/code&gt; attribute of &amp;#8220;EE&amp;#8221;, and expected that kerning to apply. But that&amp;#8217;s neither a comma-separated sequence of characters nor a Unicode range, which is the syntax the &lt;a href=&quot;http://www.w3.org/TR/SVG/fonts.html#KernElements&quot;&gt;SVG 1.1 spec for &lt;code&gt;&amp;lt;hkern&gt;&lt;/code&gt; elements&lt;/a&gt; requires. This meant that you couldn&amp;#8217;t possibly pass this test without violating the SVG spec. I let Acid3 editor &lt;a href=&quot;http://ln.hixie.ch/&quot;&gt;Ian Hickson&lt;/a&gt; know right away, and confirmed the error with Cameron, the original author of test 79. While they mulled over how to fix the test (Ian has been very responsive to fixing the few errors that crept into this very complex test), Darin and I continued to work on the final bug.&lt;/p&gt;
&lt;p&gt;At last, we managed to pass around the glyph info and apply the matching correctly. We decided to handle the full complexity of the SVG spec for this, even though we could have cut corners just to pass the test, since it didn&amp;#8217;t test every possible form of kerning pair. In the meantime, Ian had fixed the bug in the test and blogged about it. At last I saw the 100/100 on my screen for the first time. Everyone egged me on to commit but I insisted on getting the patch reviewed and creating a regression test, cause on WebKit that is how we roll. Finally with &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31342&quot;&gt;r31342&lt;/a&gt; we had a score of 100/100, available to the public. And the rest is history.&lt;/p&gt;
&lt;h4&gt;By Way of Contrast&lt;/h4&gt;
&lt;p&gt;As you can see, this test was pretty rigorous, and we did a lot of hard work to make it pass. We fixed a lot of bugs, ranging from basic to obscure and easy to advanced. We didn&amp;#8217;t have code just lying around that got us most of the way there.&lt;/p&gt;
&lt;p&gt;Not all of the tests on Acid3 were equally stringent. Tests 75 and 76 are SVG Animation tests, contributed by &lt;a href=&quot;http://my.opera.com/MacDev_ed/blog/&quot;&gt;Erik Dahlstr&amp;ouml;m&lt;/a&gt;. We had the beginnings of an implementation of this feature, but it was fairly incomplete and we had it disabled with ifdefs, and had chosen not to ship it in past releases. We believe in incremental development of new features, so we were prepared to turn it on and fix the bugs needed to pass the tests. We thought this would take a lot of extra work. To our surprise, it turned out that the first few of the changes we made on top of the old code were enough to pass the two SVG animation tests. &lt;/p&gt;
&lt;p&gt;Antti checked these fixes in, but we don&amp;#8217;t think our pre-existing incomplete implementation is truly satisfactory, and it probably wouldn&amp;#8217;t be a good idea to ship it as-is in a major public release. We&amp;#8217;re not yet satisfied with this code, but it&amp;#8217;s a good step forward for our open development trunk.&lt;/p&gt;
&lt;h4&gt;Thanks&lt;/h4&gt;
&lt;p&gt;In the end, the main thing that surprised me about Acid3 was how fun it was. Back when &lt;a href=&quot;http://acid2.acidtests.org/&quot;&gt;Acid2&lt;/a&gt; was all the rage, Hyatt did pretty much all the fixes himself, so the rest of us didn&amp;#8217;t have a chance to get into the spirit as much. But Acid3, and the slightly silly competitive atmosphere around it makes Web standards fun.&lt;/p&gt;
&lt;p&gt;Web standards can often seem boring compared to super fast performace, whizzy new features, and even the basic Web compatibility work of making sites work properly. Interoperability is critical to the Web as an open platform, but it can be difficult to explain to regular users why it&amp;#8217;s so important. The Acid tests make web standards fun, for browser developers, for Web designers, and for regular users. Whatever the intrinsic value of the tests may be, I think we should all thank Ian Hickson and all the test contributors.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d also like to thank Opera for giving us some serious competition and making this a real horse race. We have huge respect for their developers and all the work they do on Web standards.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit gets 100% on Acid3</title>
		<link href="http://www.atoker.com/blog/2008/03/27/webkit-gets-100-on-acid3/"/>
		<id>http://www.atoker.com/blog/2008/03/27/webkit-gets-100-on-acid3/</id>
		<updated>2008-03-27T21:06:56+00:00</updated>
		<content type="html">&lt;p&gt;Today we reached a milestone with &lt;a href=&quot;http://live.gnome.org/WebKitGtk&quot;&gt;WebKit/GTK+&lt;/a&gt; as it became the first browser engine on Linux/X11 to get a full score on &lt;a href=&quot;http://www.webstandards.org/action/acid3/&quot;&gt;Acid3&lt;/a&gt;, shortly after the &lt;a href=&quot;http://webkit.org/blog/173/webkit-achieves-acid3-100100-in-public-build/&quot;&gt;Acid3 pass by WebKit for Safari/Mac&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;WebKit Acid3&quot; href=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/03/webkitacid3shad.png&quot;&gt;&lt;img src=&quot;http://www.atoker.com/blog/wp-content/uploads/2008/03/webkitacid3shadsmall.png&quot; border=&quot;0&quot; alt=&quot;Acid3&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Epiphany using WebKit r31371&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There is actually still a little work to be done before we can claim a flawless Acid3 pass. Two of the most visible remaining issues in the GTK+ port are &lt;tt&gt;:visited&lt;/tt&gt; (causing the &amp;#8220;LINKTEST FAILED&amp;#8221; notice in the screenshot) and the lack of CSS text shadow support in the Cairo/text backend which is needed to match the reference rendering.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s amazing to see how far we&amp;#8217;ve come in the last few months, and great to see the WebKit GTK+ team now playing an active role in the direction of WebCore as WebKit continues to build momentum amongst developers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; We now also &lt;a href=&quot;http://www.atoker.com/blog/2008/04/21/acid3-final-touches/&quot;&gt;match the reference rendering&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Alp Toker</name>
			<uri>http://www.atoker.com/blog</uri>
		</author>
		<source>
			<title type="html">Alp Toker » WebKit</title>
			<subtitle type="html">There is a third way</subtitle>
			<link rel="self" href="http://www.atoker.com/blog/category/webkit/feed/"/>
			<id>http://www.atoker.com/blog/category/webkit/feed/</id>
			<updated>2008-06-12T10:00:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit achieves Acid3 100/100 in public build</title>
		<link href="http://webkit.org/blog/173/webkit-achieves-acid3-100100-in-public-build/"/>
		<id>http://webkit.org/blog/173/webkit-achieves-acid3-100100-in-public-build/</id>
		<updated>2008-03-27T02:55:47+00:00</updated>
		<content type="html">&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt; We now believe we have a full rendering pass (but not necessarily an animation smoothness pass yet). See the bottom of the post for details.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt; The Windows nightly is now available for download.  See below for details.&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31342&quot;&gt;r31342&lt;/a&gt; WebKit has become the first publicly available rendering engine to achieve 100/100 on Acid3. The final test, test 79, was a brutal torture test of SVG text rendering. Details of the bugs we fixed will follow. Indeed, we found a critical bug in the test itself that would have forced a violation of the SVG 1.1 standard to pass, so until a few hours ago it was not possible to get a valid 100/100. Acid3 test editor Ian Hickson has &lt;a href=&quot;http://ln.hixie.ch/?start=1206578003&amp;count=1&quot;&gt;the details&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note: this does not indicate a full pass of Acid3. We have a slight glitch in the text rendering that is likely to be fixed soon (patch in progress). Also, the animation is required to be smooth. On typical machines, if you look really closely, you can see a small glitch in the animation on test 26 because 26 is designed to be a performance test. However, we think we are faster than all other browsers on test 26.  What constitutes a smooth animation is somewhat subjective.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/acid3-100.png&quot; /&gt; &lt;/p&gt;
&lt;p&gt;This is not just a screenshot, you can pull live from SVN and build to see it yourself, and a fresh nightly build is coming soon.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;Thanks to our own Dan Bernstein, as of &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31356&quot;&gt;r31356&lt;/a&gt; we believe we have a pixel-perfect match for the reference rendering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/acid3-full-rendering-pass.png&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/acid3-rendering-reference.png&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Get the fresh hot bits of the latest &lt;a href=&quot;http://nightly.webkit.org&quot;&gt;Mac and Windows nightly builds&lt;/a&gt; which include the full reference rendering pass.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Extra special bonus update&lt;/b&gt;: Alp Toker reports that &lt;a href=&quot;http://www.atoker.com/blog/2008/03/27/webkit-gets-100-on-acid3/&quot;&gt;the Gtk port now gets 100/100&lt;/a&gt;, although it does not yet match the reference rendering.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enabling SVG Animation: Acid3 99/100</title>
		<link href="http://webkit.org/blog/172/enabling-svg-animation-acid3-99100/"/>
		<id>http://webkit.org/blog/172/enabling-svg-animation-acid3-99100/</id>
		<updated>2008-03-27T01:07:56+00:00</updated>
		<content type="html">&lt;p&gt;In r31334 we enabled the SVG Animation support that has already been in the engine for a while but has not been enabled by default so far. We also implemented support for the beginElement() and endElement() methods. As a result we now pass the &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3&lt;/a&gt; test 76.&lt;/p&gt;
&lt;p&gt;SVG Animation is a specification that has not been widely implemented so far. Reaching the point where various implementations are truly interoperable will take some more effort.&lt;/p&gt;
&lt;p&gt;Get the &lt;a href=&quot;http://nightly.webkit.org&quot;&gt;nightly build&lt;/a&gt; and try it out yourself! One test to go.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit hits 98/100 on Acid3</title>
		<link href="http://webkit.org/blog/170/webkit-hits-98100-on-acid3/"/>
		<id>http://webkit.org/blog/170/webkit-hits-98100-on-acid3/</id>
		<updated>2008-03-26T18:16:10+00:00</updated>
		<content type="html">&lt;p&gt;We fixed our XML processing in &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31316&quot;&gt;r31316&lt;/a&gt; to stop auto-recovering from invalid byte sequences and instead treat invalid bytes as fatal errors, as required by &lt;a href=&quot;http://www.w3.org/TR/REC-xml/#charencoding&quot;&gt;XML 1.0&lt;/a&gt;.  To quote the spec:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;It is a fatal error if an XML entity is determined (via default, encoding declaration, or higher-level protocol) to be in a certain encoding but contains byte sequences that are not legal in that encoding&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Internet Explorer also has this strictness requirement (for XML loaded via XMLHttpRequest), thus we believe this added strictness should not cause any real-world compatibility problems.  (IE&amp;#8217;s behavior can be confirmed by &lt;a href=&quot;http://www.hixie.ch/tests/adhoc/dom/web-apps/XMLHttpRequest/020.html&quot;&gt;Hixie&amp;#8217;s test&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Once again, enjoy the pretty picture:&lt;br /&gt;
&lt;a href=&quot;http://www.flickr.com/photos/macdome/2363779887/&quot; title=&quot;WebKit hits 98/100 on Acid3&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2296/2363779887_429a58bfd5_o.png&quot; width=&quot;600&quot; height=&quot;473&quot; alt=&quot;WebKit hits 98/100 on Acid3&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;or you can grab the &lt;a href=&quot;http://nightly.webkit.org&quot;&gt;latest nightly&lt;/a&gt; and try &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3&lt;/a&gt; yourself!&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">ElementTimeControl: 97/100</title>
		<link href="http://webkit.org/blog/171/elementtimecontrol-97100/"/>
		<id>http://webkit.org/blog/171/elementtimecontrol-97100/</id>
		<updated>2008-03-26T18:15:04+00:00</updated>
		<content type="html">&lt;p&gt;We added the ElementTimeControl interface that is part of the SVG Animation specification. This completes &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3&lt;/a&gt; test 75 and got us up to 97/100. Three to go!&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Acid3: NodeIterator fix leaves us with 4 points to go</title>
		<link href="http://webkit.org/blog/169/acid3-nodeiterator-fix-leaves-us-with-4-points-to-go/"/>
		<id>http://webkit.org/blog/169/acid3-nodeiterator-fix-leaves-us-with-4-points-to-go/</id>
		<updated>2008-03-26T01:49:09+00:00</updated>
		<content type="html">&lt;p&gt;WebKit was still failing on test 2 of Acid3. That&amp;#8217;s a NodeIterator test. The problem was a simple one: While NodeIterator objects were rigged to update themselves when nodes are removed from the document, there were a couple of edge cases that weren&amp;#8217;t handled quite right. I tried to fix this about a month ago, but got confused. This time I was able to keep my head straight and it took me less than an hour to fix the bug.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re passing 96/100 tests now. There are only 4 points to go to get to 100 points. There are also a few loose ends that don&amp;#8217;t cost a point and also some reports of a few failures that some see on their computers, but don&amp;#8217;t affect most computers.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re closing in on 100%!&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">GDI Text on Windows</title>
		<link href="http://webkit.org/blog/168/gdi-text-on-windows/"/>
		<id>http://webkit.org/blog/168/gdi-text-on-windows/</id>
		<updated>2008-03-25T18:47:23+00:00</updated>
		<content type="html">&lt;p&gt;The version of WebKit that ships with Safari 3.1 on Windows uses CoreGraphics antialiasing for text.   The latest WebKit in nightly builds has made good progress on a GDI text rendering mode (i.e., the text rendering matches your OS look/settings).  We encourage Windows testers to try out GDI text rendering and file bugs that you find at &lt;a href=&quot;http://bugs.webkit.org&quot;&gt;http://bugs.webkit.org/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To enable GDI text rendering, you will need to hand edit your preferences file, as there is no visible UI option in Safari 3.1 for this.  You will need to set WebKit’s &amp;#8220;WebKitFontSmoothingType&amp;#8221; preference to a value of &amp;#8220;4&amp;#8243;.  &lt;/p&gt;
&lt;p&gt;The preferences file on Windows XP is:&lt;/p&gt;
&lt;pre&gt;C:\Documents and Settings\&amp;lt;username&amp;gt;\Application Data\Apple Computer\Safari\WebKitPreferences.plist&lt;/pre&gt;
&lt;p&gt;On Vista, it is:&lt;/p&gt;
&lt;pre&gt;C:\Users\&amp;lt;username&amp;gt;\AppData\Roaming\Apple Computer\Safari\WebKitPreferences.plist&lt;/pre&gt;
&lt;p&gt;The values that are listed in Safari&amp;#8217;s UI for this preference map to the numbers 0-3.&lt;/p&gt;
&lt;p&gt;Note that while you can turn on GDI text rendering in the WebKit that ships with Safari 3.1, most advanced text features will not work.  These include stroking and filling text, most advanced text features in SVG, shadows, partially transparent text (rgba/hsla) and text inside a transparency layer (opacity).  All of these features should work now in the latest nightlies.&lt;/p&gt;
&lt;p&gt;If you have changed the setting in Safari you may have to edit that preference file.  It can be found at:&lt;/p&gt;
&lt;pre&gt;%APPDATA%\Apple Computer\Safari\Preferences\com.apple.Safari.plist&lt;/pre&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Optimizing Page Loading in the Web Browser</title>
		<link href="http://webkit.org/blog/166/optimizing-page-loading-in-web-browser/"/>
		<id>http://webkit.org/blog/166/optimizing-page-loading-in-web-browser/</id>
		<updated>2008-03-24T01:27:54+00:00</updated>
		<content type="html">&lt;p&gt;It is well understood that page loading speed in a web browser is limited by the available connection bandwidth. However, it turns out bandwidth is not the only limiting factor and in many cases it is not even the most important one.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/wsj-nopreload.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The graph above shows the time it took to fully load the &lt;a href=&quot;http://online.wsj.com/public/us&quot;&gt;Wall Street Journal front page&lt;/a&gt; (chosen for its complexity which well represents many modern web sites) with a recent WebKit. Browser caches were cleared before each page load. The Mac OS X &lt;a href=&quot;http://developer.apple.com/DOCUMENTATION/Darwin/Reference/ManPages/man4/dummynet.4.html&quot;&gt;dummynet&lt;/a&gt; facility was used to simulate various network conditions by introducing packet latency and capping the available bandwidth. Since the testing was done against a live web site the actual connection latency was a factor as well (ping time to wsj.com was ~75ms).&lt;/p&gt;
&lt;p&gt;From the figure it is clear that while available bandwidth is a significant factor, so is the connection latency. Introducing just 50ms of additional latency doubled the page loading time in the high bandwidth case (from ~3200ms to ~6300ms).&lt;/p&gt;
&lt;p&gt;Latency is a significant real world problem. Wireless networking technologies often have inherently high latencies. Packet loss and retransmits due to interference makes the situation worse. Geographical distance introduces latency. Just the roundtrip delay between US East and West Coast is somewhere around 70ms. Loaded web servers may not respond immediately.&lt;/p&gt;
&lt;p&gt;Why does latency have such a huge impact on page loading speed? After all, to load a page completely a web browser just needs to fetch the page source and all the associated resources. The browser makes multiple connections to servers and tries to load as many resources in parallel as possible. Why would it matter much if it takes slightly longer to start loading an individual resource? Other resources should be loading during that time and the available bandwidth should still get fully utilized.&lt;/p&gt;
&lt;p&gt;It turns out that figuring out &amp;#8220;all the associated resources&amp;#8221; is the hard part of the problem. The browser does not know what resources it should load until it has completely parsed the document. When the browser first receives the HTML text of the document it feeds it to the parser. The parser builds a DOM tree out of the document. When the browser sees an element  like &amp;lt;img&amp;gt; that references an external resource, it requests that resources from the network. &lt;/p&gt;
&lt;p&gt;Problems start when a document contains references to external scripts. Any script can call document.write(). Parsing can&amp;#8217;t proceed before the script is fully loaded and executed and any document.write() output has been inserted into the document text. Since parsing is not proceeding while the script is being loaded no further requests for other resources are made either. This quickly leads to a situation where the script is the only resource loading and connection parallelism does not get exploited at all. A series of script tags essentially loads serially, hugely amplifying the effect of latency. &lt;/p&gt;
&lt;p&gt;The situation is made worse by scripts that load additional resources. Since those resources are not known before the script is executed it is critical to load scripts as quickly as possible. The worst case is a script that load more scripts (by using document.write() to write &amp;lt;script&amp;gt; tags), a common pattern in Javascript frameworks and ad scripts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/wsj-preload.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The latest WebKit &lt;a href=&quot;http://nightly.webkit.org&quot;&gt;nightlies&lt;/a&gt; contain some new &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17480&quot;&gt;optimizations&lt;/a&gt; to reduce the impact of network latency. When script loading halts the main parser, we start up a side parser that goes through the rest of the HTML source to find more resources to load. We also prioritize resources so that scripts and stylesheets load before images. The overall effect is that we are now able to load more resources in parallel with scripts, including other scripts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/wsj-vs.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can see from the graphs above that these optimizations significantly reduce the impact of network latency and generally improve page loading speed. For example with 50ms of simulated latency and no bandwidth limit, the overall page loading time was 2.8s faster (6.3s to 3.5s). With bandwidth capped to 512kbit/s the improvement was 5.9s (23.8s to 17.9s). &lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit gets an A+ on Acid3</title>
		<link href="http://webkit.org/blog/167/webkit-gets-an-a-on-acid3/"/>
		<id>http://webkit.org/blog/167/webkit-gets-an-a-on-acid3/</id>
		<updated>2008-03-22T11:05:44+00:00</updated>
		<content type="html">&lt;p&gt;As of &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31231&quot;&gt;revision 31231&lt;/a&gt;, WebKit passes &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3&lt;/a&gt; subtests 23 (&lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=16833&quot;&gt;bug&lt;/a&gt;) and 25 (&lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=16693&quot;&gt;bug&lt;/a&gt;).  That brings our score up to 95/100 &amp;#8212; an A+!  We fixed our parsing of &lt;a href=&quot;http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-qualnames&quot;&gt;qualified names&lt;/a&gt; to match the &lt;a href=&quot;http://www.w3.org/TR/DOM-Level-3-Core/&quot;&gt;DOM Level 3 Core&lt;/a&gt; specification and now correctly throw &lt;code&gt;NAMESPACE_ERR&lt;/code&gt; and &lt;code&gt;INVALID_CHARACTER_ERR&lt;/code&gt; exceptions for invalid calls like:&lt;br /&gt;
&lt;code&gt;document.createElementNS(null, &quot;foo::bar&quot;)&lt;/code&gt; or&lt;br /&gt;
&lt;code&gt;document.implementation.createDocumentType(&quot;:bar&quot;, null, null)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Behold the glory:&lt;br /&gt;
&lt;a href=&quot;http://www.flickr.com/photos/macdome/2351075255/&quot; title=&quot;WebKit gets an A+&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2288/2351075255_8c5cc6cf82_o.png&quot; alt=&quot;WebKit gets an A+&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update: The latest &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;WebKit nightly build&lt;/a&gt; now includes the fixes for these two Acid 3 bugs.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Full Page Zoom</title>
		<link href="http://webkit.org/blog/165/full-page-zoom/"/>
		<id>http://webkit.org/blog/165/full-page-zoom/</id>
		<updated>2008-03-21T20:23:32+00:00</updated>
		<content type="html">&lt;p&gt;WebKit now supports full page zooming on Mac and Windows.  Because this feature involves new WebKit API, it&amp;#8217;s not something you&amp;#8217;ll see in nightly builds by default (since the Safari used with the nightlies calls the text zoom API).  I have added a debug preference, though, that will cause the text zoom methods in WebKit to do full page zoom instead.&lt;/p&gt;
&lt;p&gt;To try out full page zoom in a nightly, you can type the following in a terminal window:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;defaults write com.apple.Safari WebKitDebugFullPageZoomPreferenceKey 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We encourage people to try out full page zooming and file bugs on the feature.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">background-clip: text</title>
		<link href="http://webkit.org/blog/164/background-clip-text/"/>
		<id>http://webkit.org/blog/164/background-clip-text/</id>
		<updated>2008-03-21T00:54:39+00:00</updated>
		<content type="html">&lt;p&gt;CSS3 has introduced a property called &lt;i&gt;background-clip&lt;/i&gt; that can be used to clip backgrounds to either the border, padding or content box.  I have extended this property with a fourth value, text, that causes the background image to clip to foreground text (including decorations and shadows).  The shape of the foreground content (including alpha transparency in the content) is applied as a mask to clip background drawing for the box.&lt;/p&gt;
&lt;p&gt;Here is an example:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&amp;lt;div style=&quot;background: url(http://webkit.org/images/green-background.png), black; border:5px solid black; padding:5px; -webkit-background-clip: text, border; color: transparent&quot;&amp;gt;&lt;br /&gt;
This background clips to the text.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
And here is how it looks (if you try it out in ToT):&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This background clips to the text.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This effect can be used with &lt;i&gt;-webkit-text-stroke&lt;/i&gt; and a transparent &lt;i&gt;-webkit-text-fill-color&lt;/i&gt; to create text with stroked outlines that is &amp;#8220;filled&amp;#8221; with the background.&lt;/p&gt;
&lt;p&gt;In addition, this visual effect can work with fixed backgrounds, so that text can look like it&amp;#8217;s &amp;#8220;punching a hole&amp;#8221; through to the viewport.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Google Summer Of Code</title>
		<link href="http://webkit.org/blog/162/google-summer-of-code/"/>
		<id>http://webkit.org/blog/162/google-summer-of-code/</id>
		<updated>2008-03-18T21:14:27+00:00</updated>
		<content type="html">&lt;p&gt;Are you a university student?  Would you like to get paid to hack on WebKit?  WebKit is participating in Google&amp;#8217;s &lt;a href=&quot;http://code.google.com/soc/2008&quot;&gt;Summer of Code&lt;/a&gt;.  Google will &lt;a href=&quot;http://code.google.com/opensource/gsoc/2008/faqs.html#0.1_payments&quot;&gt;pay you&lt;/a&gt; to work on WebKit for the summer.  Coding sure beats flipping burgers.&lt;/p&gt;
&lt;p&gt;Google begins accepting applications &lt;a href=&quot;http://code.google.com/opensource/gsoc/2008/faqs.html#0.1_when_apply&quot;&gt;March 24th, 2008&lt;/a&gt;.  We&amp;#8217;ve posted some &lt;a href=&quot;http://trac.macosforge.org/projects/webkit/wiki/Google%20Summer%20of%20Code%202008&quot;&gt;example project ideas&lt;/a&gt; to start your thought processes.  Some highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finish SVG 1.1 - &lt;a href=&quot;http://www.w3.org/TR/SVG11/filters.html&quot;&gt;filters&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/SVG11/animate.html&quot;&gt;animation&lt;/a&gt;, various &lt;a href=&quot;http://bugs.webkit.org/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;field0-0-0=product&amp;type0-0-0=substring&amp;value0-0-0=svg&amp;field0-0-1=component&amp;type0-0-1=substring&amp;value0-0-1=svg&amp;field0-0-2=short_desc&amp;type0-0-2=substring&amp;value0-0-2=svg&amp;field0-0-3=status_whiteboard&amp;type0-0-3=substring&amp;value0-0-3=svg&quot;&gt;other bugs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Finish &lt;a href=&quot;http://www.w3.org/TR/CSS21/&quot;&gt;CSS 2.1&lt;/a&gt; or parts of CSS 3 (e.g. &lt;a href=&quot;http://www.w3.org/TR/css3-page/&quot;&gt;paged media&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Web technology support - &lt;a href=&quot;http://www.w3.org/TR/REC-MathML/&quot;&gt;MathML&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/ruby/&quot;&gt;Ruby&lt;/a&gt;, &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work&quot;&gt;HTML5&lt;/a&gt;, &lt;a href=&quot;http://www.mozilla.org/projects/xbl/xbl2.html&quot;&gt;XBL2&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/wai-aria/&quot;&gt;ARIA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Port WebKit to your favorite platform&lt;/li&gt;
&lt;li&gt;Improve our developer tools (&lt;a href=&quot;http://trac.webkit.org/projects/webkit/wiki/Drosera&quot;&gt;Drosera&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/projects/webkit/wiki/Web%20Inspector&quot;&gt;Web Inspector&lt;/a&gt;) or add your own (e.g. a JS profiler)&lt;/li&gt;
&lt;li&gt;Propose your own idea!  What cool things should tomorrow&amp;#8217;s web browsers do?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prospective applicants should read Google&amp;#8217;s &lt;a href=&quot;http://code.google.com/opensource/gsoc/2008/faqs.html#0.1_student_apply&quot;&gt;student application instructions&lt;/a&gt; and join &lt;a href=&quot;irc://freenode.net/#webkit&quot;&gt;#webkit&lt;/a&gt; on &lt;a href=&quot;http://freenode.net/&quot;&gt;freenode.net&lt;/a&gt; to meet the WebKit community.  We&amp;#8217;re happy to answer any questions about possible projects or mentors.  Join &lt;a href=&quot;irc://freenode.net/#gsoc&quot;&gt;#gsoc&lt;/a&gt; to ask the Google folks any administrative questions you may have.&lt;br /&gt;
We look forward to hacking with you this summer!&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit Hits 93/100 in Acid3</title>
		<link href="http://webkit.org/blog/161/webkit-hits-93100-in-acid3/"/>
		<id>http://webkit.org/blog/161/webkit-hits-93100-in-acid3/</id>
		<updated>2008-03-18T00:15:23+00:00</updated>
		<content type="html">&lt;p&gt;This one didn&amp;#8217;t actually involve any code changes. Rather, the &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid3 test&lt;/a&gt; itself was changed as a result of feedback from the browser developers. The issue was some rather obscure details of click() DOM method which are not specified anywhere but are implemented in certain way by all browsers (more details in &lt;a href=&quot;http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2008-March/014181.html&quot;&gt;this thread&lt;/a&gt;). The behavior expected by earlier versions of the Acid3 was different and would have broken some web content. The ongoing HTML5 work will allow standardizing these kinds of details.&lt;/p&gt;
&lt;p&gt;It is good to see that besides testing many exciting new standards Acid3 also takes real-world web compatibility seriously.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>http://webkit.org/blog</uri>
		</author>
		<source>
			<title type="html">Surfin' Safari</title>
			<subtitle type="html">All about WebKit development</subtitle>
			<link rel="self" href="http://webkit.org/blog/feed/"/>
			<id>http://webkit.org/blog/feed/</id>
			<updated>2008-06-23T21:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Acid3 Range Exception Test Fixed - WebKit hits 92/100</title>
		<link href="http://webkit.org/blog/160/acid3-range-exception-test-fixed-webkit-hits-92100/"/>
		<id>http://webkit.org/blog/160/acid3-range-exception-test-fixed-webkit-hits-92100/</id>
		<updated>2008-03-17T04:10:50+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;ve fixed Acid3 test 11, a test case of &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=17509&quot;&gt;exception codes from Range.surroundContents&lt;/a&gt;. The fix involved changing the exception checking code at the start of the rather complex Range::surroundContents core DOM method. &lt;a href=&quot;http://trac.webkit.org/projects/webkit/changeset/31090&quot;&gt;As you can see&lt;/a&gt;, this wasn&amp;#8217;t a very complicated change.&lt;/p&gt;
&lt;p&gt;This brings up another point about Acid3. Elsewhere on the interblag, &lt;a href=&quot;http://www.allegro.cc/forums/print-thread/594963&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;http://reddit.com/r/programming/info/6c7da/comments/c03ge06&quot;&gt;have&lt;/a&gt; &lt;a href=&quot;http://www.webmasterworld.com/html/3590710.htm&quot;&gt;argued&lt;/a&gt; that Acid3 is not an important test because a lot of what it tests are edge cases or obscure technologies. Our own Dave Hyatt &lt;a href=&quot;http://webkit.org/blog/158/the-acid-3-test/&quot;&gt;downplayed the importance of the numeric score&lt;/a&gt;. It&amp;#8217;s true that acid tests like this a