Index: chrome/test/data/extensions/platform_apps/web_view/isolation_indexeddb/storage.js |
diff --git a/chrome/test/data/extensions/platform_apps/web_view/isolation_indexeddb/storage.js b/chrome/test/data/extensions/platform_apps/web_view/isolation_indexeddb/storage.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fe597e39ac92215b5c150493ff97f139405bb693 |
--- /dev/null |
+++ b/chrome/test/data/extensions/platform_apps/web_view/isolation_indexeddb/storage.js |
@@ -0,0 +1,126 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// This method initializes the two types of DOM storage. |
+function initDomStorage(value) { |
+ window.localStorage.setItem('foo', 'local-' + value); |
+ window.sessionStorage.setItem('bar', 'session-' + value); |
+} |
+ |
+// The code below is used for testing IndexedDB isolation. |
+// The test uses three basic operations -- open, read, write -- to verify proper |
+// isolation across webview tags with different storage partitions. |
+// Each of the basic functions below sends a postMessage to the embedder with |
+// the results. |
+var isolation = {}; |
+ |
+isolation.db = null; |
+isolation.onerror = function(e) { |
+ sendResponse('error'); |
+}; |
+ |
+// Used to send postMessage to the embedder. |
+var channel = null; |
+// Id that the embedder uses to identify this guest. |
+var id = -1; |
+ |
+// This method opens the database and creates the objectStore if it doesn't |
+// exist. It sends a postMessage to the embedder with a string referring to |
+// which operation has been performed - open vs create. |
+function initIDB() { |
+ var v = 3; |
+ var ranVersionChangeTransaction = false; |
+ var request = indexedDB.open('isolation', v); |
+ request.onupgradeneeded = function(e) { |
+ isolation.db = e.target.result; |
+ var store = isolation.db.createObjectStore( |
+ 'partitions', {keyPath: "id"}); |
+ e.target.transaction.oncomplete = function() { |
+ ranVersionChangeTransaction = true; |
+ }; |
+ } |
+ request.onsuccess = function(e) { |
+ isolation.db = e.target.result; |
+ if (ranVersionChangeTransaction) { |
+ sendResponse('idb created'); |
+ } else { |
+ sendResponse('idb open'); |
+ } |
+ }; |
+ request.onerror = isolation.onerror; |
+ request.onblocked = isolation.onerror; |
+} |
+ |
+// This method adds a |value| to the database identified by |id|. |
+function addItemIDB(id, value) { |
+ var trans = isolation.db.transaction(['partitions'], 'readwrite'); |
+ var store = trans.objectStore('partitions'); |
+ var data = {'partition': value, 'id': id }; |
+ |
+ var request = store.put(data); |
+ request.onsuccess = function(e) { |
+ sendResponse('addItemIDB complete'); |
+ }; |
+ request.onerror = isolation.onerror; |
+}; |
+ |
+// This method reads an item from the database, and returns the result |
+// to the embedder using postMessage. |
+function readItemIDB(id) { |
+ var storedValue = null; |
+ var trans = isolation.db.transaction(['partitions'], 'readwrite'); |
+ var store = trans.objectStore('partitions'); |
+ |
+ var request = store.get(id); |
+ request.onsuccess = function(e) { |
+ if (!!e.target.result != false) { |
+ storedValue = request.result.partition; |
+ } |
+ sendResponse('readItemIDB: ' + storedValue); |
+ }; |
+ request.onerror = isolation.onerror; |
+} |
+ |
+function openIDB(name) { |
+ var request = indexedDB.open('isolation'); |
+ request.onsuccess = function(e) { |
+ e.target.result.version == 1 ? sendResponse('db not found') |
+ : sendResponse('db found'); |
+ }; |
+ request.onerror = isolation.onerror; |
+ request.onblocked = isolation.onerror; |
+} |
+ |
+function sendResponse(responseStr) { |
+ if (channel) { |
+ channel.postMessage(JSON.stringify([id, responseStr]), '*'); |
+ } |
+} |
+ |
+window.onmessage = function(e) { |
+ if (!channel) { |
+ channel = e.source; |
+ } |
+ |
+ var data = JSON.parse(e.data); |
+ id = data.id; |
+ window.console.log('onmessage: ' + data.name); |
+ switch (data.name) { |
+ case 'init': |
+ initIDB(); |
+ break; |
+ case 'add': |
+ addItemIDB(data.params[0], data.params[1]); |
+ break; |
+ case 'read': |
+ readItemIDB(data.params[0]); |
+ break; |
+ case 'open': |
+ openIDB(data.params[0]); |
+ break; |
+ default: |
+ sendResponse('bogus-command'); // Error. |
+ break; |
+ } |
+}; |