summaryrefslogtreecommitdiffstats
path: root/devtools/client/inspector/markup/test/helper_events_test_runner.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/inspector/markup/test/helper_events_test_runner.js')
-rw-r--r--devtools/client/inspector/markup/test/helper_events_test_runner.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/devtools/client/inspector/markup/test/helper_events_test_runner.js b/devtools/client/inspector/markup/test/helper_events_test_runner.js
new file mode 100644
index 000000000..acef334fb
--- /dev/null
+++ b/devtools/client/inspector/markup/test/helper_events_test_runner.js
@@ -0,0 +1,111 @@
+/* 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/. */
+/* eslint no-unused-vars: [2, {"vars": "local"}] */
+/* import-globals-from head.js */
+"use strict";
+
+/**
+ * Generator function that runs checkEventsForNode() for each object in the
+ * TEST_DATA array.
+ */
+function* runEventPopupTests(url, tests) {
+ let {inspector, testActor} = yield openInspectorForURL(url);
+
+ yield inspector.markup.expandAll();
+
+ for (let test of tests) {
+ yield checkEventsForNode(test, inspector, testActor);
+ }
+
+ // Wait for promises to avoid leaks when running this as a single test.
+ // We need to do this because we have opened a bunch of popups and don't them
+ // to affect other test runs when they are GCd.
+ yield promiseNextTick();
+}
+
+/**
+ * Generator function that takes a selector and expected results and returns
+ * the event info.
+ *
+ * @param {Object} test
+ * A test object should contain the following properties:
+ * - selector {String} a css selector targeting the node to edit
+ * - expected {Array} array of expected event objects
+ * - type {String} event type
+ * - filename {String} filename:line where the evt handler is defined
+ * - attributes {Array} array of event attributes ({String})
+ * - handler {String} string representation of the handler
+ * - beforeTest {Function} (optional) a function to execute on the page
+ * before running the test
+ * @param {InspectorPanel} inspector The instance of InspectorPanel currently
+ * opened
+ * @param {TestActorFront} testActor
+ */
+function* checkEventsForNode(test, inspector, testActor) {
+ let {selector, expected, beforeTest} = test;
+ let container = yield getContainerForSelector(selector, inspector);
+
+ if (typeof beforeTest === "function") {
+ yield beforeTest(inspector, testActor);
+ }
+
+ let evHolder = container.elt.querySelector(".markupview-events");
+
+ if (expected.length === 0) {
+ // if no event is expected, simply check that the event bubble is hidden
+ is(evHolder.style.display, "none", "event bubble should be hidden");
+ return;
+ }
+
+ let tooltip = inspector.markup.eventDetailsTooltip;
+
+ yield selectNode(selector, inspector);
+
+ // Click button to show tooltip
+ info("Clicking evHolder");
+ EventUtils.synthesizeMouseAtCenter(evHolder, {},
+ inspector.markup.doc.defaultView);
+ yield tooltip.once("shown");
+ info("tooltip shown");
+
+ // Check values
+ let headers = tooltip.panel.querySelectorAll(".event-header");
+ let nodeFront = container.node;
+ let cssSelector = nodeFront.nodeName + "#" + nodeFront.id;
+
+ for (let i = 0; i < headers.length; i++) {
+ info("Processing header[" + i + "] for " + cssSelector);
+
+ let header = headers[i];
+ let type = header.querySelector(".event-tooltip-event-type");
+ let filename = header.querySelector(".event-tooltip-filename");
+ let attributes = header.querySelectorAll(".event-tooltip-attributes");
+ let contentBox = header.nextElementSibling;
+
+ is(type.textContent, expected[i].type,
+ "type matches for " + cssSelector);
+ is(filename.textContent, expected[i].filename,
+ "filename matches for " + cssSelector);
+
+ is(attributes.length, expected[i].attributes.length,
+ "we have the correct number of attributes");
+
+ for (let j = 0; j < expected[i].attributes.length; j++) {
+ is(attributes[j].textContent, expected[i].attributes[j],
+ "attribute[" + j + "] matches for " + cssSelector);
+ }
+
+ // Make sure the header is not hidden by scrollbars before clicking.
+ header.scrollIntoView();
+
+ EventUtils.synthesizeMouseAtCenter(header, {}, type.ownerGlobal);
+ yield tooltip.once("event-tooltip-ready");
+
+ let editor = tooltip.eventTooltip._eventEditors.get(contentBox).editor;
+ is(editor.getText(), expected[i].handler,
+ "handler matches for " + cssSelector);
+ }
+
+ tooltip.hide();
+}