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

Unified Diff: chrome/test/data/extensions/platform_apps/web_view/isolation_indexeddb/storage.js

Issue 1144473003: <webview>: Add JavaScript test for IndexedDB isolation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments Created 5 years, 7 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/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;
+ }
+};

Powered by Google App Engine
This is Rietveld 408576698