home *** CD-ROM | disk | FTP | other *** search
/ Minami 81 / MINAMI81.ISO / Extra / DivXInstaller.exe / $PLUGINSDIR / GoogleToolbarFirefox.msi / xpi / amulet-jslib / sandbox.js < prev    next >
Text File  |  2006-05-15  |  4KB  |  124 lines

  1. function PROT_SandboxManager(iterator, listWarden, tableName) {
  2. this.debugZone = "sandboxMgr";
  3. this.iterator_ = iterator;
  4. this.dataImportedAtLeastOnce_ = false;
  5. var table = new PROT_TRTable(tableName);
  6. this.populateSandbox({ 'table': table });
  7. listWarden.registerSandboxUpdate(tableName,
  8. BindToObject(this.populateSandbox, this));
  9. listWarden.enableSandboxUpdates();
  10. }
  11. PROT_SandboxManager.prototype.checkHandler_ = function(handler) {
  12. if (!(handler instanceof Array)) {
  13. G_Debug(this, "handler isn't array");
  14. return false;
  15. }
  16. if (handler.length != 3) {
  17. G_Debug(this, "handler doesn't have 3 elements");
  18. return false;
  19. }
  20. if (typeof handler[0] != "string") {
  21. G_Debug(this, "callback isn't a string");
  22. return false;
  23. }
  24. if (typeof handler[1] != "string") {
  25. G_Debug(this, "eventType isn't a string");
  26. return false;
  27. }
  28. if (!(handler[2] instanceof Array)) {
  29. G_Debug(this, "attrs isn't an array");
  30. return false;
  31. }
  32. for (var i = 0; i < handler[2].length; i++) {
  33. if (typeof handler[2][i] != "string") {
  34. G_Debug(this, "attr " + handler[2][i] + " isn't a string");
  35. return false;
  36. }
  37. }
  38. return true;
  39. }
  40. PROT_SandboxManager.prototype.checkHandlers_ = function(handlers) {
  41. if (!(handlers instanceof Array))
  42. return false;
  43. for (var i = 0; i < handlers.length; i++) {
  44. if (!this.checkHandler_(handlers[i]))
  45. return false;
  46. }
  47. return true;
  48. }
  49. PROT_SandboxManager.prototype.registerHandlers_ = function() {
  50. var handlers = null;
  51. try {
  52. handlers = this.copyFromSandbox_(
  53. Components.utils.evalInSandbox("getHandlers();", this.sandbox_));
  54. } catch(e) {
  55. G_Debug(this, "Couldn't call getHandlers in sandbox " +
  56. "because of exception: " + e);
  57. return false;
  58. }
  59. if (!this.checkHandlers_(handlers)) {
  60. G_Debug(this, "checkHandlers failed! aborting");
  61. return false;
  62. }
  63. for (var i = 0; i < handlers.length; i++) {
  64. this.registerHandler_(handlers[i]);
  65. }
  66. return true;
  67. }
  68. PROT_SandboxManager.prototype.registerHandler_ = function(handler) {
  69. var F = this.createWrapper_(handler[0]);
  70. this.iterator_.registerEvent(handler[1], handler[2]);
  71. this.iterator_.registerHandler(handler[1], F);
  72. }
  73. PROT_SandboxManager.prototype.createWrapper_ = function(callback) {
  74. var F = function(e) {
  75. var evalString = callback + uneval(e) + ';';
  76. var results = null;
  77. try {
  78. results = this.copyFromSandbox_(
  79. Components.utils.evalInSandbox(evalString,
  80. this.sandbox_));
  81. } catch(e) {
  82. G_Debug(this, "Couldn't call " + evalString +
  83. " in sandbox because of exception " + e);
  84. return; // Don't call e.callback
  85. }
  86. if (!!e.callback && typeof e.callback == "function") {
  87. e.callback(results);
  88. }
  89. }
  90. return BindToObject(F, this);
  91. }
  92. PROT_SandboxManager.prototype.copyToSandbox_ = function(name, e) {
  93. var s = name + "=" + uneval(e);
  94. Components.utils.evalInSandbox(s, this.sandbox_);
  95. }
  96. PROT_SandboxManager.prototype.copyFromSandbox_ = function(e) {
  97. return eval(uneval(e));
  98. }
  99. PROT_SandboxManager.prototype.hasData = function() {
  100. return this.dataImportedAtLeastOnce_;
  101. }
  102. PROT_SandboxManager.prototype.populateSandbox = function(e) {
  103. if (!e.table) {
  104. G_Debug(this, "No data with which to populate sandbox!");
  105. return false;
  106. }
  107. this.iterator_.removeHandlers();
  108. this.sandbox_ = new Components.utils.Sandbox("example.com");
  109. var sandboxText = e.table.find("sandbox");
  110. if (!sandboxText) {
  111. G_Debug(this, "Bad value for sandbox key in sandbox table: " + sandboxText);
  112. return false;
  113. }
  114. sandboxText = decodeURIComponent(sandboxText);
  115. try {
  116. Components.utils.evalInSandbox(sandboxText, this.sandbox_);
  117. } catch(e) {
  118. G_Debug(this, "Couldn't load sandbox file, as a result of exception: " + e);
  119. return false;
  120. }
  121. this.dataImportedAtLeastOnce_ = this.registerHandlers_();
  122. return true;
  123. }
  124.