home *** CD-ROM | disk | FTP | other *** search
/ Minami 83 / MINAMI83.iso / Extra / DivXInstaller.exe / $PLUGINSDIR / GoogleToolbarFirefox.msi / xpi / amulet-jslib / browser-view.js < prev    next >
Text File  |  2006-08-07  |  7KB  |  214 lines

  1. function PROT_BrowserView(tabWatcher, doc) {
  2. this.debugZone = "browserview";
  3. this.tabWatcher_ = tabWatcher;
  4. this.doc_ = doc;
  5. }
  6. PROT_BrowserView.prototype.getFirstUnhandledDocWithURL_ = function(url) {
  7. var docs = this.tabWatcher_.getDocumentsFromURL(url);
  8. if (!docs.length)
  9. return null;
  10. for (var i = 0; i < docs.length; i++) {
  11. var browser = this.tabWatcher_.getBrowserFromDocument(docs[i]);
  12. G_Assert(this, !!browser, "Found doc but can't find browser???");
  13. var alreadyHandled = this.getProblem_(docs[i], browser);
  14. if (!alreadyHandled)
  15. return docs[i];
  16. }
  17. return null;
  18. }
  19. PROT_BrowserView.prototype.tryToHandleProblemRequest = function(warden,
  20. request) {
  21. var doc = this.getFirstUnhandledDocWithURL_(request.name);
  22. if (doc) {
  23. var browser = this.tabWatcher_.getBrowserFromDocument(doc);
  24. G_Assert(this, !!browser, "Couldn't get browser from problem doc???");
  25. G_Assert(this, !this.getProblem_(doc, browser),
  26. "Doc is supposedly unhandled, but has state?");
  27. this.isProblemDocument_(browser, doc, warden);
  28. return true;
  29. }
  30. return false;
  31. }
  32. PROT_BrowserView.prototype.isProblemDocument_ = function(browser,
  33. doc,
  34. warden) {
  35. G_Debug(this, "Document is problem: " + doc.location.href);
  36. var url = doc.location.href;
  37. var displayer = new warden.displayers_["afterload"]("Phishing afterload",
  38. browser,
  39. this.doc_,
  40. url);
  41. var hideHandler = BindToObject(this.onNavAwayFromProblem_,
  42. this,
  43. doc,
  44. browser);
  45. doc.defaultView.addEventListener("pagehide", hideHandler, true);
  46. var problem = {
  47. "browser_": browser,
  48. "doc_": doc,
  49. "displayer_": displayer,
  50. "url_": url,
  51. "hideHandler_": hideHandler,
  52. };
  53. var numInQueue = this.queueProblem_(browser, problem);
  54. if (numInQueue == 1)
  55. new G_Alarm(BindToObject(this.unqueueNextProblem_, this, browser), 0);
  56. }
  57. PROT_BrowserView.prototype.onNavAwayFromProblem_ = function(doc, browser) {
  58. G_Debug(this, "User nav'd away from problem.");
  59. var problem = this.getProblem_(doc, browser);
  60. (new PROT_Reporter).report("phishnavaway", problem.url_);
  61. G_Assert(this, doc === problem.doc_, "State doc not equal to nav away doc?");
  62. G_Assert(this, browser === problem.browser_,
  63. "State browser not equal to nav away browser?");
  64. this.problemResolved(browser, doc);
  65. }
  66. PROT_BrowserView.prototype.hasProblem = function(browser) {
  67. return this.hasNonemptyProblemQueue_(browser);
  68. }
  69. PROT_BrowserView.prototype.hasNonemptyProblemQueue_ = function(browser) {
  70. try {
  71. return !!browser.PROT_problemState__ &&
  72. !!browser.PROT_problemState__.length;
  73. } catch(e) {
  74. return false;
  75. }
  76. }
  77. PROT_BrowserView.prototype.problemResolved = function(browser, opt_doc) {
  78. var problem;
  79. var doc;
  80. if (!!opt_doc) {
  81. doc = opt_doc;
  82. problem = this.getProblem_(doc, browser);
  83. } else {
  84. problem = this.getCurrentProblem_(browser);
  85. doc = problem.doc_;
  86. }
  87. problem.displayer_.done();
  88. var wasHead = this.deleteProblemFromQueue_(doc, browser);
  89. var queueNotEmpty = this.getCurrentProblem_(browser);
  90. if (wasHead && queueNotEmpty) {
  91. G_Debug(this, "More problems pending. Scheduling unqueue.");
  92. new G_Alarm(BindToObject(this.unqueueNextProblem_, this, browser), 0);
  93. }
  94. }
  95. PROT_BrowserView.prototype.unqueueNextProblem_ = function(browser) {
  96. var problem = this.getCurrentProblem_(browser);
  97. if (!problem) {
  98. G_Debug(this, "No problem in queue; doc nav'd away from? (shrug)");
  99. return;
  100. }
  101. if (!problem.displayer_.isActive()) {
  102. var haveContent = false;
  103. try {
  104. var h = problem.doc_.defaultView.getComputedStyle(problem.doc_.body, "")
  105. .getPropertyValue("height");
  106. G_Debug(this, "body height: " + h);
  107. if (Number(h.substring(0, h.length - 2)))
  108. haveContent = true;
  109. } catch (e) {
  110. G_Debug(this, "Masked in unqueuenextproblem: " + e);
  111. }
  112. if (!haveContent) {
  113. G_Debug(this, "Didn't get computed style. Re-queueing.");
  114. var p = this.removeProblemFromQueue_(problem.doc_, browser);
  115. G_Assert(this, p === problem, "Unqueued wrong problem?");
  116. this.queueProblem_(browser, problem);
  117. new G_Alarm(BindToObject(this.unqueueNextProblem_,
  118. this,
  119. browser),
  120. 200 /*ms*/);
  121. return;
  122. }
  123. problem.displayer_.start();
  124. if (this.tabWatcher_.getCurrentBrowser() === browser)
  125. new G_Alarm(BindToObject(this.problemBrowserMaybeSelected,
  126. this,
  127. browser),
  128. 350 /*ms*/);
  129. }
  130. }
  131. PROT_BrowserView.prototype.queueProblem_ = function(browser, problem) {
  132. G_Debug(this, "Adding problem state for " + problem.url_);
  133. if (this.hasNonemptyProblemQueue_(browser))
  134. G_Debug(this, "Already has problem state. Queueing this problem...");
  135. if (browser.PROT_problemState__ == undefined)
  136. browser.PROT_problemState__ = [];
  137. browser.PROT_problemState__.push(problem);
  138. return browser.PROT_problemState__.length;
  139. }
  140. PROT_BrowserView.prototype.deleteProblemFromQueue_ = function(doc, browser) {
  141. G_Debug(this, "Deleting problem state for " + browser);
  142. G_Assert(this, !!this.hasNonemptyProblemQueue_(browser),
  143. "Browser has no problem state");
  144. var problem = this.getProblem_(doc, browser);
  145. G_Assert(this, !!problem, "Couldnt find state in removeproblemstate???");
  146. var wasHead = browser.PROT_problemState__[0] === problem;
  147. this.removeProblemFromQueue_(doc, browser);
  148. var hideHandler = problem.hideHandler_;
  149. G_Assert(this, !!hideHandler, "No hidehandler in state?");
  150. problem.doc_.defaultView.removeEventListener("pagehide",
  151. hideHandler,
  152. true);
  153. return wasHead;
  154. }
  155. PROT_BrowserView.prototype.removeProblemFromQueue_ = function(doc, browser) {
  156. G_Debug(this, "Removing problem state for " + browser);
  157. G_Assert(this, !!this.hasNonemptyProblemQueue_(browser),
  158. "Browser has no problem state");
  159. var problem = null;
  160. for (var i = 0; i < browser.PROT_problemState__.length; i++)
  161. if (browser.PROT_problemState__[i].doc_ === doc) {
  162. problem = browser.PROT_problemState__.splice(i, 1)[0];
  163. break;
  164. }
  165. return problem;
  166. }
  167. PROT_BrowserView.prototype.getProblem_ = function(doc, browser) {
  168. if (!this.hasNonemptyProblemQueue_(browser))
  169. return null;
  170. for (var i = 0; i < browser.PROT_problemState__.length; i++)
  171. if (browser.PROT_problemState__[i].doc_ === doc)
  172. return browser.PROT_problemState__[i];
  173. return null;
  174. }
  175. PROT_BrowserView.prototype.getCurrentProblem_ = function(browser) {
  176. return browser.PROT_problemState__[0];
  177. }
  178. PROT_BrowserView.prototype.problemBrowserUnselected = function(browser) {
  179. var problem = this.getCurrentProblem_(browser);
  180. G_Assert(this, !!problem, "Couldn't get state from browser");
  181. problem.displayer_.browserUnselected();
  182. }
  183. PROT_BrowserView.prototype.problemBrowserMaybeSelected = function(browser) {
  184. var problem = this.getCurrentProblem_(browser);
  185. if (this.tabWatcher_.getCurrentBrowser() === browser &&
  186. problem &&
  187. problem.displayer_.isActive())
  188. this.problemBrowserSelected(browser);
  189. }
  190. PROT_BrowserView.prototype.problemBrowserSelected = function(browser) {
  191. G_Debug(this, "Problem browser selected");
  192. var problem = this.getCurrentProblem_(browser);
  193. G_Assert(this, !!problem, "No state? But we're selected!");
  194. problem.displayer_.browserSelected();
  195. }
  196. PROT_BrowserView.prototype.acceptAction = function(browser) {
  197. var problem = this.getCurrentProblem_(browser);
  198. new G_Alarm(BindToObject(problem.displayer_.acceptAction,
  199. problem.displayer_),
  200. 0);
  201. }
  202. PROT_BrowserView.prototype.declineAction = function(browser) {
  203. var problem = this.getCurrentProblem_(browser);
  204. G_Assert(this, !!problem, "User declined but no state???");
  205. new G_Alarm(BindToObject(problem.displayer_.declineAction,
  206. problem.displayer_),
  207. 0);
  208. }
  209. PROT_BrowserView.prototype.explicitShow = function(browser) {
  210. var problem = this.getCurrentProblem_(browser);
  211. G_Assert(this, !!problem, "Explicit show on browser w/o problem state???");
  212. problem.displayer_.explicitShow();
  213. }
  214.