summaryrefslogtreecommitdiffstats
path: root/devtools/client/inspector/rules/test/browser_rules_content_01.js
blob: b92ec47db0310addc5e38fcb4923d877766e1d4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* Any copyright is dedicated to the Public Domain.
 http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test that the rule-view content is correct

const TEST_URI = `
  <style type="text/css">
    @media screen and (min-width: 10px) {
      #testid {
        background-color: blue;
      }
    }
    .testclass, .unmatched {
      background-color: green;
    }

    main {
      container-type: inline-size;

      & > .foo, .unmatched {
        color: tomato;

        @container (0px < width) {
          background: gold;
        }
      }
    }
  </style>
  <div id="testid" class="testclass">Styled Node</div>
  <main>
    <div class="foo">Styled Node in Nested rule</div>
  </main>
`;

add_task(async function () {
  await addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
  const { inspector, view } = await openRuleView();

  await selectNode("#testid", inspector);
  is(
    view.element.querySelectorAll("#ruleview-no-results").length,
    0,
    "After a highlight, no longer has a no-results element."
  );

  await clearCurrentNodeSelection(inspector);
  is(
    view.element.querySelectorAll("#ruleview-no-results").length,
    1,
    "After highlighting null, has a no-results element again."
  );

  await selectNode("#testid", inspector);

  let linkText = getRuleViewLinkTextByIndex(view, 1);
  is(linkText, "inline:3", "link text at index 1 has expected content.");

  const mediaText = getRuleViewAncestorRulesDataTextByIndex(view, 1);
  is(
    mediaText,
    "@media screen and (min-width: 10px) {",
    "media text at index 1 has expected content"
  );

  linkText = getRuleViewLinkTextByIndex(view, 2);
  is(linkText, "inline:7", "link text at index 2 has expected content.");
  is(
    getRuleViewAncestorRulesDataElementByIndex(view, 2),
    null,
    "There is no media text element for rule at index 2"
  );

  assertSelectors(view, 2, [
    {
      selector: ".testclass",
      matches: true,
    },
    {
      selector: ".unmatched",
      matches: false,
    },
  ]);

  info("Check nested rules");
  await selectNode(".foo", inspector);

  assertSelectors(view, 1, [
    // That's the rule that was created as a result of a
    // nested container rule (`@container (0px < width) { background: gold}`)
    // In such case, the rule's selector is only `&`, and it should be displayed as
    // matching the selected node (`<div class="foo">`).
    {
      selector: "&",
      matches: true,
    },
  ]);

  assertSelectors(view, 2, [
    {
      selector: "& > .foo",
      matches: true,
    },
    {
      selector: ".unmatched",
      matches: false,
    },
  ]);
});

/**
 * Returns the selector elements for a given rule index
 *
 * @param {Inspector} view
 * @param {Integer} ruleIndex
 * @param {Array<Object>} expectedSelectors:
 *        An array of objects representing each selector. Objects have the following shape:
 *        - selector: The expected selector text
 *        - matches: True if the selector should have the "matching" class
 */
function assertSelectors(view, ruleIndex, expectedSelectors) {
  const ruleSelectors = getRuleViewRuleEditor(
    view,
    ruleIndex
  ).selectorText.querySelectorAll(".ruleview-selector");

  is(
    ruleSelectors.length,
    expectedSelectors.length,
    `There are the expected number of selectors on rule #${ruleIndex}`
  );

  for (let i = 0; i < expectedSelectors.length; i++) {
    is(
      ruleSelectors[i].textContent,
      expectedSelectors[i].selector,
      `Got expected text for the selector element #${i} on rule #${ruleIndex}`
    );
    is(
      [...ruleSelectors[i].classList].join(","),
      "ruleview-selector," +
        (expectedSelectors[i].matches ? "matched" : "unmatched"),
      `Got expected css class on the selector element #${i} ("${ruleSelectors[i].textContent}") on rule #${ruleIndex}`
    );
  }
}