<?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>2009-11-21T22:53:12+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">WebKit nightlies support HTML5 noreferrer link relation</title>
		<link href="http://webkit.org/blog/907/webkit-nightlies-support-html5-noreferrer-link-relation/"/>
		<id>http://webkit.org/blog/?p=907</id>
		<updated>2009-11-19T17:18:16+00:00</updated>
		<content type="html">&lt;p&gt;WebKit nightlies now support the HTML5 &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#link-type-noreferrer&quot;&gt;noreferrer link relation&lt;/a&gt;, a neat little feature that allows web developers to prevent browsers from sending the Referrer: header when navigating either &amp;lt;a&amp;gt; or &amp;lt;area&amp;gt; elements.  Just add noreferrer in the rel attribute of a link like so:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;a href=&quot;www.example.com&quot; rel=&quot;noreferrer&quot;&amp;gt;noreferrer!&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When example.com receives the HTTP request generated by clicking this link, the HTTP Referer field will be empty, as if the user had navigated from about:blank.&lt;/p&gt;
&lt;p&gt;When rel=&amp;#8221;noreferrer&amp;#8221; is used in conjunction with target=&amp;#8221;_blank&amp;#8221;, WebKit will also set the window.opener attribute to null.  This usage is interpreted as a request from the web page author that any scripts on the destination page should be run in a new context, even if the destination page would normally be considered to be of the same origin.&lt;/p&gt;
&lt;p&gt;The noreferrer link relation is one of &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#linkTypes&quot;&gt;many link relations&lt;/a&gt; defined in the HTML5 spec, and the first to be implemented in WebKit.  We hope it will make life a little easier for web developers who have concerns about user privacy and security.&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Updated WebKit SDK (@r51062)</title>
		<link href="http://whtconstruct.blogspot.com/2009/11/updated-webkit-sdk-r51062.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-4420766301306234536</id>
		<updated>2009-11-18T09:11:19+00:00</updated>
		<content type="html">I have updated the &lt;a href=&quot;http://files.me.com/bfulgham/gh5osx&quot;&gt;WebKitSDK&lt;/a&gt; to correspond to SVN revision r51062.&lt;br /&gt;&lt;b&gt;Edit: I stupidly wrote &quot;-webkit-block-shadow&quot;, when I meant &quot;-webkit-box-shadow&quot;.  Thanks to Brad K. for catching this!&lt;/b&gt;&lt;br /&gt;Major changes in this revision:&lt;br /&gt;* Support for &lt;code&gt;-webkit-box-shadow&lt;/code&gt;.&lt;br /&gt;* General support for Canvas and SVG shadows in Cairo.&lt;br /&gt;* New SVG filter effects: feComposite, feDisplacementMap, feGaussianBlur, feMorphology&lt;br /&gt;* Many SVG rendering improvements, including support for SourceAlpha.&lt;br /&gt;* Support for CSS in Text Kerning and ligature.&lt;br /&gt;* Ability to specify the number of visible lines in &lt;code&gt;-webkit-line-clamp&lt;/code&gt;.&lt;br /&gt;* Implement DOM Level 3 composition events.&lt;br /&gt;* Implement CSSOM Range.getClientRects/getBoundingClientRect.&lt;br /&gt;* @import now works in user stylesheets.&lt;br /&gt;* Protect Canvas methods from NaN and Infinity.&lt;br /&gt;* Web Inspector improvements (see &lt;a href=&quot;http://webkit.org/blog/829/web-inspector-updates/&quot;&gt;this blog entry&lt;/a&gt; for details), but many cool new features!&lt;br /&gt;* Some support for &lt;code&gt;-webkit-color-correction&lt;/code&gt; (needs further testing on this platform).&lt;br /&gt;* JavaScript engine speed-ups.&lt;br /&gt;* Initial &lt;code&gt;&amp;lt;ruby&amp;gt;&lt;/code&gt; support (see &lt;a href=&quot;http://sideshowbarker.net/2009/11/13/html5-ruby/&quot;&gt;this blog entry&lt;/a&gt; for details)&lt;br /&gt;* Accessibility improvements.&lt;br /&gt;&lt;br /&gt;Clearly this is a significant amount of new logic, so there may be some regressions.  Please let me know if you encounter any problems with this new version.&lt;br /&gt;&lt;br /&gt;Unfortunately I have not been able to complete work on 3D CSS or WebGL, but stay tuned!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-4420766301306234536?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">WebKit-Box-Shadows At Last!</title>
		<link href="http://whtconstruct.blogspot.com/2009/11/webkit-box-shadows-at-last.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-5221781770716858928</id>
		<updated>2009-11-16T13:10:46+00:00</updated>
		<content type="html">&lt;a href=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/SwG_WT2J1oI/AAAAAAAAAKY/XNGuE6YlnlY/s1600/Screen+shot+2009-11-16+at+12.07.57+PM.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/SwG_WT2J1oI/AAAAAAAAAKY/XNGuE6YlnlY/s320/Screen+shot+2009-11-16+at+12.07.57+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5404811417826743938&quot; /&gt;&lt;/a&gt;&lt;br /&gt;With the landing of &lt;strike&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=26102&quot;&gt;Bug 26102&lt;/a&gt;&lt;/strike&gt;, all Cairo ports of WebKit can now enjoy full &lt;code&gt;webkit-box-shadow&lt;/code&gt; support.  Even the multi-line wrapped bordered text show shadows, and the geometric primitives in the &quot;border-radius-big.html&quot; test work.&lt;br /&gt;&lt;br /&gt;It took a long time, but the results are definitely worth it!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-5221781770716858928?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="fr">
		<title type="html">WebKit's week - #10</title>
		<link href="http://hanblog.info/blog/post/2009/11/15/WebKit-s-week-10"/>
		<id>urn:md5:01e44e5759b2282f85d8abb9621faf93</id>
		<updated>2009-11-15T22:37:00+00:00</updated>
		<content type="html">&lt;p&gt;Week from May 25 to June 7 (before r44490). To test those changes, you'll need a &lt;a href=&quot;http://nightly.webkit.org&quot; hreflang=&quot;en&quot;&gt;WebKit nightly&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/44235&quot; hreflang=&quot;en&quot;&gt;Smarter border-radius (44235)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;You all know &lt;a href=&quot;http://www.w3.org/TR/css3-background/#the-border-radius&quot; hreflang=&quot;en&quot;&gt;border-radius&lt;/a&gt;. And you enjoy using it. Before this change, if the radius was longer than some metrics (eg. half the width of the element), then it's set to zero and there are no rounded corners. Since then, WebKit follow the latest rules of the spec and will reduce the radius to the max possible value.&lt;/p&gt;


