15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function startTestSoon() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window.setTimeout(test, 0);
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function test() {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debug('Checking window.localStorage');
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sanityCheck(window.localStorage);
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debug('Checking window.sessionStorage');
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sanityCheck(window.sessionStorage);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    done();
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } catch(e) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fail(e);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function sanityCheck(storage) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage.clear();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(0, storage.length,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "storage.length != 0 at start");
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(null, storage.getItem("foo"),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "getItem('foo') != null prior to addition");
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(null, storage.key(0),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "key(0) != null prior to addition");
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage.setItem("foo", "bar");
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(1, storage.length,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "storage.length != 1 after addition");
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual("bar", storage.getItem("foo"),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "getItem('foo') != 'bar' after addition");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual("foo", storage.key(0),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "key(0) != 'foo' after addition");
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage.removeItem("foo");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(null, storage.getItem("foo"),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "getItem('foo') != null after removal");
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage["foo"] = "baz";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage["name"] = "value";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(2, storage.length,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "storage.length != 2 after 2 additions");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual("baz", storage["foo"],
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "storage['foo'] != 'baz' after addition");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual("value", storage["name"],
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "storage['name'] != 'value' after addition");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage.clear();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkEqual(0, storage.length,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "storage.length != 0 after clear");
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var tooLarge =  makeLargeString((5 * 1024 * 1024) + 1);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage.setItem("tooLarge", tooLarge);
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    throw "failed to throw exception for very large value";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } catch(ex) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkEqual(ex.code, 22,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "ex.code != 22 for attempt to store a very large value");
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage.setItem(tooLarge, "key is too large");
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    throw "failed to throw exception for very large key";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } catch(ex) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkEqual(ex.code, 22,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "ex.code != 22 for attempt to store a very large key");
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function checkEqual(lhs, rhs, errorMessage) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (lhs !== rhs)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throw errorMessage;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function makeLargeString(minimumSize) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Array(minimumSize).join("X");
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
85