--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/spec/Overview.html Wed Jan 04 15:09:25 2012 -0800
@@ -0,0 +1,1002 @@
+<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
+<html lang="en" dir="ltr">
+<head>
+ <title>Web Intents</title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+ <!--
+ === NOTA BENE ===
+ For the three scripts below, if your spec resides on dev.w3 you can check them
+ out in the same tree and use relative links so that they'll work offline,
+ -->
+
+
+
+ <style type="text/css">
+/*****************************************************************
+ * ReSpec CSS
+ * Robin Berjon (robin at berjon dot com)
+ * v0.05 - 2009-07-31
+ *****************************************************************/
+
+
+/* --- 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;
+}
+
+code {
+ color: #ff4500;
+}
+
+
+/* --- WEB IDL --- */
+pre.idl {
+ border-top: 1px solid #90b8de;
+ border-bottom: 1px solid #90b8de;
+ padding: 1em;
+ line-height: 120%;
+}
+
+pre.idl::before {
+ content: "WebIDL";
+ display: block;
+ width: 150px;
+ background: #90b8de;
+ color: #fff;
+ font-family: initial;
+ padding: 3px;
+ font-weight: bold;
+ margin: -1em 0 1em -1em;
+}
+
+.idlType {
+ color: #ff4500;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+/*.idlModule*/
+/*.idlModuleID*/
+/*.idlInterface*/
+.idlInterfaceID, .idlDictionaryID {
+ font-weight: bold;
+ color: #005a9c;
+}
+
+.idlSuperclass {
+ font-style: italic;
+ color: #005a9c;
+}
+
+/*.idlAttribute*/
+.idlAttrType, .idlFieldType, .idlMemberType {
+ color: #005a9c;
+}
+.idlAttrName, .idlFieldName, .idlMemberName {
+ color: #ff4500;
+}
+.idlAttrName a, .idlFieldName a, .idlMemberName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlMethod*/
+.idlMethType {
+ color: #005a9c;
+}
+.idlMethName {
+ color: #ff4500;
+}
+.idlMethName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlParam*/
+.idlParamType {
+ color: #005a9c;
+}
+.idlParamName {
+ font-style: italic;
+}
+
+.extAttr {
+ color: #666;
+}
+
+/*.idlConst*/
+.idlConstType {
+ color: #005a9c;
+}
+.idlConstName {
+ color: #ff4500;
+}
+.idlConstName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlException*/
+.idlExceptionID {
+ font-weight: bold;
+ color: #c00;
+}
+
+.idlTypedefID, .idlTypedefType {
+ color: #005a9c;
+}
+
+.idlRaises, .idlRaises a.idlType, .idlRaises a.idlType code, .excName a, .excName a code {
+ color: #c00;
+ font-weight: normal;
+}
+
+.excName a {
+ font-family: monospace;
+}
+
+.idlRaises a.idlType, .excName a.idlType {
+ border-bottom: 1px dotted #c00;
+}
+
+.excGetSetTrue, .excGetSetFalse, .prmNullTrue, .prmNullFalse, .prmOptTrue, .prmOptFalse {
+ width: 45px;
+ text-align: center;
+}
+.excGetSetTrue, .prmNullTrue, .prmOptTrue { color: #0c0; }
+.excGetSetFalse, .prmNullFalse, .prmOptFalse { color: #c00; }
+
+.idlImplements a {
+ font-weight: bold;
+}
+
+dl.attributes, dl.methods, dl.constants, dl.fields, dl.dictionary-members {
+ margin-left: 2em;
+}
+
+.attributes dt, .methods dt, .constants dt, .fields dt, .dictionary-members dt {
+ font-weight: normal;
+}
+
+.attributes dt code, .methods dt code, .constants dt code, .fields dt code, .dictionary-members dt code {
+ font-weight: bold;
+ color: #000;
+ font-family: monospace;
+}
+
+.attributes dt code, .fields dt code, .dictionary-members dt code {
+ background: #ffffd2;
+}
+
+.attributes dt .idlAttrType code, .fields dt .idlFieldType code, .dictionary-members dt .idlMemberType code {
+ color: #005a9c;
+ background: transparent;
+ font-family: inherit;
+ font-weight: normal;
+ font-style: italic;
+}
+
+.methods dt code {
+ background: #d9e6f8;
+}
+
+.constants dt code {
+ background: #ddffd2;
+}
+
+.attributes dd, .methods dd, .constants dd, .fields dd, .dictionary-members dd {
+ margin-bottom: 1em;
+}
+
+table.parameters, table.exceptions {
+ border-spacing: 0;
+ border-collapse: collapse;
+ margin: 0.5em 0;
+ width: 100%;
+}
+table.parameters { border-bottom: 1px solid #90b8de; }
+table.exceptions { border-bottom: 1px solid #deb890; }
+
+.parameters th, .exceptions th {
+ color: #fff;
+ padding: 3px 5px;
+ text-align: left;
+ font-family: initial;
+ font-weight: normal;
+ text-shadow: #666 1px 1px 0;
+}
+.parameters th { background: #90b8de; }
+.exceptions th { background: #deb890; }
+
+.parameters td, .exceptions td {
+ padding: 3px 10px;
+ border-top: 1px solid #ddd;
+ vertical-align: top;
+}
+
+.parameters tr:first-child td, .exceptions tr:first-child td {
+ border-top: none;
+}
+
+.parameters td.prmName, .exceptions td.excName, .exceptions td.excCodeName {
+ width: 100px;
+}
+
+.parameters td.prmType {
+ width: 120px;
+}
+
+table.exceptions table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+
+/* --- TOC --- */
+.toc a {
+ text-decoration: none;
+}
+
+a .secno {
+ color: #000;
+}
+
+/* --- 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;
+}
+
+/* --- EXAMPLES --- */
+pre.example {
+ border-top: 1px solid #ff4500;
+ border-bottom: 1px solid #ff4500;
+ padding: 1em;
+ margin-top: 1em;
+}
+
+pre.example::before {
+ content: "Example";
+ display: block;
+ width: 150px;
+ background: #ff4500;
+ color: #fff;
+ font-family: initial;
+ padding: 3px;
+ font-weight: bold;
+ margin: -1em 0 1em -1em;
+}
+
+/* --- EDITORIAL NOTES --- */
+.issue {
+ padding: 1em;
+ margin: 1em 0em 0em;
+ border: 1px solid #f00;
+ background: #ffc;
+}
+
+.issue::before {
+ content: "Issue";
+ display: block;
+ width: 150px;
+ margin: -1.5em 0 0.5em 0;
+ font-weight: bold;
+ border: 1px solid #f00;
+ background: #fff;
+ padding: 3px 1em;
+}
+
+.note {
+ margin: 1em 0em 0em;
+ padding: 1em;
+ border: 2px solid #cff6d9;
+ background: #e2fff0;
+}
+
+.note::before {
+ content: "Note";
+ display: block;
+ width: 150px;
+ margin: -1.5em 0 0.5em 0;
+ font-weight: bold;
+ border: 1px solid #cff6d9;
+ background: #fff;
+ padding: 3px 1em;
+}
+
+/* --- Best Practices --- */
+div.practice {
+ border: solid #bebebe 1px;
+ margin: 2em 1em 1em 2em;
+}
+
+span.practicelab {
+ margin: 1.5em 0.5em 1em 1em;
+ font-weight: bold;
+ font-style: italic;
+}
+
+span.practicelab { background: #dfffff; }
+
+span.practicelab {
+ position: relative;
+ padding: 0 0.5em;
+ top: -1.5em;
+}
+
+p.practicedesc {
+ margin: 1.5em 0.5em 1em 1em;
+}
+
+@media screen {
+ p.practicedesc {
+ position: relative;
+ top: -2em;
+ padding: 0;
+ margin: 1.5em 0.5em -1em 1em;
+ }
+}
+
+/* --- SYNTAX HIGHLIGHTING --- */
+pre.sh_sourceCode {
+ background-color: white;
+ color: black;
+ font-style: normal;
+ font-weight: normal;
+}
+
+pre.sh_sourceCode .sh_keyword { color: #005a9c; font-weight: bold; } /* language keywords */
+pre.sh_sourceCode .sh_type { color: #666; } /* basic types */
+pre.sh_sourceCode .sh_usertype { color: teal; } /* user defined types */
+pre.sh_sourceCode .sh_string { color: red; font-family: monospace; } /* strings and chars */
+pre.sh_sourceCode .sh_regexp { color: orange; font-family: monospace; } /* regular expressions */
+pre.sh_sourceCode .sh_specialchar { color: #ffc0cb; font-family: monospace; } /* e.g., \n, \t, \\ */
+pre.sh_sourceCode .sh_comment { color: #A52A2A; font-style: italic; } /* comments */
+pre.sh_sourceCode .sh_number { color: purple; } /* literal numbers */
+pre.sh_sourceCode .sh_preproc { color: #00008B; font-weight: bold; } /* e.g., #include, import */
+pre.sh_sourceCode .sh_symbol { color: blue; } /* e.g., *, + */
+pre.sh_sourceCode .sh_function { color: black; font-weight: bold; } /* function calls and declarations */
+pre.sh_sourceCode .sh_cbracket { color: red; } /* block brackets (e.g., {, }) */
+pre.sh_sourceCode .sh_todo { font-weight: bold; background-color: #00FFFF; } /* TODO and FIXME */
+
+/* Predefined variables and functions (for instance glsl) */
+pre.sh_sourceCode .sh_predef_var { color: #00008B; }
+pre.sh_sourceCode .sh_predef_func { color: #00008B; font-weight: bold; }
+
+/* for OOP */
+pre.sh_sourceCode .sh_classname { color: teal; }
+
+/* line numbers (not yet implemented) */
+pre.sh_sourceCode .sh_linenum { display: none; }
+
+/* Internet related */
+pre.sh_sourceCode .sh_url { color: blue; text-decoration: underline; font-family: monospace; }
+
+/* for ChangeLog and Log files */
+pre.sh_sourceCode .sh_date { color: blue; font-weight: bold; }
+pre.sh_sourceCode .sh_time, pre.sh_sourceCode .sh_file { color: #00008B; font-weight: bold; }
+pre.sh_sourceCode .sh_ip, pre.sh_sourceCode .sh_name { color: #006400; }
+
+/* for Prolog, Perl... */
+pre.sh_sourceCode .sh_variable { color: #006400; }
+
+/* for LaTeX */
+pre.sh_sourceCode .sh_italics { color: #006400; font-style: italic; }
+pre.sh_sourceCode .sh_bold { color: #006400; font-weight: bold; }
+pre.sh_sourceCode .sh_underline { color: #006400; text-decoration: underline; }
+pre.sh_sourceCode .sh_fixed { color: green; font-family: monospace; }
+pre.sh_sourceCode .sh_argument { color: #006400; }
+pre.sh_sourceCode .sh_optionalargument { color: purple; }
+pre.sh_sourceCode .sh_math { color: orange; }
+pre.sh_sourceCode .sh_bibtex { color: blue; }
+
+/* for diffs */
+pre.sh_sourceCode .sh_oldfile { color: orange; }
+pre.sh_sourceCode .sh_newfile { color: #006400; }
+pre.sh_sourceCode .sh_difflines { color: blue; }
+
+/* for css */
+pre.sh_sourceCode .sh_selector { color: purple; }
+pre.sh_sourceCode .sh_property { color: blue; }
+pre.sh_sourceCode .sh_value { color: #006400; font-style: italic; }
+
+/* other */
+pre.sh_sourceCode .sh_section { color: black; font-weight: bold; }
+pre.sh_sourceCode .sh_paren { color: red; }
+pre.sh_sourceCode .sh_attribute { color: #006400; }
+
+</style><link href="http://www.w3.org/StyleSheets/TR/W3C-ED" rel="stylesheet" type="text/css" charset="utf-8"></head>
+ <body style="display: inherit; "><div id="StayFocusd-infobar" style="display: none; top: 1792px; "><img src="chrome-extension://laankejkbhbdhmipfmgcngdelahlfoji/img/eye_19x19_red.png"><span id="StayFocusd-infobar-msg"></span><span id="StayFocusd-infobar-links"><a href="#" id="StayFocusd-infobar-never-show">hide forever</a> | <a href="#" id="StayFocusd-infobar-hide">hide once</a></span></div><div class="head"><p><a href="http://www.w3.org/"><img width="72" height="48" src="http://www.w3.org/Icons/w3c_home" alt="W3C"></a></p><h1 class="title" id="title">Web Intents</h1><h2 id="w3c-editor-s-draft-04-january-2012"><acronym title="World Wide Web Consortium">W3C</acronym> Editor's Draft 04 January 2012</h2><dl><dt>This version:</dt><dd><a href="http://dev.w3.org/2011/webapps/TODO.html">http://dev.w3.org/2011/webapps/TODO.html</a></dd><dt>Latest published version:</dt><dd><a href="http://www.w3.org/TR/web-intents/">http://www.w3.org/TR/web-intents/</a></dd><dt>Latest editor's draft:</dt><dd><a href="http://dev.w3.org/2011/webapps/TODO.html">http://dev.w3.org/2011/webapps/TODO.html</a></dd><dt>Previous version:</dt><dd>none</dd><dt>Editors:</dt><dd><span>Greg Billock</span>, <a href="http://google.com/">Google</a></dd>
+<dd><span>James Hawkins</span>, <a href="http://google.com/">Google</a></dd>
+<dd><span>Paul Kinlan</span>, <a href="http://google.com/">Google</a></dd>
+</dl><p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 2012 <a href="http://www.w3.org/"><acronym title="World Wide Web Consortium">W3C</acronym></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>, <a href="http://www.ercim.eu/"><acronym title="European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. <acronym title="World Wide Web Consortium">W3C</acronym> <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>
+ <div id="abstract" class="introductory section"><h2>Abstract</h2>
+ <p>
+ This specification defines a service discovery and light-weight RPC
+ mechanism for web apps called Web Intents.
+ </p>
+ <p>
+ This document defines DOM interfaces and markup used by client and service
+ pages to create, receive, and reply to Web Intents messages, and the
+ procedures the User Agent carries out to facilitate that process.
+ </p>
+ </div><div id="sotd" class="introductory section"><h2>Status of This Document</h2><p><em>This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current <acronym title="World Wide Web Consortium">W3C</acronym> publications and the latest revision of this technical report can be found in the <a href="http://www.w3.org/TR/"><acronym title="World Wide Web Consortium">W3C</acronym> technical reports index</a> at http://www.w3.org/TR/.</em></p><p>This document was published by the <a href="http://www.w3.org/2008/webapps/">Web Applications (WebApps) Working Group</a> as an Editor's Draft. If you wish to make comments regarding this document, please send them to <a href="mailto:public-web-intents@w3.org">public-web-intents@w3.org</a> (<a href="mailto:public-web-intents-request@w3.org?subject=subscribe">subscribe</a>, <a href="http://lists.w3.org/Archives/Public/public-web-intents/">archives</a>). All feedback is welcome.</p><p>Publication as an Editor's Draft does not imply endorsement by the <acronym title="World Wide Web Consortium">W3C</acronym> Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.</p><p>This document was produced by a group operating under the <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 <acronym title="World Wide Web Consortium">W3C</acronym> Patent Policy</a>. <acronym title="World Wide Web Consortium">W3C</acronym> maintains a <a href="TODO" rel="disclosure">public list of any patent disclosures</a> made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential Claim(s)</a> must disclose the information in accordance with <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section 6 of the <acronym title="World Wide Web Consortium">W3C</acronym> Patent Policy</a>.</p></div><div id="toc" class="section"><h2 class="introductory">Table of Contents</h2><ul class="toc"><li class="tocline"><a href="#introduction" class="tocxref"><span class="secno">1. </span>Introduction</a><ul class="toc"><li class="tocline"><a href="#example" class="tocxref"><span class="secno">1.1 </span>Example</a></li></ul></li><li class="tocline"><a href="#terminology" class="tocxref"><span class="secno">2. </span>Terminology</a><ul class="toc"><li class="tocline"><a href="#actors" class="tocxref"><span class="secno">2.1 </span>Actors</a></li><li class="tocline"><a href="#life-cycle-of-intents" class="tocxref"><span class="secno">2.2 </span>Life cycle of intents</a></li></ul></li><li class="tocline"><a href="#api-description" class="tocxref"><span class="secno">3. </span>API Description</a><ul class="toc"><li class="tocline"><a href="#intent-object" class="tocxref"><span class="secno">3.1 </span>Intent object</a><ul class="toc"><li class="tocline"><a href="#attributes" class="tocxref"><span class="secno">3.1.1 </span>Attributes</a></li><li class="tocline"><a href="#methods" class="tocxref"><span class="secno">3.1.2 </span>Methods</a></li></ul></li><li class="tocline"><a href="#invocation-api" class="tocxref"><span class="secno">3.2 </span>Invocation API</a><ul class="toc"><li class="tocline"><a href="#methods-1" class="tocxref"><span class="secno">3.2.1 </span>Methods</a></li></ul></li><li class="tocline"><a href="#delivery-and-response-api" class="tocxref"><span class="secno">3.3 </span>Delivery and Response API</a><ul class="toc"><li class="tocline"><a href="#attributes-1" class="tocxref"><span class="secno">3.3.1 </span>Attributes</a></li></ul></li><li class="tocline"><a href="#registration-markup" class="tocxref"><span class="secno">3.4 </span>Registration Markup</a></li></ul></li><li class="tocline"><a href="#user-agent-behavior" class="tocxref"><span class="secno">4. </span>User Agent Behavior</a></li><li class="tocline"><a href="#use-cases-and-requirements" class="tocxref"><span class="secno">5. </span>Use Cases and Requirements</a><ul class="toc"><li class="tocline"><a href="#sharing" class="tocxref"><span class="secno">5.1 </span>Sharing</a></li><li class="tocline"><a href="#integration-with-local-web-apps" class="tocxref"><span class="secno">5.2 </span>Integration with local web apps</a></li><li class="tocline"><a href="#persistent-connections" class="tocxref"><span class="secno">5.3 </span>Persistent connections</a></li><li class="tocline"><a href="#integration-with-external-applications" class="tocxref"><span class="secno">5.4 </span>Integration with external applications</a></li><li class="tocline"><a href="#translating-existing-web-platform-features-to-intents" class="tocxref"><span class="secno">5.5 </span>Translating existing web platform features to intents</a></li><li class="tocline"><a href="#authentication" class="tocxref"><span class="secno">5.6 </span>Authentication</a></li></ul></li><li class="tocline"><a href="#acknowledgements" class="tocxref"><span class="secno">A. </span>Acknowledgements</a></li><li class="tocline"><a href="#references" class="tocxref"><span class="secno">B. </span>References</a><ul class="toc"><li class="tocline"><a href="#normative-references" class="tocxref"><span class="secno">B.1 </span>Normative references</a></li><li class="tocline"><a href="#informative-references" class="tocxref"><span class="secno">B.2 </span>Informative references</a></li></ul></li></ul></div>
+
+ <div id="introduction" class="section">
+ <!--OddPage--><h2><span class="secno">1. </span>Introduction</h2>
+ <p>
+ Web Intents enable rich integration between web
+ applications. Increasingly, services available on the web have a need to
+ pass rich data back and forth as they do their jobs. Web Intents
+ facilitate this interchange while maintaining the kind of loose coupling
+ and open architecture that has proven so advantageous for the web. They
+ exist purely client-side, mediated through the User Agent, allowing the
+ user a great degree of control over the security and privacy of the
+ exchanged data.
+ </p>
+ <p>
+ An Intent is an action to be performed by a service. It consists of an
+ "action" string which tells the service what kind of activity the user
+ expects to be performed (i.e. "share" or "edit"), a "type" string which
+ specifies the data payload the service should expect, and the data payload
+ itself.
+ </p>
+ <p>
+ A client requests an Intent be handled, the User Agent allows the
+ user to select which service to use, and the service performs the action
+ of the Intent, possibly using data passed as input in the Intent.
+ The service may return data as output to the client.
+ </p>
+ <p>
+ Web Intents provides a declarative syntax that allows
+ services to list the Intents they handle. Using this method, pages mark
+ up what actions they can handle what data types they expect.
+ </p>
+ <div id="example" class="section">
+ <h3><span class="secno">1.1 </span>Example</h3>
+ <p>
+ Suppose there is a photo hosting application. This application allows a
+ user to select images to be shared, edit those images, and then share them
+ with friends. The application is built around making photos available to
+ users, but has no built-in editor or sharing interface. But beside each
+ photo, it can place an <b>Edit</b> button, with this kind of accompanying
+ code:
+ </p>
+ <pre class="example">document.getElementById('edit-photo').onclick = function() {
+ var intent = new Intent("http://webintents.org/edit",
+ "text/uri-list;type=image/jpeg",
+ getImageDataURI(...));
+ navigator.startActivity(intent, imageEdited);
+});
+
+function imageEdited(data) {
+ document.getElementById('image').src = data;
+}</pre>
+ <p>
+ This assumes an image editor exists which can consume images specified as
+ URIs (including data URIs), and produces a result in the same format. For
+ instance, one such editor might be a meme-maker—an application allowing
+ the user to place humorous messages on top of pictures they take.
+ </p>
+ <p>
+ Now that a picture has been selected and meme text added, the user
+ undoubtedly wants to share the result with friends. Again, the photo
+ hosting application may not have built-in sharing capabilities, but by
+ adding a "share" button near images, and with this kind of accompany code,
+ it can accomplish this integration:
+ </p>
+ <pre class="example">document.getElementById('share-photo').onclick = function() {
+ var intent = new Intent("http://webintents.org/share",
+ "text/uri-list;type=image/jpeg",
+ getPublicURIForImage(...));
+ navigator.startActivity(intent);
+});</pre>
+ <p>
+ Note that with this integration, other more high-minded services can be
+ selected by the user as well. Instead of using the service to add funny
+ captions, the user can utilize a sophisticated photo editing application
+ to adjust exposure, remove red-eye, or do any number of other
+ transformations on the image. The user can have many such tools
+ registered, and choose any of that set to use at any given time. The photo
+ hosting application isn't controlling which such application any given
+ user uses, it is loosely coupled with such appliations by providing the
+ data necessary for them to carry out their task and controls allowing the
+ user to launch these activities on the data.
+ </p>
+ <p>
+ On the service page, it needs to register itself as a service, and
+ handle the incoming intent data, possibly producing a response. That is
+ done with this kind of code:
+ </p>
+ <pre class="example"><html>
+<head>
+<title>Image Meme Editor</title>
+</head>
+<body>
+<intent action="http://webintents.org/edit" type="text/uri-list;type=image/*,image/*"></intent>
+<script>
+ window.onload = function() {
+ if (window.intent) {
+ setImageContentURI(window.intent.data);
+ }
+ }
+
+ document.getElementById('save-button').onclick = function() {
+ window.intent.postReply(getImageDataURI(...));
+ }
+</script></pre>
+ <p>
+ The assumed pieces here are functions which deal with the application's
+ image display, for instance putting the image into a canvas and taking it back out
+ again as a data URI.
+ </p>
+ </div>
+ </div>
+
+ <div id="terminology" class="section">
+ <!--OddPage--><h2><span class="secno">2. </span>Terminology</h2>
+ <p>
+ An <dfn id="dfn-intent">Intent</dfn> is an action with accompanying data, which is to be
+ performed by a Service of the user's choosing.
+ </p>
+ <div id="actors" class="section">
+ <h3><span class="secno">2.1 </span>Actors</h3>
+ <p>
+ A <dfn id="dfn-client">Client</dfn> is a web page which creates an intent and invokes
+ it.
+ </p>
+ <p>
+ A <dfn id="dfn-service">Service</dfn> is a web page which can handle a Web Intent,
+ possibly returning a piece of data to the calling Client page.
+ </p>
+ </div>
+ <div id="life-cycle-of-intents" class="section">
+ <h3><span class="secno">2.2 </span>Life cycle of intents</h3>
+ <p>
+ <dfn id="dfn-registration">Registration</dfn> is how a Service page informs the User Agent
+ that it is capable of handling Intents.
+ </p>
+ <p>
+ <dfn id="dfn-invocation">Invocation</dfn> refers to the API by which a Client page
+ dispatches an intent for handling.
+ </p>
+ <p>
+ <dfn id="dfn-selection">Selection</dfn> is the mechanism in which the User Agent decides
+ which service will handle a particular intent.
+ </p>
+ <p>
+ <dfn id="dfn-delivery">Delivery</dfn> is the means by which the User Agent hands intent
+ data to a Service page for handling.
+ </p>
+ <p>
+ <dfn id="dfn-response">Response</dfn> is the means in which the Service can respond to an
+ Intent by passing data back through the User Agent to the Client page.
+ </p>
+ </div>
+ </div>
+
+ <div id="api-description" class="section">
+ <!--OddPage--><h2><span class="secno">3. </span>API Description</h2>
+
+ <div id="intent-object" class="section">
+ <h3><span class="secno">3.1 </span>Intent object</h3>
+ <p>
+ The client requests a specific intent handler and optionally sends in a callback to
+ receive data from the service. The browser mediates the service selection by
+ enumerating the list of registered services that match the requested
+ intent action and type. The user is then able to select which service should handle the intent.
+ </p>
+ <pre class="idl"><span class="idlInterface" id="idl-def-Intent">[<span class="extAttr">Constructor(in string action, in string type, in any data)</span>]
+interface <span class="idlInterfaceID">Intent</span> {
+<span class="idlAttribute"> readonly attribute <span class="idlAttrType"><a>DOMString</a></span> <span class="idlAttrName"><a href="#widl-Intent-action">action</a></span>;</span>
+<span class="idlAttribute"> readonly attribute <span class="idlAttrType"><a>DOMString</a></span> <span class="idlAttrName"><a href="#widl-Intent-type">type</a></span>;</span>
+<span class="idlAttribute"> readonly attribute <span class="idlAttrType"><a>any</a></span> <span class="idlAttrName"><a href="#widl-Intent-data">data</a></span>;</span>
+<span class="idlMethod"> <span class="idlMethType"><a>void</a></span> <span class="idlMethName"><a href="#widl-Intent-postResult-void-any-data">postResult</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">data</span></span>);</span>
+<span class="idlMethod"> <span class="idlMethType"><a>void</a></span> <span class="idlMethName"><a href="#widl-Intent-postFailure-void-any-data">postFailure</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">data</span></span>);</span>
+};</span>
+</pre><div id="attributes" class="section"><h4><span class="secno">3.1.1 </span>Attributes</h4><dl class="attributes"><dt id="widl-Intent-action"><code>action</code> of type <span class="idlAttrType"><a>DOMString</a></span>, readonly</dt><dd>This is an opaque string. Chosen strings <em class="rfc2119" title="should">should</em> be namespaced by a
+ URL namespace convention.<div><em>No exceptions.</em></div></dd><dt id="widl-Intent-data"><code>data</code> of type <span class="idlAttrType"><a>any</a></span>, readonly</dt><dd>The object used <em class="rfc2119" title="must">must</em> be a Transferable or an object upon which the
+ structured clone algorithm can be performed.<div><em>No exceptions.</em></div></dd><dt id="widl-Intent-type"><code>type</code> of type <span class="idlAttrType"><a>DOMString</a></span>, readonly</dt><dd>The data payload <em class="rfc2119" title="must">must</em> be described by the type parameter.
+ Recommended type strings are MIME strings and self-documenting urls.<div><em>No exceptions.</em></div></dd></dl></div><div id="methods" class="section"><h4><span class="secno">3.1.2 </span>Methods</h4><dl class="methods"><dt id="widl-Intent-postFailure-void-any-data"><code>postFailure</code></dt><dd>The payload passed to this method will be returned to the onFailure
+ callback registered by the client page in the startActivity call (if any).
+ The playload must be a Transferable object upon which the structured
+ clone algorithm can be performed.<table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">data</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc"></td></tr></table><div><em>No exceptions.</em></div><div><em>Return type: </em><code><a>void</a></code></div></dd><dt id="widl-Intent-postResult-void-any-data"><code>postResult</code></dt><dd>The payload passed to this method will be returned to the onSuccess
+ callback registered by the client page in the startActivity call (if any).
+ The payload must be a Transferable object [<cite><a class="bibref" rel="biblioentry" href="#bib-HTML5">HTML5</a></cite>] upon which the structured
+ clone algorithm can be performed.<table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">data</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc"></td></tr></table><div><em>No exceptions.</em></div><div><em>Return type: </em><code><a>void</a></code></div></dd></dl></div>
+ </div>
+
+ <div id="invocation-api" class="section">
+ <h3><span class="secno">3.2 </span>Invocation API</h3>
+ <p>
+ The client invokes an intent by constructing an object as above and invoking
+ a <code>navigator.startActivity</code> function on it. The callbacks are invoked when
+ the intent has been handled.
+ </p>
+ <pre class="idl"><span class="idlInterface" id="idl-def-Intents">[<span class="extAttr">NoInterfaceObject</span>]
+interface <span class="idlInterfaceID">Intents</span> {
+<span class="idlMethod"> <span class="idlMethType"><a>void</a></span> <span class="idlMethName"><a href="#widl-Intents-startActivity-void-Intent-intent--onSuccess--onFailure">startActivity</a></span> (<span class="idlParam"><span class="idlParamType"><a href="#idl-def-Intent" class="idlType"><code>Intent</code></a></span> <span class="idlParamName">intent</span></span>, <span class="idlParam">optional <span class="idlParamType"><a></a></span> <span class="idlParamName">onSuccess</span></span>, <span class="idlParam">optional <span class="idlParamType"><a></a></span> <span class="idlParamName">onFailure</span></span>);</span>
+};</span>
+</pre><div id="methods-1" class="section"><h4><span class="secno">3.2.1 </span>Methods</h4><dl class="methods"><dt id="widl-Intents-startActivity-void-Intent-intent--onSuccess--onFailure"><code>startActivity</code></dt><dd>Called to invoke an intent service. The intent object is described
+ above. The onSuccess handler, if any, will be called by the user agent if
+ the service is dispatched, processes the intent, and calls postResult on
+ the intent object it receives. The handler will be invoked with one
+ parameter: the data received from the service.
+ The onFailure handler, if any, will be called by the user agent if
+ the service cannot be dispatched, if the user aborts the selection
+ process, or if a service was chosen, received the intent, processes the intent,
+ and calls postFailure on the intent object it receives. The handler will be invoked with one
+ parameter: the data received from the service.
+ <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">intent</td><td class="prmType"><code><a href="#idl-def-Intent" class="idlType"><code>Intent</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc"></td></tr><tr><td class="prmName">onSuccess</td><td class="prmType"><code><a></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc"></td></tr><tr><td class="prmName">onFailure</td><td class="prmType"><code><a></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc"></td></tr></table><div><em>No exceptions.</em></div><div><em>Return type: </em><code><a>void</a></code></div></dd></dl></div>
+ <p>
+ The invocation API is implemented by the <code>window.navigator</code> object.
+ </p>
+ <pre class="idl"><span class="idlImplements"><a>Navigator</a> implements <a href="#idl-def-Intents" class="idlType"><code>Intents</code></a>;</span></pre><div class="idlImplementsDesc"><p>All instances of the <code><a>Navigator</a></code> type are defined to also implement the <a href="#idl-def-Intents" class="idlType"><code>Intents</code></a> interface.</p></div>
+ </div>
+
+ <div id="delivery-and-response-api" class="section">
+ <h3><span class="secno">3.3 </span>Delivery and Response API</h3>
+ <p>
+ When the user agent loads a service page to handle an intent invocation, it
+ will place a <code>window.intent</code> object in the scope of the page.
+ </p>
+
+ <pre class="idl"><span class="idlInterface" id="idl-def-IntentProvider">[<span class="extAttr">NoInterfaceObject</span>]
+interface <span class="idlInterfaceID">IntentProvider</span> {
+<span class="idlAttribute"> readonly attribute <span class="idlAttrType"><a href="#idl-def-Intent" class="idlType"><code>Intent</code></a></span> <span class="idlAttrName"><a href="#widl-IntentProvider-intent">intent</a></span>;</span>
+};</span>
+</pre><div id="attributes-1" class="section"><h4><span class="secno">3.3.1 </span>Attributes</h4><dl class="attributes"><dt id="widl-IntentProvider-intent"><code>intent</code> of type <span class="idlAttrType"><a href="#idl-def-Intent" class="idlType"><code>Intent</code></a></span>, readonly</dt><dd>The intent object as delivered to the service page.<div><em>No exceptions.</em></div></dd></dl></div>
+ <pre class="idl"><span class="idlImplements"><a>DOMWindow</a> implements <a href="#idl-def-IntentProvider" class="idlType"><code>IntentProvider</code></a>;</span></pre><div class="idlImplementsDesc"><p>All instances of the <code><a>DOMWindow</a></code> type are defined to also implement the <a href="#idl-def-IntentProvider" class="idlType"><code>IntentProvider</code></a> interface.</p></div>
+
+ <p>
+ This object will only be made available to service pages when they are
+ loaded in the context of an intent invocation. In other situations, the User
+ Agent <em class="rfc2119" title="must not">must not</em> make <code>DOMWindow</code> implement
+ <code>IntentProvider</code>.
+ </p>
+ <p>
+ The <code>window.intent</code> object <em class="rfc2119" title="must">must</em> be made available across
+ same-origin redirects of the service page. It <em class="rfc2119" title="must not">must not</em> be available if
+ redirects cross a same-origin boundary.
+ </p>
+ <p>
+ So the following redirect sequence
+ will work: http://example.com/service to http://example.com/login back to
+ http://example.com/service. In this case, the <code>window.intent</code>
+ data would be available to all three page loads.
+ </p>
+ <p>
+ This will also work: http://example.com/service to
+ http://example.com/newservice. In this sequence, the <code>window.intent</code>
+ data is available to both pages.
+ </p>
+ <p>
+ In this sequence, the <code>window.intent</code> is only available to
+ example.com pages: http://example.com/service to http://login.example.com
+ and back to http://example.com/service. The intent data is not provided to
+ http://login.example.com
+ </p>
+ <p>
+ In other words, in the browsing context in which the intent is originally
+ delivered, the intent data <em class="rfc2119" title="must">must</em> be available to pages in a redirect sequence
+ when they are in the same origin as that to which it was originally
+ delivered, but <em class="rfc2119" title="must not">must not</em> be available to any other pages. If the user navigates to a
+ different URL, even within the same origin, the intent data <em class="rfc2119" title="must not">must not</em> be made
+ available.
+ </p>
+ </div>
+
+ <div id="registration-markup" class="section">
+ <h3><span class="secno">3.4 </span>Registration Markup</h3>
+ <p>
+ Service pages declaratively mark themselves as providing handling
+ functionality for particular intent actions and types. A User Agent <em class="rfc2119" title="must not">must not</em>
+ deliver an intent to a page which is not described in its metadata
+ describing what intents it can handle. The algorithm for matching intents is
+ that the action string provided in invocation and registration must match
+ exactly, and the type strings must match exactly except for possible [<cite><a class="bibref" rel="biblioentry" href="#bib-RFC2046">RFC2046</a></cite>]
+ MIME subtype wildcards.
+ </p><pre> <!ENTITY % Disposition "{window|inline}">
+
+ <!ELEMENT INTENT - O EMPTY -- a Web Intents registration →
+ <!ATTLIST INTENT
+ action %URI; #<em class="rfc2119" title="required">required</em> -- URI specifying action --
+ type %ContentTypes,%URI; #<em class="rfc2119" title="required">required</em> -- advisory content type --
+ href %URI; #IMPLIED -- URI for linked resource --
+ title %i18n; #IMPLIED -- service title --
+ disposition %Disposition "window" -- where the service is created --
+ >
+ </pre>
+ <p></p>
+ <p>
+ The <code>dispositon</code> attribute allows a service to choose which
+ context to be opened in. The User Agent <em class="rfc2119" title="must not">must not</em> allow the client any
+ ability to change the disposition. The <code>window</code> disposition means
+ that the service is opened in a new tab or window context. The
+ <code>inline</code> disposition means that the User Agent <em class="rfc2119" title="should">should</em> open the
+ service in a context directly related to the client page context in an
+ overlappable way. The User Agent <em class="rfc2119" title="must not">must not</em> allow this UI surface to be
+ under the control of the client page.
+ </p>
+ <p>
+ The User Agent <em class="rfc2119" title="should">should</em> discard any registration markup which is not
+ same-origin.
+ </p>
+ </div>
+
+ </div>
+
+ <div id="user-agent-behavior" class="section">
+ <!--OddPage--><h2><span class="secno">4. </span>User Agent Behavior</h2>
+ <p>
+ When the User Agent loads a page with registration markup, it <em class="rfc2119" title="should">should</em> allow
+ the user to configure that page as a web intents service. The details of
+ this process is left up to the User Agent. The model is that the page
+ advises of the ability to handle intents, and the User Agent may remember
+ that, but
+ </p>
+ <p>
+ The User Agent <em class="rfc2119" title="must not">must not</em> allow web pages the ability to discover passively
+ which services the user has configured to handler particular intents,
+ or any intents, whether by enumeration or exact query. There may be
+ mechanisms for the user to actively grant this information to web pages,
+ but it <em class="rfc2119" title="must not">must not</em> be made available passively.
+ </p>
+ <p>
+ The User Agent <em class="rfc2119" title="may">may</em> provide additional mechanisms for web intents service
+ registration. For example, by external applications, through a separate
+ API, as a result of a permissions bundle in a downloaded web application,
+ or pre-bundled.
+ </p>
+ <p>
+ For intents invoked by client web applications, the User Agent <em class="rfc2119" title="must">must</em>
+ require that such invocations be directly caused by a user gesture. User
+ Agents <em class="rfc2119" title="may">may</em> also dispatch intents invoked through other mechanisms. For
+ example, hardware events (i.e. plugging in a USB storage device) or
+ software events (i.e. downloading a file).
+ </p>
+ <p>
+ When a client page invokes an intent, the User Agent dispatches it to a
+ chosen service. The details of this process are left up to the User Agent.
+ The User Agent may dispatch intents to web application service pages,
+ helper applications, proxy them through connections to other hardware,
+ etc. In general, though, the User Agent <em class="rfc2119" title="must">must</em> provide a way for the user
+ to configure which intents are delivered to which services. This process
+ <em class="rfc2119" title="should">should</em> be configurable on a per-invocation basis for most intents,
+ although defaulting rules, as long as they are configurable by the user,
+ are expected to mean that the User Agent need not present specific UI
+ controls on every invocation.
+ </p>
+ <p>
+ When the User Agent delivers an intent payload to a web application, it
+ <em class="rfc2119" title="must">must</em> make the <code>window.intent</code> object available as the document
+ is loaded and parsed, so that scripts on the page may process the intent
+ data as they load. User agents <em class="rfc2119" title="must not">must not</em> place a <code>window.intent</code>
+ object in the scope of pages which do not have registration metadata
+ declaring themselves as intent handlers. This means that any use of
+ <code>window.intent</code> in pages which do not explicitly declare
+ themselves as web intents handlers <em class="rfc2119" title="must not">must not</em> be overwritten by the User
+ Agent.
+ </p>
+ <p>
+ When a new context is opened for the service page, the User Agent <em class="rfc2119" title="must">must</em>
+ connect the <code>postResult</code> and <code>postFailure</code> methods
+ of the <code>window.intent</code> object so that they return their
+ serializable payloads to the registered handlers the User Agent received
+ in the invoking <code>navigator.startActivity</code> call. If the user
+ closes the service page before it has responded, the User Agent <em class="rfc2119" title="should">should</em>
+ invoke the <code>onFailure</code> callback in the client page invocation,
+ if any. If the user cancels a service selection UI control the User Agent
+ displays in the course of dispatching an intent, the User Agent <em class="rfc2119" title="should">should</em>
+ invoke the <code>onFailure</code> callback in the client page invocation,
+ if any.
+ </p>
+ <p>
+ The User Agent <em class="rfc2119" title="should">should</em> allow any serializable object to be passed between
+ client to service and back from service to client. This includes Blobs [<cite><a class="bibref" rel="biblioentry" href="#bib-BLOB">BLOB</a></cite>],
+ MessagePorts, etc. The User Agent <em class="rfc2119" title="may">may</em> inspect the payload of intents and
+ present specialized UI corresponding to well-known intent types. The User
+ Agent <em class="rfc2119" title="must not">must not</em> categorically prohibit dispatch of unknown intent types.
+ This is not meant to prohibit the User Agent from performing filtering
+ functions on intents, such as suppressing unwanted intent invocations,
+ intents as used as an attack vector, and other mis-use.
+ </p>
+ <p>
+ In the same way User Agents <em class="rfc2119" title="may">may</em> dispatch intents caused by non-web
+ mechanisms to web applications, User Agents <em class="rfc2119" title="may">may</em> dispatch intents invoked by
+ web applications to handlers which are not web applications. In those
+ cases, the User Agent <em class="rfc2119" title="should">should</em> provide a public API mechanism for external
+ connection to the intent dispatch mechanism selected. For example, the
+ User Agent may be able to run an Operating System level command in
+ response to an intent. The User Agent could provide a configuration
+ interface such that the user can install handler applications, and a
+ documented format in which intent payload data is translated to that
+ application. In these cases, the requirement that User Agents <em class="rfc2119" title="should">should</em> pass
+ any serializable object may need to be relaxed for some kinds of handlers.
+ </p>
+ <p>
+ User Agents <em class="rfc2119" title="may">may</em> also dispatch intents based on data-specific controls
+ derived from microdata in pages. For instance, if the user has services
+ registered which handle text/vcard, then the User Agent may provide the
+ user with a way to invoke particular intents that consume such data as it
+ detects it in web pages.
+ </p>
+ <p>
+ If the user has no services registered for a particular type of intent,
+ the User Agent <em class="rfc2119" title="may">may</em> display options from other sources of data about
+ services it knows can handle that intent type so that the user can
+ complete the activity.
+ </p>
+ </div>
+
+ <div id="use-cases-and-requirements" class="section">
+ <!--OddPage--><h2><span class="secno">5. </span>Use Cases and Requirements</h2>
+ <div id="sharing" class="section">
+ <h3><span class="secno">5.1 </span>Sharing</h3>
+ <p>
+ Web Intents should be useful to enable to share content as they
+ encounter it on web pages. Whether by implicit controls made available
+ by the User Agent or explicit controls placed in web pages, Web Intents
+ should handle the use case of a user wishing to share a page as a whole,
+ or particular content on the page. The user should be able to select the
+ sharing application of choice to accomplish this task.
+ </p>
+ </div>
+ <div id="integration-with-local-web-apps" class="section">
+ <h3><span class="secno">5.2 </span>Integration with local web apps</h3>
+ <p>
+ Local web apps should be able to invoke and handle intents.
+ </p>
+ </div>
+ <div id="persistent-connections" class="section">
+ <h3><span class="secno">5.3 </span>Persistent connections</h3>
+ <p>
+ Web Intents invocations are modeled on RPC, but there are times when a
+ persistent connection is desired. There are a few different methods that
+ Web Intents should support for this. One is returning URIs which can be
+ loaded by clients in an iframe and then messaged using other web
+ platform features. Another is returning a defaulting token which the
+ client can then use to target other intents directly at a known target.
+ A third is returning a MessagePort to the client which can be used for
+ subsequent communication.
+ </p>
+ <p>
+ In these cases, Web Intents is acting as a way for the user to attach a
+ particular client page to a persistently-available service. It is up to
+ the particular types of intents to describe exactly how this should
+ work. i.e. whether the connection is permanent or temporary, whether
+ tokens are user-consumable or opaque.
+ </p>
+ </div>
+ <div id="integration-with-external-applications" class="section">
+ <h3><span class="secno">5.4 </span>Integration with external applications</h3>
+ <p>
+ It should be possible for intents to be routed to external helper
+ applications. For instance, a locally available photo editing tool could
+ be configured to interact with the browser to handle an image edit
+ intent. Or the browser could discover home networking equipment on the
+ local network and make it available for particular types of intents.
+ </p>
+ </div>
+ <div id="translating-existing-web-platform-features-to-intents" class="section">
+ <h3><span class="secno">5.5 </span>Translating existing web platform features to intents</h3>
+ <p>
+ It should be possible to translate a few existing features to use Web
+ Intents, thus putting web applications on the same footing as local
+ resources. For instance, it should be possible for the User Agent to
+ translate file selection controls to intents such that the use can
+ choose to upload a file from a cloud storage locker as well as from
+ local disk. In these cases, the User Agent may supply built-in intent
+ handlers corresponding to existing functionality.
+ </p>
+ <p>
+ Another use case is allowing web applications to function as plug-ins.
+ For example, a link returning a resource of a type which the user agent
+ doesn't know how to display can be translated into an intent which
+ allows the user to configure a web application capable of reading that
+ resource type and viewing it. This would let web apps function as
+ plug-ins.
+ </p>
+ </div>
+ <div id="authentication" class="section">
+ <h3><span class="secno">5.6 </span>Authentication</h3>
+ <p>
+ It is expected that many services for Web Intents will be ones the user
+ has an account with. The service should be able to use standard login
+ mechanisms in the context the User Agent places them within to perform
+ authentication. That is, the service page handling an intent should be
+ loaded with the same cookie jar and access to localStorage, etc. with
+ which it runs in a normal browsing context. Intent data should be
+ persisted by the User Agent across login redirects.
+ </p>
+ </div>
+ </div>
+
+ <div class="appendix section" id="acknowledgements">
+ <!--OddPage--><h2><span class="secno">A. </span>Acknowledgements</h2>
+ <p>
+ Many thanks to Robin Berjon for making our lives so much easier with his cool tool.
+ </p>
+ <p>
+ See also <a href="http://www.webintents.org/">webintents.org</a> for
+ more examples and a sample Javascript implementation of Web Intents.
+ </p>
+ </div>
+
+
+
+<div id="references" class="appendix section"><!--OddPage--><h2><span class="secno">B. </span>References</h2><div id="normative-references" class="section"><h3><span class="secno">B.1 </span>Normative references</h3><dl class="bibliography"><dt id="bib-BLOB">[BLOB]</dt><dd>Arun Ranganathan. <a href="http://www.w3.org/TR/2009/WD-FileAPI-20091117/#dfn-Blob"><cite>Blob.</cite></a> 17 November 2009. W3C Working Draft. (Work in progress.) URL: <a href="http://www.w3.org/TR/2009/WD-FileAPI-20091117/">http://www.w3.org/TR/2009/WD-FileAPI-20091117/#dfn-Blob</a>
+</dd><dt id="bib-HTML5">[HTML5]</dt><dd>Ian Hickson; David Hyatt. <a href="http://www.w3.org/TR/html5"><cite>HTML5.</cite></a> 25 May 2011. W3C Working Draft. (Work in progress.) URL: <a href="http://www.w3.org/TR/html5">http://www.w3.org/TR/html5</a>
+</dd><dt id="bib-RFC2046">[RFC2046]</dt><dd>N. Freed; N. Borenstein. <a href="http://www.ietf.org/rfc/rfc2046.txt"><cite>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types.</cite></a> November 1996. Internet RFC 2046. URL: <a href="http://www.ietf.org/rfc/rfc2046.txt">http://www.ietf.org/rfc/rfc2046.txt</a>
+</dd></dl></div><div id="informative-references" class="section"><h3><span class="secno">B.2 </span>Informative references</h3><p>No informative references.</p></div></div></body></html>