| Index: chrome/common/extensions/docs/server2/templates/articles/app_intents.html
|
| diff --git a/chrome/common/extensions/docs/server2/templates/articles/app_intents.html b/chrome/common/extensions/docs/server2/templates/articles/app_intents.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fcbdf02026334a756e814a910513675bf7f9cd40
|
| --- /dev/null
|
| +++ b/chrome/common/extensions/docs/server2/templates/articles/app_intents.html
|
| @@ -0,0 +1,225 @@
|
| +<h1>Connect Apps with Web Intents</h1>
|
| +
|
| +
|
| +<p>
|
| +<a href="http://webintents.org/">Web Intents</a>
|
| +allow your application to quickly communicate
|
| +with other applications on the user's system and inside their browser.
|
| +Your application can register to handle specific user actions
|
| +such as editing images via the <code>manifest.json</code>;
|
| +your application can also invoke actions to be handled by other applications.
|
| +</p>
|
| +
|
| +<p>Pacakged apps use Web Intents as their primary mechanism for inter-app
|
| +communication.</p>
|
| +
|
| +<p class="note">
|
| +<b>API Samples: </b>
|
| +Want to play with the code?
|
| +Check out the
|
| +<a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/webintents">webintents</a> sample.
|
| +</p>
|
| +
|
| +<h2 id="register">Register your app to handle an action</h2>
|
| +
|
| +<p>
|
| +You must supply the intent in the manifest:
|
| +</p>
|
| +
|
| +<pre>
|
| +"intents":{
|
| + "http://webintents.org/edit" : [{
|
| + "title" : "Best Image editing app",
|
| + "type" : ["image/*"]
|
| + }]
|
| +}
|
| +</pre>
|
| +
|
| +<p>
|
| +Unlike extensions and hosted apps, packaged applications do not
|
| +need a "href" attribute in the manifest declaration, this is
|
| +because packaged apps have a single entry point for
|
| +launch - the <code>onLaunched</code> event.
|
| +</p>
|
| +
|
| +<h2 id="content">Handling content types</h2>
|
| +
|
| +<p>
|
| +Your application can be the user's preferred choice for handling a file type.
|
| +For example, your application could handle viewing images or viewing pdfs.
|
| +You must supply the intent in the manifest
|
| +and use the "http://webintents.org/view" action:
|
| +</p>
|
| +<p>To be able declare your application's ability to view RSS and ATOM
|
| +feeds, you would add the following to your manifest.
|
| +</p>
|
| +<pre>
|
| +"intents": {
|
| + "http://webintents.org/view" : [{
|
| + "title" : "RSS Feed Reader",
|
| + "type" : ["application/atom+xml", "application/rss+xml"]
|
| + }]
|
| +}
|
| +</pre>
|
| +
|
| +<p>
|
| +Your application will receive intent payload through the <code>onLaunched</code> event.
|
| +</p>
|
| +<pre>
|
| +chrome.experimental.app.onLaunched(function(intent) {
|
| + // App Launched
|
| + if(intent.action == "http://webinents.org/view" &&
|
| + intent.type == "application/atom+xml") {
|
| +
|
| + // obtain the ATOM feed data.
|
| + var data = intent.data;
|
| + }
|
| +});
|
| +</pre>
|
| +
|
| +
|
| +<h2 id="launching">Launching an app with a file</h2>
|
| +<p>
|
| +If your app handles the <code>view</code> intent,
|
| +it is possible to launch it from the command line with a file as a parameter.
|
| +</p>
|
| +<pre>
|
| +chrome.exe --app-id [app_id] [path_to_file]
|
| +</pre>
|
| +<p>
|
| +This will implicity launch your application with an intent payload populated
|
| +with the action set to "http://webintents.org/view", the type set to the
|
| +mime-type of the file and the data as a <code>FileEntry</code> object.
|
| +</p>
|
| +<pre>
|
| +chrome.experimental.app.onLaunched(function(intent) {
|
| + // App Launched
|
| + var data = intent.data;
|
| +});
|
| +</pre>
|
| +
|
| +<h2 id="launching">Manipulating the file</h2>
|
| +<p>
|
| + When your application is launched with a file as the parameter
|
| + on the command-line,
|
| + the <code>intent.data</code> property is a <code>FileEntry</code>.
|
| + This is really cool because now you have a direct reference back to the physical
|
| + file on the disk,
|
| + and you can write data back to it.
|
| +</p>
|
| +
|
| +<pre>
|
| +chrome.experimental.app.onLaunched(function(intent) {
|
| + // App Launched
|
| + var data = intent.data;
|
| + if(data instanceof FileEntry) {
|
| + data.createWriter(function(writer) {
|
| + writer.onwriteend = function(e) {
|
| + console.log('Write completed.');
|
| + };
|
| +
|
| + writer.onerror = function(e) {
|
| + console.log('Write failed: ' + e.toString());
|
| + };
|
| +
|
| + // Create a new Blob and write it to log.txt.
|
| + var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
|
| + bb.append('Lorem Ipsum');
|
| + writer.write(bb.getBlob('text/plain'));
|
| + });
|
| + }
|
| +});
|
| +</pre>
|
| +
|
| +<h2 id="return">Returning data to calling application</h2>
|
| +<p>
|
| +Lots of applications want to cooperate
|
| +with the app that invoked them.
|
| +It's easy to send data back to the calling client
|
| +using <code>intent.postResult</code>:
|
| +</p>
|
| +
|
| +<pre>
|
| +chrome.experimental.app.onLaunched(function(intent) {
|
| + // App Launched
|
| + console.log(intent.action);
|
| + console.log(intent.type);
|
| + var data = intent.data;
|
| + // Do something with the data;
|
| +
|
| + intent.postResult(newData);
|
| +});
|
| +</pre>
|
| +
|
| +<h2 id="localize">Localizing your app title</h2>
|
| +
|
| +<p>
|
| +If your application or extension is localized
|
| +as per the guidelines in
|
| +<a href="i18n.html">Internationalization (i18n)</a>,
|
| +you can localize the title of your intent in the picker
|
| +using the exact same infrastructure:
|
| +</p>
|
| +
|
| +<pre>
|
| +"intents": {
|
| + "http://webintents.org/edit" : [{
|
| + "title" : "__MSG_intent_title__",
|
| + "type" : ["image/*"],
|
| + "disposition" : "inline"
|
| + }]
|
| +}
|
| +</pre>
|
| +
|
| +<h2 id="invoke">Invoking an action</h2>
|
| +<p>
|
| +If your application needs to be able
|
| +to use the functionality of another application,
|
| +it can simply ask the browser for it.
|
| +To ask for an application that supports image editing,
|
| +it's as simple as:
|
| +</p>
|
| +
|
| +<pre>
|
| +var intent = new WebKitIntent("http://webintents.org/edit", "image/png", "dataUri://");
|
| +
|
| +window.navigator.webkitStartActivity(intent, function(data) {
|
| +// The data from the remote application is returned here.
|
| +});
|
| +</pre>
|
| +
|
| +<h2 id="errors">Handling Errors and Exceptions</h2>
|
| +<p>
|
| + If your service application needs to signal to the client application
|
| + that an unrecoverable error has occurred,
|
| + then your application will need
|
| + to call <code>postError</code> on the intent object.
|
| + This will signal to the client’s onError callback
|
| + that something has gone wrong.
|
| +</p>
|
| +
|
| +<h3>Client</h3>
|
| +
|
| +<pre>
|
| +var intent = new WebKitIntent("http://webintents.org/edit", "image/png", "dataUri://");
|
| +
|
| +var onSuccess = function(data) {};
|
| +var onError = function() {};
|
| +
|
| +window.navigator.webkitStartActivity(intent, onSuccess, onError);
|
| +</pre>
|
| +
|
| +<h3>Service</h3>
|
| +<pre>
|
| +chrome.experimental.app.onLaunched(function(intent) {
|
| + // App Launched
|
| + console.log(intent.action);
|
| + console.log(intent.type);
|
| + var data = intent.data;
|
| + // Do something with the data;
|
| +
|
| + intent.postResult(newData);
|
| +});
|
| +</pre>
|
| +
|
| +<p class="backtotop"><a href="#top">Back to top</a></p>
|
|
|