dap commit: Upload Working Draft Candidate Spec - 5th September 2013

changeset:   450:f48b7d3b7774
tag:         tip
user:        Rich Tibbett <richt@opera.com>
date:        Mon Sep 02 21:32:00 2013 +0200
files:       discovery-api/WD-20130905.html
description:
Upload Working Draft Candidate Spec - 5th September 2013


diff -r 41aeb68f3f12 -r f48b7d3b7774 discovery-api/WD-20130905.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/discovery-api/WD-20130905.html	Mon Sep 02 21:32:00 2013 +0200
@@ -0,0 +1,2939 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" typeof="bibo:Document w3p:WD" about="" property="dcterms:language" content="en">
+<head>
+    <title>
+      Network Service Discovery
+    </title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+
+
+    <style>
+/* Custom ReSpec CSS (by Rich Tibbett) */
+
+     /* Add better spacing to sections */
+     section, .section { margin-bottom: 2em; }
+
+     /* Add addition spacing to <ol> and <ul> for rule definition */
+     ol.rule li, ul.rule li { padding:0.6em; }
+
+     pre.widl { border: solid thin; background: #EEEEEE; color: black; padding: 0.5em 1em; position: relative; }
+     pre.widl :link, pre.widl :visited { color: #000; background: transparent; }
+     pre.widl:before { content: "IDL"; font: bold small sans-serif; padding: 0.5em; background: white; position: absolute; top: 0; margin: -1px 0 0 -4em; width: 1.5em; border: thin solid; border-radius: 0 0 0 0.5em }
+
+     div.example { border: solid thin black; background: #FFFFF0; color: black; padding: 0.5em 1em; position: relative; margin: 1em 0 1em 4.6em; width: auto; }
+     div.example:before { content: "EXAMPLE"; font: bold small sans-serif; padding: 0.5em; background: white; color: black; position: absolute; top: 0; margin: -1px 0 0 -7.6em; width: 5em; border: thin solid black; border-radius: 0 0 0 0.5em }
+
+     dl.domintro { color: green; margin: 2em 0 2em 2em; padding: 0.5em 1em; border: none; background: #DDFFDD; }
+     hr + dl.domintro, div.impl + dl.domintro { margin-top: 2.5em; margin-bottom: 1.5em; }
+     dl.domintro dt, dl.domintro dt * { color: black; text-decoration: none; }
+     dl.domintro dd { margin: 0.5em 0 1em 2em; padding: 0; }
+     dl.domintro dd p { margin: 0.5em 0; }
+     dl.domintro code {font-size: inherit; font-style: italic; }
+     dl.domintro:before { display: table; margin: -1em -0.5em 0.5em auto; width: auto; content: 'This box is non-normative. Implementation requirements are given below this box.'; color: red; border: solid 2px; background: white; padding: 0 0.25em; font-size:0.8em; }
+
+     table { border-collapse:collapse; border-style:hidden hidden none hidden }
+     table thead { border-bottom:solid }
+     table tbody th:first-child { border-left:solid }
+     table td, table th { border-left:solid; border-right:solid; border-bottom:solid thin; vertical-align:top; padding:0.2em }
+
+     table.changelog * { font-family: monospace; font-size: 1em; }
+    </style>
+
+  <style>/*****************************************************************
+ * ReSpec 3 CSS
+ * Robin Berjon - http://berjon.com/
+ *****************************************************************/
+
+/* --- INLINES --- */
+em.rfc2119 {
+    text-transform:     lowercase;
+    font-variant:       small-caps;
+    font-style:         normal;
+    color:              #900;
+}
+
+h1 acronym, h2 acronym, h3 acronym, h4 acronym, h5 acronym, h6 acronym, a acronym,
+h1 abbr, h2 abbr, h3 abbr, h4 abbr, h5 abbr, h6 abbr, a abbr {
+    border: none;
+}
+
+dfn {
+    font-weight:    bold;
+}
+
+a.internalDFN {
+    color:  inherit;
+    border-bottom:  1px solid #99c;
+    text-decoration:    none;
+}
+
+a.externalDFN {
+    color:  inherit;
+    border-bottom:  1px dotted #ccc;
+    text-decoration:    none;
+}
+
+a.bibref {
+    text-decoration:    none;
+}
+
+cite .bibref {
+    font-style: normal;
+}
+
+code {
+    color:  #ff4500;
+}
+
+/* --- TOC --- */
+.toc a, .tof a {
+    text-decoration:    none;
+}
+
+a .secno, a .figno {
+    color:  #000;
+}
+
+ul.tof, ol.tof {
+    list-style: none outside none;
+}
+
+.caption {
+    margin-top: 0.5em;
+    font-style:   italic;
+}
+
+/* --- TABLE --- */
+table.simple {
+    border-spacing: 0;
+    border-collapse:    collapse;
+    border-bottom:  3px solid #005a9c;
+}
+
+.simple th {
+    background: #005a9c;
+    color:  #fff;
+    padding:    3px 5px;
+    text-align: left;
+}
+
+.simple th[scope="row"] {
+    background: inherit;
+    color:  inherit;
+    border-top: 1px solid #ddd;
+}
+
+.simple td {
+    padding:    3px 10px;
+    border-top: 1px solid #ddd;
+}
+
+.simple tr:nth-child(even) {
+    background: #f0f6ff;
+}
+
+/* --- DL --- */
+.section dd > p:first-child {
+    margin-top: 0;
+}
+
+.section dd > p:last-child {
+    margin-bottom: 0;
+}
+
+.section dd {
+    margin-bottom:  1em;
+}
+
+.section dl.attrs dd, .section dl.eldef dd {
+    margin-bottom:  0;
+}
+</style><style>/* --- ISSUES/NOTES --- */
+div.issue-title, div.note-title {
+    padding-right:  1em;
+    min-width: 7.5em;
+    color: #b9ab2d;
+}
+div.issue-title { color: #e05252; }
+div.note-title { color: #2b2; }
+div.issue-title span, div.note-title span {
+    text-transform: uppercase;
+}
+div.note, div.issue {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+.note > p:first-child, .issue > p:first-child { margin-top: 0 }
+.issue, .note {
+    padding: .5em;
+    border-left-width: .5em;
+    border-left-style: solid;
+}
+div.issue, div.note {
+    padding: 1em 1.2em 0.5em;
+    margin: 1em 0;
+    position: relative;
+    clear: both;
+}
+span.note, span.issue { padding: .1em .5em .15em; }
+
+.issue {
+    border-color: #e05252;
+    background: #fbe9e9;
+}
+.note {
+    border-color: #52e052;
+    background: #e9fbe9;
+}
+
+
+</style><style>/* HIGHLIGHTS */
+code.prettyprint {
+    color:  inherit;
+}
+
+/* this from google-code-prettify */
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
+</style><link rel="stylesheet" href="https://www.w3.org/StyleSheets/TR/W3C-WD"><!--[if lt IE 9]><script src='https://www.w3.org/2008/site/js/html5shiv.js'></script><![endif]--></head>
+  <body class="h-entry" role="document" id="respecDocument"><div class="head" role="contentinfo" id="respecHeader">
+  <p>
+
+      <a href="http://www.w3.org/"><img width="72" height="48" src="https://www.w3.org/Icons/w3c_home" alt="W3C"></a>
+
+  </p>
+  <h1 class="title p-name" id="title" property="dcterms:title">Network Service Discovery</h1>
+
+  <h2 property="dcterms:issued" datatype="xsd:dateTime" content="2013-09-04T22:00:00.000Z" id="w3c-working-draft-05-september-2013"><abbr title="World Wide Web Consortium">W3C</abbr> Working Draft <time class="dt-published" datetime="2013-09-05">05 September 2013</time></h2>
+  <dl>
+
+      <dt>This version:</dt>
+      <dd><a class="u-url" href="http://www.w3.org/TR/2013/WD-discovery-api-20130905/">http://www.w3.org/TR/2013/WD-discovery-api-20130905/</a></dd>
+      <dt>Latest published version:</dt>
+      <dd><a href="http://www.w3.org/TR/discovery-api/">http://www.w3.org/TR/discovery-api/</a></dd>
+
+
+      <dt>Latest editor's draft:</dt>
+      <dd><a href="http://dvcs.w3.org/hg/dap/raw-file/tip/discovery-api/Overview.html">http://dvcs.w3.org/hg/dap/raw-file/tip/discovery-api/Overview.html</a></dd>
+
+
+
+
+
+      <dt>Previous version:</dt>
+      <dd><a rel="dcterms:replaces" href="http://www.w3.org/TR/2013/WD-discovery-api-20130404/">http://www.w3.org/TR/2013/WD-discovery-api-20130404/</a></dd>
+
+
+    <dt>Editor:</dt>
+    <dd class="p-author h-card vcard" rel="bibo:editor" inlist=""><span typeof="foaf:Person"><span property="foaf:name" class="p-name fn">Rich Tibbett</span>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://opera.com/">Opera Software ASA</a></span>
+</dd>
+
+
+
+  </dl>
+
+
+
+
+
+      <p class="copyright">
+        <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> ©
+        2013
+
+        <a href="http://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup>
+        (<a href="http://www.csail.mit.edu/"><abbr title="Massachusetts Institute of Technology">MIT</abbr></a>,
+        <a href="http://www.ercim.eu/"><abbr title="European Research Consortium for Informatics and Mathematics">ERCIM</abbr></a>,
+        <a href="http://www.keio.ac.jp/">Keio</a>, <a href="http://ev.buaa.edu.cn/">Beihang</a>), All Rights Reserved.
+        <abbr title="World Wide Web Consortium">W3C</abbr> <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>,
+        <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and
+        <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.
+      </p>
+
+
+  <hr>
+</div>
+    <section id="abstract" class="introductory" property="dcterms:abstract" datatype="" typeof="bibo:Chapter" resource="#abstract" rel="bibo:chapter"><h2 aria-level="1" role="heading" id="h2_abstract">Abstract</h2>
+      <p>
+        This specification defines a mechanism for an HTML document to discover and subsequently communicate with
+        <abbr title="Hypertext Transfer Protocol">HTTP</abbr>-based services advertised via common discovery protocols
+        within the current network.
+      </p>
+    </section><section id="toc"><h2 class="introductory" aria-level="1" role="heading" id="h2_toc">Table of Contents</h2><ul class="toc" role="directory" id="respecContents"><li class="tocline"><a href="#introduction" class="tocxref"><span class="secno">1. </span>
+        Introduction
+      </a></li><li class="tocline"><a href="#conformance" class="tocxref"><span class="secno">2. </span>Conformance</a><ul class="toc"><li class="tocline"><a href="#dependencies" class="tocxref"><span class="secno">2.1 </span>
+          Dependencies
+        </a></li></ul></li><li class="tocline"><a href="#terminology" class="tocxref"><span class="secno">3. </span>
+        Terminology
+      </a></li><li class="tocline"><a href="#security-and-privacy-considerations" class="tocxref"><span class="secno">4. </span>
+        Security and privacy considerations
+      </a><ul class="toc"><li class="tocline"><a href="#privacy-considerations-for-api-implementations" class="tocxref"><span class="secno">4.1 </span>
+          Privacy considerations for <abbr title="Application Programming Interface">API</abbr> implementations
+        </a></li><li class="tocline"><a href="#additional-api-implementation-considerations" class="tocxref"><span class="secno">4.2 </span>
+          Additional <abbr title="Application Programming Interface">API</abbr> implementation considerations
+        </a></li></ul></li><li class="tocline"><a href="#requesting-networked-services" class="tocxref"><span class="secno">5. </span>
+        Requesting networked services
+      </a><ul class="toc"><li class="tocline"><a href="#methods" class="tocxref"><span class="secno">5.1 </span>
+          Methods
+        </a></li><li class="tocline"><a href="#error-handling" class="tocxref"><span class="secno">5.2 </span>
+          Error Handling
+        </a></li></ul></li><li class="tocline"><a href="#obtaining-networked-services" class="tocxref"><span class="secno">6. </span>
+        Obtaining networked services
+      </a><ul class="toc"><li class="tocline"><a href="#attributes" class="tocxref"><span class="secno">6.1 </span>
+          Attributes
+        </a></li><li class="tocline"><a href="#methods-1" class="tocxref"><span class="secno">6.2 </span>
+          Methods
+        </a></li><li class="tocline"><a href="#events" class="tocxref"><span class="secno">6.3 </span>
+          Events
+        </a></li></ul></li><li class="tocline"><a href="#communicating-with-a-networked-service" class="tocxref"><span class="secno">7. </span>
+        Communicating with a networked service
+      </a><ul class="toc"><li class="tocline"><a href="#attributes-1" class="tocxref"><span class="secno">7.1 </span>
+          Attributes
+        </a></li><li class="tocline"><a href="#states" class="tocxref"><span class="secno">7.2 </span>
+          States
+        </a></li><li class="tocline"><a href="#events-1" class="tocxref"><span class="secno">7.3 </span>
+          Events
+        </a></li></ul></li><li class="tocline"><a href="#service-discovery" class="tocxref"><span class="secno">8. </span>
+        Service Discovery
+      </a><ul class="toc"><li class="tocline"><a href="#zeroconf-mdns-dns-sd" class="tocxref"><span class="secno">8.1 </span>
+          Zeroconf (<abbr title="Multicast DNS">mDNS</abbr> + <abbr title="Domain Name System">DNS</abbr>-<abbr title="Service Discovery">SD</abbr>)
+        </a></li><li class="tocline"><a href="#simple-service-discovery-protocol-ssdp" class="tocxref"><span class="secno">8.2 </span>
+          Simple Service Discovery Protocol (<abbr title="Simple Service Discovery Protocol">SSDP</abbr>)
+        </a></li><li class="tocline"><a href="#discovery-and-launch-protocol-dial" class="tocxref"><span class="secno">8.3 </span>
+          Discovery and Launch Protocol (<abbr title="Discovery and Launch Protocol">DIAL</abbr>)
+        </a></li><li class="tocline"><a href="#network-topology-monitoring" class="tocxref"><span class="secno">8.4 </span>
+          Network Topology Monitoring
+        </a></li></ul></li><li class="tocline"><a href="#events-summary" class="tocxref"><span class="secno">9. </span>
+        Events Summary
+      </a></li><li class="tocline"><a href="#garbage-collection" class="tocxref"><span class="secno">10. </span>
+        Garbage collection
+      </a></li><li class="tocline"><a href="#use-cases-and-requirements" class="tocxref"><span class="secno">11. </span>
+        Use Cases and Requirements
+      </a></li><li class="tocline"><a href="#examples" class="tocxref"><span class="secno">A. </span>
+        Examples
+      </a></li><li class="tocline"><a href="#acknowledgements" class="tocxref"><span class="secno">B. </span>
+        Acknowledgements
+      </a></li><li class="tocline"><a href="#change-log" class="tocxref"><span class="secno">C. </span>
+        Change Log
+      </a></li><li class="tocline"><a href="#references" class="tocxref"><span class="secno">D. </span>References</a><ul class="toc"><li class="tocline"><a href="#normative-references" class="tocxref"><span class="secno">D.1 </span>Normative references</a></li></ul></li></ul></section>
+
+    <section class="informative" id="introduction">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_introduction"><span class="secno">1. </span>
+        Introduction
+      </h2><p><em>This section is non-normative.</em></p>
+      <p>
+        To enable Web pages to connect and communicate with Local-networked Services provided over <abbr title="Hypertext Transfer Protocol">HTTP</abbr>, this
+        specification introduces the <a href="#navigatornetworkservice"><code>NavigatorNetworkService</code></a>
+        interface.
+      </p>
+      <p>
+        Using this <abbr title="Application Programming Interface">API</abbr> consists of requesting a well-known
+        service type, known by developers and advertised by Local-networked Devices. User authorization, where the user
+        connects the web page to discovered services, is expected before the web page is able to interact with any
+        Local-networked Services.
+      </p>
+      <p>
+        A web page creates a request to obtain connectivity to services running in the network by specifying a
+        well-known discovery service type that it wishes to interact with.
+      </p>
+      <p>
+        The user agent, having captured all advertised services on the network from the <a href="#dfn-service-discovery-mechanisms" class="internalDFN">service discovery
+        mechanisms</a> included in this recommendation, attempts to match the requested service type to a discovered
+        service according to the processing described herein.
+      </p>
+      <p>
+        If a service connectivity request is successful then the Web page is provided with a promise-based success
+        callback with the all necessary information to communicate with the authorized Local-networked Service. If the
+        request fails then the Web page will receive a promise-based error callback containing an error string
+        describing the cause of Local-networked Service connectivity failure.
+      </p>
+      <p>
+        Once connected to a Local-networked Service the Web page can send requests and receive responses to the
+        Local-networked Service via the messaging format and appropriate channel inferred from the service type
+        authorized via the provided <abbr title="Application Programming Interface">API</abbr>. The Web page, once connected, can also receive service-pushed events, in the
+        messaging format supported by the Local-networked Device, if such event subscription functionality is provided
+        by the connected Local-networked Service.
+      </p>
+      <p>
+        Services available within the local network can connect and disconnect at different times during the execution
+        of a web page. The user agent can inform a web page when the state of networked services matching any of the
+        requested valid service types change. Web pages can use this information to enable in-page experiences for
+        communicating the state of networked services with the ability to change the particular service or set of
+        services the page is connected to (by re-invoking the <a href="#dom-navigator-getnetworkservices"><code>getNetworkServices()</code></a> method defined herein).
+      </p>
+      <div class="example">
+        <p>
+          Example of requesting a <abbr title="Domain Name System">DNS</abbr>-<abbr title="Service Discovery">SD</abbr> advertised service:
+        </p>
+        <hr>
+        <pre class="highlight prettyprint"><span class="kwd">function</span><span class="pln"> showServices</span><span class="pun">(</span><span class="pln"> services </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+  </span><span class="com">// Show a list of all the services provided to the web page</span><span class="pln">
+  </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> l </span><span class="pun">=</span><span class="pln"> services</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> l</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> services</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">name </span><span class="pun">);</span><span class="pln">
+</span><span class="pun">}</span><span class="pln">
+
+navigator</span><span class="pun">.</span><span class="pln">getNetworkServices</span><span class="pun">(</span><span class="str">'zeroconf:_boxee-jsonrpc._tcp'</span><span class="pun">).</span><span class="kwd">then</span><span class="pun">(</span><span class="pln">showServices</span><span class="pun">);</span></pre>
+      </div>
+      <div class="example">
+        <p>
+          Example of requesting a UPnP advertised service, also handling error conditions:
+        </p>
+        <hr>
+        <pre class="highlight prettyprint"><span class="kwd">function</span><span class="pln"> showServices</span><span class="pun">(</span><span class="pln"> services </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+  </span><span class="com">// Show a list of all the services provided to the web page</span><span class="pln">
+  </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> l </span><span class="pun">=</span><span class="pln"> services</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> l</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> services</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">name </span><span class="pun">);</span><span class="pln">
+</span><span class="pun">}</span><span class="pln">
+
+</span><span class="kwd">function</span><span class="pln"> error</span><span class="pun">(</span><span class="pln"> e </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Error occurred: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">name </span><span class="pun">);</span><span class="pln">
+</span><span class="pun">}</span><span class="pln">
+
+navigator</span><span class="pun">.</span><span class="pln">getNetworkServices</span><span class="pun">(</span><span class="str">'upnp:urn:schemas-upnp-org:service:ContentDirectory:1'</span><span class="pun">).</span><span class="kwd">then</span><span class="pun">(</span><span class="pln">showServices</span><span class="pun">,</span><span class="pln"> error</span><span class="pun">);</span></pre>
+      </div>
+      <div class="example">
+        <p>
+          Example of requesting either a <abbr title="Domain Name System">DNS</abbr>-<abbr title="Service Discovery">SD</abbr> or UPnP advertised service:
+        </p>
+        <hr>
+        <pre class="highlight prettyprint"><span class="kwd">function</span><span class="pln"> showServices</span><span class="pun">(</span><span class="pln"> services </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+  </span><span class="com">// Show a list of all the services provided to the web page (+ service type)</span><span class="pln">
+  </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> l </span><span class="pun">=</span><span class="pln"> services</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> l</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
+     console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> services</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">'('</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">type </span><span class="pun">+</span><span class="pln"> </span><span class="str">')'</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
+</span><span class="pun">}</span><span class="pln">
+
+navigator</span><span class="pun">.</span><span class="pln">getNetworkServices</span><span class="pun">([</span><span class="pln">
+  </span><span class="str">'zeroconf:_boxee-jsonrpc._tcp'</span><span class="pun">,</span><span class="pln">
+  </span><span class="str">'upnp:urn:schemas-upnp-org:service:ContentDirectory:1'</span><span class="pln">
+</span><span class="pun">]).</span><span class="kwd">then</span><span class="pun">(</span><span class="pln">showServices</span><span class="pun">);</span></pre>
+      </div>
+      <p>
+        For more detailed examples, including examples of communicating with obtained networked services, see the
+        <a href="#examples">Examples</a> section.
+      </p>
+    </section>
+    <section id="conformance" typeof="bibo:Chapter" resource="#conformance" rel="bibo:chapter"><!--OddPage--><h2 aria-level="1" role="heading" id="h2_conformance"><span class="secno">2. </span>Conformance</h2>
+<p>
+  As well as sections marked as non-normative, all authoring guidelines, diagrams, examples,
+  and notes in this specification are non-normative. Everything else in this specification is
+  normative.
+</p>
+<p>
+  The key words <em class="rfc2119" title="MUST">MUST</em>, <em class="rfc2119" title="MUST NOT">MUST NOT</em>, <em class="rfc2119" title="REQUIRED">REQUIRED</em>, <em class="rfc2119" title="SHOULD">SHOULD</em>, <em class="rfc2119" title="SHOULD NOT">SHOULD NOT</em>, <em class="rfc2119" title="RECOMMENDED">RECOMMENDED</em>, <em class="rfc2119" title="MAY">MAY</em>,
+  and <em class="rfc2119" title="OPTIONAL">OPTIONAL</em> in this specification are to be interpreted as described in [<cite><a class="bibref" href="#bib-RFC2119">RFC2119</a></cite>].
+</p>
+
+      <p>
+        Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or
+        "return false and abort these steps") are to be interpreted with the meaning of the key word ("must", "should",
+        "may", etc) used in introducing the algorithm.
+      </p>
+      <p>
+        Some conformance requirements are phrased as requirements on attributes, methods or objects. Such requirements
+        are to be interpreted as requirements on user agents.
+      </p>
+      <p>
+        Conformance requirements phrased as algorithms or specific steps <em class="rfc2119" title="MAY">MAY</em> be implemented in any manner, so long as
+        the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be
+        easy to follow, and not intended to be performant.)
+      </p>
+      <p>
+        The only conformance class defined by this specification is a <dfn id="dfn-user-agent">user agent</dfn>.
+      </p>
+      <p>
+        User agents <em class="rfc2119" title="MAY">MAY</em> impose implementation-specific limits on otherwise unconstrained inputs, e.g. to prevent denial
+        of service attacks, to guard against running out of memory, or to work around platform-specific limitations.
+      </p>
+      <p>
+        When support for a feature is disabled (e.g. as an emergency measure to mitigate a security problem, or to aid
+        in development, or for performance reasons), user agents <em class="rfc2119" title="MUST">MUST</em> act as if they had no support for the feature
+        whatsoever, and as if the feature was not mentioned in this specification. For example, if a particular feature
+        is accessed via an attribute in a Web IDL interface, the attribute itself would be omitted from the objects
+        that implement that interface - leaving the attribute on the object but making it return null or throw an
+        exception is insufficient.
+      </p>
+      <section id="dependencies">
+        <h3 aria-level="2" role="heading" id="h3_dependencies"><span class="secno">2.1 </span>
+          Dependencies
+        </h3>This specification relies on several other underlying specifications.
+        <dl>
+          <dt>
+            HTML
+          </dt>
+          <dd>
+            Many fundamental concepts from HTML are used by this specification. [<cite><a class="bibref" href="#bib-HTML5">HTML5</a></cite>]
+          </dd>
+          <dt>
+            WebIDL
+          </dt>
+          <dd>
+            The IDL blocks in this specification use the semantics of the WebIDL specification. [<cite><a class="bibref" href="#bib-WEBIDL">WEBIDL</a></cite>]
+          </dd>
+        </dl>
+      </section>
+    </section>
+    <section id="terminology">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_terminology"><span class="secno">3. </span>
+        Terminology
+      </h2>
+      <p>
+        The construction "a <code>Foo</code> object", where <code>Foo</code> is actually an interface, is sometimes
+        used instead of the more accurate "an object implementing the interface <code>Foo</code>".
+      </p>
+      <p>
+        The term DOM is used to refer to the <abbr title="Application Programming Interface">API</abbr> set made available to scripts in Web applications, and does not
+        necessarily imply the existence of an actual <code>Document</code> object or of any other <code>Node</code>
+        objects as defined in the DOM Core specifications. [<cite><a class="bibref" href="#bib-DOM4">DOM4</a></cite>]
+      </p>
+      <p>
+        An IDL attribute is said to be <em>getting</em> when its value is being retrieved (e.g. by author script), and
+        is said to be <em>setting</em> when a new value is assigned to it.
+      </p>
+      <p>
+        A <dfn id="dfn-valid-service-type">valid service type</dfn> is any of the following:
+      </p>
+      <ul>
+        <li>a string that begins with <code>upnp:</code> or <code>zeroconf:</code> followed by one or more characters
+        in the ranges U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to U+002E, U+0030 to U+0039, U+0041 to U+005A,
+        U+005E to U+007E.
+        </li>
+        <li>a string that begins with <code>dial:</code> followed by an integer version.
+        </li>
+      </ul>
+      <p>
+        A <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> provided in the <code>type</code> attribute of the <a href="#dom-navigator-getnetworkservices"><code>getNetworkServices()</code></a> method will be matched against the
+        services currently contained in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> according to the algorithms
+        defined in this specification.
+      </p>
+      <p>
+        A <dfn id="dfn-user-agent-generated-callback-url">user-agent generated callback url</dfn> is a Local-network accessible <abbr title="Uniform Resource Locator">URL</abbr> endpoint that a <a href="#dfn-user-agent" class="internalDFN">user
+        agent</a> generates and maintains for receiving <abbr title="Hypertext Transfer Protocol">HTTP</abbr> NOTIFY requests from UPnP Event sources. It is only
+        required when the user agent implements UPnP Service Discovery as defined in this specification.
+      </p>
+      <p>
+        In this specification we use the following terms to describe the processes required for Local-networked
+        Services management:
+      </p>
+      <ul>
+        <li>A <dfn id="dfn-new-service">new service</dfn> is a Local-networked Service that has not previously been discovered or registered
+        in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>.
+        </li>
+        <li>An <dfn id="dfn-existing-service">existing service</dfn> is a Local-networked Service that has previously been discovered and is
+        registered in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>.
+        </li>
+        <li>A <dfn id="dfn-current-service">current service</dfn> is a Local-networked Service, represented by a <a href="#networkservice"><code>NetworkService</code></a> object, that is currently being shared with a web page via a
+        <a href="#networkservices"><code>NetworkServices</code></a> object registered in the <a href="#dfn-list-of-active-service-managers" class="internalDFN">list of active service
+        managers</a>.
+        </li>
+      </ul>
+    </section>
+    <section id="security-and-privacy-considerations">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_security-and-privacy-considerations"><span class="secno">4. </span>
+        Security and privacy considerations
+      </h2>
+      <p>
+        The <abbr title="Application Programming Interface">API</abbr> defined in this specification can be used to find and connect to devices and services within a user's
+        current network. This discloses information related to a user's network: devices available on their network and
+        the publicly-accessible services ("networked services") currently running and available on those devices. The
+        distribution of this information could potentially compromise the user's privacy. A conforming implementation
+        of this specification <em class="rfc2119" title="MUST">MUST</em> provide a mechanism that protects the user's privacy. This mechanism <em class="rfc2119" title="MUST">MUST</em> ensure
+        that no networked service information is retrievable without the user's express permission.
+      </p>
+      <section id="privacy-considerations-for-api-implementations">
+        <h3 aria-level="2" role="heading" id="h3_privacy-considerations-for-api-implementations"><span class="secno">4.1 </span>
+          Privacy considerations for <abbr title="Application Programming Interface">API</abbr> implementations
+        </h3>
+        <p>
+          A <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST NOT">MUST NOT</em> provide networked service information to web sites without the express
+          permission of the user. A user agent <em class="rfc2119" title="MUST">MUST</em> acquire permission through a user interface, unless they have
+          prearranged trust relationships with users, as described below. The user interface <em class="rfc2119" title="MUST">MUST</em> include the document
+          base <abbr title="Uniform Resource Locator">URL</abbr>. Those permissions that are acquired through the user interface and that are preserved beyond the
+          current browsing session (i.e. beyond the time when the browsing context is navigated to another <abbr title="Uniform Resource Locator">URL</abbr>) <em class="rfc2119" title="MUST">MUST</em> be
+          revocable and a user agent <em class="rfc2119" title="MUST">MUST</em> respect revoked permissions.
+        </p>
+        <p>
+          Obtaining the user's express permission to access one <abbr title="Application Programming Interface">API</abbr> method does not imply the user has granted
+          permission for the same web site to access any other methods that may be provided by this <abbr title="Application Programming Interface">API</abbr>, or to access
+          the same method with a different set of arguments, as part of the same permission context. If a user has
+          expressed permission for an implementation to, e.g. find a set of existing networked services, the
+          implementation <em class="rfc2119" title="MUST">MUST</em> seek the user's express permission if and when any subsequent functions are called on
+          this <abbr title="Application Programming Interface">API</abbr>.
+        </p>
+        <p>
+          A user agent <em class="rfc2119" title="MAY">MAY</em> have prearranged trust relationships that do not require such user interfaces. For example,
+          while a web browser will present a user interface when a web site performs a networked service lookup, a
+          different runtime may have a prearranged, delegated security relationship with the user and, as such, a
+          suitable alternative security and privacy mechanism with which to authorise the retrieval of networked
+          service information.
+        </p>
+      </section>
+      <section class="informative" id="additional-api-implementation-considerations">
+        <h3 aria-level="2" role="heading" id="h3_additional-api-implementation-considerations"><span class="secno">4.2 </span>
+          Additional <abbr title="Application Programming Interface">API</abbr> implementation considerations
+        </h3><p><em>This section is non-normative.</em></p>
+        <p>
+          Further to the requirements listed in the previous section, implementors of the Network Service Discovery <abbr title="Application Programming Interface">API</abbr>
+          are also advised to consider the following aspects that can negatively affect the privacy of their users: in
+          certain cases, users can inadvertently grant permission to the user agent to disclose networked services to
+          Web sites. In other cases, the content hosted at a certain <abbr title="Uniform Resource Locator">URL</abbr> changes in such a way that previously granted
+          networked service permissions no longer apply as far as the user is concerned. Or the users might simply
+          change their minds.
+        </p>
+        <p>
+          Predicting or preventing these situations is inherently difficult. Mitigation and in-depth defensive measures
+          are an implementation responsibility and not prescribed by this specification. However, in designing these
+          measures, implementers are advised to enable user awareness of networked service sharing, and to provide easy
+          access to interfaces that enable revocation of permissions that web applications have for accessing networked
+          services via this <abbr title="Application Programming Interface">API</abbr>.
+        </p>
+      </section>
+    </section>
+    <section id="requesting-networked-services">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_requesting-networked-services"><span class="secno">5. </span>
+        Requesting networked services
+      </h2>
+      <pre class="widl">[Supplemental, NoInterfaceObject]
+interface <dfn id="navigatornetworkservice">NavigatorNetworkService</dfn> {
+  <a class="externalDFN" href="http://dom.spec.whatwg.org/#promise">Promise</a> <a href="#dom-navigator-getnetworkservices">getNetworkServices</a>( in any type );
+};
+
+<a class="externalDFN" href="http://www.whatwg.org/specs/web-apps/current-work/complete/timers.html#navigator">Navigator</a> implements <a href="#navigatornetworkservice">NavigatorNetworkService</a>;
+</pre>
+      <section id="methods">
+        <h3 aria-level="2" role="heading" id="h3_methods"><span class="secno">5.1 </span>
+          Methods
+        </h3>
+        <dl class="domintro">
+          <dt>
+            <var title="">promise</var> = <var title="">window</var> . <code title="dom-navigator"><a href="http://www.whatwg.org/specs/web-apps/current-work/complete/timers.html#navigator">navigator</a></code> .
+            <code title="dom-navigator-getNetworkServices"><a href="#dom-navigator-getnetworkservices">getNetworkServices</a></code> ( <var title="">type</var> )
+          </dt>
+          <dd>
+            <p>
+              Immediately returns a new <a href="http://dom.spec.whatwg.org/#promise" class="externalDFN">Promise</a> object and then the user is prompted to select discovered network
+                 services that have advertised support for the requested service type(s).
+            </p>
+            <p>
+              The <var title="">type</var> argument contains one or more <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> tokens that the web
+              page would like to interact with.
+            </p>
+            <p>
+              If the user accepts, the <var title="">promise</var> object is <a class="externalDFN" href="http://dom.spec.whatwg.org/#concept-resolver-resolve">resolved</a>, with a <a href="#networkservices"><code>NetworkServices</code></a> object as its argument.
+            </p>
+            <p>
+              If the user declines, or an error occurs, the <var title="">promise</var> object is <a class="externalDFN" href="http://dom.spec.whatwg.org/#concept-resolver-reject">rejected</a>.
+            </p>
+          </dd>
+        </dl>
+        <div>
+          <p>
+            When the <dfn id="dom-navigator-getnetworkservices" title="dom-navigator-getnetworkservices"><code>getNetworkServices(type)</code></dfn> method is called,
+               the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> run the following steps:
+          </p>
+          <ol class="rule">
+            <li>Let <var>Network Service Promise</var> be a new <a href="http://dom.spec.whatwg.org/#promise" class="externalDFN"><code>Promise</code></a> object.
+            </li>
+            <li>Let <var>Network Service Promise's Resolver</var> be the default <a href="http://dom.spec.whatwg.org/#concept-resolver" class="externalDFN">resolver</a> of <var>Network Service Promise</var>.
+            </li>
+            <li>Return <var>Network Service Promise</var>, and run the remaining steps asynchronously.
+            </li>
+            <li>Let <var>requested control types</var> be initially set to an empty array.
+            </li>
+            <li>If <var>type</var> is an array consisting of one or more <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> tokens, then let
+            <var>requested control types</var> by the value of <var>type</var>, removing any non-<a href="#dfn-valid-service-type" class="internalDFN">valid service
+            type</a> tokens from the resulting array.
+            </li>
+            <li>If <var>type</var> is a string consisting of one <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> token, then let
+            <var>requested control types</var> be an array containing one item with a value of <var>type</var>.
+            </li>
+            <li>If <var>requested control types</var> is an array that contains at least one or more <a title="valid service type" href="#dfn-valid-service-type" class="internalDFN">valid service type</a> tokens then continue to the step labeled <em>process</em>
+            below. Otherwise, reject <var>Network Service Promise</var> by running the <a href="http://dom.spec.whatwg.org/#concept-resolver-reject" class="externalDFN">resolver reject algorithm</a> against the <var>Network Service Promise's
+                  Resolver</var>, passing in a newly constructed <a href="http://dom.spec.whatwg.org/#domerror" class="externalDFN"><code>DOMError</code></a> object whose <code>name</code> attribute has the string
+                  value "UnknownTypePrefixError" (<a href="#dom-domerror-extensions-unknown_type_prefix"><code>UNKNOWN_TYPE_PREFIX_ERR</code></a>) and whose
+                  <code>message</code> attribute has a helpful implementation-dependent message that explains this
+                  error, abort any remaining steps and return.
+            </li>
+            <li>
+              <em>Process</em>: Let <var>services found</var> be an empty array.
+            </li>
+            <li>For each <var>available service</var> in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> run the following
+            steps:
+              <ol class="rule">
+                <li>For each <var>requested control type</var> in <var>requested control types</var>: If <var>available
+                service</var>'s <code>type</code> attribute equals the <var>requested control type</var> then let <var>
+                  matched service</var> equal the value of <var>available service</var> and continue at the step
+                  labeled <var>attach</var> below.
+                </li>
+                <li>Continue at the next <var>available service</var>.
+                </li>
+                <li>
+                  <em>Attach</em>: If <var>matched service</var> is not empty then run the following steps:
+                  <ol class="rule">
+                    <li>Let <var>new service object</var> be a new <a href="#networkservice"><code>NetworkService</code></a> object, mapping the parameters of <var>matched
+                    service</var> to this new object where possible.
+                    </li>
+                    <li>Append <var>new service object</var> to the <var>services found</var> array.
+                    </li>
+                  </ol>
+                </li>
+              </ol>
+            </li>
+            <li>Optionally, e.g. based on a previously-established user preference, for security reasons, or due to
+            platform limitations, the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MAY">MAY</em> reject <var>Network Service Promise</var> by running the
+            <a href="http://dom.spec.whatwg.org/#concept-resolver-reject" class="externalDFN">resolver reject algorithm</a> against the <var>Network Service Promise's
+                  Resolver</var>, passing in a newly constructed <a href="http://dom.spec.whatwg.org/#domerror" class="externalDFN"><code>DOMError</code></a> object whose <code>name</code> attribute has the string
+                  value "PermissionDeniedError" (<a href="#dom-domerror-extensions-permission_denied"><code>PERMISSION_DENIED_ERR</code></a>) and whose
+                  <code>message</code> attribute has a helpful implementation-dependent message that explains this
+                  error, abort any remaining steps and return.
+            </li>
+            <li>The user agent <em class="rfc2119" title="MUST NOT">MUST NOT</em> provide the entry script's origin with a <a href="#networkservices"><code>NetworkServices</code></a> object without prior permission given by the user.
+              <p>
+                If <var>services found</var> is not an empty array then the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MAY">MAY</em> choose to prompt the
+                user in a user-agent-specific manner for permission to provide the <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/browsers.html#entry-script" class="externalDFN">entry script</a>'s <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/origin-0.html#origin" class="externalDFN">origin</a> with a <a href="#networkservices"><code>NetworkServices</code></a>
+                   object representing the <a href="#dfn-user-authorized" class="internalDFN">user-authorized</a> subset of <var>services found</var>.
+              </p>
+              <p>
+                Alternatively, the user agent <em class="rfc2119" title="MAY">MAY</em> wish to skip this user opt-in step and choose to fulfill <var>Network
+                Service Promise</var> immediately based on a previously-established user preference, for security
+                reasons, or due to platform limitations. In such an implementation, if <var>Network Service
+                Promise</var> is to be fulfilled as a result of a previously-established user preference then the
+                <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> continue at the next step of this algorithm.
+              </p>
+              <p>
+                If permission has been granted by the user to access one or more networked services then the <a href="#dfn-user-agent" class="internalDFN">user
+                agent</a> <em class="rfc2119" title="SHOULD">SHOULD</em> include an "ongoing local-network communication" indicator.
+              </p>
+              <p>
+                If permission has been denied by the user, <a href="#dfn-user-agent" class="internalDFN">user agent</a> or platform, then the <a href="#dfn-user-agent" class="internalDFN">user agent</a>
+                <em class="rfc2119" title="MUST">MUST</em> reject <var>Network Service Promise</var> by running the <a href="http://dom.spec.whatwg.org/#concept-resolver-reject" class="externalDFN">resolver reject algorithm</a> against the <var>Network Service Promise's
+                   Resolver</var>, passing in a newly constructed <a href="http://dom.spec.whatwg.org/#domerror" class="externalDFN"><code>DOMError</code></a> object whose <code>name</code> attribute has the
+                   string value "PermissionDeniedError" (<a href="#dom-domerror-extensions-permission_denied"><code>PERMISSION_DENIED_ERR</code></a>) and whose
+                   <code>message</code> attribute has a helpful implementation-dependent message that explains this
+                   error, abort any remaining steps and return.
+              </p>
+              <p>
+                If the user never responds or no previously-established user preference has been met, this algorithm
+                stalls on this step.
+              </p>
+            </li>
+            <li>Let <var>services</var> be an empty array.
+            </li>
+            <li>If <var>services found</var> is not an empty array then set <var>services</var> to be an array of one
+            or more <a href="#networkservice"><code>NetworkService</code></a> objects for which the user granted
+            permission above - known as the current objects <dfn id="dfn-user-authorized">user-authorized</dfn> services.
+            </li>
+            <li>Remove all previously whitelisted urls from the <a href="#dfn-entry-script-origin-s-url-whitelist" class="internalDFN">entry script origin's <abbr title="Uniform Resource Locator">URL</abbr> whitelist</a> granted in
+            the current <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/browsers.html#entry-script" class="externalDFN">entry script</a>'s <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/origin-0.html#origin" class="externalDFN">origin</a>.
+            </li>
+            <li>For each Object <var>service</var> in <var>services</var>, if any, run the following sub-steps:
+              <ol class="rule">
+                <li>Add the <var>service</var>'s <code>url</code> parameter to the <a href="#dfn-entry-script-origin-s-url-whitelist" class="internalDFN">entry script origin's
+                  <abbr title="Uniform Resource Locator">URL</abbr> whitelist</a>.
+                </li>
+                <li>If <var>service</var>'s <code>type</code> parameter begins with the DOMString "<code>upnp:</code>"
+                and the <var>service</var>'s <code>eventsUrl</code> parameter is not empty then <a href="#dfn-setup-a-upnp-events-subscription" class="internalDFN">setup a UPnP Events
+                Subscription</a> for <var>service</var>.
+                </li>
+              </ol>
+            </li>
+            <li>Let <var>services manager</var> be a new <a href="#networkservices"><code>NetworkServices</code></a>
+            object.
+            </li>
+            <li>Store <var>requested control types</var> against <var>services manager</var> as an internal variable.
+            </li>
+            <li>Set <var>services manager</var>'s <a href="#dom-networkservices-servicesavailable"><code>servicesAvailable</code></a> attribute to the number of
+            items currently found in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> whose <code>type</code> property
+            matches any of the tokens requested in <var>requested control types</var>.
+            </li>
+            <li>Add <var>services</var>, if any, to the <var>services manager</var> object as its collection of
+            <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a>. If <var>services</var> is an empty array then the <var>services manager</var>
+            does not have any <var>indexed properties</var>.
+            </li>
+            <li>Set <var>services manager</var>'s <a href="#dom-networkservices-length"><code>length</code></a>
+            attribute to the number of items in <var>services</var>.
+            </li>
+            <li>Add <var>services manager</var> to the <a href="#dfn-list-of-active-service-managers" class="internalDFN">list of active service managers</a>.
+            </li>
+            <li>The <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> fulfill <var>Network Service Promise</var> by running the <a href="http://dom.spec.whatwg.org/#concept-resolver-fulfill" class="externalDFN">resolver fulfill algorithm</a> against the <var>Network Service Promise's
+                  Resolver</var>, passing in <var>services manager</var> as its argument.
+            </li>
+          </ol>
+          <p>
+            The <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#task-source" class="externalDFN">task source</a> for these <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#concept-task" class="externalDFN">tasks</a> is the <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#user-interaction-task-source" class="externalDFN">user interaction task source</a>.
+          </p>
+          <p>
+            When a <a href="#networkservice"><code>NetworkService</code></a> object is provided to a Web page, the
+            <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> add its <a href="#dom-networkservice-url"><code>url</code></a> to the <dfn id="dfn-entry-script-origin-s-url-whitelist">entry
+            script origin's <abbr title="Uniform Resource Locator">URL</abbr> whitelist</dfn>. This list enables the Web page to override and initiate cross-site
+            resource requests towards these URLs, and any sub-resources of these URLs, within the current <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/browsers.html#entry-script" class="externalDFN">entry script</a>'s <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/origin-0.html#origin" class="externalDFN">origin</a> via various existing mechanisms (e.g. Web Sockets, Server-Sent Events,
+               Web Messaging, XMLHttpRequest).
+          </p>
+          <p>
+            If the user navigates away from the <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/browsers.html#entry-script" class="externalDFN">entry script</a>'s <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/origin-0.html#origin" class="externalDFN">origin</a> or permission to access a given networked service is revoked at any time
+               by the platform or user then the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="ct"><em class="rfc2119" title="MUST">MUST</em></em> remove its previously
+               whitelisted urls from the <a href="#dfn-entry-script-origin-s-url-whitelist" class="internalDFN">entry script origin's <abbr title="Uniform Resource Locator">URL</abbr> whitelist</a>.
+          </p>
+          <p>
+            There is no implied persistence to networked service sharing provided to a web page. It <em class="rfc2119" title="MUST NOT">MUST NOT</em> be
+            possible to access a previously white-listed networked service without user authorization in all of the
+            following cases:
+          </p>
+          <ul>
+            <li>If the current script is reloaded at any point in the same or different window.
+            </li>
+            <li>if the current script reinvokes the <a href="#dom-navigator-getnetworkservices"><code>getNetworkServices()</code></a> method at any point in its
+            execution.
+            </li>
+            <li>If the user navigates forward or back in their history to reload the current page.
+            </li>
+            <li>If a script is running in a different origin.
+            </li>
+          </ul>
+        </div>
+      </section>
+      <section id="error-handling">
+        <h3 aria-level="2" role="heading" id="h3_error-handling"><span class="secno">5.2 </span>
+          Error Handling
+        </h3>
+        <dl class="domintro">
+          <dt>
+            <var title="">error</var> . <code title="dom-NavigatorNetworkServiceError-name"><a href="#dom-domerror-extensions-name">name</a></code>
+          </dt>
+          <dd>
+            <p>
+              Returns the current error's error name. At the current time, this will be "PermissionDeniedError" or
+              "UnknownTypePrefixError", for which the corresponding error constants <a href="#dom-domerror-extensions-permission_denied"><code>PERMISSION_DENIED_ERR</code></a> and <a href="#dom-domerror-extensions-unknown_type_prefix"><code>UNKNOWN_TYPE_PREFIX_ERR</code></a> are defined.
+            </p>
+          </dd>
+        </dl>
+        <p>
+          The <dfn id="dom-domerror-extensions-name" title="dom-domerror-extensions-name"><code>name</code></dfn> attribute of a <a href="http://dom.spec.whatwg.org/#domerror" class="externalDFN"><code>DOMError</code></a> object returned from this <abbr title="Application Programming Interface">API</abbr> <em class="ct"><em class="rfc2119" title="MUST">MUST</em></em>
+             return the name for the error, which will be one of the following:
+        </p>
+        <dl>
+          <dt>
+            <dfn id="dom-domerror-extensions-permission_denied" title="dom-domerror-extensions-permission_denied"><code>PERMISSION_DENIED_ERR</code></dfn> (DOMString
+                value "PermissionDeniedError")
+          </dt>
+          <dd>
+            The user or user agent denied the page permission to access any services.
+          </dd>
+          <dt>
+            <dfn id="dom-domerror-extensions-unknown_type_prefix" title="dom-domerror-extensions-unknown_type_prefix"><code>UNKNOWN_TYPE_PREFIX_ERR</code></dfn>
+                (DOMString value "UnknownTypePrefixError")
+          </dt>
+          <dd>
+            No <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> tokens were provided in the method invocation.
+          </dd>
+        </dl>
+      </section>
+    </section>
+    <section id="obtaining-networked-services">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_obtaining-networked-services"><span class="secno">6. </span>
+        Obtaining networked services
+      </h2>
+      <p>
+        The <a href="#networkservices"><code>NetworkServices</code></a> interface represents a collection of zero or
+        more <dfn id="dfn-indexed-properties">indexed properties</dfn> that are each a <a href="#dfn-user-authorized" class="internalDFN">user-authorized</a> <a href="#networkservice"><code>NetworkService</code></a> object.
+      </p>
+      <p>
+        A <a href="#networkservices"><code>NetworkServices</code></a> object is the <a href="http://dom.spec.whatwg.org/#concept-promise-result" class="externalDFN">promise result</a> from a call to <a href="#dom-navigator-getnetworkservices"><code>getNetworkServices()</code></a>.
+      </p>
+      <pre class="widl">[NoInterfaceObject]
+interface <dfn id="networkservices">NetworkServices</dfn> {
+  readonly attribute unsigned long    <a href="#dom-networkservices-length">length</a>;
+  getter <a href="#networkservice">NetworkService</a> (unsigned long index);
+  <a href="#networkservice">NetworkService</a>? <a href="#dom-networkservices-getservicebyid">getServiceById</a>(DOMString id);
+
+  readonly attribute unsigned long    <a href="#dom-networkservices-servicesavailable">servicesAvailable</a>;
+
+  // event handler attributes
+           attribute <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#eventhandler" class="externalDFN">EventHandler</a>     <a href="#dom-networkservices-onservicefound">onservicefound</a>;
+           attribute <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#eventhandler" class="externalDFN">EventHandler</a>     <a href="#dom-networkservices-onservicelost">onservicelost</a>;
+
+};
+
+<a href="#networkservices">NetworkServices</a> implements <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-eventtarget" class="externalDFN">EventTarget</a>;
+</pre>
+      <section id="attributes">
+        <h3 aria-level="2" role="heading" id="h3_attributes"><span class="secno">6.1 </span>
+          Attributes
+        </h3>
+        <dl class="domintro">
+          <dt>
+            <code title="dom-networkservices-length"><a href="#dom-networkservices-length">length</a></code>
+          </dt>
+          <dd>
+            <p>
+              Returns the current number of <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a> in the current object's collection.
+            </p>
+          </dd>
+          <dt>
+            <code title="dom-networkservices-servicesavailable"><a href="#dom-networkservices-servicesavailable">servicesAvailable</a></code>
+          </dt>
+          <dd>
+            <p>
+              Returns the current number of items matching one of the app-requested <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> tokens in
+              the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>.
+            </p>
+          </dd>
+        </dl>
+        <div>
+          <p>
+            The <dfn id="dom-networkservices-length"><code>length</code></dfn> attribute <em class="rfc2119" title="MUST">MUST</em> return the number of
+            <a href="#networkservice"><code>NetworkService</code></a> objects represented by the collection.
+          </p>
+          <p>
+            The <dfn id="dom-networkservices-servicesavailable"><code>servicesAvailable</code></dfn> attribute <em class="rfc2119" title="MUST">MUST</em>
+            return the number of services in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> whose <code>type</code>
+            attribute matches any of the <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> tokens that were initially used to create the
+            current <a href="#networkservices"><code>NetworkServices</code></a> object.
+          </p>
+        </div>
+      </section>
+      <section id="methods-1">
+        <h3 aria-level="2" role="heading" id="h3_methods-1"><span class="secno">6.2 </span>
+          Methods
+        </h3>
+        <dl class="domintro">
+          <dt>
+            <code title="networkservices-getter"><a href="#networkservices">services</a></code> [ <var title="">index</var> ]
+          </dt>
+          <dd>
+            <p>
+              Returns the specified <a href="#networkservice"><code>NetworkService</code></a> object.
+            </p>
+          </dd>
+          <dt>
+            <code title="networkservices-getter"><a href="#networkservices">services</a></code> . <code title="dom-networkservices-getservicebyid"><a href="#dom-networkservices-getservicebyid">getServiceById</a></code> ( <var title="">id</var> )
+          </dt>
+          <dd>
+            <p>
+              Returns the <a href="#networkservice"><code>NetworkService</code></a> object with the given identifier,
+              or null if no service has that identifier.
+            </p>
+          </dd>
+        </dl>
+        <p>
+          A <a href="#networkservices"><code>NetworkServices</code></a> object represents the current collection of
+          zero or more <a href="#networkservice"><code>NetworkService</code></a> objects - its <a href="#dfn-indexed-properties-1" class="internalDFN">indexed
+          properties</a>. The <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a> of a <a href="#networkservices"><code>NetworkServices</code></a> object are <span>immutable</span> meaning that <a href="#dfn-indexed-properties-1" class="internalDFN">indexed
+          properties</a> cannot be added and <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a> cannot be removed for the lifetime of a <a href="#networkservices"><code>NetworkServices</code></a> object.
+        </p>
+        <p>
+          The <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#supported-property-indices" class="externalDFN">supported property indices</a> of <a href="#networkservices"><code>NetworkServices</code></a> objects at any instant are the numbers from zero to
+             the number of the <a href="#networkservice"><code>NetworkService</code></a> objects in the collection
+             minus one.
+        </p>
+        <div class="note"><div class="note-title" aria-level="3" role="heading" id="h_note_1"><span>Note</span></div><p class="">
+          Each service in a <a href="#networkservices"><code>NetworkServices</code></a> object thus has an index; the
+          first has the index 0, and each subsequent service is numbered one higher than the previous one.
+        </p></div>
+        <p>
+          To <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#determine-the-value-of-an-indexed-property" class="externalDFN">determine the value of an indexed property</a> for a given index <var>index</var> in a
+             <a href="#networkservices"><code>NetworkServices</code></a> object the user agent <em class="rfc2119" title="MUST">MUST</em> return the <a href="#networkservice"><code>NetworkService</code></a> object that represents the <var>index</var>th item in
+             the collection.
+        </p>
+        <p>
+          The <dfn id="dom-networkservices-getservicebyid"><code>getServiceById(id)</code></dfn> method <em class="ct"><em class="rfc2119" title="MUST">MUST</em></em> return the first <a href="#networkservice"><code>NetworkService</code></a> object in the
+          collection whose <a href="#dom-networkservice-id"><code>id</code></a> attribute is equal to the value of the
+          <var>id</var> argument provided. When no <a href="#networkservice"><code>NetworkService</code></a> objects
+          match the given argument, the method <em class="rfc2119" title="MUST">MUST</em> return null.
+        </p>
+      </section>
+      <section id="events">
+        <h3 aria-level="2" role="heading" id="h3_events"><span class="secno">6.3 </span>
+          Events
+        </h3>
+        <p>
+          The following are the event handlers (and their corresponding event handler event types) that <em class="ct"><em class="rfc2119" title="MUST">MUST</em></em> be supported, as IDL attributes, by all objects implementing the <a href="#networkservices"><code>NetworkServices</code></a> interface:
+        </p>
+        <table border="1">
+          <thead>
+            <tr>
+              <th>
+                <span title="event handlers">Event handler</span>
+              </th>
+              <th>
+                <span>Event handler event type</span>
+              </th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td>
+                <dfn id="dom-networkservices-onservicefound" title="dom-NetworkServices-onservicefound"><code>onservicefound</code></dfn>
+              </td>
+              <td>
+                <a href="#event-servicefound"><code>servicefound</code></a>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <dfn id="dom-networkservices-onservicelost" title="dom-NetworkServices-onservicelost"><code>onservicelost</code></dfn>
+              </td>
+              <td>
+                <a href="#event-servicelost"><code>servicelost</code></a>
+              </td>
+            </tr>
+          </tbody>
+        </table>
+      </section>
+    </section>
+    <section id="communicating-with-a-networked-service">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_communicating-with-a-networked-service"><span class="secno">7. </span>
+        Communicating with a networked service
+      </h2>
+      <p>
+        The <a href="#networkservice"><code>NetworkService</code></a> interface is used to provide a set of connection
+        information for an <abbr title="Hypertext Transfer Protocol">HTTP</abbr> service endpoint and if available, service events, running on a networked device.
+      </p>
+      <pre class="widl">[NoInterfaceObject]
+interface <dfn id="networkservice">NetworkService</dfn> {
+  readonly attribute DOMString        <a href="#dom-networkservice-id">id</a>;
+  readonly attribute DOMString        <a href="#dom-networkservice-name">name</a>;
+  readonly attribute DOMString        <a href="#dom-networkservice-type">type</a>;
+  readonly attribute DOMString        <a href="#dom-networkservice-url">url</a>;
+  readonly attribute DOMString        <a href="#dom-networkservice-config">config</a>;
+
+  readonly attribute boolean          <a href="#dom-networkservice-online">online</a>;
+
+  // event handler attributes
+           attribute <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#eventhandler" class="externalDFN">EventHandler</a>     <a href="#dom-networkservice-onavailable">onavailable</a>;
+           attribute <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#eventhandler" class="externalDFN">EventHandler</a>     <a href="#dom-networkservice-onunavailable">onunavailable</a>;
+
+           attribute <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#eventhandler" class="externalDFN">EventHandler</a>     <a href="#dom-networkservice-onnotify">onnotify</a>;
+};
+
+<a href="#networkservice">NetworkService</a> implements <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-eventtarget" class="externalDFN">EventTarget</a>;
+</pre>
+      <section id="attributes-1">
+        <h3 aria-level="2" role="heading" id="h3_attributes-1"><span class="secno">7.1 </span>
+          Attributes
+        </h3>
+        <dl class="domintro">
+          <dt>
+            <var title="">service</var> . <code title="dom-networkservice-id"><a href="#dom-networkservice-id">id</a></code>
+          </dt>
+          <dd>
+            <p>
+              A unique identifier for the given user-selected service instance.
+            </p>
+          </dd>
+          <dt>
+            <var title="">service</var> . <code title="dom-networkservice-name"><a href="#dom-networkservice-name">name</a></code>
+          </dt>
+          <dd>
+            <p>
+              The name of the user-selected service.
+            </p>
+          </dd>
+          <dt>
+            <var title="">service</var> . <code title="dom-networkservice-type"><a href="#dom-networkservice-type">type</a></code>
+          </dt>
+          <dd>
+            <p>
+              The <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> token value of the user-selected service.
+            </p>
+          </dd>
+          <dt>
+            <var title="">service</var> . <code title="dom-networkservice-url"><a href="#dom-networkservice-url">url</a></code>
+          </dt>
+          <dd>
+            <p>
+              The control <abbr title="Uniform Resource Locator">URL</abbr> endpoint (including any required port information) of the user-selected control service
+              that has been added to the <a href="#dfn-entry-script-origin-s-url-whitelist" class="internalDFN">entry script origin's <abbr title="Uniform Resource Locator">URL</abbr> whitelist</a>.
+            </p>
+          </dd>
+          <dt>
+            <var title="">service</var> . <code title="dom-networkservice-config"><a href="#dom-networkservice-config">config</a></code>
+          </dt>
+          <dd>
+            <p>
+              The configuration information associated with the service depending on the requested service type.
+            </p>
+          </dd>
+        </dl>
+        <p>
+          The <dfn id="dom-networkservice-id"><code>id</code></dfn> attribute is a unique identifier for the service.
+          The same service provided at different times or on different objects <em class="rfc2119" title="MUST">MUST</em> have the same <a href="#dom-networkservice-id"><code>id</code></a> value.
+        </p>
+        <p>
+          The <dfn id="dom-networkservice-name"><code>name</code></dfn> attribute represents a human-readable title for
+          the service.
+        </p>
+        <p>
+          The <dfn id="dom-networkservice-type"><code>type</code></dfn> attribute reflects the value of the <a href="#dfn-valid-service-type" class="internalDFN">valid
+          service type</a> of the service.
+        </p>
+        <p>
+          The <dfn id="dom-networkservice-url"><code>url</code></dfn> attribute is an <a href="http://www.w3.org/TR/html5/urls.html#absolute-url" class="externalDFN">absolute <abbr title="Uniform Resource Locator">URL</abbr></a> pointing to the root <abbr title="Hypertext Transfer Protocol">HTTP</abbr> endpoint for the service that has been
+             added to the <a href="#dfn-entry-script-origin-s-url-whitelist" class="internalDFN">entry script origin's <abbr title="Uniform Resource Locator">URL</abbr> whitelist</a>. Web pages can subsequently use this value for
+             implicit cross-document messaging via various existing mechanisms (e.g. Web Sockets, Server-Sent Events,
+             Web Messaging, XMLHttpRequest).
+        </p>
+        <p>
+          The <dfn id="dom-networkservice-config"><code>config</code></dfn> attribute provides the raw configuration
+          information extracted from the given network service.
+        </p>
+      </section>
+      <section id="states">
+        <h3 aria-level="2" role="heading" id="h3_states"><span class="secno">7.2 </span>
+          States
+        </h3>
+        <dl class="domintro">
+          <dt>
+            <var title="">service</var> . <code title="dom-networkservice-online"><a href="#dom-networkservice-online">online</a></code>
+          </dt>
+          <dd>
+            <p>
+              Returns <code>true</code> if the service is reporting that it is accessible on the local network or
+              <code>false</code> if the service is no longer accessible (temporarily or permanently) on the local
+              network.
+            </p>
+          </dd>
+        </dl>
+        <p>
+          The <dfn id="dom-networkservice-online"><code>online</code></dfn> attribute indicates whether the service is
+          either <var>online</var>, and therefore accessible on the local network, in which case this attribute will
+          return <code>true</code> or, <var>offline</var>, and therefore not accessible on the local network, either
+          temporarily or permanently, in which case this attribute will return <code>false</code>. This attribute <em class="rfc2119" title="MUST">MUST</em>
+          default to <code>true</code>.
+        </p>
+      </section>
+      <section id="events-1">
+        <h3 aria-level="2" role="heading" id="h3_events-1"><span class="secno">7.3 </span>
+          Events
+        </h3>
+        <p>
+          The following are the event handlers (and their corresponding event handler event types) that <em class="ct"><em class="rfc2119" title="MUST">MUST</em></em> be supported, as IDL attributes, by all objects implementing the <a href="#networkservice"><code>NetworkService</code></a> interface:
+        </p>
+        <table border="1">
+          <thead>
+            <tr>
+              <th>
+                <span title="event handlers">Event handler</span>
+              </th>
+              <th>
+                <span>Event handler event type</span>
+              </th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td>
+                <dfn id="dom-networkservice-onnotify" title="dom-NetworkService-onnotify"><code>onnotify</code></dfn>
+              </td>
+              <td>
+                <a href="#event-notify"><code>notify</code></a>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <dfn id="dom-networkservice-onavailable" title="dom-NetworkService-onavailable"><code>onavailable</code></dfn>
+              </td>
+              <td>
+                <a href="#event-available"><code>available</code></a>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <dfn id="dom-networkservice-onunavailable" title="dom-NetworkService-onunavailable"><code>onunavailable</code></dfn>
+              </td>
+              <td>
+                <a href="#event-unavailable"><code>unavailable</code></a>
+              </td>
+            </tr>
+          </tbody>
+        </table>
+      </section>
+    </section>
+    <section id="service-discovery">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_service-discovery"><span class="secno">8. </span>
+        Service Discovery
+      </h2>
+      <p>
+        A <a href="#dfn-user-agent" class="internalDFN">user agent</a> conforming to this specification <em class="rfc2119" title="MAY">MAY</em> implement <abbr title="Simple Service Discovery Protocol">SSDP</abbr> [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>], Zeroconf [<cite><a class="bibref" href="#bib-DNS-SD">DNS-SD</a></cite>] + [<cite><a class="bibref" href="#bib-MDNS">MDNS</a></cite>] and/or
+        <abbr title="Discovery and Launch Protocol">DIAL</abbr> [<a href="https://sites.google.com/a/dial-multiscreen.org/dial/dial-protocol-specification"><abbr title="Discovery and Launch Protocol">DIAL</abbr></a>] <dfn id="dfn-service-discovery-mechanisms">service
+        discovery mechanisms</dfn> - the requirements detailed in this section of the specification - to enable Web
+        pages to request and connect with <abbr title="Hypertext Transfer Protocol">HTTP</abbr> services running on networked devices, discovered via any of these
+        mechanisms, through this <abbr title="Application Programming Interface">API</abbr>. When a <a href="#dfn-user-agent" class="internalDFN">user agent</a> implements any of these <a href="#dfn-service-discovery-mechanisms" class="internalDFN">service discovery
+        mechanisms</a>, then it <em class="rfc2119" title="MUST">MUST</em> conform to the corresponding algorithms provided in this section of the
+        specification.
+      </p>
+      <p>
+        This section presents how the results of these <a href="#dfn-service-discovery-mechanisms" class="internalDFN">service discovery mechanisms</a> will be matched to requested
+        service types, how the user agent stores available and active services and how their properties are applied to
+        any resulting <a href="#networkservice"><code>NetworkService</code></a> objects.
+      </p>
+      <p>
+        It is expected that user agents will perform these <a href="#dfn-service-discovery-mechanisms" class="internalDFN">service discovery mechanisms</a> asynchronously and
+        periodically update the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> as required. The timing of any <a href="#dfn-service-discovery-mechanisms" class="internalDFN">service
+        discovery mechanisms</a> is an implementation detail left to the discretion of the implementer (e.g. by
+        continuously monitoring the network as a background process or on invocation of this <abbr title="Application Programming Interface">API</abbr> from a Web page).
+      </p>
+      <p>
+        The <dfn id="dfn-list-of-available-service-records">list of available service records</dfn> is a single dynamic internal lookup table within user agents
+        that is used to track all the services that have been discovered and are available in the current network at
+        the current time. At any point during the running of any of the <a href="#dfn-service-discovery-mechanisms" class="internalDFN">service discovery mechanisms</a> then
+        existing entries within this table can be updated, entries can be added and entries can be removed as the
+        status of networked services changes according to the rules defined in this specification.
+      </p>
+      <p>
+        The <dfn id="dfn-list-of-active-service-managers">list of active service managers</dfn> is an internal list within user agents that is used to track all
+        <a href="#networkservices"><code>NetworkServices</code></a> objects currently being shared with any web pages
+        at the current time within the user agent. Each <a href="#networkservices"><code>NetworkServices</code></a>
+        object in the <a href="#dfn-list-of-active-service-managers" class="internalDFN">list of active service managers</a> represents a collection of zero or more <a href="#networkservice"><code>NetworkService</code></a> objects - known as its <dfn id="dfn-indexed-properties-1">indexed properties</dfn>.
+        <a href="#networkservice"><code>NetworkService</code></a> objects are attached as the <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a>
+        of a <a href="#networkservices"><code>NetworkServices</code></a> object as part of the <a href="#dom-navigator-getnetworkservices"><code>getNetworkServices()</code></a> algorithm.
+      </p>
+      <p>
+        The rule for <dfn id="dfn-adding-an-available-service">adding an available service</dfn> is the process of adding a <a href="#dfn-new-service" class="internalDFN">new service</a> or updating
+        an <a href="#dfn-existing-service" class="internalDFN">existing service</a> that is generally available on the user's current network in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of
+        available service records</a>. This rule takes one argument, <var>network service record</var>, and consists of
+        running the following steps:
+      </p>
+      <ol class="rule">
+        <li>For each <var>existing service record</var> in the current <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>, run
+        the following sub-steps:
+          <ol class="rule">
+            <li>If the <var>existing service record</var>'s <code>id</code> property does not equal <var>network
+            service record</var>'s <code>id</code> property then abort any remaining sub-steps and continue at the next
+            available <var>existing service record</var>.
+            </li>
+            <li>Replace the value of <var>existing service record</var> in the current <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service
+            records</a> with the value of <var>network service record</var>, aborting any remaining steps in this
+            algorithm and return.
+            </li>
+          </ol>
+        </li>
+        <li>Add <var>network service record</var> to the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> as a new item.
+        </li>
+        <li>For each <var>service manager</var> in the <a href="#dfn-list-of-active-service-managers" class="internalDFN">list of active service managers</a> run the following steps:
+          <ol class="rule">
+            <li>For each <var>active service</var> in <var>service manager</var> run the following steps:
+              <ol class="rule">
+                <li>If the <var>network service record</var>'s <code>id</code> property equals the <var>active
+                service</var>'s <code>id</code> attribute and <var>active service</var>'s <code>online</code> attribute
+                is currently set to <code>false</code> then set <var>active service</var>'s <a href="#dom-networkservice-online"><code>online</code></a> attribute to <code>true</code> and then <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#queue-a-task" class="externalDFN">queue a task</a> to dispatch a newly created event with the name <a href="#event-available"><code>available</code></a> that uses the <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a> interface, which does not bubble, is not cancellable,
+                      and has no default action, at the current <var>active service</var> object.
+                </li>
+              </ol>
+            </li>
+            <li>Let <var>'service type in current service manager' flag</var> be <code>false</code>.
+            </li>
+            <li>For each <var>requested control type</var> of the <var>requested control types</var> in <var>service
+            manager</var> run the following steps:
+              <ol class="rule">
+                <li>If <var>network service record</var>'s <code>type</code> property does not equal <var>requested
+                control type</var> then abort any remaining sub-steps and continue at the next available <var>requested
+                control type</var>.
+                </li>
+                <li>Set the <var>'service type in current service manager' flag</var> to <code>true</code>, abort any
+                remaining sub-steps and continue.
+                </li>
+              </ol>
+            </li>
+            <li>If the <var>'service type in current service manager' flag</var> is set to <code>true</code> then
+            increment <var>service manager</var>'s <a href="#dom-networkservices-servicesavailable"><code>servicesAvailable</code></a> attribute by <code>1</code> and
+            then <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#queue-a-task" class="externalDFN">queue a task</a> to dispatch a newly created event with the name <a href="#event-servicefound"><code>servicefound</code></a> that uses the <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a> interface, which does not bubble, is not cancellable, and
+                  has no default action, at the current <var>service manager</var> object.
+            </li>
+          </ol>
+        </li>
+      </ol>
+      <p>
+        The rule for <dfn id="dfn-removing-an-available-service">removing an available service</dfn> is the general process of removing an <a href="#dfn-existing-service" class="internalDFN">existing
+        service</a> from the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> that has left the user's current network or has
+        otherwise expired. This rule takes one argument, <var>service identifier</var>, and consists of running the
+        following steps:
+      </p>
+      <ol class="rule">
+        <li>For each <var>existing service record</var> in the current <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>, run
+        the following sub-steps:
+          <ol class="rule">
+            <li>If the <var>existing service record</var>'s <code>id</code> property does not match <var>service
+            identifier</var> then skip any remaining sub-steps for the current <var>existing service record</var> and
+            continue at the next available <var>existing service record</var>.
+            </li>
+            <li>Let <var>'service type in use' flag</var> be <code>false</code>.
+            </li>
+            <li>For each <var>service manager</var> in the <a href="#dfn-list-of-active-service-managers" class="internalDFN">list of active service managers</a> run the following
+            steps:
+              <ol class="rule">
+                <li>Let <var>'service type in current service manager' flag</var> be <code>false</code>.
+                </li>
+                <li>For each <var>active service</var> in <var>service manager</var> run the following steps:
+                  <ol class="rule">
+                    <li>If <var>existing service record</var>'s <code>id</code> property equals the <var>active
+                    service</var>'s <code>id</code> attribute and <var>active service</var>'s <a href="#dom-networkservice-online"><code>online</code></a> attribute is currently set to
+                    <code>true</code> then set <var>active service</var>'s <a href="#dom-networkservice-online"><code>
+                      online</code></a> attribute to <code>false</code> and then <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#queue-a-task" class="externalDFN">queue a task</a> to dispatch a newly created event with the name <a href="#event-unavailable"><code>unavailable</code></a> that uses the <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a> interface, which does not bubble, is not
+                          cancellable, and has no default action, at the current <var>active service</var>.
+                    </li>
+                  </ol>
+                </li>
+                <li>For each <var>requested control type</var> of the <var>requested control types</var> in
+                <var>service manager</var> run the following steps:
+                  <ol class="rule">
+                    <li>If <var>existing service record</var>'s <code>type</code> property does not equal
+                    <var>requested control type</var> then abort any remaining sub-steps and continue at the next
+                    available <var>requested control type</var>.
+                    </li>
+                    <li>Set the <var>'service type in current service manager' flag</var> to <code>true</code> and the
+                    <var>'service type in use' flag</var> to <code>true</code>, abort any remaining sub-steps and
+                    continue.
+                    </li>
+                  </ol>
+                </li>
+                <li>If the <var>'service type in current service manager' flag</var> is set to <code>true</code> then
+                decrement <var>service manager</var>'s <a href="#dom-networkservices-servicesavailable"><code>servicesAvailable</code></a> attribute by <code>1</code>
+                and then <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#queue-a-task" class="externalDFN">queue a task</a> to dispatch a newly created event with the name <a href="#event-servicelost"><code>servicelost</code></a> that uses the <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a> interface, which does not bubble, is not cancellable,
+                      and has no default action, at the current <var>service manager</var> object.
+                </li>
+              </ol>
+            </li>
+            <li>If the <var>'service type in use' flag</var> is <code>false</code> and the <var>existing service
+            record</var>'s <code>type</code> property begins with the DOMString "<code>upnp:</code>" and <var>existing
+            service record</var>'s <code>eventsURL</code> property is set then run the rule to <a href="#dfn-terminate-an-existing-upnp-events-subscription" class="internalDFN">terminate an existing
+            UPnP Events Subscription</a>, if one is currently active (as a result of having previously called <a href="#dfn-setup-a-upnp-events-subscription" class="internalDFN">setup
+            a UPnP Events Subscription</a> against the current <var>existing service record</var>).
+            </li>
+            <li>Remove <var>existing service record</var> from the current <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>.
+            </li>
+          </ol>
+        </li>
+      </ol>
+      <p>
+        User agents <em class="rfc2119" title="SHOULD">SHOULD</em> expire a service record from the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> when its
+        <code>expiryTimestamp</code> attribute exceeds the current UTC timestamp. When this condition is met the
+        <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="SHOULD">SHOULD</em> run the rule for <a href="#dfn-removing-an-available-service" class="internalDFN">removing an available service</a>, passing in the expired service
+        record's <code>id</code> attribute as the only argument.
+      </p>
+      <section id="zeroconf-mdns-dns-sd">
+        <h3 aria-level="2" role="heading" id="h3_zeroconf-mdns-dns-sd"><span class="secno">8.1 </span>
+          Zeroconf (<abbr title="Multicast DNS">mDNS</abbr> + <abbr title="Domain Name System">DNS</abbr>-<abbr title="Service Discovery">SD</abbr>)
+        </h3>
+        <p>
+          For each <abbr title="Domain Name System">DNS</abbr> response received from a user-agent-initiated Multicast <abbr title="Domain Name System">DNS</abbr> Browse for <abbr title="DNS Pointer Record">PTR</abbr> records with the name <code>_services._dns-sd._udp</code> on the resolved
+          recommended automatic browsing domain [<cite><a class="bibref" href="#bib-MDNS">MDNS</a></cite>], the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> run the following steps:
+        </p>
+        <ol class="rule">
+          <li>Let <var>service <abbr title="Multicast DNS">mDNS</abbr> responses</var> be an array of <abbr title="DNS Pointer Record">PTR</abbr> records received by issuing a Multicast <abbr title="Domain Name System">DNS</abbr>
+          Browse for <abbr title="DNS Pointer Record">PTR</abbr> records with the name of the current discovered service type.
+          </li>
+          <li>For each Object <var>service <abbr title="Multicast DNS">mDNS</abbr> response</var> in <var>service <abbr title="Multicast DNS">mDNS</abbr> responses</var>, run the following
+          steps:
+            <ol>
+              <li>Let <var>network service record</var> be an Object consisting of the following empty properties:
+              <code>id</code>, <code>name</code>, <code>type</code>, <code>url</code>, <code>config</code>,
+              <code>expiryTimestamp</code>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>id</code> property to the value of the full <abbr title="DNS Pointer Record">PTR</abbr> Service
+              Instance Name [<cite><a class="bibref" href="#bib-MDNS">MDNS</a></cite>].
+              </li>
+              <li>Set <var>network service record</var>'s <code>name</code> property to the value of the <abbr title="DNS Pointer Record">PTR</abbr> Service
+              Instance Name's <var>Instance</var> component [<cite><a class="bibref" href="#bib-MDNS">MDNS</a></cite>].
+              </li>
+              <li>Set <var>network service record</var>'s <code>type</code> property to the concatenation of the string
+              <code>zeroconf:</code> followed be the value of the <abbr title="DNS Pointer Record">PTR</abbr> Service Instance Name's <var>Service</var>
+              component [<cite><a class="bibref" href="#bib-MDNS">MDNS</a></cite>].
+              </li>
+              <li>Set <var>network service record</var>'s <code>url</code> property to the resolvable Service <abbr title="Uniform Resource Locator">URL</abbr>
+              obtained from performing an <abbr title="Domain Name System">DNS</abbr>-<abbr title="Service Discovery">SD</abbr> Lookup [<cite><a class="bibref" href="#bib-DNS-SD">DNS-SD</a></cite>] of the current service from the <abbr title="DNS Pointer Record">PTR</abbr> record provided
+              [<cite><a class="bibref" href="#bib-MDNS">MDNS</a></cite>].
+              </li>
+              <li>Set <var>network service record</var>'s <code>config</code> property to the string value of the
+              contents of the first <abbr title="Domain Name System">DNS</abbr>-<abbr title="Service Discovery">SD</abbr> TXT record associated with the <var>service <abbr title="Multicast DNS">mDNS</abbr> response</var> as defined
+              in [<cite><a class="bibref" href="#bib-DNS-SD">DNS-SD</a></cite>].
+              </li>
+              <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
+              current date, in UTC timestamp format, plus a value of <code>120</code> seconds.
+              </li>
+              <li>Run the general rule for <a href="#dfn-adding-an-available-service" class="internalDFN">adding an available service</a>, passing in the current <var>network
+              service record</var> as the only argument.
+              </li>
+            </ol>
+          </li>
+        </ol>
+      </section>
+      <section id="simple-service-discovery-protocol-ssdp">
+        <h3 aria-level="2" role="heading" id="h3_simple-service-discovery-protocol-ssdp"><span class="secno">8.2 </span>
+          Simple Service Discovery Protocol (<abbr title="Simple Service Discovery Protocol">SSDP</abbr>)
+        </h3>
+        <p>
+          A user agent that implements UPnP service discovery <em class="rfc2119" title="MUST">MUST</em> issue a <dfn id="dfn-search-request-for-upnp-root-devices">search request for UPnP root
+          devices</dfn> against the user's current local network according to the full normative text and timing
+          provided in 'Section 1.3.2: Search request with M-SEARCH' detailed in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>].
+        </p>
+        <p>
+          The user agent <em class="rfc2119" title="MUST">MUST</em> issue all <a title="search request for UPnP root devices" href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search requests for UPnP root
+          devices</a> with a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> request line equal to <code>M-SEARCH * <abbr title="Hypertext Transfer Protocol">HTTP</abbr>/1.1</code>, with a HOST header equal to
+          the reserved multicast address and port of <code>239.255.255.250:1900</code> and a MAN header equal to
+          <code>ssdp:discover</code>. The <a href="#dfn-user-agent" class="internalDFN">user agent</a> must also send an ST header with this <abbr title="Hypertext Transfer Protocol">HTTP</abbr> request equal to
+          the String value of <code>ssdp:all</code> or <code>upnp:rootdevice</code> or a single <a href="#dfn-valid-service-type" class="internalDFN">valid service
+          type</a> token beginning with the String value <code>upnp:</code>. If a single <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a>
+          token beginning with the String value <code>upnp:</code> is to be used, the user agent <em class="rfc2119" title="MUST">MUST</em> strip the leading
+          String <code>upnp:</code> before using this value in this <abbr title="Hypertext Transfer Protocol">HTTP</abbr> request. The user-agent <em class="rfc2119" title="MUST">MUST</em> also send an MX
+          header equal to a <dfn id="dfn-maximum-upnp-advertisement-response-wait-time">maximum UPnP advertisement response wait time</dfn> value between <code>1</code> and
+          <code>5</code> seconds with this <abbr title="Hypertext Transfer Protocol">HTTP</abbr> request.
+        </p>
+        <p>
+          The user agent <em class="rfc2119" title="MUST">MUST</em> listen for any incoming responses to any <a href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search request for UPnP root devices</a>.
+        </p>
+        <p>
+          For each <dfn id="dfn-http-response"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response</dfn> following an initial <a href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search request for UPnP root devices</a> sent on a
+          <a href="#dfn-standard-upnp-address-and-port" class="internalDFN">standard UPnP address and port</a> the user agent <em class="rfc2119" title="MUST">MUST</em> run the following steps:
+        </p>
+        <ol class="rule">
+          <li>If the <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response</a> is not a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> 200 OK response then this response is invalid and the user
+          agent <em class="rfc2119" title="MUST">MUST</em> discard this response, abort any remaining steps and return. The user agent <em class="rfc2119" title="MAY">MAY</em> issue a new
+          <a href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search request for UPnP root devices</a> as a result of this error occurring.
+          </li>
+          <li>If the <a href="#dfn-maximum-upnp-advertisement-response-wait-time" class="internalDFN">maximum UPnP advertisement response wait time</a> has been exceeded since the initial <a href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search
+          request for UPnP root devices</a> was sent then the <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response</a> is invalid and the user agent <em class="rfc2119" title="MUST">MUST</em>
+          discard this response, abort any remaining steps and return. The user agent <em class="rfc2119" title="MAY">MAY</em> stop listening for responses
+          from the current <a href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search request for UPnP root devices</a> as a result of this error occurring. Equally,
+          the user agent <em class="rfc2119" title="MAY">MAY</em> issue a new <a href="#dfn-search-request-for-upnp-root-devices" class="internalDFN">search request for UPnP root devices</a> as a result of this error
+          occurring.
+          </li>
+          <li>Let <var>ssdp device</var> be an Object with a property for each <abbr title="Hypertext Transfer Protocol">HTTP</abbr> header received in the <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr>
+          Response</a>, with each key being the name of a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> response header and each value being that <abbr title="Hypertext Transfer Protocol">HTTP</abbr> response
+          header's value.
+          </li>
+          <li>If <var>ssdp device</var> does not contain at least one <var>CACHE-CONTROL</var> entry, at least one
+          <var>USN</var> entry, at least one <var>ST</var> entry and at least one <var>LOCATION</var> entry then the
+          <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response</a> is invalid and the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> discard this response, abort any remaining
+          steps and return.
+          </li>
+          <li>The user agent <em class="rfc2119" title="MUST">MUST</em> run the rule for <a href="#dfn-obtaining-a-upnp-device-description-file" class="internalDFN">obtaining a UPnP Device Description File</a> passing in the first
+          occurrence of <var>LOCATION</var> from <var>ssdp device</var> as the <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var>
+          argument and the first occurrence of <var>USN</var> from <var>ssdp device</var> as the <var>device
+          identifier</var> argument and the first occurrence of <var>CACHE-CONTROL</var> from <var>ssdp device</var>
+          (minus the leading string of <code>max-age=</code>) as the <var>device expiry</var> argument.
+          </li>
+        </ol>
+        <p>
+          The user agent <em class="rfc2119" title="MUST">MUST</em> listen for incoming requests on the <dfn id="dfn-standard-upnp-address-and-port">standard UPnP address and port</dfn> on all
+          current local network interface addresses with the port <code>1900</code>.
+        </p>
+        <p>
+          For each <dfn id="dfn-http-request"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Request</dfn> received on a <a href="#dfn-standard-upnp-address-and-port" class="internalDFN">standard UPnP address and port</a> the user agent <em class="rfc2119" title="MUST">MUST</em> run
+          the following steps:
+        </p>
+        <ol class="rule">
+          <li>If the <a href="#dfn-http-request" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Request</a> is not a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> NOTIFY request then it is not a valid UPnP Request and the user
+          agent <em class="rfc2119" title="MUST">MUST</em> discard this request, abort any remaining steps and return.
+          </li>
+          <li>Let <var>ssdp device</var> be an Object with a property for each <abbr title="Hypertext Transfer Protocol">HTTP</abbr> header received in the <a href="#dfn-http-request" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr>
+          Request</a>, with each key being the name of a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> header and each value being that <abbr title="Hypertext Transfer Protocol">HTTP</abbr> header's value.
+          </li>
+          <li>If <var>ssdp device</var>'s <var>NTS</var> entry is equal to <code>ssdp:alive</code> and the <a href="#dfn-http-request" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr>
+          Request</a> does not contain at least one <var>CACHE-CONTROL</var> entry, at least one <var>USN</var> entry,
+          at least one <var>NT</var> entry, at least one <var>NTS</var> entry and at least one <var>LOCATION</var>
+          entry, then the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> discard this request, abort any remaining steps and return.
+          </li>
+          <li>If <var>ssdp device</var>'s <var>NTS</var> entry is equal to <code>ssdp:alive</code> then the user agent
+          <em class="rfc2119" title="MUST">MUST</em> run the rule for <a href="#dfn-obtaining-a-upnp-device-description-file" class="internalDFN">obtaining a UPnP Device Description File</a> passing in the first occurrence of
+          <var>LOCATION</var> from <var>ssdp device</var> as the <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var> argument and the
+          first occurrence of <var>USN</var> from <var>ssdp device</var> as the <var>device identifier</var> argument
+          and the first occurrence of <var>CACHE-CONTROL</var> from <var>ssdp device</var> (minus the leading string of
+          <code>max-age=</code>) as the <var>device expiry</var>.<br>
+            <br>
+            Otherwise, if <var>ssdp device</var>'s <var>NTS</var> entry is equal to <code>ssdp:byebye</code> then the
+            user agent <em class="rfc2119" title="MUST">MUST</em> run the rule for <a href="#dfn-removing-all-services-from-a-registered-upnp-device" class="internalDFN">removing all services from a registered UPnP Device</a> passing in the
+            first occurrence of <var>USN</var> from <var>ssdp device</var> as the <var>device identifier</var>
+            argument.
+          </li>
+        </ol>
+        <p>
+          The rule for <dfn id="dfn-obtaining-a-upnp-device-description-file">obtaining a UPnP Device Description File</dfn> is the process of obtaining the contents of
+          a standard UPnP Device Description [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>] from a <abbr title="Uniform Resource Locator">URL</abbr>-based resource. This rule takes three
+          arguments - <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var>, <var>device identifier</var> and <var>device expiry</var> - and
+          when called the user agent <em class="rfc2119" title="MUST">MUST</em> run the following steps:
+        </p>
+        <ol class="rule">
+          <li>Let <var>device descriptor file</var> contain the contents of the file located at the <abbr title="Uniform Resource Locator">URL</abbr> provided in
+          <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var> obtained according to the rules defined in 'Section 2.11: Retrieving a
+          description using <abbr title="Hypertext Transfer Protocol">HTTP</abbr>' in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>].
+          </li>
+          <li>If the value provided in <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var> cannot be resolved as a reachable <abbr title="Uniform Resource Locator">URL</abbr> on the
+          current network or the <var>device descriptor file</var> remains empty then it is invalid and the <a href="#dfn-user-agent" class="internalDFN">user
+          agent</a> <em class="rfc2119" title="MUST">MUST</em> abort any remaining steps and return.
+          </li>
+          <li>Run the rule for <a href="#dfn-processing-a-upnp-device-description-file" class="internalDFN">processing a UPnP Device Description File</a>, passing in the current <var>device
+          descriptor file</var>, <var>device identifier</var> and <var>device expiry</var> arguments.
+          </li>
+        </ol>
+        <p>
+          The rule for <dfn id="dfn-processing-a-upnp-device-description-file">processing a UPnP Device Description File</dfn> is the process of parsing the contents of a
+          standard UPnP Device Description [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>] and registering the UPnP services contained therein
+          within the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>.
+        </p>
+        <p>
+          The rule for <a href="#dfn-processing-a-upnp-device-description-file" class="internalDFN">processing a UPnP Device Description File</a> takes three arguments - <var>device descriptor
+          file</var>, <var>device identifier</var> and <var>device expiry</var> - and when called the user agent <em class="rfc2119" title="MUST">MUST</em>
+          run the following steps:
+        </p>
+        <ol class="rule">
+          <li>Let <var>advertised services</var> be a list of all advertised services obtained from the <var>device
+          descriptor file</var> containing the value of the first occurrence of the <code>&lt;serviceList&gt;</code>
+          element as it is defined in 'Section 2.3: Device Description' in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>].
+          </li>
+          <li>For each <code>&lt;service&gt;</code> element - known as an <var>advertised service</var> - in
+          <var>advertised services</var> run the following steps:
+            <ol class="rule">
+              <li>Let <var>network service record</var> be a new Object consisting of the following empty properties:
+              <code>id</code>, <code>deviceId</code>, <code>name</code>, <code>type</code>, <code>url</code>,
+              <code>eventsUrl</code>, <code>config</code>, <code>expiryTimestamp</code>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>id</code> property to the concatenated string value of
+              the first occurrence of the <code>&lt;UDN&gt;</code> element in the <var>device descriptor file</var>
+              with the <var>advertised service</var>'s <code>&lt;serviceId&gt;</code> sub-element.
+              </li>
+              <li>Set <var>network service record</var>'s <code>deviceId</code> property to the value of <var>device
+              identifier</var>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>name</code> property to the string value of the first
+              occurrence of the <var>advertised service</var>'s <code>&lt;serviceId&gt;</code> sub-element.
+              </li>
+              <li>Set <var>network service record</var>'s <code>type</code> property to the concatenation of the string
+              <code>upnp:</code> followed by the string value of the first occurrence of the <var>advertised
+              service</var>'s <code>&lt;serviceType&gt;</code> sub-element.
+              </li>
+              <li>Set <var>network service record</var>'s <code>url</code> property to the string value of the first
+              occurrence of the <var>advertised service</var>'s <code>&lt;controlURL&gt;</code> sub-element.
+              </li>
+              <li>Set <var>network service record</var>'s <code>config</code> property to the string value of the
+              contents of the first occurrence of the <code>&lt;device&gt;</code> element in the <var>device descriptor
+              file</var>.
+              </li>
+              <li>If <var>advertised service</var>'s <code>&lt;eventSubURL&gt;</code> sub-element is not empty, then
+              set <var>network service record</var>'s <code>eventsUrl</code> property to the string value of the first
+              occurrence of the <var>advertised service</var>'s <code>&lt;eventSubURL&gt;</code> sub-element.
+              Otherwise, do not set <var>network service record</var>'s <code>eventsUrl</code> property.
+              </li>
+              <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
+              current date, in UTC timestamp format, plus the value of <var>device expiry</var>.
+              </li>
+              <li>Run the general rule for <a href="#dfn-adding-an-available-service" class="internalDFN">adding an available service</a>, passing in the current <var>network
+              service record</var> as the only argument.
+              </li>
+            </ol>
+          </li>
+          <li>If <var>device descriptor file</var> contains a <code>&lt;deviceList&gt;</code> element then for each
+          <code>&lt;device&gt;</code> element within <code>&lt;deviceList&gt;</code> - herein known as an <var>embedded
+          device descriptor file</var> - the user agent <em class="rfc2119" title="MUST">MUST</em> run the rule for <a href="#dfn-processing-a-upnp-device-description-file" class="internalDFN">processing a UPnP Device Description
+          File</a>, passing in the current <var>embedded device descriptor file</var> as the <var>device descriptor
+          file</var> argument, along with the current <var>device identifier</var> and <var>device expiry</var>
+          arguments.
+          </li>
+        </ol>
+        <p>
+          The rule for <dfn id="dfn-removing-all-services-from-a-registered-upnp-device">removing all services from a registered UPnP Device</dfn> is the process of removing all
+          services associated with a device from the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> that has left the user's
+          current network or has otherwise timed out or expired. This rule takes one argument, <var>device
+          identifier</var>, and consists of running the following steps:
+        </p>
+        <ol class="rule">
+          <li>For each <var>existing service record</var> in the current <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a>, run
+          the following sub-steps:
+            <ol class="rule">
+              <li>If the <var>existing service record</var>'s <code>deviceId</code> property does not match <var>device
+              identifier</var> then skip any remaining sub-steps for the current <var>existing service record</var> and
+              continue at the next available <var>existing service record</var>.
+              </li>
+              <li>Run the general rule for <a href="#dfn-removing-an-available-service" class="internalDFN">removing an available service</a> passing in <var>existing service
+              record</var>'s <code>id</code> property as the only argument.
+              </li>
+            </ol>
+          </li>
+        </ol>
+        <p>
+          When the <a href="#dfn-user-agent" class="internalDFN">user agent</a> is to <dfn id="dfn-setup-a-upnp-events-subscription">setup a UPnP Events Subscription</dfn>, it is to run the following
+          steps with the current <var>network service record</var> object as defined in 'Section 4.1.2: SUBSCRIBE with
+          NT and CALLBACK' in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>]:
+        </p>
+        <ol class="rule">
+          <li>If <var>network service record</var>'s <code>eventsUrl</code> property is empty then the <a href="#dfn-user-agent" class="internalDFN">user
+          agent</a> <em class="rfc2119" title="MUST">MUST</em> abort these steps.
+          </li>
+          <li>Let <var>callback <abbr title="Uniform Resource Locator">URL</abbr></var> be the value of creating a new <a href="#dfn-user-agent-generated-callback-url" class="internalDFN">user-agent generated callback url</a>.
+          </li>
+          <li>Send a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> SUBSCRIBE request with a <em>NT</em> header with a string value of <code>upnp:event</code>, a
+          <em>TIMEOUT</em> header with a user-agent defined timeout value (in the form <code>Second-XX</code> where
+          <code>XX</code> is the user-agent defined timeout value in seconds) and a <em>CALLBACK</em> header with a
+          string value of <var>callback <abbr title="Uniform Resource Locator">URL</abbr></var> towards the <var>network service record</var>'s
+          <code>eventsUrl</code> property.
+          </li>
+          <li>If a non-200 OK response is received from the <abbr title="Hypertext Transfer Protocol">HTTP</abbr> SUBSCRIBE request then the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em>
+          abort these steps.
+          </li>
+          <li>On receiving a valid 200 OK response, run the following steps:
+            <ol class="rule">
+              <li>Let <var>callback ID</var> equal the string value of the first included <em>SID</em> header, if it
+              exists.
+              </li>
+              <li>Let <var>timeout date</var> equal the sum of the current UTC date value plus the integer value of the
+              first included <em>TIMEOUT</em> header (minus the leading string of <code>Second-</code>), if it exists.
+              </li>
+              <li>Run the following steps asynchronously and continue to the step labeled <em>listen</em> below.
+              </li>
+              <li>
+                <em>Refresh Subscription</em>: Run the following steps at a set interval (X) within the <a href="#dfn-user-agent" class="internalDFN">user
+                agent</a>:
+                <ol class="rule">
+                  <li>Let <var>current date</var> equal the current UTC date.
+                  </li>
+                  <li>If <var>current date</var> is less than the <var>timeout date</var> then continue to the step
+                  labeled <em>refresh subscription</em> above.
+                  </li>
+                  <li>Send a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> SUBSCRIBE request with a <em>SID</em> header with the string value of <var>callback
+                  ID</var> and a user-agent defined <em>TIMEOUT</em> header (in the form <code>Second-XX</code> where
+                  <code>XX</code> is the user-agent defined timeout value in seconds) towards the <var>network service
+                  record</var>'s <code>eventsUrl</code> property.
+                  </li>
+                  <li>On receiving a valid 200 OK, update <var>callback ID</var> with the string value of the first
+                  included <em>SID</em> header and set <var>timeout date</var> to the sum of the current UTC date value
+                  plus the integer value of the first included <em>TIMEOUT</em> header (minus the leading string of
+                  <code>Second-</code>), if it exists. If the current date is greater than or equal to <var>timeout
+                  date</var> then the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="SHOULD">SHOULD</em> continue from the step labeled <em>refresh
+                  subscription</em> above. For all non 200 OK responses the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="SHOULD">SHOULD</em> continue from the
+                  step labeled <em>refresh subscription</em> above.
+                  </li>
+                </ol>
+              </li>
+              <li>
+                <em>Listen</em>: For each <abbr title="Hypertext Transfer Protocol">HTTP</abbr> NOTIFY request received at the <var>callback <abbr title="Uniform Resource Locator">URL</abbr></var> the <a href="#dfn-user-agent" class="internalDFN">user
+                agent</a> is to run the following steps:
+                <ol class="rule">
+                  <li>Let <var>content clone</var> be the result of obtaining the message body of the <abbr title="Hypertext Transfer Protocol">HTTP</abbr> NOTIFY
+                  request. If <var>content clone</var> is empty, then the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> abort these steps.
+                  </li>
+                  <li>Let <var>notification event</var> be a new simple event that uses the <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a> interface with the name <a href="#event-notify"><code>notify</code></a>, which does not bubble, is not cancellable, and has no
+                        default action.
+                  </li>
+                  <li>Let the <code>data</code> attribute of <var>notification event</var> have the DOMString value of
+                  <var>content clone</var>.
+                  </li>
+                  <li>
+                    <a href="http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#queue-a-task" class="externalDFN">Queue a task</a> to dispatch <var>notification event</var> at the current
+                        <a href="#networkservice" class="internalDFN"><code>NetworkService</code></a> object.
+                  </li>
+                  <li>Return a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> 200 OK response to the sender of the <abbr title="Hypertext Transfer Protocol">HTTP</abbr> NOTIFY request.
+                  </li>
+                </ol>
+              </li>
+            </ol>
+          </li>
+        </ol>
+        <p>
+          A <a href="#dfn-user-agent" class="internalDFN">user agent</a> can <dfn id="dfn-terminate-an-existing-upnp-events-subscription">terminate an existing UPnP Events Subscription</dfn> at any time for a
+          <var>network service record</var> by sending an <abbr title="Hypertext Transfer Protocol">HTTP</abbr> UNSUBSCRIBE request - as defined in 'Section 4.1.4:
+          Cancelling a subscription with UNSUBSCRIBE' in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>] - with a HOST header set to that
+          <var>active service</var>'s <code>eventsUrl</code> property and a SID header set to the <var>callback
+          ID</var> obtained when the initial <a href="#dfn-setup-a-upnp-events-subscription" class="internalDFN">setup a UPnP Events Subscription</a> action occurred.
+        </p>
+      </section>
+      <section id="discovery-and-launch-protocol-dial">
+        <h3 aria-level="2" role="heading" id="h3_discovery-and-launch-protocol-dial"><span class="secno">8.3 </span>
+          Discovery and Launch Protocol (<abbr title="Discovery and Launch Protocol">DIAL</abbr>)
+        </h3>
+        <p>
+          A user agent that implements <abbr title="Discovery and Launch Protocol">DIAL</abbr> service discovery <em class="rfc2119" title="MUST">MUST</em> issue a <dfn id="dfn-search-request-for-dial-enabled-devices">search request for <abbr title="Discovery and Launch Protocol">DIAL</abbr>-enabled
+          devices</dfn> against the user's current local network according to the full normative text and timing
+          provided in 'Section 1.3.2: Search request with M-SEARCH' detailed in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>].
+        </p>
+        <p>
+          Let <var>dial version</var> be the version number specified in the <a href="#dfn-valid-service-type" class="internalDFN">valid service type</a> token. Let
+          <var>dial search target</var> be the concatentation of the
+          <code>urn:dial-multiscreen-org:service:dial:</code> string constant with the <var>dial version</var>
+          (currently, <var>dial version</var> can only be <code>1</code>)
+        </p>
+        <p>
+          The user agent <em class="rfc2119" title="MUST">MUST</em> issue all <a title="search request for DIAL devices">search requests for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a>
+          with a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> request line equal to <code>M-SEARCH * <abbr title="Hypertext Transfer Protocol">HTTP</abbr>/1.1</code>, with a HOST header equal to the reserved
+          multicast address and port of <code>239.255.255.250:1900</code>, a MAN header equal to
+          <code>ssdp:discover</code>, an ST header equal to <var>dial search target</var> and a user-agent defined MX
+          header equal to a <dfn id="dfn-maximum-dial-advertisement-response-wait-time">maximum <abbr title="Discovery and Launch Protocol">DIAL</abbr> advertisement response wait time</dfn> value between <code>1</code> and
+          <code>5</code> seconds.
+        </p>
+        <p>
+          The user agent <em class="rfc2119" title="MUST">MUST</em> listen for any incoming responses to a <a>search request for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a>.
+        </p>
+        <p>
+          For each <abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response following an initial <a>search request for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a> sent on a <a href="#dfn-standard-upnp-address-and-port" class="internalDFN">standard UPnP
+          address and port</a> the user agent <em class="rfc2119" title="MUST">MUST</em> run the following steps:
+        </p>
+        <ol class="rule">
+          <li>If the <abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response is not a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> 200 OK response then this response is invalid and the user agent <em class="rfc2119" title="MUST">MUST</em>
+          discard this response, abort any remaining steps and return. The user agent <em class="rfc2119" title="MAY">MAY</em> issue a new <a>search request
+          for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a> as a result of this error occurring.
+          </li>
+          <li>If the <a href="#dfn-maximum-dial-advertisement-response-wait-time" class="internalDFN">maximum <abbr title="Discovery and Launch Protocol">DIAL</abbr> advertisement response wait time</a> has been exceeded since the initial <a>search
+          request for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a> was sent then the <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response</a> is invalid and the user agent <em class="rfc2119" title="MUST">MUST</em>
+          discard this response, abort any remaining steps and return. The user agent <em class="rfc2119" title="MAY">MAY</em> stop listening for responses
+          from the current <a>search request for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a> as a result of this error occurring. Equally, the
+          user agent <em class="rfc2119" title="MAY">MAY</em> issue a new <a>search request for <abbr title="Discovery and Launch Protocol">DIAL</abbr> devices</a> as a result of this error occurring.
+          </li>
+          <li>Let <var>dial device</var> be an Object with a property for each <abbr title="Hypertext Transfer Protocol">HTTP</abbr> header received in the <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr>
+          Response</a>, with each key being the name of a <abbr title="Hypertext Transfer Protocol">HTTP</abbr> response header and each value being that <abbr title="Hypertext Transfer Protocol">HTTP</abbr> response
+          header's value.
+          </li>
+          <li>If <var>dial device</var> does not contain at least one <var>CACHE-CONTROL</var> entry, at least one
+          <var>USN</var> entry, at least one <var>ST</var> entry and at least one <var>LOCATION</var> entry or the
+          value of its <var>ST</var> entry is not <var>dial search target</var>, then the <a href="#dfn-http-response" class="internalDFN"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Response</a> is
+          invalid and the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> discard this response, abort any remaining steps and return.
+          </li>
+          <li>The user agent <em class="rfc2119" title="MUST">MUST</em> run the rule for <a href="#dfn-obtaining-a-upnp-device-description-file" class="internalDFN">obtaining a UPnP Device Description File</a> passing in the first
+          occurrence of <var>LOCATION</var> from <var>dial device</var> as the <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var>
+          argument and the first occurrence of <var>USN</var> from <var>dial device</var> as the <var>device
+          identifier</var> argument and the first occurrence of <var>CACHE-CONTROL</var> from <var>dial device</var>
+          (minus the leading string of <code>max-age=</code>) as the <var>device expiry</var> argument.
+          </li>
+        </ol>
+        <p>
+          The rule for <dfn id="dfn-obtaining-a-dial-device-description-file">obtaining a <abbr title="Discovery and Launch Protocol">DIAL</abbr> Device Description File</dfn> is the process of obtaining the contents of
+          a standard UPnP Device Description [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>] from a <abbr title="Uniform Resource Locator">URL</abbr>-based resource. This rule takes three
+          arguments - <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var>, <var>device identifier</var> and <var>device expiry</var> - and
+          when called the user agent <em class="rfc2119" title="MUST">MUST</em> run the following steps:
+        </p>
+        <ol class="rule">
+          <li>Let <var>device descriptor file</var> contain the contents of the file located at the <abbr title="Uniform Resource Locator">URL</abbr> provided in
+          <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var> obtained according to the rules defined in 'Section 2.11: Retrieving a
+          description using <abbr title="Hypertext Transfer Protocol">HTTP</abbr>' in [<cite><a class="bibref" href="#bib-UPNP-DEVICEARCH11">UPNP-DEVICEARCH11</a></cite>].
+          </li>
+          <li>Let <var>application url</var> be the value of the first occurrence of the <code>Application-<abbr title="Uniform Resource Locator">URL</abbr></code>
+          response header field obtained according to the rules defined in 'Section 5.4: Device Description Response'
+          in [<a href="https://sites.google.com/a/dial-multiscreen.org/dial/dial-protocol-specification"><abbr title="Discovery and Launch Protocol">DIAL</abbr></a>]
+          </li>
+          <li>If the value provided in <var>device descriptor <abbr title="Uniform Resource Locator">URL</abbr></var> cannot be resolved as a reachable <abbr title="Uniform Resource Locator">URL</abbr> on the
+          current network or the <var>device descriptor file</var> remains empty or <var>application url</var> is
+          undefined then it is invalid and the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> abort any remaining steps and return.
+          </li>
+          <li>Run the following steps to add the newly discovered <abbr title="Discovery and Launch Protocol">DIAL</abbr> service:
+            <ol class="rule">
+              <li>Let <var>network service record</var> be a new Object consisting of the following empty properties:
+              <code>id</code>, <code>deviceId</code>, <code>name</code>, <code>type</code>, <code>url</code>,
+              <code>expiryTimestamp</code>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>id</code> property to the first occurrence of the
+              <code>&lt;UDN&gt;</code> element in the <var>descriptor file</var> prefixed with the <code>dial:</code>
+              string constant
+              </li>
+              <li>Set <var>network service record</var>'s <code>deviceId</code> property to the value of <var>device
+              identifier</var>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>name</code> property to the string value of the first
+              occurrence of the <code>&lt;friendlyName&gt;</code> element in the <var>descriptor file</var>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>type</code> property to <var>dial search target</var>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>url</code> property to the string value of the
+              <var>application url</var>.
+              </li>
+              <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
+              current date, in UTC timestamp format, plus the value of <var>device expiry</var>.
+              </li>
+              <li>Run the general rule for <a href="#dfn-adding-an-available-service" class="internalDFN">adding an available service</a>, passing in the current <var>network
+              service record</var> as the only argument.
+              </li>
+            </ol>
+          </li>
+        </ol>
+      </section>
+      <section id="network-topology-monitoring">
+        <h3 aria-level="2" role="heading" id="h3_network-topology-monitoring"><span class="secno">8.4 </span>
+          Network Topology Monitoring
+        </h3>
+        <div>
+          <p>
+            When the <a href="#dfn-user-agent" class="internalDFN">user agent</a> detects that the user has dropped from a connected network then, for each
+            <var>existing service record</var> in the <a href="#dfn-list-of-available-service-records" class="internalDFN">list of available service records</a> discovered via that
+            network connection, the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> run the general rule for <a href="#dfn-removing-an-available-service" class="internalDFN">removing an available
+            service</a> passing in each <var>existing service record</var>'s <code>id</code> property as the only
+            argument for each call.
+          </p>
+          <p>
+            When the <a href="#dfn-user-agent" class="internalDFN">user agent</a> detects that the user has connected to a new network or reconnected to an
+            existing network, then it <em class="rfc2119" title="SHOULD">SHOULD</em> restart its discovery mechanisms as defined in the <a href="#service-discovery">Service Discovery</a> section of this specification, maintaining the existing <a href="#dfn-list-of-active-service-managers" class="internalDFN">list
+            of active service managers</a> currently in use.
+          </p>
+        </div>
+      </section>
+    </section>
+    <section id="events-summary">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_events-summary"><span class="secno">9. </span>
+        Events Summary
+      </h2>
+      <p>
+        The following events are dispatched on the <a href="#networkservices"><code>NetworkServices</code></a> and/or
+        <a href="#networkservice"><code>NetworkService</code></a> objects:
+      </p>
+      <table border="1">
+        <thead>
+          <tr>
+            <th>
+              <span>Event name</span>
+            </th>
+            <th>
+              <span>Interface</span>
+            </th>
+            <th>
+              <span>Dispatched when...</span>
+            </th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>
+              <dfn id="event-servicefound"><code>servicefound</code></dfn>
+            </td>
+            <td>
+              <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a>
+            </td>
+            <td>
+              When a <a href="#dfn-new-service" class="internalDFN">new service</a> that matches one of the <a>requested type tokens</a> is found in the current
+              network.
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <dfn id="event-servicelost"><code>servicelost</code></dfn>
+            </td>
+            <td>
+              <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a>
+            </td>
+            <td>
+              When an <a href="#dfn-existing-service" class="internalDFN">existing service</a> that matches one of the <a>requested type tokens</a> gracefully leaves or
+              expires from the current network.
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <dfn id="event-available"><code>available</code></dfn>
+            </td>
+            <td>
+              <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a>
+            </td>
+            <td>
+              When a <a href="#dfn-current-service" class="internalDFN">current service</a> renews its service registration within the current network.
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <dfn id="event-unavailable"><code>unavailable</code></dfn>
+            </td>
+            <td>
+              <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a>
+            </td>
+            <td>
+              When a <a href="#dfn-current-service" class="internalDFN">current service</a> gracefully leaves or otherwise expires from the current network.
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <dfn id="event-notify"><code>notify</code></dfn>
+            </td>
+            <td>
+              <a href="http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#event" class="externalDFN"><code>Event</code></a>
+            </td>
+            <td>
+              When a valid UPnP Events Subscription Message is received on a <a href="#dfn-user-agent-generated-callback-url" class="internalDFN">user-agent generated callback url</a>
+              for a <a href="#dfn-current-service" class="internalDFN">current service</a>. This event never fires for Zeroconf-based services.
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </section>
+    <section id="garbage-collection">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_garbage-collection"><span class="secno">10. </span>
+        Garbage collection
+      </h2>
+      <p>
+        There is an <dfn id="dfn-implied-strong-reference">implied strong reference</dfn> from any IDL attribute in this <abbr title="Application Programming Interface">API</abbr> that returns a pre-existing
+        object to that object.
+      </p>
+      <div class="note"><div class="note-title" aria-level="2" role="heading" id="h_note_2"><span>Note</span></div><p class="">
+        For example, if a <a href="#networkservices" class="internalDFN"><code>NetworkServices</code></a> object has one or more <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a> attached
+        to it then there is a strong reference from that <a href="#networkservices" class="internalDFN"><code>NetworkServices</code></a> object toward each of its
+        <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a>.
+      </p></div>
+      <p>
+        If a <a href="#dfn-user-agent" class="internalDFN">user agent</a> is to <dfn id="dfn-make-disappear">make disappear</dfn> a <a href="#networkservices" class="internalDFN"><code>NetworkServices</code></a> object (this
+        happens when a <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#document" class="externalDFN"><code>Document</code></a> object goes away), the <a href="#dfn-user-agent" class="internalDFN">user agent</a> <em class="rfc2119" title="MUST">MUST</em> remove this
+           object from the <a href="#dfn-list-of-active-service-managers" class="internalDFN">list of active service managers</a> and remove the <a href="#dom-networkservice-url"><code>url</code></a> of each of its <a href="#dfn-indexed-properties-1" class="internalDFN">indexed properties</a> from the <a href="#dfn-entry-script-origin-s-url-whitelist" class="internalDFN">entry
+           script origin's <abbr title="Uniform Resource Locator">URL</abbr> whitelist</a>.
+      </p>
+    </section>
+    <section id="use-cases-and-requirements">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_use-cases-and-requirements"><span class="secno">11. </span>
+        Use Cases and Requirements
+      </h2>
+      <p>
+        This section covers what the requirements are for this <abbr title="Application Programming Interface">API</abbr>, as well as illustrates some use cases.
+      </p>
+      <ul class="rule">
+        <li>Once a user has given permission, user agents should provide the ability for Web pages to communicate
+        directly with a Local-networked Service.
+          <ul class="rule">
+            <li>Example: A web-based TV remote control. A Web page wants to control the current user's TV, changing the
+            programming shown or increasing/decreasing/muting the volume of the Local-networked Device. The Web page
+            requests a service type that is known to be implemented by television sets to which it has the application
+            logic to communicate. Local devices providing the request service types are discovered and presented to the
+            user for authorization. The user selects one or more of the discovered television sets to be accessible to
+            the current Web page and then clicks 'Share'. The Web page can now communicate directly with the
+            user-authorized Local-networked services.
+            </li>
+          </ul>
+        </li>
+        <li>Web pages should be able to communicate with Local-networked Services using the messaging channel supported
+        by those Devices.
+          <ul class="rule">
+            <li>Example: A Web page advertises that it is capable of controlling multiple Home Media Servers. The user
+            can select their Home Media Server type from a drop-down list, at which point the Web page sends a request
+            to the user agent to connect with the associated service type of the Home Media Server. The Media Server
+            selected implements a Web Socket channel for bi-directional service communication and so the Web page opens
+            a web socket to the requested Media Server and can communicate as required via that appropriate channel.
+            </li>
+          </ul>
+        </li>
+        <li>Web pages should be able to communicate with Local-networked Services using the messaging format supported
+        by those Devices.
+          <ul class="rule">
+            <li>Example: A Web page advertises that it is capable of interacting with and controlling multiple types of
+            Home Media Server. The user can select their Home Media Server type from a drop-down list or known Media
+            Servers, at which point the Web page sends a request to the user agent to connect with the associated
+            service type (and, optionally, the associated event type) of the Home Media Server. The communication
+            protocols supported by Home Media Servers typically vary between UPnP, JSON-RPC, Protocol Buffers or other
+            messaging formats depending on the Home Media Server requested. The Web page is able to communicate with
+            the user-selected Home Media Server in the messaging format supported by that Device, which, in this
+            example is a simple key/value pair text format.
+            </li>
+          </ul>
+        </li>
+        <li>Web pages should not be able to communicate with Local-networked Services that have not been authorized by
+        the user thereby maintaining the user's privacy.
+          <ul class="rule">
+            <li>Example: A Web page requests access to one type of Local-networked service. The user authorizes access
+            to that particular service. Other services running on that same device, and on other devices within the
+            network, should not be accessible to the current Web page.
+            </li>
+          </ul>
+        </li>
+        <li>A user should be able to share one or more Local-networked Services based on a particular service type
+        request from a Web page.
+          <ul class="rule">
+            <li>Example: A Web page is capable of interacting with a specific profile of Local-networked Service. As
+            such, it makes a request to the user agent to access those services, of which multiple matches are found.
+            The user is capable of selecting one or more of the discovered services to share with the Web page. The Web
+            page can then implement a drag-and-drop interface for the user to drag specific actions on to one or more
+            of the authorized Local-networked Services.
+            </li>
+          </ul>
+        </li>
+        <li>User agents should provide an <abbr title="Application Programming Interface">API</abbr> exposed to script that exposes the features above. The user is notified
+        by UI anytime interaction with Local-networked Services is requested, giving the user full ability to cancel or
+        abort the transaction. The user selects the Local-networked Services to be connected to the current Web page,
+        and can cancel these at any time. No invocations to these APIs occur silently without user intervention.
+        </li>
+      </ul>
+    </section>
+    <section class="informative appendix" id="examples">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_examples"><span class="secno">A. </span>
+        Examples
+      </h2><p><em>This section is non-normative.</em></p>
+      <div class="example">
+        <p>
+          This sample code exposes a button. When clicked, this button is disabled and the user is prompted to offer a
+          network service. The user may also select multiple network services. When the user has authorized a network
+          service to be connected to the web page then the web page issues a simple command to get a list of all the
+          albums stored on the connected media player service.
+        </p>
+        <p>
+          The button is re-enabled only when the connected network service disconnects for whatever reason (the service
+          becomes unavailable on the network, the user disconnects from their current network or the user revokes
+          access to the service from the current web page). At this point the user can re-click the button to select a
+          new network service to connect to the web page and the above steps are repeated.
+        </p>
+        <p>
+          The provided service type identifier and service interaction used in this example is based on the
+          well-defined service type and messaging format supported by the <a href="http://xbmc.org/about/">XBMC Media
+          Server</a>.
+        </p>
+        <hr>
+        <pre class="highlight prettyprint"><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Start"</span><span class="pln"> </span><span class="atn">onclick</span><span class="pun">=</span><span class="atv">"</span><span class="pln">start</span><span class="pun">()</span><span class="atv">"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"startBtn"</span><span class="tag">/&gt;</span><span class="pln">
+</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"debugconsole"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">
+
+</span><span class="tag">&lt;script&gt;</span><span class="pln">
+ </span><span class="kwd">var</span><span class="pln"> startBtn </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'startBtn'</span><span class="pun">),</span><span class="pln">
+     debug </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'debugconsole'</span><span class="pun">);</span><span class="pln">
+
+ </span><span class="kwd">function</span><span class="pln"> start</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+   </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">navigator</span><span class="pun">.</span><span class="pln">getNetworkServices</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      navigator</span><span class="pun">.</span><span class="pln">getNetworkServices</span><span class="pun">(</span><span class="str">'zeroconf:_xbmc-jsonrpc._tcp'</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="pln">gotXBMCService</span><span class="pun">).</span><span class="kwd">catch</span><span class="pun">(</span><span class="pln">error</span><span class="pun">);</span><span class="pln">
+      startBtn</span><span class="pun">.</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
+   </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;Service Discovery not supported!"</span><span class="pun">;</span><span class="pln">
+   </span><span class="pun">}</span><span class="pln">
+ </span><span class="pun">}</span><span class="pln">
+
+ </span><span class="kwd">function</span><span class="pln"> gotXBMCService</span><span class="pun">(</span><span class="pln">services</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+
+</span><span class="com">// Listen for service disconnect messages</span><span class="pln">
+
+   services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'unavailable'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> e </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+       debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" disconnected."</span><span class="pun">;</span><span class="pln">
+       startBtn</span><span class="pun">.</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
+   </span><span class="pun">},</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
+
+</span><span class="com">// Send a service message to get albums list (and process the service response)</span><span class="pln">
+
+   </span><span class="kwd">var</span><span class="pln"> svcXhr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XMLHttpRequest</span><span class="pun">();</span><span class="pln">
+   svcXhr</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="str">"POST"</span><span class="pun">,</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">url </span><span class="pun">+</span><span class="pln"> </span><span class="str">"/getAlbums"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// services[0].url and its sub-resources have been</span><span class="pln">
+                                                        </span><span class="com">// whitelisted for cross-site XHR use in this</span><span class="pln">
+                                                        </span><span class="com">// current browsing context.</span><span class="pln">
+
+   svcXhr</span><span class="pun">.</span><span class="pln">setRequestHeader</span><span class="pun">(</span><span class="str">'Content-Type'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'application/json-rpc'</span><span class="pun">);</span><span class="pln">
+
+   svcXhr</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'readystatechange'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> response </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+     </span><span class="kwd">if</span><span class="pun">(</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">readyState </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">status </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">200</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
+        </span><span class="kwd">return</span><span class="pun">;</span><span class="pln">
+     debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" response received: "</span><span class="pun">;</span><span class="pln">
+     debug</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">+=</span><span class="pln"> JSON</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">response</span><span class="pun">.</span><span class="pln">responseText</span><span class="pun">);</span><span class="pln">
+   </span><span class="pun">},</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
+
+   </span><span class="kwd">var</span><span class="pln"> svcMsg </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
+     </span><span class="pun">{</span><span class="pln"> </span><span class="str">"jsonrpc"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"2.0"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"method"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"AudioLibrary.GetAlbums"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"params"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"genreid"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln">
+         </span><span class="str">"artistid"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"start"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"end"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">},</span><span class="pln"> </span><span class="str">"id"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"1"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
+   </span><span class="pun">];</span><span class="pln">
+
+   svcXhr</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">JSON</span><span class="pun">.</span><span class="pln">stringify</span><span class="pun">(</span><span class="pln">svcMsg</span><span class="pun">));</span><span class="pln">
+   debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" request sent: "</span><span class="pun">;</span><span class="pln">
+   debug</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">+=</span><span class="pln"> JSON</span><span class="pun">.</span><span class="pln">stringify</span><span class="pun">(</span><span class="pln">svcMsg</span><span class="pun">);</span><span class="pln">
+
+ </span><span class="pun">}</span><span class="pln">
+
+ </span><span class="kwd">function</span><span class="pln"> error</span><span class="pun">(</span><span class="pln"> err </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+   debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;An error occurred obtaining a local network service."</span><span class="pun">;</span><span class="pln">
+   startBtn</span><span class="pun">.</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
+ </span><span class="pun">}</span><span class="pln">
+</span><span class="tag">&lt;/script&gt;</span></pre>
+      </div>
+      <div class="example">
+        <p>
+          This sample exposes a drop-down list containing a number of common Home-based audio devices. When the user
+          selects an audio device from the list provided, they are prompted to authorize a network service based on the
+          service type requested. The user may also select multiple network services matching the selected service
+          type. In this example, the user selects their make as being <var>Sony</var> and their model as being
+          <var>Bravia S1000</var> from which the Web page can derive a service type
+          (<var>urn:schemas-upnp-org:service:RenderingControl:1</var>).<br>
+          <br>
+          Once the user has authorized the device, the web page sends a simple mute command according to the messaging
+          format supported by the device.
+        </p>
+        <hr>
+        <pre class="highlight prettyprint"><span class="tag">&lt;select</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"make"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"make"</span><span class="tag">&gt;</span><span class="pln">
+  </span><span class="tag">&lt;option</span><span class="pln"> </span><span class="atn">selected</span><span class="pun">=</span><span class="atv">"selected"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pun">=</span><span class="atv">"disabled"</span><span class="tag">&gt;</span><span class="pln">Select make</span><span class="tag">&lt;/option&gt;</span><span class="pln">
+  </span><span class="tag">&lt;option&gt;</span><span class="pln">Sony</span><span class="tag">&lt;/option&gt;</span><span class="pln">
+  </span><span class="tag">&lt;option&gt;</span><span class="pln">Philips</span><span class="tag">&lt;/option&gt;</span><span class="pln">
+  </span><span class="tag">&lt;option&gt;</span><span class="pln">Alba</span><span class="tag">&lt;/option&gt;</span><span class="pln">
+</span><span class="tag">&lt;/select&gt;</span><span class="pln">
+</span><span class="tag">&lt;select</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"model"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"model"</span><span class="tag">&gt;&lt;/select&gt;</span><span class="pln">
+</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"debugconsole"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">
+
+</span><span class="tag">&lt;script&gt;</span><span class="pln">
+  </span><span class="kwd">var</span><span class="pln"> debug </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'debugconsole'</span><span class="pun">);</span><span class="pln">
+
+  </span><span class="kwd">var</span><span class="pln"> models </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+    </span><span class="str">"Sony"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
+      </span><span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bravia TV S1000"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"upnp"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"service"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"urn:schemas-upnp-org:service:RenderingControl:1"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
+      </span><span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bravia TV S2000"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"zeroconf"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"service"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"_mediarenderer._http._tcp"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
+      </span><span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"HiFi WD10"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"upnp"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"service"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"urn:schemas-upnp-org:service:RenderingControl:1"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
+    </span><span class="pun">],</span><span class="pln">
+    </span><span class="str">"Philips"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="com">/* ... */</span><span class="pln"> </span><span class="pun">],</span><span class="pln">
+    </span><span class="str">"Alba"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="com">/* ... */</span><span class="pln"> </span><span class="pun">]</span><span class="pln">
+  </span><span class="pun">};</span><span class="pln">
+
+  </span><span class="kwd">var</span><span class="pln"> makeEl </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"make"</span><span class="pun">),</span><span class="pln">
+      modelEl </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"model"</span><span class="pun">);</span><span class="pln">
+
+  makeEl</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'change'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+    modelEl</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln"> </span><span class="com">// reset</span><span class="pln">
+    </span><span class="kwd">var</span><span class="pln"> defaultOption </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"option"</span><span class="pun">);</span><span class="pln">
+    defaultOption</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Select model"</span><span class="pun">;</span><span class="pln">
+    defaultOption</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"disabled"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"disabled"</span><span class="pun">);</span><span class="pln">
+    defaultOption</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"selected"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"selected"</span><span class="pun">);</span><span class="pln">
+    modelEl</span><span class="pun">.</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">defaultOption</span><span class="pun">);</span><span class="pln">
+    </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> l </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">[</span><span class="pln">makeEl</span><span class="pun">.</span><span class="pln">value</span><span class="pun">].</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> l</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      </span><span class="kwd">var</span><span class="pln"> option </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">"option"</span><span class="pun">);</span><span class="pln">
+      option</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">[</span><span class="pln">makeEl</span><span class="pun">.</span><span class="pln">value</span><span class="pun">][</span><span class="pln">i</span><span class="pun">][</span><span class="str">"name"</span><span class="pun">];</span><span class="pln">
+      option</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"value"</span><span class="pun">,</span><span class="pln"> models</span><span class="pun">[</span><span class="pln">makeEl</span><span class="pun">.</span><span class="pln">value</span><span class="pun">][</span><span class="pln">i</span><span class="pun">][</span><span class="str">"type"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">":"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> models</span><span class="pun">[</span><span class="pln">makeEl</span><span class="pun">.</span><span class="pln">value</span><span class="pun">][</span><span class="pln">i</span><span class="pun">][</span><span class="str">"service"</span><span class="pun">]);</span><span class="pln">
+      modelEl</span><span class="pun">.</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">option</span><span class="pun">);</span><span class="pln">
+    </span><span class="pun">}</span><span class="pln">
+  </span><span class="pun">},</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
+
+  modelEl</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'change'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">navigator</span><span class="pun">.</span><span class="pln">getNetworkServices </span><span class="pun">&amp;&amp;</span><span class="pln">
+         modelEl</span><span class="pun">.</span><span class="pln">value </span><span class="pun">==</span><span class="pln"> </span><span class="str">"upnp:urn:schemas-upnp-org:service:RenderingControl:1"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      </span><span class="kwd">var</span><span class="pln"> servicesPromise </span><span class="pun">=</span><span class="pln"> navigator</span><span class="pun">.</span><span class="pln">getNetworkServices</span><span class="pun">(</span><span class="pln">modelEl</span><span class="pun">.</span><span class="pln">value</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="pln">successCallback</span><span class="pun">,</span><span class="pln"> errorCallback</span><span class="pun">);</span><span class="pln">
+    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">modelEl</span><span class="pun">.</span><span class="pln">value </span><span class="pun">==</span><span class="pln"> </span><span class="str">"zeroconf:_mediarenderer._http._tcp"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;Service type is not implemented by this application."</span><span class="pun">;</span><span class="pln">
+    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;Service Discovery is not supported!"</span><span class="pun">;</span><span class="pln">
+    </span><span class="pun">}</span><span class="pln">
+  </span><span class="pun">},</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
+</span><span class="tag">&lt;/script&gt;</span><span class="pln">
+
+</span><span class="tag">&lt;script&gt;</span><span class="pln">
+  </span><span class="kwd">function</span><span class="pln"> successCallback</span><span class="pun">(</span><span class="pln"> services </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+
+  </span><span class="com">// Listen for service push notification messages</span><span class="pln">
+
+    services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'notify'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> msg </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+         debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" event received: "</span><span class="pun">;</span><span class="pln">
+         debug</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">+=</span><span class="pln"> msg</span><span class="pun">.</span><span class="pln">data</span><span class="pun">;</span><span class="pln">
+    </span><span class="pun">},</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
+
+ </span><span class="com">// Send a control signal to mute the service audio</span><span class="pln">
+
+    </span><span class="kwd">var</span><span class="pln"> svcXhr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XMLHttpRequest</span><span class="pun">();</span><span class="pln">
+    svcXhr</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="str">"POST"</span><span class="pun">,</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">url</span><span class="pun">);</span><span class="pln"> </span><span class="com">// services[0].url and its</span><span class="pln">
+                                          </span><span class="com">// sub-resources have been whitelisted for</span><span class="pln">
+                                          </span><span class="com">// cross-site XHR use in this current</span><span class="pln">
+                                          </span><span class="com">// browsing context.</span><span class="pln">
+
+    svcXhr</span><span class="pun">.</span><span class="pln">setRequestHeader</span><span class="pun">(</span><span class="str">'SOAPAction'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'urn:schemas-upnp-org:service:RenderingControl:1#SetMute'</span><span class="pun">);</span><span class="pln">
+    svcXhr</span><span class="pun">.</span><span class="pln">setRequestHeader</span><span class="pun">(</span><span class="str">'Content-Type'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'text/xml; charset="utf-8";'</span><span class="pun">);</span><span class="pln">
+
+    svcXhr</span><span class="pun">.</span><span class="pln">onreadystatechange </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> response </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+      </span><span class="kwd">if</span><span class="pun">(</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">readyState </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">status </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">200</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
+        </span><span class="kwd">return</span><span class="pun">;</span><span class="pln">
+      debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" response received: "</span><span class="pun">;</span><span class="pln">
+      debug</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">+=</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">responseXML</span><span class="pun">;</span><span class="pln">
+    </span><span class="pun">}</span><span class="pln">
+
+    </span><span class="com">// Service messaging to mute the provided service</span><span class="pln">
+    </span><span class="kwd">var</span><span class="pln"> svcMsg </span><span class="pun">=</span><span class="pln"> </span><span class="str">'&lt;?xml version="1.0" encoding="utf-8"?&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                 </span><span class="str">'&lt;s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" '</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                   </span><span class="str">'xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                   </span><span class="str">'&lt;s:Body&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                     </span><span class="str">'&lt;u:SetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                       </span><span class="str">'&lt;InstanceID&gt;0&lt;/InstanceID&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                       </span><span class="str">'&lt;Channel&gt;Master&lt;/Channel&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                       </span><span class="str">'&lt;DesiredMute&gt;true&lt;/DesiredMute&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                     </span><span class="str">'&lt;/u:SetMute&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                   </span><span class="str">'&lt;/s:Body&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
+                 </span><span class="str">'&lt;/s:Envelope&gt;'</span><span class="pun">;</span><span class="pln">
+
+    svcXhr</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">svcMsg</span><span class="pun">);</span><span class="pln">
+    debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> services</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">" request sent: "</span><span class="pun">;</span><span class="pln">
+    debug</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">+=</span><span class="pln"> svcMsg</span><span class="pun">;</span><span class="pln">
+  </span><span class="pun">}</span><span class="pln">
+
+  </span><span class="kwd">function</span><span class="pln"> errorCallback</span><span class="pun">(</span><span class="pln"> error </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
+    debug</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;br&gt;An error occurred: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> error</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
+  </span><span class="pun">}</span><span class="pln">
+</span><span class="tag">&lt;/script&gt;</span></pre>
+      </div>
+    </section>
+    <section id="acknowledgements">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_acknowledgements"><span class="secno">B. </span>
+        Acknowledgements
+      </h2>
+      <p>
+        Thanks are expressed by the editor to the following individuals for their feedback on this specification to
+        date (in alphabetical order):<br>
+        <br>
+        Adam Barth, Gar Bergstedt, Robin Berjon, Lars-Erik Bolstad, Marcos Caceres, Cathy Chan, Daniel Danciu,
+        Jean-Claude Dufourd, Mark Foltz, Dominique Hazael-Massieux, Frederick Hirsch, Hari G Kumar, Bob Lund, Giuseppe
+        Pascale, Marcin Simonides, Clarke Stevens, Christian Söderström, Mark Vickers.
+      </p>
+      <p>
+        Thanks are also expressed by the editor to the following organizations and groups for their support in
+        producing this specification to date (in alphabetical order):<br>
+        <br>
+        CableLabs, Google Inc., Opera Software ASA, Nokia Corp., Télécom ParisTech, <abbr title="World Wide Web Consortium">W3C</abbr> Device APIs Working Group, <abbr title="World Wide Web Consortium">W3C</abbr>
+        Web and TV Interest Group.
+      </p>
+    </section>
+    <section id="change-log">
+      <!--OddPage--><h2 aria-level="1" role="heading" id="h2_change-log"><span class="secno">C. </span>
+        Change Log
+      </h2>
+      <p>
+        This section will be removed before final publication.
+      </p>
+      <table class="changelog">
+        <tbody>
+          <tr class="parity0">
+            <td class="age">
+              <i>3 days ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/865b6f93faac"><b>Fix [DAP-ISSUE-134]: Rename NetworkServices and
+                  NetworkService events</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/865b6f93faac/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/865b6f93faac/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/865b6f93faac/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>4 days ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/5e36d90b8960"><b>Replace numeric error codes with string-based
+                  error types and fold the NavigatorNetworkServiceError interface in to DOMError (therefore, removing
+                  NavigatorNetworkServiceError from spec)</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/5e36d90b8960/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/5e36d90b8960/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/5e36d90b8960/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>3 weeks ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/b4b2569b4e9b"><b>Fix [DAP-ISSUE-136]: Issues related to garbage
+                  collection</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/b4b2569b4e9b/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/b4b2569b4e9b/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/b4b2569b4e9b/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>3 weeks ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/fcbaadc4fd54"><b>Fix [DAP-ISSUE-135]: Add security and privacy
+                  considerations section [Network Service Discovery]</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/fcbaadc4fd54/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/fcbaadc4fd54/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/fcbaadc4fd54/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>5 weeks ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/d66ca00fe7d9"><b>Fix minor typo in NSD <abbr title="Application Programming Interface">API</abbr> spec examples</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/d66ca00fe7d9/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/d66ca00fe7d9/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/d66ca00fe7d9/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>5 weeks ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/d25229263a68"><b>Change getNetworkServices <abbr title="Application Programming Interface">API</abbr> + associated
+                  algorithms to use DOM Promises</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/d25229263a68/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/d25229263a68/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/d25229263a68/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>5 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/a3626e492d27"><b>Add WD (29th March 2013) for Network Service
+                  Discovery <abbr title="Application Programming Interface">API</abbr></b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/a3626e492d27/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/a3626e492d27/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/a3626e492d27/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>5 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/8b1d2cd4858d"><b>Fix CSS rendering in NSD spec</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/8b1d2cd4858d/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/8b1d2cd4858d/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/8b1d2cd4858d/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>5 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/19eb703af1c9"><b>Minor editorial changes to NSD spec</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/19eb703af1c9/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/19eb703af1c9/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/19eb703af1c9/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/7d43f1efc56f"><b>Move informative text introducing NSD events to
+                  Introduction section</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/7d43f1efc56f/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/7d43f1efc56f/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/7d43f1efc56f/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/38bf34c08d76"><b>Only set online to true if it was previously
+                  false in Step 3.1.1 of the rule for 'adding an available service'.</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/38bf34c08d76/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/38bf34c08d76/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/38bf34c08d76/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/8621c3c1faf5"><b>Clarify in Section 7.2 that only a UPnP service
+                  type token can be used and the user agent must strip the preceeding string 'upnp:' from that UPnP
+                  service type token before initiating a network search.</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/8621c3c1faf5/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/8621c3c1faf5/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/8621c3c1faf5/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/6211d232766d"><b>Update spec to clarify that devices don't
+                  (necessarily) report themselves as offline</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/6211d232766d/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/6211d232766d/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/6211d232766d/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/f6ad389be556"><b>Update immutability defintion to clarify that
+                  only indexed properties of a NetworkServices object are immutable.</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/f6ad389be556/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/f6ad389be556/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/f6ad389be556/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/abb49f62a775"><b>Clarify the terms 'new service', 'existing
+                  service' and 'current service'</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/abb49f62a775/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/abb49f62a775/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/abb49f62a775/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/89d1cef16d35"><b>Only remove UPnP Events subscription once it is
+                  no longer in use by any active services</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/89d1cef16d35/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/89d1cef16d35/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/89d1cef16d35/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>6 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/a311e7fe116c"><b>Add removal of entry script origin's <abbr title="Uniform Resource Locator">URL</abbr>
+                  whitelist urls during the getNetworkServices() algorithm.</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/a311e7fe116c/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/a311e7fe116c/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/a311e7fe116c/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/631133236bc9"><b>Update 'Network Topology Monitoring' to clarify
+                  that only services discovered via a particular network interface that has now been dropped should be
+                  removed.</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/631133236bc9/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/631133236bc9/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/631133236bc9/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/f290bbd84426"><b>Increment/decrement servicesAvailable in rules
+                  for 'adding an available service' and 'removing an available service' based on the original requested
+                  control types provided in the original getNetworkServices() call (from:
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Oct/0020.html)</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/f290bbd84426/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/f290bbd84426/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/f290bbd84426/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/07e931de937f"><b><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Request processing - ssdp:alive validation
+                  changes</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/07e931de937f/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/07e931de937f/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/07e931de937f/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/bc1d9819cad3"><b>Clarify rules for 'adding an available service'
+                  and 'removing an available service' from
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Oct/0020.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/bc1d9819cad3/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/bc1d9819cad3/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/bc1d9819cad3/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/7639401e21f4"><b>Allow <abbr title="Simple Service Discovery Protocol">SSDP</abbr> service discovery request to issue
+                  an ST header equal to 'ssdp:all', 'upnp:rootdevice' or
+                  urn:schemas-upnp-org:service:serviceType:ver</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/7639401e21f4/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/7639401e21f4/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/7639401e21f4/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/8b03e17da083"><b>Rewrite Step 9 of getNetworkService algorithm
+                  following feedback @ http://lists.w3.org/Archives/Public/public-device-apis/2012Sep/0141.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/8b03e17da083/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/8b03e17da083/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/8b03e17da083/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/e19dc529aacc"><b>Minor editorial changes to <abbr title="Discovery and Launch Protocol">DIAL</abbr> protocol
+                  support section</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/e19dc529aacc/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/e19dc529aacc/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/e19dc529aacc/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>7 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/43b139afeba9"><b>Apply <abbr title="Discovery and Launch Protocol">DIAL</abbr> protocol support patch</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/43b139afeba9/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/43b139afeba9/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/43b139afeba9/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>10 months ago</i>
+            </td>
+            <td>
+              <i>Daniel Danciu</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/78129450e57a"><b>Added <abbr title="Discovery and Launch Protocol">DIAL</abbr> support</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/78129450e57a/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/78129450e57a/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/78129450e57a/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>9 months ago</i>
+            </td>
+            <td>
+              <i>Frederick Hirsch</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/ec6f8e4f894e"><b>update publication date</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/ec6f8e4f894e/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/ec6f8e4f894e/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/ec6f8e4f894e/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/f29ec967fb3b"><b>Editorial updates to NSD spec</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/f29ec967fb3b/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/f29ec967fb3b/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/f29ec967fb3b/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/8b912f2bb9c7"><b>Updates to Service Discovery &amp; Messaging
+                  according to feedback @
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Oct/0005.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/8b912f2bb9c7/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/8b912f2bb9c7/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/8b912f2bb9c7/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/220f3226b2a1"><b>Apply pub rules to proposed Working Draft
+                  update</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/220f3226b2a1/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/220f3226b2a1/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/220f3226b2a1/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/985e203d74f7"><b>Prepare Working Draft for NSD</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/985e203d74f7/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/985e203d74f7/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/985e203d74f7/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/4bb39c70f008"><b>Minor editorial updates</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/4bb39c70f008/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/4bb39c70f008/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/4bb39c70f008/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/7e34654692fc"><b>HTML5 Tidy on Network Service Discovery spec
+                  markup</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/7e34654692fc/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/7e34654692fc/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/7e34654692fc/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/65e14f8dc95d"><b>Editorial changes to Service Discovery
+                  spec</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/65e14f8dc95d/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/65e14f8dc95d/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/65e14f8dc95d/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/32487cf058c5"><b>Add embedded device processing to <abbr title="Simple Service Discovery Protocol">SSDP</abbr>
+                  algorithms + minor editorial updates</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/32487cf058c5/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/32487cf058c5/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/32487cf058c5/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/a0e6b501258d"><b>Updates to Service Discovery &amp; Messaging
+                  according to feedback @
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Aug/0095.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/a0e6b501258d/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/a0e6b501258d/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/a0e6b501258d/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>11 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/3c13dc93cfb1"><b>Re-write of Section 7: Service Discovery
+                  according to feedback @
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Aug/0017.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/3c13dc93cfb1/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/3c13dc93cfb1/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/3c13dc93cfb1/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Anssi Kostiainen</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/5583626294f6"><b>merge heads</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/5583626294f6/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/5583626294f6/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/5583626294f6/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/53f4bfeee4fe"><b>Revert the majority of commit 9e85394e6ede due
+                  to the deletion of files. Please always do 'hg pull' followed by 'hg update' before committing your
+                  own changes to this repo.</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/53f4bfeee4fe/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/53f4bfeee4fe/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/53f4bfeee4fe/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Anssi Kostiainen</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/58fadbd65d13"><b>merge heads, back to one head</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/58fadbd65d13/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/58fadbd65d13/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/58fadbd65d13/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Anssi Kostiainen</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/1c5a2f31a18d"><b>merge heads</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/1c5a2f31a18d/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/1c5a2f31a18d/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/1c5a2f31a18d/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/383c29793d6b"><b>Change 'two services must have the same id' to
+                  'A service...'</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/383c29793d6b/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/383c29793d6b/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/383c29793d6b/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/76074ec7e535"><b>Clean up the UPnP Update Service
+                  Monitor</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/76074ec7e535/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/76074ec7e535/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/76074ec7e535/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/ad608906c611"><b>Minor editorial to Networked Service
+                  Discovery</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/ad608906c611/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/ad608906c611/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/ad608906c611/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/3ecf12df315d"><b>Discovery <abbr title="Application Programming Interface">API</abbr> updates following feedback from
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Aug/0016.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/3ecf12df315d/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/3ecf12df315d/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/3ecf12df315d/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>12 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/5e0da09685f7"><b>Discovery <abbr title="Application Programming Interface">API</abbr> updates following feedback from
+                  http://lists.w3.org/Archives/Public/public-device-apis/2012Aug/0016.html</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/5e0da09685f7/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/5e0da09685f7/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/5e0da09685f7/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>13 months ago</i>
+            </td>
+            <td>
+              <i>Robin Berjon</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/ef42cb5f9a60"><b>validity errors</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/ef42cb5f9a60/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/ef42cb5f9a60/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/ef42cb5f9a60/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>13 months ago</i>
+            </td>
+            <td>
+              <i>Robin Berjon</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/21b44409354f"><b>shortname</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/21b44409354f/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/21b44409354f/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/21b44409354f/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>13 months ago</i>
+            </td>
+            <td>
+              <i>Robin Berjon</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/595192a920a0"><b>FPWD</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/595192a920a0/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/595192a920a0/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/595192a920a0/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity1">
+            <td class="age">
+              <i>13 months ago</i>
+            </td>
+            <td>
+              <i>Robin Berjon</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/a66764a2345e"><b>config tweaks</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/a66764a2345e/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/a66764a2345e/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/a66764a2345e/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+          <tr class="parity0">
+            <td class="age">
+              <i>13 months ago</i>
+            </td>
+            <td>
+              <i>Rich Tibbett</i>
+            </td>
+            <td>
+              <a class="list" href="https://dvcs.w3.org/hg/dap/rev/ee3a89da06e1"><b>First draft of Networked Service Discovery and
+                  Messaging</b></a>
+            </td>
+            <td class="link">
+              <a href="https://dvcs.w3.org/hg/dap/file/ee3a89da06e1/discovery-api/Overview.src.html">file</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/diff/ee3a89da06e1/discovery-api/Overview.src.html">diff</a>&nbsp;|&nbsp;<a href="https://dvcs.w3.org/hg/dap/annotate/ee3a89da06e1/discovery-api/Overview.src.html">annotate</a>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </section>
+
+
+<style>
+  a.externalDFN { color: #00C; border-bottom: 1px dashed #00C; }
+  a.internalDFN { color: #00C; text-decoration: solid; }</style><section id="references" class="appendix" typeof="bibo:Chapter" resource="#references" rel="bibo:chapter"><!--OddPage--><h2 aria-level="1" role="heading" id="h2_references"><span class="secno">D. </span>References</h2><section id="normative-references" typeof="bibo:Chapter" resource="#normative-references" rel="bibo:chapter"><h3 aria-level="2" role="heading" id="h3_normative-references"><span class="secno">D.1 </span>Normative references</h3><dl class="bibliography" about=""><dt id="bib-DNS-SD">[DNS-SD]</dt><dd rel="dcterms:requires">S. Cheshire; M. Krochmal. <a href="http://www.ietf.org/rfc/rfc6763.txt"><cite>DNS-Based Service Discovery</cite></a>. February 2013. RFC. URL: <a href="http://www.ietf.org/rfc/rfc6763.txt">http://www.ietf.org/rfc/rfc6763.txt</a>
+</dd><dt id="bib-DOM4">[DOM4]</dt><dd rel="dcterms:requires">Anne van Kesteren; Aryeh Gregor; Lachlan Hunt; Ms2ger. <a href="http://www.w3.org/TR/dom/"><cite>DOM4</cite></a>. 6 December 2012. W3C Working Draft. URL: <a href="http://www.w3.org/TR/dom/">http://www.w3.org/TR/dom/</a>
+</dd><dt id="bib-HTML5">[HTML5]</dt><dd rel="dcterms:requires">Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Edward O'Connor; Silvia Pfeiffer. <a href="http://www.w3.org/TR/html5/"><cite>HTML5</cite></a>. 6 August 2013. W3C Candidate Recommendation. URL: <a href="http://www.w3.org/TR/html5/">http://www.w3.org/TR/html5/</a>
+</dd><dt id="bib-MDNS">[MDNS]</dt><dd rel="dcterms:requires">S. Cheshire; M. Krochmal. <a href="http://www.ietf.org/rfc/rfc6763.txt"><cite>Multicast DNS</cite></a>. February 2013. RFC. URL: <a href="http://www.ietf.org/rfc/rfc6763.txt">http://www.ietf.org/rfc/rfc6763.txt</a>
+</dd><dt id="bib-RFC2119">[RFC2119]</dt><dd rel="dcterms:requires">S. Bradner. <a href="http://www.ietf.org/rfc/rfc2119.txt"><cite>Key words for use in RFCs to Indicate Requirement Levels.</cite></a> March 1997. Internet RFC 2119.  URL: <a href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt</a>
+</dd><dt id="bib-UPNP-DEVICEARCH11">[UPNP-DEVICEARCH11]</dt><dd rel="dcterms:requires"><a href="http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf"><cite>UPnP Device Architecture 1.1</cite></a>. 15 October 2008. UPnP Forum. PDF document. URL: <a href="http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf</a>
+</dd><dt id="bib-WEBIDL">[WEBIDL]</dt><dd rel="dcterms:requires">Cameron McCormack. <a href="http://www.w3.org/TR/WebIDL/"><cite>Web IDL</cite></a>. 19 April 2012. W3C Candidate Recommendation. URL: <a href="http://www.w3.org/TR/WebIDL/">http://www.w3.org/TR/WebIDL/</a>
+</dd></dl></section></section></body></html>
\ No newline at end of file

Received on Monday, 2 September 2013 19:32:04 UTC