Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2909)

Unified Diff: chrome/common/extensions/docs/server2/templates/articles/app_storage.html

Issue 10832042: Extensions Docs Server: Doc conversion script (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: everything but svn stuff Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/server2/templates/articles/app_storage.html
diff --git a/chrome/common/extensions/docs/server2/templates/articles/app_storage.html b/chrome/common/extensions/docs/server2/templates/articles/app_storage.html
new file mode 100644
index 0000000000000000000000000000000000000000..83ddc5197cf73128ea4d62ce5147546decf618dd
--- /dev/null
+++ b/chrome/common/extensions/docs/server2/templates/articles/app_storage.html
@@ -0,0 +1,229 @@
+<h1>Manage Data</h1>
+
+
+<p>
+Almost every aspect of app development involves some element
+of sending or receiving data.
+Starting with the basics,
+you should use an MVC framework to help you design and implement your app
+so that data is completely separate from the app's view on that data
+(see <a href="app_frameworks.html">MVC Architecture</a>).
+</p>
+
+<p>
+You also need to think about how data is handled when your app is offline
+(see <a href="offline_apps.html">Offline First</a>).
+This doc briefly introduces the storage options
+for sending, receiving, and saving data locally;
+the remainder of the doc shows you how
+to use Chrome's File System API
+(see also the <a href="fileSystem.html">fileSystem API</a>).
+</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/filesystem-access">filesystem-access</a>
+and <a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/storage">storage</a> samples.
+</p>
+
+<h2 id="options">Storage options</h2>
+
+<p>
+Packaged apps use many different mechanisms
+to send and receive data.
+For external data (resources, web pages),
+you need to be aware of the
+<a href="app_csp.html">Content Security Policy (CSP)</a>.
+Similar to Chrome Extensions,
+you can use
+<a href="app_external.html#external">cross-origin XMLHttpRequests</a>
+to communicate with remote servers.
+You can also isolate external pages,
+so that the rest of your app is secure
+(see <a href="app_external.html#objecttag">Embed external web pages</a>).
+With Web Intents,
+your app can share data with other apps
+(see <a href="app_intents.html">Connect Apps with Web Intents</a>).
+</p>
+
+<p>
+When saving data locally,
+you can use the <a href="storage.html">Chrome Storage API</a>
+to save small amounts of string data and
+IndexedDB to save structured data.
+With IndexedDB, you can persist JavaScript objects
+to an object store and use the store's indexes to query data
+(to learn more, see HTML5 Rock's
+<a href="http://www.html5rocks.com/tutorials/indexeddb/todo/">Simple Todo List Tutorial</a>).
+For all other types of data,
+like binary data,
+use the Filesystem API.
+</p>
+
+<p>
+Chrome's Filesystem API extends the
+<a href="http://www.html5rocks.com/tutorials/file/filesystem/">HTML5 FileSystem API</a>;
+apps can create, read, navigate,
+and write to a sandboxed section
+of the user's local file system.
+With Chrome's File System API,
+packaged apps can read and write files
+to user-selected locations.
+For example,
+a photo-sharing app can use the File System API
+to read and write any photos that a user selects.
+</p>
+
+<h2 id="manifest">Adding file system permission</h2>
+
+<p>
+To use Chrome's File System API,
+you need to add the "fileSystem" permission to the manifest,
+so that you can obtain permission from the user
+to store persistent data.
+
+<pre>
+"permissions": [
+ "...",
+ "fileSystem"
+]
+</pre>
+
+<h2 id="import">User-options for selecting files</h2>
+
+<p>
+Users expect to select files
+in the same way they always do.
+At a minimum,
+they expect a 'choose file' button
+and standard file-chooser.
+If your app makes heavy use of file-handing,
+you should also implement drag-and-drop
+(see below and also check out
+<a href="http://www.html5rocks.com/tutorials/dnd/basics/">Native HTML5 Drag and Drop</a>).
+</p>
+
+<p>
+If your app connects with other apps using
+<a href="app_intents.html">Web Intents</a>
+you can set up data sharing with those apps.
+Users can view and/or write
+to their files using a connected app
+without having to do all sorts of extra steps
+to move files back and forth.
+</p>
+
+<h2 id="path">Obtaining the path of a fileEntry</h2>
+
+<p>
+To get the full path
+of the file the user selected,
+<code>fileEntry</code>,
+call <code>getDisplayPath()</code>:
+</p>
+
+<pre>
+function displayPath(fileEntry) {
+ chrome.fileSystem.getDisplayPath(fileEntry, function(path) {
+ console.log(path)
+ });
+}
+</pre>
+
+<h2 id="drag">Implementing drag-and-drop</h2>
+
+<p>
+If you need to implement drag-and-drop selection,
+the drag-and-drop file controller
+(<code>dnd.js</code>) in
+the <a href="https://github.com/GoogleChrome/chrome-app-samples/tree/master/filesystem-access">filesystem-access</a>
+sample is a good starting point.
+The controller creates a file entry
+from a <code>DataTransferItem</code>
+via drag-and-drop.
+In this example,
+the <code>fileEntry</code> is set
+to the first dropped item.
+</p>
+
+<pre>
+var dnd = new DnDFileController('body', function(data) {
+ var fileEntry = data.items[0].webkitGetAsEntry();
+ displayPath(fileEntry);
+});
+</pre>
+
+<h2 id="read">Reading a file</h2>
+
+<p>
+The following code opens the file (read-only) and
+reads it as text using a <code>FileReader</code> object.
+If the file doesn't exist, an error is thrown.
+</p>
+
+<pre>
+var chosenFileEntry = null;
+
+chooseFileButton.addEventListener('click', function(e) {
+ chrome.fileSystem.chooseFile({type: 'openFile'}, function(readOnlyEntry) {
+
+ readOnlyEntry.file(function(file) {
+ var reader = new FileReader();
+
+ reader.onerror = errorHandler;
+ reader.onloadend = function(e) {
+ console.log(e.target.result);
+ };
+
+ reader.readAsText(file);
+ });
+ });
+});
+</pre>
+
+<h2 id="write">Writing a file</h2>
+
+<p>
+The two common use-cases
+for writing a file are "Save" and "Save as".
+The following code creates a
+<code>writableFileEntry</code>
+from the read-only <code>chosenFileEntry</code> and
+writes the selected file to it.
+</p>
+
+<pre>
+ chrome.fileSystem.getWritableFileEntry(chosenFileEntry, function(writableFileEntry) {
+ writableFileEntry.createWriter(function(writer) {
+ writer.onerror = errorHandler;
+ writer.onwriteend = callback;
+
+ chosenFileEntry.file(function(file) {
+ writer.write(file);
+ });
+ }, errorHandler);
+});
+</pre>
+
+<p>
+The following code creates a new file
+with "Save as" functionality and
+writes the new blob to the file
+using the <code>writer.write()</code> method.
+</p>
+
+<pre>
+chrome.fileSystem.chooseFile({type: 'saveFile'}, function(writableFileEntry) {
+ writableFileEntry.createWriter(function(writer) {
+ writer.onerror = errorHandler;
+ writer.onwriteend = function(e) {
+ console.log('write complete');
+ };
+ writer.write(new Blob(['1234567890'], {type: 'text/plain'}));
+ }, errorHandler);
+});
+</pre>
+
+<p class="backtotop"><a href="#top">Back to top</a></p>

Powered by Google App Engine
This is Rietveld 408576698