/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* globals getTestActorWithoutToolbox */
"use strict";
// Test that locking the pseudoclass displays correctly in the ruleview
const PSEUDO = ":hover";
const TEST_URL = "data:text/html;charset=UTF-8," +
"
" +
" " +
"" +
"" +
' ' +
'
test div
' +
'
test div2
' +
"
" +
"";
add_task(function* () {
info("Creating the test tab and opening the rule-view");
let {toolbox, inspector, testActor} = yield openInspectorForURL(TEST_URL);
info("Selecting the ruleview sidebar");
inspector.sidebar.select("ruleview");
let view = inspector.ruleview.view;
info("Selecting the test node");
yield selectNode("#div-1", inspector);
yield togglePseudoClass(inspector);
yield assertPseudoAddedToNode(inspector, testActor, view, "#div-1");
yield togglePseudoClass(inspector);
yield assertPseudoRemovedFromNode(testActor, "#div-1");
yield assertPseudoRemovedFromView(inspector, testActor, view, "#div-1");
yield togglePseudoClass(inspector);
yield testNavigate(inspector, testActor, view);
info("Toggle pseudo on the parent and ensure everything is toggled off");
yield selectNode("#parent-div", inspector);
yield togglePseudoClass(inspector);
yield assertPseudoRemovedFromNode(testActor, "#div-1");
yield assertPseudoRemovedFromView(inspector, testActor, view, "#div-1");
yield togglePseudoClass(inspector);
info("Assert pseudo is dismissed when toggling it on a sibling node");
yield selectNode("#div-2", inspector);
yield togglePseudoClass(inspector);
yield assertPseudoAddedToNode(inspector, testActor, view, "#div-2");
let hasLock = yield testActor.hasPseudoClassLock("#div-1", PSEUDO);
ok(!hasLock, "pseudo-class lock has been removed for the previous locked node");
info("Destroying the toolbox");
let tab = toolbox.target.tab;
yield toolbox.destroy();
// As the toolbox get detroyed, we need to fetch a new test-actor
testActor = yield getTestActorWithoutToolbox(tab);
yield assertPseudoRemovedFromNode(testActor, "#div-1");
yield assertPseudoRemovedFromNode(testActor, "#div-2");
});
function* togglePseudoClass(inspector) {
info("Toggle the pseudoclass, wait for it to be applied");
// Give the inspector panels a chance to update when the pseudoclass changes
let onPseudo = inspector.selection.once("pseudoclass");
let onRefresh = inspector.once("rule-view-refreshed");
// Walker uses SDK-events so calling walker.once does not return a promise.
let onMutations = once(inspector.walker, "mutations");
yield inspector.togglePseudoClass(PSEUDO);
yield onPseudo;
yield onRefresh;
yield onMutations;
}
function* testNavigate(inspector, testActor, ruleview) {
yield selectNode("#parent-div", inspector);
info("Make sure the pseudoclass is still on after navigating to a parent");
ok((yield testActor.hasPseudoClassLock("#div-1", PSEUDO)),
"pseudo-class lock is still applied after inspecting ancestor");
yield selectNode("#div-2", inspector);
info("Make sure the pseudoclass is still set after navigating to a " +
"non-hierarchy node");
ok(yield testActor.hasPseudoClassLock("#div-1", PSEUDO),
"pseudo-class lock is still on after inspecting sibling node");
yield selectNode("#div-1", inspector);
}
function* showPickerOn(selector, inspector) {
let nodeFront = yield getNodeFront(selector, inspector);
yield inspector.highlighter.showBoxModel(nodeFront);
}
function* assertPseudoAddedToNode(inspector, testActor, ruleview, selector) {
info("Make sure the pseudoclass lock is applied to " + selector + " and its ancestors");
let hasLock = yield testActor.hasPseudoClassLock(selector, PSEUDO);
ok(hasLock, "pseudo-class lock has been applied");
hasLock = yield testActor.hasPseudoClassLock("#parent-div", PSEUDO);
ok(hasLock, "pseudo-class lock has been applied");
hasLock = yield testActor.hasPseudoClassLock("body", PSEUDO);
ok(hasLock, "pseudo-class lock has been applied");
info("Check that the ruleview contains the pseudo-class rule");
let rules = ruleview.element.querySelectorAll(
".ruleview-rule.theme-separator");
is(rules.length, 3,
"rule view is showing 3 rules for pseudo-class locked div");
is(rules[1]._ruleEditor.rule.selectorText, "div:hover",
"rule view is showing " + PSEUDO + " rule");
info("Show the highlighter on " + selector);
yield showPickerOn(selector, inspector);
info("Check that the infobar selector contains the pseudo-class");
let value = yield testActor.getHighlighterNodeTextContent(
"box-model-infobar-pseudo-classes");
is(value, PSEUDO, "pseudo-class in infobar selector");
yield inspector.highlighter.hideBoxModel();
}
function* assertPseudoRemovedFromNode(testActor, selector) {
info("Make sure the pseudoclass lock is removed from #div-1 and its " +
"ancestors");
let hasLock = yield testActor.hasPseudoClassLock(selector, PSEUDO);
ok(!hasLock, "pseudo-class lock has been removed");
hasLock = yield testActor.hasPseudoClassLock("#parent-div", PSEUDO);
ok(!hasLock, "pseudo-class lock has been removed");
hasLock = yield testActor.hasPseudoClassLock("body", PSEUDO);
ok(!hasLock, "pseudo-class lock has been removed");
}
function* assertPseudoRemovedFromView(inspector, testActor, ruleview, selector) {
info("Check that the ruleview no longer contains the pseudo-class rule");
let rules = ruleview.element.querySelectorAll(
".ruleview-rule.theme-separator");
is(rules.length, 2, "rule view is showing 2 rules after removing lock");
yield showPickerOn(selector, inspector);
let value = yield testActor.getHighlighterNodeTextContent(
"box-model-infobar-pseudo-classes");
is(value, "", "pseudo-class removed from infobar selector");
yield inspector.highlighter.hideBoxModel();
}