summaryrefslogtreecommitdiffstats
path: root/devtools/client/projecteditor/test/browser_projecteditor_immediate_destroy.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/projecteditor/test/browser_projecteditor_immediate_destroy.js')
-rw-r--r--devtools/client/projecteditor/test/browser_projecteditor_immediate_destroy.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/devtools/client/projecteditor/test/browser_projecteditor_immediate_destroy.js b/devtools/client/projecteditor/test/browser_projecteditor_immediate_destroy.js
new file mode 100644
index 000000000..0773be55c
--- /dev/null
+++ b/devtools/client/projecteditor/test/browser_projecteditor_immediate_destroy.js
@@ -0,0 +1,93 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+//
+// Whitelisting this test.
+// As part of bug 1077403, the leaking uncaught rejection should be fixed.
+//
+thisTestLeaksUncaughtRejectionsAndShouldBeFixed("destroy");
+thisTestLeaksUncaughtRejectionsAndShouldBeFixed("TypeError: this.window is null");
+
+// Test that projecteditor can be destroyed in various states of loading
+// without causing any leaks or exceptions.
+
+add_task(function* () {
+
+ info("Testing tab closure when projecteditor is in various states");
+ let loaderUrl = "chrome://devtools/content/projecteditor/chrome/content/projecteditor-test.xul";
+
+ yield addTab(loaderUrl).then(() => {
+ let iframe = content.document.getElementById("projecteditor-iframe");
+ ok(iframe, "Tab has placeholder iframe for projecteditor");
+
+ info("Closing the tab without doing anything");
+ gBrowser.removeCurrentTab();
+ });
+
+ yield addTab(loaderUrl).then(() => {
+ let iframe = content.document.getElementById("projecteditor-iframe");
+ ok(iframe, "Tab has placeholder iframe for projecteditor");
+
+ let projecteditor = ProjectEditor.ProjectEditor();
+ ok(projecteditor, "ProjectEditor has been initialized");
+
+ info("Closing the tab before attempting to load");
+ gBrowser.removeCurrentTab();
+ });
+
+ yield addTab(loaderUrl).then(() => {
+ let iframe = content.document.getElementById("projecteditor-iframe");
+ ok(iframe, "Tab has placeholder iframe for projecteditor");
+
+ let projecteditor = ProjectEditor.ProjectEditor();
+ ok(projecteditor, "ProjectEditor has been initialized");
+
+ projecteditor.load(iframe);
+
+ info("Closing the tab after a load is requested, but before load is finished");
+ gBrowser.removeCurrentTab();
+ });
+
+ yield addTab(loaderUrl).then(() => {
+ let iframe = content.document.getElementById("projecteditor-iframe");
+ ok(iframe, "Tab has placeholder iframe for projecteditor");
+
+ let projecteditor = ProjectEditor.ProjectEditor();
+ ok(projecteditor, "ProjectEditor has been initialized");
+
+ return projecteditor.load(iframe).then(() => {
+ info("Closing the tab after a load has been requested and finished");
+ gBrowser.removeCurrentTab();
+ });
+ });
+
+ yield addTab(loaderUrl).then(() => {
+ let iframe = content.document.getElementById("projecteditor-iframe");
+ ok(iframe, "Tab has placeholder iframe for projecteditor");
+
+ let projecteditor = ProjectEditor.ProjectEditor(iframe);
+ ok(projecteditor, "ProjectEditor has been initialized");
+
+ let loadedDone = promise.defer();
+ projecteditor.loaded.then(() => {
+ ok(false, "Loaded has finished after destroy() has been called");
+ loadedDone.resolve();
+ }, () => {
+ ok(true, "Loaded has been rejected after destroy() has been called");
+ loadedDone.resolve();
+ });
+
+ projecteditor.destroy();
+
+ return loadedDone.promise.then(() => {
+ gBrowser.removeCurrentTab();
+ });
+ });
+
+ finish();
+});
+
+