&lt;h3&gt;Multiple corrections according to specs (&lt;a href=&quot;http://trac.webkit.org/changeset/44293&quot; hreflang=&quot;en&quot;&gt;44293&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/changeset/44298&quot; hreflang=&quot;en&quot;&gt;44298&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/changeset/44301&quot; hreflang=&quot;en&quot;&gt;44301&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/changeset/44302&quot; hreflang=&quot;en&quot;&gt;44302&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/changeset/44360&quot; hreflang=&quot;en&quot;&gt;44360&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/changeset/44475&quot; hreflang=&quot;en&quot;&gt;44475&lt;/a&gt;, &lt;a href=&quot;http://trac.webkit.org/changeset/44481&quot; hreflang=&quot;en&quot;&gt;44481&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;A lot of events weren't dispatched to the &lt;code&gt;window&lt;/code&gt; object, unlike what the spec says. Zou, fixed. In addition, some &lt;code&gt;storage&lt;/code&gt; events needed a &lt;code&gt;storageArea&lt;/code&gt; event giving access to the modified storage area. Those are small but necessary fixes.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/44311&quot; hreflang=&quot;en&quot;&gt;Locking the anchor in view while loading&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Between the moment when a page starts to render and when it's fully loaded, a lot of resources can modify the layout of a page. Therefore, the position of an anchor can change. Before this change, the browser stayed at the initial position of the anchor. Now, if the user doesn't scroll, the anchor will stay in the view.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/44322&quot; hreflang=&quot;en&quot;&gt;Web Inspector's panel activation&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;The Resources, Network and Profiles panels all have an activation page. This activation page are here to not affect the performances of the pages when they are not needed.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;This is everything for this week. Of course, this is just a selection I've made. If you've noticed any other interesting changes, please let me know. Same thing if I got something wrong.&lt;/p&gt;</content>
		<author>
			<name>Anthony Ricaud</name>
			<uri>http://hanblog.info/blog/</uri>
		</author>
		<source>
			<title type="html">Hanblog - WebKit</title>
			<link rel="self" href="http://hanblog.info/blog/feed/category/WebKit/atom"/>
			<id>urn:md5:bf61b2e51f5d21992f38e5e7172f6e92</id>
			<updated>2009-11-17T01:53:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Functioning Box-Shadow</title>
		<link href="http://whtconstruct.blogspot.com/2009/11/functioning-box-shadow.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-1729924354424695353</id>
		<updated>2009-11-15T22:31:11+00:00</updated>
		<content type="html">&lt;a href=&quot;http://1.bp.blogspot.com/_hInRJC0BnDo/SwDlP7pPZiI/AAAAAAAAAJw/-LQPYhHNEsI/s1600/Screen+shot+2009-11-15+at+9.20.13+PM.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_hInRJC0BnDo/SwDlP7pPZiI/AAAAAAAAAJw/-LQPYhHNEsI/s320/Screen+shot+2009-11-15+at+9.20.13+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5404571614716061218&quot; /&gt;&lt;/a&gt;&lt;br /&gt;It's taken a couple of weeks to get everything put together and landed in the archive, but tonight I finally got &lt;code&gt;webkit-box-shadow&lt;/code&gt; functioning in the Cairo build.&lt;br /&gt;&lt;br /&gt;This original work was done by Dirk Schulze, who put together most of the shadow logic.  There were a few dark corners that had to be examined and resolved before the feature worked properly.&lt;br /&gt;&lt;br /&gt;The main problem boiled down to a very simple coding error:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;===================================================================&lt;br /&gt;--- GraphicsContextCairo.cpp    (revision 50998)&lt;br /&gt;+++ GraphicsContextCairo.cpp    (working copy)&lt;br /&gt;@@ -1113,7 +1155,7 @@&lt;br /&gt;     cairo_t* cr = m_data-&gt;cr;&lt;br /&gt;     double x1, y1, x2, y2;&lt;br /&gt;     cairo_clip_extents(cr, &amp;amp;x1, &amp;amp;y1, &amp;amp;x2, &amp;amp;y2);&lt;br /&gt;-    cairo_rectangle(cr, x1, x2, x2 - x1, y2 - y1);&lt;br /&gt;+    cairo_rectangle(cr, x1, y1, x2 - x1, y2 - y1);&lt;br /&gt;     cairo_rectangle(cr, r.x(), r.y(), r.width(), r.height());&lt;br /&gt;     cairo_fill_rule_t savedFillRule = cairo_get_fill_rule(cr);&lt;br /&gt;     cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The clipping rectangle was being computed with the right-hand x-position of the current clipping bounds, rather than the y-position per the signature.  This was causing the wrong regions of the screen to be clipped out, yielding bizarrely inverted shadow effects (see my last post for an example.)&lt;br /&gt;&lt;br /&gt;The final results look pretty good.  They generally match the reference implementation (Safari), at least as closely as WinCairo does in other respects (e.g., fonts), as shown in the following overlay:&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SwDmoTQr6HI/AAAAAAAAAJ4/X7HqitHs2Is/s1600/Screen+shot+2009-11-15+at+8.46.40+PM.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SwDmoTQr6HI/AAAAAAAAAJ4/X7HqitHs2Is/s320/Screen+shot+2009-11-15+at+8.46.40+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5404573132884011122&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once this patch lands, both the Linux and Windows builds of WebKit (Cairo) should begin enjoying most of the cool features provided by webkit-box-shadow.  There are still several missing bits of functionality:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Shadows on various geometries don't seem to work (see the &quot;border-radius-big.html&quot; test).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SwDvzUW80LI/AAAAAAAAAKQ/toEWkjKa-Q0/s1600/Screen+shot+2009-11-15+at+10.20.35+PM.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SwDvzUW80LI/AAAAAAAAAKQ/toEWkjKa-Q0/s320/Screen+shot+2009-11-15+at+10.20.35+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5404583217761931442&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Multi-line shadow effects (see the first series in &quot;basic-shadows.html&quot;.)&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SwDr0xEevwI/AAAAAAAAAKA/hVWTa58l24g/s1600/Screen+shot+2009-11-15+at+10.03.51+PM.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SwDr0xEevwI/AAAAAAAAAKA/hVWTa58l24g/s320/Screen+shot+2009-11-15+at+10.03.51+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5404578844602449666&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Strangely, this effect works properly when the shadow is inset in the image.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SwDsBnNfr_I/AAAAAAAAAKI/ONAq5OPDviY/s1600/Screen+shot+2009-11-15+at+10.03.21+PM.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SwDsBnNfr_I/AAAAAAAAAKI/ONAq5OPDviY/s320/Screen+shot+2009-11-15+at+10.03.21+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5404579065294204914&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-1729924354424695353?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit adds support for the HTML5 &amp;#60;ruby&amp;gt; element</title>
		<link href="http://sideshowbarker.net/2009/11/13/html5-ruby/"/>
		<id>http://sideshowbarker.net/2009/11/13/html5-ruby/</id>
		<updated>2009-11-13T02:36:47+00:00</updated>
		<content type="html">&lt;p&gt; If you don&amp;#8217;t know what the HTML5 &lt;b&gt;ruby&lt;/b&gt; element is, you might want to take a minute to first read &lt;a href=&quot;http://dev.w3.org/html5/spec/text-level-semantics.html#the-ruby-element&quot;&gt;the section about the &lt;b&gt;ruby&lt;/b&gt; element in the HTML5 specification&lt;/a&gt; and/or the Wikipedia article on &lt;a href=&quot;http://en.wikipedia.org/wiki/Ruby_character&quot;&gt;ruby characters&lt;/a&gt;. To quote from the HTML5 description of the &lt;b&gt;ruby&lt;/b&gt; element:&lt;/p&gt;
&lt;blockquote cite=&quot;http://dev.w3.org/html5/spec/text-level-semantics.html#the-ruby-element&quot;&gt;
&lt;p&gt;The &lt;b&gt;ruby&lt;/b&gt; element allows one or more spans of phrasing content to be marked with ruby annotations. Ruby annotations are short runs of text presented alongside base text, primarily used in East Asian typography as a guide for pronunciation or to include other annotations. In Japanese, this form of typography is also known as &lt;em&gt;furigana&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I give a specific example further down, but for now I want to first say that the really great news about the &lt;b&gt;ruby&lt;/b&gt; element is that last week Google Chrome developer Roland Steiner &lt;a href=&quot;http://trac.webkit.org/changeset/50495&quot;&gt;checked in a change&lt;/a&gt; (r50495, and see also related &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28420&quot;&gt;bug 28420&lt;/a&gt;) that adds &lt;b&gt;ruby&lt;/b&gt; support to the trunk of the WebKit source repository, thus making the ruby feature available in WebKit nightlies and Chrome dev-channel releases.&lt;/p&gt;
&lt;h3 id=&quot;example&quot;&gt;A simple example&lt;/h3&gt;
&lt;p&gt;The following is a simple example of what you can do with the &lt;b&gt;ruby&lt;/b&gt; element; make sure to view it in a recent nightly or dev-channel release. Note that the text is an excerpt from the source of a ruby-annotated &lt;a href=&quot;http://www.aozora.gr.jp/cards/000035/files/1567_14913.html&quot;&gt;online copy of the short story &lt;i&gt;Run, Melos, Run&lt;/i&gt;&lt;/a&gt; by the writer Osamu Dazai, which I came across by way of Piro&amp;#8217;s info page for his &lt;a href=&quot;http://piro.sakura.ne.jp/xul/_rubysupport.html.en&quot;&gt;XHTML Ruby add-on for Firefox&lt;/a&gt; (and which I mention a bit more about further below).&lt;/p&gt;
&lt;pre&gt;
きのうの豪雨で山の水源地は&amp;lt;ruby&gt;氾濫&amp;lt;rp&gt;（&amp;lt;/rp&gt;
&amp;lt;rt&gt;&lt;span&gt;はんらん&lt;/span&gt;&amp;lt;/rt&gt;&amp;lt;rp&gt;）&amp;lt;/rp&gt;&amp;lt;/ruby&gt;し、濁流
&amp;lt;ruby&gt;滔々&amp;lt;rp&gt;（&amp;lt;/rp&gt;&amp;lt;rt&gt;&lt;span&gt;とうとう&lt;/span&gt;&amp;lt;/rt&gt;&amp;lt;rp&gt;）&amp;lt;/rp&gt;
&amp;lt;/ruby&gt;と下流に 集り、猛勢一挙に橋を破壊し、どうどうと
響きをあげる激流が、&amp;lt;ruby&gt;木葉微塵&amp;lt;rp&gt;（&amp;lt;/rp&gt;
&amp;lt;rt&gt;&lt;span&gt;こっぱみじん&lt;/span&gt;&amp;lt;/rt&gt;&amp;lt;rp&gt;）&amp;lt;/rp&gt;&amp;lt;/ruby&gt;に&amp;lt;ruby&gt;橋桁
&amp;lt;rp&gt;（&amp;lt;/rp&gt;&amp;lt;rt&gt;&lt;span&gt;はしげた&lt;/span&gt;&amp;lt;/rt&gt;&amp;lt;rp&gt;）&amp;lt;/rp&gt;&amp;lt;/ruby&gt;
を跳ね飛ばしていた。
&lt;/pre&gt;
&lt;p&gt;If you don&amp;#8217;t happen to have Japanese fonts installed, here&amp;#8217;s a screenshot of the source for reference:&lt;/p&gt;
&lt;p&gt;&lt;img id=&quot;ruby-markup&quot; src=&quot;http://sideshowbarker.net/wp-content/uploads/2009/11/source.png&quot; alt=&quot;ruby source markup&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Notice that the actual annotative ruby text (which I&amp;#8217;ve highlighted in yellow in the source just for the sake of emphasis) is marked up using the &lt;b&gt;rt&lt;/b&gt; element as a child of the &lt;b&gt;ruby&lt;/b&gt; element, and the text being annotated is the node that&amp;#8217;s a previous sibling to that &lt;b&gt;rt&lt;/b&gt; content as a child of the &lt;b&gt;ruby&lt;/b&gt; element. The final new element in the mix is the &lt;b&gt;rp&lt;/b&gt; element, which is simply a way to mark up the annotative ruby text with parenthesis, for graceful fallback in browsers that don&amp;#8217;t support ruby.&lt;/p&gt;
&lt;p&gt;So here&amp;#8217;s the rendered view of that same text:&lt;/p&gt;
&lt;blockquote cite=&quot;http://www.aozora.gr.jp/cards/000035/files/1567_14913.html&quot;&gt;
&lt;p&gt;見よ、前方の川を。きのうの豪雨で山の水源地は氾濫（はんらん）し、濁流滔々（とうとう）と下流に集り、猛勢一挙に橋を破壊し、どうどうと響きをあげる激流が、木葉微塵（こっぱみじん）に橋桁（はしげた）を跳ね飛ばしていた。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And here is a screenshot of how it should look in a recent nightly or dev-channel release:&lt;/p&gt;
&lt;p&gt;&lt;img id=&quot;image60&quot; src=&quot;http://sideshowbarker.net/wp-content/uploads/2009/11/rendered.png&quot; alt=&quot;ruby rendered view&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Notice that the annotative ruby text is displayed above the ruby base it annotates. If you instead view this page in a browser that doesn&amp;#8217;t support the ruby feature, you&amp;#8217;ll see that the ruby text is just shown inline, in parenthesis following the ruby base it annotates. So the feature falls back gracefully in older browsers.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re not accustomed to reading printed books and magazines and such in Japanese, you may be feeling underwhelmed by the example above. But for authors and developers and content providers in Japan who want to finally be able to use on the Web this very common feature of Japanese page layout from the print world, getting ruby support into WebKit is a huge win, and something to be very excited about.&lt;/p&gt;
&lt;h3 id=&quot;other-browsers&quot;&gt;Support in other browsers&lt;/h3&gt;
&lt;p&gt;Current versions of Microsoft Internet Explorer also have native support for ruby, and you can also get ruby support in Firefox by installing Piro&amp;#8217;s &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/1935&quot;&gt;XHTML Ruby add-on&lt;/a&gt; (and for more details, see his &lt;a href=&quot;http://piro.sakura.ne.jp/xul/_rubysupport.html.en&quot;&gt;XHTML ruby add-on info page&lt;/a&gt;) — so we are well on the way to seeing the HTML5 ruby feature supported across a range of browsers.&lt;/p&gt;</content>
		<author>
			<name>Michael(tm)Smith</name>
			<email>mike@w3.org</email>
			<uri>http://sideshowbarker.net</uri>
		</author>
		<source>
			<title type="html">Michael(tm) Smith</title>
			<subtitle type="html">smith@sideshowbarker.net</subtitle>
			<link rel="self" href="http://sideshowbarker.net/feed/"/>
			<id>http://sideshowbarker.net/feed/atom/</id>
			<updated>2009-11-13T02:53:10+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Kenneth Rohde Christiansen is now a WebKit reviewer!</title>
		<link href="http://webkit.org/blog/901/kenneth-rohde-christiansen-is-now-a-webkit-reviewer/"/>
		<id>http://webkit.org/blog/?p=901</id>
		<updated>2009-11-11T17:59:05+00:00</updated>
		<content type="html">&lt;p&gt;Kenneth has been participating in WebKit development since late 2008, when he started the initial EFL port. Since early 2009 he has contributed a great deal on all fronts of the Qt port, including WebCore integration and API. He has also played an important role in making sure the GTK+ and Qt ports work together wherever possible.&lt;/p&gt;
&lt;p&gt;Please join me in congratulating Kenneth on his reviewer status!&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Compiling WebKitGTK+ on Scratchbox for ARM platform</title>
		<link href="http://webkit.sed.hu/node/26"/>
		<id>http://webkit.sed.hu/26 at http://webkit.sed.hu</id>
		<updated>2009-11-11T14:25:33+00:00</updated>
		<content type="html">&lt;p&gt;If we would like to build WebKitGTK+ for ARM platform, &lt;a href=&quot;http://www.scratchbox.org/&quot;&gt;Scratchbox&lt;/a&gt; could be a good choice. In this post I will show, how we can install and setup Scratchbox to build WebKitGTK+. First, we have to install the Scratchbox and its ARM target. Next, we install some libraries to WebKitGTK+.&lt;br /&gt;
Let's see how we can do that.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.sed.hu/node/26&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>University of Szeged</name>
			<uri>http://webkit.sed.hu</uri>
		</author>
		<source>
			<title type="html">WebKit Apocrypha</title>
			<link rel="self" href="http://webkit.sed.hu/rss.xml"/>
			<id>http://webkit.sed.hu/rss.xml</id>
			<updated>2009-11-21T22:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">About Dynamic UI, Web-Apps, Performance, and State-Machines</title>
		<link href="http://labs.trolltech.com/blogs/2009/11/09/about-dynamic-ui-web-apps-performance-and-state-machines/"/>
		<id>http://labs.trolltech.com/blogs/2009/11/09/about-dynamic-ui-web-apps-performance-and-state-machines/</id>
		<updated>2009-11-09T04:21:31+00:00</updated>
		<content type="html">&lt;p&gt;Lately I&amp;#8217;ve been working on a couple of exciting customer projects, involving HTML5-based UIs on embedded (TV) platforms. Due to the fabulous work some of my colleagues put into QtWebkit and QtDirectFB, and the ongoing work from &lt;a href=&quot;http://mips.com/&quot;&gt;MIPS Technologies&lt;/a&gt; on their &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30144&quot;&gt;Webkit JIT&lt;/a&gt;, the paint performance is very good, and Javascript is getting faster and faster.&lt;br /&gt;
However, while working on these projects, I&amp;#8217;ve ran into a few issues that were not solvable by JIT-accelerated JavaScript or by hardware accelerated painting. &lt;/p&gt;
&lt;p&gt;The main problem was that when you write a dynamic UI for a full application, the complexity starts to be difficult to manage. I started by dividing the app to a few HTML pages, but that of course created unacceptable delays when switching between the pages. So I looked online for dynamic web-app solutions. Those include the amazing Javascript libraries Dojo and JQuery. The problem with those is that they manage the complexity by selecting elements with custom-built CSS-like selectors (which are slow) and by modifying the HTML DOM tree in runtime (which is slower). &lt;/p&gt;
&lt;p&gt;An alternate way to handle HTML performance is with the HTML5 canvas element (which is nicely accelerated) - the problem is that canvas API is currently too low level, and the widget libraries on top of it are not mature yet, definitely not in time for my customer projects.&lt;/p&gt;
&lt;p&gt;So I asked myself: what components are really needed in order to make a dynamic UI?&lt;br /&gt;
Looking at the Qt Kinetic project, I need 4 main elements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;State Machine&lt;/li&gt;
&lt;li&gt;Graphic effects&lt;/li&gt;
&lt;li&gt;Declarative Syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now HTML and CSS are already a declarative syntax, and CSS3 (supported in webkit) contains all the animations and graphic effects I currently need. The missing element, which is also my personal favorite, is the State Machine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why do I keep going on and on about state-machines?&lt;/strong&gt;&lt;br /&gt;
If you think about it, both CSS, HTML, and Qt widgets are optimized to handle complexity in &lt;em&gt;space&lt;/em&gt;. State machines, however, are optimized to handle complexity in 	&lt;em&gt;time&lt;/em&gt;. An application can be &lt;em&gt;dynamic&lt;/em&gt; only if it&amp;#8217;s rich both in &lt;em&gt;space&lt;/em&gt; and in &lt;em&gt;time&lt;/em&gt;. That&amp;#8217;s why to me state-machines are of outmost importance for dynamic UIs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enough philosophy, what&amp;#8217;s this about?&lt;/strong&gt;&lt;br /&gt;
Now I&amp;#8217;ve had the pleasure to work with the &lt;a href=&quot;http://www.w3.org/TR/scxml/&quot;&gt;SCXML standard&lt;/a&gt; in the last year, both by prototyping the Qt-SCXML library (which later helped with the evolution of the Qt State Machine Framework), and by joining the &lt;a href=&quot;http://www.w3.org/Voice/&quot;&gt;w3c group that defines the SCXML standard&lt;/a&gt;.&lt;br /&gt;
While working on my latest HTML-based project, I was thinking - what if I could define the flow of my web-app with an SCXML statechart? Wouldn&amp;#8217;t that allow for managing the complexity of my web app, without incurring the performance overhead of modifying and re-modifying the DOM?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introducing Statechartz&lt;/strong&gt;&lt;br /&gt;
So I took the time to write an SCXML library for Javascript. I basically had to copy the SCXML algorithm to Javascript syntax, which took a while, but has already saved me hours of work by having the code of my web-apps cleaner and smaller.&lt;br /&gt;
The result can be found at the &lt;a href=&quot;http://qt.gitorious.org/qt-labs/scxml/trees/statechartz&quot;&gt;statechartz branch on the SCXML lab GIT repo.&lt;/a&gt;, and the &lt;a href=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/11/demo.html&quot;&gt;demo can be viewed online&lt;/a&gt;. Note that the library is currently only tested on webkit-based browsers (QtWebkit/Arora, Safari, Chrome), but porting it to other browsers shouldn&amp;#8217;t be too difficult.&lt;/p&gt;
&lt;p&gt;Looking a bit at the &lt;a href=&quot;http://qt.gitorious.org/qt-labs/scxml/blobs/statechartz/statechartz/demo.html&quot;&gt;HTML code of the demo&lt;/a&gt;, you&amp;#8217;ll notice the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;statechart&quot; href=&quot;flow.scxml&quot; /&amp;gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the line that connects an HTML page with an SCXML statechart, defining the page&amp;#8217;s flow. The state-machine would start running as soon as the page is loaded.&lt;br /&gt;
But hey! &lt;em&gt;rel=&amp;#8221;statechart&amp;#8221;&lt;/em&gt; isn&amp;#8217;t standard!&lt;/p&gt;
&lt;p&gt;Well, I was surprised to learn that HTML5 allows you to add your own link types, which become legal if you register them in &lt;a href=&quot;http://wiki.whatwg.org/wiki/RelExtensions&quot;&gt;the WHATWG Wiki&lt;/a&gt;&lt;a&gt;, which I did; so now &amp;lt;link rel=&amp;#8221;statechart&amp;#8221; href=&amp;#8221;somefile.scxml&amp;#8221; /&amp;gt; is completely standard &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;br /&gt;
Though using the link tag would cover most cases, it&amp;#8217;s completely optional and the Statechartz library can be used more dynamically, either by loading an SCXML file whenever wanted: &lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;
var myStateMachine = Statechartz.loadScxml(someURL);
&lt;/pre&gt;
&lt;p&gt;or by using a dynamic javascript syntax that looks like this:&lt;/p&gt;
&lt;pre&gt;
var myStateMachine;
with (Statechartz) {
  myStateMachine = build(
    State(&quot;root&quot;,
        Entry(function() { doSomething(); }),
        Parallel(&quot;s1&quot;,Initial,
             Exit(function()(doSomethingElse(); }),
             Transition(Event(&quot;EVENT.QUIT&quot;), Target(&quot;exit&quot;))
        ),
        Final(&quot;exit&quot;)
    )
  );
}
&lt;/pre&gt;
&lt;p&gt;Another thing to look at, is the DOM:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;screen_weather&quot; class=&quot;screen&quot;&amp;gt;
      &amp;lt;script type=&quot;text/javascript&quot; src=&quot;...&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;screen_shopping&quot; class=&quot;screen&quot;&amp;gt;
    &amp;lt;iframe src=&quot;...&quot; height=&quot;240&quot; width=&quot;320&quot; scrolling=&quot;no&quot; style=&quot;overflow:hidden&quot; frameborderwidth=&quot;0&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;screen_calc&quot; class=&quot;screen&quot;&amp;gt;...&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Even though &lt;em&gt;screen_weather&lt;/em&gt;, &lt;em&gt;screen_shopping&lt;/em&gt; and &lt;em&gt;screen_calc&lt;/em&gt; exist in the DOM to begin with, only one of them is shown at a time. Also, there&amp;#8217;s no particular Javascript code that shows and hides them. That&amp;#8217;s done by a trick I added to the Statechartz library: the CSS class of the document BODY element changes when the state changes. So, if I&amp;#8217;m in a state with ID &amp;#8220;calc&amp;#8221;, the body would have a CSS class &amp;#8220;state_calc&amp;#8221;, and now all it takes is adding this to the CSS (it&amp;#8217;s a little different in the actual CSS, but I&amp;#8217;m trying to make a point):&lt;/p&gt;
&lt;pre&gt;
#screen_calc {
  left: -350px;
  -webkit-transition-duration: 600ms;
  opacity: 0.5;
}
.state_calc #screen_calc {
  left: 0px;
  -webkit-transform: rotate(360deg) scale(1);
  opacity: 1;
}
&lt;/pre&gt;
&lt;p&gt;This code, like states and transitions in Qt 4.6, would animate the opacity and geometry of my calculator screen, and would create an animated transition when the calculator is entered to / exited from.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Demo, and performance&lt;/strong&gt;&lt;br /&gt;
The &lt;/p&gt;&lt;a href=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/11/demo.html&quot;&gt;demo&lt;/a&gt; that comes with the statechartz library demonstrates 3 uses of the Statechartz library:
&lt;ul&gt;
&lt;li&gt;Dynamic UIs with states and transitions (switching between the 3 widgets)&lt;/li&gt;
&lt;li&gt;Managing UI complexity (e.g. the instructions popup)&lt;/li&gt;
&lt;li&gt;Business logic (the calculator &amp;#8216;engine&amp;#8217;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Note that the demo specifically is too animation-heavy to run well on embedded platforms, and of course webkit could use some more optimizations. but the concepts (don&amp;#8217;t mess with the DOM, use Statecharts to manage time) are the same, and are working on other webkit-based projects with a cvery nice performance gain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The next step on the SCXML path&lt;/strong&gt;&lt;br /&gt;
After this project, SCXML is now supported in 3 implementations: Qt C++ (with &lt;a href=&quot;http://qt.gitorious.org/qt-labs/scxml/trees/master/scc&quot;&gt;scc&lt;/a&gt;), QtScript (with &lt;a href=&quot;http://qt.gitorious.org/qt-labs/scxml/trees/master/src&quot;&gt;QScxml&lt;/a&gt;), and web (with &lt;a href=&quot;http://qt.gitorious.org/qt-labs/scxml/trees/statechartz/statechartz&quot;&gt;Statechartz&lt;/a&gt;). The next natural step is a statechart graphical tool (Creator plugin) that can help author SCXML files for all of those 3 implementations. Though it&amp;#8217;s not on our roadmap, some of us (including the undersigned) were working on prototypes, and any help from the community would be appreciated!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;br /&gt;
The code: &lt;a href=&quot;http://qt.gitorious.org/qt-labs/scxml/trees/statechartz&quot;&gt;http://qt.gitorious.org/qt-labs/scxml/trees/statechartz&lt;/a&gt;&lt;br /&gt;
The live demo (webkit browsers only): &lt;a href=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/11/demo.html&quot;&gt;http://labs.trolltech.com/blogs/wp-content/uploads/2009/11/demo.html&lt;/a&gt;&lt;br /&gt;
Video capture of the live demo: &lt;a href=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/11/statechartz-capture_0001.wmv&quot; title=&quot;StateCharts-ScreenCapture&quot;&gt;http://labs.trolltech.com/blogs/wp-content/uploads/2009/11/statechartz-capture_0001.wmv&lt;/a&gt; &lt;/p&gt;</content>
		<author>
			<name>No'am Rosenthal</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Web Inspector Updates</title>
		<link href="http://webkit.org/blog/829/web-inspector-updates/"/>
		<id>http://webkit.org/blog/?p=829</id>
		<updated>2009-11-04T02:13:28+00:00</updated>
		<content type="html">&lt;p&gt;A number of exciting new features have been added to the Web Inspector since our &lt;a href=&quot;http://webkit.org/blog/197/web-inspector-redesign/&quot;&gt;last update&lt;/a&gt;. Today we would like to highlight some of those features! This post is also available in &lt;a href=&quot;http://trac.webkit.org/wiki/Web%20Inspector%20Update.ja&quot;&gt;Japanese (日本語)&lt;/a&gt;, thanks to Keishi Hattori (服部慶士).&lt;/p&gt;
&lt;p&gt;If you would like to play with most of these features you will need to be running a recent &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;WebKit Nightly&lt;/a&gt;. Once downloaded make sure that you enable the Web Inspector by checking “Show Develop menu in menu bar” under the Advanced tab in the Preferences.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/enable.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/enable.png&quot; alt=&quot;Enabling the Inspector in Preferences&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;editing&quot;&gt;Editing Element Attributes and Style Properties &lt;a href=&quot;http://webkit.org/blog/feed/#editing&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Editing Element Attributes and Style Properties has been made even simpler and more developer friendly. The interfaces for editing attributes and properties now support tabbing to allow you to move between items, and create new items with ease.&lt;/p&gt;
&lt;p&gt;Besides tabbing you can also add a new attributes to a node.  Start by hovering over the node in the Element’s Tree Hierarchy and after a polite wait a clickable template for a new attribute will appear.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/edit_attributes.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/edit_attributes.png&quot; alt=&quot;Edit Element Attributes&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=21108&quot;&gt;Add Element Attributes&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27673&quot;&gt;Tabbing&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30057&quot;&gt;Improved UI&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;css_selectors&quot;&gt;Creating and Modifying CSS Rules and Selectors &lt;a href=&quot;http://webkit.org/blog/feed/#css_selectors&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A powerful new feature in the Web Inspector allows you create new or modify existing CSS Rules and Selectors. We expect both developers and designers will find this very useful when experimenting with new ideas or tweaking existing designs.&lt;/p&gt;
&lt;p&gt;The interface for working with selectors starts with a new Gear Menu in the Styles Sidebar Pane. Select “New Style Rule” and a new section will be created for you, pre-populated with an intelligent selector from the selection in the Elements Tree Hierarchy. Editing selectors is activated by double-clicking. Once again, tabbing will allow you to navigate between selectors and their properties.&lt;/p&gt;
&lt;p&gt;When editing selectors there is visual feedback when you create or modify a selector that does not affect the selected node in the Elements Tree Hierarchy. This indicator helps detect errors when making changes.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/css_selectors.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/css_selectors.png&quot; alt=&quot;Create and Modify CSS Selectors&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One more tweak to the Styles Pane is that there is always a section for the selected node’s style attribute. This allows you to easily add style information to the node as you usually would via the Styles Pane instead of editing or creating a “style” attribute. This section is nearly always on top due to how CSS specificity works.&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27124&quot;&gt;Selectors Support&lt;/a&gt; and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=29039&quot;&gt;Move to Gear Menu&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;colors&quot;&gt;CSS Color Representations &lt;a href=&quot;http://webkit.org/blog/feed/#colors&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Colors in the Styles Pane can be shown in any of their possible representations. For simple colors this includes short hex, full hex, rgb, hsl, and potentially a nickname. For advanced colors this includes rgba and hsla. For example the color “white” can be represented as: &lt;code&gt;#FFF&lt;/code&gt;, &lt;code&gt;#FFFFFF&lt;/code&gt;, &lt;code&gt;rgb(255, 255, 255)&lt;/code&gt;, &lt;code&gt;hsl(0, 100%, 100%)&lt;/code&gt;, and &lt;code&gt;white&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can use the Styles Pane’s Gear Menu to set your preferred representation. However, if you want to cycle through an individual color’s different representations you can do so by clicking on its associated color swatch.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/colors.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/colors.png&quot; alt=&quot;Mutiple Color Representations&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=13516&quot;&gt;Color Representations&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28889&quot;&gt;Preference and Gear Menu&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28978&quot;&gt;UI Improvement&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;dom_storage&quot;&gt;DOM Storage &lt;a href=&quot;http://webkit.org/blog/feed/#dom_storage&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Storage Panel (formerly the Databases Panel) now allows you to monitor DOM Storage areas like &lt;code&gt;localStorage&lt;/code&gt; and &lt;code&gt;sessionStorage&lt;/code&gt; in a familiar datagrid. The DOM Storage datagrid displays live updates so monitoring changes is possible without manually refreshing the view.&lt;/p&gt;
&lt;p&gt;Also, the familiar creation and editing techniques apply to the datagrid. To add a new key/value pair just double-click in any open area, or double-click an existing item to start editing. Tabbing works as you would expect.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/dom_storage.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/dom_storage.png&quot; alt=&quot;Observing DOM Storage Key/Value Pairs&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=21051&quot;&gt;DOM Storage Support&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27400&quot;&gt;Live Updates&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27322&quot;&gt;Create New Items&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27746&quot;&gt;Tabbing&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;keyboard_shortcuts&quot;&gt;Keyboard Shortcuts &lt;a href=&quot;http://webkit.org/blog/feed/#keyboard_shortcuts&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Keyboard shortcuts are always desired by developers. They can be hard to discover, so &lt;a href=&quot;http://trac.webkit.org/wiki/Web%20Inspector#ShortcutKeys&quot;&gt;here is a complete list&lt;/a&gt; and here are the ones that were added recently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Switch Panels&lt;/strong&gt; — &lt;span&gt;Command-[&lt;/span&gt; and &lt;span&gt;Command-]&lt;/span&gt; on a Mac or &lt;span&gt;Control-[&lt;/span&gt; and &lt;span&gt;Control-]&lt;/span&gt; on other platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete a Node in the Tree Hierarchy&lt;/strong&gt; — either &lt;span&gt;Delete&lt;/span&gt; or &lt;span&gt;Backspace&lt;/span&gt; keys will do the trick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick Edits in the Tree Hierarchy&lt;/strong&gt; — Hitting &lt;span&gt;Enter&lt;/span&gt; or &lt;span&gt;Return&lt;/span&gt; on a Node in the Tree enters the editing mode for that type of Node.  For a Text Node you will start editing the content.  For Element Nodes you start editing the first attribute, or, for convenience, a new attribute will be added for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Scripts Debugger was updated to support some popular keyboard shortcuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Continue&lt;/strong&gt; — &lt;span&gt;F8&lt;/span&gt; or &lt;span&gt;Command-/&lt;/span&gt; on a Mac or &lt;span&gt;Control-/&lt;/span&gt; on other platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step Over&lt;/strong&gt; — &lt;span&gt;F10&lt;/span&gt; or &lt;span&gt;Command-&amp;#8217;&lt;/span&gt; on a Mac or &lt;span&gt;Control-&amp;#8217;&lt;/span&gt; on other platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step Into&lt;/strong&gt; — &lt;span&gt;F11&lt;/span&gt; or &lt;span&gt;Command-;&lt;/span&gt; on a Mac or &lt;span&gt;Control-;&lt;/span&gt; on other platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step Out&lt;/strong&gt; — &lt;span&gt;Shift-F11&lt;/span&gt; or &lt;span&gt;Shift-Command-;&lt;/span&gt; on a Mac or &lt;span&gt;Shift-Control-;&lt;/span&gt; on other platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next Call Frame&lt;/strong&gt; — &lt;span&gt;Control-.&lt;/span&gt; on all platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Previous Call Frame&lt;/strong&gt; — &lt;span&gt;Control-,&lt;/span&gt; on all platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluate Selection When on a Breakpoint&lt;/strong&gt; — &lt;span&gt;Shift-Command-E&lt;/span&gt; on a Mac or &lt;span&gt;Shift-Control-E on other platforms.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27286&quot;&gt;Switch Panels&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30337&quot;&gt;Delete Node&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30428&quot;&gt;Quick Edit&lt;/a&gt;, &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=23849&quot;&gt;General Debugger Shortcuts&lt;/a&gt; and &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27502&quot;&gt;Evaluate Selection&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;cookies&quot;&gt;Cookies &lt;a href=&quot;http://webkit.org/blog/feed/#cookies&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Viewing Cookie information is now possible under the Storage Panel. Supported platforms show all of the cookies and their hidden information for all domains accessed on the inspected page. Cookie information includes the name, value, path, expiration date, http only flag, and secure (https) flag. Supported platforms may also delete cookies.&lt;/p&gt;
&lt;p&gt;If your platform doesn’t have full support you aren’t left in the dark. You will still be able to see the keys and values of the cookies that are accessible via JavaScript on the inspected page.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/cookies.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/cookies.png&quot; alt=&quot;Inspect Hidden Cookie Information&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27202&quot;&gt;Initial Support&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28269&quot;&gt;Hidden Data 1&lt;/a&gt; and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28185&quot;&gt;2&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30104&quot;&gt;Cookies for Sub-Resources&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30036&quot;&gt;UI Improvements&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;event_listeners&quot;&gt;Event Listeners &lt;a href=&quot;http://webkit.org/blog/feed/#event_listeners&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new Sidebar Pane has been added to the Elements Panel which displays the registered Event Listeners for the selected node.  The Event Listeners that are shown for the selected node are in the exact order that they are fired through the Capturing and Bubbling phases.  This provides developers with the most accurate and useful information possible.&lt;/p&gt;
&lt;p&gt;The user interface shows the registered Event Listeners separated by type. If a node has both “onclick” and “onmouseover” listeners then they will naturally appear in different sections. You can also set your filter preference using the Gear Menu. You can choose to see only the listeners registered on the selected node, or the entire event flow.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/event_listeners.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/event_listeners.png&quot; alt=&quot;Inspect Registered Event Listeners&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are actively looking for UI improvements in this area. So if you have some ideas or feedback please feel free to let us know on &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=29789&quot;&gt;this bug report&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=17429&quot;&gt;Event Listeners&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;syntax_highlighting&quot;&gt;Syntax Highlighting &lt;a href=&quot;http://webkit.org/blog/feed/#syntax_highlighting&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Syntax highlighting enhances readability, makes debugging code easier, and looks really awesome. The Web Inspector now includes syntax highlighting for JSON and CSS.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/css_syntax_highlight.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/css_syntax_highlight.png&quot; alt=&quot;CSS Syntax Highlighting&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CSS Syntax Highlighting even works on the more complex “at-rules” such as &lt;code&gt;@import&lt;/code&gt;, &lt;code&gt;@media&lt;/code&gt; and &lt;code&gt;@font-face&lt;/code&gt;. In addition to supporting the syntax highlighting in the Resources Panel, inline scripts and styles in the Elements Tree Hierarchy are syntax highlighted!&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/inline_highlight.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/inline_highlight.png&quot; alt=&quot;Inline JavaScript and CSS Syntax Highlighting&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27503&quot;&gt;JSON Highlighting&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=14359&quot;&gt;CSS Highlighting&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30062&quot;&gt;Inline Highlighting&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;breakpoints&quot;&gt;Breakpoints and Watch Expressions &lt;a href=&quot;http://webkit.org/blog/feed/#breakpoints&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Script Debugger continues to become more powerful and more useful.  We already mentioned the &lt;a href=&quot;http://webkit.org/blog/feed/#keyboard_shortcuts&quot;&gt;keyboard shortcuts&lt;/a&gt; above, but there are plenty of other enhancements.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;There is a new Breakpoints Sidebar Pane that allows you to easily monitor and work with your breakpoints across all files without the hassle of searching for them.  Each sidebar entry shows the source line and contains a checkbox that allows you to directly enable or disable the breakpoint. Clicking on the entry will jump you directly to the highlighted line in the source file. Finally, deleting a breakpoint has been made easier by clicking the &amp;#8220;blue tag&amp;#8221; breakpoint indicator.  The tag will cycle through its three states of active, inactive, and removed.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A powerful feature added to the debugger is Conditional Breakpoints. Once you have a breakpoint set, right click on the &amp;#8220;blue tag&amp;#8221; breakpoint indicator and you will get a popup asking for a conditional statement for that breakpoint. Simply provide an expression and the breakpoint will only pause from then on only if the condition is true.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/breakpoints.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/breakpoints.png&quot; alt=&quot;Breakpoints and other Debugging Improvements&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another new feature in the Debugger is Watch Expressions.  In this new Sidebar Pane you can add any number of expressions that evaluate in the global scope normally but in the local scope when paused in the debugger. Once added you get the full Object Properties tree view of the values of each expression.  These watch expressions automatically refresh when the debugger pauses. They are also persist across page loads.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/watched_expression.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/watched_expression.png&quot; alt=&quot;Watched Expressions in Action&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=11175&quot;&gt;Breakpoints Sidebar Pane&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27514&quot;&gt;Watch Expressions&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27502&quot;&gt;Evaluate on Breakpoint&lt;/a&gt;, &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28908&quot;&gt;Conditional Breakpoints&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=19131&quot;&gt;Delete Breakpoints&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;ajax&quot;&gt;Debugging AJAX &lt;a href=&quot;http://webkit.org/blog/feed/#ajax&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An extremely valuable feature for developers working with AJAX is the ability to view the exact parameters and payload sent on XMLHttpRequests.&lt;/p&gt;
&lt;p&gt;In the individual resource view there are new sections for viewing submitted Form Data, Query String Parameters, and Request Payloads when appropriate. You can toggle viewing the information in its unencoded (default) and encoded forms with a double-click.&lt;/p&gt;
&lt;p&gt;There is also new section named HTTP Information which contains the Request Method (GET, POST, etc.) and the Status Code (200, 404, etc.). Additionally, it adds a colored dot next to the requested URL to show the status (green for success, orange for redirect, and red for error).&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/form_data.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/form_data.png&quot; alt=&quot;View Submitted Form Data and HTTP Information&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=19945&quot;&gt;HTTP Status Code&lt;/a&gt; and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=22920&quot;&gt;Data, Parameters, and Payload&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;scope_bars&quot;&gt;Resources and Console Scope Bars &lt;a href=&quot;http://webkit.org/blog/feed/#scope_bars&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In order to filter through the Resources or Console messages the Web Inspector now sports some familiar Scope Bars. This has proven to be very useful in the Resources Panel for easily viewing all resources of a particular type.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/scope_bar.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/scope_bar.png&quot; alt=&quot;Quick Filtering Scope Bars for Resources Types and Console Message Types&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=20629&quot;&gt;Resources Scope Bar&lt;/a&gt; and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=29195&quot;&gt;Console Scope Bars&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;load_lines&quot;&gt;Resources Timeline &lt;a href=&quot;http://webkit.org/blog/feed/#load_lines&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Web Inspector now specifically shows in the timeline when the DOMContentLoaded and Load events fire. This helps clarify the time it takes for pages to load and helps you improve your websites load times.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/load_lines.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/load_lines.png&quot; alt=&quot;DOMContent Ready Event and Page's Load Event Indicators&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=14370&quot;&gt;Show Load Lines&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;resource_interactivity&quot;&gt;Resources Interactivity &lt;a href=&quot;http://webkit.org/blog/feed/#resource_interactivity&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A couple new features allow you to more directly access individual resources from within the Web Inspector. Instead of copying their URL and opening a new tab manually you can now double-click the Resource in the sidebar to open it directly in a new window. Or, you can drag and drop the resource using HTML5 drag and drop events!&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=14409&quot;&gt;Open Resource Directly&lt;/a&gt; and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30079&quot;&gt;Drag and Drop&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;console_improvements&quot;&gt;Console Improvements &lt;a href=&quot;http://webkit.org/blog/feed/#console_improvements&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Properties in the Web Inspector’s Console are now sorted in a much more natural and useful way. By sorting keys alphanumerically Arrays with greater then 10 elements are much easier to work with.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/inorder.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/inorder.png&quot; alt=&quot;Alphanumeric Sorting&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another tweak is that collections such as NodeLists and HTMLCollections are now displayed like Arrays.  This meaning that their contents are shown directly in the console, no longer requiring any extra boilerplate.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/nodelist.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/nodelist.png&quot; alt=&quot;More Descriptive Nodelists&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27329&quot;&gt;Sorting&lt;/a&gt; and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28061&quot;&gt;NodeLists&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;firebug_api&quot;&gt;Firebug Command API Improvements &lt;a href=&quot;http://webkit.org/blog/feed/#firebug_api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;More improvements have been made to support more of the &lt;a href=&quot;http://getfirebug.com/commandline.html&quot;&gt;Firebug Command Line API&lt;/a&gt;. The Web Inspector now supports the &lt;code&gt;inspect()&lt;/code&gt; function, which can take an Element, Database, or Storage area and automatically jumps to the appropriate Panel with information. Also, the &lt;code&gt;$0&lt;/code&gt;-&lt;code&gt;$4&lt;/code&gt; variables contain the current and previous selected nodes from the Elements Tree Hierarchy.&lt;/p&gt;
&lt;p&gt;These command line APIs are usable inside the Web Inspector’s Console. To make working with these APIs even easier, they now show up in the Console’s autocompletion.&lt;/p&gt;
&lt;p&gt;Related Bug Reports: &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=17907&quot;&gt;$# Variables&lt;/a&gt;, &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=19874&quot;&gt;inspect() Function&lt;/a&gt;, and &lt;a class=&quot;bug&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=27696&quot;&gt;Autocompletion&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;contribute&quot;&gt;How You Can Contribute &lt;a href=&quot;http://webkit.org/blog/feed/#contribute&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Many of these new features were added by members of the Open Source Community. We would like to encourage you to contribute as well! Since the Web Inspector itself is mostly HTML, JavaScript, and CSS that means that you already have the skills you need to join in! Interested? Play around right now by inspecting the inspector itself!&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;image&quot; href=&quot;http://webkit.org/blog-files/inspector/inspect_inspector.png&quot;&gt;&lt;img src=&quot;http://webkit.org/blog-files/inspector/inspect_inspector_small.png&quot; alt=&quot;Work on the Web Inspector using the Web Inspector!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you’re interested in contributing and have any questions please stop by the &lt;a href=&quot;irc://irc.freenode.net/#webkit-inspector&quot;&gt;#webkit-inspector&lt;/a&gt; IRC channel! As an encouragement to developers, included at the end of each section above are the core bug reports that were involved in bringing each of these features to life.&lt;/p&gt;
&lt;p&gt;Finally, if you have ideas for new features, any improvements, or if you’ve stumbled across a bug then please don’t hesitate to create a bug report. &lt;a href=&quot;http://webkit.org/new-inspector-bug&quot;&gt;This link&lt;/a&gt; has pre-populated most of the fields so that you only need to fill out the Summary and Description. As always you should do a quick search through the &lt;a href=&quot;http://bit.ly/RDwz2&quot;&gt;existing inspector bugs&lt;/a&gt; first.&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The effect of TCmalloc in the QtWebKit port - stage 2: Memory consumption</title>
		<link href="http://webkit.sed.hu/node/25"/>
		<id>http://webkit.sed.hu/25 at http://webkit.sed.hu</id>
		<updated>2009-10-28T13:18:40+00:00</updated>
		<content type="html">&lt;p&gt;As &lt;a href=&quot;http://webkit.sed.hu/node/23&quot;&gt;I mentioned&lt;/a&gt;, there is a reverse of a medal, so now let's see how enabling TCmalloc on the QtWebKit port's JavaScriptCore engine effects memory consumption.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.sed.hu/node/25&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>University of Szeged</name>
			<uri>http://webkit.sed.hu</uri>
		</author>
		<source>
			<title type="html">WebKit Apocrypha</title>
			<link rel="self" href="http://webkit.sed.hu/rss.xml"/>
			<id>http://webkit.sed.hu/rss.xml</id>
			<updated>2009-11-21T22:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Building QtWebKit on Windows</title>
		<link href="http://webkit.sed.hu/node/24"/>
		<id>http://webkit.sed.hu/24 at http://webkit.sed.hu</id>
		<updated>2009-10-27T12:37:14+00:00</updated>
		<content type="html">&lt;p&gt;When I tried to build QtWebKit on Windows the first time, I realized it was a more complex task than on Linux. I experimented a lot to make building, testing and WebKit scripts work correctly. I decided that I would fix imperfect scripts and write a blogpost about this topic to relieve WebKit developers sufferings.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://webkit.sed.hu/node/24&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>University of Szeged</name>
			<uri>http://webkit.sed.hu</uri>
		</author>
		<source>
			<title type="html">WebKit Apocrypha</title>
			<link rel="self" href="http://webkit.sed.hu/rss.xml"/>
			<id>http://webkit.sed.hu/rss.xml</id>
			<updated>2009-11-21T22:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">More Cairo Shadow Work</title>
		<link href="http://whtconstruct.blogspot.com/2009/10/more-cairo-shadow-work.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-6137013537677181617</id>
		<updated>2009-10-26T00:28:50+00:00</updated>
		<content type="html">&lt;a href=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SuU-02t8euI/AAAAAAAAAJg/ZqkkgS78OYE/s1600-h/Screen+shot+2009-10-25+at+7.26.21+PM.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SuU-02t8euI/AAAAAAAAAJg/ZqkkgS78OYE/s320/Screen+shot+2009-10-25+at+7.26.21+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5396788806235749090&quot; /&gt;&lt;/a&gt;&lt;br /&gt;WebKit Uber-Hacker Dirk Schulze has been hard at work on his SVG (and general graphic) filter modifications in WebKit.  It now seems that drop-shadow support will be very doable using the existing Cairo backend.  I am still spending a bit of time porting the work over to the Skia backend, but took a break from that to try out a few of Dirks updates, as well as attempting to correct some WebKit &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30762&quot;&gt;bugs&lt;/a&gt; manifested by enabling filters under Windows.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SuU_4Gcv2QI/AAAAAAAAAJo/NWCztGok5h0/s1600-h/Screen+shot+2009-10-25+at+11.20.23+PM.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SuU_4Gcv2QI/AAAAAAAAAJo/NWCztGok5h0/s320/Screen+shot+2009-10-25+at+11.20.23+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5396789961509820674&quot; /&gt;&lt;/a&gt;As you can see from the first image, Dirk has gotten very nice looking stroke shadows.  Likewise, he has gotten proper image masked shadows working, shown in the second image.  I'm quite impressed with the facility's ability to generate a correct shadow from the generated gradient.  The page shows a few other examples, but these highlight the main idea.&lt;br /&gt;&lt;br /&gt;On the Skia front, I've gotten WebCore building, and a partially functioning WebKit build.  However there's still a few things I need to reconnect.  It looks like there are a few things that live in &quot;platform/graphics/chromium&quot; that might make more sense in &quot;platform/graphics/skia&quot; (namely ImageBufferData.h, and perhaps some of the font and icon handling.)  It also seems like the Skia backend is not as fast as the Cairo backend.  This is currently a purely subjective observation, and of course neither backend is currently taking advantage of any hardware acceleration (well, actually Cairo probably is).  However, the presence of the compositing and 3D transform support in Skia still make this look like a good choice, especially when attempting to address &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=29813&quot;&gt;29813&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-6137013537677181617?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Experiments with Cairo Shadows</title>
		<link href="http://whtconstruct.blogspot.com/2009/10/experiments-with-cairo-shadows.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-1998136425036058991</id>
		<updated>2009-10-23T19:13:24+00:00</updated>
		<content type="html">Fellow WebKit hacker Dirk Schulze pointed out to me that the various filter work he was doing would largely provide the functions needed to support box-shadow, and that they might even work on the WinCairo port.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_hInRJC0BnDo/SuJTxWHPXVI/AAAAAAAAAJQ/anRMDz56pYU/s1600-h/Screen+shot+2009-10-23+at+5.59.25+PM.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_hInRJC0BnDo/SuJTxWHPXVI/AAAAAAAAAJQ/anRMDz56pYU/s320/Screen+shot+2009-10-23+at+5.59.25+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5395967410757918034&quot; /&gt;&lt;/a&gt;I went ahead and enabled the filter support in WebKit, corrected some build problems caused by the Windows ports' non-use of the filter features until now.  I then fired up the resulting binary and tried out the box-shadow support.  The screenshot shows the result of this effort -- not so great.  The shadows seem to be inverted so that they are cast inside the box.  I'm not quite sure what's wrong there!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_hInRJC0BnDo/SuJUSv_GmCI/AAAAAAAAAJY/u1uBMblTQo0/s1600-h/Screen+shot+2009-10-23+at+6.11.04+PM.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_hInRJC0BnDo/SuJUSv_GmCI/AAAAAAAAAJY/u1uBMblTQo0/s320/Screen+shot+2009-10-23+at+6.11.04+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5395967984638793762&quot; /&gt;&lt;/a&gt;I also tried out the HTML5 test page he pointed out.  As you can see in this second screenshot, the filled areas shadow nicely (pretty much matching what Safari does), but that stroked areas are not shadowed.&lt;br /&gt;&lt;br /&gt;Dirk points out that stroke support will be coming, though I'm not sure how quickly that work will be completed.&lt;br /&gt;&lt;br /&gt;I'm also enabling the Skia support in WebKit for Windows, and will try these same examples on that build, hopefully this weekend.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-1998136425036058991?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebGL Now Available in WebKit Nightlies</title>
		<link href="http://webkit.org/blog/603/webgl-now-available-in-webkit-nightlies/"/>
		<id>http://webkit.org/blog/?p=603</id>
		<updated>2009-10-19T20:55:20+00:00</updated>
		<content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;
WebGL is a new standard being worked on in the &lt;a href=&quot;http://khronos.org&quot;&gt;Khronos&lt;/a&gt; consortium. The work done in Khronos is only available to its members, so I can&amp;#8217;t show you the spec just yet. But it will become public within the next few months after a review by Khronos members. The good news is that WebGL is now available in &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;WebKit nightlies&lt;/a&gt; as of October 4, 2009 (r49073). So if you&amp;#8217;re running Leopard or Snow Leopard you can try it out for yourself. WebGL runs in the HTML Canvas element, so it works very similarly to the 2D Canvas capability currently in WebKit.
&lt;/p&gt;
&lt;h3&gt;OpenGL for the Web&lt;/h3&gt;
&lt;p&gt;
OpenGL has been around for ages, so it&amp;#8217;s very mature. It can handle all the features of the most advanced graphics cards, but works across a wide variety of hardware. WebGL is based on OpenGL ES 2.0 which is a shader based API.
&lt;/p&gt;
&lt;p&gt;
WebGL is a very low level API, so it&amp;#8217;s not for the faint of heart. OpenGL&amp;#8217;s shading language, GLSL, is itself an entire programming environment. So doing even simple things in WebGL takes a lot of code. You have to load, compile and link the shaders, setup &lt;em&gt;vertex buffer objects&lt;/em&gt; to hold the shapes, and setup the variables to be passed into the shaders. Then you have to do matrix math to animate the shapes. If you want to learn more about all this before continuing, head over to the &lt;a href=&quot;http://www.opengl.org/sdk/docs/tutorials/&quot;&gt;OpenGL Site&lt;/a&gt; for some nice tutorials.
&lt;/p&gt;
&lt;h3&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;
WebGL is &lt;em&gt;really cool!&lt;/em&gt; But because it&amp;#8217;s new and still under development it isn&amp;#8217;t turned on by default. To do that, you need to go into Terminal and type this:
&lt;/p&gt;
&lt;pre&gt;
    defaults write com.apple.Safari WebKitWebGLEnabled -bool YES
&lt;/pre&gt;
&lt;p&gt;
Once you&amp;#8217;ve done that, restart the WebKit nightly build. Then click on the image below. If you see a spinning cube, you have WebGL installed and enabled. If not go back and make sure you have the latest Safari and you typed the above line correctly.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/webgl/SpiritBox.html&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/SpiritBox.jpg&quot; alt=&quot;Image of Spinning Box&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://webkit.org/blog-files/webgl/SpiritBox.html&quot;&gt;&lt;br /&gt;
    Click to see Spinning Box (requires WebGL)&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
If you don&amp;#8217;t have a nightly build, you can still see WebGL in action &lt;a href=&quot;http://www.youtube.com/watch?v=2rpKpj6ZO9w&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;h3&gt;A Simple Example&lt;/h3&gt;
&lt;p&gt;
Let&amp;#8217;s see how to create the spinning cube above. For the examples and demos here I&amp;#8217;ve created a couple of files of JavaScript utilities to help out: one with some &lt;a href=&quot;http://webkit.org/blog-files/webgl/resources/utils3d.js&quot;&gt;general utilities&lt;/a&gt; and another with a set of &lt;a href=&quot;http://webkit.org/blog-files/webgl/resources/CanvasMatrix.js&quot;&gt;matrix functions&lt;/a&gt;. These will let us focus on the different steps needed to use WebGL without worrying about the details.
&lt;/p&gt;
&lt;p&gt;
Like I said, WebGL is built on top of the Canvas Element. So just like you do for a 2D Canvas you start out by getting a CanvasRenderingContext with a call to the &lt;code&gt;getContext&lt;/code&gt; method of the Canvas Element, passing the string &amp;#8220;webkit-3d&amp;#8221; (this is temporary, and will eventually change to &amp;#8220;webgl&amp;#8221;). The returned object has a set of functions very similar to OpenGL ES 2.0.
&lt;/p&gt;
&lt;h3&gt;Using Shaders&lt;/h3&gt;
&lt;p&gt;
Nothing happen in WebGL without shaders. They take shape data and turn it into pixels on the screen. When using GLSL you define two separate shaders. The &lt;em&gt;vertex shader&lt;/em&gt; runs on each corner of every triangle being rendered. Here you transform the points, pass along the texture coordinates and use the normals to compute a lighting factor based on the &lt;em&gt;normals&lt;/em&gt; of each triangle. There is a really nice &lt;a href=&quot;http://www.lighthouse3d.com/opengl/glsl/index.php?lights&quot;&gt;GLSL Tutorial&lt;/a&gt; on lighting. GLSL gives you one special variable to store the transformed corner point, &lt;code&gt;gl_Position&lt;/code&gt;. The value stored there for each of the corners of a triangle is used to interpolate all the pixels being output. The texture coordinates and lighting factor are passed in &lt;em&gt;varying&lt;/em&gt; variables we created for the purpose.
&lt;/p&gt;
&lt;p&gt;
All these values are passed to the &lt;em&gt; fragment shader&lt;/em&gt;, which runs on each pixel of every transformed triangle passed in. This is where you get the appropriate pixel from the texture, adjust its lighting, and output the pixel. GLSL gives you a special variable for this, &lt;code&gt;gl_FragColor&lt;/code&gt;. Whatever color your store there will be the color of that pixel.
&lt;/p&gt;
&lt;p&gt;
So let&amp;#8217;s define the shaders. I&amp;#8217;ll use normal script notation here, even though HTML ignores it. It&amp;#8217;s a useful way to include GLSL. The contents of the script will be passed as a string to the &lt;code&gt;shaderSource&lt;/code&gt; function:
&lt;/p&gt;
&lt;div class=&quot;hlcode&quot;&gt;
&lt;div class=&quot;syntax&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;vshader&amp;quot;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;x-shader/x-vertex&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;syntax&quot;&gt;
&lt;pre&gt;        &lt;span class=&quot;k&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;mat4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;u_modelViewProjMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;mat4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;u_normalMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec3&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;lightDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec3&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;vNormal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;vTexCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;vPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;v_Dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec2&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;v_texCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nsv&quot;&gt;gl_Position&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;u_modelViewProjMatrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;vPosition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;v_texCoord&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;vTexCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;st&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;transNormal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;u_normalMatrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;vNormal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;v_Dot&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;transNormal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;lightDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;fshader&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;x-shader/x-fragment&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;uniform&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sampler2D&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sampler2d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;v_Dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;varying&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec2&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;v_texCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;vec2&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;texCoord&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;v_texCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;v_texCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;texture2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sampler2d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;texCoord&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nsv&quot;&gt;gl_FragColor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;vec4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;xyz&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;v_Dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The vertex shader in this example simply sends along the vertex position, &lt;code&gt;vPosition&lt;/code&gt; to the fragment shader after transforming it by a composite model-view/projection matrix. We&amp;#8217;ll get to that later. Then it passes along the texture coodinate, &lt;code&gt;vTexCoord&lt;/code&gt;, and uses the normal in &lt;code&gt;vNormal&lt;/code&gt; to compute a lighting factor, &lt;code&gt;v_Dot&lt;/code&gt; for the fragment shader. The fragment shader is even simpler. It just gets a pixel from the texture, (after flipping the texture coordinate so the image is right-side up). Then multiplies that by the lighting factor passed in from the vertex shader. This causes the pixels to be brighter when a side of the cube is facing you and darker when it is at an angle, giving it a realistic lighting effect.
&lt;/p&gt;
&lt;h3&gt;Initializing the Engine&lt;/h3&gt;
&lt;p&gt;
    Now we have to get WebGL up and running. The utility library we first loaded will help us here:
&lt;/p&gt;
&lt;div class=&quot;hlcode&quot;&gt;
&lt;div class=&quot;syntax&quot;&gt;
&lt;pre&gt;    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Initialize&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;initWebGL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// The id of the Canvas Element&lt;/span&gt;
                &lt;span class=&quot;s2&quot;&gt;&amp;quot;example1&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// The ids of the vertex and fragment shaders&lt;/span&gt;
                &lt;span class=&quot;s2&quot;&gt;&amp;quot;vshader&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;fshader&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// The vertex attribute names used by the shaders.&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// The order they appear here corresponds to their index&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// used later.&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;vNormal&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;vTexCoord&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;vPosition&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// The clear color and depth values&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Set some uniform variables for the shaders&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uniform3f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getUniformLocation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;program&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;lightDir&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uniform1i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getUniformLocation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;program&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;sampler2d&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Enable texturing&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TEXTURE_2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Create a box. On return 'gl' contains a 'box' property with the &lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// BufferObjects containing the arrays for vertices, normals, texture &lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// coords, and indices.&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;box&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;makeBox&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Load an image to use. Returns a CanvasTexture object&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;spiritTexture&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;loadImageTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;spirit.jpg&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Create some matrices to use later and save their locations in the shaders&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvMatrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CanvasMatrix4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;u_normalMatrixLoc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getUniformLocation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;program&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;u_normalMatrix&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalMatrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CanvasMatrix4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;u_modelViewProjMatrixLoc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getUniformLocation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;program&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;u_modelViewProjMatrix&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvpMatrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CanvasMatrix4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Enable all the vertex arrays&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enableVertexAttribArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enableVertexAttribArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enableVertexAttribArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Setup all the vertex attributes for vertices, normals and texCoords&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bindBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ARRAY_BUFFER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;vertexObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;vertexAttribPointer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FLOAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bindBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ARRAY_BUFFER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;vertexAttribPointer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FLOAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bindBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ARRAY_BUFFER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;texCoordObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;vertexAttribPointer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FLOAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Bind the index array&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bindBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ELEMENT_ARRAY_BUFFER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;indexObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
After this initialization we have the shaders loaded and attached to a GLSL &lt;em&gt;program&lt;/em&gt;, which is how you define the interface to your shaders. You pass &lt;em&gt;uniforms&lt;/em&gt; to a shader for values that don&amp;#8217;t change, and &lt;em&gt;vertex attributes&lt;/em&gt; for things that do, like vertices. Most of this is taken care of in the library, but you can pass additional values here, like we do with the &lt;code&gt;lightDir&lt;/code&gt; and &lt;code&gt;sampler2d&lt;/code&gt; uniforms. Here we also tell WebGL that we want to use the arrays the &lt;code&gt;makeBox()&lt;/code&gt; function set up containing the vertices, normals and texture coordinates.
&lt;/p&gt;
&lt;h3&gt;Setting Up the Viewport&lt;/h3&gt;
&lt;p&gt;
Before we can render, we have to tell the canvas how to map the objects we are drawing from &lt;em&gt;modeling coodinates&lt;/em&gt;, which is the coordinate space we defined the box in, to &lt;em&gt;viewport coordinates&lt;/em&gt;. We do that with a &lt;em&gt;transformation matrix&lt;/em&gt;. We will use a perspective projection which will make closer objects look larger than further ones, just like in the real world. Here we will use the matrix library we loaded:
&lt;/p&gt;
&lt;div class=&quot;hlcode&quot;&gt;
&lt;div class=&quot;syntax&quot;&gt;
&lt;pre&gt;    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;canvas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'example1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;canvas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clientWidth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;canvas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clientHeight&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;canvas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clientWidth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;canvas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clientHeight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Set the viewport and projection matrix for the scene&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;viewport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;perspectiveMatrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CanvasMatrix4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;perspectiveMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lookat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;perspectiveMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;perspective&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
We save the &lt;code&gt;perspectiveMatrix&lt;/code&gt; for use later. It transforms from &lt;em&gt;world coordinates&lt;/em&gt; to viewport coordinates. We will go from modeling coordinate to world coordinates in the next step.
&lt;/p&gt;
&lt;h3&gt;Drawing the Box&lt;/h3&gt;
&lt;p&gt;
Now we&amp;#8217;re all set up and we can finally draw our box. Most of the hard work is done but we still have to tell the box we want it to spin, and to do that we define a &lt;em&gt;model-view matrix&lt;/em&gt;, which transforms from modeling coordinates to world coordinates. This tells the box where and at what angle we want it to appear. Then we multiply that by the perspective matrix we saved before to complete the transformation all the way from modeling coordinates to viewport coordinates. We also turn the model-view matrix into a &lt;em&gt;normal matrix&lt;/em&gt; so it can be used to compute the proper lighting on the box:
&lt;/p&gt;
&lt;div class=&quot;hlcode&quot;&gt;
&lt;div class=&quot;syntax&quot;&gt;
&lt;pre&gt;    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;drawPicture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Make sure the canvas is sized correctly.&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Clear the canvas&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;COLOR_BUFFER_BIT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DEPTH_BUFFER_BIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Make a model/view matrix.&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;makeIdentity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentAngle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Construct the normal matrix from the model-view matrix and pass it in&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;invert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;transpose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uniformMatrix4fv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;u_normalMatrixLoc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAsCanvasFloatArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Construct the model-view * projection matrix and pass it in&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvpMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvpMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;multRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;perspectiveMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uniformMatrix4fv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;u_modelViewProjMatrixLoc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mvpMatrix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAsCanvasFloatArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Bind the texture to use&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bindTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TEXTURE_2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;spiritTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Draw the cube&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;drawElements&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TRIANGLES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;numIndices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;UNSIGNED_BYTE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Finish up.&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;gl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;flush&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Show the framerate&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;framerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;currentAngle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;incAngle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentAngle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;360&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;currentAngle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;360&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Once this is all done you simply add a JavaScript timer to keep changing the angle and rendering the box in its new position and you have a spinning box!
&lt;/p&gt;
&lt;h3&gt;Where to Next?&lt;/h3&gt;
&lt;p&gt;
So, as you can see there&amp;#8217;s a lot to learn about 3D rendering. There are some nice tutorials at the &lt;a href=&quot;http://www.opengl.org/sdk/docs/tutorials/&quot;&gt;OpenGL Site&lt;/a&gt;. Most of these are not specific to OpenGL ES 2.0, so you&amp;#8217;ll have to figure out what features are and are not available. Unfortunately there aren&amp;#8217;t a lot of specific ES 2.0 examples yet. But I think these tutorials will give you a good start. There&amp;#8217;s also a great book specifically about OpenGL ES 2.0 called the &lt;a href=&quot;http://opengles-book.com/&quot;&gt;OpenGL ES 2.0 Programming Guide&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
There are also a few WebGL examples in the wild already. Check them out &lt;a href=&quot;http://wakaba.c3.cx/w/puls.html&quot;&gt;here&lt;/a&gt;, &lt;a href=&quot;http://wakaba.c3.cx/w/escher_droste.html&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://3bb.cc/projects/webgl/test1/&quot;&gt;here&lt;/a&gt;. WebKit has a few samples as well:
&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/SpinningBox.html&quot;&gt;Spinning Box&lt;/a&gt;
        &lt;/td&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/SpinningBox.html&quot;&gt;&lt;br /&gt;
            &lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/SpinningBoxThumb.jpg&quot; /&gt;&lt;br /&gt;
            &lt;/a&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/Earth.html&quot;&gt;Earth&lt;/a&gt;
        &lt;/td&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/Earth.html&quot;&gt;&lt;br /&gt;
            &lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/EarthThumb.jpg&quot; /&gt;&lt;br /&gt;
            &lt;/a&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/ManyPlanetsDeep.html&quot;&gt;Many Planets&lt;/a&gt;
        &lt;/td&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/ManyPlanetsDeep.html&quot;&gt;&lt;br /&gt;
            &lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/ManyPlanetsDeepThumb.jpg&quot; /&gt;&lt;br /&gt;
            &lt;/a&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/TeapotPerVertex.html&quot;&gt;Teapot per-vertex&lt;/a&gt;
        &lt;/td&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/TeapotPerVertex.html&quot;&gt;&lt;br /&gt;
            &lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/TeapotPerVertexThumb.jpg&quot; /&gt;&lt;br /&gt;
            &lt;/a&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/TeapotPerPixel.html&quot;&gt;Teapot per-pixel&lt;/a&gt;
        &lt;/td&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/TeapotPerPixel.html&quot;&gt;&lt;br /&gt;
            &lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/TeapotPerPixelThumb.jpg&quot; /&gt;&lt;br /&gt;
            &lt;/a&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/WebGL+CSS.html&quot;&gt;WebGL+CSS Animation&lt;/a&gt;
        &lt;/td&gt;
&lt;td&gt;
            &lt;a href=&quot;http://webkit.org/blog-files/webgl/WebGL+CSS.html&quot;&gt;&lt;br /&gt;
            &lt;img src=&quot;http://webkit.org/blog-files/webgl/resources/WebGL+CSSThumb.jpg&quot; /&gt;&lt;br /&gt;
            &lt;/a&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Exploring Skia</title>
		<link href="http://whtconstruct.blogspot.com/2009/10/exploring-skia.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-5860927637783195970</id>
		<updated>2009-10-18T22:53:18+00:00</updated>
		<content type="html">&lt;a href=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/StveDsgqSMI/AAAAAAAAAJI/dFdPdLz-44Q/s1600-h/Screen+shot+2009-10-18+at+8.05.00+PM.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/StveDsgqSMI/AAAAAAAAAJI/dFdPdLz-44Q/s320/Screen+shot+2009-10-18+at+8.05.00+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5394149133775423682&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Someone recently asked me about the state of shadow support in the Windows Cairo ports of WebKit.  As it turns out, the answer is a firm 'it doesn't work.'  The reason for this lies in the underlying &lt;a href=&quot;http://www.cairographics.org&quot;&gt;Cairo&lt;/a&gt; graphics library.  It doesn't support shadow effects as part of the path rendering.  Consequently, programs like &lt;a href=&quot;http://www.mozilla.com/firefox/&quot;&gt;Firefox&lt;/a&gt; have to generate shadow effects in a separate drawing pass, rather than specifying the 'form' of the shadow and allowing it to be drawn with the main drawing element.&lt;br /&gt;&lt;br /&gt;Unfortunately, WebKit's drawing model assumes an underlying graphing system that supports toggling shadows on and off during the rendering of a page.  Attempting to shoehorn shadow effects into WebKit (using Cairo) would involve adding extra logic into the drawing system to perform shadow strokes, manually tracking the shadow state somehow and making sure to only perform the extra shadow drawing when needed.&lt;br /&gt;&lt;br /&gt;However, another option is to look at using &lt;a href=&quot;http://code.google.com/p/skia/&quot;&gt;Skia&lt;/a&gt;, Google's custom drawing library used on their &lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt; browser's port of WebKit.  In case you are unfamiliar with the project, Skia is a 2D graphic library for drawing Text, Geometries, and Images.  It has built in support for some 3D perspective effects, antialiasing, transparency, and various effects.  It has good support for hardware acceleration, and runs on a wide range of hardware platforms.&lt;br /&gt;&lt;br /&gt;The bad news is that information about building and running Skia under Windows is pretty non-existant.  Clearly it is possible, since all ports of Chrome (including Windows) use Skia, but they project provides no project files (or scons or gyp files), and the gyp files used in the Chromium project don't work outside of the Chromium source tree.&lt;br /&gt;&lt;br /&gt;Happily, it's not too hard to figure out which files need to be included in the build, and I &lt;a href=&quot;http://groups.google.com/group/skia-discuss/browse_thread/thread/6f83bfba70a3366c/541327fe8b781516?lnk=gst&amp;q=Windows#541327fe8b781516&quot;&gt;found a post&lt;/a&gt; by a guy who had gotten things building back in May.  Consequently, after a couple of hours of work I was able to get a test application up and running to play with the core library and confirm that it functions properly.  I was then able to explore the API a little bit, and confirm that shadows work as expected.&lt;br /&gt;&lt;br /&gt;My initial impressions of Skia are very positive.  It's nice working with a C++ framework, rather than Cairo's very strict C interface.  One puzzling thing about Skia is that the Chromium project has built an extremely useful &lt;a href=&quot;http://src.chromium.org/viewvc/chrome/trunk/src/skia/&quot;&gt;set of abstractions&lt;/a&gt; on top of Skia that seem like they would be well-suited for inclusion.  For example, constructing a context for a typical Windows device involves a few steps.  But the skia::PlatformCanvasPaint template class takes care of many of these details (as well as cleaning up after itself).  Equivalent templates are provided for GTK+ and Mac use.  Why leave this in Chromium's private repository?  This is useful for everyone!&lt;br /&gt;&lt;br /&gt;Over the next week or so I intend to revise the Windows Cairo port to use Skia for its graphical back-end.  As a first step, I have updated my &lt;a href=&quot;http://files.me.com/bfulgham/iay8p5&quot;&gt;requirements.zip&lt;/a&gt; file with Skia and it's include files.  I have also posted my &lt;a href=&quot;http://files.me.com/bfulgham/x4dn6s&quot;&gt;source tree&lt;/a&gt; for Skia, including the Visual Studio solution and my test application (based on WinLauncher).&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-5860927637783195970?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Pavel Feldman and Dmitry Titov are now WebKit reviewers.</title>
		<link href="http://webkit.org/blog/793/pavel-feldman-and-dmitry-titov-are-now-webkit-reviewers/"/>
		<id>http://webkit.org/blog/?p=793</id>
		<updated>2009-10-13T21:51:22+00:00</updated>
		<content type="html">&lt;p&gt;Pavel has contributed some great new features for the Web Inspector and spent a lot of time on the Web Inspector to help unfork the Chromium port.  Dmitry has worked on timers, workers, test improvements, and various other enhancements.&lt;/p&gt;
&lt;p&gt;Please join me in congratulating Pavel and Dmitry on their reviewer status!&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">What is the size of a QList::Data, RenderObject?</title>
		<link href="http://zecke.blogspot.com/2009/10/what-is-size-of-qlistdata-renderobject.html"/>
		<id>tag:blogger.com,1999:blog-13875843.post-674094308984353369</id>
		<updated>2009-10-12T07:09:07+00:00</updated>
		<content type="html">We tend to write classes without really caring about what the compile will do to create the binary file. When looking into performance and specially memory usage and you create certain objects thousands of times it becomes interesting of how much memory one is wasting for padding/no good reason.&lt;br /&gt;&lt;br /&gt;The Linux kernel hackers wrote a tool called &lt;a href=&quot;http://git.kernel.org/?p=linux/kernel/git/acme/pahole.git;a=summary&quot;&gt;pahole&lt;/a&gt; that will analyze the DWARF2 symbols and then spit out friendly messages like the one below.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        struct Data {&lt;br /&gt;                class QBasicAtomicInt     ref;                   /*     0     4 */&lt;br /&gt;                int                        alloc;                /*     4     4 */&lt;br /&gt;                int                        begin;                /*     8     4 */&lt;br /&gt;                int                        end;                  /*    12     4 */&lt;br /&gt;                uint                       sharable:1;           /*    16:31  4 */&lt;br /&gt;&lt;br /&gt;                /* XXX 31 bits hole, try to pack */&lt;br /&gt;&lt;br /&gt;                void *                     array[1];             /*    20     4 */&lt;br /&gt;&lt;br /&gt;                /* size: 24, cachelines: 1, members: 6 */&lt;br /&gt;                /* bit holes: 1, sum bit holes: 31 bits */&lt;br /&gt;                /* last cacheline: 24 bytes */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case QList::Data could have used at least three bytes less memory and changing the definition of sharable and array would have removed a whole in the struct. Maybe that is something for Qt5 to keep in mind.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The research question. Can QtWebKit memory usage be reduced by shrinking some of the Qt structs without losing functionality?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13875843-674094308984353369?l=zecke.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>zecke</name>
			<email>noreply@blogger.com</email>
			<uri>http://zecke.blogspot.com/search/label/WebKit</uri>
		</author>
		<source>
			<title type="html">Some Blog</title>
			<subtitle type="html">Some random thoughts</subtitle>
			<link rel="self" href="http://zecke.blogspot.com/feeds/posts/full/-/WebKit"/>
			<id>tag:blogger.com,1999:blog-13875843</id>
			<updated>2009-11-21T11:53:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">QtWebKit on the road towards Qt 4.6</title>
		<link href="http://labs.trolltech.com/blogs/2009/10/11/qtwebkit-on-the-road-towards-qt-46/"/>
		<id>http://labs.trolltech.com/blogs/2009/10/11/qtwebkit-on-the-road-towards-qt-46/</id>
		<updated>2009-10-11T15:18:07+00:00</updated>
		<content type="html">&lt;p&gt;I don&amp;#8217;t mean &amp;#8220;on the road&amp;#8221; too literal, but I think we&amp;#8217;re on track for a good release, as the following summary of recent changes shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kenneth and Antonio fixed the inconsistent behaviour of &lt;code&gt;setHtml()&lt;/code&gt; to sometimes change the history and sometimes not. Simply put, &lt;code&gt;setHtml()&lt;/code&gt; should not have any side-effects to the back-forward history.&lt;/li&gt;
&lt;li&gt;Joe, Kristian and Janne fixed support for input methods on S60, so for example logging into facebook from Anomaly on a 5800 Xpressmusic works.&lt;/li&gt;
&lt;li&gt;Alexis renamed &lt;code&gt;QWebGraphicsItem&lt;/code&gt; to &lt;code&gt;QGraphicsWebView&lt;/code&gt;, and Raider is now called Twix &lt;img src=&quot;http://labs.trolltech.com/blogs/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;li&gt;J-P Nurmi fixed support for plugins returned by &lt;code&gt;QWebPluginFactory&lt;/code&gt; when used with &lt;code&gt;QGraphicsWebView&lt;/code&gt; in a canvas: &lt;code&gt;QGraphicsWidget&lt;/code&gt; to the rescue.&lt;/li&gt;
&lt;li&gt;Girish joined the jungle of WebKit hacking and landed initial support for windowless plugins on X11!&lt;/li&gt;
&lt;li&gt;Jocelyn found out why nspluginwrapper wasn&amp;#8217;t working properly on Linux and fixed it.&lt;/li&gt;
&lt;li&gt;After a long period of review (sorry buddy) we finally landed Jakubs split of the XSLT processor in WebCore to support libxslt as well as QXmlPatterns.&lt;/li&gt;
&lt;li&gt;Carol fixed various bugs in GraphicsContextQt for better CSS shadow support.&lt;/li&gt;
&lt;li&gt;Holger landed his rewrite of &lt;code&gt;ImageDecoderQt&lt;/code&gt; that significantly improves the memory footprint. You can find some background for his work at &lt;a href=&quot;http://trac.webkit.org/wiki/QtWebKitPerformanceWork&quot;&gt;http://trac.webkit.org/wiki/QtWebKitPerformanceWork&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not all of the above changes are in Qt&amp;#8217;s 4.6 branch yet, as we&amp;#8217;re trying to reduce the number of changes for the upcoming beta. But rest assured they&amp;#8217;ll be in the final release. In the meantime you can always check out from WebKit&amp;#8217;s trunk &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;
&lt;p&gt;I for one am now looking forward to meet many of you readers at the upcoming Developer Days in Munich and San Francisco.&lt;/p&gt;</content>
		<author>
			<name>Simon</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The effect of TCmalloc in the QtWebKit port - stage 1: Performance</title>
		<link href="http://webkit.sed.hu/node/23"/>
		<id>http://webkit.sed.hu/23 at http://webkit.sed.hu</id>
		<updated>2009-10-07T13:02:57+00:00</updated>
		<content type="html">&lt;p&gt;Much time has passed since we started to work on the custom allocation framework with Paul Pedriana. The core of the solution (&lt;a href=&quot;http://trac.webkit.org/browser/trunk/JavaScriptCore/wtf/FastAllocBase.h&quot; target=&quot;_blank&quot;&gt;FastAllocBase class&lt;/a&gt;, &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=20422&quot; target=&quot;_blank&quot;&gt;bug #20422&lt;/a&gt;) was landed into the trunk half year ago.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.sed.hu/node/23&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>University of Szeged</name>
			<uri>http://webkit.sed.hu</uri>
		</author>
		<source>
			<title type="html">WebKit Apocrypha</title>
			<link rel="self" href="http://webkit.sed.hu/rss.xml"/>
			<id>http://webkit.sed.hu/rss.xml</id>
			<updated>2009-11-21T22:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">You know what, this clutter thing is cool</title>
		<link href="http://blog.kov.eti.br/?p=92"/>
		<id>http://blog.kov.eti.br/?p=92</id>
		<updated>2009-10-02T23:49:18+00:00</updated>
		<content type="html">&lt;p&gt;One of my awesome colleagues from &lt;a href=&quot;http://www.collabora.co.uk/&quot;&gt;Collabora&lt;/a&gt;, &lt;a href=&quot;http://dannipenguin.livejournal.com/&quot;&gt;Danielle Madeley&lt;/a&gt;, has done various improvements to the clutter-gtk project started by the also awesome &lt;a href=&quot;http://blogs.gnome.org/alexl/&quot;&gt;Alexander Larsson&lt;/a&gt;. Reading her blog I was so impressed with &lt;a href=&quot;http://dannipenguin.livejournal.com/280866.html&quot;&gt;this post&lt;/a&gt;, that I decided to spend some free time to try out some crazy, experimental stuff using that.&lt;/p&gt;
&lt;p&gt;What I did was create a very simple GTK+ widget that derives from GtkClutterEmbed, and works as a somewhat replacement for GtkNotebook, called, proving how bad I am at naming things, &lt;a href=&quot;http://gitorious.org/gkoverview/gkoverview&quot;&gt;GkOverview&lt;/a&gt;. Like I said, it&amp;#8217;s not really stable or well-done, it doesn&amp;#8217;t even free its resources (in fact, it doesn&amp;#8217;t even have implementations for finalize and dispose!), it&amp;#8217;s really just an experiment.&lt;/p&gt;
&lt;p&gt;What GkOverview does is provide a simple API for you to append widgets into it, and it is able to show you one of those widgets, or an overview of all of them. This is quite simple, and yet very powerful. With the help of my &lt;a href=&quot;http://fujii.iaaeee.org/diario/&quot;&gt;significant other&lt;/a&gt;, I have got a layout of the widgets in the overview that I really like.&lt;/p&gt;
&lt;p&gt;Of course I used &lt;a href=&quot;http://webkitgtk.org/&quot;&gt;WebKitGTK+&lt;/a&gt; to try it out, what else? And since I had effectivelly, at least in my head, created a fairly convincible replacement for GtkNotebook functionality, I decided a second challenge I could take on myself was to make my preferred browser, Epiphany, use that instead of its EphyNotebook widget. Epiphany being quite well-designed, replacing EphyNotebook was quite a breeze, and here&amp;#8217;s &lt;a href=&quot;http://gitorious.org/~kov/epiphany/kov-sandbox/commits/cluttered&quot;&gt;the result&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Before I go on, let me repeat it: this is all crappy, experimental, curiosity-induced work. It may be that in the future we can use stuff like this to make, say, improving the back/forward mechanism, history navigation, as other browsers do, replacing tabs with a better UI mechanism, and whatnot.&lt;/p&gt;
&lt;p&gt;A couple videos, for your pleasure (I was finally able to create a nice video, using Byzanz =)):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://kov.eti.br/media/webkit/overview.gif&quot; alt=&quot;GkOverview show off&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Gustavo Noronha</name>
			<uri>http://blog.kov.eti.br</uri>
		</author>
		<source>
			<title type="html">Gustavo Noronha (kov) » webkit</title>
			<subtitle type="html">um hacker debiano que mora num lugar chamado mundo</subtitle>
			<link rel="self" href="http://blog.kov.eti.br/wp-rss2.php?cat=16"/>
			<id>http://blog.kov.eti.br/wp-rss2.php?cat=16</id>
			<updated>2009-11-10T20:53:19+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Memory profiling on GNU systems</title>
		<link href="http://zecke.blogspot.com/2009/10/memory-profiling-on-gnu-systems.html"/>
		<id>tag:blogger.com,1999:blog-13875843.post-7316751175298989647</id>
		<updated>2009-10-02T07:05:09+00:00</updated>
		<content type="html">This is a small guide on how to observe memory allocations of a process. When carrying out a change it is not only of interest if all test cases still pass, if the benchmarks are faster but it is also important to figure out if there was a change in storage (stack and RAM) requirement.&lt;br /&gt;&lt;br /&gt;If you are using the GNU libc it is likely you have a &lt;b&gt;/lib/libmemusage.so&lt;/b&gt; installed on your system. This library can be preloaded using LD_PRELOAD and will intercept calls to malloc,free,realloc and various other calls. In short it will trace memory allocations for you. The limitation of that tool is that it will not tell you how much memory the kernel actually mapped, anything about memory fragmentation, etc.&lt;br /&gt;&lt;br /&gt;To use libmemusage all you have to do is to prepend &lt;b&gt;MEMUSAGE_OUTPUT=mytrace&lt;/b&gt; and &lt;b&gt;LD_PRELOAD=/lib/libmemusage.so&lt;/b&gt; to your application. This will instruct the library to write out a trace to the mytrace file.&lt;br /&gt;&lt;br /&gt;This trace file can be converted to a graph using the memusagestat utility. It is not installed by most GNU distributions and can be either build from the glibc sources or from the QtWebKit performance measurement &lt;a href=&quot;http://gitorious.org/qtwebkit/performance/trees/master/memusagestat&quot;&gt;utilities&lt;/a&gt;. Using &lt;code&gt;memusagestat -o output.png mytrace&lt;/code&gt; an image with memory allocations and stack usage like the one at the end of this post will be created. The redline is the heap usage, the green one is the stack usage of the application. The x-scale is the number of allocations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTES:&lt;/b&gt; As of today the graph creation with the x-Axis being the time is broken as the generated trace file has some issues, I'm looking into the problem but it will take some more days.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/16845425@N00/3972974017/&quot; title=&quot;memusage on qtwebkit by zecke, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2564/3972974017_4540d671bf_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;memusage on qtwebkit&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13875843-7316751175298989647?l=zecke.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>zecke</name>
			<email>noreply@blogger.com</email>
			<uri>http://zecke.blogspot.com/search/label/WebKit</uri>
		</author>
		<source>
			<title type="html">Some Blog</title>
			<subtitle type="html">Some random thoughts</subtitle>
			<link rel="self" href="http://zecke.blogspot.com/feeds/posts/full/-/WebKit"/>
			<id>tag:blogger.com,1999:blog-13875843</id>
			<updated>2009-11-21T11:53:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Updates from QtWebKit Land</title>
		<link href="http://labs.trolltech.com/blogs/2009/09/29/updates-from-qtwebkit-land/"/>
		<id>http://labs.trolltech.com/blogs/2009/09/29/updates-from-qtwebkit-land/</id>
		<updated>2009-09-29T08:09:41+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;ll make this short and sweet and to the point :). Many things happened in the past few weeks in the land of the QtWebKit port:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kenneth and Antonio landed the first version of &lt;code&gt;QWebGraphicsItem&lt;/code&gt;, a simple class that mimics the QWebView API and makes it easy to embed WebKit into the GraphicsView. The API and class name are still subject to change, but we&amp;#8217;d love to hear feedback and suggestions, especially from people who have implemented the same thing &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;/li&gt;
&lt;li&gt;Jocelyn submitted &lt;code&gt;QWebInspector&lt;/code&gt;, a simple container that gives you control over embedding the web inspector into your application. The API is deliberately minimal to avoid exposing internals.&lt;/li&gt;
&lt;li&gt;Tor Arne used his scripting skillz to migrate QtWebKit bugs from our internal company bug tracker into the public WebKit bugzilla. An important milestone towards a more transparent development process on our side.&lt;/li&gt;
&lt;li&gt;Yongjun, Janne and Norbert keep on submitting Symbian porting fixes. RVCT builds and runs out of the trunk and WINSCW is very close.&lt;/li&gt;
&lt;li&gt;We have updated the copy of WebKit in Qt 4.6 a few times and will continue to do so in the coming weeks towards the 4.6 release. Espen and Janne are also working on getting those WebKit and QtScript Symbian builds into the nightly Qt/S60 snapshots. &lt;strong&gt;UPDATE:&lt;/strong&gt;The &lt;a href=&quot;http://pepper.troll.no/s60prereleases/snapshots/&quot;&gt;latest Qt/S60 nightly&lt;/a&gt; includes QtWebKit and QtScript now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generally speaking we&amp;#8217;re in bugfixing mode. We had to slip in the above few features, but we consider them the exception to the rule. Until 4.6 we&amp;#8217;d like to hold off any other changes that affect the API, unless they are actually API bugs or the result of review of new 4.6 API.&lt;/p&gt;</content>
		<author>
			<name>Simon</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Updated WebKit SDK (@r48761)</title>
		<link href="http://whtconstruct.blogspot.com/2009/09/updated-webkit-sdk-r48761.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-6064216471770701</id>
		<updated>2009-09-25T18:42:59+00:00</updated>
		<content type="html">I have updated the &lt;a href=&quot;http://files.me.com/bfulgham/b1o202&quot;&gt;WebKitSDK&lt;/a&gt; and &lt;a href=&quot;http://files.me.com/bfulgham/iay8p5&quot;&gt;requirements.zip&lt;/a&gt; to correspond to SVN revision r48761.&lt;br /&gt;&lt;br /&gt;Major changes in this revision:&lt;br /&gt;* Support for user stylesheet injection.&lt;br /&gt;* Fixes for various layout/rendering issues.&lt;br /&gt;* Various stability and memory improvements.&lt;br /&gt;&lt;br /&gt;This bundle also includes Snow Leopard-era CoreFoundation (CFLite), so please let me know if you encounter any strange problems.&lt;br /&gt;&lt;br /&gt;The recent WebKit improvements have corrected a few rendering issues I have experienced in the past, so please give this build a try and let me know if you encounter any problems.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-6064216471770701?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Daily binaries of Qt for Symbian/S60 available</title>
		<link href="http://labs.trolltech.com/blogs/2009/09/24/daily-binaries-of-qt-for-symbians60-available/"/>
		<id>http://labs.trolltech.com/blogs/2009/09/24/daily-binaries-of-qt-for-symbians60-available/</id>
		<updated>2009-09-24T10:00:30+00:00</updated>
		<content type="html">&lt;p&gt;I promised you daily builds of Qt for Symbian/S60 a few weeks ago, and here they are. Every night at around 02:30 new binaries will be available.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;br /&gt;
&lt;big&gt;&lt;br /&gt;
&lt;a href=&quot;http://pepper.troll.no/s60prereleases/snapshots/&quot;&gt;Download the latest binaries from here!&lt;/a&gt;&lt;br /&gt;
&lt;/big&gt;&lt;br /&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;There are two types of files available. You want the latest &lt;code&gt;qt-embedded-s60-opensourceYYYYMMDD-4.6.0-tp1.exe&lt;/code&gt; file. The other &lt;code&gt;qt-embedded-s60-opensource-src-4.6.0-tp1.zip&lt;/code&gt; is the source package used to create the latest &lt;code&gt;.exe&lt;/code&gt; and can mostly be ignored. The .exe contains a Windows Installer as shown below, and here is&lt;a href=&quot;http://doc.trolltech.com/4.6-snapshot/install-s60-installer.html&quot;&gt; instructions on how to use it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;br /&gt;
&lt;a href=&quot;http://pepper.troll.no/s60prereleases/snapshots/&quot;&gt;&lt;img src=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/binsnapshotsinstaller.png&quot; alt=&quot;Qt installer&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;There are three Qt &lt;code&gt;.sis&lt;/code&gt; files included in the .exe. Most of you (unless you work at Nokia and have an RnD phone) wants to install the &lt;code&gt;qt_for_s60_selfsigned.sis&lt;/code&gt; together with the &lt;code&gt;fluidlauncher.sis&lt;/code&gt; or whatever application you&amp;#8217;re creating yourself.&lt;/p&gt;
&lt;p&gt;Works for S60 3.1, 3.2 and 5.0. If you&amp;#8217;re using some funky internal RnD SDK, it &lt;em&gt;might&lt;/em&gt; work (Hint: use the the &amp;#8220;Choose additional folder(s)&amp;#8221; option if you&amp;#8217;re SDK is not in &lt;code&gt;devices.xml&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The code we&amp;#8217;re building from is whatever is HEAD of &lt;a href=&quot;http://qt.gitorious.org/qt/qt/commits/4.6&quot;&gt;http://qt.gitorious.org/qt/qt/commits/4.6&lt;/a&gt;. In other words if we break the build, no binaries for that day - oh well. At the moment QtScript and QtWekbit are &lt;em&gt;still not there&lt;/em&gt; - but soon my friends, soooon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; As of 2009.09.29 the snapshots contains QtScript and QtWekbit as well. Yay we&amp;#8217;re so &lt;em&gt;great!&lt;/em&gt;.&lt;br /&gt;
&lt;strong&gt;Update2:&lt;/strong&gt; Well, we&amp;#8217;re not that great it seems. The .dlls gets copied to your epoc32, but they&amp;#8217;re not inlucded in the Qt_libs sis files. Fixed now, should be correct in tomorrows snapshots.&lt;br /&gt;
&lt;strong&gt;Update3:&lt;/strong&gt; Yepp - was fixed today :D.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
&lt;strong&gt;&lt;em&gt;Final disclaimer: This is not product quality software. It might make your phone depressed and make kittens cry. Use at your own risk.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;</content>
		<author>
			<name>espenr</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Introducing Google Chrome Frame</title>
		<link href="http://blog.chromium.org/2009/09/introducing-google-chrome-frame.html"/>
		<id>tag:blogger.com,1999:blog-2471378914199150966.post-5552095739338921653</id>
		<updated>2009-09-22T18:21:00+00:00</updated>
		<content type="html">&lt;div&gt;Today, we're releasing an early version of &lt;a href=&quot;http://code.google.com/chrome/chromeframe&quot;&gt;Google Chrome Frame&lt;/a&gt;, an open source plug-in that brings HTML5 and other open web technologies to Internet Explorer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're building Google Chrome Frame to help web developers deliver faster, richer applications like &lt;a href=&quot;http://googlewavedev.blogspot.com/2009/09/google-wave-in-internet-explorer.html&quot;&gt;Google Wave&lt;/a&gt;. Recent JavaScript performance improvements and the emergence of HTML5 have enabled web applications to do things that could previously only be done by desktop software. One challenge developers face in using these new technologies is that they are not yet supported by Internet Explorer. Developers can't afford to ignore IE &amp;#8212; most people use some version of IE &amp;#8212; so they end up spending lots of time implementing work-arounds or limiting the functionality of their apps.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With Google Chrome Frame, developers can now take advantage of the latest open web technologies, even in Internet Explorer. From a faster Javascript engine,  to support for current web technologies like HTML5's offline capabilities and &amp;lt;canvas&amp;gt;, to modern CSS/Layout handling, Google Chrome Frame enables these features within IE with no additional coding or testing for different browser versions. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To start using Google Chrome Frame, all developers need to do is to add a &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx&quot;&gt;single tag&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;chrome=1&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When Google Chrome Frame detects this tag it switches automatically to using Google Chrome's speedy &lt;a href=&quot;http://www.webkit.org/&quot;&gt;WebKit-based&lt;/a&gt; rendering engine. It's that easy. For users, installing Google Chrome Frame will allow them to seamlessly enjoy modern web apps at blazing speeds, through the familiar interface of the version of IE that they are currently using.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We believe that Google Chrome Frame makes life easier for web developers as well as users. While this is still an early version intended for developers, our team invites you to try out this for your site. You can start by reading our &lt;a href=&quot;http://code.google.com/chrome/chromeframe/developers_guide.html&quot;&gt;documentation&lt;/a&gt;. Please share your feedback in our &lt;a href=&quot;http://groups.google.com/group/google-chrome-frame&quot;&gt;discussion group&lt;/a&gt; and file any bugs you find through the Chromium &lt;a href=&quot;http://code.google.com/p/chromium/issues/list&quot;&gt;issue tracker&lt;/a&gt;.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;     &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class=&quot;post-author&quot;&gt;Posted by Amit Joshi, Software Engineer, Alex Russell, Software Engineer and Mike Smith, Product Manager &lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2471378914199150966-5552095739338921653?l=blog.chromium.org&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ian Fette</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.chromium.org/</uri>
		</author>
		<source>
			<title type="html">Chromium Blog</title>
			<link rel="self" href="http://blog.chromium.org/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-2471378914199150966</id>
			<updated>2009-11-21T21:53:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit Page Cache II – The unload Event</title>
		<link href="http://webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/"/>
		<id>http://webkit.org/blog/?p=516</id>
		<updated>2009-09-21T23:29:33+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog/427/webkit-page-cache-i-the-basics/&quot;&gt;Previously&lt;/a&gt; I touched on what exactly the Page Cache does and outlined some of the improvements we&amp;#8217;re working on.&lt;/p&gt;
&lt;p&gt;This post is geared towards web developers and is therefore even more technical than the last.&lt;/p&gt;
&lt;p&gt;In this article I&amp;#8217;d like to talk more about unload event handlers, why they prevent pages from going into the Page Cache, and what can be done to make things better.&lt;/p&gt;
&lt;h3&gt;Load/Unload Event Handlers&lt;/h3&gt;
&lt;p&gt;Web developers can make use of the load and unload events to do work at certain points in the lifetime of a web page.&lt;/p&gt;
&lt;p&gt;The purpose of the load event is quite straightforward: To perform initial setup of a new page once it has loaded.&lt;/p&gt;
&lt;p&gt;The unload event is comparatively mysterious.  Whenever the user leaves a page it is &amp;#8220;unloaded&amp;#8221; and scripts can do some final cleanup.&lt;/p&gt;
&lt;p&gt;The mysterious part is that &amp;#8220;leaving the page&amp;#8221; can mean one of a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The user closes the browser tab or window, resulting in the destruction of the visible page.&lt;/li&gt;
&lt;li&gt;The browser navigates from the old page to a new page, resulting in the destruction of the old visible page.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Page Cache makes this even more interesting by adding a new navigation possibility:&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;The browser navigates from the old page to a new page, but the old visible page is suspended, hidden, and placed in the Page Cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The Status Quo&lt;/h3&gt;
&lt;p&gt;Unload event handlers are meant to do some final cleanup when the visible page is about to be destroyed.  But if the page goes into the Page Cache it becomes suspended, is hidden, and is not immediately torn down.  This brings up interesting complications.&lt;/p&gt;
&lt;p&gt;If we fire the unload event when going into the Page Cache, then the handler might be destructive and render the page useless when the user returns.&lt;/p&gt;
&lt;p&gt;If we fire the unload event every time a page is left, including each time it goes into the Page Cache and when it is eventually destroyed, then the handler might do important work multiple times that it was critical to only do once.&lt;/p&gt;
&lt;p&gt;If we don&amp;#8217;t fire the unload event when going into the Page Cache, then we face the possibility that the page will be destroyed while it is suspended and hidden, and the unload handler might never be run.&lt;/p&gt;
&lt;p&gt;If we don&amp;#8217;t fire the unload event when going into the Page Cache but consider firing it whenever the suspended page is eventually destroyed, then we&amp;#8217;re considering the possibility of doing something that&amp;#8217;s never been done before: Executing scripts that belong to an invisible web page that has had its &amp;#8220;pause&amp;#8221; button pressed.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s all sorts of obstacles in making this work well including technological hurdles, security concerns, and user-experience considerations.&lt;/p&gt;
&lt;p&gt;Since there is no clear solution for handling such pages the major browsers vendors have all come to the same conclusion: Don&amp;#8217;t cache these pages.&lt;/p&gt;
&lt;h3&gt;How You Can Help&lt;/h3&gt;
&lt;p&gt;Web developers have a few things they can do to help their pages be cacheable.&lt;/p&gt;
&lt;p&gt;One is to only install the unload event handler if the code is relevant to the current browser.  For example, we&amp;#8217;ve seen unload handlers similar to the following:&lt;/p&gt;
&lt;pre&gt;
    function unloadHandler()
    {
        if (_scriptSettings.browser.isIE) {
            // Run some unload code for Internet Explorer
            ...
        }
    }
&lt;/pre&gt;
&lt;p&gt;In all browsers other than Internet Explorer this code does nothing, but its mere existence potentially slows down their user experience.  This developer should&amp;#8217;ve done the browser check *before* installing the unload handler.&lt;/p&gt;
&lt;p&gt;Another way developers can improve things is to only install the unload event handler when the page has a need to listen for it, then remove it once that reason has passed.&lt;/p&gt;
&lt;p&gt;For example the user might be working on a draft of a document so the developer installs an unload handler to make sure the draft gets saved before the page is left.  But they also start a timer to automatically save it every minute or so.  If the timer fires, the document draft is saved, and the user doesn&amp;#8217;t make any further changes, the unload handler should be removed.&lt;/p&gt;
&lt;p&gt;Particularly savvy developers might consider a third option.&lt;/p&gt;
&lt;h3&gt;A Replacement For Unload&lt;/h3&gt;
&lt;p&gt;Some time ago Mozilla approached this problem differently by inventing a replacement for load/unload events.&lt;/p&gt;
&lt;p&gt;The load and unload events are meant to be fired exactly once, and this is the underlying cause of the problem.  The &lt;a href=&quot;https://developer.mozilla.org/En/Using_Firefox_1.5_caching#New_browser_events&quot;&gt;pageshow/pagehide&lt;/a&gt; events &amp;#8211; which we&amp;#8217;ve implemented in WebKit as of &lt;a href=&quot;http://trac.webkit.org/changeset/47824&quot;&gt;revision 47824&lt;/a&gt; &amp;#8211; address this.&lt;/p&gt;
&lt;p&gt;Despite their name the pageshow/pagehide events don&amp;#8217;t have anything to do with whether or not the page is actually visible on the screen.  They won&amp;#8217;t fire when you minimize the window or switch tabs, for example.&lt;/p&gt;
&lt;p&gt;What they do is augment load/unload to work in more situations involving navigation.  Consider this example of how load/unload event handlers might be used:&lt;/p&gt;
&lt;pre&gt;
    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;script&amp;gt;

    function pageLoaded()
    {
        alert(&quot;load event handler called.&quot;);
    }

    function pageUnloaded()
    {
        alert(&quot;unload event handler called.&quot;);
    }

    window.addEventListener(&quot;load&quot;, pageLoaded, false);
    window.addEventListener(&quot;unload&quot;, pageUnloaded, false);

    &amp;lt;/script&amp;gt;
    &amp;lt;body&amp;gt;
    &amp;lt;a href=&quot;http://www.webkit.org/&quot;&amp;gt;Click for WebKit&amp;lt;/a&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/load-unload-example.html&quot; target=&quot;_blank&quot;&gt;Click here&lt;/a&gt; to view this example in a new window, in case you can&amp;#8217;t guess what it does.&lt;/p&gt;
&lt;p&gt;Try clicking the link to leave the page then press the back button.  Pretty straightforward.&lt;/p&gt;
&lt;p&gt;The pageshow/pagehide fire when load/unload do, but also have one more trick up their sleeve.&lt;/p&gt;
&lt;p&gt;Instead of firing only at the single discrete moment when a page is &amp;#8220;loaded&amp;#8221; the pageshow event is also fired when pages are restored from the Page Cache.&lt;/p&gt;
&lt;p&gt;Similarly the pagehide event fires when the unload event fires but also when a page is suspended into the Page Cache.&lt;/p&gt;
&lt;p&gt;By including an additional property on the event called &amp;#8220;persisted&amp;#8221; the events tell the page whether they represent the load/unload events or saving/restoring from the Page Cache.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the same example using pageshow/pagehide:&lt;/p&gt;
&lt;pre&gt;
    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;script&amp;gt;

    function pageShown(evt)
    {
        if (evt.persisted)
            alert(&quot;pageshow event handler called.  The page was just restored from the Page Cache.&quot;);
        else
            alert(&quot;pageshow event handler called for the initial load.  This is the same as the load event.&quot;);
    }

    function pageHidden(evt)
    {
        if (evt.persisted)
            alert(&quot;pagehide event handler called.  The page was suspended and placed into the Page Cache.&quot;);
        else
            alert(&quot;pagehide event handler called for page destruction.  This is the same as the unload event.&quot;);
    }

    window.addEventListener(&quot;pageshow&quot;, pageShown, false);
    window.addEventListener(&quot;pagehide&quot;, pageHidden, false);

    &amp;lt;/script&amp;gt;
    &amp;lt;body&amp;gt;
    &amp;lt;a href=&quot;http://www.webkit.org/&quot;&amp;gt;Click for WebKit&amp;lt;/a&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/pageshow-pagehide-example.html&quot; target=&quot;_blank&quot;&gt;Click here&lt;/a&gt; to view this example in a new window, but make sure you&amp;#8217;re using a recent &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;WebKit nightly.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Remember to try clicking the link to leave the page then press the back button.&lt;/p&gt;
&lt;p&gt;Pretty cool, right?&lt;/p&gt;
&lt;h3&gt;What These New Events Accomplish&lt;/h3&gt;
&lt;p&gt;The pagehide event is important for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It enables web developers to distinguish between a page being suspended and one that is being destroyed.&lt;/li&gt;
&lt;li&gt;When used instead of the unload event, it enables browsers to use their page cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;#8217;s also straightforward to change existing code to use pagehide instead of unload.  Here is an example of testing for the onpageshow attribute to choose pageshow/pagehide when supported, falling back to load/unload when they&amp;#8217;re not:&lt;/p&gt;
&lt;pre&gt;
    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;script&amp;gt;

    function myLoadHandler(evt)
    {
        if (evt.persisted) {
            // This is actually a pageshow event and the page is coming out of the Page Cache.
            // Make sure to not perform the &quot;one-time work&quot; that we'd normally do in the onload handler.
            ...

            return;
        }

        // This is either a load event for older browsers,
        // or a pageshow event for the initial load in supported browsers.
        // It's safe to do everything my old load event handler did here.
        ...
    }

    function myUnloadHandler(evt)
    {
        if (evt.persisted) {
            // This is actually a pagehide event and the page is going into the Page Cache.
            // Make sure that we don't do any destructive work, or work that shouldn't be duplicated.
            ...

            return;
        }

        // This is either an unload event for older browsers,
        // or a pagehide event for page tear-down in supported browsers.
        // It's safe to do everything my old unload event handler did here.
        ...
    }

    if (&quot;onpagehide&quot; in window) {
        window.addEventListener(&quot;pageshow&quot;, myLoadHandler, false);
        window.addEventListener(&quot;pagehide&quot;, myUnloadHandler, false);
    } else {
        window.addEventListener(&quot;load&quot;, myLoadHandler, false);
        window.addEventListener(&quot;unload&quot;, myUnloadHandler, false);
    }

    &amp;lt;/script&amp;gt;
    &amp;lt;body&amp;gt;
    Your content goes here!
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Piece of cake!&lt;/p&gt;
&lt;h3&gt;How You Can Help: Revisited&lt;/h3&gt;
&lt;p&gt;To reiterate, we&amp;#8217;ve now identified three great ways web developers can help the Page Cache work better:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Only install the event handler if the code is relevant to the current browser.&lt;/li&gt;
&lt;li&gt;Only install the event handler once your page actually needs it.&lt;/li&gt;
&lt;li&gt;If supported by the browser, use pagehide instead.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Web developers that willfully ignore any or all these options are primarily accomplishing one thing:&lt;br /&gt;
Forcing their users into &amp;#8220;slow navigation mode.&amp;#8221; &lt;/p&gt;
&lt;p&gt;I say this both as a browser engineer and a browser user: That stinks!&lt;/p&gt;
&lt;h3&gt;The Plot Thickens&lt;/h3&gt;
&lt;p&gt;But now that we&amp;#8217;ve covered what savvy and polite web developers can do to help in the future, we need to further scrutinize the current state of the web.&lt;/p&gt;
&lt;p&gt;Browsers treat the unload handler as sacred because it is designed to do &amp;#8220;important work.&amp;#8221;  Unfortunately many popular sites have unload event handlers that decidedly &lt;i&gt;do not&lt;/i&gt; &amp;#8220;do important work.&amp;#8221;  I commonly see handlers that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always update some cookie for tracking, even though it&amp;#8217;s already been updated.&lt;/li&gt;
&lt;li&gt;Always send an XHR update of draft data to a server, even though it&amp;#8217;s already been sent.&lt;/li&gt;
&lt;li&gt;Do nothing that could possible persist to any future browsing session.&lt;/li&gt;
&lt;li&gt;That are empty.  They literally do &lt;i&gt;nothing.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since these misbehaved pages are very common and will render improvements to WebKit&amp;#8217;s Page Cache ineffective a few of us started to ask the question:&lt;/p&gt;
&lt;p&gt;What *would* actually happen if we simply started admitting these pages to the Page Cache without running the unload event handler first?&lt;/p&gt;
&lt;p&gt;What would break?  &lt;/p&gt;
&lt;p&gt;Can we detect any patterns to determine whether an unload event handler is &amp;#8220;important&amp;#8221; or not?&lt;/p&gt;
&lt;h3&gt;Our Experiment&lt;/h3&gt;
&lt;p&gt;You never know for sure until you try.&lt;/p&gt;
&lt;p&gt;Starting in &lt;a href=&quot;http://trac.webkit.org/changeset/48388&quot;&gt;revision 48388&lt;/a&gt; we&amp;#8217;ve allowed pages with unload handlers into the Page Cache.  If a user closes the window while the page is visible, the unload event will fire as usual.  But the unload event will not be fired as normal when the user navigates away from the page.  If the user closes the window while the page is suspended and in the Page Cache, the unload event handler will never be run.&lt;/p&gt;
&lt;p&gt;What this means for users is that their navigation experience could be noticeably smoother and quicker in the common case.  What this means for developers is that we&amp;#8217;re consciously deciding not to run some of their code and their web application might break.&lt;/p&gt;
&lt;p&gt;For users and developers alike &amp;#8211; Please leave your feedback, observations, or suggestions in &lt;a href=&quot;http://webkit.org/b/29021&quot;&gt;the bug&lt;/a&gt; tracking this experiment.&lt;/p&gt;
&lt;p&gt;And remember this is just an experiment.  No one is planning to ship this drastic change in behavior in a production product.  But the Page Cache is such an important part of browser performance that we&amp;#8217;re willing to push the envelope a little to improve it a lot.&lt;/p&gt;
&lt;p&gt;We want to learn what breaks.  We want to know if we can heuristically determine if an unload handler is truly critical or not. We want to know if we can detect certain patterns in some types of unload handlers and treat them differently.  And, perhaps most importantly, we want to evangelize.&lt;/p&gt;
&lt;p&gt;At least one popular Javascript library has &lt;a href=&quot;http://www.dojotoolkit.org/book/dojo-1-3-release-notes&quot;&gt;already adopted some of the advice&lt;/a&gt; we&amp;#8217;ve given to help improve the landscape on the web.  If just a few more developers for popular sites or libraries take notice of this experiment and change their code then the web will be a much friendlier place for all of us.&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit Page Cache I – The Basics</title>
		<link href="http://webkit.org/blog/427/webkit-page-cache-i-the-basics/"/>
		<id>http://webkit.org/blog/?p=427</id>
		<updated>2009-09-16T23:47:13+00:00</updated>
		<content type="html">&lt;p&gt;This is the first of two posts that will center around a modern browser engine feature that doesn&amp;#8217;t usually get a lot of press: The Page Cache.&lt;/p&gt;
&lt;p&gt;Today I&amp;#8217;ll talk a bit about what this feature is, why it often doesn&amp;#8217;t work, and what plans we have to improve it.&lt;/p&gt;
&lt;h3&gt;Page Cache Overview&lt;/h3&gt;
&lt;p&gt;Some of you might be more familiar with what other browsers call their Page Cache.  Firefox calls theirs the &amp;#8220;Back-Forward Cache&amp;#8221; or &amp;#8220;bfcache.&amp;#8221;  Opera refers to theirs as &amp;#8220;Fast History Navigation.&amp;#8221;  We&amp;#8217;ve recently started to refer to WebKit&amp;#8217;s implementation as the &amp;#8220;Page Cache&amp;#8221; to reduce confusion with our &amp;#8220;Back/Forward List.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Note that the Page Cache is an end user feature that makes navigating the web much smoother.  It is not a &amp;#8220;cache&amp;#8221; in the &amp;#8220;&lt;a href=&quot;http://www.ietf.org/rfc/rfc2616.txt&quot;&gt;HTTP sense&lt;/a&gt;&amp;#8220;.  It is not a &amp;#8220;cache&amp;#8221; in the &amp;#8220;disk cache&amp;#8221; sense where raw resources are stored on the local disk.  And it&amp;#8217;s not a &amp;#8220;cache&amp;#8221; in the traditional &amp;#8220;memory cache&amp;#8221; sense where WebKit keeps decoded resources around in memory to be shared between multiple web pages.&lt;/p&gt;
&lt;p&gt;So&amp;#8230; what *exactly* is it?&lt;/p&gt;
&lt;p&gt;Quite simply, the Page Cache makes it so when you leave a page we &amp;#8220;pause&amp;#8221; it and when you come back we press &amp;#8220;play.&amp;#8221;&lt;/p&gt;
&lt;p&gt;When a user clicks a link to navigate to a new page the previous page is often thrown out completely.  The DOM is destroyed, Javascript objects are garbage collected, plug-ins are torn down, decoded image data is thrown out, and all sorts of other cleanup occurs.&lt;/p&gt;
&lt;p&gt;When this happens and the user later clicks the back button it can be painful for them.  WebKit may have to re-download the resources over the network, re-parse the main HTML file, re-run the scripts that dynamically setup the page, re-decode image data, re-layout the page, re-scroll to the right position, and re-paint the screen.  All of this work requires time, CPU usage, and battery power.&lt;/p&gt;
&lt;p&gt;Ideally the previous page can instead be placed in the Page Cache.  The entire live page is kept in memory even though it is not on screen.  This means that all the different bits and pieces that represent what you see on the screen and how you interact with it are suspended instead of destroyed.  They can then be revived later in case you click the back button.&lt;/p&gt;
&lt;h3&gt;Why is This Important?&lt;/h3&gt;
&lt;p&gt;When the Page Cache works it makes clicking the back button almost instantaneous.&lt;/p&gt;
&lt;p&gt;You can do a search, click a search result, then go back and immediately be looking at the exact same results page.  You might be browsing an aggregator site like Reddit or Digg and want to rapidly view a lot of different links in the same tab.  You might be navigating an image gallery and decide to compare two images by alternately clicking &amp;#8220;back&amp;#8221; and &amp;#8220;forward&amp;#8221; rapidly.  Or you might have simply clicked on the wrong link and want to go back to correct your mistake.&lt;/p&gt;
&lt;p&gt;Anytime you might click the back button or the forward button you unknowingly hope the Page Cache is on your side.  When the Page Cache is used, users are happy even though they&amp;#8217;re not aware of the magic behind the scenes.&lt;/p&gt;
&lt;p&gt;Conversely, when the Page Cache is bypassed, users often get frustrated with both the browser and the Web in general.  &lt;/p&gt;
&lt;h3&gt;Why Wouldn&amp;#8217;t it Work?&lt;/h3&gt;
&lt;p&gt;So if the Page Cache is so amazing, why doesn&amp;#8217;t WebKit always use it when you navigate to a new page?&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a few main answers to that question.&lt;/p&gt;
&lt;h4&gt;Some Pages aren&amp;#8217;t Interesting&lt;/h4&gt;
&lt;p&gt;First off, sometimes it doesn&amp;#8217;t make sense to cache a page because it&amp;#8217;s not interesting to return to in the exact same state.  For example, the page might not even be finished loading yet.  Or the page might&amp;#8217;ve had an error loading.  Or maybe the page was a redirection page that exists solely to automatically move the user to some new URL.&lt;/p&gt;
&lt;p&gt;These are cases where we&amp;#8217;re happy with the current Page Cache behavior in WebKit.&lt;/p&gt;
&lt;h4&gt;Some Pages are Complicated&lt;/h4&gt;
&lt;p&gt;Secondly, a page might not be considered for the Page Cache because it&amp;#8217;s difficult to figure out how to &amp;#8220;pause&amp;#8221; it.  This happens with more complex pages that do interesting things.  &lt;/p&gt;
&lt;p&gt;For example, plug-ins contain native code that can do just about anything it wants so WebKit can&amp;#8217;t &amp;#8220;hit the pause button&amp;#8221; on them.  Another example is pages with multiple frames which WebKit has historically not cached.  &lt;/p&gt;
&lt;p&gt;Distressingly, navigating around these more advanced pages would benefit the most from the Page Cache. &lt;/p&gt;
&lt;h4&gt;Some Pages are Secure&lt;/h4&gt;
&lt;p&gt;Server administrators for HTTPS sites often have particular security concerns and are very sensitive with regards to how browsers behave.  For example, Financial institutions are often very thorough in verifying each particular browser&amp;#8217;s behavior before allowing it to be used by their customers.  &lt;/p&gt;
&lt;p&gt;One area often focused on is back/forward behavior.  Such institutions are &amp;#8211; understandably &amp;#8211; very picky about the types of data left behind in the browser as a user navigates.  As a result, in an effort to err on the side of extreme caution, WebKit has disallowed all HTTPS sites from its Page Cache since the very beginning.  &lt;/p&gt;
&lt;p&gt;A more fine grained approach might go a long way towards improving the user experience.&lt;/p&gt;
&lt;h3&gt;Planned Improvements&lt;/h3&gt;
&lt;p&gt;Clearly there&amp;#8217;s some important cases we don&amp;#8217;t handle and therefore plenty of room for improvement.&lt;/p&gt;
&lt;p&gt;WebKit&amp;#8217;s Page Cache was originally written in 2002 before the very first Safari beta release.  Its capabilities reflected both the architecture of WebKit at the time and the landscape of the Web in 2002.  &lt;/p&gt;
&lt;p&gt;The Web of 2009 is a much different place and we need to bring the Page Cache up to par.  Fortunately this work is well underway.&lt;/p&gt;
&lt;p&gt;For example, as of &lt;a href=&quot;http://trac.webkit.org/changeset/48036&quot;&gt;revision 48036&lt;/a&gt; a major limitation was resolved and pages with frames are now placed in the Page Cache.  Browsing with the &lt;a href=&quot;http://nightly.webkit.org/&quot;&gt;latest WebKit nightly&lt;/a&gt; always seems to &amp;#8220;feel faster&amp;#8221; in ways you can&amp;#8217;t quite put your finger on, and recently some of you might have been experiencing this enhancement.&lt;/p&gt;
&lt;p&gt;But there&amp;#8217;s plenty more work to do.&lt;/p&gt;
&lt;p&gt;Plug-ins are the next huge one on our hit list.  As I mentioned earlier, plug-ins can run whatever native code they like so we can&amp;#8217;t reliably hit the &amp;#8220;pause&amp;#8221; button on them.  &lt;/p&gt;
&lt;p&gt;Earlier versions of WebKit handled single-frame pages with some types of plug-ins.  WebKit would tear down the plug-in when leaving the page and restoring it when the user returned.  But as work continued on WebCore to make it faster and easier to port, this ability was lost.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/b/13634&quot;&gt;Bug #13634&lt;/a&gt; tracks getting this working again for all plug-ins on all pages.&lt;/p&gt;
&lt;p&gt;Then there are HTTPS pages.  We completely ban them now, but a more selective approach should be able to benefit users as well as keep security-minded institutions happy.  &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/b/26777&quot;&gt;Bug #26777&lt;/a&gt; tracks allowing HTTPS pages to be cached unless their response headers include &amp;#8220;cache-control: no-store&amp;#8221; or &amp;#8220;cache-control: no-cache&amp;#8221; which has become the canonical way for a selective organization to secure your content.&lt;/p&gt;
&lt;p&gt;If you have any other ideas for what else might be improved, please feel free to comment in the appropriate bug or file a new bug of your own!&lt;/p&gt;
&lt;h3&gt;Unload Handlers&lt;/h3&gt;
&lt;p&gt;One thing I haven&amp;#8217;t mentioned is pages with unload event handlers.  &lt;/p&gt;
&lt;p&gt;The unload event was designed to let a page do some cleanup work when the user closes the page.  &lt;/p&gt;
&lt;p&gt;The browser can&amp;#8217;t fire the unload event before it puts the page in the Page Cache, because the page then assumes it is in a terminal state and might destroy critical parts of itself.  This completely defeats the purpose of the Page Cache.  &lt;/p&gt;
&lt;p&gt;But if the browser puts the page in the Page Cache without running the unload handler, then the page might be destroyed by the browser while it is &amp;#8220;paused&amp;#8221; and hidden, and that cleanup work &amp;#8211; which might be very important &amp;#8211; will never happen.&lt;/p&gt;
&lt;p&gt;Since the unload event&amp;#8217;s purpose is to allow &amp;#8220;important work when a page is closed,&amp;#8221; all major browsers refuse to put such pages in their Page Cache, causing a direct negative impact on the user experience.&lt;/p&gt;
&lt;p&gt;In a future post I&amp;#8217;ll be talking more about unload event handlers and there will actually be homework for many of you web developers out there!  Stay tuned&amp;#8230;&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Towards a Reopened CFNetwork</title>
		<link href="http://whtconstruct.blogspot.com/2009/09/towards-reopened-cfnetwork.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-4260212335330771846</id>
		<updated>2009-09-09T21:46:05+00:00</updated>
		<content type="html">I think one of the coolest things about &lt;a href=&quot;http://www.apple.com/&quot;&gt;Apple, Inc.&lt;/a&gt; in their modern incarnation is how great a member of the Open Source community they have become.  The fact that the true core of Mac OS, the &lt;a href=&quot;http://developer.apple.com/Darwin/&quot;&gt;Darwin&lt;/a&gt; &lt;a href=&quot;http://www.freebsd.org/&quot;&gt;BSD&lt;/a&gt; implementation, is &lt;a href=&quot;http://opensource.apple.com/&quot;&gt;open&lt;/a&gt; and available for all interested parties to &lt;a href=&quot;http://darwinbuild.macosforge.org/&quot;&gt;review&lt;/a&gt;, &lt;a href=&quot;http://www.puredarwin.org/&quot;&gt;modify&lt;/a&gt;, and &lt;a href=&quot;http://src.macosforge.org/Roots/&quot;&gt;learn&lt;/a&gt; from is unprecedented in any commercial company I am aware of (at least, none that started off life as a closed-source entity.)&lt;br /&gt;&lt;br /&gt;In addition to the core OS components from the Darwin layer, they have contributed improvements to the GNU compiler collection, their amazing &lt;a href=&quot;http://www.webkit.org/&quot;&gt;WebKit&lt;/a&gt; rendering engine, spearheaded the &lt;a href=&quot;http://www.khronos.org/opencl/&quot;&gt;OpenCL&lt;/a&gt; initiative, shepherded &lt;a href=&quot;http://llvm.org/&quot;&gt;LLVM&lt;/a&gt; into an absolutely amazing compiler system, provided a fantastic local host resolution and routing system (&lt;a href=&quot;http://developer.apple.com/networking/bonjour/index.html&quot;&gt;Bonjour&lt;/a&gt;), and have contributed the equivalent of millions of dollars in development value to the world at large.&lt;br /&gt;&lt;br /&gt;Amazing!&lt;br /&gt;&lt;br /&gt;So of course I am writing this post to ask for &lt;em&gt;EVEN MORE&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;While working on a native Windows port of WebKit (one unencumbered by proprietary Apple libraries that prohibit redistribution), I started working with &lt;a href=&quot;http://developer.apple.com/CoreFoundation/&quot;&gt;CoreFoundation&lt;/a&gt;.  Along with the many other products I listed above, they opened a large subset of the full CoreFoundation product as &lt;a href=&quot;http://developer.apple.com/opensource/cflite.html&quot;&gt;CF-Lite&lt;/a&gt;, large enough in fact to support running WebKit.  They even provided useful examples and arguments for basing a porting strategy around CF-Lite.  While they make dumps of the CF-Lite source tree available with each Mac OS release, they did not generally release Linux or Windows sources (which had to be recreated externally).  They were also uninterested in opening it up as a WebKit-style open source project, so I started hosting them as the &lt;a href=&quot;http://opencflite.sourceforge.net/&quot;&gt;opencflite&lt;/a&gt; project on &lt;a href=&quot;http://www.sourceforge.net/&quot;&gt;SourceForge&lt;/a&gt;.  We now fully support Mac OS X (a no-brainer), Windows, and Linux.&lt;br /&gt;&lt;br /&gt;CoreFoundation is really neat because of its various data types and operating system abstractions, but it also has a nice modular system for modelling various operating system elements (such as sockets, files, timers) as part of a common runloop, allowing easy asynchronous operations.  What is even neater is when you can make use of CoreFoundation's sister framework, &lt;a href=&quot;http://developer.apple.com/mac/library/documentation/Networking/Conceptual/CFNetwork/Introduction/Introduction.html&quot;&gt;CFNetwork&lt;/a&gt;, which extends this idea to various network features, such as Host lookup, DNS, and &lt;a href=&quot;http://developer.apple.com/networking/bonjour/index.html&quot;&gt;Bonjour&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Up through Mac OS X 10.4 (Tiger), CFNetwork was &lt;a href=&quot;http://opensource.apple.com/source/CFNetwork/CFNetwork-128/&quot;&gt;Open Source software&lt;/a&gt;.  Alas, those salad days were not to last.  With the release of Mac OS X 10.5 (Leopard), CFNetwork closed up and has not been seen in the wild since.&lt;br /&gt;&lt;br /&gt;Initially I thought this was a mistake, but after corresponding with Apple's Open Source Product Manager I was informed that it was indeed closed on purpose.  After a couple of years of e-mailing various parties associated with the CoreFoundation/CFNetwork product line, I eventually filed rdar://7195752 to request the source to be reopened.&lt;br /&gt;&lt;br /&gt;I'm not sure why CFNetwork was closed.  But even if it contains &lt;a href=&quot;http://lispers.org/&quot;&gt;Secret Alien Technology&lt;/a&gt;, I believe that portions of it could be made available in an Open Source form.  In my bug report, I gave an impassioned plea that basically boiled down to the following bullet points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Increased uptake of CoreFoundation as a general purpose, cross-platform library would facilitate porting of applications to the Mac OS.&lt;/li&gt;&lt;li&gt;Security engineers would be able to audit and validate the source code, increasing overall platform security.&lt;/li&gt;&lt;li&gt;Presence of the source and examples on more development platforms would increase developer mind share, and help extend the visibility and utility of Apple development tools.&lt;/li&gt;&lt;li&gt;More eyes looking at the code would benefit the source base as a whole.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;As I conclude in my bug report, I sincerely hope that Apple could be convinced to open source at least portions of CFNetwork so that its use could be extended outside of Apple.  This would greatly aid in my efforts to keep the Windows Cairo port of WebKit in sync with the full Apple version, as well as allowing work on the &lt;a href=&quot;http://www.puredarwin.org/developers/cfnetwork&quot;&gt;PureDarwin&lt;/a&gt; project to continue.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-4260212335330771846?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Updated WebKit SDK (@r48212)</title>
		<link href="http://whtconstruct.blogspot.com/2009/09/updated-webkit-sdk-r48212.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-7878595967457099975</id>
		<updated>2009-09-09T16:21:20+00:00</updated>
		<content type="html">&lt;a href=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/Sqgp4Lz_IAI/AAAAAAAAAJA/j03ZWaL7X6o/s1600-h/Screen+shot+2009-09-09+at+3.17.42+PM.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/Sqgp4Lz_IAI/AAAAAAAAAJA/j03ZWaL7X6o/s320/Screen+shot+2009-09-09+at+3.17.42+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5379595800114307074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;A new WebKit SDK, now new and improved with no multiple-MSVCRT linkage!&lt;br /&gt;&lt;br /&gt;This build corresponds to the new &lt;a href=&quot;http://files.me.com/bfulgham/iay8p5&quot;&gt;requirements.zip&lt;/a&gt; I uploaded last night.  This should be suitable for running on an end-user system (assuming it has been updated to the current patchlevel for MSVCRT). If the user is running 'Windows Update' this should be a safe assumption.&lt;br /&gt;&lt;br /&gt;Please try it out and let me know if you have any problems.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-7878595967457099975?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKitGTK+ 1.1.14 new features</title>
		<link href="http://blogs.gnome.org/xan/2009/09/09/webkitgtk-1-1-14-new-features/"/>
		<id>http://blogs.gnome.org/xan/2009/09/09/webkitgtk-1-1-14-new-features/</id>
		<updated>2009-09-09T09:53:02+00:00</updated>
		<content type="html">Gustavo has written a nice sumary of all the new APIs in 1.1.14 (yes, all that stuff was only for 1.1.14!), so go and check it out if you are interested.</content>
		<author>
			<name>Xan López</name>
			<uri>http://blogs.gnome.org/xan</uri>
		</author>
		<source>
			<title type="html">Iocane powder » webkit</title>
			<subtitle type="html">Just another GNOME Blogs weblog</subtitle>
			<link rel="self" href="http://blogs.gnome.org/xan/category/webkit/feed/rss/"/>
			<id>http://blogs.gnome.org/xan/category/webkit/feed/rss/</id>
			<updated>2009-11-19T16:53:02+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Revised Requirements</title>
		<link href="http://whtconstruct.blogspot.com/2009/09/revised-requirements.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-123707088182025857</id>
		<updated>2009-09-09T02:26:39+00:00</updated>
		<content type="html">A couple of people who have been working with the WebKitSDK reported problems when running WinLauncher (or other applications based on WebKit.)  This was tracked down to the WebKit.dll manifest, which contained dual entries for the Visual Studio runtime:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;assemblyIdentity type=&quot;win32&quot; name=&quot;Microsoft.VC80.CRT&quot; version=&quot;8.0.50727.4053&quot; processorArchitecture=&quot;x86&quot; publicKeyToken=&quot;1fc8b3b9a1e18e3b&quot;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;versus&lt;br /&gt;&lt;code&gt;&lt;br /&gt;assemblyIdentity type=&quot;win32&quot; name=&quot;Microsoft.VC80.CRT&quot; version=&quot;8.0.50727.762&quot; processorArchitecture=&quot;x86&quot; publicKeyToken=&quot;1fc8b3b9a1e18e3b&quot;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I initially planned on rebuilding everything using static linkage to the CRT, but quickly found that this would require changing far too many project files (including every existing WebKit project).  This quickly got out of hand, so I simply rebuilt against the current set of libraries and called it a day.&lt;br /&gt;&lt;br /&gt;You can grab the new requirements &lt;a href=&quot;http://files.me.com/bfulgham/iay8p5&quot;&gt;here&lt;/a&gt;.  If you update to current SVN you will have proper link instructions to build a correct set of executables and DLLs.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-123707088182025857?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKitGTK+ 1.1.14 is here!</title>
		<link href="http://blog.kov.eti.br/?p=88"/>
		<id>http://blog.kov.eti.br/?p=88</id>
		<updated>2009-09-08T14:38:10+00:00</updated>
		<content type="html">&lt;p&gt;1.1.14 is definitely worth blogging about. While I was updating the gtk-doc stuff to update the documentation that is available in &lt;a href=&quot;http://webkitgtk.org/reference/index.html&quot;&gt;our website&lt;/a&gt; I was thinking that this is probably the release with the largest amount of API addition I have seen in my time as a contributor to the project! Before I start talking about the new APIs, though, let me talk of something that went under the hood: Xan has patched WebKitGTK+ to override libsoup&amp;#8217;s connection limits, so that our limits match those of other modern browsers - we now allow up to 60 connections total, and 6 per host. People have been reporting load performance improvements for some sites!&lt;/p&gt;
&lt;p&gt;We have an initial set of APIs to deal with the data that was loaded to render the page, represented by the new &lt;a href=&quot;http://webkitgtk.org/reference/webkitgtk-WebKitWebDataSource.html&quot;&gt;DataSource&lt;/a&gt; object. This allows you to peek at the source of the HTML that was rendered, for instance. In the near future we will have ways of getting the data and other information for each &lt;a href=&quot;http://webkitgtk.org/reference/webkitgtk-WebKitWebResource.html&quot;&gt;resource&lt;/a&gt; that is downloaded to compose the page. Jan Alonzo has spent quite some time studying, implementing and perfecting this API, with some help from me and Xan.&lt;/p&gt;
&lt;p&gt;One initial piece of the larger API to control resource loading is already there, as well. The WebView will use the new &lt;a href=&quot;http://webkitgtk.org/reference/webkitgtk-WebKitWebView.html#WebKitWebView-resource-request-starting&quot;&gt;resource-request-starting&lt;/a&gt; signal to let you know that a request is about to be sent, and allow you to modify headers, or even the URI that is going to be fetched. For some, the greatest news here is that this allows a basic implementation of &lt;a href=&quot;http://git.gnome.org/cgit/epiphany/commit/?id=3d4053a5f71175970712897a298a7ce95d3dfaef&quot;&gt;AD blocking&lt;/a&gt;, which is now supported in Epiphany with the WebKit backend, as of version 2.27.92, released today! This is something I have been looking at in my &lt;a href=&quot;http://www.collabora.co.uk/&quot;&gt;Collabora&lt;/a&gt; time for some time now, and working along with Xan and Jan, we finally seem to have figure out the API interactions correctly. There&amp;#8217;s more to come regarding resource loading tracking, in the near future.&lt;/p&gt;
&lt;p&gt;That would already be a lot, from my point of view, but there&amp;#8217;s a whole lot more. A new contributor, Martin Robinson, has arrived proposing new API pieces for an important HTML5 tool: &lt;a href=&quot;http://webkitgtk.org/reference/webkitgtk-WebKitWebDatabase.html&quot;&gt;web databases&lt;/a&gt;, which brings with it the concept of &lt;a href=&quot;http://webkitgtk.org/reference/webkitgtk-WebKitSecurityOrigin.html&quot;&gt;SecurityOrigin&lt;/a&gt;. Jan has exposed API to put the WebView in &lt;a href=&quot;http://webkitgtk.org/reference/webkitgtk-WebKitWebView.html#webkit-web-view-set-view-source-mode&quot;&gt;&amp;#8220;view source&amp;#8221; mode&lt;/a&gt;, Xan has given us undo/redo support for editable content, and Zan Dobersek has done some overall improvement of our HTML5 media player.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s a lot of change for a release, which also goes to show we still have quite a gap to fill, but we are being able to move forward and fill them quite quickly. If you want to help out, pick something in your area of interest, and send us &lt;a href=&quot;http://webkit.org/coding/contributing.html&quot;&gt;patches&lt;/a&gt;!&lt;/p&gt;</content>
		<author>
			<name>Gustavo Noronha</name>
			<uri>http://blog.kov.eti.br</uri>
		</author>
		<source>
			<title type="html">Gustavo Noronha (kov) » webkit</title>
			<subtitle type="html">um hacker debiano que mora num lugar chamado mundo</subtitle>
			<link rel="self" href="http://blog.kov.eti.br/wp-rss2.php?cat=16"/>
			<id>http://blog.kov.eti.br/wp-rss2.php?cat=16</id>
			<updated>2009-11-10T20:53:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The show so far</title>
		<link href="http://blogs.gnome.org/xan/2009/09/08/the-show-so-far/"/>
		<id>http://blogs.gnome.org/xan/2009/09/08/the-show-so-far/</id>
		<updated>2009-09-08T12:53:02+00:00</updated>
		<content type="html">Yesterday we released WebKitGTK+ 1.1.14, Epiphany 2.27.92 and Epiphany-Extensions 2.27.92. I haven't blogged about releases in a while (sorry!), and as the good people at Ars Technica mention development is moving at a &quot;swift rate&quot; (btw Ryan, you can remove the ugly hack to get the contents of the page ...</content>
		<author>
			<name>Xan López</name>
			<uri>http://blogs.gnome.org/xan</uri>
		</author>
		<source>
			<title type="html">Iocane powder » webkit</title>
			<subtitle type="html">Just another GNOME Blogs weblog</subtitle>
			<link rel="self" href="http://blogs.gnome.org/xan/category/webkit/feed/rss/"/>
			<id>http://blogs.gnome.org/xan/category/webkit/feed/rss/</id>
			<updated>2009-11-19T16:53:02+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Eric Carlson is now a WebKit Reviewer</title>
		<link href="http://webkit.org/blog/426/eric-carlson-is-now-a-webkit-reviewer/"/>
		<id>http://webkit.org/blog/426/eric-carlson-is-now-a-webkit-reviewer/</id>
		<updated>2009-09-01T10:34:30+00:00</updated>
		<content type="html">&lt;p&gt;Eric Carlson has been a long-time contributer to WebKit, first through the QuickTime Plugin, and now directly as part of WebKit&amp;#8217;s HTML5 media support.  Eric knows a ridiculous amount about video and audio and we&amp;#8217;re very glad to have him now as an official reviewer!  Please join me in welcoming Eric as a reviewer.&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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Updated Build</title>
		<link href="http://whtconstruct.blogspot.com/2009/08/updated-build.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-2745688401538184198</id>
		<updated>2009-08-26T08:43:19+00:00</updated>
		<content type="html">I haven't posted much recently, but rest assured I am continuing to work on WebKit in a variety of areas.  I found (and corrected) a few issues in the libcurl backend, but you were only likely to run into them if you were working a lot with local files (e.g., stuff in your filesystem) which happens to be something I'm doing a lot of right now.  The build now contains corrections &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=19794&quot;&gt;for&lt;/a&gt; &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28312&quot;&gt;these&lt;/a&gt; &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28405&quot;&gt;items&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At the moment, I am working on making it easier for people to use WebKit in projects without having to invest massive amounts of time to figure out how to build the framework themselves.&lt;br /&gt;&lt;br /&gt;To that end, I am ditching the separate Debug and Release bundles I had been producing, and am paring things down to a single &lt;a href=&quot;http://files.me.com/bfulgham/28pio3&quot;&gt;WebKitSDK&lt;/a&gt; zip file, which contains the Debug and Release binaries in a single package.  I first had to &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28695&quot;&gt;modify WebKit&lt;/a&gt; to emit dll's with &quot;_debug&quot; names so that everything could coexist peacefully in a single bin folder.  Now that this is all bundled together, I have removed the original Debug and Release-only zip files from my iDisk.&lt;br /&gt;&lt;br /&gt;Now that I've got that finished up, I'm going to focus on shrinking the runtime dependencies by trying to link more of the components statically.  I am also trying to get the libcurl support into a background worker to improve throughput.&lt;br /&gt;&lt;br /&gt;Of course, if any of you have more pressing concerns, let me know or &lt;a href=&quot;http://bugs.webkit.org&quot;&gt;file a bug!&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-2745688401538184198?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Presentation with S5</title>
		<link href="http://labs.trolltech.com/blogs/2009/08/25/presentation-with-s5/"/>
		<id>http://labs.trolltech.com/blogs/2009/08/25/presentation-with-s5/</id>
		<updated>2009-08-25T15:00:01+00:00</updated>
		<content type="html">&lt;p&gt;Influenced by Holger and Simon, I decided to use &lt;a href=&quot;http://en.wikipedia.org/wiki/S5_(file_format)&quot;&gt;S5&lt;/a&gt; for my presentation at the &lt;a href=&quot;http://labs.trolltech.com/blogs/2009/07/05/trolls-at-the-desktop-summit/&quot;&gt;Desktop Summit&lt;/a&gt; in Gran Canaria few weeks ago. It&amp;#8217;s purely based on web technologies, it works in modern web browsers. More information is available at &lt;a href=&quot;http://meyerweb.com/eric/tools/s5/&quot;&gt;the official website&lt;/a&gt;, including &lt;a href=&quot;http://meyerweb.com/eric/tools/s5/s5-intro.html&quot;&gt;demos&lt;/a&gt;, even with &lt;a href=&quot;http://www.netzgesta.de/S5/demos.php&quot;&gt;different styles and effects&lt;/a&gt;. Thanks to the use of web technologies,  you can even &lt;a href=&quot;http://www.s5easy.com/create/&quot;&gt;create the slides online&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/ilkkU1fv84FYczEqLQi9_w?feat=embedwebsite&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://lh3.ggpht.com/_Oijhf1ZPv-4/SpPRtidpihI/AAAAAAAABTQ/uQ31FjPcIQA/s800/s5runner.png&quot; id=&quot;s5runner&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the fun of it, instead of just using a web browser (so boring!), I wrote a simple &lt;a href=&quot;http://qt.nokia.com/doc/qtwebkit.html&quot;&gt;QtWebKit&lt;/a&gt;-based tool to run the slide shows, dubbed &lt;strong&gt;s5runner&lt;/strong&gt;. The code is checked in already to the &lt;a href=&quot;http://qt.gitorious.org/qt-labs/graphics-dojo&quot;&gt;Graphics Dojo  repository&lt;/a&gt;. Beside just launching the slide shows in a &lt;a href=&quot;http://qt.nokia.com/doc/qwebview.html&quot;&gt;QWebView&lt;/a&gt;, the 200-lines C++ code adds a few more goodies (although arguably, all these extra stuff can be implemented in pure HTML/CSS/JavaScript instead). Run the program and open the included &lt;em&gt;slides.html&lt;/em&gt; (in the &lt;em&gt;example&lt;/em&gt; sub-directory), or just enjoy the following &lt;a href=&quot;http://www.youtube.com/watch?v=5NAoB_isqOY&quot;&gt;2-minute screencast&lt;/a&gt;:&lt;/p&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A countdown timer (currently hard-coded to 30 minutes) is installed at the bottom right corner. The screen can be blanked temporarily to black or white, useful when you want to steal the focus of the audience from the slides. Going full-screen (and back again) is also easy, this is important if you&amp;#8217;d like to show some live demos during the talk. The slides look ugly due to the aging or faulty projector? Use the night-mode, something you have seen in the previous &lt;a href=&quot;http://labs.trolltech.com/blogs/2009/08/04/openstreetmap-and-qt-and-s60/&quot;&gt;OpenStreetMap example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When doing a talk about programming, it is often unavoidable to show code snippet. Thanks to &lt;a href=&quot;http://noteslog.com/chili/&quot;&gt;Chili&lt;/a&gt;, the jQuery code highlighter plugin (there are other alternatives to pick:&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/google-code-prettify/&quot;&gt;prettify&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/p/syntaxhighlighter/&quot;&gt;syntaxhighlighter&lt;/a&gt;, and many others), you will get the highlighting feature with zero effort. It&amp;#8217;s quite useful as the code fragment (which you likely show only for a few seconds) becomes more understandable. My favorite is however the live-editing feature, just press F3 to start editing the slide while you are showing it at the same time.&lt;/p&gt;
&lt;p&gt;If you like this presentation tool, feel free to extend it. For example, you can have more presentation effects, like pulsating or shaking, by using &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;-based &lt;a href=&quot;http://cavorite.com/labs/presentacular/example/&quot;&gt;Presentacular&lt;/a&gt;. This example tool only supports basic editing, but I have shown &lt;a href=&quot;http://labs.trolltech.com/blogs/2009/03/12/wysiwyg-html-editor/&quot;&gt;a WYSIWYG HTML Editor before&lt;/a&gt;, so you can augment its editing features to support e.g. inserting images from the disk, changing character and paragraph styles, and so on. And of course, support for PDF export  (with one slide per page) will be just very nice. A PowerPoint-killer, anyone?&lt;/p&gt;</content>
		<author>
			<name>Ariya Hidayat</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry>
		<title type="html">WebKit on non mainstream platforms</title>
		<link href="http://zecke.blogspot.com/2009/08/webkit-on-non-mainstream-platforms.html"/>
		<id>tag:blogger.com,1999:blog-13875843.post-7230357413776883850</id>
		<updated>2009-08-17T19:01:48+00:00</updated>
		<content type="html">We have seen some interest in MIPS on the mailinglist and little in the bugtracker but no contribution from these folks. So the other week I decided to attempt to run some of our regression tests on a MIPS platform. The only problem is that I don't have any MIPS hardware... can you change that?&lt;br /&gt;&lt;br /&gt;I had this idea of implementing enough of MacroAssembler to run/compile yarr with the RegexJIT.cpp. In the absence of MIPS hardware I used qemu-mipsel useremulation, enabled yarr/RegexInterpreter.cpp and ran into an infinite loop. I have fixed the bug and landed the patch upstream and now I'm able to complete run-javascriptcore-tests using yarr. The next step will be to work on the MacroAssembler and learn about MIPS assembly.... maybe I progress a bit more next weekend.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13875843-7230357413776883850?l=zecke.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>zecke</name>
			<email>noreply@blogger.com</email>
			<uri>http://zecke.blogspot.com/search/label/WebKit</uri>
		</author>
		<source>
			<title type="html">Some Blog</title>
			<subtitle type="html">Some random thoughts</subtitle>
			<link rel="self" href="http://zecke.blogspot.com/feeds/posts/full/-/WebKit"/>
			<id>tag:blogger.com,1999:blog-13875843</id>
			<updated>2009-11-21T11:53:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">WebKit (r47083) Build Pushed to iDisk</title>
		<link href="http://whtconstruct.blogspot.com/2009/08/webkit-r47083-build-pushed-to-idisk.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-2210258462125969809</id>
		<updated>2009-08-12T00:48:07+00:00</updated>
		<content type="html">I've pushed an updated build (with HTTPS support) to my &lt;a href=&quot;http://files.me.com/bfulgham/81mtr9&quot;&gt;iDisk&lt;/a&gt;. A &lt;a href=&quot;http://files.me.com/bfulgham/211yvf&quot;&gt;Debug version&lt;/a&gt; is also available at the same place.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SoJlL58bagI/AAAAAAAAAIk/fLmDULh4FKQ/s1600-h/Picture+3.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SoJlL58bagI/AAAAAAAAAIk/fLmDULh4FKQ/s320/Picture+3.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5368964960986294786&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you intend to build WebKit yourself, you should use the current &lt;a href=&quot;http://files.me.com/bfulgham/iay8p5&quot;&gt;requirements.zip&lt;/a&gt; file for your building pleasure.  In addition to the SSL-enabled cURL, it contains a slightly updated &lt;a href=&quot;http://sourceforge.net/projects/opencflite/&quot;&gt;CFLite&lt;/a&gt; that brings it up to Mac OS 10.5.8 level.&lt;br /&gt;&lt;br /&gt;These builds include the cURL cacert.pem file in WebKit.resources/certificates/cacert.pem.  If you have another certificate bundle you would like to use, just copy it to this location (and name).&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-2210258462125969809?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">WinCairo WebKit Supports SSL</title>
		<link href="http://whtconstruct.blogspot.com/2009/08/wincairo-webkit-supports-ssl.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-2430219780018996500</id>
		<updated>2009-08-12T00:31:46+00:00</updated>
		<content type="html">&lt;a href=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/SoH-DvTMNbI/AAAAAAAAAIc/XoXapVgT9rk/s1600-h/Picture+8.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/SoH-DvTMNbI/AAAAAAAAAIc/XoXapVgT9rk/s320/Picture+8.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5368851570992362930&quot; /&gt;&lt;/a&gt;&lt;br /&gt;The guys at &lt;a href=&quot;http://www.appcelerator.com&quot;&gt;Appcelerator&lt;/a&gt; figured out how to enable SSL support in their local build of the WinCairo port, and passed along the three-line change required to do so.&lt;br /&gt;&lt;br /&gt;Of course, there was a little bit more to it than that, mainly involving figuring out how to (a) build &lt;a href=&quot;http://www.openssl.org&quot;&gt;OpenSSL&lt;/a&gt; on Windows, (2) how to build &lt;a href=&quot;http://curl.haxx.se/libcurl/&quot;&gt;libcurl&lt;/a&gt; with SSL enabled, and (iii) how to link WebKit with all of this stuff.&lt;br /&gt;&lt;br /&gt;I managed to swell their three-line modification into around twenty lines, but in my defense I wanted to make it possible to have WebKit look for the SSL certificate in the WebKit bundle directory (falling back to the CURL_CA_BUNDLE_PATH environment variable only if necessary).&lt;br /&gt;&lt;br /&gt;So now you can locate a certificate bundle in &quot;WebKit.resources/certificates/cacert.pem&quot;, and WebKit will find it and use it.  If not, you have to set the CURL_CA_BUNDLE_PATH environment variable to the desired location.&lt;br /&gt;&lt;br /&gt;The upshot of all this is that I am posting this blog note via WinLauncher (after logging into Blogger.com using HTTPS), and I closed out &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=28171&quot;&gt;&lt;strike&gt;Bug 28171&lt;/strike&gt;&lt;/a&gt; via WinLauncher (over HTTPS) as well!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-2430219780018996500?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Short QtWebKit Development Update</title>
		<link href="http://labs.trolltech.com/blogs/2009/08/04/short-qtwebkit-development-update/"/>
		<id>http://labs.trolltech.com/blogs/2009/08/04/short-qtwebkit-development-update/</id>
		<updated>2009-08-04T08:17:37+00:00</updated>
		<content type="html">&lt;p&gt;In the past few weeks the development of the Qt port of WebKit has seen a lot of progress. I would like to highlight a few items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kent, Olivier, Jedrzej, Benjamin, Tor Arne and Ariya have been hacking away on the new &lt;a href=&quot;http://qt.gitorious.org/+qt-developers/qt/webkit&quot;&gt;backend for QtScript to use JavaScriptCore&lt;/a&gt;. We&amp;#8217;re down to only a handful of issues (~10, so both hands are needed).&lt;/li&gt;
&lt;li&gt;Since Akademy the entire team has been cleaning up the layout tests and the DumpRenderTree tool, to get the test infrastructure back in shape.&lt;/li&gt;
&lt;li&gt;Gabor, Rapcsanyi and Zoltan from the University of Szeged have been working hard on bringing the build bot for the Qt WebKit port back online. Since last weekend it&amp;#8217;s finally back online in green (yay) at the bot farm at &lt;a href=&quot;http://build.webkit.org/waterfall&quot;&gt;http://build.webkit.org/waterfall&lt;/a&gt;! &lt;/li&gt;
&lt;li&gt;In a multi-platform marathon Tor Arne has been working on cleaning up the WebCore plugins code to eliminate duplicated code between the ports and to unify the behaviour in things like startup sequence and error handling.&lt;/li&gt;
&lt;li&gt;While we&amp;#8217;re at plugins, Jakob from the Arora team has started developing a settings API for plugins, to enable/disable them or to specify preferences.&lt;/li&gt;
&lt;li&gt;Laszlo and Norbert continue to submit patch after patch for the S60 port, it&amp;#8217;s progressing nicely!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In between we had a little team barbeque here in Oslo, celebrating our recent hackeries with food and games:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/08/food.jpg&quot; alt=&quot;Ariya’s delicious spicy prawns&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/08/tower.jpg&quot; alt=&quot;Alternate use of Kubb sticks&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/08/kubb.jpg&quot; alt=&quot;Playing Kubb&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Maps with a Magnifying Glass</title>
		<link href="http://labs.trolltech.com/blogs/2009/07/29/maps-with-a-magnifying-glass/"/>
		<id>http://labs.trolltech.com/blogs/2009/07/29/maps-with-a-magnifying-glass/</id>
		<updated>2009-07-29T06:53:19+00:00</updated>
		<content type="html">&lt;p&gt;Google Maps, or any similar application, becomes very important in our digital life. Not surprisingly, it also becomes easier to integrate some map functionalities into our application. This is something that attracts the developer side of each and every one of us. The brand-new, work-in-progress &lt;a href=&quot;http://code.google.com/intl/de-DE/apis/maps/documentation/v3/&quot;&gt;Google Maps API v3&lt;/a&gt;, via the use of &lt;a href=&quot;http://doc.qtsoftware.com/qtwebkit.html&quot;&gt;QtWebKit module&lt;/a&gt;, is the instant solution for embedding maps in your own beloved Qt-based application.&lt;/p&gt;
&lt;p&gt;Since doing so would be almost trivial (you can even do it within &lt;a href=&quot;http://doc.qtsoftware.com/4.5/designer-manual.html&quot;&gt;Designer&lt;/a&gt; or &lt;a href=&quot;http://www.qtsoftware.com/products/developer-tools&quot;&gt;Creator&lt;/a&gt;), I decided to raise the bar a bit. What if, when your press the mouse button and hold it for a while, a magnifying glass (remember &lt;a href=&quot;http://en.wikipedia.org/wiki/Sherlock_Holmes&quot;&gt;Sherlock Holmes?&lt;/a&gt;) shows up and you can move it around? Thanks to Qt, surprisingly (again) implementing such a demo is easy, the result is less than 300 lines of code, and thus I am glad to share you how it looks like, in a static screenshot and a moving picture (&lt;a href=&quot;http://www.youtube.com/watch?v=n1S4yhYbJ54&quot;&gt;watch in YouTube&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/2QyaMHaE41F3UyGgPHMzZA?feat=embedwebsite&quot;&gt;&lt;br /&gt;
&lt;img border=&quot;0&quot; src=&quot;http://lh4.ggpht.com/_Oijhf1ZPv-4/Sm7dmOzREsI/AAAAAAAABOg/MatC-dvTXgo/s800/mapzoom.png&quot; id=&quot;mapzoom&quot; /&gt;&lt;/a&gt;&lt;/p&gt;





&lt;p&gt;&lt;br /&gt;

&lt;p&gt;The code is checked in already to the &lt;a href=&quot;http://qt.gitorious.org/qt-labs/graphics-dojo&quot;&gt;Graphics Dojo repository&lt;/a&gt;, it is securely stashed under the &lt;a href=&quot;http://qt.gitorious.org/qt-labs/graphics-dojo/trees/master/mapzoom&quot;&gt;mapzoom&lt;/a&gt; subdirectory. If you do not bother to digest the code, here is the trick. I keep a larger version of the map in a separate &lt;a href=&quot;http://doc.qtsoftware.com/qwebpage.html&quot;&gt;QWebPage&lt;/a&gt;. When the user press-and-hold the mouse button for a while, this hidden page is used to render the maps under the magnifying glass, clipped to the shape of a circle. Simple, isn&amp;#8217;t it? Of course, you can still move the maps by dragging the mouse, just like in the normal use of Google Maps.&lt;/p&gt;
&lt;p&gt;Now I am sure some of you are ready to throw the questions. What about Qt/S60 version? What about OpenStreetMap? Relax and be patient a bit. The combination of both will surely make a cameo, some time in the near future, in the form of another example (a successor to this one). Meanwhile, enjoy your maps, Sherlock!&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Ariya Hidayat</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="fr">
		<title type="html">WebKit's week - #9</title>
		<link href="http://hanblog.info/blog/post/2009/07/21/WebKit-s-week-9"/>
		<id>urn:md5:3835501ae8b8aae1895c06b5d6604d75</id>
		<updated>2009-07-21T12:06:00+00:00</updated>
		<content type="html">&lt;p&gt;Week from May 11 to May 24 (before r44117). To test those changes, you'll need a &lt;a href=&quot;http://nightly.webkit.org&quot; hreflang=&quot;en&quot;&gt;WebKit nightly&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/43267&quot; hreflang=&quot;en&quot;&gt;New input types (43267)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;4 new input fields are now supported : url, mail, number et tel (see the &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#url-state&quot; hreflang=&quot;en&quot;&gt;HTML5 spec&lt;/a&gt;). No additional functionality (like completion with the address book, the bookmarks, etc), just a basic support. But we can guess those functionalities will be available later.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/43669&quot; hreflang=&quot;en&quot;&gt;ARIA role : grid(43669)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Even if Safari 4 has a &lt;a href=&quot;http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/AccessibilityRoles.html&quot; hreflang=&quot;en&quot;&gt;basic support&lt;/a&gt; of &lt;a href=&quot;http://www.w3.org/TR/wai-aria/&quot; hreflang=&quot;en&quot;&gt;WAI-ARIA&lt;/a&gt;, the work is not over. New roles are still coming in.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/43739&quot; hreflang=&quot;en&quot;&gt;Orientation and ratio available in CSS (43739)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.w3.org/TR/css3-mediaqueries/&quot; hreflang=&quot;en&quot;&gt;Media queries&lt;/a&gt; in CSS give a better control through knowledge of the properties of the device. WebKit already supports some of those queries. This change adds support for orientation (portrait or landscape) and ration (exact, minimal or maximal) of the view.&lt;/p&gt;


&lt;h3&gt;&lt;a href=&quot;http://trac.webkit.org/changeset/43774&quot; hreflang=&quot;en&quot;&gt;displayName support in the debugger (43774)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Anonymous functions are often used in JavaScript. They are really handy for development but not so much when you have to find where a problem lies. Therefore, Francisco Tolmasky of &lt;a href=&quot;http://280north.com/&quot; hreflang=&quot;en&quot;&gt;280North&lt;/a&gt; got the idea of the function.displayName property. You can now choose what name the debugger will use. Before that, he has also done a similar change for the profiler. I can only recommend the &lt;a href=&quot;http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/&quot; hreflang=&quot;en&quot;&gt;lengthy article&lt;/a&gt; he wrote about it.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;This is everything for this week. Of course, this is just a selection I've made. If you've noticed any other interesting changes, please let me know. Same thing if I got something wrong.&lt;/p&gt;</content>
		<author>
			<name>Anthony Ricaud</name>
			<uri>http://hanblog.info/blog/</uri>
		</author>
		<source>
			<title type="html">Hanblog - WebKit</title>
			<link rel="self" href="http://hanblog.info/blog/feed/category/WebKit/atom"/>
			<id>urn:md5:bf61b2e51f5d21992f38e5e7172f6e92</id>
			<updated>2009-11-17T01:53:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">The WebKit mailinglists</title>
		<link href="http://zecke.blogspot.com/2009/07/webkit-mailinglists.html"/>
		<id>tag:blogger.com,1999:blog-13875843.post-319485258145258445</id>
		<updated>2009-07-18T14:54:56+00:00</updated>
		<content type="html">In the beginning there was &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev&quot;&gt;webkit-dev&lt;/a&gt; but we were overwhelmed by the feedback we got. Last week Maciej &lt;a href=&quot;http://lists.macosforge.org/pipermail/webkit-dev/2009-July/008681.html&quot;&gt;announced&lt;/a&gt; how to use the new lists.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev&quot;&gt;webkit-dev&lt;/a&gt; should be used for the development of WebCore/JavaScriptCore itself.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-help&quot;&gt;webkit-help&lt;/a&gt; should be used for questions on how to use WebKit API in applications, porting to new platforms, building it...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-jobs&quot;&gt;webkit-jobs&lt;/a&gt; is there to not force one to send job posts to every single commiter but to only one place.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13875843-319485258145258445?l=zecke.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>zecke</name>
			<email>noreply@blogger.com</email>
			<uri>http://zecke.blogspot.com/search/label/WebKit</uri>
		</author>
		<source>
			<title type="html">Some Blog</title>
			<subtitle type="html">Some random thoughts</subtitle>
			<link rel="self" href="http://zecke.blogspot.com/feeds/posts/full/-/WebKit"/>
			<id>tag:blogger.com,1999:blog-13875843</id>
			<updated>2009-11-21T11:53:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">A Thank You!</title>
		<link href="http://whtconstruct.blogspot.com/2009/07/thank-you.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-1576458593637091754</id>
		<updated>2009-07-17T00:32:35+00:00</updated>
		<content type="html">A few weeks ago I posted a request for a valid, legal license for Microsoft Windows so that I could do more WebKit work on the weekends or when I only had my MacBook Pro at hand.&lt;br /&gt;&lt;br /&gt;I'm shocked and delighted to report that a kind donor (who wishes to remain anonymous) has provided me with a brand new Windows Vista boxed set.  This is an expensive and very helpful donation, and I greatly apreciate it.&lt;br /&gt;&lt;br /&gt;So many thanks to my anonymous benefactor, and I'm off to buy a larger hard drive so I can set up a respectable partition for it.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-1576458593637091754?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">3D Transforms</title>
		<link href="http://webkit.org/blog/386/3d-transforms/"/>
		<id>http://webkit.org/blog/?p=386</id>
		<updated>2009-07-16T19:02:29+00:00</updated>
		<content type="html">&lt;p&gt;WebKit on Mac OS X now has support for &lt;a href=&quot;http://www.w3.org/TR/css3-3d-transforms/&quot; title=&quot;CSS 3D Transforms Module Level 3&quot;&gt;CSS 3D transforms&lt;/a&gt;, which allow you to position elements on the page in three-dimensional space using CSS. This is a natural extension of 2D transforms, which we described in an earlier &lt;a href=&quot;http://webkit.org/blog/130/css-transforms/&quot; title=&quot;Surfin&amp;#8217; Safari - Blog Archive  &amp;raquo; CSS Transforms&quot;&gt;blog post&lt;/a&gt;. 3D transforms have been supported on iPhone since 2.0, and now we&amp;#8217;re please to announce that we have currently added support for Leopard and later.&lt;/p&gt;
&lt;p&gt;If you want to jump right in and see a demo, make sure you&amp;#8217;re running &lt;a href=&quot;http://nightly.webkit.org/&quot; title=&quot;WebKit Nightly Builds&quot;&gt;recent WebKit nightly build&lt;/a&gt; on Leopard or later, and load this example:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/3d-transforms/poster-circle.html&quot;&gt;Poster Circle&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a screenshot for those not running a recent-enough WebKit (if you are, hover over it for a treat!):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Like many of the examples you&amp;#8217;ll see here, this one combines CSS transforms with &lt;a href=&quot;http://webkit.org/blog/138/css-animation/&quot; title=&quot;Surfin&amp;#8217; Safari - Blog Archive  &amp;raquo; CSS Animation&quot;&gt;CSS transitions and animations&lt;/a&gt; to great effect.&lt;/p&gt;
&lt;p&gt;3D transforms are applied via the same &lt;code&gt;-webkit-transform&lt;/code&gt; property as 2D transforms. For example, here&amp;#8217;s how to rotate an element about the Y (vertical) axis:&lt;/p&gt;
&lt;pre&gt;
-webkit-transform: rotateY(45deg);
&lt;/pre&gt;
&lt;p&gt;There are several new transform functions available for use in the &lt;code&gt;-webkit-transform&lt;/code&gt; property:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;translate3d(x, y, z), translateZ(z)&lt;/dt&gt;
&lt;dd&gt;Move the element in x, y and z, and just move the element in z. Positive z is towards the viewer. Unlike x and y, the z value cannot be a percentage.&lt;/dd&gt;
&lt;dt&gt;scale3d(sx, sy, sz), scaleZ(sz)&lt;/dt&gt;
&lt;dd&gt;Scale the element in x, y and z. The z scale affects the scaling along the z axis in transformed children.&lt;/dd&gt;
&lt;dt&gt;rotateX(angle), rotateY(angle), rotate3d(x, y, z, angle), &lt;/dt&gt;
&lt;dd&gt;The first two forms simply rotate the element about the horizontal and vertical axes. Angle units can be degrees (deg) radians (rad) or gradians (grad). The last form allows you to rotate the element around an arbitrary vector in 3D space; x, y and z should specify the unit vector you wish to rotate around (we&amp;#8217;ll normalize it for you).&lt;/dd&gt;
&lt;dt&gt;perspective(p)&lt;/dt&gt;
&lt;dd&gt;This function allows you to put some perspective into the transformation matrix. For an explanation of &lt;em&gt;p&lt;/em&gt;, see below. Normally perspective is applied via the &lt;code&gt;-webkit-perspective&lt;/code&gt; property, but this function allows you to get a perspective effect for a single element, with something like:&lt;/dd&gt;&lt;/dl&gt;
&lt;pre&gt;
-webkit-transform: perspective(500px) rotateY(20deg);
&lt;/pre&gt;

&lt;dt&gt;matrix3d(&amp;#8230;)&lt;/dt&gt;
&lt;dd&gt;This function allows you to specify the raw 4&amp;#215;4 homogeneous transformation matrix of 16 values in column-major order. Have fun with that!&lt;/dd&gt;

&lt;p&gt;We&amp;#8217;ve also extended one other CSS transform property, and implemented the four other 3D-related properties described in the spec:
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-webkit-transform-origin&lt;/code&gt;&lt;/strong&gt; now accepts three values, allowing you to specify a z offset for the transform origin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-webkit-perspective&lt;/code&gt;&lt;/strong&gt; is used to give an illusion of depth; it determines how things change size based on their z-offset from the z=0 plane. You can think of it as though you&amp;#8217;re looking at the page from a distance &lt;em&gt;p&lt;/em&gt; away. Objects on the z=0 plane appear in their normal size. Something at a z offset of &lt;em&gt;p&lt;/em&gt;/2 (halfway between the viewer and the z=0 plane) will look twice as big, and something at a z offset of -&lt;em&gt;p&lt;/em&gt; will look half as big. Thus, large values give a little foreshortening effect, and small values lots of foreshortening. Values between 500px and 1000px give a reasonable-looking result for most content. &lt;/p&gt;
&lt;p&gt;The default origin for the perspective effect is the center of the element&amp;#8217;s border box, but you can control this with &lt;strong&gt;&lt;code&gt;-webkit-perspective-origin&lt;/code&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;
Here&amp;#8217;s an example that shows how perspective works:
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/3d-transforms/perspective-by-example.html&quot;&gt;Perspective&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; The interesting thing about &lt;code&gt;-webkit-perspective&lt;/code&gt; is that it does not affect the element directly. Instead, it affects the appearance of the 3D transforms on the transformed &lt;em&gt;descendants&lt;/em&gt; of that element; you can think of it as adding a transform that gets multiplied into the descendant transforms. This allows those descendants to all share the same perspective as they move around. &lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve described how you can assign 3D transforms to elements and make them look three-dimensional with some perspective. However, so far, all the effects are really just painting effects. Those transformed children are still rendering into the plane of their parent; in other words, they are &lt;em&gt;flattened&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;When you start to build hierarchies of objects with 3D transforms, flattening is not what you want. You want parents and children to live in a shared three-dimensional space, and to all share the same perspective which propagates up from some container. This is where &lt;code&gt;-webkit-transform-style&lt;/code&gt; comes in. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-webkit-transform-style&lt;/code&gt;&lt;/strong&gt; has two values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flat&lt;/code&gt;: This is the default value, and gives the behavior described above; transformed children are flattened into the plane of their parent (think of the 3D transform as simply a painting effect).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preserves-3d&lt;/code&gt;: This value states that the element to which it is assigned does not flatten its children into it; instead, those children live in a shared 3D space with the element.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;#8217;s an example that shows transform-style in action:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/3d-transforms/transform-style.html&quot;&gt;Transform Style&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A common pattern, therefore, is to have content that looks like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class=&quot;container&quot; style=&quot;-webkit-perspective: 600px&quot;&amp;gt;
  &amp;lt;div class=&quot;box&quot; style=&quot;-webkit-transform-style: preserve-3d; -webkit-transform: rotateY(10deg)&quot;&amp;gt;
    &amp;lt;div class=&quot;leaf&quot; style=&quot;-webkit-transform: rotateX(10deg)&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Here both &amp;#8216;leaf&amp;#8217; and &amp;#8216;box&amp;#8217; share the same 3D space, so both appear with the perspective specified on the container. &amp;#8216;box&amp;#8217; can also be rotated with a transition or animation, and &amp;#8216;leaf&amp;#8217; will move around as &amp;#8216;box&amp;#8217; moves, in perspective.&lt;/p&gt;
&lt;p&gt;One thing you may have noticed in these demos is that it&amp;#8217;s quite common to have a 3D transform that flips an element around so that you can see its reverse side. In some cases you don&amp;#8217;t want the element to appear at all in this situation (say, for example, you want to position two elements back-to-back, so you need to hide the one that&amp;#8217;s facing away from the viewer). This is the reason for the last 3d-related property, &lt;strong&gt;&lt;code&gt;-webkit-backface-visibility&lt;/code&gt;&lt;/strong&gt;. Its two values&amp;mdash;&lt;code&gt;visible&lt;/code&gt; (the default), and &lt;code&gt;hidden&lt;/code&gt;&amp;mdash;specify whether the element is visible or not when that element is transformed such that its back face is towards the viewer. &lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a final example that shows backface-visibility in action, along with more 3D goodness, animations and transitions:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.org/blog-files/3d-transforms/morphing-cubes.html&quot;&gt;Morphing Power Cubes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://webkit.org/blog-files/3d-transforms/mighty-cubes.png&quot; width=&quot;415&quot; height=&quot;175&quot; alt=&quot;Mighty Cubes&quot; /&gt;&lt;/p&gt;
&lt;p&gt; For more information, see the CSS working drafts on &lt;a href=&quot;http://www.w3.org/TR/css3-2d-transforms/&quot; title=&quot;CSS 2D Transforms Module Level 3&quot;&gt;2D transforms&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/css3-3d-transforms/&quot; title=&quot;CSS 3D Transforms Module Level 3&quot;&gt;3D transforms&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/css3-transitions/&quot; title=&quot;CSS Transitions Module Level 3&quot;&gt;transitions&lt;/a&gt; and &lt;a href=&quot;http://www.w3.org/TR/css3-animations/&quot; title=&quot;CSS Animations Module Level 3&quot;&gt;animations&lt;/a&gt;. There is also documentation in the &lt;a href=&quot;http://developer.apple.com/safari/library/documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Transforms/Transforms.html&quot; title=&quot;Safari Visual Effects Guide: Transforms&quot;&gt;Safari Reference Library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We hope you have a blast with these new features, and share your creations with us. If you find bugs, please report them at &lt;a href=&quot;http://bugs.webkit.org/&quot;&gt;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/atom/</id>
			<updated>2009-11-21T22:53:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKitGTK+ progress, and a new browser!</title>
		<link href="http://blog.kov.eti.br/?p=83"/>
		<id>http://blog.kov.eti.br/?p=83</id>
		<updated>2009-07-16T11:43:17+00:00</updated>
		<content type="html">&lt;p&gt;Long time, no blog. I have apparently been slacking for a very high number of versions, now, so I better start doing something about it!&lt;/p&gt;
&lt;p&gt;My last blog was about 1.1.7, and we are now at 1.1.11, so let me try to get a quick summary of important changes since 1.1.17:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lots of fixes have been made on the scrolling code, which now behaves more like you would expect from a GTK+ widget, and notifications to web applications are also working now&lt;/li&gt;
&lt;li&gt;Thanks to the awesome zecke, you can embed arbitrary GTK+ widgets using the &amp;lt;object&amp;gt; and &amp;lt;embed&amp;gt; tags, using the create-plugin-widget signal&lt;/li&gt;
&lt;li&gt;WebKitNetworkRequest received a lot of the love it was asking for, and is now very useful for tracking the HTTP conversation&lt;/li&gt;
&lt;li&gt;Xan has done awesome work on a11y, and we may have enough done before 2.28 to make WebKitGTK+ be accepted, but that remains to be seen; if you care about that, now is a good time to go to https://bugs.webkit.org/show_bug.cgi?id=25531 and help out!&lt;/li&gt;
&lt;li&gt;XSS auditor, a new feature built to improve WebKit&amp;#8217;s security is now enabled&lt;/li&gt;
&lt;li&gt;Copying and pasting has seen many improvements&lt;/li&gt;
&lt;li&gt;WebKitGTK+ no longer has hackish content sniffing, since we now have that implemented into libsoup!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other news, WebKitGTK+ seems to have gained another application for its ecosystem: &lt;a href=&quot;http://www.uzbl.org/&quot;&gt;Uzbl&lt;/a&gt;, which promises to be a good browser for people who like to work with the UNIX way. It doesn&amp;#8217;t really appeal to my GNOMEr &amp;#8216;I like things that just work&amp;#8217; heart, but it looks like a tool that may appeal to people who prefer building their work environments from various different pieces, so that it works exactly like they want to. I am very happy to see WebKitGTK+ is making it possible for people to write such tools!&lt;/p&gt;</content>
		<author>
			<name>Gustavo Noronha</name>
			<uri>http://blog.kov.eti.br</uri>
		</author>
		<source>
			<title type="html">Gustavo Noronha (kov) » webkit</title>
			<subtitle type="html">um hacker debiano que mora num lugar chamado mundo</subtitle>
			<link rel="self" href="http://blog.kov.eti.br/wp-rss2.php?cat=16"/>
			<id>http://blog.kov.eti.br/wp-rss2.php?cat=16</id>
			<updated>2009-11-10T20:53:19+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">WebKit Cairo Windows Port Landed!</title>
		<link href="http://whtconstruct.blogspot.com/2009/07/webkit-cairo-windows-port-landed.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-4086857735232769453</id>
		<updated>2009-07-13T18:21:44+00:00</updated>
		<content type="html">&lt;div&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SlvNxzp6OkI/AAAAAAAAAIA/F7-BsWWcZVM/s1600-h/Picture+5.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_hInRJC0BnDo/SlvNxzp6OkI/AAAAAAAAAIA/F7-BsWWcZVM/s320/Picture+5.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5358102437250611778&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It's been a long, hard road, but today marks the &lt;a href=&quot;http://trac.webkit.org/changeset/45846&quot;&gt;commit&lt;/a&gt; of the last missing element of the Windows Cairo port.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Literally every bit of code I use on my system to build WebKit on Windows using the non-Apple support libraries is now part of the official WebKit archive.  This means that you can now embed a WebView in your Windows application that harnesses the full power and features of the best rendering engine out there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To celebrate, I am posting here an image of &lt;a href=&quot;http://www.satine.org/research/webkit/snowleopard/snowstack.html&quot;&gt;Satine.org&lt;/a&gt;'s CSS animation demo&quot;SnowStack&quot;.  It runs fairly well on my local Debug build.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Out of sheer meanness, I am also attaching the same website viewed with IE 8...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/SlvO25FhJXI/AAAAAAAAAII/uQUAcwjIsRE/s1600-h/Picture+6.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_hInRJC0BnDo/SlvO25FhJXI/AAAAAAAAAII/uQUAcwjIsRE/s320/Picture+6.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5358103624119559538&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-4086857735232769453?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">I Need Port Name Ideas!</title>
		<link href="http://whtconstruct.blogspot.com/2009/07/i-need-port-name-ideas.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-9218348723488968208</id>
		<updated>2009-07-10T01:07:14+00:00</updated>
		<content type="html">One of the few remaining tasks holding up complete integration of the Redistributable Windows WebKit port is an official name.  I tried using the term &quot;Redistributable WebKit&quot;, but this met with somewhat negative feedback.&lt;br /&gt;&lt;br /&gt;So, what do all of YOU think would be a good name?&lt;br /&gt;&lt;br /&gt;Maybe I could commandeer the abandoned SquirrelFish name? ;-)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-9218348723488968208?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Clearing caches on system signal</title>
		<link href="http://webkit.sed.hu/node/20"/>
		<id>http://webkit.sed.hu/20 at http://webkit.sed.hu</id>
		<updated>2009-07-06T11:28:21+00:00</updated>
		<content type="html">&lt;p&gt;Currently, I'm experimenting with WebKit to release all the memory what we can on given conditions. This can be useful in low memory situations or when the system goes asleep (less RAM usage needs less power).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.sed.hu/node/20&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>University of Szeged</name>
			<uri>http://webkit.sed.hu</uri>
		</author>
		<source>
			<title type="html">WebKit Apocrypha</title>
			<link rel="self" href="http://webkit.sed.hu/rss.xml"/>
			<id>http://webkit.sed.hu/rss.xml</id>
			<updated>2009-11-21T22:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A QtWebKit KPart is no answer for a KDE browser</title>
		<link href="http://www.kdedevelopers.org/node/3998"/>
		<id>http://www.kdedevelopers.org/3998 at http://www.kdedevelopers.org</id>
		<updated>2009-07-01T20:13:12+00:00</updated>
		<content type="html">&lt;p&gt;&lt;b&gt;Disclaimer: I have no desire to re-ignite KHTML vs WebKit arguments.  Rather, the purpose of this blog post is to hopefully enlighten a technical question.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Over the last few months I've heard many KDE developers in various forums bemoan the lack of a working and stable WebKit KPart.  The motivation behind this complaint seems to be that KDE folk want a WebKit browser option for KDE.  Thus the naive solution is to just get the WebKit KDE KPart in shape.  Given this motivation... the solution is wrong IMO.&lt;/p&gt;
&lt;p&gt;I can speak from some experience here.  I've been working on QtWebKit for quite awhile and have also worked - in the past - on the WebKit KPart plus Konqueror integration that Simon started.  For a time, it was building and running just fine.  You could install it and change a configuration file and Konqueror would render using QtWebKit.  However, the integration was *far* from complete.  Plumbing the sources of Konqueror I learned a nasty secret: Konqueror is highly KHTML API specific.  Konqueror has deep integration with KHTML that goes far above and beyond the KPart API.  Creating a QtWebKit KPart is woefully insufficient for the purpose of providing anything more than a basic HTML viewer.  &lt;/p&gt;
&lt;p&gt;A simple HTML viewer is no where close to a fully modern desktop browser.&lt;/p&gt;
&lt;p&gt;This all makes sense if you stop to think about the history of Konqueror.  Konqueror is a generic desktop shell.  It is designed to allow basic viewing of various documents in various formats.  Of course, it has become much, much, more than that.  And the key to this growth of features is Konqueror's steady adoption of API's above and beyond the generic KPart API.&lt;/p&gt;
&lt;p&gt;Which brings me to my point: if parts of the KDE community truly want a modern browser based on QtWebKit they'd best be looking at solutions beyond Konqueror.  Otherwise you are left with two hacky solutions:  make a QtWebKit KPart that is API compatible with KHTMLPart OR migrate Konqueror source to make it less dependent on KHTMLPart.  The former is not going to be fun as the KHTMLPart API is not refined or polished and highly KHTML specific.  The latter can only be accomplished with a lot of work set aside for refactoring or through nasty '#ifdef KHTML callThisWay() #else callThatWay();'&lt;/p&gt;
&lt;p&gt;Both of these solutions are sub-optimal in my opinion.&lt;/p&gt;</content>
		<author>
			<name>Adam Treat</name>
			<uri>http://www.kdedevelopers.org/blog/105</uri>
		</author>
		<source>
			<title type="html">manyoso's blog</title>
			<subtitle type="html">KDE Development in action.</subtitle>
			<link rel="self" href="http://www.kdedevelopers.org/blog/105/feed"/>
			<id>http://www.kdedevelopers.org/blog/105/feed</id>
			<updated>2009-11-21T22:53:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Transparent QWebView (or QWebPage)</title>
		<link href="http://labs.trolltech.com/blogs/2009/06/30/transparent-qwebview-or-qwebpage/"/>
		<id>http://labs.trolltech.com/blogs/2009/06/30/transparent-qwebview-or-qwebpage/</id>
		<updated>2009-06-29T23:01:44+00:00</updated>
		<content type="html">&lt;p&gt;If you use &lt;a href=&quot;http://doc.trolltech.com/qwebview.html&quot;&gt;QWebView&lt;/a&gt;, do you know how make its background to be translucent? Apparently, the trick is not so well known, hence I decide to share it here.&lt;/p&gt;
&lt;p&gt;Basically it boils down the following code snippet:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;QPalette palette = view-&amp;gt;palette();&lt;br /&gt;
palette.setBrush(QPalette::Base, Qt::transparent);&lt;br /&gt;
view-&amp;gt;page()-&amp;gt;setPalette(palette);&lt;br /&gt;
view-&amp;gt;setAttribute(Qt::WA_OpaquePaintEvent, false);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The first three lines set a new transparent brush for the page. This is necessary so that all the painting is blended properly. The last one ensures that the web view is not opaque, i.e. it does not paint all the pixels contained in its rectangle. Opaque paint event for QWebView is the default, most of the time you want to have a web page with typical normal background color, either set by the web page or something you specify as the fallback color.&lt;/p&gt;
&lt;p&gt;If you combine QWebView see-through background with top-level widget opacity feature (see what &lt;a href=&quot;http://labs.trolltech.com/blogs/2008/09/23/translucent-widgets-on-x11/&quot;&gt;Samuel wrote about this&lt;/a&gt; some time ago), you will get something like the following screenshot (the wallpaper image is Soft Green, from Valient Gough). Neat, isn&amp;#8217;t it? Note that of course it requires a window system which supports composition, e.g. modern X11 window manager, recent versions of Windows, and so on.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://picasaweb.google.com/lh/photo/CrUv9s8Lpu4QGAtuuhLvLQ?feat=embedwebsite&quot;&gt;&lt;br /&gt;
&lt;img id=&quot;transparentweb&quot; src=&quot;http://lh6.ggpht.com/_Oijhf1ZPv-4/SivccHwuKMI/AAAAAAAABBo/thRKJ9kpqYA/s400/transparentweb.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;As usual, the code for this short example is available from &lt;a href=&quot;http://qt.gitorious.org/qt-labs/graphics-dojo&quot;&gt;the git repository&lt;/a&gt;, just check the &lt;a href=&quot;http://qt.gitorious.org/qt-labs/graphics-dojo/trees/master/transparentweb&quot;&gt;transparentweb&lt;/a&gt; subdirectory. Again, I already prepared both the Qt/C++ and Python (via PyQt) versions. Enjoy!&lt;/p&gt;</content>
		<author>
			<name>Ariya Hidayat</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Port of QtWebKit to S60</title>
		<link href="http://labs.trolltech.com/blogs/2009/06/29/port-of-qtwebkit-to-s60/"/>
		<id>http://labs.trolltech.com/blogs/2009/06/29/port-of-qtwebkit-to-s60/</id>
		<updated>2009-06-29T15:06:48+00:00</updated>
		<content type="html">&lt;p&gt;In the recent pre-release of Qt for S60 we have included a build of WebKit that compiles and runs on S60. This pre-release is an important milestone for this porting effort that started about half a year ago. Hence, I would like to briefly highlight a few things about it:&lt;/p&gt;
&lt;p&gt;The main work is finding good solutions for quirks in the toolchain. That includes the ARM RVCT compiler and the Metrowerks compiler used by the emulator on Windows, both with their own unique set of challenges.&lt;/p&gt;
&lt;p&gt;The team working on this consists of Norbert Leser and Laszlo Gombos from the Nokia Browser Team in Boston as well as Janne Koskinen from Digia and Kristian Amlie from the QtSoftware Team here in Oslo. In addition Ariya wrote the little but super-cool anomaly demo browser, which is included in the Qt/S60 Tower release. The port is still in early stages, but it&amp;#8217;s looking quite good already and rather performant.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve been maintaining the patches in separate repositories and we&amp;#8217;ve been pushing patches in small steps upstream for a few months now. There&amp;#8217;s still a lot to go, but things are progressing. And the result is looking really cool &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;
&lt;p&gt;&lt;center&gt;&lt;img src=&quot;http://labs.trolltech.com/blogs/wp-content/uploads/2009/06/qtwebkits60.png&quot; alt=&quot;QtWebKit for Qt/S60 running on 5800 and N87&quot; /&gt;&lt;/center&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon</name>
			<uri>http://labs.trolltech.com/blogs</uri>
		</author>
		<source>
			<title type="html">Qt 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>2009-11-20T03:53:05+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Helping Out -- Windows License</title>
		<link href="http://whtconstruct.blogspot.com/2009/06/helping-out-windows-license.html"/>
		<id>tag:blogger.com,1999:blog-3416807.post-1486213465130647117</id>
		<updated>2009-06-28T20:07:34+00:00</updated>
		<content type="html">&lt;a href=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SkggySSc3RI/AAAAAAAAAH4/07thgw-jLJ4/s1600-h/IMG_0350.jpg&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_hInRJC0BnDo/SkggySSc3RI/AAAAAAAAAH4/07thgw-jLJ4/s320/IMG_0350.jpg&quot; border=&quot;0&quot; alt=&quot;Example of not using WebKit&quot; id=&quot;BLOGGER_PHOTO_ID_5352564205404609810&quot; /&gt;&lt;/a&gt;&lt;br /&gt;A few people who have found the Windows Cairo WebKit port useful have asked if there was any way to 'donate' to the project or otherwise help out.  While the most useful thing anyone can do is to contribute debugging or coding help, there one thing that would really help me out would be if someone could contribute a valid (i.e., Legally transferrable) Windows XP, Windows Vista, or (someday) Windows 7 license so I could do more coding after hours or one weekends.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To help motivate your desire to donate such a license, I present here a photo I took while on vacation this past week.  This is a nice example of what awaits you if you rely on Internet Explorer for your &lt;a href=&quot;http://www.chabotspace.org/default.asp&quot;&gt;web kiosk&lt;/a&gt; needs!  ;-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3416807-1486213465130647117?l=whtconstruct.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Brent</name>
			<email>bfulgham@gmail.com</email>
			<uri>http://whtconstruct.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">We Have The Construction!</title>
			<subtitle type="html">Rantings and Ravings about WebKit, Graphics, and functional programming.</subtitle>
			<link rel="self" href="http://whtconstruct.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-3416807</id>
			<updated>2009-11-21T15:53:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">QtWebKit has been ported to S60</title>
		<link href="http://sideshowbarker.net/2009/06/26/s60-qtwebkit/"/>
		<id>http://sideshowbarker.net/2009/06/26/s60-qtwebkit/</id>
		<updated>2009-06-25T18:33:33+00:00</updated>
		<content type="html">&lt;p&gt;Alessandro Portale has &lt;a href=&quot;http://labs.trolltech.com/blogs/2009/06/25/the-new-pre-release-of-qt-for-s60-is-there/announced&quot;&gt;announced the “Tower” release of the Qt for S60&lt;/a&gt;. He writes that “there are three fresh modules: Phonon, QtSql and &lt;b&gt;QtWebkit&lt;/b&gt;”, and adds that “QtWebkit on S60 is still considered experimental. However, You should already be able to start developing QtWebKit refined applications for the pocket.”&lt;/p&gt;
&lt;p&gt;QtWebKit is a port of the WebKit browser engine to the Qt cross-platform application-development framework, and Qt for S60 is in turn a port of Qt to the Symbian OS, widely used on mobile devices.&lt;/p&gt;</content>
		<author>
			<name>Michael(tm)Smith</name>
			<email>mike@w3.org</email>
			<uri>http://sideshowbarker.net</uri>
		</author>
		<source>
			<title type="html">Michael(tm) Smith</title>
			<subtitle type="html">smith@sideshowbarker.net</subtitle>
			<link rel="self" href="http://sideshowbarker.net/feed/"/>
			<id>http://sideshowbarker.net/feed/atom/</id>
			<updated>2009-11-13T02:53:10+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ever wanted to compare different JIT engines? Now that is possible!</title>
		<link href="http://webkit.sed.hu/node/19"/>
		<id>http://webkit.sed.hu/19 at http://webkit.sed.hu</id>
		<updated>2009-06-25T14:14:12+00:00</updated>
		<content type="html">&lt;p&gt;It is well known that runtime profiling is handy when we want to measure the runtime cost of different functions, identify the performance bottlenecks of the code, or measure the progress of the project over a period. However, most profiling mechanisms are tied to a specific project, which makes the comparison of different solutions impossible. I have developed a simple library, which can easily be added to any existing JIT engine. The attached tgz contains patches for wide-spread JIT engines (namely WebKit-JavaScriptCore and Tamarin-NanoJIT).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webkit.sed.hu/node/19&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>University of Szeged</name>
			<uri>http://webkit.sed.hu</uri>
		</author>
		<source>
			<title type="html">WebKit Apocrypha</title>
			<link rel="self" href="http://webkit.sed.hu/rss.xml"/>
			<id>http://webkit.sed.hu/rss.xml</id>
			<updated>2009-11-21T22:53:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Developer Tools for Google Chrome</title>
		<link href="http://blog.chromium.org/2009/06/developer-tools-for-google-chrome.html"/>
		<id>tag:blogger.com,1999:blog-2471378914199150966.post-2373106468846215816</id>
		<updated>2009-06-24T16:44:00+00:00</updated>
		<content type="html">&lt;div&gt;Since the &lt;a href=&quot;http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html&quot;&gt;initial launch&lt;/a&gt; of Google Chrome back in September we have had the Elements and Resources tabs of WebKit's &lt;a href=&quot;http://webkit.org/blog/197/web-inspector-redesign/&quot;&gt;Inspector&lt;/a&gt; available. We are now ready to present Inspector's Scripts and Profiles panels built on top of the V8 engine providing web developers with full-featured Javascript debugger and sample-based profiler in the &lt;a href=&quot;http://dev.chromium.org/getting-involved/dev-channel&quot;&gt;dev channel&lt;/a&gt; release of Google Chrome. We are also re-introducing the Elements and Resources tabs running out of process for better robustness, security and support for the new debugger and profiler setup.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can invoke new developer tools by selecting &quot;JavaScript console&quot; from the Developer menu (or using Ctrl+Shift+J). For example, running the statistical profiler on the V8 benchmark suite (below screenshot) will give exact information on the actual code execution as the data is generated straight from running the optimized code from V8.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_LJuAPqyUVas/SkJYlwK1GdI/AAAAAAAAABM/Yfvhg-wKJQw/s1600-h/dcq7s2gz_24c6f7jdhc_b.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_LJuAPqyUVas/SkJYlwK1GdI/AAAAAAAAABM/Yfvhg-wKJQw/s400/dcq7s2gz_24c6f7jdhc_b.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5350936712878299602&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As with the rest of Google Chrome, the developer tools are open source and built upon WebKit and in particular WebKit's Inspector. We would love to get feedback - both in terms of bugs reports and feature requests - on the Chromium public &lt;a href=&quot;http://code.google.com/p/chromium/issues/list?q=area%3DDevTools&quot;&gt;issue tracker&lt;/a&gt;. Or even better yet, we would love to get contributions to improving developer tools further in WebKit and Google Chrome.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class=&quot;post-author&quot;&gt;Posted by Yury Semikhatsky, Software Engineer&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/2471378914199150966-2373106468846215816?l=blog.chromium.org&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ian Fette</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.chromium.org/</uri>
		</author>
		<source>
			<title type="html">Chromium Blog</title>
			<link rel="self" href="http://blog.chromium.org/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-2471378914199150966</id>
			<updated>2009-11-21T21:53:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Background rationale for layered architecture of WebKit JavaScript engine</title>
		<link href="http://sideshowbarker.net/2009/06/22/webkit-jit-layering/"/>
		<id>http://sideshowbarker.net/2009/06/22/webkit-jit-layering/</id>
		<updated>2009-06-21T21:19:06+00:00</updated>
		<content type="html">&lt;p&gt;A recent WebKit &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=24986#c43&quot;&gt;bug comment from Gavin Barraclough&lt;/a&gt; gives some insights into the rationale for the layered architecture and MacroAssembler used in the current JavaScript engine in WebKit. Some excerpts from that comment:&lt;/p&gt;
&lt;blockquote cite=&quot;https://bugs.webkit.org/show_bug.cgi?id=24986#c43&quot;&gt;
&lt;p&gt;The abstract code generation layer (MacroAssembler interface down) is layered like a traditional compiler. In a traditional compiler, it is common to have an assembler layer completely independent of the compiler (often a separate application). The compiler takes a source code file, compiles it, and produces an output file of assembly code.…&lt;/p&gt;
&lt;p&gt;Layering the compiler on top of an assembler in this fashion provides a number of benefits. For the compiler developer, layering the compiler on the assembler separates the instruction selection from the minutiae of machine instruction encoding.  For clients of the compiler providing a well defined language for machine instruction generation is useful if the compiler provides facilities to bypass the higher level language, and directly emit a specific sequence of machine instructions…&lt;/p&gt;
&lt;p&gt;The assembler interface within the JIT is designed to closely mimic that of the assembler layer in a traditional compiler…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If that sounds interesting, you can find a lot more details by reading the &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=24986#c43&quot;&gt;full text of the comment&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Michael(tm)Smith</name>
			<email>mike@w3.org</email>
			<uri>http://sideshowbarker.net</uri>
		</author>
		<source>
			<title type="html">Michael(tm) Smith</title>
			<subtitle type="html">smith@sideshowbarker.net</subtitle>
			<link rel="self" href="http://sideshowbarker.net/feed/"/>
			<id>http://sideshowbarker.net/feed/atom/</id>
			<updated>2009-11-13T02:53:10+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit destined to get its own content sniffer</title>
		<link href="http://sideshowbarker.net/2009/06/22/webkit-sniffer/"/>
		<id>http://sideshowbarker.net/2009/06/22/webkit-sniffer/</id>
		<updated>2009-06-21T20:50:34+00:00</updated>
		<content type="html">&lt;p&gt;Web/browser-security maven and coder Adam Barth has been working on implementing a &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=25064&quot;&gt;content sniffer in WebKit&lt;/a&gt;, based on a content-sniffing algorithm that was originally specified in  the HTML5 draft, but that’s now specified as a separate IETF draft that Adam is editing and that’s titled, &lt;a href=&quot;http://tools.ietf.org/id/draft-abarth-mime-sniff&quot;&gt;Content-Type Processing Model&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;WebKit applications/ports for particular platforms all currently need to rely on platform-specific content-sniffer code outside of WebKit. There are some reasons why it’s a good idea to do things that way — but there are also some good reasons not to; as Adam notes, doing things that way runs the risk of creating compatibility and security differences among various WebKit ports. So implementing a content-sniffer in WebKit itself will eliminate those differences.&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://sideshowbarker.net/2009/06/22/webkit-sniffer/#more-54&quot;&gt;[&amp;#8230;Continued&amp;#8230;]&lt;/a&gt;
&lt;/p&gt;</content>
		<author>
			<name>Michael(tm)Smith</name>
			<email>mike@w3.org</email>
			<uri>http://sideshowbarker.net</uri>
		</author>
		<source>
			<title type="html">Michael(tm) Smith</title>
			<subtitle type="html">smith@sideshowbarker.net</subtitle>
			<link rel="self" href="http://sideshowbarker.net/feed/"/>
			<id>http://sideshowbarker.net/feed/atom/</id>
			<updated>2009-11-13T02:53:10+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebKit: Facilitating alternative/experimental implementations of existing features vs. discouraging unnecessary duplication of efforts</title>
		<link href="http://sideshowbarker.net/2009/06/22/webkit-project/"/>
		<id>http://sideshowbarker.net/2009/06/22/webkit-project/</id>
		<updated>2009-06-21T18:45:14+00:00</updated>
		<content type="html">&lt;p&gt;On the webkit-dev mailing list back in April, there was an &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/thread.html#7313&quot;&gt;interesting thread&lt;/a&gt; that Michael Nordman from the Google Chrome team started with a &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007313.html&quot;&gt;message titled, “AppCache functionality provided by the embedder of webkit”&lt;/a&gt; (related to the offline-Web-applications feature in HTML5). Michael begins that message with this paragraph:&lt;/p&gt;
&lt;blockquote cite=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007313.html&quot;&gt;
&lt;p&gt;I’m working on the app cache for Chrome. We’ve decided to hoist most the functionality provided by the app cache into Chrome’s main browser process, so we won’t be using most of the implementation provided by WebKit. I’d like to work through what changes to make within WebKit/WebCore to allow an embedder pull that off. Any suggestions would be much appreciated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Darin Adler responded with &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007314.html&quot;&gt;some thoughts and a question&lt;/a&gt; (to which Michael &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007315.html&quot;&gt;replied&lt;/a&gt;) but the discussion about specifics didn’t go anywhere after that (not on the mailing list at least), because in the &lt;a href=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007316.html&quot;&gt;next message in the thread&lt;/a&gt;, Maciej Stachowiak replied to question the general approach — in fact, to question whether the WebKit trunk should be providing mechanisms to facilitate replacements of parts of its own core code:&lt;/p&gt;
&lt;blockquote cite=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007316.html&quot;&gt;
&lt;p&gt;It’s been a recurring theme for the Chrome team to request hooks to bypass WebKit functionality and replace it with Chrome-specific code  that lives outside the WebKit tree. So far this has been mostly for  code developed when Chrome was originally a secret project. While we  felt it was best to grandfather in the existing carve-outs, in general  I believe this is not the best way to move the WebKit project forward.  I would not like to see this pattern replicated for newly developed  functionality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Earlier in the same message, Maciej cites a reason why facilitating the proposed general approach can have a potentially negative side effect:&lt;/p&gt;
&lt;blockquote cite=&quot;https://lists.webkit.org/pipermail/webkit-dev/2009-April/007316.html&quot;&gt;
&lt;p&gt;One downside of this approach is that, if the application cache ever  needs to change, it may be necessary to make changes to two separate  implementations hosted in different repositories. In addition, quality-of-implementation improvements to one version won’t benefit the other.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;a href=&quot;http://sideshowbarker.net/2009/06/22/webkit-project/#more-52&quot;&gt;[&amp;#8230;Continued&amp;#8230;]&lt;/a&gt;
&lt;/p&gt;</content>
		<author>
			<name>Michael(tm)Smith</name>
			<email>mike@w3.org</email>
			<uri>http://sideshowbarker.net</uri>
		</author>
		<source>
			<title type="html">Michael(tm) Smith</title>
			<subtitle type="html">smith@sideshowbarker.net</subtitle>
			<link rel="self" href="http://sideshowbarker.net/feed/"/>
			<id>http://sideshowbarker.net/feed/atom/</id>
			<updated>2009-11-13T02:53:10+00:00</updated>
			<rights type="html">Copyright 2009</rights>
		</source>
	</entry>

</feed>
