discovery-api/Overview.html
changeset 483 140b6c8d4c18
parent 480 f3ea6558ffe1
child 484 608edb43c84d
equal deleted inserted replaced
482:6968bc039244 483:140b6c8d4c18
   222           property="dcterms:title">
   222           property="dcterms:title">
   223         Network Service Discovery
   223         Network Service Discovery
   224       </h1>
   224       </h1>
   225       <h2 property="dcterms:issued"
   225       <h2 property="dcterms:issued"
   226           datatype="xsd:dateTime"
   226           datatype="xsd:dateTime"
   227           content="2013-10-06T16:06:07.000Z"
   227           content="2013-10-09T14:32:43.000Z"
   228           id="w3c-editor-s-draft-07-october-2013">
   228           id="w3c-editor-s-draft-10-october-2013">
   229         <abbr title="World Wide Web Consortium">W3C</abbr> Editor's Draft <time class="dt-published"
   229         <abbr title="World Wide Web Consortium">W3C</abbr> Editor's Draft <time class="dt-published"
   230             datetime="2013-10-07">07 October 2013</time>
   230             datetime="2013-10-10">10 October 2013</time>
   231       </h2>
   231       </h2>
   232       <dl>
   232       <dl>
   233         <dt>
   233         <dt>
   234           This version:
   234           This version:
   235         </dt>
   235         </dt>
   538       <p>
   538       <p>
   539         The user agent, having captured all advertised services on the network from the <a href=
   539         The user agent, having captured all advertised services on the network from the <a href=
   540         "#dfn-service-discovery-mechanisms"
   540         "#dfn-service-discovery-mechanisms"
   541            class="internalDFN">service discovery mechanisms</a> included in this recommendation, attempts to match the
   541            class="internalDFN">service discovery mechanisms</a> included in this recommendation, attempts to match the
   542            requested service type to a discovered service according to the processing described herein. Only
   542            requested service type to a discovered service according to the processing described herein. Only
   543            Local-networked Services that pass a <a href="#dfn-cors-preflight-check"
   543            Local-networked Services that pass a <a href="#dfn-preliminary-cors-check"
   544            class="internalDFN">CORS preflight check</a> should be made available to web pages by a user agent. A user
   544            class="internalDFN">preliminary CORS check</a> should be made available to web pages by a user agent. A user
   545            agent may provide a way for users to white-list non-CORS enabled Local-networked Services but implementation
   545            agent may provide a way for users to white-list non-CORS enabled Local-networked Services but implementation
   546            of such a feature is left to the discretion of the implementer.
   546            of such a feature is left to the discretion of the implementer.
   547       </p>
   547       </p>
   548       <p>
   548       <p>
   549         If a service connectivity request is successful then the Web page is provided with a promise-based success
   549         If a service connectivity request is successful then the Web page is provided with a promise-based success
   852           "Application Programming Interface">API</abbr> implementations
   852           "Application Programming Interface">API</abbr> implementations
   853         </h3>
   853         </h3>
   854         <p>
   854         <p>
   855           A <a href="#dfn-user-agent"
   855           A <a href="#dfn-user-agent"
   856              class="internalDFN">user agent</a> <em class="rfc2119"
   856              class="internalDFN">user agent</a> <em class="rfc2119"
   857              title="MUST">MUST</em> allow web pages to connect only with Local-networked Services that have passed a
   857              title="SHOULD">SHOULD</em> only allow web pages to connect with Local-networked Services that have passed
   858              <a href="#dfn-cors-preflight-check"
   858              a <a href="#dfn-preliminary-cors-check"
   859              class="internalDFN">CORS preflight check</a> indicating they support Cross-Origin Resource Sharing
   859              class="internalDFN">preliminary CORS check</a> indicating they support Cross-Origin Resource Sharing
   860              [<cite><a class="bibref"
   860              [<cite><a class="bibref"
   861              href="#bib-CORS">CORS</a></cite>] during the <a href="#dfn-service-discovery-mechanisms"
   861              href="#bib-CORS">CORS</a></cite>]. In this way, a <a href="#dfn-user-agent"
   862              class="internalDFN">service discovery mechanisms</a> provided in this specification. In this way, a
       
   863              <a href="#dfn-user-agent"
       
   864              class="internalDFN">user agent</a> <em class="rfc2119"
   862              class="internalDFN">user agent</a> <em class="rfc2119"
   865              title="MUST NOT">MUST NOT</em> allow web pages to access other arbitrary networked services on the current
   863              title="SHOULD NOT">SHOULD NOT</em> allow web pages to access other arbitrary networked services on the
   866              local network.
   864              current local network.
   867         </p>
   865         </p>
   868         <p>
   866         <p>
   869           A <a href="#dfn-user-agent"
   867           A <a href="#dfn-user-agent"
   870              class="internalDFN">user agent</a> <em class="rfc2119"
   868              class="internalDFN">user agent</a> <em class="rfc2119"
   871              title="MAY">MAY</em> provide a way for users to enable access to non-CORS enabled Local-networked Services
   869              title="MAY">MAY</em> provide a way for users to enable access to non-CORS enabled Local-networked Services
  1052             <li>For each <var>available service</var> in the <a href="#dfn-list-of-available-service-records"
  1050             <li>For each <var>available service</var> in the <a href="#dfn-list-of-available-service-records"
  1053                   class="internalDFN">list of available service records</a> run the following steps:
  1051                   class="internalDFN">list of available service records</a> run the following steps:
  1054               <ol class="rule">
  1052               <ol class="rule">
  1055                 <li>For each <var>requested control type</var> in <var>requested control types</var>: If <var>available
  1053                 <li>For each <var>requested control type</var> in <var>requested control types</var>: If <var>available
  1056                 service</var>'s <code>type</code> attribute equals the <var>requested control type</var> then let <var>
  1054                 service</var>'s <code>type</code> attribute equals the <var>requested control type</var> then let <var>
  1057                   matched service</var> equal the value of <var>available service</var> and continue at the step
  1055                   matched service</var> equal the value of <var>available service</var>. Otherwise, abort the remaining
  1058                   labeled <var>attach</var> below.
  1056                   sub-steps and continue above at the next <var>available service</var>.
  1059                 </li>
  1057                 </li>
  1060                 <li>Continue at the next <var>available service</var>.
  1058                 <li>If <var>matched service</var> is not empty then run the following steps:
  1061                 </li>
       
  1062                 <li>
       
  1063                   <em>Attach</em>: If <var>matched service</var> is not empty then run the following steps:
       
  1064                   <ol class="rule">
  1059                   <ol class="rule">
       
  1060                     <li>Let <var>CORS check result</var> be the result of running the <a href=
       
  1061                     "#dfn-preliminary-cors-check"
       
  1062                           class="internalDFN">preliminary CORS check</a> algorithm, passing in <var>matched
       
  1063                           services</var>'s <code>url</code> attribute as the <var>control endpoint URL</var> argument
       
  1064                           and the <a href=
       
  1065                           "http://www.whatwg.org/specs/web-apps/current-work/complete/browsers.html#entry-script"
       
  1066                           class="externalDFN">entry script</a>'s <a href=
       
  1067                           "http://www.whatwg.org/specs/web-apps/current-work/complete/origin-0.html#origin"
       
  1068                           class="externalDFN">origin</a> as the <var>request origin</var> argument.
       
  1069                     </li>
       
  1070                     <li>If <var>CORS check result</var> is not <code>pass</code> and <var>matched service</var>'s
       
  1071                     <code>type</code> attribute is also not present in the <a href="#dfn-network-services-whitelist"
       
  1072                           class="internalDFN">network services whitelist</a> then abort the remaining sub-steps and
       
  1073                           continue above at the next <var>available service</var>.
       
  1074                     </li>
  1065                     <li>Let <var>new service object</var> be a new <a href=
  1075                     <li>Let <var>new service object</var> be a new <a href=
  1066                     "#networkservice"><code>NetworkService</code></a> object, mapping the parameters of <var>matched
  1076                     "#networkservice"><code>NetworkService</code></a> object, mapping the parameters of <var>matched
  1067                     service</var> to this new object where possible.
  1077                     service</var> to this new object where possible.
  1068                     </li>
  1078                     </li>
  1069                     <li>Append <var>new service object</var> to the <var>services found</var> array.
  1079                     <li>Append <var>new service object</var> to the <var>services found</var> array.
  1189                class="externalDFN">tasks</a> is the <a href=
  1199                class="externalDFN">tasks</a> is the <a href=
  1190                "http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#user-interaction-task-source"
  1200                "http://www.whatwg.org/specs/web-apps/current-work/complete/webappapis.html#user-interaction-task-source"
  1191                class="externalDFN">user interaction task source</a>.
  1201                class="externalDFN">user interaction task source</a>.
  1192           </p>
  1202           </p>
  1193           <p>
  1203           <p>
       
  1204             The <dfn id="dfn-preliminary-cors-check">preliminary CORS check</dfn> algorithm determines whether a
       
  1205             Local-networked Service supports Cross-Origin Resource Sharing [<cite><a class="bibref"
       
  1206                href="#bib-CORS">CORS</a></cite>] as part of a call to the <a href=
       
  1207                "#dom-navigator-getnetworkservices"><code>getNetworkServices()</code></a> method, prior to that service
       
  1208                being proposed for sharing to users and prior to active sharing with web pages. This algorithm takes two
       
  1209                arguments, <var>control endpoint URL</var> and <var>request origin</var>, and consists of running the
       
  1210                following steps:
       
  1211           </p>
       
  1212           <ol class="rule">
       
  1213             <li>Let <var>CORS available check</var> be the result of applying the <a href=
       
  1214             "http://www.w3.org/TR/cors/#make-a-request-steps"
       
  1215                   class="externalDFN">make a request steps</a> [<cite><a class="bibref"
       
  1216                  href="#bib-CORS">CORS</a></cite>], setting the <a href="http://www.w3.org/TR/cors/#request-method"
       
  1217                   class="externalDFN">request method</a> to <code>OPTIONS</code>, the <a href=
       
  1218                   "http://www.w3.org/TR/cors/#request-url"
       
  1219                   class="externalDFN">request URL</a> to <var>control endpoint URL</var>, the <a href=
       
  1220                   "http://www.w3.org/TR/cors/#source-origin"
       
  1221                   class="externalDFN">source origin</a> to <var>request origin</var>, setting the <a href=
       
  1222                   "http://www.w3.org/TR/cors/#omit-credentials-flag"
       
  1223                   class="externalDFN">omit credentials flag</a> to <code>true</code> and including an <a href=
       
  1224                   "http://www.w3.org/TR/cors/#http-access-control-request-method"
       
  1225                   class="externalDFN"><code>Access-Control-Request-Method</code></a> header with a value of
       
  1226                   <code>GET</code>.
       
  1227             </li>
       
  1228             <li>If <var>CORS available check</var> is cancelled by the user, or it results in a network error, or its
       
  1229             response does not have an <abbr title="Hypertext Transfer Protocol">HTTP</abbr> status code of
       
  1230             <code>200</code> then abort any remaining steps and return <code>fail</code>.
       
  1231             </li>
       
  1232             <li>Return the result of running the <a href="http://www.w3.org/TR/cors/#resource-sharing-check"
       
  1233                   class="externalDFN">resource sharing check</a> [<cite><a class="bibref"
       
  1234                  href="#bib-CORS">CORS</a></cite>] against the successful <abbr title=
       
  1235                  "Hypertext Transfer Protocol">HTTP</abbr> response of the <var>CORS available check</var>.
       
  1236               <div class="note">
       
  1237                 <div class="note-title"
       
  1238                      aria-level="3"
       
  1239                      role="heading"
       
  1240                      id="h_note_1">
       
  1241                   <span>Note</span>
       
  1242                 </div>
       
  1243                 <p class="">
       
  1244                   This returned result will always be either <code>pass</code> or <code>fail</code>.
       
  1245                 </p>
       
  1246               </div>
       
  1247             </li>
       
  1248           </ol>
       
  1249           <p>
  1194             There is no implied persistence to networked service sharing provided to a web page. It <em class="rfc2119"
  1250             There is no implied persistence to networked service sharing provided to a web page. It <em class="rfc2119"
  1195                title="MUST NOT">MUST NOT</em> be possible to access a previously white-listed networked service without
  1251                title="MUST NOT">MUST NOT</em> be possible to access a networked service previously granted to a web
  1196                user authorization in all of the following cases:
  1252                page without user authorization in all of the following cases:
  1197           </p>
  1253           </p>
  1198           <ul>
  1254           <ul>
  1199             <li>If the current script is reloaded at any point in the same or different window.
  1255             <li>If the current script is reloaded at any point in the same or different window.
  1200             </li>
  1256             </li>
  1201             <li>if the current script reinvokes the <a href=
  1257             <li>if the current script reinvokes the <a href=
  1394         </p>
  1450         </p>
  1395         <div class="note">
  1451         <div class="note">
  1396           <div class="note-title"
  1452           <div class="note-title"
  1397                aria-level="3"
  1453                aria-level="3"
  1398                role="heading"
  1454                role="heading"
  1399                id="h_note_1">
  1455                id="h_note_2">
  1400             <span>Note</span>
  1456             <span>Note</span>
  1401           </div>
  1457           </div>
  1402           <p class="">
  1458           <p class="">
  1403             Each service in a <a href="#networkservices"><code>NetworkServices</code></a> object thus has an index; the
  1459             Each service in a <a href="#networkservices"><code>NetworkServices</code></a> object thus has an index; the
  1404             first has the index 0, and each subsequent service is numbered one higher than the previous one.
  1460             first has the index 0, and each subsequent service is numbered one higher than the previous one.
  1895            class="internalDFN">user agent</a> <em class="rfc2119"
  1951            class="internalDFN">user agent</a> <em class="rfc2119"
  1896            title="SHOULD">SHOULD</em> run the rule for <a href="#dfn-removing-an-available-service"
  1952            title="SHOULD">SHOULD</em> run the rule for <a href="#dfn-removing-an-available-service"
  1897            class="internalDFN">removing an available service</a>, passing in the expired service record's
  1953            class="internalDFN">removing an available service</a>, passing in the expired service record's
  1898            <code>id</code> attribute as the only argument.
  1954            <code>id</code> attribute as the only argument.
  1899       </p>
  1955       </p>
  1900       <p>
       
  1901         The <dfn id="dfn-cors-preflight-check">CORS preflight check</dfn> algorithm determines whether a
       
  1902         Local-networked Service supports Cross-Origin Resource Sharing [<cite><a class="bibref"
       
  1903            href="#bib-CORS">CORS</a></cite>] prior to that service being proposed for sharing to users and prior to
       
  1904            active sharing with web pages. This algorithm takes one argument, <var>control endpoint URL</var>, and
       
  1905            consists of running the following steps:
       
  1906       </p>
       
  1907       <ol class="rule">
       
  1908         <li>Let <var>cross-origin request status</var> be set to the resulting value of <a href=
       
  1909         "http://www.w3.org/TR/cors/#cross-origin-request-status"
       
  1910               class="externalDFN">cross-origin request status</a> [<cite><a class="bibref"
       
  1911              href="#bib-CORS">CORS</a></cite>] after performing a <a href=
       
  1912              "http://www.w3.org/TR/cors/#cross-origin-request-with-preflight"
       
  1913               class="externalDFN">cross-origin request with preflight</a> [<cite><a class="bibref"
       
  1914              href="#bib-CORS">CORS</a></cite>] towards the <var>control endpoint URL</var> with the <a href=
       
  1915              "http://www.w3.org/TR/cors/#source-origin"
       
  1916               class="externalDFN">source origin</a> [<cite><a class="bibref"
       
  1917              href="#bib-CORS">CORS</a></cite>] set to the public IP address of the current machine, terminating this
       
  1918              algorithm at Step 2 (when <a href="http://www.w3.org/TR/cors/#cross-origin-request-status"
       
  1919               class="externalDFN">cross-origin request status</a> has been set to <var>preflight complete</var> or a
       
  1920               prior error has occurred in the algorithm).
       
  1921         </li>
       
  1922         <li>If <var>cross-origin request status</var> is set to <var>preflight complete</var> then return
       
  1923         <code>pass</code>. Otherwise, return <code>fail</code>.
       
  1924         </li>
       
  1925       </ol>
       
  1926       <p>
       
  1927         User agents <em class="rfc2119"
       
  1928            title="SHOULD">SHOULD</em> re-run the <a href="#dfn-cors-preflight-check"
       
  1929            class="internalDFN">CORS preflight check</a> algorithm against service endpoint URLs when their <a href=
       
  1930            "http://www.w3.org/TR/cors/#cache-max-age"
       
  1931            class="externalDFN">max-age</a> [<cite><a class="bibref"
       
  1932            href="#bib-CORS">CORS</a></cite>] entry in the <a href="http://www.w3.org/TR/cors/#preflight-result-cache"
       
  1933            class="externalDFN">preflight result cache</a> [<cite><a class="bibref"
       
  1934            href="#bib-CORS">CORS</a></cite>] exceeds the current time. If this subsequent execution of the <a href=
       
  1935            "#dfn-cors-preflight-check"
       
  1936            class="internalDFN">CORS preflight check</a> algorithm returns <code>fail</code> then the <a href=
       
  1937            "#dfn-user-agent"
       
  1938            class="internalDFN">user agent</a> <em class="rfc2119"
       
  1939            title="MUST">MUST</em> run the general rule for <a href="#dfn-removing-an-available-service"
       
  1940            class="internalDFN">removing an available service</a> passing in the associated <var>network service
       
  1941            record</var>'s <code>id</code> attribute as the only argument.
       
  1942       </p>
       
  1943       <section id="zeroconf-mdns-dns-sd">
  1956       <section id="zeroconf-mdns-dns-sd">
  1944         <h3 aria-level="2"
  1957         <h3 aria-level="2"
  1945             role="heading"
  1958             role="heading"
  1946             id="h3_zeroconf-mdns-dns-sd">
  1959             id="h3_zeroconf-mdns-dns-sd">
  1947           <span class="secno">8.1</span> Zeroconf (<abbr title="Multicast DNS">mDNS</abbr> + <abbr title=
  1960           <span class="secno">8.1</span> Zeroconf (<abbr title="Multicast DNS">mDNS</abbr> + <abbr title=
  1997                    href="#bib-DNS-SD">DNS-SD</a></cite>].
  2010                    href="#bib-DNS-SD">DNS-SD</a></cite>].
  1998               </li>
  2011               </li>
  1999               <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
  2012               <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
  2000               current date, in UTC timestamp format, plus a value of <code>120</code> seconds.
  2013               current date, in UTC timestamp format, plus a value of <code>120</code> seconds.
  2001               </li>
  2014               </li>
  2002               <li>If the result of running the <a href="#dfn-cors-preflight-check"
  2015               <li>Run the general rule for <a href="#dfn-adding-an-available-service"
  2003                     class="internalDFN">CORS preflight check</a> algorithm is <code>pass</code>, passing in the current
       
  2004                     <var>network service record</var>'s <code>url</code> property as the only argument, or the current
       
  2005                     <var>network service record</var>'s <code>type</code> property is present in the <a href=
       
  2006                     "#dfn-network-services-whitelist"
       
  2007                     class="internalDFN">network services whitelist</a> then run the general rule for <a href=
       
  2008                     "#dfn-adding-an-available-service"
       
  2009                     class="internalDFN">adding an available service</a>, passing in the current <var>network service
  2016                     class="internalDFN">adding an available service</a>, passing in the current <var>network service
  2010                     record</var> as the only argument. Otherwise, discard the current <var>network service
  2017                     record</var> as the only argument.
  2011                     record</var>.
       
  2012               </li>
  2018               </li>
  2013             </ol>
  2019             </ol>
  2014           </li>
  2020           </li>
  2015         </ol>
  2021         </ol>
  2016       </section>
  2022       </section>
  2246               Otherwise, do not set <var>network service record</var>'s <code>eventsUrl</code> property.
  2252               Otherwise, do not set <var>network service record</var>'s <code>eventsUrl</code> property.
  2247               </li>
  2253               </li>
  2248               <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
  2254               <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
  2249               current date, in UTC timestamp format, plus the value of <var>device expiry</var>.
  2255               current date, in UTC timestamp format, plus the value of <var>device expiry</var>.
  2250               </li>
  2256               </li>
  2251               <li>If the result of running the <a href="#dfn-cors-preflight-check"
  2257               <li>Run the general rule for <a href="#dfn-adding-an-available-service"
  2252                     class="internalDFN">CORS preflight check</a> algorithm is <code>pass</code>, passing in the current
       
  2253                     <var>network service record</var>'s <code>url</code> property as the only argument, or the current
       
  2254                     <var>network service record</var>'s <code>type</code> property is present in the <a href=
       
  2255                     "#dfn-network-services-whitelist"
       
  2256                     class="internalDFN">network services whitelist</a> then run the general rule for <a href=
       
  2257                     "#dfn-adding-an-available-service"
       
  2258                     class="internalDFN">adding an available service</a>, passing in the current <var>network service
  2258                     class="internalDFN">adding an available service</a>, passing in the current <var>network service
  2259                     record</var> as the only argument. Otherwise, discard the current <var>network service
  2259                     record</var> as the only argument.
  2260                     record</var>.
       
  2261               </li>
  2260               </li>
  2262             </ol>
  2261             </ol>
  2263           </li>
  2262           </li>
  2264           <li>If <var>device descriptor file</var> contains a <code>&lt;deviceList&gt;</code> element then for each
  2263           <li>If <var>device descriptor file</var> contains a <code>&lt;deviceList&gt;</code> element then for each
  2265           <code>&lt;device&gt;</code> element within <code>&lt;deviceList&gt;</code> - herein known as an <var>embedded
  2264           <code>&lt;device&gt;</code> element within <code>&lt;deviceList&gt;</code> - herein known as an <var>embedded
  2550               <var>application url</var>.
  2549               <var>application url</var>.
  2551               </li>
  2550               </li>
  2552               <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
  2551               <li>Set <var>network service record</var>'s <code>expiryTimestamp</code> property to the value of the
  2553               current date, in UTC timestamp format, plus the value of <var>device expiry</var>.
  2552               current date, in UTC timestamp format, plus the value of <var>device expiry</var>.
  2554               </li>
  2553               </li>
  2555               <li>If the result of running the <a href="#dfn-cors-preflight-check"
  2554               <li>Run the general rule for <a href="#dfn-adding-an-available-service"
  2556                     class="internalDFN">CORS preflight check</a> algorithm is <code>pass</code>, passing in the current
       
  2557                     <var>network service record</var>'s <code>url</code> property as the only argument, or the current
       
  2558                     <var>network service record</var>'s <code>type</code> property is present in the <a href=
       
  2559                     "#dfn-network-services-whitelist"
       
  2560                     class="internalDFN">network services whitelist</a> then run the general rule for <a href=
       
  2561                     "#dfn-adding-an-available-service"
       
  2562                     class="internalDFN">adding an available service</a>, passing in the current <var>network service
  2555                     class="internalDFN">adding an available service</a>, passing in the current <var>network service
  2563                     record</var> as the only argument. Otherwise, discard the current <var>network service
  2556                     record</var> as the only argument.
  2564                     record</var>.
       
  2565               </li>
  2557               </li>
  2566             </ol>
  2558             </ol>
  2567           </li>
  2559           </li>
  2568         </ol>
  2560         </ol>
  2569       </section>
  2561       </section>
  2708       </p>
  2700       </p>
  2709       <div class="note">
  2701       <div class="note">
  2710         <div class="note-title"
  2702         <div class="note-title"
  2711              aria-level="2"
  2703              aria-level="2"
  2712              role="heading"
  2704              role="heading"
  2713              id="h_note_2">
  2705              id="h_note_3">
  2714           <span>Note</span>
  2706           <span>Note</span>
  2715         </div>
  2707         </div>
  2716         <p class="">
  2708         <p class="">
  2717           For example, if a <a href="#networkservices"
  2709           For example, if a <a href="#networkservices"
  2718              class="internalDFN"><code>NetworkServices</code></a> object has one or more <a href=
  2710              class="internalDFN"><code>NetworkServices</code></a> object has one or more <a href=
  3274         <br>
  3266         <br>
  3275         CableLabs, Google Inc., Opera Software ASA, Nokia Corp., Télécom ParisTech, <abbr title=
  3267         CableLabs, Google Inc., Opera Software ASA, Nokia Corp., Télécom ParisTech, <abbr title=
  3276         "World Wide Web Consortium">W3C</abbr> Device APIs Working Group, <abbr title=
  3268         "World Wide Web Consortium">W3C</abbr> Device APIs Working Group, <abbr title=
  3277         "World Wide Web Consortium">W3C</abbr> Web and TV Interest Group.
  3269         "World Wide Web Consortium">W3C</abbr> Web and TV Interest Group.
  3278       </p>
  3270       </p>
  3279     </section><style>
  3271     </section>
  3280 a.externalDFN { color: #00C; border-bottom: 1px dashed #00C; }
       
  3281     a.internalDFN { color: #00C; text-decoration: solid; }
       
  3282     </style>
       
  3283     <section id="references"
  3272     <section id="references"
  3284              class="appendix"
  3273              class="appendix"
  3285              typeof="bibo:Chapter"
  3274              typeof="bibo:Chapter"
  3286              resource="#references"
  3275              resource="#references"
  3287              rel="bibo:chapter">
  3276              rel="bibo:chapter">
  3385             Scenarios</cite></a>. 1 December 2011. W3C Note. URL: <a href=
  3374             Scenarios</cite></a>. 1 December 2011. W3C Note. URL: <a href=
  3386             "http://www.w3.org/TR/hnreq/">http://www.w3.org/TR/hnreq/</a>
  3375             "http://www.w3.org/TR/hnreq/">http://www.w3.org/TR/hnreq/</a>
  3387           </dd>
  3376           </dd>
  3388         </dl>
  3377         </dl>
  3389       </section>
  3378       </section>
  3390     </section>
  3379     </section><style>
       
  3380 a.externalDFN { color: #00C; border-bottom: 1px dashed #00C; }
       
  3381     a.internalDFN { color: #00C; text-decoration: solid; }
       
  3382     </style>
  3391   </body>
  3383   </body>
  3392 </html>
  3384 </html>