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

  <title><![CDATA[Paul Irish]]></title>
  <link href="https://paulirish.com/atom.xml" rel="self"/>
  <link href="https://paulirish.com/"/>
  <updated>2024-11-18T17:39:52-08:00</updated>
  <id>https://paulirish.com/</id>
  <author>
    <name><![CDATA[Paul Irish]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Video Stabilization with `ffmpeg` and `VidStab`]]></title>
    <link href="https://paulirish.com/2021/video-stabilization-with-ffmpeg-and-vidstab/"/>
    <updated>2021-04-30T11:33:00-07:00</updated>
    <id>https://paulirish.com/2021/video-stabilization-with-ffmpeg-and-vidstab</id>
    <content type="html"><![CDATA[<p>Way back in Dec 2015, @maxogden wrote a nice <a href="https://web.archive.org/web/20230515000000*/https://gist.github.com/maxogden/43219d6dcb9006042849">guide</a> on stabilizing your own video with ffmpeg. I return to it on occasion and have updated my gist comment to offer some updated commands. Since enough has changed regarding installation and use, I figure a new, spiffy, and working guide deserves a non-gist home.</p>

<p>Presenting the 2021-era guide to pretty easy DIY video stabilization!</p>

<h4>On Mac OS, install <code>ffmpeg</code> and <code>vidstab</code> from homebrew:</h4>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>brew install ffmpeg
</span><span class='line'>brew install libvidstab
</span></code></pre></td></tr></table></div></figure>


<p>On linux, you can <a href="https://github.com/georgmartius/vid.stab#installation-instructions"><code>sudo make install</code></a>.</p>

<h4>Run stabilization in two passes</h4>

<p>There are <a href="https://github.com/georgmartius/vid.stab#available-options-with-vidstab-filters">plenty of options for libvidstab</a>, like <code>shakiness</code>, <code>accuracy</code>, <code>smoothing</code>. The defaults are good, but you may want to experiment. There&#8217;s even a visual diagnostic mode.</p>

<p>Assuming the source video is named <strong><code>clip.mkv</code></strong>…</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># The first pass (&#39;detect&#39;) generates stabilization data and saves to `transforms.trf`</span>
</span><span class='line'><span class="c"># The `-f null -` tells ffmpeg there&#39;s no output video file</span>
</span><span class='line'>ffmpeg -i clip.mkv -vf vidstabdetect -f null -
</span><span class='line'>
</span><span class='line'><span class="c"># The second pass (&#39;transform&#39;) uses the .trf and creates the new stabilized video.</span>
</span><span class='line'>ffmpeg -i clip.mkv -vf vidstabtransform clip-stabilized.mkv
</span></code></pre></td></tr></table></div></figure>


<p>You now have a <strong><code>clip-stabilized.mkv</code></strong>!</p>

<h4>Bonus: create a comparison video</h4>

<p>Use the <code>vstack</code> or <code>hstack</code> filter, depending on if you want them stacked vertically or side-by-side:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># vertically stacked</span>
</span><span class='line'>ffmpeg -i clip.mkv -i clip-stabilized.mkv  -filter_complex vstack clips-stacked.mkv
</span><span class='line'>
</span><span class='line'><span class="c"># side-by-side</span>
</span><span class='line'>ffmpeg -i clip.mkv -i clip-stabilized.mkv  -filter_complex hstack clips-sxs.mkv
</span></code></pre></td></tr></table></div></figure>


<h4>Double bonus: A two-liner that does everything (because repeating these filenames gets annoying)</h4>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nb">export </span><span class="nv">vid</span><span class="o">=</span><span class="s2">&quot;sourcevid.mkv&quot;</span>
</span><span class='line'>ffmpeg -i <span class="s2">&quot;$vid&quot;</span> -vf vidstabdetect -f null -; ffmpeg -i <span class="s2">&quot;$vid&quot;</span> -vf vidstabtransform <span class="s2">&quot;$vid.stab.mkv&quot;</span>; ffmpeg -i <span class="s2">&quot;$vid&quot;</span> -i <span class="s2">&quot;$vid.stab.mkv&quot;</span>  -filter_complex vstack <span class="s2">&quot;$vid.stacked.mkv&quot;</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[rAF Internals &amp; Node Debugging Guide]]></title>
    <link href="https://paulirish.com/2018/raf-internals-and-node-debugging-guide/"/>
    <updated>2018-02-28T12:33:00-08:00</updated>
    <id>https://paulirish.com/2018/raf-internals-and-node-debugging-guide</id>
    <content type="html"><![CDATA[<p>I&#8217;ve published a few articles on Medium that may interest the reader here:</p>

<h5><a href="https://medium.com/@paul_irish/requestanimationframe-scheduling-for-nerds-9c57f7438ef4">requestAnimationFrame Scheduling For Nerds</a></h5>

<p>Understand how rAF callbacks are scheduled and why its very reasonable to have multiple callbacks execute within the same frame.</p>

<h5><a href="https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27">Debugging Node.js with Chrome DevTools</a></h5>

<p>The canonical guide to using the Chrome DevTools UI for debugging Node.js. It definitely beats console.log. ;)</p>

<hr />

<p>Aside from that, I&#8217;ve been busy working on <a href="https://github.com/GoogleChrome/lighthouse/">Lighthouse</a>, performance metrics, tooling, and DevTools.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Advanced Performance Audits with DevTools]]></title>
    <link href="https://paulirish.com/2015/advanced-performance-audits-with-devtools/"/>
    <updated>2015-03-27T08:46:00-07:00</updated>
    <id>https://paulirish.com/2015/advanced-performance-audits-with-devtools</id>
    <content type="html"><![CDATA[<p>Recently, I&#8217;ve spent some time recently profiling real-world mobile websites. Using the <a href="https://docs.google.com/document/d/1bYMyE6NdiAupuwl7pWQfB-vOZBPSsXCv57hljLDMV8E/edit">1000/100/6 performance model</a><sup>1</sup>, and spelunking deep into each app, the findings have been fascinating.</p>

<p>I&#8217;ve written up case study documents for each, incorporating all the findings:</p>

<ol>
<li>Illustrated diagnoses for the poor performance</li>
<li>What actions the developer should take</li>
<li>How Chrome&#8217;s tooling should improve</li>
<li>Questions and insights for the rendering engine (Blink)</li>
</ol>


<p><a href="https://docs.google.com/document/d/1K-mKOqiUiSjgZTEscBLjtjd6E67oiK8H2ztOiq5tigk/pub">➜ Perf Audits: CNet, Time, Google Play</a></p>

<p>In this doc, we look at the scrolling of CNET, input latency on CNET, some very interesting challenges on the responsive Time.com, and infinite scroll on Google Play&#8217;s desktop site.</p>

<p>The intended audience is browser engineers and performance-minded frontend developers. It&#8217;s fairly advanced, but I&#8217;m spelunking deep to identify how the sites butt heads with the browser APIs and architecture.</p>

<p>Lastly, we&#8217;re using this research to improve Chrome DevTools and what you hear from Chrome.</p>

<center>
    <img src="https://paulirish.com/assets/wikipedia-flamechart.jpg">
    <small>
        Wikipedia eng team scrutinizing their performance millisecond by millisecond.

        (Yes, it&#8217;s a long paper printout of the Chrome DevTools timeline flamechart :)

        <cite><a href="https://commons.wikimedia.org/wiki/File:Scrutinizing_VisualEditor_performance_timeline.png">Photo by Ori Livneh, CC BY 4.0</cite>
    </small>
</center>


<p><small>(BTW, use this link to view the same doc but with <a href="https://docs.google.com/document/d/1K-mKOqiUiSjgZTEscBLjtjd6E67oiK8H2ztOiq5tigk/view">comments enabled</a>)</small></p>

<p>1 - More on this performance model later. Stay tuned.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[WebKit for Developers]]></title>
    <link href="https://paulirish.com/2013/webkit-for-developers/"/>
    <updated>2013-02-28T02:53:00-08:00</updated>
    <id>https://paulirish.com/2013/webkit-for-developers</id>
    <content type="html"><![CDATA[<div update><p>Feb 2015: A lot&#8217;s happened since I wrote this post two years ago. Chrome forked WebKit and <a href="http://www.cnet.com/news/google-parts-ways-with-apple-over-webkit-launches-blink/">started</a> Blink, Opera <a href="http://www.brucelawson.co.uk/2013/hello-blink/">adopted</a> Chromium, and node-webkit <a href="https://groups.google.com/forum/#!msg/nwjs-general/V1FhvfaFIzQ/720xKVd0jNkJ">became</a> nw.js. This post describes a complexity of defining WebKit that doesn&#8217;t exist much anymore; with Chrome&#8217;s departure the WebKit world is more simple and clear. 

<p>WebKit is deployed through iOS Safari and Mac Safari, and the active <a href="http://webkitgtk.org/">GTK community</a> leverages WebKit inside the GNOME Platform. Some smaller mobile browsers use WebKit, some Chromium, some use forks of either, and many just use the system WebViews that are both powered by up-to-date version of iOS WebKit and Android Chromium. 

<p>The post below is kept intact and represents a snapshot of history in early 2013, rather than the modern WebKit landscape.</div>


<p><img src="https://www.paulirish.com/assets/webkit-box.png" alt="WebKit box logo" style="border: 0;
margin: 0;
box-shadow: none;
float: right;
vertical-align: top;" >
For many of us developers, <strong>WebKit is a black box</strong>. We throw HTML, CSS, JS and a bunch of assets at it, and WebKit, somehow.. magically, gives us a webpage that looks and works well.  But in fact, <a href="https://www.youtube.com/watch?v=kiPe7DPmEgE">as my colleague Ilya Grigorik puts it</a>&#8230;</p>

<blockquote><p>WebKit <strong>isn&#8217;t</strong> a black box. It&#8217;s a white box.  And not just that, but an <strong>open</strong>, white box.</p></blockquote>

<p>So let&#8217;s take a moment to understand some things:</p>

<center>
     What is WebKit?
<br> What isn&#8217;t WebKit?
<br> How is WebKit used by WebKit-based browsers?
<br> Why are all WebKits not the same?
</center>




<!--

There are a few things all called, WebKit, so let's enumerate them first..

1. **WebKit the project**, where a bunch of hugely talented developers build one
   of the leading implementations of the web platform
2. **WebKit the embedding API**, available for ports to embed the rendering
   engine in their application
3. **WebCore**, which is what people think of when they say WebKit. (more on
   that later…)
4. **WebKit the repository,** where code for the WebKit API, WebCore,
   JavaScriptCore and more live.
5. and **WebKit, the perception**

Below I'll hop between a few of these definitions in my use of the word. It'll
work, trust me. :)

-->


<p>Now, especially with the news that <a href="http://my.opera.com/ODIN/blog/300-million-users-and-move-to-webkit">Opera has moved to WebKit</a>, we have a lot of WebKit browsers out there, but its pretty hard to know what they share and where they part ways. Below we&#8217;ll hopefully shine some light on this. As a result you&#8217;ll be able to diagnose browser differences better, report bugs at the right tracker, and understand how to develop against specific browsers more effectively.</p>

<h4>Standard Web Browser Components</h4>

<p>Let&#8217;s lay out a few components of the modern day web browser:</p>

<ul>
<li>Parsing (HTML, XML, CSS, JavaScript)</li>
<li>Layout</li>
<li>Text and graphics rendering</li>
<li>Image decoding</li>
<li>GPU interaction</li>
<li>Network access</li>
<li>Hardware acceleration</li>
</ul>


<p>Which of those are shared in WebKit-based browsers? <strong>Pretty much only the first two.</strong></p>

<p>The others are handled by individual WebKit ports. Let&#8217;s review what that
means&#8230;</p>

<h4 id="webkit-ports-explained">The WebKit Ports</h4>


<p>There are different &#8220;ports&#8221; of WebKit, but allow me to let Ariya Hidayat, WebKit
hacker and eng director at Sencha
<a href="http://ariya.ofilabs.com/2011/06/your-webkit-port-is-special-just-like-every-other-port.html">to explain</a>:</p>

<blockquote><p>What is the popular reference to WebKit is usually Apple&#8217;s own flavor of WebKit which runs on Mac OS X (<a href="http://lists.kde.org/?l=kfm-devel&amp;m=104197092318639&amp;w=2">the first and the original</a> WebKit library). As you can guess, the various interfaces are implemented using different native libraries on Mac OS X, mostly centered around <a href="http://developer.apple.com/corefoundation/">CoreFoundation</a>. For example, if you specify a flat colored button with specific border radius, well WebKit knows where and how to draw that button. However, the final actual responsibility of drawing the button (as pixels on the user&#8217;s monitor) falls into <a href="http://developer.apple.com/library/ios/#documentation/CoreGraphics/Reference/CoreGraphics_Framework/_index.html">CoreGraphics</a>.</p></blockquote>

<p>As mentioned above, using CG is unique to the Mac port. Chrome on Mac uses <a href="http://www.chromium.org/developers/design-documents/graphics-and-skia">Skia</a> here.</p>

<blockquote><p>With time, WebKit was &#8220;ported&#8221; into different platform, both desktop and mobile. Such flavor is often called &#8220;a WebKit port&#8221;. For Safari Windows, Apple themselves also ported WebKit to run on Windows, using the <a href="http://developer.apple.com/opensource/internet/webkit_sptlib_agree.html">Windows version</a> of its (limited implementation of) CoreFoundation library.</p></blockquote>

<p>… though Safari for Windows is <a href="http://www.macworld.com/article/1167904/safari_6_available_for_mountain_lion_and_lion_but_not_windows.html">now dead</a>.</p>

<blockquote><p>Beside that, there were many other &#8220;ports&#8221; as well (see <a href="http://trac.webkit.org/wiki#WebKitPorts">the full list</a>). Google has created and continues to maintain its Chromium port. There is also WebKitGtk which is based on Gtk+. Nokia (through Trolltech, which it acquired) maintains the Qt port of WebKit, popular as its <a href="http://doc.qt.nokia.com/qtwebkit.html">QtWebKit module</a>.</p></blockquote>

<h4 id="webkit-ports">Some of the ports of WebKit</h4>


<ul>
<li><strong>Safari</strong>

<ul>
<li>Safari for OS X and Safari for Windows are two different ports</li>
<li>WebKit nightly is an edge build of the Mac port that&#8217;s used for Safari. More later…</li>
</ul>
</li>
<li><strong>Mobile Safari</strong>

<ul>
<li>Maintained in a private branch, but lately <a href="http://trac.webkit.org/changeset/142163">being</a> <a href="http://trac.webkit.org/changeset/142373">upstreamed</a></li>
<li>Chrome on iOS (using Apple&#8217;s WebView; more on it&#8217;s differences later)</li>
</ul>
</li>
<li><strong>Chrome (Chromium)</strong>

<ul>
<li>Chrome on Android (using the Chromium port directly)</li>
<li>Chromium also powers <a href="http://browser.yandex.ru/">Yandex Browser</a>, <a href="http://se.360.cn/">360 Browser</a>, <a href="http://ie.sogou.com/">Sogou Browser</a>, and soon, Opera.</li>
</ul>
</li>
<li><strong>Android Browser</strong>

<ul>
<li>Used the latest WebKit source at the time</li>
</ul>
</li>
<li><strong><a href="http://trac.webkit.org/wiki#WebKitPorts">Plenty more ports</a></strong>: Amazon Silk, Dolphin, Blackberry, QtWebKit, WebKitGTK+, The EFL port (Tizen), wxWebKit, WebKitWinCE, etc</li>
</ul>


<p>Different ports can have different focuses. The Mac port&#8217;s focus is split
between Browser and OS, and introduces Obj-C and C++ bindings to embed the
renderer into native applications. Chromium&#8217;s focus is purely on the browser.
QtWebKit offers its port for applications to use as a runtime or rendering
engine within its cross-platform GUI application architecture.</p>

<h2 id="whats-shared">What&#8217;s shared in all WebKit browsers</h2>


<p>First, let&#8217;s review the commonalities shared by all WebKit ports.</p>

<p><aside class="aside">You know it&#8217;s funny. I tried writing this a few times. <br>Each time I got corrected by Chrome team members, as you&#8217;ll see…</aside></p>

<ol>
<li>So first, WebKit parses HTML the same way. <em>Well, except Chromium is the only port so far to enable <a href="https://bugs.webkit.org/showdependencytree.cgi?id=106127&amp;hide_resolved=0">threaded HTML parsing</a> support.</em></li>
<li>… Okay, but once parsed, the DOM tree is constructed the same. <em>Well, actually Shadow DOM is <a href="http://goo.gl/dsXQf" title="Code Search for ENABLE(SHADOW_DOM) package:^chromium$ file:^src/third_party/WebKit/LayoutTests/platform/">only turned on</a> for the Chromium port, so DOM construction varies. Same goes for custom elements.</em></li>
<li>… Okay, well WebKit creates a <code>window</code> object and <code>document</code> object for everyone. <em>True, though the properties and constructors it exposes can be conditional on the <a href="https://trac.webkit.org/wiki/FeatureFlags">feature flags</a> enabled.</em></li>
<li>… CSS parsing is the same, though. Slurping up your CSS and turning it into CSSOM&#8217;s pretty standard.  <em>Yeah, though Chrome accepts just the <code>-webkit-</code> prefix whereas Apple and other ports accept legacy prefixes like <code>-khtml-</code> and <code>-apple-</code>.</em></li>
<li>… Layout.. positioning? Those are the bread and butter. Same, right? Come on! <em>Sub-pixel layout and saturated layout arithmetic is part of WebKit but differs from port to port.</em></li>
<li>Super.</li>
</ol>


<p>So, it&#8217;s complicated.</p>

<p>Just like how <a href="http://code.flickr.net/2009/12/02/flipping-out/">Flickr</a> and <a href="https://github.com/blog/677-how-we-deploy-new-features">Github</a> implement features behind flags, WebKit does the same. This allows ports to enable/disable all sorts of functionality with <a href="https://trac.webkit.org/wiki/FeatureFlags">WebKit&#8217;s compile-time Feature Flags</a>. Features can also be exposed as run-time flags either through <a href="http://peter.sh/experiments/chromium-command-line-switches/">command line switches (Chromium&#8217;s here) </a> or configuration like <a href="http://blogs.adobe.com/cantrell/archives/2012/07/all-about-chrome-flags.html">about:flags</a>.</p>

<p>All right, well let&#8217;s try again to codify what&#8217;s the same in WebKit land&#8230;</p>

<h4 id="webkit-common">What&#8217;s common to every WebKit port</h4>


<ul>
<li>The DOM, <code>window</code>, <code>document</code>

<ul>
<li>more or less</li>
</ul>
</li>
<li>The CSSOM</li>
<li>CSS parsing, property/value handling

<ul>
<li>sans vendor prefix handling</li>
</ul>
</li>
<li>HTML parsing and DOM construction

<ul>
<li>same if we suspended belief in Web Components</li>
</ul>
</li>
<li>All layout and positioning

<ul>
<li>Flexbox, Floats, block formatting contexts… all shared</li>
</ul>
</li>
<li>The UI and instrumentation for the Chrome DevTools aka WebKit Inspector.

<ul>
<li>Though since last April, Safari uses it&#8217;s own, non-WebKit, closed-source UI for Safari Inspector</li>
</ul>
</li>
<li>Features like contenteditable, pushState, File API, most SVG, CSS Transform math, Web Audio API, localStorage

<ul>
<li>Though backends vary. Each port may use a different storage layer for localStorage and may use different audio APIs for Web Audio API.</li>
</ul>
</li>
<li><a href="http://trac.webkit.org/browser/trunk/Source/WebCore">Plenty of other features &amp; functionality</a></li>
</ul>


<p>It gets a little murky in those areas. Let&#8217;s try some differences that are much less murky.</p>

<h4>Now, what&#8217;s <em>not</em> shared in WebKit ports:</h4>

<ul>
<li>Anything on the GPU

<ul>
<li>3D Transforms</li>
<li>WebGL</li>
<li>Video decoding</li>
</ul>
</li>
<li>2D drawing to the screen

<ul>
<li>Antialiasing approaches</li>
<li>SVG &amp; CSS gradient rendering</li>
</ul>
</li>
<li>Text rendering &amp; hyphenation</li>
<li>Network stack (SPDY, prerendering, WebSocket transport)</li>
<li>A JavaScript engine

<ul>
<li>JavaScriptCore is in the WebKit repo. There are bindings in WebKit for both it and V8</li>
</ul>
</li>
<li>Rendering of form controls</li>
<li><code>&lt;video&gt;</code> &amp; <code>&lt;audio&gt;</code> element behavior (and codec support)</li>
<li>Image decoding</li>
<li>Navigating back/forward

<ul>
<li>The navigation parts of pushState()</li>
</ul>
</li>
<li>SSL features like Strict Transport Security and Public Key Pins</li>
</ul>


<p>Let&#8217;s take one of these: <strong>2D graphics</strong> Depending on the port, we&#8217;re using completely different libraries to handle drawing to screen:</p>

<p><img src="https://lh6.googleusercontent.com/--WfQB-Tr1sQ/TfHQSfY38FI/AAAAAAAAB8s/DSNAn8F71i8/s800/graphicscontext.png" alt="Graphics layer in WebKit" style="display:block; margin: 0 auto;"></p>

<p>Or to go a little more micro&#8230; a recently landed feature: <code>CSS.supports()</code> was <a href="http://trac.webkit.org/changeset/142739">enabled</a> for all ports except win and wincairo, which don&#8217;t have css3 conditional features enabled.</p>

<p>Now that we&#8217;ve gotten technical.. time to get pedantic. Even the above isn&#8217;t correct. It&#8217;s actually WebCore that&#8217;s shared. WebCore is a layout, rendering, and Document Object Model (DOM) library for HTML and SVG, and is generally what people think of when they say WebKit. In actuality &#8220;WebKit&#8221; is technically the binding layer between WebCore and the ports, though in casual conversation this distinction is mostly unimportant.</p>

<p>A diagram should help:</p>

<p><img src="https://www.paulirish.com/assets/webkit-diagram.png" alt="WebKit Diagram" style="display:block; margin: 0 auto;"> <!-- style="border: 0; margin: 0; box-shadow: none;"  --></p>

<p>Many of the components within WebKit are swappable (shown above in gray).</p>

<p>As an example, WebKit&#8217;s JavaScript engine, JavaScriptCore, is a default in
WebKit. (It is based originally on KJS (from KDE) back when WebKit started as a
fork of KHTML). Meanwhile, the Chromium port swaps in V8 here, and uses unique
DOM bindings to map things over.</p>

<p>Fonts and Text rendering is a huge part of platform. There are 2 separate text
paths in WebKit: Fast and Complex. Both require platform-specific (port-side)
support, but Fast just needs to know how to blit glyphs (which WebKit caches for
the platform) and complex actually hands the whole string off to the platform
layer and says &#8220;draw this, plz&#8221;.</p>

<blockquote id="dimitri-taco">
&#8220;WebKit is like a Sandwich. Though in Chromium&#8217;s case it&#8217;s more like a taco. A
delicious web platform taco.&#8221; <cite> Dimitri Glazkov, Chrome WebKit hacker.
Champion of Web Components and Shadow DOM</cite>
</blockquote>


<p>Now, let&#8217;s widen the lens and look at a few ports and a few subsystems. Below
are five ports of WebKit; consider how varied their stacks are, despite sharing
much of WebCore.</p>

<table id="wk-matrix">
<tr>
<td></td>
<th>Chrome (OS X)</td>
<th>Safari (OS X)</td>
<th>QtWebKit</td>
<th>Android Browser</td>
<th>Chrome for iOS</td>
</tr>
<tr>
<th>Rendering</td>
<td>Skia</td>
<td>CoreGraphics</td>
<td>QtGui</td>
<td>Android stack/Skia</td>
<td>CoreGraphics</td>
</tr>
<tr>
<th>Networking</td>
<td>Chromium network stack</td>
<td>CFNetwork</td>
<td>QtNetwork</td>
<td>Fork of Chromium&#8217;s network stack</td>
<td>Chromium stack</td>
</tr>
<tr>
<th>Fonts</td>
<td>CoreText via Skia</td>
<td>CoreText</td>
<td>Qt internals</td>
<td>Android stack</td>
<td>CoreText</td>
</tr>
<tr>
<th>JavaScript</td>
<td>V8</td>
<td>JavaScriptCore</td>
<td>JSC (V8 is used elsewhere in Qt)</td>
<td>V8</td>
<td>JavaScriptCore (without JITting) *</td>
</tr>
</table>


<p><small>* A side note on Chrome for IOS. It uses UIWebView, as you likely know. Due to
the capabilities of UIWebView that means it can only use the same rendering
layer as Mobile Safari, JavaScriptCore (instead of V8) and a single-process
model. Still, considerable Chromium-side code <a href="https://groups.google.com/a/chromium.org/forum/?fromgroups#!topic/chromium-dev/vYGxPx-tVKE">is leveraged</a>, such as the network
layer, the sync and bookmarks infrastructure, omnibox, metrics and crash
reporting. (Also, for what it&#8217;s worth, JavaScript is so rarely the bottleneck on
mobile that the lack of JITting compiler has minimal impact.)
</small></p>

<h2>All right, so where does this leave us?</h2>

<h4>So, all WebKits are totally different now. I&#8217;m scared.</h4>

<p>Don&#8217;t be! The <a href="http://trac.webkit.org/browser/trunk/LayoutTests">layoutTest coverage in WebKit</a> is enormous (28,000
layoutTests at last count), not only for existing features but for any found
regressions. In fact, whenever you&#8217;re exploring some new or esoteric
DOM/CSS/HTML5-y feature, the layoutTests often have fantastic minimal demos of
the entire web platform.</p>

<p>In addition, the <a href="http://www.w3.org/QA/2013/02/testing_the_open_web_platform.html">W3C is ramping up its effort for conformance suite testing</a>. This
means we can expect both different WebKit ports and all browsers to be testing
against the same suite of tests, leading to fewer quirks and a more
interoperable web. For all those who have assisted this effort by going to a
<a href="http://testthewebforward.org/">Test The Web Forward event</a>&#8230; thank you!</p>

<h4>Opera just moved to WebKit. How does that play out?</h4>

<p>Robert Nyman and Rob Hawkes <a href="http://robertnyman.com/2013/02/14/webkit-an-objective-view/">touched on this, too</a>,
but I&#8217;ll add that one of the significant parts of Opera&#8217;s announcement was that
<strong>Opera adopted Chromium</strong>. This means the WebGL, Canvas, HTML5 forms, 2D
graphics implementations&#8211;all that stuff will be the same on Chrome and Opera
now. Same APIs, and same backend implementation. Since Opera is Chromium-based,
you can feel confident that your cutting-edge work will be compatible with
Chrome and Opera simultaneously.</p>

<p>I should also point out that <strong><a href="http://twatlr.com/thread/301603979257856000">all</a></strong><a href="http://twatlr.com/thread/301603979257856000"> Opera browsers</a> will be adopting
Chromium. So Opera for Windows, Mac and Linux and Opera Mobile (the fully
fledged mobile browser). Even Opera Mini, the thin client, will be swapping out
the current server-side rendering farm based on Presto with one based on
Chromium.</p>

<h4>.. and the WebKit Nightly. What is that?</h4>

<p>It&#8217;s the <a href="http://trac.webkit.org/browser/trunk/Source/WebKit/mac">mac port</a> of
WebKit, running inside of the same binary that Safari uses (though with a few
underlying libraries swapped out). Apple mostly calls the shots in it, so its behavior and feature set is congruent
with what you&#8217;ll find in Safari. In many cases Apple takes a conservative approach when enabling features that other ports may be implementing or experimenting with. Anyway, if you want to go back to middle-school
analogies, think of it as&#8230; WebKit Nightly is to Safari what Chromium is to
Chrome.</p>

<p><a href="https://www.paulirish.com/2012/chrome-canary-for-developers/">Chrome Canary</a> also
has the latest WebKit source within a day or so.</p>

<h4>Tell me more about WebKit internals.</h4>

<p>You got it, bucko.</p>

<p><a href="https://docs.google.com/presentation/d/1ZRIQbUKw9Tf077odCh66OrrwRIVNLvI_nhLm2Gi__F0/embed?start=false&loop=false&delayms=3000">
<img src="https://www.paulirish.com/i/3fb890.png" alt="" />
</a></p>

<h4>Further reading:</h4>

<ul>
<li><a href="http://www.webkit.org/coding/technical-articles.html">WebKit internals technical articles | webkit.org</a></li>
<li><a href="http://robertnyman.com/2013/02/14/webkit-an-objective-view/">WebKit: An Objective View | Robert Nyman &amp; Rob Hawkes</a></li>
<li><a href="http://ariya.ofilabs.com/2011/06/your-webkit-port-is-special-just-like-every-other-port.html">your webkit port is special (just like every other port) | Ariya Hidayat</a></li>
<li><a href="http://blogs.adobe.com/webplatform/2013/01/21/getting-started-with-the-webkit-layout-code/">Getting Started With the WebKit Layout Code | Adobe Web Platform Blog</a></li>
<li><a href="http://arunpatole.com/blog/2011/webkit-documentation/">WebKit Documentation Overview | Arun Patole</a></li>
<li><a href="https://www.youtube.com/watch?v=RVnARGhhs9w">Rendering in WebKit, by Eric Seidel | YouTube</a></li>
<li><a href="http://www.igvita.com/slides/2012/web-performance-for-the-curious/">web performance for the curious | Ilya Grigorik</a></li>
</ul>


<p>Hopefully this article described a bit of the internals of WebKit browsers and
gave some insight on where the WebKit ends and the ports begin.</p>

<hr>


<p>Reviewed by Peter Beverloo (Chrome), Eric Seidel (WebKit). <br/>
I&#8217;ll update with any corrections or modifications.</p>

<div update>

<ul>
<li> 8:30am. Removing the slides embed because it&#8217;s making Firefox scroll to its position.
<li> 9:50am. Chrome for Mac&#8217;s font rendering in Skia uses CoreText to draw
glyphs, so it&#8217;s more like CoreText via Skia. (thx thakis!)
<li> 10:49am. Fixed broken link and typo. (thx tim!) Fixed weird meta description choice.
<li> 3:00pm: Mike West pointed to Levi Weintraub&#8217;s sweet & <em>detailed</em> <a href="https://www.youtube.com/watch?v=GGzmST5nNSM">What is WebKit?&#8221; presentation (video)</a>. <a href="http://www.slideshare.net/naseemh/airbnb-tech-talk">slides</a>


<li> 4:00pm. tonikitoo, hacker on QtWebKit wanted to clear up some subtleties:

<blockquote style="font-size: 12px">Nokia (through Trolltech, which it acquired) maintains the Qt port of WebKit, popular as its QtWebKit module. It might be valuable to mentioned that Digia acquired the Trolltech/Qt division of Nokia and now maintains QtWebKit. Also, not to be too nit-picker, in  your subtitles &#8220;Some of the ports of WebKit&#8221; I would have said &#8220;Some of the Products running on top of specific ports of WebKit&#8221; because strictly speaking Safari is not a port, but a &#8220;Browser that makes use of the Apple WebKit port on Mac&#8221;.</blockquote>

True.

<li>5:00pm. <a href="http://myakura.github.com/n/webkit4devs.html">This article has been translated into Japanese</a>. Thanks Masataka Yakura!


<li>2013-03-17: <a href="http://habrahabr.ru/post/173141/">This article has been translated into Russian</a>

<li>2013-03-18: <a href="http://www.infoq.com/cn/articles/webkit-for-developers">This article has been translated into Chinese</a> (also <a href="http://ued.taobao.com/blog/2013/03/webkit-for-developers/">this one!</a>)

<li>2013-04-06: <a href="https://plus.google.com/105636695715347097518/posts/Ubrgmz3LpaR">Chrome emeritus Ben Goodger gave more insight</a> on the relationship between WebCore, WebKit, WebKit2 and the Chromium Content API that&#8217;s useful context.

</ul>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why moving elements with translate() is better than pos:abs top/left]]></title>
    <link href="https://paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/"/>
    <updated>2012-12-20T00:00:00-08:00</updated>
    <id>https://paulirish.com/2012/why-moving-elements-with-translate-is-better-than-pos-abs-top-slash-left</id>
    <content type="html"><![CDATA[<div update=true>
    Update (2016): The more canonical writeup of this technique is at <a href="https://www.html5rocks.com/en/tutorials/speed/high-performance-animations/">High Performance Animations - HTML5 Rocks</a>. TL;DR: Only <code>transform</code> & <code>opacity</code>; never <code>top</code>/<code>left</code>!
</div>


<p>In modern days we have two primary options for moving an element across the screen:</p>

<ol>
<li>using CSS 2D transforms and <code>translate()</code></li>
<li>using <code>position:absolute</code> and <code>top</code>/<code>left</code></li>
</ol>


<p><a href="http://css-tricks.com/tale-of-animation-performance/">Chris Coyier was asked why you should use translate. Go read his response</a> which covers well why it&#8217;s more logical to move elements for design purposes (with <code>transform</code>) independent of your element layout (with <code>position</code>).</p>

<p>I wanted to answer this with Chrome and get some good evidence on what&#8217;s going on. I ended up recording a video on the experience:</p>

<iframe width="720" height="464" src="https://www.youtube.com/embed/NZelrwd_iRs" frameborder="0" allowfullscreen></iframe>


<p>It&#8217;s a good watch and dives into Chrome DevTools&#8217; Timeline, compositing, paint cost, accelerated layers, and more&#8230; but if you want the abbreviated text version, read on:</p>

<p>First thing, Chris made some simple demos to try things out:</p>

<p><a href="http://codepen.io/chriscoyier/pen/pBCax"><img width=290 height=190 src="https://www.paulirish.com/i/cd3fa0.png"></a>
<a href="http://codepen.io/chriscoyier/pen/kyctm"><img width=290 height=190 src="https://www.paulirish.com/i/c90080.png"></a></p>

<p>This sorta works, but there is such low complexity in this situation that it&#8217;s all going to look pretty great. We need something closer to a complex website to properly evaluate the two <em>(thx <a href="http://joshnh.com/">joshua</a> for the macbook!)</em>:</p>

<p><a href="http://codepen.io/paulirish/pen/nkwKs"><img width=290 height=190 src="https://www.paulirish.com/i/014f60.png"></a>
<a href="http://codepen.io/paulirish/pen/LsxyF"><img width=290 height=190 src="https://www.paulirish.com/i/7c70c0.png"></a></p>

<p>Now we&#8217;re starting to get closer, but immediately I get distracted by something.</p>

<h4>Distraction: Pixel snapping</h4>

<p>If you run the demo above you might notice the top edge of the MacBook looks a little bit better in the top/left one. (And here I am writing a post about why translate is better! Preposterous!) So this is due to the absolute positioned macbook sticks to pixel positions, whereas the <code>translate()</code>&#8216;d one can interpolate at sub-pixel positions.</p>

<p>One of the Chrome GPU engineers, James Robinson, called this the &#8220;dubstep effect&#8221;, as these pixels appear to be getting pounded by bass. Here&#8217;s a closeup of the effect&#8230; watch the top white edge of the macbook in each:</p>

<p><img src="https://www.paulirish.com/wp-content/uploads/2012/12/dubstep-effect1.gif" alt="" /></p>

<p>On the left, you see stair-stepping down three pixels and back up again. This <a href="http://dcurt.is/pixel-fitting">pixel snapping</a> may result in a less distracting transition in this case, though this wouldn&#8217;t be so noticeable if you were moving objects with less of a high-contrast situation.</p>

<h4>Back to performance</h4>

<p>If you run DevTool&#8217;s Timeline Frames mode on these two examples here, they start to tell a very different story:</p>

<p><img src="https://www.paulirish.com/wp-content/uploads/2012/12/timeline-frames-macbook1.png" alt="" /></p>

<p>The top/left has very large time to paint each frame, which results in a choppier transition. All the CSS including some big box shadows, are computed on the CPU and composited against that gradient backdrop every frame. The <code>translate</code> version, on the other hand, gets the laptop element elevated onto it&#8217;s own layer on the GPU (called a RenderLayer). Now that it sits on its own layer, any 2D transform, 3D transform, or opacity changes can happen purely on the GPU which will stay extremely fast and still get us quick frame rates.</p>

<p>Watch the video above towards the end to see more on how to diagnose paint costs, see what areas are being repainted, and evaluate what elements are on the GPU.</p>

<h4>Demo</h4>

<p>Click through below, try adding more and see how the the framerate reacts. Feel free to open up DevTools, too and explore Timeline:</p>

<p><a href="http://codepen.io/paulirish/pen/nkwKs"><img src="https://www.paulirish.com/i/f72310.png" width=300 height=226></a><a href="http://codepen.io/paulirish/pen/LsxyF"><img src="https://www.paulirish.com/i/2cc900.png" width=300 height=226></a></p>

<h4>Guidelines for animation</h4>

<ol>
<li>Use CSS keyframe animation or CSS transitions, if at all possible. The browser can optimize painting and compositing bigtime here.</li>
<li>If needs to be it&#8217;s JS-based animation, use <code>requestAnimationFrame</code>.  Avoid <code>setTimeout</code>, <code>setInterval</code>.</li>
<li>Avoid changing inline styles on every frame (jQuery <code>animate()</code>-style) if you can, declarative animations in CSS can be optimized by the browser way more.</li>
<li>Using 2D transforms instead of absolute positioning will typically provide better FPS by way of smaller paint times and smoother animation.</li>
<li>Use Timeline Frame&#8217;s mode to investigate what is slowing down your behavior</li>
<li>&#8220;Show Paint Rects&#8221; and &#8220;Render Composited Layer Borders&#8221; are good pro-moves to verify where your element is being rendered.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Chrome Canary for Developers]]></title>
    <link href="https://paulirish.com/2012/chrome-canary-for-developers/"/>
    <updated>2012-11-02T08:16:00-07:00</updated>
    <id>https://paulirish.com/2012/chrome-canary-for-developers</id>
    <content type="html"><![CDATA[<p><img src="https://www.paulirish.com/lovesyou/new-browser-logos/chrome-canary-512.png" width=200 align=right></p>

<p>If you do front-end web development and already use Chrome as your development browser, I encourage you to use Chrome Canary.</p>

<p>A new Chrome Canary build is available daily (we cut at 2am PST and take the best of last 40 revisions, to be specific). <strong>Running fresh builds gives you great goodies to look forward</strong>:</p>

<ul>
<li>Chrome DevTools features

<ul>
<li><code>$_</code> (for the Console&#8217;s most recently evaluated result)</li>
<li>Styled console logs (see <a href="https://plus.google.com/u/0/115133653231679625609/posts/5Z1Vj7AoSBM">The Breakpoint ep #2</a>)</li>
<li>JPEG decoding time instrumentation in Timeline</li>
<li>Lots more: read <a href="http://peter.sh">Beverloo&#8217;s WebKit updates</a> and the <a href="http://peter.sh/data/web-inspector-rss.php">Web Inspector commits RSS feed</a></li>
</ul>
</li>
<li>Features for the web platform

<ul>
<li><a href="http://html5rocks.com">HTML5 Rocks</a>, <a href="http://peter.sh">peter.sh</a>, and <a href="http://twitter.com/chromiumdev">@chromiumdev</a> are wise news sources for this. CSS Shaders, holla!</li>
</ul>
</li>
<li>Large, experimental features (go visit <code>about:flags</code>)

<ul>
<li>Right now, there&#8217;s exciting stuff like Web Component&#8217;s Shadow DOM, WebRTC&#8217;s Peer Connection, and more.</li>
</ul>
</li>
</ul>


<h4>Canary runs side by side</h4>

<p>The other reason why Canary is great is because <strong>it can run side-by-side with your other Chrome install</strong>. In fact this is why the URL for Canary&#8217;s download page is &#8220;sxs&#8221;.</p>

<p><img src="https://www.paulirish.com/i/5efe70.png" width=300></p>

<p><strong>I recommend running Chrome Stable and Canary.</strong> That&#8217;s how most of the Chrome Developer Relations team does it. You never need to update your browser, you can watch the new stuff coming at you (and <a href="http://crbug.com">file bugs</a> if it breaks) and still see what your users see.</p>

<h4>11 Weeks From Canary to 310M Users</h4>

<p>Fun fact: when a feature lands in Canary, it&#8217;s only a short 11 week trip down to shipping to all 300+ million Chrome users on stable. That is, as long as everything is on schedule and the feature doesn&#8217;t need to bake a little longer on dev channel before making its way down. Given that, it&#8217;s a smart move as a dev team to watch as features (and sometimes bugs) trickle down to have time to adapt. When a new stable Chrome is ready, all users will have it within just a few days.</p>

<p>Canary is available for Mac and Windows, but sadly not Linux. :( But luckily there are <a href="http://www.chromium.org/getting-involved/dev-channel#TOC-Linux">packages that track the dev channel Chromium</a> that&#8217;ll keep you up to date on a weekly basis, so you can have a pseudo-canary. If you need a one-off build of the freshest Chromium available, just go to <a href="http://download-chromium.appspot.com">download-chromium.appspot.com</a>; it&#8217;ll detect your OS and serve up a build that&#8217;s less than a few hours old. Hotchachacha!</p>

<p><img src="https://www.paulirish.com/i/canary-default.png" align=right width=320> <strong>Protip: you can set Canary as your default browser</strong> : Canary itself doesn&#8217;t have a setting to let you do this, as its an edge release. (Read about <a href="http://www.quora.com/Google-Chrome/How-does-the-Chrome-team-ensure-the-stability-of-the-canary-channel/answer/Aaron-Boodman">how Chrome ensures the stability of the Canary build</a>). However&#8230; if you open Safari&#8217;s preferences, Canary will be listed in the <em>Default web browser</em> choices, so you can choose it if you want all new links to open there.</p>

<p>Another small tip: sometimes your Chrome extensions affect your page inspection behavior is weird ways. Jump into incognito where extensions don&#8217;t run to get a clean look.</p>

<h4>Live on the edge</h4>

<p>Running Canary regularly rocks, but so do edge versions of other browsers:</p>

<ul>
<li><a href="http://nightly.mozilla.org/">Mozilla Nightly</a> <a href="http://mozilla.github.com/process-releases/draft/development_specifics/#versioning-firefox">updates daily</a></li>
<li><a href="http://www.opera.com/browser/next/">Opera Next</a> updates often and you can track progress at the <a href="http://my.opera.com/desktopteam/blog/">Opera Desktop blog</a>.</li>
<li><a href="http://nightly.webkit.org/">WebKit Nightly</a> is basically Safari nightly (it&#8217;s their video, GPU, etc stack, but without other Safari browser features)</li>
<li>Internet Explorer gives you platform previews, but since running the time-bombed VMs can be a pain, I run them in <a href="http://www.browserstack.com/start">BrowserStack</a>.</li>
</ul>


<hr>


<p>Oh right, call to action:</p>

<p><a href="https://tools.google.com/dlpage/chromesxs" style="display:block; text-align: center"><img src="https://www.paulirish.com/i/f0c460.png"></a></p>

<div update>2012.11.02: Added CTA thanks to <a href="https://twitter.com/philip_roberts">philip_roberts</a>&#8217; suggestion.<br>
2013-03-15: Accurate data on when/how we cut Canary builds.</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interview On Treehouse]]></title>
    <link href="https://paulirish.com/2012/interview-on-treehouse/"/>
    <updated>2012-10-29T05:07:00-07:00</updated>
    <id>https://paulirish.com/2012/interview-on-treehouse</id>
    <content type="html"><![CDATA[<p>The great folks at <a href="http://teamtreehouse.com/">Treehouse</a> sat down with me for 30 minutes to talk about frontend development, my background, HTML5 Boilerplate and tooling.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/JhWGSD_TY2Y" frameborder="0" allowfullscreen></iframe>


<p>A few highlights:</p>

<ul>
<li><a href="https://www.youtube.com/watch?feature=player_detailpage&amp;v=JhWGSD_TY2Y#t=222s">3:40</a> Where&#8217;d I grow up? What was I into? <em>(Also, the supercool IE4 DHTML event I went to!)</em></li>
<li><a href="https://www.youtube.com/watch?feature=player_detailpage&amp;v=JhWGSD_TY2Y#t=884s">14:45</a> What&#8217;s my favorite feature inside the HTML5 Boilerplate?</li>
<li><a href="https://www.youtube.com/watch?feature=player_detailpage&amp;v=JhWGSD_TY2Y#t=1114s">18:34</a> Will web development even out where we don&#8217;t need to fuss over so many fallback scenarios?</li>
<li><a href="https://www.youtube.com/watch?feature=player_detailpage&amp;v=JhWGSD_TY2Y#t=1372s">22:52</a> Are abstractions okay? Should you always learn what&#8217;s going on under the covers first?</li>
</ul>


<p>I&#8217;ve also updated the interview listing on my <a href="https://paulirish.com/about/">About page</a>. &lt;3z</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why I'm so excited about Web Platform Docs]]></title>
    <link href="https://paulirish.com/2012/why-im-so-excited-about-web-platform-docs/"/>
    <updated>2012-10-08T13:09:00-07:00</updated>
    <id>https://paulirish.com/2012/why-im-so-excited-about-web-platform-docs</id>
    <content type="html"><![CDATA[<p><img src="http://docs.webplatform.org/w/skins/webplatform/images/logo.svg" align=right style="margin: 0 0 10px 10px; padding: 5px;"></p>

<p>I absolutely love developing for the clientside of the web. Delivering the actual interactions and UI that all users feel is an absolutely gratifying experience. However… it&#8217;s not a piece of cake to develop for all desktop browsers, mobile browsers, and all the device/OS combinations within.</p>

<p>It&#8217;s hard to track down accurate info, but hey we get by with an unruly combination of Mozilla&#8217;s MDN, StackOverflow, HTML5 Please, W3C/WHATWG specs, Wikipedia, and a mental inventory of blog posts, tweets and articles strewn over the internet.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/Ug6XAw6hzaw" frameborder="0" allowfullscreen></iframe>


<p>Today&#8217;s announcement of <a href="http://docs.webplatform.org/wiki/Main_Page">Web Platform Docs</a>, an initiative that&#8217;s been well over a year in the making, is huge. A few reasons why I&#8217;m pumped:</p>

<ul>
<li>All browser vendors are working together to document the all of the clientside web: DOM, CSS, HTML, SVG, Canvas, HTML5, JS, ES5…</li>
<li>They&#8217;ve already contributed much of their content: all of the MSDN IE reference docs, the Opera Web Standards Curriculum, many HTML5 Rocks articles,</li>
<li>Full-time technical writers from Google, Microsoft, Adobe and others authoring content around new features in addition to the strong community contributions.</li>
<li>And obviously, a much more cohesive documentation situation, making it easier for us to develop with all the information we need.</li>
<li>Mozilla&#8217;s MDN content <a href="https://hacks.mozilla.org/2012/10/welcoming-the-new-kid-web-platform-docs/">can be contributed</a>!</li>
<li>The content <em>is still alpha</em>, but we now have a single place to document the web platform.</li>
</ul>


<h4>How can you help?</h4>

<ol>
<li>&#8220;Upstream&#8221; your writing. If you&#8217;ve written a widely cited article exploring a feature or documenting cross-browser bugs, gotchas, certainly you can help a educate a vastly wider audience.</li>
<li>Contribute browser support data. We thrive on knowing the mobile/desktop compat story. PPK will be publishing his compat tables there, and you can upstream compat facts from other sources freely.</li>
<li>Fix bugs! Already a few bugs/annoyances have been unearthed. Please <a href="https://www.w3.org/Bugs/Public/describecomponents.cgi?product=webplatform.org">report them</a> but more importantly, we&#8217;d love help fixing them! Attach a patch to a bugzilla ticket and we can push it live ASAP.</li>
<li>Poke around the <a href="http://docs.webplatform.org/w/index.php?title=Special%3APrefixIndex&amp;prefix=&amp;namespace=3000">WPD: prefixed pages</a> to get a feel for the current content activity.</li>
<li>Jump into #webplatform on freenode IRC or join the <a href="http://lists.w3.org/Archives/Public/public-webplatform/">public-webplatform mailing list</a>.</li>
<li>If you have expertise in technical writing or content strategy, we&#8217;d love your help!</li>
<li>A whole lot more! <strong>Read the <a href="http://docs.webplatform.org/wiki/WPD:Getting_Started">WPD: Getting Started guide!</a></strong></li>
</ol>


<p>This won&#8217;t be perfect overnight and will take a while to completely supplant existing distributed documentation sources&#8230; but I&#8217;m very excited about this <a href="http://blog.webplatform.org/2012/10/one-small-step/">first, shared small step</a>. Three cheers to making a better experience for everyone building for the web.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A browser benchmark that has your back: RoboHornet]]></title>
    <link href="https://paulirish.com/2012/a-browser-benchmark-that-has-your-back-robohornet/"/>
    <updated>2012-09-24T14:51:00-07:00</updated>
    <id>https://paulirish.com/2012/a-browser-benchmark-that-has-your-back-robohornet</id>
    <content type="html"><![CDATA[<p>The past few years’ browser focus on speed has been great for us and our users. We’ve seen a huge and dramatic performance boost on benchmarks like Sunspider, Kraken, and Octane. But, these benchmarks, often crafted by JavaScript VM engineers, test raw JavaScript performance, which is rarely the bottleneck we have in our apps.</p>

<p>These days, our performance bottlenecks are oftentimes DOM, <code>&lt;canvas&gt;</code> API methods, SVG.  Those are our priorities. So then why do we see all browser vendors competing on raw JS when we are hacking our way around to avoid the actual performance pain points?  So we wanted to solve that with <strong>RoboHornet</strong>.</p>

<p><strong>Today, a cross-vendor collection of developers, led by Google, is <a href="https://github.com/robohornet/robohornet">open-sourcing</a> <a href="http://robohornet.org/">RoboHornet</a>.</strong> As project lead Alex Komoroske <a href="https://plus.google.com/117456450182805712050/posts/Pij4361doN4">put it</a>, “it’s a living, dynamic benchmark that aims to use the collective efforts of the web development community and ultimately get browser vendors to fix real-world performance pain points.” Let’s look at how RoboHornet will hopefully flip the above situation on its head.</p>

<ol>
<li>Web app developers identify and isolate a specific pain point in their app</li>
<li>That issue is reduced down to a solid benchmark</li>
<li>Propose it to a <a href="https://github.com/robohornet/robohornet/wiki/Committee-Membership">committee of JavaScript experts</a> from JSPerf, YUI, Google, Facebook, and others</li>
<li>Everyone <a href="https://github.com/robohornet/robohornet/wiki/Project-Organization">votes</a> for which issues should make it</li>
<li>Of the top voted items, as long as the committee thinks they are good, they head into the benchmark</li>
<li><a href="http://www.robohornet.org/">The RoboHornet Suite</a> now better represents the web app developer communities biggest priorities for performance</li>
<li><strong>Browser vendors compete on their RoboHornet score, optimizing the slow behaviors that developers prioritize</strong></li>
<li>Everybody wins. <em>Yay ice cream for everyone!</em></li>
</ol>


<p><a href="http://robohornet.org"><img src="https://www.paulirish.com/i/890a40.png" width=600></a></p>

<h4>What’s in there now</h4>

<p>The current items that RoboHornet tests captures the major pain points of jQuery, Google Apps, Google Maps, Ember, Handlebars and Cappuccino:</p>

<ul>
<li>Adding rows to an existing table</li>
<li>Adding columns to an existing table</li>
<li>Descendant selectors at different DOM depths</li>
<li>Converting a 2D canvas to a data URI</li>
<li>Clearing a 2D canvas</li>
<li>Table render speed after innerHTML.</li>
<li>Scrolling speed using scrollTop</li>
<li>Resizing columns in a table</li>
<li>Resizing SVGs</li>
<li>ES5 getter/setters</li>
<li>Referencing the arguments array</li>
<li>Scrolling lots of animated GIFs</li>
<li>The affect of forcing a reflow by calling offsetHeight</li>
<li>Replacing a number of DOM nodes using the Range API</li>
<li>localStorage write performance</li>
<li>localStorage read performance</li>
</ul>


<p>You can <a href="https://github.com/robohornet/robohornet/issues?labels=performance">vote on and review incoming tests</a> in the issue tracker.</p>

<h4>RoboHornet represents you</h4>

<p><strong>The project is still in alpha</strong> and we’d love to get your involvement to better represent everyone. We’re using <a href="http://benchmarkjs.com/">Benchmark.js</a> internally, as its experience on <a href="http://jsperf.com/">jsPerf</a> has proven it a trustworthy and reliable benchmark harness.</p>

<ol>
<li>Please take a look at the site</li>
<li>Watch <a href="https://github.com/robohornet/robohornet">the RoboHornet Github project</a></li>
<li><a href="https://github.com/robohornet/robohornet/wiki/_pages">Read how you can be more involved</a></li>
<li>Submit the performance pain points that your apps run up against.</li>
</ol>


<p>While you’re at it, go check out <a href="http://www.tomshardware.com/reviews/robohornet-web-browser-performance,3303.html">the full review of RoboHornet at Tom’s Hardware
<img src="https://www.paulirish.com/i/756c50.png" width=300></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Academic research on browsers, frontend development, and debugging]]></title>
    <link href="https://paulirish.com/2012/academic-research-on-browsers-frontend-development-and-debugging/"/>
    <updated>2012-09-13T08:45:00-07:00</updated>
    <id>https://paulirish.com/2012/academic-research-on-browsers</id>
    <content type="html"><![CDATA[<p>University-level education has never really touched too directly on what we do as frontend developers. I know I was self-taught in the ways of the browser, as were all of my friends. Luckily the sort of webapp work we do these days is quite sophisticated so those CS  graduates bring much of the great ideas to the JavaScript community. (<a href="http://twitter.com/slexaxton">Alex Sexton</a> has been a personal inspiration here)</p>

<p>Early last year, something clicked in my head when I saw this video: <a href="https://www.usenix.org/conference/usenix-security-11/crossing-chasm-pitching-security-research-mainstream-browser-vendors">Crossing the Chasm: Pitching Security Research to Mainstream Browser Vendors</a>.</p>

<p><em>You mean.. there are academics&#8230; who are doing research on browsers.. in universities? My my! You mean bright minds think about the same things as us and don&#8217;t publish them on Octopress? ;)</em></p>

<p>Turns out it&#8217;s quite an active area of research. So, I&#8217;ve put together a list of academic papers, talks, and researchers all centered around frontend development and browsers (Please chime in on the comments if you know of more):</p>

<h4>Webapps</h4>

<p><a href="https://www.usenix.org/conference/webapps12/gibraltar-exposing-hardware-devices-web-pages-using-ajax">Gibraltar: Exposing Hardware Devices to Web Pages Using AJAX</a> <em>UC San Diego, Microsoft Research, Univ. of Singapore</em>, 2012</p>

<p><a href="https://www.usenix.org/conference/webapps12/modeling-and-reasoning-about-dom-events">Modeling and Reasoning about DOM Events</a> <em>Brown University</em>, 2012</p>

<p><a href="https://www.usenix.org/conference/webapps12/don%E2%80%99t-repeat-yourself-automatically-synthesizing-client-side-validation-code">Don’t Repeat Yourself: Automatically Synthesizing Client-side Validation Code for Web Applications</a> <em>University of Illinois at Chicago</em>, 2012</p>

<h4>Performance</h4>

<p><a href="http://www2012.wwwconference.org/proceedings/proceedings/p41.pdf">Who Killed My Battery: Analyzing Mobile Browser Energy Consumption</a> <em>Stanford</em>, 2012</p>

<p><a href="http://dl.acm.org/citation.cfm?id=2187842">How far can client-only solutions go for mobile browser speed?</a> <em>ACM Digital Library</em>, 2012</p>

<p><a href="http://www.srl.inf.ethz.ch/papers/pldi12-wr.pdf">Race Detection for Web Applications</a> <em>Sofia University &amp; ETH Zurich &amp; IBM T.J. Watson Research Center</em>, 2012</p>

<p><a href="http://www.eecs.berkeley.edu/~lmeyerov/">Leo Meyerovich - Berkeley Rsearch</a> <em>UC Berkeley</em>, 2009 (Parallel Browser Execution, Security)</p>

<p><a href="http://research.microsoft.com/en-us/people/mickens/">James Mickens - Microsoft Research</a> <em>Microsoft</em>, 2004- (Performance, localStorage, Mashups, Speculative Execution</p>

<figure>
<img alt="james mickens is amazing" src="https://www.paulirish.com/i/55d0.png" width=600>
<figcaption>
James Mickens, the <a href="http://microsoftjobsblog.com/blog/viceroy-james-mickens">Galactic Viceroy of Research Magnificence</a> at Microsoft Research, does awesome work. The above shot is from his MIX11 talk <a href="http://channel9.msdn.com/Events/MIX/MIX11/RES04">Making Better Web Apps For Today&#8217;s Browsers</a>.
</figcaption>
</figure>


<h4>Debugging &amp; Tools</h4>

<p><a href="http://www.cs.washington.edu/homes/burg/projects/timelapse/">Timelapse - Interactive record/reply with Webkit inspector</a> <em>Univ. of Washington</em>, 2012</p>

<p><a href="http://faculty.washington.edu/ajko/projects/cleanroom/">Cleanroom: Edit-Time Error Detection with the Uniqueness Heuristic</a> <em>Univ. of Washington</em>, 2010</p>

<p><a href="http://getfirebug.com/wiki/index.php/Firebug_Research#Academic_papers_related_to_Firebug">Firebug Research - Academic papers related to Firebug</a> <em>Various</em>, 2012</p>

<p><a href="http://howtonode.org/heat-tracer">Realtime Performance Visualizations using Node.js</a> <em>How to NODE</em>, 2011</p>

<p><a href="ftp://ftp.cs.orst.edu/pub/burnett/TSE-InfoForageDebug-prePrint-2010-12-20.pdf">How Programmers Debug, Revisited: An Information Foraging Theory Perspective</a> <em>Wentworth, OSU, &amp; IBM TJ Watson Research Center</em>, 2010</p>

<h4>Security</h4>

<p><a href="https://www.usenix.org/conference/usenix-security-11/crossing-chasm-pitching-security-research-mainstream-browser-vendors">Crossing the Chasm: Pitching Security Research to Mainstream Browser Vendors</a> <em>Carnegie Mellon</em>, 2011</p>

<p><a href="http://research.microsoft.com/en-us/um/people/livshits/presentations.htm">Benjamin Livshits - Microsoft Research</a> <em>Microsoft</em>, 2004-2012 (Malware, Privacy, JS Benchmarking, JS Compression, JS Static Analysis, Security)</p>

<p><a href="http://sss.cs.purdue.edu/projects/dynjs/">Dynamics of JavaScript</a> <em>Purdue</em>, 2011</p>

<p><a href="http://www.adambarth.com/papers/">Adam Barth - Research</a> <em>Various</em>, 2007- (XSS, CRSF, Security…)</p>

<h4>Data Visualization</h4>

<p><a href="http://infosthetics.com/archives/2011/11/most_interesting_papers_at_infovis_visweek_2011.html">Highlights of the Infovis Conference, VisWeek 2011</a> 2011</p>

<h4>JavaScript</h4>

<p><a href="http://www.cs.purdue.edu/homes/gkrichar/">Gregor Richards - JS Research at Purdue</a> <em>Purdue</em>, 2009-2011</p>

<p><a href="http://faculty.washington.edu/ajko/projects/cleanroom/">Cleanroom</a> <em>University of British Columbia</em>, 2011-2012</p>

<p><a href="http://cs.au.dk/~amoeller/research.html">Anders Møller - Research</a> <em>Aarhus University</em>, 2002-</p>

<h4>Non-JavaScript Tooling</h4>

<p><a href="http://www.cs.cmu.edu/~NatProg/whyline-java.html">Whyline for Java</a> <em>Natural Programming</em>, 2009</p>

<p><a href="http://hci.rwth-aachen.de/stacksplorer">Stacks Plorer</a> <em>Media Computing Group</em>, 2012</p>

<p><a href="http://pleiad.dcc.uchile.cl/tod/">Omniscient debugging with TOD</a> <em>Pleiad</em>, 2007</p>

<p><a href="http://elm-lang.org/">The Elm Programming Language</a> <em>Elm Lang</em>, 2011-2012 (a type-safe, functional reactive language that compiles to HTML, CSS, and JavaScript)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Developers We Admire.]]></title>
    <link href="https://paulirish.com/2012/developers-we-admire/"/>
    <updated>2012-08-17T11:46:00-07:00</updated>
    <id>https://paulirish.com/2012/developers-we-admire</id>
    <content type="html"><![CDATA[<p>One of the good things about having the eyeballs of many people is that you now have the ability to throw other people into the limelight that completely deserve to be in it. <a href="http://nimbupani.com">Divya Manian</a> and I have been, for a while now, putting together a list of people in the front-end development community who, in our opinion, could use more broad acknowledgment and attention. They&#8217;re also inspiring because&#8230;</p>

<ol>
<li>They are excellently skilled in their area of expertise and go out of their way to teach others how to gain these skills</li>
<li>They participate in open source projects that fuel the community&#8217;s knowledge and productivity</li>
<li>They have independent opinions that are derived out of testing, and evidence-based fact finding worthy of learning from</li>
</ol>


<p>So, here is a list of people we admire:</p>

<ul>
<li><p><strong>Ryan Seddon</strong>: <a href="http://twitter.com/ryanseddon">@ryanseddon</a> aka <a href="http://www.thecssninja.com/">the CSS Ninja</a> develops Modernizr, writes polyfills, and explores the edge of DOM APIs. His recent <a href="http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/">exploration of source maps</a> lays a lot of groundwork for future web debugging potentials.</p></li>
<li><p><strong>Hans Christian Renl</strong>: <a href="http://twitter.com/drublic">@drublic</a> started contributing extensively to <a href="http://twitter.com/h5bp">HTML5 Boilerplate</a> and has been actively engaged in other projects we have worked on. He also maintains <a href="http://drublic.de/blog/">a blog</a> where he shares his learning experiences and explorations of advanced CSS features.</p></li>
<li><p><strong>Alexis Deveria</strong>: <a href="http://twitter.com/fyrd">@fyrd</a> maintains <a href="http://caniuse.com">caniuse.com</a>, and contributes to <a href="http://svg-edit.googlecode.com/">svg-edit</a>, the open source svg editor. He also created &amp; maintains <a href="http://en.wikipedia.org/wiki/File:Timeline_of_web_browsers.svg">the canonical timeline of web browsers</a>  which has been the basis of <a href="http://evolutionofweb.appspot.com/">other browser history graphs</a> since. He also upstreams all the data from caniuse.com to its API, is used to power sites such as api.html5please.com and html5rocks.com</p></li>
<li><p><strong>Jason Kiss</strong>: <a href="http://twitter.com/jkiss">@jkiss</a>&#8217;s <a href="http://www.accessibleculture.org/articles/">notes on accessibility</a> are like a breath of fresh air into the dense field of accessibility. He tests in as many accessibility technology tools as available and bases his opinions on findings from his research. His articles are extremely valuable to web developers who have long had to base how to do the right thing on superstition and fact-free opinions.</p></li>
<li><p><strong>Kit Cambridge</strong>: <a href="http://twitter.com/kitcambridge">@kitcambridge</a> develops some of the best-in-class javascript libraries and assists many open source projects on Github. Take a look around <a href="http://github.com/bestiejs">bestiejs</a> to see his fine work and friendly demeanor.</p></li>
<li><p><strong>Eric Dahlström</strong>: <a href="http://twitter.com/erikdahlstrom">@erikdahlstrom</a> is not just the editor of SVG specs, but also helps out often in mailing lists and Stack Overflow with SVG questions. Not only that, he is an unbelievably skilled (obviously!) at hand-coding lightweight SVG, and maintains a repository of SVG images that are worthy of learning from on how to do SVG right.</p></li>
<li><p><strong>Masataka Yakura</strong>: <a href="http://twitter.com/myakura">@myakura</a> watches  HTML/etc. specification changes, browser bug trackers and mailing lists, and reports the best stuff on <a href="https://plus.google.com/115203843155141445032/posts">his G+</a></p></li>
<li><p><strong>Matt Seeley</strong>: <a href="http://twitter.com/innerhtml">@innerhtml</a> is a JS hacker at Netflix, who measures constantly and talks about <a href="http://techblog.netflix.com/2012/01/webkit-in-your-living-room.html">the science of cross-device hardware accelleration</a></p></li>
<li><p><strong>Tim Branyen</strong>: <a href="http://twitter.com/tbranyen">@tbranyen</a> created <a href="https://github.com/tbranyen/backbone-boilerplate">Backbone Boilerplate</a> and <a href="https://github.com/tbranyen/backbone.layoutmanager">Backbone Layout Manager</a> to make it easy for everyone to get started with Backbone. He also writes extensively on his <a href="http://tbranyen.com/">blog</a> on dealing with problems of creating web apps.</p></li>
<li><p><strong>Mathieu Henri</strong>: <a href="http://twitter.com/p01">@p01</a> has an in-depth understanding of JavaScript and shares amazing experiments that are possible within less than 1K of JavaScript such as <a href="http://www.p01.org/releases/MATRAKA/matraka.png.html">canvas with audio</a> (warning audio) &amp; <a href="http://www.p01.org/releases/JS1K_Speech_Synthesizer/">Speech Synthesizer</a>. He also frequently contributes to <a href="http://twitter.com/140bytes">@140bytes</a> on what is possible with 140 bytes of JS.</p></li>
<li><p><strong>Roman Cortes</strong>: <a href="http://twitter.com/romancortes">@romancortes</a> is one of few who can explore some interesting innovative uses of CSS. His explanation of a <a href="http://www.romancortes.com/blog/how-i-did-the-1kb-christmas-tree/">1kb chrismas tree</a> is a whirlwind of frontend knowledge.</p></li>
<li><p><strong>Peter Beverloo</strong>: <a href="http://twitter.com/beverloo">@beverloo</a> started off a series on <a href="http://peter.sh">his blog</a> documenting what&#8217;s new in WebKit/Chromium. He&#8217;s since been hired by Google and works on Chrome for Android. His work in distributing edge browser development news has helped thousands of people track the quickly expanding web platform.</p></li>
<li><p><strong>Erik J Moller</strong>: <a href="http://twitter.com/erikjmoller">@erikjmoller</a> is to WebGL what @dahlstrom  is to SVG. His skill and ability to hand-code webGL is unparalleled. He created a <a href="http://my.opera.com/emoller/blog/2012/02/29/webgl-101">10-part video on learning webGL (webGL 101) that is archived on youtube</a> not to mention is the <a href="https://github.com/operasoftware/Emberwind">main contributor to EmberWind</a> an open source webGL game that is highly performant.</p></li>
<li><p><strong>Irene Ros</strong>: <a href="http://twitter.com/ireneros">@ireneros</a> dabbles in info-viz tools and has published several of them on GitHub. She is active in contributing back to open-source projects and also maintaining a few of them including <a href="http://misoproject.com/">Miso Project</a> and <a href="https://github.com/iros/underscore.nest">underscore.nest</a>.</p></li>
<li><p><strong>Mike Taylor</strong>: <a href="http://twitter.com/miketaylr">@miketaylr</a>  is developer relations extraordinare for Opera. He has been a behind-the-scenes force getting a lot of cross-browser compatibility and feature detection complete and distributed.</p></li>
<li><p><strong>Zoe Mickley Gillenwater</strong>: <a href="http://twitter.com/zomigi">@zomigi</a> wrote <a href="http://www.stunningcss3.com/">an excellent book about CSS3</a> and publishes <a href="http://zomigi.com/">informative articles on CSS on her website</a> that are a good resource for anyone who is working with CSS3.</p></li>
<li><p><strong>Niklas von Hertzen</strong>: <a href="http://twitter.com/niklasvh">@Niklasvh</a> created <a href="http://html2canvas.hertzen.com/">html2canvas</a>, essentially a rendering engine in JavaScript. He&#8217;s also had a number of <a href="https://plus.google.com/113127438179392830442/posts/82TXPmNhjKH">exciting experiements</a> like a Sudoku Solver in CSS.</p></li>
<li><p><strong>Zoltan Hawryluk</strong>: <a href="http://twitter.com/zoltandulac">@zoltandulac</a> painstakingly researches making CSS3 features backwards-compatible with IE, in addition to <a href="http://www.useragentman.com/blog/2010/03/09/cross-browser-css-transforms-even-in-ie/">blogging about several discoveries in the process</a>.</p></li>
</ul>


<h4>Other Unsung Heroes</h4>

<p>There are clearly far more people that deserve to have their praises sung. Plenty of people whose names you already know, but also folks like <a href="http://twitter.com/zachleat">@ZachLeat</a>, <a href="http://twitter.com/alex_gibson">@Alex_Gibson</a>, <a href="http://twitter.com/mbostock">@mbostock</a>, <a href="http://twitter.com/robflaherty">@RobFlaherty</a>, <a href="http://twitter.com/raynos2">@Raynos2</a>, <a href="http://twitter.com/bricss">@bricss</a> and more.</p>

<h4>Thank you</h4>

<p>We are grateful towards everyone who has helped us along the way to shape the web to be as friendly as possible to web developers, by driving the work on frameworks, libraries, articles and outreach. They do it on their own time, because of their love of and fascination with the web.</p>

<p>All of them are well worth your time to pay attention to and follow and hear their opinions of the web.</p>

<h4>Who are yours?</h4>

<p>We&#8217;ve left out some of the bigger names in this list, so hopefully we can all discover someone new who covers a relevant field extremely well. This is our list, but feel free to leave a comment with anyone you&#8217;d put on yours. Or better yet, blog it yourself and link up your list here.</p>

<div update>2012.08.27: Heartwarming: @zoltandulac&#8217;s <a href="http://www.useragentman.com/blog/2012/08/26/a-developer-i-admire-walter-zorn/">writeup of the inspirational frontend developer Walter Zorn</a>
2012.08.29: Gray Ghost Visuals <a href="http://blog.grayghostvisuals.com/developers/my-web-heros">wrote about his heroes</a>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Skinny on IE's Update Policy]]></title>
    <link href="https://paulirish.com/2012/the-skinny-on-ies-update-policy/"/>
    <updated>2012-06-29T10:47:00-07:00</updated>
    <id>https://paulirish.com/2012/the-skinny-on-ies-update-policy</id>
    <content type="html"><![CDATA[<p>Every month, WebKit, Firefox and Opera are shipping incredible features; IE10 is also going to settle up and even out those HTML5 Test scores (plus some features they may debut, like Grid Layout!). But while these features are becoming available in some browsers, most of us can&#8217;t use them because we have a sizable audience who have been left behind on old browsers. A while ago I made <a href="https://www.paulirish.com/2011/browser-market-pollution-iex-is-the-new-ie6/">a big fuss</a> about IE&#8217;s lack of solid upgrade path and how it meant we&#8217;d end up with 10 major versions of IE in the wild. But luckily, things took a turn for the better when <a href="http://windowsteamblog.com/ie/b/ie/archive/2011/12/15/ie-to-start-automatic-upgrades-across-windows-xp-windows-vista-and-windows-7.aspx">Microsoft announced a new autoupdate policy for IE</a>.</p>

<p>I wanted to take a moment to explain <strong>what this IE update policy means for us web developers</strong>.</p>

<p>The big change is how IE now interacts with Windows Update: Before you had to opt-in to have &#8220;Recommended&#8221; updates installed automatically. It&#8217;s likely few folks did. Now, <strong>IE upgrades are shipping as &#8220;Important&#8221; and this class of updates are defaulted to install automatically</strong>. A user can still opt-out and immediately after the announcement of this feature they also published details on <a href="http://windowsteamblog.com/windows/b/springboard/archive/2011/12/15/ie-auto-updates-good-news-for-businesses-too.aspx">how enterprises can opt-out</a>. But still, this is a good move, it helps.</p>

<p>The policy manifests as:</p>

<ol>
<li>Windows XP holdouts on IE6 or IE7 get the boot up to IE8</li>
<li>Windows Vista and 7 users still on IE7 or even on IE8 get shunted up to IE9</li>
<li>IE10 only works on Win7+, and while no policy has been published for Win7 users, it&#8217;s likely any IE8/IE9 users will be moved up to IE10.</li>
</ol>


<p>A very smart policy call was that this update policy also includes all of China, which is important because most of their Windows installs are not genuine. Microsoft decided they should get the IE bump anyway, which is great because China has been <a href="http://gs.statcounter.com/#browser_version_partially_combined-CN-monthly-200807-201206">dominated by IE6 and IE8</a> for ages.</p>

<p>This update procedure was scheduled to start in Australia and Brazil in January 2012. If we look at what happened in Brazil, we have a good shift of users but it&#8217;s flattened out with a nontrivial amount of left behind users: (see the two blue lines in the chart below)</p>

<div id="browser_version_partially_combined-BR-weekly-201141-201224" width="600" height="400" style="width:600px; height: 400px;"></div>


<!-- You may change the values of width and height above to resize the chart -->


<p><small>(Source: <a href="http://gs.statcounter.com/#browser_version_partially_combined-BR-weekly-201141-201224">StatCounter Global Stats - Browser Version (Partially Combined) Market Share)</small></a></p>


<script defer type="text/javascript" src="http://www.statcounter.com/js/FusionCharts.js"></script>


<script  defer type="text/javascript" src="http://gs.statcounter.com/chart.php?browser_version_partially_combined-BR-weekly-201141-201224"></script>


<p>Australia <a href="http://gs.statcounter.com/#browser_version_partially_combined-AU-weekly-201141-201224">has a similar swap of users from IE8 to IE9</a> but IE8 still remains steady above 10% overall share there.</p>

<p>Microsoft is in a tough spot in that they have enterprise customers who have developed their intranet applications in an extremely poor manner and they break outside of old browsers. But we&#8217;re going to need some more pushes from them and us, the developer community, to get in a better state. We want to develop for the web platform of now, not the platform of four years ago.</p>

<hr>


<p><b>TL;DR:</b> There is now a policy in place, but evidence indicates that it&#8217;s not as effective in eradicating these zombie browsers as what we need. Personal opinion: we need to do better.</p>

<p><small>Hopefully this clarifies a bit about the mechanics of the update procedure. Please do correct me if anything is wrong and I&#8217;ll update the post.</small></p>

<div update>2012.08.07: Added TLDR.

2012.07.02: To see this update policy in better context it&#8217;s probably useful to <A href="http://www.netmagazine.com/features/developers-guide-browser-adoption-rates">Read this Developer&#8217;s Guide to browser adoption rates</a> and check the charts from Ars Technica below.</div>


<p><a href="http://static.arstechnica.net/2012/04/02/firefox-adoption-2012-03-4f7a134-intro.png"><img src="http://static.arstechnica.net/2012/04/02/firefox-adoption-2012-03-4f7a134-intro.png" width="200"></a><a href="http://static.arstechnica.net/2012/04/02/chrome-adoption-2012-03-4f7a134-intro.png"><img src="http://static.arstechnica.net/2012/04/02/chrome-adoption-2012-03-4f7a134-intro.png" width="200"></a><a href="http://static.arstechnica.net/2012/04/02/internet-explorer-adoption-2012-03-4f7a134-intro.png"><img src="http://static.arstechnica.net/2012/04/02/internet-explorer-adoption-2012-03-4f7a134-intro.png" width="200"></a></p>

<div update id="20120921">2012.09.21: Months later, the net effect of the update campaign is complete. It pushed a whole bunch of users up to IE9 but IE8 usage remains solid. :(  WinXP is a big problem here, obviously. We have to explore other ways to move these users off a zombie browser&#8230;</div>


<p>(Consider the two blue lines)</p>

<div id="browser_version_partially_combined-ww-weekly-201149-201238" width="600" height="400" style="width:600px; height: 400px;"></div>


<!-- You may change the values of width and height above to resize the chart -->


<p><small>Source: <a href="http://gs.statcounter.com/#browser_version_partially_combined-ww-weekly-201149-201238">StatCounter Global Stats - Browser Version (Partially Combined) Market Share</a></small></p>


<script type="text/javascript" src="http://www.statcounter.com/js/FusionCharts.js"></script>


<script type="text/javascript" src="http://gs.statcounter.com/chart.php?browser_version_partially_combined-ww-weekly-201149-201238"></script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Accessibility and Developers]]></title>
    <link href="https://paulirish.com/2012/accessibility-and-developers/"/>
    <updated>2012-06-01T00:19:00-07:00</updated>
    <id>https://paulirish.com/2012/accessibility-and-developers</id>
    <content type="html"><![CDATA[<p>Jacob Thornton has an <a href="http://wordsbyf.at/2012/05/21/jsconf-argentina-2012/">inspiring slide deck on accessibility</a> that brings to fore some of the concerns that web developers have with implementing features around accessibility.</p>

<p>For a very long time, developers have been told about making websites &#8216;accessible&#8217;. Like it is a faucet that should be turned on or off. Till <a href="https://www.youtube.com/watch?v=izrC4R7SsH4">Victor Tsaran&#8217;s demonstration of using a screenreader</a> (which was in 2007 - a very long time since accessibility evangelism began) - very few web developers had any idea of the real immediate impact of implementing accessibility features.</p>

<blockquote><p>During a Nicholas Zakas &amp; Victor Tsaran talk years ago I finally grokked the easiest rule for a first step towards accessibility. For such a long time, we conflated functionality while JavaScript-disabled with &#8220;being accessible&#8221;. It took me years to learn that <strong>making it keyboard-navigable</strong> was the top priority.</p></blockquote>

<p><ins>Just as a datapoint, The <a href="http://webaim.org/projects/screenreadersurvey4/">WebAIM survey results</a> (published yesterday) reveal <b>98.6%</b> of screenreader users have javascript enabled.</ins></p>

<h4>What we need</h4>

<p>People like <a href="http://twitter.com/jkiss">Jason Kiss</a> and <a href="http://twitter.com/stevefaulkner">Steve Faulkner</a> who detail the <a href="http://html5accessibility.com/">behavior and support in browsers</a> and screenreaders are providing the developer community with invaluable knowledge, stuff that is far more worthwhile than publishing a yet another list of you-should-do-these-things. (See also <a href="https://www.paulirish.com/2011/semantics/#recommendation">my resources list in the semantics post</a>).</p>

<p>Most developers have no idea what effect adding ARIA markup to our documents has on people using
screenreaders. We need that. Actual before-and-after video stuff makes this topic real. See <a href="http://zomigi.com/blog/videos-of-screen-readers-using-aria-updated/">zomigi’s recent post: videos of screenreaders using ARIA</a>, for great examples.</p>

<p>Most developers have no idea how to implement ARIA. The <a href="http://www.w3.org/TR/wai-aria-primer/">W3C Primer that looks like a spec</a> is not at all appropriate for a web developer audience.</p>

<p>Just like it’s valuable to witness an a11y usability session where you see how disabled people use your site, I think it’d be useful for the accessibility community to see how developers build, because thus far there has been a disconnect in communicating effectively. I don’t think we need more on the ground evangelism yet. There is a dearth in online resources at the moment, developers need to know these practical ways of using and having users benefit from accessibility techniques:</p>

<ul>
<li>Which features should I use and which should I avoid (which features are actively harmful because of shoddy screen reader/other a11y tech support?)</li>
<li>What are the top priorities for developers to implement?</li>
<li>Videos of screenreaders in use <ins>(<a href="http://zomigi.com/blog/videos-of-screen-readers-using-aria-updated/">Thanks Zoe!</a>)</ins></li>
<li>What one thing can I do as a web developer to my sites and apps that dramatically improves the UX for disabled users</li>
<li>How do some of these features work? What are they for? A demonstration of how each feature makes an impact or gets used by a user would be most helpful (e.g. how do focus rings work?).</li>
</ul>


<h4>Screenreaders &amp; browsers</h4>

<p>Also, I&#8217;m not quite sure how everyone else feels, but from here it feels like yelling at a fucking brick wall with JAWS and Window Eyes. We just kinda hope and pray their support for things improve. As a pragmatic approach, I tell developers that if it works in NVDA, good enough. We have a mess of browsers we need to support already, dealing with ATs that lag years behind is not at all feasible.</p>

<p>A lot of developers do not understand that accessibility first comes from implementing the platform accessibility API by browsers such that screen readers can take advantage of the rendering. Most operating systems expose an API that allows browsers to map what is rendered on the screen to one of the interfaces that the operating system&#8217;s accessibility API exposes.</p>

<p><img src="https://www.paulirish.com/wp-content/uploads/2012/05/stairs-ramp.jpg" alt="A series of stairs and a ramps interleaving between them" /></p>

<p>Unfortunately, there has been no specification, so each browser has been left to do whatever it wants in terms of defining the relationship between a HTML element and the accessibility interface. Hopefully this will change  with the <a href="http://dvcs.w3.org/hg/html-api-map/raw-file/tip/Overview.html">HTML to Platform Accessibility API implementation guide</a> and ensure each browser exposes each element consistently to the Platform Accessibility API.</p>

<p>Which shores up a greater concern: Better accessibility starts with the browser (and the platform). Browsers should be able to handle content loaded dynamically rather than expecting developers to do it for them. If content on a page that is displayed is altered, it needs to be noted to the accessibility api transparently instead of having developers bolt on extra markup to do so.</p>

<p>Accessibility should not be opt-in but opt-out.</p>

<p><small> This post is a elongated version of the comment I left on Karl Grove’s  <a href="http://www.karlgroves.com/2011/06/16/barriers-to-improving-the-accessibility-game-plan/">Barriers to improving the
accessibility game plan</a>. It was probably the best post on a11y I’ve ever
read. I <strong>really</strong> liked his approach in evolving the a11y strategy and
left my thoughts.</p>

<p>Thanks to Divya Manian for her thoughts and words on this post. Thanks to Jason Kiss for reviewing drafts.</small></p>

<div update>June 1: Added link to freshly published <a href="http://webaim.org/projects/screenreadersurvey4/">WebAIM survey results 2012</a>. I encourage you to read the whole thing, as it&#8217;s a fascinating view into an audience we have challenges understanding.

<br><br>

2013.06.06: This has been translated into Czech: [Dostupnost a Vývojáři](http://led24.de/blog/dostupnost-a-vyvojari).
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Talk: Tooling &amp; The Webapp Development Stack]]></title>
    <link href="https://paulirish.com/2012/talk-tooling-the-webapp-development-stack/"/>
    <updated>2012-05-01T09:57:00-07:00</updated>
    <id>https://paulirish.com/2012/talk-tooling-and-the-webapp-development-stack</id>
    <content type="html"><![CDATA[<p>One of the things I recognize at Google is how productive developers surround themselves with powerful tools for iterative development and debugging. For us front-end developers, the ecosystem of tools has exploded in the past two years, as we have a lot more software and libraries beyond Firebug and jQuery to help us build webapps. In the talk below I walk through the current ecosystem of tools and how they can make your development experience a more enjoyable one.</p>

<iframe src="http://player.vimeo.com/video/40929961?byline=0&amp;portrait=0&amp;color=ff0179" frameborder="0" width="600" height="337"></iframe>


<p>My slides:
<a href="http://dl.dropbox.com/u/39519/talks/tooling-q1/index.html">
<img src="https://www.paulirish.com/wp-content/uploads/2012/05/toolingappstackss.jpg" alt="" width="450" />
</a></p>

<p>Because there are so many tools around, I wanted to break them down somehow. I think contextualizing the tools as to what phase of development that assist with works well:</p>

<p><img src="http://dl.dropbox.com/u/39519/talks/tooling-q1/timeline.png" alt="" width="500" /></p>

<p><small>(You could think of the Y-axis here as the amount of code in a project..)</small></p>

<p>Looking at our tools this way we end up with:</p>

<ul>
    <li>Boilerplate
    <ul><li>You likely start a project with more than a single blank text file.</li></ul></li>
    <li>Authoring Abstractions
<ul><li>CSS preprocessors, Languages that transpile to JS, Templating</li></ul></li>
    <li>Frameworks and Application Stack
<ul><li>Clientside MVC, UI Components, Widgets</li></ul></li>
    <li>Iteration Workflow
<ul><li>Browser Devtools, Browser/Unit/Integration Testing</li></ul></li>
    <li>Performance Tuning
<ul><li>Profiling, Memory mgmt, browser instrumentation</li></ul></li>
    <li>Build &amp; Optimization
<ul><li>Minifiers, Concat, Image compression&#8230;</li></ul></li>
    <li>Deploy
<ul><li>Continuous Integration, Continuous deployment</li></ul></li>
</ul>


<p>I&#8217;ve been thinking a lot about workflow and integrating these tools together. Screencasts like <a href="http://tarantsov.com/blog/2012/02/sublime-text-workflow-that-beats-coda-and-espresso/">Andrey Tarantsov&#8217;s Sublime Text Workflow</a> really excite me and I&#8217;m eager to see more people exploring a robust development setup.</p>

<div update>2012.05.16: Mr Jon Kemp wrote up an outline of my talk with all the links, for easy clickability: <a href="https://gist.github.com/2713513">https://gist.github.com/2713513</a> </div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Vendor prefixes are not developer-friendly]]></title>
    <link href="https://paulirish.com/2012/vendor-prefixes-are-not-developer-friendly/"/>
    <updated>2012-03-04T23:06:00-08:00</updated>
    <id>https://paulirish.com/2012/vendor-prefixes-are-not-developer-friendly</id>
    <content type="html"><![CDATA[<p>or&#8230; <h4 class="c6 c16"><span>The premise of prefixes makes unrealistic demands on how developers maintain sites</span></h4></p>

<p class="c2"></p>




<p class="c6"><span>There&#8217;s a lot of conversation about making prefixes work (by changing policy), but I believe they already are at odds with the developer workflow. In this proposal I hope to show that:</span></p>




<ol class="c21" start="1">
    <li class="c10 c6"><span>prefixes are not developer-friendly</span></li>

    <li class="c6 c10"><span>recent features would have been in a much better state without prefixes</span></li>

    <li class="c10 c6"><span>im</span><span>plementor maneuverability is not hampered without prefixes</span></li>
</ol>




<h2 class="c6"><a id="h.rt53c7dxmrwu" name="h.rt53c7dxmrwu"></a><span>The developer experience</span></h2>




<p class="c2"></p>




<p class="c6"><span>If I&#8217;m using a feature that&#8217;s prefixed, I have a choice of using a tool to help me manage outputting the various prefixes I need or I&#8217;ll do it myself. &nbsp;Based on my</span> <span class="c3"><a class="c7" href="http://gopollgo.com/vendor-prefixes-dot-how-do-you-deal-with-them">informal poll last week</a></span><span>&nbsp;it looks like 40% of developers are not using tools. Without tool usage, authors are not including</span> <span class="c4">-ms-, -o-</span> <span>or the unprefixed variants.</span> <span class="c3"><a class="c7" href="https://bug708406.bugzilla.mozilla.org/attachment.cgi?id=579826">Page 4 of Mozilla&#8217;s prefix report</a></span><span>&nbsp;verifies this; developers don&#8217;t write necessary prefixed properties about half the time (e.g. -o-transform) and in fact, they already write out the unprefixed variant well before the spec goes to CR (and do this well before adding in</span> <span class="c4">-ms-</span><span>&nbsp;or</span> <span class="c4">-o-</span><span>&nbsp;compatibility).</span></p>




<figure>

    <a href="https://bug708406.bugzilla.mozilla.org/attachment.cgi?id=579826"><img height="195" src="https://www.paulirish.com/wp-content/uploads/2012/03/image00.jpg" width="525"></a>
    <figcaption><span class="c0">Data summarizing prefixes’ failure with developers [</span><span class="c3 c0"><a class="c7" href="https://bug708406.bugzilla.mozilla.org/attachment.cgi?id=579826">Mozilla&#8217;s prefix report</a></span><span class="c0">, page 4]</span></figcaption>
</figure>




<p class="c6"><span>This matches my experience as well. I don&#8217;t want to return to this code to maintain it, so I&#8217;m going to add the unprefixed version. There is less of a cost to me leaving the unprefixed version and assuming I won&#8217;t need to change it vs. returning to my CSS of shipped-to-production work to add unprefixed variants each time a feature hits CR.</span></p>




<p class="c2"></p>




<p class="c6"><span>Any successful evangelization plan for prefixes relies on tools, but all tools prioritize the unprefixed state.</span> <span class="c3"><a class="c7" href="http://leaverou.github.com/prefixfree/">prefix-free</a></span><span>,</span> <span class="c3"><a class="c7" href="http://compass-style.org/reference/compass/css3/shared/#mixin-experimental"> compass</a></span><span>,</span> <span>and</span> <span class="c3"><a class="c7" href="http://paulirish.com/2010/introducing-css3please/">css3 please</a></span><span>&nbsp;</span><span class="c0">(I&#8217;m a tool vendor, too)</span> <span>all</span><span>&nbsp;heavily suggest starting with the unprefixed state. So any successful evangelization push will just result in the unprefixed version being 100% deployed from the get-go, which ties implementors hands anyway and defeats the purpose of the prefix. I don&#8217;t have data to show that developers are not returning to their deployed, production code to update prefixes, but anecdotal evidence suggest so. Opera’s Web Opener team, for example, reports a &lt;10% success rate when directly</span> <span>contacting</span><span>&nbsp;sites to request updates to their prefixes.</span></p>




<p class="c2"></p>




<p class="c6"><span>PPK</span> <span class="c3"><a class="c7" href="http://www.quirksmode.org/blog/archives/2012/02/the_vendor_pref.html">wrote</a></span><span>&nbsp;“If standards make web developers’ lives much harder, web developers ignore standards. This was true back in 1998, it’s still true today.” Without prefixes, implementors have an opportunity to empower developers to do the right thing while still allowing room for innovation.</span></p>




<h2 class="c6"><a id="h.cvtlte27jiti" name="h.cvtlte27jiti"></a><span>Existing W3C prefix policy provides false expectations</span></h2>




<p class="c6"><span class="c3"><a class="c7" href="http://www.quirksmode.org/blog/archives/2012/02/vendor_prefix_p.html">PPK covered this ground well</a></span><span>&nbsp;last week, but in short the policy of binding prefix-drop to CR has failed plenty. Developers have no expectation of when this will happen, nor should they.</span><span>&nbsp;</span><span class="c3"><a class="c7" href="http://webcache.googleusercontent.com/search?q=cache:MaHFQ3cI7OUJ:robert.ocallahan.org/2012/02/alternatives-to-supporting-webkit.html+&amp;cd=1&amp;hl=en&amp;ct=clnk&amp;gl=us">Mozilla’s roc has confirmed</a></span><span>&nbsp;</span><span>developers are using prefixes and they won&#8217;t stop regardless of their supposed &#8220;experimental&#8221; status.</span></p>




<h2 class="c6"><a id="h.jruvgsvd5z3c" name="h.jruvgsvd5z3c"></a><span>Let’s</span><span>&nbsp;imagine there were no prefixes</span></h2>




<p class="c6">So without prefixes, vendors hands would be tied and the first implementation to ship would be the one to stick, right? Nah. I think we can <span>walk through</span><span> a few examples from recent history too see what it would have been like if there had been no vendor prefixes in play.</span></p>




<h3 class="c6"><a id="h.ylr2g0jgmml" name="h.ylr2g0jgmml"></a><span>transitions, transforms, animations</span></h3>




<p class="c6"><span>While plenty of implementation bugs were fixed, the developer would never have updated their syntax and would have complete browser support.</span></p>




<h3 class="c6"><a id="h.4g73m4o21qrt" name="h.4g73m4o21qrt"></a><span>box-sizing</span></h3>




<p class="c6"><span>No problems. No changes.</span></p>




<h3 class="c6"><a id="h.ga2jxpaib1kl" name="h.ga2jxpaib1kl"></a><span>css-gradients</span></h3>




<p class="c6"><span>Gradients has been the most tumultuous css spec, but if they had been implemented without prefixes, the feature would be in a better situation today.</span></p>




<p class="c2"></p>




<p class="c6"><span>Browsers discard properties and values they don’t parse successfully, so developers would have just included a cascade of the iterations of the spec. This would have successfully targeted all shipped versions of gradients:</span></p>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.blacktowhite</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">background-image</span><span class="o">:</span> <span class="n">gradient</span><span class="p">(</span><span class="n">linear</span><span class="o">,</span> <span class="k">left</span> <span class="k">top</span><span class="o">,</span> <span class="k">left</span> <span class="k">bottom</span><span class="o">,</span> <span class="n">from</span><span class="p">(</span><span class="nb">black</span><span class="p">)</span><span class="o">,</span> <span class="n">to</span><span class="p">(</span><span class="nb">white</span><span class="p">));</span> <span class="c">/* initial webkit proposal */</span>
</span><span class='line'>  <span class="k">background-image</span><span class="o">:</span> <span class="n">linear</span><span class="o">-</span><span class="n">gradient</span><span class="p">(</span><span class="k">top</span><span class="o">,</span> <span class="nb">black</span><span class="o">,</span> <span class="nb">white</span><span class="p">);</span> <span class="c">/* mozilla proposal */</span>
</span><span class='line'>  <span class="k">background-image</span><span class="o">:</span> <span class="n">linear</span><span class="o">-</span><span class="n">gradient</span><span class="p">(</span><span class="n">to</span> <span class="k">bottom</span><span class="o">,</span> <span class="nb">black</span><span class="o">,</span> <span class="nb">white</span><span class="p">);</span> <span class="c">/* likely the CR */</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<h3 class="c6"><a id="h.c5at201o11iy" name="h.c5at201o11iy"></a><span>f</span><span>lexbox</span></h3>




<p class="c6"><span>Mozilla started Flexbox v1, WebKit followed with a slightly stronger implementation. Both Alex Russell (</span><span class="c3"><a class="c7" href="http://infrequently.org/2009/08/css-3-progress/">post</a></span><span>) and I (</span><span class="c3"><a class="c7" href="http://www.html5rocks.com/en/tutorials/flexbox/quick/">article</a></span><span>) recommended boilerplate code that assumed no change for unprefixed state and blocked out</span> <span class="c3"><a class="c7" href="http://samples.msdn.microsoft.com/ietestcenter/#css3flexbox">IE10’s upcoming implementation</a></span><span>. &nbsp;</span></p>




<p class="c2"></p>




<p class="c6"><span>Flexbox v2 debuted and has an implementation in Chrome. Syntax is already different enough that the fallback story is happy. Without prefixing, the resulting browser support of shipped author code would be better. Again, I see no drawbacks in this example had these properties not been prefixed.</span></p>




<h3 class="c6"><a id="h.uydsa7iza1af" name="h.uydsa7iza1af"></a><span>requestAnimationFrame</span></h3>




<p class="c6"><span>Soon after this feature debuted,</span> <span class="c3"><a class="c7" href="http://paulirish.com/2011/requestanimationframe-for-smart-animating/">shims were written</a></span><span>&nbsp;to manage all prefixed implementations including the unprefixed state. &nbsp;(Sorry). Combined with quick adoption, browser &nbsp;have as much ability to change the feature as they would if it were unprefixed to start (that is, not much ability).</span></p>




<h2 class="c6"><a id="h.virs3o2io31f" name="h.virs3o2io31f"></a><span>Risks and Resolutions</span></h2>




<p class="c6"><span>In CSS, new breaking changes have to introduce syntax changes that would break previous parsing attempts, as seen in the gradients example. However, if the semantics of a feature changed without syntax changes, we’d have a situation where developers are forced to detect each behavior and write compatibility code.</span></p>




<p class="c2"></p>




<p class="c6"><span class="c4">border-image</span><span>&nbsp;introduced a similar situation recently: WebKit changed its semantics and required a `fill` keyword to match previous behavior. Sounds like trouble, but this change happened when the unprefixed variant was exposed, matching implementor best practices of changing a feature. The result: Greg Rewis of Adobe</span> <span class="c3"><a class="c7" href="http://blog.assortedgarbage.com/2011/12/change-happens/">blogging that Chrome broke his site</a></span><span>. 

This is truly how it is supposed to work, but still expectations are broken. Developers have plenty of motivation to leave in the unprefixed state at the beginning, but this means that any change will always break them. With prefixes or without prefixes, we would have gotten the same resolution here.</span></p>




<p class="c6"><span>In JavaScript/DOM we have a more secure safety net, as behavior can be detected. Take for example</span> <span class="c4">querySelectorAll()</span><span>; it was shipped without prefix and while implementation differences exist, JavaScript libraries</span> <span class="c3"><a class="c7" href="https://github.com/dperini/nwmatcher/blob/178bad9043/src/nwmatcher.js#L316-355"> detect and route around them</a></span><span>. Of course, semantics can change and the prefix → unprefix move provides an opportunity, but in my experience it’s more common to see these changes happen early on (like</span> <span class="c3 c4"><a class="c7" href="https://groups.google.com/a/chromium.org/group/chromium-html5/browse_thread/thread/2c963f6ecdae0573?pli=1"> blob.slice()</a></span><span class="c3"><a class="c7" href="https://groups.google.com/a/chromium.org/group/chromium-html5/browse_thread/thread/2c963f6ecdae0573?pli=1">’s change</a></span><span>).</span></p>




<p class="c2"></p>




<p class="c6"><span>Without prefixes there will be no mechanism to notify developers “beware, thar be dragons!”. Prefixes don’t do this now, as their removal isn’t prioritized so developers accept them as a fact of life rather than an indication of instability. &nbsp;The solution: getting accurate metrics of feature usage and adoption can inform implementors of if it’s too late to change a feature or still early enough to modify. &nbsp;</span></p>




<h2 class="c6"><a id="h.lwonm0v1qh5p" name="h.lwonm0v1qh5p"></a><span>Yes, but&#8230;</span></h2>




<p class="c6"><span>As vendor prefixing is a well-worn debate, allows me to deflect common challenges to this proposal to:</span></p>




<ol class="c9" start="1">
    <li class="c10 c6"><span class="c3"><a class="c7" href="http://hsivonen.iki.fi/vendor-prefixes/#rebuttal">Vendor Prefixes Are Hurting the Web</a></span><span>&nbsp;by Henri Sivonen (see “Pre-Emptive Rebuttal to the Most Common Counter-Arguments” and on)</span></li>

    <li class="c10 c6"><span class="c3"><a class="c7" href="http://webcache.googleusercontent.com/search?q=cache:MaHFQ3cI7OUJ:robert.ocallahan.org/2012/02/alternatives-to-supporting-webkit.html+&amp;cd=1&amp;hl=en&amp;ct=clnk&amp;gl=us"> Alternatives To Supporting -webkit Prefixes In Other Engines</a></span> <span>by Robert O’Callahan</span></li>

    <li class="c10 c6"><span class="c3"><a class="c7" href="http://www.quirksmode.org/blog/archives/2010/03/css_vendor_pref.html">CSS vendor prefixes considered harmful</a></span><span>&nbsp;by PPK (from 2010)</span></li>
</ol>




<h2 class="c6"><a id="h.3rdo0i7r5wqu" name="h.3rdo0i7r5wqu"></a><span>Logical</span> <span>Actions</span></h2>




<ol class="c9" start="1">
    <li class="c10 c6"><span class="c3">The community to evangelize use of tools</span><span>&nbsp;like <a href="http://compass-style.org/">Compass</a> that protect authors from bad authoring practices and so folks who publish tutorials don&#8217;t solely define their <code>-webkit-</code> styles.</span></li>

    <li class="c10 c6"><span>Browsers to track feature adoption to inform better decision-making around changes. (Answering the question: Are we stuck?) </span>

     <ul class="c8" start="1">
<li>This data should be public and update regularly.</li>
            <li class="c6 c11"><span>Should be based on pageviews, to accurately weigh when a CNN.com implements something</span></li>
        </ul>

</li>

    <li class="c10 c6"><span>Other browsers to implement a defined set of <code>-webkit-</code> prefixes on their mobile browsers. I don’t see a way around this nor do I think it’s bad.</span></li>
   <li>Drop the notion that evangelism gets us out of this mess. I&#8217;ve been doing this evangelism myself for the past 3 years, but I&#8217;m also a realist. This situation needs new policy and (clearly) needs speed out of the CSS WG. 
    <li class="c10 c6"><span>Browsers to clarify a</span> <span class="c3"><a class="c7" href="https://docs.google.com/present/view?id=ajdqczcmx5pv_148ggbxbfg2">feature detection strategy</a></span><span>&nbsp;that it supports. For example, developers have no reliable way of detecting</span> <span>Chrome’s 3D transforms support</span> <sup> <span class="c12">[</span><span class="c3 c12"><a class="c7" href="http://code.google.com/p/chromium/issues/detail?id=104687">1</a></span><span class="c12">,</span> <span class="c3 c12"><a class="c7" href="http://code.google.com/p/chromium/issues/detail?id=92509">2</a></span><span class="c12">]</span></sup><span>&nbsp;or discounting Chrome’s</span> <span class="c4">-webkit-hyphens</span> <span>false positive</span><span class="c12">[</span><span class="c3 c12"><a class="c7" href="http://code.google.com/p/chromium/issues/detail?id=107111">3</a></span><span class="c12">]</span><span>. All proposals for handling experimental properties need accurate feature detection techniques to be effective.</span></li>

</ol>


<p>In summary, the ideal developer experience is 1) using tools to manage prefixes and 2) always using the unprefixed state to reduce maintenance cost. These two facts eviscerate the benefits that prefixes were introduced for, leaving only the drawbacks.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[* { box-sizing: border-box } FTW]]></title>
    <link href="https://paulirish.com/2012/box-sizing-border-box-ftw/"/>
    <updated>2012-02-01T09:11:00-08:00</updated>
    <id>https://paulirish.com/2012/star-{-box-sizing-border-box-}-ftw</id>
    <content type="html"><![CDATA[<p><a href="http://css-tricks.com/box-sizing/"><img src="http://css-tricks.com/wp-content/uploads/2010/09/widthbox.png" align=right width=133></a>One of my least favorite parts about layout with CSS is the relationship of width and padding. You&#8217;re busy defining widths to match your grid or general column proportions, then down the line you start to add in text, which necessitates defining padding for those boxes. And &#8216;lo and behold, you now are subtracting pixels from your original width so the box doesn&#8217;t expand.</p>

<p>Ugh. If I say the width is 200px, gosh darn it, it&#8217;s gonna be a 200px wide box even if I have 20px of padding. So as you know, this is NOT how the box model has worked for the past ten years. Wikipedia has a great <a href="http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug#Background">history of this box model</a>. <ins><a href="http://www.jefftk.com/news/2012-02-18.html">Jeff Kaufman also dove into the history</a></ins></p>

<p><i>Anyway</i>, I have a recommendation for your CSS going forward:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="c">/* apply a natural box layout model to all elements, but allowing components to change */</span>
</span><span class='line'><span class="nt">html</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="o">*,</span> <span class="o">*</span><span class="nd">:before</span><span class="o">,</span> <span class="o">*</span><span class="nd">:after</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">inherit</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><ins>Update August 2014: This code was updated to match <a href="http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/">new box-sizing best practices</a></ins>. Also prefixes are <a href="http://caniuse.com/#feat=css3-boxsizing">pretty much dead</a>.</p>

<p>This gives you the box model you want. Applies it to all elements. Turns out many browsers already <a href="http://paulirish.com/wp-content/uploads/2011/gplus-boxsizing.html">use border-box for a lot of form elements</a> (which is why inputs and textareas look diff at width:100%;) But applying this to all elements is safe and wise.</p>

<h4>Browser support</h4>


<p>Due to browser support, this recommendation is only for projects that support IE8 and up. (<a href="https://developer.mozilla.org/En/CSS/Box-sizing#Browser_compatibility">Full browser compat at MDN</a>) Firefox &lt;= 28 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=243412">still needs</a> the <code>-moz-</code> prefix, and &lt;= iOS4, Android &lt;= 2.3 need the <code>-webkit-</code>, but everyone else uses the unprefixed. You can find more info about a box-sizing polyfill for IE6 &amp; 7 at <a href="http://html5please.com/#box-sizing">html5please.com/#box-sizing</a> (which was developed with <code>* { box-sizing: border-box</code>!).</p>

<h4>Is it safe to use?</h4>


<p>Totally. jQuery works pretty great with it <small>(<a href="http://bugs.jquery.com/ticket/11004">except this</a>)</small>. As mentioned, browser support is excellent. And a number of projects use this layout model by default, <a href="http://code.google.com/codesearch#OAMlx_jo-ck/src/third_party/WebKit/Source/WebCore/inspector/front-end/inspectorCommon.css&type=cs&l=28">including the WebKit Web Inspector</a> (aka Chrome DevTools). I heard from Dutch front-end developer Yathura Thorn on his experience:</p>

<blockquote><p>We&#8217;ve been using <code>*{box-sizing: border-box;}</code> in one of my projects (deployed in production, averaging over 1mln visits a month) at work for about a year now, and it seems to be holding up just fine. The project has been tested in IE8 &amp; 9 and the latests Firefox and Chrome versions and we&#8217;ve had no problems. All jQuery (+UI) offset calculations and animations run fine, even in any element we&#8217;ve displayed as inline-block. As of late we&#8217;ve started testing the project on mobile devices (iPhone, iPad and Android) and we&#8217;ve had no issues regarding box-sizing with any of them yet, so it seems to work just fine.</p></blockquote>

<p>One of my favorite use-cases that border-box solves well is columns. I might want to divide up my grid with 50% or 20% columns, but want to add <code>padding</code> via px or em. Without CSS&#8217;s upcoming <code>calc()</code> this is impossible&#8230; unless you use border-box. So easy. :) Another good one is applying 100% width and then wanting to add a padding to that element.</p>

<h4>Performance</h4>


<p><small>Lastly on <a href="http://twitter.com/miketaylr">@miketaylr</a>&#8217;s inquiry, I also tested perf overhead. <a href="https://docs.google.com/spreadsheet/ccc?key=0ArK1Uipy0SbDdDJSdGRjdEY0dWc0bGE4Y3huUWNIUmc">Anecdotal evidence</a> suggests border-box isn&#8217;t significant.</small></p>

<p>You might get up in arms about the universal <code id="starperf">*</code> selector.</p>

<p>Apparently you&#8217;ve heard its slow. Firstly, it&#8217;s not. It is as fast as <code>h1</code> as a selector. It can be slow when you specifically use it like <code>.foo > *</code>, so don&#8217;t do that. Aside from that, you are not allowed to care about the performance of * unless you concatenate all your javascript, have it at the bottom, minify your css and js, gzip all your assets, and losslessly compress all your images. If you aren&#8217;t getting 90+ Page Speed scores, it&#8217;s way too early to be thinking about selector optimization. See also: <a href="http://calendar.perfplanet.com/2011/css-selector-performance-has-changed-for-the-better/">CSS Selector Performance has changed! (For the better)</a> by Nicole Sullivan.</p>

<p>So&#8230; enjoy and hope you&#8217;ll find this a far more natural layout model.</p>

<div update>2012.06.25: Adding the following section. </div>




<h4 id="thirdparty">Adjustments for Third Party Content</h4>


<p>Any third party widgets add content directly into the page may need extra attention. Any widgets inside an iframe (like Disqus&#8217;s new theme) are naturally insulated from the parent page&#8217;s layout styles. If you need to make adjustments to the third party content you can apply <code>box-sizing: content-box;</code> to the widget and its descendants. This may not be trivial as form controls in particular are border-box by default, so you&#8217;ll also have to account for that.</p>

<div update>02.01.2012: Added a section on performance
<br>
2012.02.03: Included webkit prefixed property and usecase of a 100% width box.
<br>
2012.02.22: Added link to Jeff Kaufman&#8217;s history page.
<br>
2013.07.22: code sample updated for before/after generated content. thx snugug and eric j duran.
<br>
2014.08.24: Adjusted code based on <a href="http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/">research by Jon Neal and Chris Coyier</a>.
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving The Web Forward]]></title>
    <link href="https://paulirish.com/2011/moving-the-web-forward/"/>
    <updated>2011-12-03T19:33:00-08:00</updated>
    <id>https://paulirish.com/2011/moving-the-web-forward</id>
    <content type="html"><![CDATA[<p><a href="http://movethewebforward.org/"><img src="https://www.paulirish.com/wp-content/uploads/2011/12/mwf-ss.jpg"></a></p>

<p>This Wednesday, me and a ragtag team of like-minded developers launched <a href="http://movethewebforward.org/">Move the Web Forward</a>, an initiative to direct people&#8217;s passions into productive efforts that assist not only the web community but the entire web platform. People often feel the need to &#8220;give back&#8221;, but when it comes to contributing it&#8217;s a challenge to find the right place. This is something I&#8217;ve seen happen firsthand in the jQuery and HTML5 Boilerplate communities.</p>

<p>The MWF effort was inspired by <a href="https://twitter.com/dglazkov/status/20215500109778944">a tweet</a> by WebKit extraordinaire Dimitri Glazkov.</p>

<div class='embed tweet'><blockquote class="twitter-tweet"><p>If you want to help out with Web standards, you could wear a blue beanie once a year. Or you could start hacking on WebKit/Gecko.</p>&mdash; Dimitri Glazkov (@dglazkov) <a href="https://twitter.com/dglazkov/status/20215500109778944">December 29, 2010</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<p>Me and <a href="http://twitter.com/divya">Divya</a> started brainstorming on <a href="https://etherpad.mozilla.org/igotmybeanie">an etherpad</a>. We rounded up some folks on Google+ and IRC and started collecting a lot of excellent resources. Soon after a design was in the making and we started working in an open repo on github&#8230;</p>

<p>At this point, I want to call out Mat Marquis aka <a href="http://twitter.com/wilto">@wilto</a>, in particular, for really taking early ownership of this project and spearheading the design and frontend development. His efforts really made the site communicate its content effectively.</p>

<p>Naturally the site is on github <a href="https://github.com/h5bp/movethewebforward">if you&#8217;d like to contribute</a>. We have a few <a href="https://github.com/h5bp/movethewebforward/issues">issues open</a> that we&#8217;ll be improving the site with. <small>(Also, let me just say for projects like this, a <code>cron</code> job to pull latest from Github makes for such a relaxing workflow.)</small></p>

<p>Thanks to Divya, Mat, <a href="http://twitter.com/aaronforsander">Aaron Forsander</a>, <a href="http://twitter.com/c_t_montgomery">Connor Montgomery</a>, <a href="http://twitter.com/stefsull">Stephanie Rewis</a> (<a href="http://www.webstandards.org/2011/11/30/beyond-the-blue-beanie/">great writeup!)</a>, <a href="http://twitter.com/necolas">Nicolas Gallagher</a>, <a href="http://twitter.com/addyosmani">Addy</a>, and <a href="https://github.com/h5bp/movethewebforward/contributors">all these awesome folk</a>. Truly a socially developed site; everyone collaborating on IRC, etherpad and github (with as many having commit rights as possible). Fun project to work on and I hope to see everyone find the right place for them to get more involved in actively making the web as awesome as you want it to be.</p>

<div update>2011.12.02: #movingwebforward in action!</div>


<p>Beyond all the people who signed up (with the avatars) on the site to commit to things.. We&#8217;ve seen some moves in the community already:</p>

<ul><li>Ben Schwarz is <a href="http://w3.org/QA/2011/11/ben_schwarz_joining_csswg.html">joining the CSSWG</a> to redesign how specs look and act
<li>Connor Montgomery, <a href="http://bugzil.la/702159">wrote up a patch</a> regarding fullscreen support in Firefox
<li>Josh Adam is <a href="http://joshadam.ca/?p=13">inspired</a> to become better
<li>Alex Ball is going to <a href="http://alexball.tv/blog/out-to-change-peoples-lives/">contribute to BuddyPress</a>
<li>Lots of folks in the <a href="http://www.smashingmagazine.com/2011/11/30/the-smashing-guide-to-moving-the-web-forward-community/">accompanying Smashing Magazine</a> article are ready to dig in.
<li>Colin Gourlay will be <a href="http://blog.colin-gourlay.com/blog/2011/12/moving-the-web-forward/">documenting what he learns</a> more
</ul>


<p><code>\o\ \o/ /o/</code></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Web browser, frontend and standards feeds to follow]]></title>
    <link href="https://paulirish.com/2011/web-browser-frontend-and-standards-feeds-to-follow/"/>
    <updated>2011-11-21T19:57:00-08:00</updated>
    <id>https://paulirish.com/2011/web-browser-frontend-and-standards-feeds-to-follow</id>
    <content type="html"><![CDATA[<p>While a lot of conversation has moved to twitter and G+, hugely useful information is still published regularly to blogs. I&#8217;ve shared collections of frontend development feeds <a href="http://paulirish.com/2008/front-end-development-rss-feeds/">twice</a> <a href="http://paulirish.com/2010/front-end-development-feeds-to-follow/">before</a>. Now I&#8217;m back, but with three choices:</p>

<div update>
<h3>Download this: <a href="http://paulirish.github.io/frontend-feeds/frontend-feeds.opml">frontend-feeds.opml</a></h3>
2013.07.26: Poor Reader. :&#8217;(   Here are the three below bundles grouped up into an OPML file. Your new news reader can import them in one go.
<br>
Also, do not forget the <b>most important site </s>that has no feed</s>: <a href="http://webplatformdaily.org/">webplatformdaily.org</a></b>. It&#8217;s the best thing.  (2013.09.12: It has a feed now! Added)
</div>


<div update>
2013.09.12: <a href="https://github.com/paulirish/frontend-feeds">The OPML is now on  Github</a></div>




<table><tr><td width="33%" style="vertical-align:top;">
<img src="https://www.paulirish.com/i/bc7870.png" style="width: 170px">
Frontend development exploration, techniques, tips. Lots of JavaScript.
<br />
275 feeds.

<td width="33%" style="vertical-align:top;">
<img src="https://www.paulirish.com/i/c25980.png"  style="width: 170px">
Standards development and browser dev news.
<br />
56 feeds.


<td width="33%" style="vertical-align:top;">
<img src="https://www.paulirish.com/i/4e0280.png"  style="width: 170px">
Blogs focusing on building large webapps (<strong>new!</strong>)
<br />
22 feeds.

</table>




<br />


<p><small>Also, a short commentary on blogging vs tweeting.. while a lot of people have changed to twitter+jsfiddle only, tweets are not available via search after 30 days, so if you expect anything you share to last, blog it for real. :)</small></p>

<hr>




<div update>2011.12.02: Adding newsletters!

2012.08.09: Refreshed all the bundles. Added the frontend-webapps feed.</div>


<p>Also please subscribe to these guys which do a great job of highlighting the top stories of the week:</p>

<ul>
      <li><a href="http://javascriptweekly.com/">JavaScript Weekly</a>
    <li><a href="http://web-design-weekly.com/">Web Design Weekly</a>
     <li><a href="http://html5weekly.com/">HTML5 Weekly</a>
</ul>




<div update>
2013.07: Added opml.

</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Fundamentals, Primitives and History of HTML5]]></title>
    <link href="https://paulirish.com/2011/primitives-html5-video/"/>
    <updated>2011-11-21T05:39:00-08:00</updated>
    <id>https://paulirish.com/2011/the-fundamentals-primitives-and-history-of-html5</id>
    <content type="html"><![CDATA[<p>Just gave this talk at <a href="http://w3conf.org/">W3Conf</a> about some of the innerworkings of HTML5. Lots of did-you-know and cool insight into how browsers work. 37 minutes long,</p>

<iframe width="600" height="345" src="https://www.youtube.com/embed/WxmcDoAxdoY" frameborder="0" allowfullscreen></iframe>


<p><a href="http://dl.dropbox.com/u/39519/talks/html5-foundation/index.html">The Primitives of the HTML5 Foundation - Slides</a></p>

<p>I do discuss optional start and end tags as well as not quoting your attributes. I concede that these ideas scare the shit out of people. In fact, when I first heard <a href="http://code.google.com/speed/articles/optimizing-html.html">Jens Meiert propose the idea in 2009</a> my brain rejected it.</p>

<p><img src="http://meiert.com/en/upload/2009/07/wdr-3.png" alt="comic by Jens Meiert"></p>

<p> Still, I think many of the markup parsing curiosities that can be frightening only need to be understood by HTML minifiers. Always leave it up to tools to make your frontend payload smaller; you just want the most comfortable and maintainable authoring environment possible.</p>

<p>I shared them in this talk because 1) it can lead to writing more beautiful HTML that is easier to maintain. Leaving off <code>&lt;/li></code>&#8217;s is a good example. 2) I just want people to consider browsers less of a black box of uncertainty. There are rules and specs that define behavior, so once understood you can feel confident relying on a consistent behavior. We certainly don&#8217;t have that consistency across all the web platform, but for these examples you do.</p>

<p>In summary, I&#8217;m not advocating you write more spartan markup if you don&#8217;t want to. But if it makes you feel good, by all means, go at it; you know now how the browsers work.</p>

<p><small>ps. the monkey HTML shirt I wore is from a store in tokyo; solo location. but they also sell on this <a href="http://item.rakuten.co.jp/icefield/c/0000000245/">delightfully overwhelming site</a></small></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Semantics in practice and mapping semantic value to its consumers]]></title>
    <link href="https://paulirish.com/2011/semantics/"/>
    <updated>2011-11-14T10:25:00-08:00</updated>
    <id>https://paulirish.com/2011/semantics-in-practice-and-mapping-semantic-value-to-its-consumers</id>
    <content type="html"><![CDATA[<p>Divya Manian kicked off a good bout of discussion of HTML semantics with her post <a href="http://coding.smashingmagazine.com/2011/11/11/our-pointless-pursuit-of-semantic-value/">Our pointless pursuit of semantic value</a>. It called into question the amount of time we spend on identifying the Right and Best ways of marking up our content while highlighting details of some of the consumers of semantics like assistive technology (AT). Jeremy Keith responded in <a href="http://coding.smashingmagazine.com/2011/11/12/pursuing-semantic-value/">Pursing Semantic Value</a>. I wanted to chime in on Jeremy&#8217;s post so, I&#8217;ve published below my comment from the original post:</p>

<hr style="margin-bottom:30px">


<p>Thanks Jeremy for raising a practical example. This discussion is a tough one as much of HTML5 has clear semantics (nav/header/footer), but then parts have underdeveloped semantic meaning or add confusion to authors.</p>

<p><a rel="nofollow" href="https://gist.github.com/1360458">Jeremy’s gist</a> is a great example, in fact, of a poor time investment in semantics. It ascribes value to the new method of document outlining, which recently sees different styling for h1’s depending on section nesting. Recent browsers do indeed <em>style</em> the h1’s different; but if you actually structure your document as such, you do it to the detriment of your screenreader users: they will either <a rel="nofollow" href="http://www.accessibleculture.org/articles/2011/04/html5-aria-2011/#comment-4">get these h1’s all as top level headlines</a> or a <a rel="nofollow" href="http://www.accessibleculture.org/articles/2011/10/jaws-ie-and-headings-in-html5/">mishmash of heading nesting levels that don’t match any expected behavior</a> <small>(As an aside, this is completely unrelated but if anyone’s curious what CSS it takes to make that new h1 styling work across browsers… <strong><a rel="nofollow" href="https://github.com/cboone/hypsometric-css/blob/ac1e1132e9750f8e46b6be965e6fb4232141d63b/html5/html5-defaults.css#L144-275">feast your eyes on this beauty</a></strong>)</small></p>

<p>Additionally, <code>&lt;hgroup&gt;</code> is <a rel="nofollow" href="http://www.w3.org/html/wg/wiki/ChangeProposals#ISSUE-164:_no_hgroup">on the chopping block</a> and is  <a rel="nofollow" href="http://www.accessibleculture.org/articles/2011/10/jaws-ie-and-headings-in-html5/#comment-4">not supported</a> by JAWS.   Suffice it to say, Now is not a smart time to invest your time understanding the unwieldy <a rel="nofollow" href="http://www.456bereastreet.com/archive/201103/html5_sectioning_elements_headings_and_document_outlines/">document outlining algorithm</a>. <a rel="nofollow" href="http://coding.smashingmagazine.com/2011/11/12/pursuing-semantic-value/comment-page-1/#comment-554677">Luke’s comment</a> digs in deeper to the messy semantic state of the outlining algorithm.</p>

<div class='embed tweet'><blockquote class="twitter-tweet"><p>semantics are hard&#8230;let&#8217;s go shopping and CREATE EPIC SHIT&#8230;</p>&mdash; patrick h. lauke (@patrick_h_lauke) <a href="https://twitter.com/patrick_h_lauke/status/136106781821779968">November 14, 2011</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<p>The practicalities of making accessible web content are messy, but important.  The fact that we seem to spend more time on <code>div</code> vs <code>article</code> vs. <code>section</code> than on learning ARIA is a crime. (Furthermore, learning ARIA isn’t complete unless you’re <a rel="nofollow" href="http://zomigi.com/blog/videos-of-screen-readers-using-aria/">listening to the results</a> in a screenreader.)</p>

<p><span id="recommendation">My recommendation:</span> follow the work of <a rel="nofollow" href="http://www.paciellogroup.com/blog/">Steve Faulkner</a> and <a rel="nofollow" href="http://www.accessibleculture.org/articles/">Jason Kiss</a>. These two guys are publishing the only data that illuminates what’s actually happening at the AT level in response to our work. <a rel="nofollow" href="http://www.paciellogroup.com/blog/2011/11/html5-semantics-and-accessibility/">Steve’s comment on this post</a> does a solid job of unraveling this complex topic by showing all the many layers involved: specs, editors, authoring experience, aria, browser impl, screenreader compliance.</p>

<p>Also if you’d like to investigate what’s happening under the covers, I recommend:</p>

<ul>
    <li><a rel="nofollow" href="http://www.w3.org/TR/html-aapi/">HTML to Platform Accessibility APIs Implementation Guide</a> – Understand how HTML elements and attributes map to accessibility APIs</li>
    <li><a rel="nofollow" href="http://www.accessibleculture.org/articles/2011/04/html5-aria-2011/">HTML5, ARIA Roles, and Screen Readers in March 2011</a> –  Implementation of HTML5 elements in screenreaders isn’t perfect yet.</li>
    <li><a rel="nofollow" href="http://www.paciellogroup.com/blog/2010/04/html5-and-the-myth-of-wai-aria-redundance/">HTML5 and the myth of WAI-ARIA redundance</a> –  Will HTML5 make the use of WAI-ARIA in HTML redundant? Definitely not.</li>
    <li><a rel="nofollow" href="http://www.paciellogroup.com/blog/2010/10/jaws-support-for-aria/">JAWS Support for ARIA</a> –  Originally published by Freedom Scientific as a MS Word document. *facepalm*</li>
    <li><a rel="nofollow" href="http://www.html5accessibility.com/">html5accessibility.com</a> –  Also from Steve Faulkner; this research is hugely comprehensive and backs up the examples Divya provided</li>
    <li><a rel="nofollow" href="http://www.delicious.com/paul.irish/aria">delicious.com/paul.irish/aria</a> – My own bookmarks on semantics, aria and accessibility.</li>
</ul>


<p>In summary, I think it’s best to ground our efforts in pursuing semantic value by identifying precisely what the results will be. A fair rule of thumb: when it comes to semantics, if it’s confusing enough for you to ask a question about it, chances are the answer won’t make a realistic difference. Let’s build incredible stuff on this impressive platform and avoid getting mired in semantic inconsequentialities. There’s also room for more author engagement and screen-reader involvement in the standards process regarding these issues; but that’s a large topic I’ll have to save for another day.</p>
]]></content>
  </entry>
  
</feed>
