35d374b7714baa37fceb2cd15b28afc8f535f309b28776707fec5595afdf6138a62303beec7c74fcacb39c3bbe83e6ee8595570c0618b2514b0946d977645e 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * Copyright (c) 2013 ESHA Research
  3. * Dual licensed under the MIT and GPL licenses:
  4. * http://www.opensource.org/licenses/mit-license.php
  5. * http://www.gnu.org/licenses/gpl.html
  6. *
  7. * store.remainingSpace();// returns remainingSpace value (if browser supports it)
  8. * store.charsUsed();// returns length of all data when stringified
  9. * store.charsLeft([true]);// tests how many more chars we can fit (crash threat!)
  10. * store.charsTotal([true]);// charsUsed + charsLeft, duh.
  11. *
  12. * TODO: byte/string conversions
  13. *
  14. * Status: ALPHA - changing API *and* crash threats :)
  15. */
  16. ;(function(store, _) {
  17. function put(area, s) {
  18. try {
  19. area.setItem("__test__", s);
  20. return true;
  21. } catch (e) {}
  22. }
  23. _.fn('remainingSpace', function() {
  24. return this._area.remainingSpace;
  25. });
  26. _.fn('charsUsed', function() {
  27. return _.stringify(this.getAll()).length - 2;
  28. });
  29. _.fn('charsLeft', function(test) {
  30. if (this.isFake()){ return; }
  31. if (arguments.length === 0) {
  32. test = window.confirm('Calling store.charsLeft() may crash some browsers!');
  33. }
  34. if (test) {
  35. var s = 's ', add = s;
  36. // grow add for speed
  37. while (put(store._area, s)) {
  38. s += add;
  39. if (add.length < 50000) {
  40. add = s;
  41. }
  42. }
  43. // shrink add for accuracy
  44. while (add.length > 2) {
  45. s = s.substring(0, s.length - (add.length/2));
  46. while (put(store._area, s)) {
  47. s += add;
  48. }
  49. add = add.substring(add.length/2);
  50. }
  51. _.remove(store._area, "__test__");
  52. return s.length + 8;
  53. }
  54. });
  55. _.fn('charsTotal', function(test) {
  56. return store.charsUsed() + store.charsLeft(test);
  57. });
  58. })(window.store, window.store._);