browser_bug1204626.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. "use strict"; // -*- js-indent-level: 2; indent-tabs-mode: nil -*-
  2. var Cc = Components.classes;
  3. var Ci = Components.interfaces;
  4. const contentBase = "https://example.com/browser/embedding/test/";
  5. const chromeBase = "chrome://mochitests/content/browser/embedding/test/";
  6. const testPageURL = contentBase + "bug1204626_doc0.html";
  7. function one_test(delay, continuation) {
  8. let delayStr = delay === null ? "no delay" : "delay = " + delay + "ms";
  9. let browser;
  10. BrowserTestUtils.openNewForegroundTab(gBrowser, testPageURL).then((tab) => {
  11. browser = tab.linkedBrowser;
  12. let persistable = browser.QueryInterface(Ci.nsIFrameLoaderOwner)
  13. .frameLoader
  14. .QueryInterface(Ci.nsIWebBrowserPersistable);
  15. persistable.startPersistence(/* outer window ID: */ 0, {
  16. onDocumentReady,
  17. onError: function(status) {
  18. ok(false, new Components.Exception("startPersistence failed", status));
  19. continuation();
  20. }
  21. });
  22. });
  23. function onDocumentReady(doc) {
  24. const nameStem="test_bug1204626_" + Date.now();
  25. let wbp = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
  26. .createInstance(Ci.nsIWebBrowserPersist);
  27. let tmp = Cc["@mozilla.org/file/directory_service;1"]
  28. .getService(Ci.nsIProperties)
  29. .get("TmpD", Ci.nsIFile);
  30. let tmpFile = tmp.clone();
  31. tmpFile.append(nameStem + "_saved.html");
  32. let tmpDir = tmp.clone();
  33. tmpDir.append(nameStem + "_files");
  34. registerCleanupFunction(function cleanUp() {
  35. if (tmpFile.exists()) {
  36. tmpFile.remove(/* recursive: */ false);
  37. }
  38. if (tmpDir.exists()) {
  39. tmpDir.remove(/* recursive: */ true);
  40. }
  41. });
  42. wbp.progressListener = {
  43. onProgressChange: function(){},
  44. onLocationChange: function(){},
  45. onStatusChange: function(){},
  46. onSecurityChange: function(){},
  47. onStateChange: function wbp_stateChange(_wbp, _req, state, _status) {
  48. if ((state & Ci.nsIWebProgressListener.STATE_STOP) == 0) {
  49. return;
  50. }
  51. ok(true, "Finished save (" + delayStr + ") but might have crashed.");
  52. continuation();
  53. }
  54. }
  55. function doSave() {
  56. wbp.saveDocument(doc, tmpFile, tmpDir, null, 0, 0);
  57. }
  58. if (delay === null) {
  59. doSave();
  60. } else {
  61. setTimeout(doSave, delay);
  62. }
  63. browser.messageManager.loadFrameScript("data:,content.window.close()", true);
  64. }
  65. }
  66. function test() {
  67. waitForExplicitFinish();
  68. // 0ms breaks having the actor under PBrowser, but not 10ms.
  69. // 10ms provokes the double-__delete__, but not 0ms.
  70. // And a few others, just in case.
  71. const testRuns = [null, 0, 10, 0, 10, 20, 50, 100];
  72. let i = 0;
  73. (function next_test() {
  74. if (i < testRuns.length) {
  75. one_test(testRuns[i++], next_test);
  76. } else {
  77. finish();
  78. }
  79. })();
  80. }