diff --git a/devtools/client/inspector/test/browser.ini b/devtools/client/inspector/test/browser.ini index 5d4658187431..65ad71c0c00b 100644 --- a/devtools/client/inspector/test/browser.ini +++ b/devtools/client/inspector/test/browser.ini @@ -133,6 +133,8 @@ subsuite = clipboard [browser_inspector_menu-05-attribute-items.js] [browser_inspector_menu-06-other.js] [browser_inspector_navigation.js] +[browser_inspector_navigate_to_errors.js] +[browser_inspector_open_on_neterror.js] [browser_inspector_pane-toggle-01.js] [browser_inspector_pane-toggle-02.js] [browser_inspector_pane-toggle-03.js] diff --git a/devtools/client/inspector/test/browser_inspector_navigate_to_errors.js b/devtools/client/inspector/test/browser_inspector_navigate_to_errors.js new file mode 100644 index 000000000000..c2266c852f9e --- /dev/null +++ b/devtools/client/inspector/test/browser_inspector_navigate_to_errors.js @@ -0,0 +1,50 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +// Test that inspector works when navigating to error pages. + +const TEST_URL_1 = "data:text/html,page"; +const TEST_URL_2 = "http://127.0.0.1:36325/"; +const TEST_URL_3 = "http://www.wronguri.wronguri/"; +const TEST_URL_4 = "data:text/html,test-doc-4"; + +add_task(function* () { + // Open the inspector on a valid URL + let { inspector, testActor } = yield openInspectorForURL(TEST_URL_1); + + info("Navigate to closed port"); + yield navigateTo(inspector, TEST_URL_2); + + let documentURI = yield testActor.eval("document.documentURI;"); + ok(documentURI.startsWith("about:neterror"), "content is correct."); + + let hasPage = yield getNodeFront("#test-doc-1", inspector); + ok(!hasPage, "Inspector actor is no longer able to reach previous page DOM node"); + + let hasNetErrorNode = yield getNodeFront("#errorShortDesc", inspector); + ok(hasNetErrorNode, "Inspector actor is able to reach error page DOM node"); + + let bundle = Services.strings.createBundle("chrome://global/locale/appstrings.properties"); + let domain = TEST_URL_2.match(/^http:\/\/(.*)\/$/)[1]; + let errorMsg = bundle.formatStringFromName("connectionFailure", + [domain], 1); + is(yield getDisplayedNodeTextContent("#errorShortDescText", inspector), errorMsg, + "Inpector really inspects the error page"); + + info("Navigate to unknown domain"); + yield navigateTo(inspector, TEST_URL_3); + + domain = TEST_URL_3.match(/^http:\/\/(.*)\/$/)[1]; + errorMsg = bundle.formatStringFromName("dnsNotFound", + [domain], 1); + is(yield getDisplayedNodeTextContent("#errorShortDescText", inspector), errorMsg, + "Inspector really inspects the new error page"); + + info("Navigate to a valid url"); + yield navigateTo(inspector, TEST_URL_4); + + is(yield getDisplayedNodeTextContent("body", inspector), "test-doc-4", + "Inspector really inspects the valid url"); +}); diff --git a/devtools/client/inspector/test/browser_inspector_open_on_neterror.js b/devtools/client/inspector/test/browser_inspector_open_on_neterror.js new file mode 100644 index 000000000000..01e065a1a7b4 --- /dev/null +++ b/devtools/client/inspector/test/browser_inspector_open_on_neterror.js @@ -0,0 +1,37 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +// Test that inspector works correctly when opened against a net error page + +const TEST_URL_1 = "http://127.0.0.1:36325/"; +const TEST_URL_2 = "data:text/html,test-doc-2"; + +add_task(function* () { + // Unfortunately, net error page are not firing load event, so that we can't + // use addTab helper and have to do that: + let tab = gBrowser.selectedTab = gBrowser.addTab("data:text/html,empty"); + yield BrowserTestUtils.browserLoaded(tab.linkedBrowser); + yield ContentTask.spawn(tab.linkedBrowser, { url: TEST_URL_1 }, function* ({ url }) { + // Also, the neterror being privileged, the DOMContentLoaded only fires on + // the chromeEventHandler. + let { chromeEventHandler } = docShell; // eslint-disable-line no-undef + let onDOMContentLoaded = ContentTaskUtils.waitForEvent(chromeEventHandler, + "DOMContentLoaded", true); + content.location = url; + yield onDOMContentLoaded; + }); + + let { inspector, testActor } = yield openInspector(); + ok(true, "Inspector loaded on the already opened net error"); + + let documentURI = yield testActor.eval("document.documentURI;"); + ok(documentURI.startsWith("about:neterror"), "content is really a net error page."); + + info("Navigate to a valid url"); + yield navigateTo(inspector, TEST_URL_2); + + is(yield getDisplayedNodeTextContent("body", inspector), "test-doc-2", + "Inspector really inspects the valid url"); +}); diff --git a/devtools/client/inspector/test/head.js b/devtools/client/inspector/test/head.js index cd6097a9c9cf..173022f18417 100644 --- a/devtools/client/inspector/test/head.js +++ b/devtools/client/inspector/test/head.js @@ -706,3 +706,26 @@ function getRuleViewRuleEditor(view, childrenIndex, nodeIndex) { view.element.children[childrenIndex].childNodes[nodeIndex]._ruleEditor : view.element.children[childrenIndex]._ruleEditor; } + +/** + * Get the text displayed for a given DOM Element's textContent within the + * markup view. + * + * @param {String} selector + * @param {InspectorPanel} inspector + * @return {String} The text displayed in the markup view + */ +function* getDisplayedNodeTextContent(selector, inspector) { + // We have to ensure that the textContent is displayed, for that the DOM + // Element has to be selected in the markup view and to be expanded. + yield selectNode(selector, inspector); + + let container = yield getContainerForSelector(selector, inspector); + yield inspector.markup.expandNode(container.node); + yield waitForMultipleChildrenUpdates(inspector); + if (container) { + let textContainer = container.elt.querySelector("pre"); + return textContainer.textContent; + } + return null; +}