<html xml:lang="en-GB-hixie" xmlns="http://www.w3.org/1999/xhtml">
 <!--
    The following IE bugs prevent this from working on WinIE:
      * XHTML namespace not supported
    The following Safari bugs prevent this from working on Safari:
      * setting location.hash causes a reload
    The following Opera bugs prevent this from working on Opera:
      * getElementsByTagNameNS() doesn't work with namespaces (bug 166163)
      * overflow on root element not propagated to viewport (bug 170753)
      * small-caps affects numbers (bug 115939)
      * large font sizes are rendered too small (bug 170775)
      * <input> elements size incorrectly when sized in % with borders (bug 170776)
      * :target not supported
      * <canvas> not supported
    The following Firefox bugs prevent this from working on Firefox:
      * (Windows only) anti-aliasing in <canvas> causes ugly colour artifacts
      (The half dozen or more Firefox bugs found during the creation
      of these slides that prevented this from working on Linux builds
      were fixed by the Mozilla developers in time for the presentation)
   -->
 <head>
  <title>WHATWG - Proposing extensions to HTML4 and the DOM</title>
  <style>
   @namespace url(http://www.w3.org/1999/xhtml);
   html { font: 900 120px/1 sans-serif; text-align: center; overflow: hidden; height: 750px; width: 1020px; margin: auto; }
   body { position: relative; z-index: 0; }
   * { margin: 0; padding: 0; }
   section { display: none; }
   section:target { display: block; }
   section * { margin: 0 auto; font-size: 1em; }
   h1 { font-size: 1em; margin: 0.5em; color: #3c790a; }
   h2 { font-size: 0.9em; font-variant: small-caps; margin: 0; }
   span { white-space: pre; }
   img { position: relative; z-index: -1; }
   #logo { color: #3c790a; font-size: 600px; margin: 50px 0 0 280px; text-align: left; }
   #opera { color: rgb(204, 0, 0); font-size: 200px; margin: 0.15em 0 0 0.75em; text-align: left; }
   #apple { color: rgb(0, 0, 0); font-size: 200px; margin: -0.25em 0 0 1.55em; text-align: left; }
   #mozilla { color: rgb(69, 83, 114); font-size: 200px; margin: -0.25em 0 0 0.485em; text-align: left; letter-spacing: 0.01em; }
   #others { color: rgb(64, 64, 64); font-size: 120px; margin: 0em 0.5em 0 0; text-align: right; }
   #html { font-size: 400px; letter-spacing: -0.08em; text-indent: -0.08em; }
   #html5 { font-size: 600px; margin: -0.4em 0 0 1em; text-align: left; color: #ffffff; }
   #html5:before { padding: 4px 0 0 4px; margin: 0 0 -4px 0; text-align: left; color: #ffffff; height: 0; display: block; content: '5'; }
   #html5:after { margin: -1em 0 0 0; padding: 2px 0 0 0; text-indent: 2px; text-align: left; color: #3c790a; display: block; content: '5'; }
   #clock { position: absolute; top: 0.5em; right: 1em;  }
   #datagrid { margin-bottom: -0.5em; }
   code { display: block; font: 900 0.9em/1 monospace; text-align: left; padding: 0.25em 0.4em; color: orangered; }
   .input { margin: 0.25em 0 0.4em; height: 0; }
   .input span { display: block; margin: 3.85em 0 0 0; }
   input { font: 900 1em sans-serif; border: gray inset 0.2em; display: block; margin: 2em auto 0; width: 80%; }
   #date.input { margin-bottom: 0.2em; }
   #draganddrop span { padding: 0 0.2em 0 0.1em; }
   #contentEditable span { display: block; padding: 0 0 0 1em; }
   #bf code { display: block; }
   #bf code + code { margin: 0 0 -1em 0; text-align: right; }
   .more span, .buzz span, .better span, .word span { display: block; }
   .more0 { text-transform: uppercase; font: 900 0.75em sans-serif; letter-spacing: 0.5em; margin: 0.6em -0.5em 0 0; }
   .more1 { text-transform: uppercase; font: 900 2.5em sans-serif; }
   .more2 { text-transform: uppercase; font: 900 1.25em sans-serif; }
   .newTag { margin: 2em 0 0 0; }
   .newTag code { text-align: center; }
   .newTags code { padding-left: 1em; text-align: left; margin: 0 0 -0.25em 0; }
   .newTags code + code { padding-left: 2em; }
   .newTags code + code + code { padding-left: 3em; }
   .newTags code + code + code + code { padding-left: 4em; }
   .newTags code + code + code + code + code { padding-left: 5em; }
   pre em { font-size: 0.5em; vertical-align: 0.2em; color: silver; padding: 0 0.5em; }
   pre del { font-size: 0.4em; vertical-align: 0.5em; color: silver; margin: 0 0.8em 0 -0.9em; }
   #style { margin: 1em 0 0 0; }
   .better { padding: 0.5em 0; }
   .better0 { text-transform: uppercase; font: 900 2.10em sans-serif; }
   .better1 { text-transform: uppercase; font: 900 2.25em sans-serif; }
   .buzz { padding: 1em 0; }
   .buzz0 { text-transform: uppercase; font: 900 1.78em sans-serif; }
   .buzz1 { text-transform: uppercase; font: 900 1.18em sans-serif; }
   .word { text-transform: uppercase; font: 900 1em sans-serif; padding: 1em 0; }
   .word.i18n span { font-size: 4em; margin-top: -0.1em; }
   .word.di span { font-size: 2em; }
   .word.di span + span { font-size: 1em; }
   .word.mi span { font-size: 2em; }
   .word.mi span + span { font-size: 1em; }
   .word.spc span { font-size: 1em; margin: 0.1em 0; }
   .word.spc span + span { font-size: 1em; }
   .word.spc span + span + span { display: inline; font-size: 1em; }
   .word.a span, .word.mm span { font-size: 1.2em; margin-top: 1em; }
   .word.o span { font-size: 2.5em; margin-top: -0.15em; }
   .word.o span + span { font-size: 1.2em; }
   .word.w1 { padding: 0; }
   .word.w1 span:first-child { font-size: 3em; margin: 0 0 -0.2em; }
   .word.w1 span { font-size: 1.5em; margin: -0.2em; }
   .examples { font-size: 1.5em; padding: 1em 0 1.5em; text-transform: uppercase; background: url(astrophy.png) no-repeat bottom center; }
   .example.canvas + p { margin: 0.1em 0 0; line-height: 1.5em; }
   .example.canvas + p canvas { height: 1em; width: 4em; vertical-align: -0.1em; }
   .example + pre, pre.example { font: 0.3em monospace; color: gray; padding: 0 1em 0.5em; text-align: left; }
   .example + pre strong, pre.example strong { color: green; font-weight: bolder; }
   .example + pre.last, pre.last.example { color: black; font-weight: bolder; }
   .before, .after { font-size: 0.8em; font-variant: small-caps; padding: 0 0 0.2em; }
   .word.soon { padding: 0; }
   .word.soon span { font-size: 2em; }
   .word.soon span + span { font-size: 2.8em; }
   .word.open span { font-size: 3em; }
   .word.want { padding: 0.8em 0 0; }
   .word.want span { font-size: 1em; }
   .word.want span + span { font-size: 1.5em; }
   .mail { font: 900 0.8em sans-serif; color: #3c790a; }
   .web { font: 900 1.2em sans-serif; padding-top: 3em; }
  </style>
  <script><![CDATA[
   function setSlide(n) {
     if (n < 0)
       n = 0;
     else {
       var max = document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'section').length - 1;
       if (n > max)
         n = max;
     }
     location.hash = n;
   }
   function getSlide() {
     var x = parseInt(location.hash.substr(1));
     if (isNaN(x)) return 0;
     return x;
   }
   function init() {
     var slides = document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'section');
     for (var i = 0; i < slides.length; ++i) {
       slides[i].id = i;
     }
     setSlide(getSlide());
     document.addEventListener('keypress', keydown, false);
   }
   function keydown(e) {
     if (e.shiftKey || e.altKey || e.metaKey || e.ctrlKey) return;
     if (e.charCode == 0x20 || e.keyCode == 0x22 || e.keyCode == 0x27) {
       setSlide(getSlide()+1);
     } else if (e.keyCode == 0x21 || e.keyCode == 0x25) {
       setSlide(getSlide()-1);
     } else if (e.keyCode == 0x24) {
       setSlide(0);
     } else if (e.keyCode == 0x23) {
       setSlide(document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'section').length-1);
     } else {
       return;
     }
     e.preventDefault();
   }
  ]]></script>
 </head>
 <body>
  <section>
   <h1>?&#x20DD; WHATWG</h1>
   <h2>Proposing extensions <span>to HTML4</span> <span>and the DOM</span></h2>
  </section>
  <section>
   <p id="logo">?&#x20DD;</p>
  </section>
  <section>
   <p id="opera">Opera</p>
   <p id="apple">Apple</p>
   <p id="mozilla">Mozilla</p>
   <p id="others">and others</p>
  </section>
  <section>
   <h1>?&#x20DD; WHATWG</h1>
   <h2>Proposing extensions <span>to HTML4</span> <span>and the DOM</span></h2>
  </section>
  <section>
   <p id="html">HTML</p>
   <p id="html5">5</p>
  </section>
  <section>
   <p id="datagrid"><code>&lt;datagrid></code></p>
   <p><img src="datagrid.png" alt=""/></p>
  </section>
  <section>
   <p id="canvas"><code>&lt;canvas></code></p>
   <p><img src="canvas.png" alt=""/></p>
   <p class="clock"><canvas id="clock" width="172" height="172"/></p>
   <script>

    var secondsSweepbackAnimateInterval = 35;
    var secondsSweepbackMax = 0.15;
    var secondsSweepbackAmounts = new Array(-2*secondsSweepbackMax,
                                            1.5*secondsSweepbackMax,
                                            -secondsSweepbackMax,
                                            0.75*secondsSweepbackMax,
                                            -0.5*secondsSweepbackMax,
                                            0.25*secondsSweepbackMax);
    var secondSweepbackAnimation = { step: 0, timer: null };

    var timerInterval;
    var minutesAngle;
    var hoursAngle;

    var context = document.getElementById('clock').getContext('2d');
    var back = new Image (172, 172);
    back.src = 'clock.png';

    function secondSweepbackAnimate() {
      if (secondSweepbackAnimation.step >= secondsSweepbackAmounts.length) {
        //  no more steps to the animation, so clear the timer
        clearInterval(secondSweepbackAnimation.timer);
        secondSweepbackAnimation.timer = null;
        secondSweepbackAnimation.step = 0;
      } else {
        originalSeconds = originalSeconds + secondsSweepbackAmounts[secondSweepbackAnimation.step];
        var secondsAngle = originalSeconds * 0.10471975511965977; // all angles computed in radians
        drawHands (hoursAngle, minutesAngle, secondsAngle);
        secondSweepbackAnimation.step++;
      }
    }       

    function updateTime() {
      var now = new Date();
      now.setTime(now.getTime() + (2 * 60 * 60 * 1000));

      originalSeconds = now.getSeconds() + secondsSweepbackMax;
      var secondsAngle = originalSeconds * 0.10471975511965977; // all angles computed in radians
      minutesAngle = now.getMinutes() * 0.10471975511965977;
      hoursAngle = ((now.getHours()%12) * 0.523598775598) + (minutesAngle/6.283185481853 * 0.523598775598);

      drawHands (hoursAngle, minutesAngle, secondsAngle);

      if (secondSweepbackAnimation.timer != null) {
        clearInterval(secondSweepbackAnimation.timer);
        secondSweepbackAnimation.timer = null;
      }
      secondSweepbackAnimation.step = 0;
      secondSweepbackAnimation.timer = setInterval(secondSweepbackAnimate, secondsSweepbackAnimateInterval);
    }

    function startSecondHandTimer() {
      if (timerInterval != null) {
        clearInterval(timerInterval);
        timerInterval = null;
      }
      timerInterval = setInterval(updateTime, 1000);
    }

    function drawHands (hoursAngle, minutesAngle, secondsAngle) {

      context.clearRect(0, 0, 172, 172);
      context.drawImage(back, 0, 0, 172, 172);

      context.save();
      context.translate(172/2, 172/2 -4);
      context.lineWidth = 2;

      context.save();
      context.rotate(minutesAngle);
      drawLongHand(3.5, 4, 50, '#555555', '#000000', '#666666');
      context.restore();

      context.save();
      context.rotate(hoursAngle);
      drawShortHand(3.5, 3, 33, '#555555', '#000000', '#000000');
      context.restore();

      context.save();
      context.lineWidth = 1;
      context.rotate(secondsAngle);
      drawLongHand(1.5, 2, 53, '#CC3300', '#EE0000', '#CC3300');
      context.restore();

      context.restore();

    }

    function drawLongHand(r, w, h, a, b, c) {
      var theta = Math.PI/2 - Math.asin(w/(2*r));

      context.beginPath();
      context.moveTo(0, -h+r);
      context.lineTo(r * Math.cos(theta), -r * Math.sin(theta));
      context.arc(0, 0, r, 2*Math.PI-theta, Math.PI+theta, false);
      context.closePath();
      context.fillStyle = context.createLinearGradient(0, 0, 0, -h);
      context.fillStyle.addColorStop(0, a);
      context.fillStyle.addColorStop(1, b);
      context.fill();

      context.beginPath();
      context.arc(0, 0, r, 0, 2*Math.PI, true);
      context.strokeStyle = c;
      context.stroke();

    }

    function drawShortHand(r, w, h, ca, cb, cc) {
      var theta = Math.PI/2 - Math.asin(w/(2*r));

      var p = Math.PI/2 - theta;
      var q = theta + Math.PI/2
      var a = r + context.lineWidth/2;
      var b = r - context.lineWidth/2;

      var y = a * Math.sin(p - Math.asin(b/a * Math.sin(q))) / Math.sin(q);

      context.beginPath();
      context.moveTo(0, -h+r);
      context.lineTo(r * Math.cos(theta) + y, -r * Math.sin(theta));
      context.lineTo(r * Math.cos(theta), -r * Math.sin(theta));
      context.arc(0, 0, r, 2*Math.PI-theta, Math.PI+theta, false);
      context.lineTo(-r * Math.cos(theta) - y, -r * Math.sin(theta));
      context.closePath();
      context.fillStyle = context.createLinearGradient(0, 0, 0, -h);
      context.fillStyle.addColorStop(0, ca);
      context.fillStyle.addColorStop(1, cb);
      context.fill();

      context.beginPath();
      context.moveTo(r * Math.cos(theta) + y, -r * Math.sin(theta));
      context.lineTo(r * Math.cos(theta), -r * Math.sin(theta));
      context.arc(0, 0, r, 2*Math.PI-theta, Math.PI+theta, false);
      context.lineTo(-r * Math.cos(theta) - y, -r * Math.sin(theta));
      context.lineWidth /= 2;
      context.strokeStyle = cc;
      context.stroke();

    }

    back.onload = startSecondHandTimer();

   </script>
  </section>
  <section>
   <p id="range" class="input"><code>&lt;input<span> type="range"></span></code></p>
   <p><img src="range.png" alt=""/></p>
  </section>
  <section>
   <p id="email" class="input"><code>&lt;input<span> type="email"></span></code></p>
   <p><input value="ian@hixie.ch"/></p>
  </section>
  <section>
   <p id="uri" class="input"><code>&lt;input<span> type="url"></span></code></p>
   <p><input value="http://hixie.ch/"/></p>
  </section>
  <section>
   <p id="time" class="input"><code>&lt;input<span> type="time"></span></code></p>
   <p><img src="time.png" alt=""/></p>
  </section>
  <section>
   <p id="date" class="input"><code>&lt;input<span> type="date"></span></code></p>
   <p><img src="date.png" alt=""/></p>
  </section>
  <section>
   <p class="newTags"><code>autofocus=""</code> <code>required=""</code> <code>pattern=""</code> <code>list=""</code> <code>min=""</code>  </p>
  </section>
  <section>
   <p id="draganddrop"><code>on<span>start</span>drag=""</code></p>
   <p><img src="draganddrop.png" alt=""/></p>
  </section>
  <section>
   <p id="contentEditable"><code>content<span>Editable=""</span></code></p>
   <p><img src="contentEditable.png" alt=""/></p>
  </section>
  <section>
   <p id="bf"><code>pushState(...);</code> <code>onback="..."</code></p>
   <p><img src="bf.png" alt=""/></p>
  </section>
  <section>
   <p class="more">
    <span class="more0">Now with</span>
    <span class="more1">more</span>
    <span class="more2">semantics</span>
   </p>
  </section>
  <section>
   <p class="newTag"><code>&lt;section></code></p>
  </section>
  <section>
   <p class="newTag"><code>&lt;article></code></p>
  </section>
  <section>
   <p class="newTag"><code>&lt;aside></code></p>
  </section>
  <section>
   <p class="newTag"><code>&lt;nav></code></p>
  </section>
  <section>
   <p class="newTag"><code>&lt;footer></code></p>
  </section>
  <section>
   <p class="newTag"><code>&lt;calendar></code></p>
  </section>
  <section>
   <p class="newTag"><code>&lt;vcard></code></p>
  </section>
  <section>
   <p class="newTags"><code>&lt;progress></code> <code>&lt;gauge></code> <code>&lt;date></code> <code>&lt;time></code> <code>&lt;menu></code>  </p>
  </section>
  <section>
   <p class="more">
    <span class="more0">Now with</span>
    <span class="more1">more</span>
    <span class="more2">flexibility</span>
   </p>
  </section>
  <section>
   <pre><code>&lt;p><em>bla bla</em>
 &lt;ol>
  &lt;li><em>bla</em>&lt;/li>
  &lt;li><em>bla</em>&lt;/li>
 &lt;ol>
