summaryrefslogtreecommitdiffstats
path: root/devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js b/devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js
new file mode 100644
index 0000000000..8a465f1147
--- /dev/null
+++ b/devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js
@@ -0,0 +1,83 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+// Testing that the inspector doesn't go blank when navigating to a page that
+// deletes an iframe while loading.
+
+const TEST_URL = URL_ROOT + "doc_inspector_remove-iframe-during-load.html";
+
+add_task(async function () {
+ const { inspector, tab } = await openInspectorForURL("about:blank");
+ await selectNode("body", inspector);
+
+ // Before we start navigating, attach a listener on the reloaded event.
+ const onInspectorReloaded = inspector.once("reloaded");
+
+ // Note: here we don't want to use the `navigateTo` helper from shared-head.js
+ // because we want to modify the page as early as possible after the
+ // navigation, ideally before the inspector has fully initialized.
+ // See next comments.
+ const browser = tab.linkedBrowser;
+ const onBrowserLoaded = BrowserTestUtils.browserLoaded(browser);
+ BrowserTestUtils.loadURIString(browser, TEST_URL);
+ await onBrowserLoaded;
+
+ // We do not want to wait for the inspector to be fully ready before testing
+ // so we load TEST_URL and just wait for the content window to be done loading
+ await SpecialPowers.spawn(browser, [], async function () {
+ await content.wrappedJSObject.readyPromise;
+ });
+
+ // The content doc contains a script that creates iframes and deletes them
+ // immediately after. It does this before the load event, after
+ // DOMContentLoaded and after load. This is what used to make the inspector go
+ // blank when navigating to that page.
+ // At this stage, there should be no iframes in the page anymore.
+ ok(
+ !(await contentPageHasNode(browser, "iframe")),
+ "Iframes added by the content page should have been removed"
+ );
+
+ // Create/remove an extra one now, after the load event.
+ info("Creating and removing an iframe.");
+ await SpecialPowers.spawn(browser, [], async function () {
+ const iframe = content.document.createElement("iframe");
+ content.document.body.appendChild(iframe);
+ iframe.remove();
+ });
+
+ ok(
+ !(await contentPageHasNode(browser, "iframe")),
+ "The after-load iframe should have been removed."
+ );
+
+ // Assert that the markup-view is displayed and works
+ ok(!(await contentPageHasNode(browser, "iframe")), "Iframe has been removed");
+
+ const expectedText = await SpecialPowers.spawn(
+ browser,
+ [],
+ async function () {
+ return content.document.querySelector("#yay").textContent;
+ }
+ );
+ is(expectedText, "load", "Load event fired.");
+
+ info("Wait for the inspector to be properly reloaded");
+ await onInspectorReloaded;
+
+ // Smoke test to check that the inspector can still select nodes and hasn't
+ // gone blank.
+ await selectNode("#yay", inspector);
+});
+
+function contentPageHasNode(browser, selector) {
+ return SpecialPowers.spawn(
+ browser,
+ [selector],
+ async function (selectorChild) {
+ return !!content.document.querySelector(selectorChild);
+ }
+ );
+}