&lt;/p></code></pre>
  </section>
  <section>
   <pre><code>&lt;p><em>bla bla</em>
 &lt;table>
  &lt;tr>
   &lt;td><em>1.2</em>&lt;/td>
   &lt;td><em>2.6</em>&lt;/td>
   <em>...</em></code></pre>
  </section>
  <section>
   <pre id="style"><code>&lt;style <del>type="text/css"</del>>
 <em>...</em>
&lt;/style></code></pre>
  </section>
  <section>
   <p class="better">
    <span class="better0">Fewer</span>
    <span class="better1">holes</span>
   </p>
  </section>
  <section>
   <p class="buzz">
    <span class="buzz0">Lots of</span>
    <span class="buzz1">buzzwords</span>
   </p>
  </section>
  <section>
   <p class="word i18n"><span>I18N</span></p>
  </section>
  <section>
   <p class="word di"><span>Device</span> <span>independent</span></p>
  </section>
  <section>
   <p class="word mm"><span>Multimodal</span></p>
  </section>
  <section>
   <p class="word mi"><span>Media</span> <span>independent</span></p>
  </section>
  <section>
   <p class="word spc"><span>Separates</span> <span>presentation</span> <span>from</span> <span>content</span></p>
  </section>
  <section>
   <p class="word a"><span>Accessible</span></p>
  </section>
  <section>
   <p class="word o"><span>Open</span> <span>standard</span></p>
  </section>
  <section>
   <p class="word w1"><span>Wide</span> <span>industry</span> <span>support</span></p>
  </section>
  <section>
   <p class="examples"><span>Examples</span></p>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <p id="sparklines">
      <span>MON <canvas width="480" height="120"></canvas></span>
      <span>TUE <canvas width="480" height="120"></canvas></span></p>
   <script><![CDATA[
    function updateGraph() {

      var data = new Array(new Array(0.01, 0.09, 0.08, 0.07, 0.14, 0.21, 0.27, 0.33, 0.38, 0.43, 0.48, 0.52, 0.56, 0.59, 0.62, 0.65, 0.68, 0.71, 0.73, 0.75, 0.77, 0.79, 0.81, 0.82, 0.84, 0.85, 0.86, 0.79, 0.73, 0.67, 0.69, 0.80, 0.81, 0.75, 0.69, 0.63, 0.58, 0.54, 0.57, 0.61, 0.56, 0.59, 0.55, 0.58, 0.61, 0.57, 0.60, 0.71, 0.73, 0.68, 0.70, 1.13, 1.12, 1.11, 1.10, 1.01, 0.93, 0.85, 0.79, 0.72, 0.66, 0.61, 0.56, 0.52, 0.55, 0.51, 0.47, 0.43, 0.40, 0.36, 0.34, 0.31, 0.28, 0.26, 0.24, 0.22, 0.20, 0.18, 0.17, 0.24, 0.22, 0.20, 0.18, 0.17, 0.15, 0.14, 0.13, 0.12, 0.11, 0.10, 0.09, 0.08, 0.07, 0.06, 0.22, 0.28, 0.34, 0.39, 0.44, 0.48, 0.52, 0.56, 0.60, 0.63),
                          new Array(0.58, 0.53, 0.49, 0.45, 0.41, 0.46, 0.42, 0.39, 0.36, 0.33, 0.30, 0.28, 0.33, 0.31, 0.28, 0.34, 0.39, 0.44, 0.49, 0.45, 0.49, 0.45, 0.50, 0.54, 0.49, 0.53, 0.57, 0.60, 0.64, 0.66, 0.69, 0.72, 0.66, 0.68, 0.63, 0.58, 0.53, 0.49, 0.45, 0.41, 0.38, 0.35, 0.32, 0.30, 0.27, 0.25, 0.23, 0.21, 0.19, 0.18, 0.24, 0.30, 0.36, 0.41, 0.46, 0.50, 0.46, 0.50, 0.62, 0.57, 0.53, 0.48, 0.44, 0.41, 0.38, 0.35, 0.32, 0.29, 0.27, 0.25, 0.23, 0.21, 0.19, 0.18, 0.16, 0.15, 0.14, 0.12, 0.11, 0.10, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01, 0.00));

      var sparklines = document.getElementById('sparklines').getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'canvas');
      for (var e = 0; e < sparklines.length; e += 1) with (sparklines[e].getContext('2d')) {
        var margin = 10;
        var maxX = canvas.width - margin*2;
        var maxY = canvas.height - margin*2;
        save();
        translate(margin, maxY+margin);
        var highest = 0;
        for (var i = 0; i < data[e].length; i += 1) {
          lineTo(i * maxX / data[e].length, -data[e][i] * maxY/1.2);
          if (data[e][i] > data[e][highest])
            highest = i;
        }
        lineWidth = margin;
        strokeStyle = 'gray';
        stroke();
        beginPath();
        arc(highest * maxX / data[e].length, -data[e][highest] * maxY/1.2, margin, 0, Math.PI*2, true);
        lineWidth = margin/2;
        fillStyle = 'orangered';
        /*fill();*/
        restore();
      }
    }
    updateGraph();
   ]]></script>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre class="last">function paintSparkline(canvas, data) {
  with (canvas.getContext('2d')) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(<strong>canvas</strong>, data) {
  with (canvas.getContext('2d')) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(canvas, <strong>data</strong>) {
  with (canvas.getContext('2d')) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(canvas, data) {
  with (canvas.<strong>getContext('2d')</strong>) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(canvas, data) {
  with (canvas.getContext('2d')) {
    <strong>save();</strong>
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    <strong>restore();</strong>
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(canvas, data) {
  with (canvas.getContext('2d')) {
    save();
    <strong>translate(0, canvas.height);</strong>
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(canvas, data) {
  with (canvas.getContext('2d')) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      <strong>lineTo(</strong>i * canvas.width / data.length,
             data[i] * -canvas.height<strong>);</strong>
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre>function paintSparkline(canvas, data) {
  with (canvas.getContext('2d')) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    <strong>strokeStyle = 'gray';
    stroke();</strong>
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example canvas"><code>&lt;canvas></code></p>
   <pre class="last">function paintSparkline(canvas, data) {
  with (canvas.getContext('2d')) {
    save();
    translate(0, canvas.height);
    for (var i = 0; i &lt; data.length; i += 1)
      lineTo(i * canvas.width / data.length,
             data[i] * -canvas.height);
    strokeStyle = 'gray';
    stroke();
    restore();
  }
}</pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <p><img src="voidwars.png" alt=""/></p>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <p><img src="voidwars1.png" alt=""/></p>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <p><img src="voidwars2.png" alt=""/></p>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <p><img src="voidwars3.png" alt=""/></p>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <p class="before">Before:</p>
   <pre class="example"><strong>&lt;iframe src="events.cgi">&lt;/iframe></strong></pre>   
   <pre class="example">&lt;script>parent.document.getElementById("cont
rols").innerHTML = "&lt;table style=\"width:100
%\" class=\"smallfont\">&lt;tr>&lt;th colspan=2>&lt;b
>&lt;span style=\"color:#44ff44\">Friendly plan
et&lt;/span>&lt;/b>&lt;/th>&lt;/tr>&lt;tr>&lt;td>Owner:&lt;/td>&lt;t
d>Administrators&lt;/td>&lt;/tr>&lt;tr>&lt;td>Class:&lt;/td
>&lt;td>Class M&lt;/td>&lt;/tr>&lt;tr>&lt;td>Population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,016,054&lt;/td>&lt;/tr>&lt;tr>&lt;td>Max population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,600,000&lt;/td>&lt;/tr>&lt;tr>&lt;td>Name:&lt;/td>&lt;td>Newp
ort&lt;/td>&lt;/tr>&lt;tr>&lt;td>Location:&lt;/td>&lt;td>(59,6</pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <p class="before">Before:</p>
   <pre class="example">&lt;iframe src="events.cgi">&lt;/iframe></pre>   
   <pre class="example"><strong>&lt;script>parent.document.getElementById("cont
rols").innerHTML = "&lt;table style=\"width:100
%\" class=\"smallfont\">&lt;tr>&lt;th colspan=2>&lt;b
>&lt;span style=\"color:#44ff44\">Friendly plan
et&lt;/span>&lt;/b>&lt;/th>&lt;/tr>&lt;tr>&lt;td>Owner:&lt;/td>&lt;t
d>Administrators&lt;/td>&lt;/tr>&lt;tr>&lt;td>Class:&lt;/td
>&lt;td>Class M&lt;/td>&lt;/tr>&lt;tr>&lt;td>Population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,016,054&lt;/td>&lt;/tr>&lt;tr>&lt;td>Max population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,600,000&lt;/td>&lt;/tr>&lt;tr>&lt;td>Name:&lt;/td>&lt;td>Newp
ort&lt;/td>&lt;/tr>&lt;tr>&lt;td>Location:&lt;/td>&lt;td>(59,6</strong></pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <pre class="example"><strong>&lt;event-source src="events.cgi"
             onevent="process(event)"/></strong></pre>
   <pre class="example">Data: Friendly planet
Data: Administrators
Data: Class M
Data: 2016054/2600000
Data: Newport
Data: 59,6</pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <pre class="example">&lt;event-source <strong>src="events.cgi"</strong>
             onevent="process(event)"/></pre>
   <pre class="example">Data: Friendly planet
Data: Administrators
Data: Class M
Data: 2016054/2600000
Data: Newport
Data: 59,6</pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <pre class="example">&lt;event-source src="events.cgi"
             <strong>onevent="process(event)"</strong>/></pre>
   <pre class="example">Data: Friendly planet
Data: Administrators
Data: Class M
Data: 2016054/2600000
Data: Newport
Data: 59,6</pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;event-source></code></p>
   <pre class="example">&lt;event-source src="events.cgi"
             onevent="process(event)"/></pre>
   <pre class="example"><strong>Data: Friendly planet
Data: Administrators
Data: Class M
Data: 2016054/2600000
Data: Newport
Data: 59,6</strong></pre>
  </section>
  <section>
   <p class="example event-source"><code>&lt;output></code></p>
   <p><img src="voidwars3.png" alt=""/></p>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <p class="before">Before:</p>
   <pre class="example"><strong>&lt;div id="controls">&lt;/div></strong></pre>   
   <pre class="example">&lt;script>parent.document.getElementById("cont
rols").innerHTML = "&lt;table style=\"width:100
%\" class=\"smallfont\">&lt;tr>&lt;th colspan=2>&lt;b
>&lt;span style=\"color:#44ff44\">Friendly plan
et&lt;/span>&lt;/b>&lt;/th>&lt;/tr>&lt;tr>&lt;td>Owner:&lt;/td>&lt;t
d>Administrators&lt;/td>&lt;/tr>&lt;tr>&lt;td>Class:&lt;/td
>&lt;td>Class M&lt;/td>&lt;/tr>&lt;tr>&lt;td>Population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,016,054&lt;/td>&lt;/tr>&lt;tr>&lt;td>Max population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,600,000&lt;/td>&lt;/tr>&lt;tr>&lt;td>Name:&lt;/td>&lt;td>Newp
ort&lt;/td>&lt;/tr>&lt;tr>&lt;td>Location:&lt;/td>&lt;td>(59,6</pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <p class="before">Before:</p>
   <pre class="example">&lt;div id="controls">&lt;/div></pre>   
   <pre class="example">&lt;script><strong>parent.document.getElementById("cont
rols").innerHTML = "</strong>&lt;table style=\"width:100
%\" class=\"smallfont\">&lt;tr>&lt;th colspan=2>&lt;b
>&lt;span style=\"color:#44ff44\">Friendly plan
et&lt;/span>&lt;/b>&lt;/th>&lt;/tr>&lt;tr>&lt;td>Owner:&lt;/td>&lt;t
d>Administrators&lt;/td>&lt;/tr>&lt;tr>&lt;td>Class:&lt;/td
>&lt;td>Class M&lt;/td>&lt;/tr>&lt;tr>&lt;td>Population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,016,054&lt;/td>&lt;/tr>&lt;tr>&lt;td>Max population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,600,000&lt;/td>&lt;/tr>&lt;tr>&lt;td>Name:&lt;/td>&lt;td>Newp
ort&lt;/td>&lt;/tr>&lt;tr>&lt;td>Location:&lt;/td>&lt;td>(59,6</pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <p class="before">Before:</p>
   <pre class="example">&lt;div id="controls">&lt;/div></pre>   
   <pre class="example">&lt;script>parent.document.getElementById("cont
rols").innerHTML = "<strong>&lt;table style=\"width:100
%\" class=\"smallfont\">&lt;tr>&lt;th colspan=2>&lt;b
>&lt;span style=\"color:#44ff44\">Friendly plan
et&lt;/span>&lt;/b>&lt;/th>&lt;/tr>&lt;tr>&lt;td>Owner:&lt;/td>&lt;t
d>Administrators&lt;/td>&lt;/tr>&lt;tr>&lt;td>Class:&lt;/td
>&lt;td>Class M&lt;/td>&lt;/tr>&lt;tr>&lt;td>Population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,016,054&lt;/td>&lt;/tr>&lt;tr>&lt;td>Max population:&lt;/t
d>&lt;td style='text-align:right;width:90px;'>2
,600,000&lt;/td>&lt;/tr>&lt;tr>&lt;td>Name:&lt;/td>&lt;td>Newp
ort&lt;/td>&lt;/tr>&lt;tr>&lt;td>Location:&lt;/td>&lt;td>(59,6</strong></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example"><strong>&lt;section&gt;</strong>
 &lt;form name="controls">
  &lt;h1>&lt;output name="alignment"/>&lt;/h1>
  &lt;p>Owner: &lt;output name="owner"/>&lt;/p>
  &lt;p>Class: &lt;output name="planetClass"/>&lt;/p>
  &lt;!-- ... -->
 &lt;/form>
<strong>&lt;/section></strong></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;section&gt;
<strong> &lt;form name="controls"></strong>
  &lt;h1>&lt;output name="alignment"/>&lt;/h1>
  &lt;p>Owner: &lt;output name="owner"/>&lt;/p>
  &lt;p>Class: &lt;output name="planetClass"/>&lt;/p>
  &lt;!-- ... -->
<strong> &lt;/form></strong>
&lt;/section></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;section&gt;
 &lt;form name="controls">
  <strong>&lt;h1></strong>&lt;output name="alignment"/><strong>&lt;/h1></strong>
  <strong>&lt;p></strong>Owner: &lt;output name="owner"/><strong>&lt;/p></strong>
  <strong>&lt;p></strong>Class: &lt;output name="planetClass"/><strong>&lt;/p></strong>
  &lt;!-- ... -->
 &lt;/form>
&lt;/section></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;section&gt;
 &lt;form name="controls">
  &lt;h1><strong>&lt;output name="alignment"/></strong>&lt;/h1>
  &lt;p>Owner: <strong>&lt;output name="owner"/></strong>&lt;/p>
  &lt;p>Class: <strong>&lt;output name="planetClass"/></strong>&lt;/p>
  &lt;!-- ... -->
 &lt;/form>
&lt;/section></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="last example">&lt;section&gt;
 &lt;form name="controls">
  &lt;h1>&lt;output name="alignment"/>&lt;/h1>
  &lt;p>Owner: &lt;output name="owner"/>&lt;/p>
  &lt;p>Class: &lt;output name="planetClass"/>&lt;/p>
  &lt;!-- ... -->
 &lt;/form>
&lt;/section></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="last example">&lt;script>
  function process(event) {
    var data = event.data.split('\n');
    var controls = document.forms.controls;
    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];
    // ...
    // show the controls if they are hidden
    controls.parentNode.activate();
  }
&lt;/script></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;script>
 <strong> function process(event) {</strong>
    var data = event.data.split('\n');
    var controls = document.forms.controls;
    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];
    // ...
    // show the controls if they are hidden
    controls.parentNode.activate();
  <strong>}</strong>
&lt;/script></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;script>
  function process(event) {
    var data = <strong>event.data.split('\n')</strong>;
    var controls = document.forms.controls;
    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];
    // ...
    // show the controls if they are hidden
    controls.parentNode.activate();
  }
&lt;/script></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;script>
  function process(event) {
    var data = event.data.split('\n');
    var controls = <strong>document.forms.controls</strong>;
    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];
    // ...
    // show the controls if they are hidden
    controls.parentNode.activate();
  }
&lt;/script></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;script>
  function process(event) {
    var data = event.data.split('\n');
    var controls = document.forms.controls;
<strong>    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];</strong>
    // ...
    // show the controls if they are hidden
    controls.parentNode.activate();
  }
&lt;/script></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="example">&lt;script>
  function process(event) {
    var data = event.data.split('\n');
    var controls = document.forms.controls;
    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];
    // ...
    <strong>// show the controls if they are hidden
    controls.parentNode.activate();</strong>
  }
&lt;/script></pre>
  </section>
  <section>
   <p class="example output"><code>&lt;output></code></p>
   <pre class="last example">&lt;script>
  function process(event) {
    var data = event.data.split('\n');
    var controls = document.forms.controls;
    controls.alignment.value = data[0];
    controls.owner.value = data[1];
    controls.planetClass.value = data[2];
    // ...
    // show the controls if they are hidden
    controls.parentNode.activate();
  }
&lt;/script></pre>
  </section>
  <section>
   <p class="word soon"><span>Coming</span> <span>soon</span></p>
  </section>
  <section>
   <p class="word open"><span>Open</span></p>
  </section>
  <section>
   <p class="word want"><span>We want your</span> <span>feedback</span></p>
   <p class="mail"><span>whatwg@whatwg.org</span></p>
  </section>
  <section>
   <p class="web"><span>whatwg.org</span></p>
  </section>
  <script>init()</script>
 </body>
</html>
