Backed out 11 changesets (bug 1539265) for causing debugger failures CLOSED TREE
authorarthur.iakab <aiakab@mozilla.com>
Tue, 02 Apr 2019 02:44:43 +0300
changeset 467490 85c0179c84be93c568c778a30de909ed8c9feff5
parent 467489 0b5ac3196257e0d576610d70eed389ce06ce3a2a
child 467491 f5395d54a7d10df951f10edebe4d593436f85d50
push id112626
push usercbrindusan@mozilla.com
push dateTue, 02 Apr 2019 08:40:51 +0000
treeherdermozilla-inbound@ea0977445697 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1539265
milestone68.0a1
backs out8206b880f9ecf19c5933efe72addf9c350977199
be9f5f73bdfec24cef79d9802f0b7275241d0052
f78146b8aa17f096d7e49ef45f823add5c221e76
18fa7e971a0d060a9212bad1cecf7ec6527bd923
6eaf5bdd945cb7c78ff263d90398eabd7cb54918
3add7d4d48537d359f146ece669091380a36e1f0
8015aeb5279d86b66a1f094005a22eebdc292c4d
19c8e404ac5fffb5a8b2f6714e8785adad8b5ef8
637a9d6af0f3de29bb0f4e67f136a2443373b1d8
72bbb4b28932b0c5f61c3995122622e321cbc163
931e98129878c3d22651e5bc9cdfd6bbbc5981f9
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 11 changesets (bug 1539265) for causing debugger failures CLOSED TREE Backed out changeset 8206b880f9ec (bug 1539265) Backed out changeset be9f5f73bdfe (bug 1539265) Backed out changeset f78146b8aa17 (bug 1539265) Backed out changeset 18fa7e971a0d (bug 1539265) Backed out changeset 6eaf5bdd945c (bug 1539265) Backed out changeset 3add7d4d4853 (bug 1539265) Backed out changeset 8015aeb5279d (bug 1539265) Backed out changeset 19c8e404ac5f (bug 1539265) Backed out changeset 637a9d6af0f3 (bug 1539265) Backed out changeset 72bbb4b28932 (bug 1539265) Backed out changeset 931e98129878 (bug 1539265)
devtools/client/debugger/new/packages/devtools-reps/src/reps/element-node.js
devtools/client/debugger/new/packages/devtools-reps/src/reps/stubs/element-node.js
devtools/client/debugger/new/packages/devtools-reps/src/reps/tests/element-node.js
devtools/client/inspector/breadcrumbs.js
devtools/client/inspector/markup/markup.js
devtools/client/inspector/markup/test/browser.ini
devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js
devtools/client/inspector/markup/test/browser_markup_dragdrop_before_marker_pseudo.js
devtools/client/inspector/markup/test/browser_markup_shadowdom_marker_and_before_pseudos.js
devtools/client/inspector/markup/test/doc_markup_dragdrop.html
devtools/client/inspector/markup/views/read-only-editor.js
devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js
devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js
devtools/client/inspector/rules/test/doc_pseudoelement.html
devtools/client/inspector/shared/utils.js
devtools/client/shared/components/reps/reps.js
devtools/server/actors/inspector/css-logic.js
devtools/server/actors/inspector/event-collector.js
devtools/server/actors/inspector/node.js
devtools/server/actors/inspector/utils.js
devtools/server/actors/inspector/walker.js
devtools/server/actors/utils/walker-search.js
devtools/shared/fronts/node.js
devtools/shared/inspector/css-logic.js
devtools/shared/layout/utils.js
--- a/devtools/client/debugger/new/packages/devtools-reps/src/reps/element-node.js
+++ b/devtools/client/debugger/new/packages/devtools-reps/src/reps/element-node.js
@@ -88,39 +88,30 @@ function ElementNode(props) {
   return span(baseConfig, ...elements, inspectIcon);
 }
 
 function getElements(grip, mode) {
   const {
     attributes,
     nodeName,
     isAfterPseudoElement,
-    isBeforePseudoElement,
-    isMarkerPseudoElement,
+    isBeforePseudoElement
   } = grip.preview;
   const nodeNameElement = span(
     {
       className: "tag-name"
     },
     nodeName
   );
 
-  let pseudoNodeName;
-  if (isAfterPseudoElement) {
-    pseudoNodeName = "after";
-  } else if (isBeforePseudoElement) {
-    pseudoNodeName = "before";
-  } else if (isMarkerPseudoElement) {
-    pseudoNodeName = "marker";
-  }
-  if (pseudoNodeName) {
+  if (isAfterPseudoElement || isBeforePseudoElement) {
     return [
       span(
         { className: "attrName" },
-        `::${pseudoNodeName}`
+        `::${isAfterPseudoElement ? "after" : "before"}`
       )
     ];
   }
 
   if (mode === MODE.TINY) {
     const elements = [nodeNameElement];
     if (attributes.id) {
       elements.push(span({ className: "attrName" }, `#${attributes.id}`));
--- a/devtools/client/debugger/new/packages/devtools-reps/src/reps/stubs/element-node.js
+++ b/devtools/client/debugger/new/packages/devtools-reps/src/reps/stubs/element-node.js
@@ -243,29 +243,16 @@ stubs.set("NodeWithLongStringAttribute",
         length: 50000,
         actor: "server1.conn1.child1/longString29"
       }
     },
     attributesLength: 1
   }
 });
 
-stubs.set("MarkerPseudoElement", {
-  type: "object",
-  actor: "server1.conn1.child1/obj26",
-  preview: {
-    kind: "DOMNode",
-    nodeType: 1,
-    nodeName: "_moz_generated_content_marker",
-    attributes: {},
-    attributesLength: 0,
-    isMarkerPseudoElement: true
-  }
-});
-
 stubs.set("BeforePseudoElement", {
   type: "object",
   actor: "server1.conn1.child1/obj27",
   preview: {
     kind: "DOMNode",
     nodeType: 1,
     nodeName: "_moz_generated_content_before",
     attributes: {},
--- a/devtools/client/debugger/new/packages/devtools-reps/src/reps/tests/element-node.js
+++ b/devtools/client/debugger/new/packages/devtools-reps/src/reps/tests/element-node.js
@@ -460,45 +460,16 @@ describe("ElementNode - Element attribut
       renderedComponent
         .first()
         .find("span.attrValue")
         .prop("title")
     ).toBe("a".repeat(1000));
   });
 });
 
-describe("ElementNode - : Marker pseudo element", () => {
-  const stub = stubs.get("MarkerPseudoElement");
-
-  it("selects ElementNode Rep", () => {
-    expect(getRep(stub)).toBe(ElementNode.rep);
-  });
-
-  it("renders with expected text content", () => {
-    const renderedComponent = shallow(
-      ElementNode.rep({
-        object: stub
-      })
-    );
-
-    expect(renderedComponent.text()).toEqual("::marker");
-  });
-
-  it("renders with expected text content in tiny mode", () => {
-    const renderedComponent = shallow(
-      ElementNode.rep({
-        object: stub,
-        mode: MODE.TINY
-      })
-    );
-
-    expect(renderedComponent.text()).toEqual("::marker");
-  });
-});
-
 describe("ElementNode - : Before pseudo element", () => {
   const stub = stubs.get("BeforePseudoElement");
 
   it("selects ElementNode Rep", () => {
     expect(getRep(stub)).toBe(ElementNode.rep);
   });
 
   it("renders with expected text content", () => {
--- a/devtools/client/inspector/breadcrumbs.js
+++ b/devtools/client/inspector/breadcrumbs.js
@@ -423,22 +423,18 @@ HTMLBreadcrumbs.prototype = {
 
   /**
    * Build a string that represents the node: tagName#id.class1.class2.
    * @param {NodeFront} node The node to pretty-print
    * @return {String}
    */
   prettyPrintNodeAsText: function(node) {
     let text = node.isShadowRoot ? SHADOW_ROOT_TAGNAME : node.displayName;
-    if (node.isMarkerPseudoElement) {
-      text = "::marker";
-    } else if (node.isBeforePseudoElement) {
-      text = "::before";
-    } else if (node.isAfterPseudoElement) {
-      text = "::after";
+    if (node.isPseudoElement) {
+      text = node.isBeforePseudoElement ? "::before" : "::after";
     }
 
     if (node.id) {
       text += "#" + node.id;
     }
 
     if (node.className) {
       const classList = node.className.split(/\s+/);
@@ -471,22 +467,18 @@ HTMLBreadcrumbs.prototype = {
 
     const classesLabel = this.doc.createElementNS(NS_XHTML, "span");
     classesLabel.className = "breadcrumbs-widget-item-classes plain";
 
     const pseudosLabel = this.doc.createElementNS(NS_XHTML, "span");
     pseudosLabel.className = "breadcrumbs-widget-item-pseudo-classes plain";
 
     let tagText = node.isShadowRoot ? SHADOW_ROOT_TAGNAME : node.displayName;
-    if (node.isMarkerPseudoElement) {
-      tagText = "::marker";
-    } else if (node.isBeforePseudoElement) {
-      tagText = "::before";
-    } else if (node.isAfterPseudoElement) {
-      tagText = "::after";
+    if (node.isPseudoElement) {
+      tagText = node.isBeforePseudoElement ? "::before" : "::after";
     }
     let idText = node.id ? ("#" + node.id) : "";
     let classesText = "";
 
     if (node.className) {
       const classList = node.className.split(/\s+/);
       for (let i = 0; i < classList.length; i++) {
         classesText += "." + classList[i];
--- a/devtools/client/inspector/markup/markup.js
+++ b/devtools/client/inspector/markup/markup.js
@@ -2175,26 +2175,22 @@ MarkupView.prototype = {
         target.previousElementSibling.nodeName.toLowerCase() === "ul") {
       parent = target.parentNode.container.node;
       nextSibling = null;
     } else {
       parent = target.parentNode.container.node.parentNode();
       nextSibling = target.parentNode.container.node;
     }
 
-    if (nextSibling) {
-      while (
-        nextSibling.isMarkerPseudoElement || nextSibling.isBeforePseudoElement
-      ) {
-        nextSibling = this.getContainer(nextSibling).elt.nextSibling.container.node;
-      }
-      if (nextSibling.isAfterPseudoElement) {
-        parent = target.parentNode.container.node.parentNode();
-        nextSibling = null;
-      }
+    if (nextSibling && nextSibling.isBeforePseudoElement) {
+      nextSibling = target.parentNode.parentNode.children[1].container.node;
+    }
+    if (nextSibling && nextSibling.isAfterPseudoElement) {
+      parent = target.parentNode.container.node.parentNode();
+      nextSibling = null;
     }
 
     if (parent.nodeType !== nodeConstants.ELEMENT_NODE) {
       return null;
     }
 
     return {parent, nextSibling};
   },
--- a/devtools/client/inspector/markup/test/browser.ini
+++ b/devtools/client/inspector/markup/test/browser.ini
@@ -110,17 +110,16 @@ subsuite = clipboard
 skip-if = (os == 'linux' && bits == 32 && debug) || (os == "win" && processor == "aarch64") # bug 1328915, disable linux32 debug devtools for timeouts, disabled on aarch64 due to 1531598
 [browser_markup_css_completion_style_attribute_01.js]
 [browser_markup_css_completion_style_attribute_02.js]
 [browser_markup_css_completion_style_attribute_03.js]
 [browser_markup_display_node_01.js]
 [browser_markup_display_node_02.js]
 [browser_markup_dragdrop_autoscroll_01.js]
 [browser_markup_dragdrop_autoscroll_02.js]
-[browser_markup_dragdrop_before_marker_pseudo.js]
 [browser_markup_dragdrop_distance.js]
 [browser_markup_dragdrop_draggable.js]
 [browser_markup_dragdrop_dragRootNode.js]
 [browser_markup_dragdrop_escapeKeyPress.js]
 [browser_markup_dragdrop_invalidNodes.js]
 [browser_markup_dragdrop_reorder.js]
 [browser_markup_dragdrop_tooltip.js]
 [browser_markup_events_01.js]
@@ -197,17 +196,16 @@ skip-if = verify
 [browser_markup_shadowdom.js]
 [browser_markup_shadowdom_clickreveal.js]
 [browser_markup_shadowdom_clickreveal_scroll.js]
 [browser_markup_shadowdom_copy_paths.js]
 subsuite = clipboard
 [browser_markup_shadowdom_delete.js]
 [browser_markup_shadowdom_dynamic.js]
 [browser_markup_shadowdom_hover.js]
-[browser_markup_shadowdom_marker_and_before_pseudos.js]
 [browser_markup_shadowdom_maxchildren.js]
 [browser_markup_shadowdom_mutations_shadow.js]
 [browser_markup_shadowdom_navigation.js]
 [browser_markup_shadowdom_nested_pick_inspect.js]
 [browser_markup_shadowdom_noslot.js]
 [browser_markup_shadowdom_open_debugger.js]
 skip-if = (os == 'win' && processor == 'aarch64') # bug 1533507
 [browser_markup_shadowdom_shadowroot_mode.js]
--- a/devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js
+++ b/devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js
@@ -9,28 +9,28 @@
 
 const TOP_CONTAINER_LEVEL = 3;
 
 add_task(async function() {
   const {inspector} = await openInspectorForURL(`
     data:text/html;charset=utf-8,
     <h1>foo</h1>
     <span>bar</span>
-    <dl>
-      <dt></dt>
-    </dl>`);
+    <ul>
+      <li></li>
+    </ul>`);
   const markup = inspector.markup;
   const doc = markup.doc;
   const win = doc.defaultView;
 
   const rootElt = markup.getContainer(markup._rootNode).elt;
   const bodyContainer = await getContainerForSelector("body", inspector);
   const spanContainer = await getContainerForSelector("span", inspector);
   const headerContainer = await getContainerForSelector("h1", inspector);
-  const listContainer = await getContainerForSelector("dl", inspector);
+  const listContainer = await getContainerForSelector("ul", inspector);
 
   // Focus on the tree element.
   rootElt.focus();
 
   // Test tree related semantics
   is(rootElt.getAttribute("role"), "tree",
     "Root container should have tree semantics");
   is(rootElt.getAttribute("aria-dropeffect"), "none",
@@ -66,26 +66,26 @@ add_task(async function() {
   ok(!spanContainer.tagLine.hasAttribute("aria-expanded"),
     "Non expandable tree items should not have aria-expanded attribute");
   ok(!headerContainer.tagLine.hasAttribute("aria-expanded"),
     "Non expandable tree items should not have aria-expanded attribute");
   is(listContainer.tagLine.getAttribute("aria-expanded"), "false",
     "Closed tree item should have aria-expanded unset");
 
   info("Selecting and expanding list container");
-  await selectNode("dl", inspector);
+  await selectNode("ul", inspector);
   EventUtils.synthesizeKey("VK_RIGHT", {}, win);
   await waitForMultipleChildrenUpdates(inspector);
 
   is(rootElt.getAttribute("aria-activedescendant"),
     listContainer.tagLine.getAttribute("id"),
     "Active descendant should not be set to list container tagLine");
   is(listContainer.tagLine.getAttribute("aria-expanded"), "true",
     "Open tree item should have aria-expanded set");
-  const listItemContainer = await getContainerForSelector("dt", inspector);
+  const listItemContainer = await getContainerForSelector("li", inspector);
   is(listItemContainer.tagLine.getAttribute("aria-level"),
     TOP_CONTAINER_LEVEL + 1,
     "Grand child container tagLine should have nested level up to date");
   is(listItemContainer.children.getAttribute("role"), "presentation",
     "Container with no children should have its children element ignored by " +
     "accessibility");
 
   info("Collapsing list container");
deleted file mode 100644
--- a/devtools/client/inspector/markup/test/browser_markup_dragdrop_before_marker_pseudo.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* vim: set ts=2 et sw=2 tw=80: */
-/* Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-// Test drag and dropping a node before a ::marker pseudo.
-
-const TEST_URL = URL_ROOT + "doc_markup_dragdrop.html";
-
-add_task(async function() {
-  const {inspector} = await openInspectorForURL(TEST_URL);
-
-  info("Expand #list node");
-  const parentFront = await getNodeFront("#list", inspector);
-  await inspector.markup.expandNode(parentFront.parentNode());
-  await inspector.markup.expandNode(parentFront);
-  await waitForMultipleChildrenUpdates(inspector);
-
-  info("Scroll #list into view");
-  const parentContainer = await getContainerForNodeFront(parentFront, inspector);
-  parentContainer.elt.scrollIntoView(true);
-
-  info("Test placing an element before a ::marker psuedo");
-  await moveElementBeforeMarker("#last-list-child", parentFront, inspector);
-  const childNodes = await getChildrenOf(parentFront, inspector);
-  is(childNodes[0], "_moz_generated_content_marker",
-     "::marker is still the first child of #list");
-  is(childNodes[1], "last-list-child",
-     "#last-list-child is now the second child of #list");
-  is(childNodes[2], "first-list-child",
-     "#first-list-child is now the last child of #list");
-});
-
-async function moveElementBeforeMarker(selector, parentFront, inspector) {
-  info(`Placing ${selector} before its parent's ::marker`);
-
-  const container = await getContainerForSelector(selector, inspector);
-  const parentContainer = await getContainerForNodeFront(parentFront, inspector);
-  const offsetY = (parentContainer.tagLine.offsetTop +
-    parentContainer.tagLine.offsetHeight) - container.tagLine.offsetTop;
-
-  const onMutated = inspector.once("markupmutation");
-  const uiUpdate = inspector.once("inspector-updated");
-
-  await simulateNodeDragAndDrop(inspector, selector, 0, offsetY);
-
-  const mutations = await onMutated;
-  await uiUpdate;
-
-  is(mutations.length, 2, "2 mutations were received");
-}
-
-async function getChildrenOf(parentFront, {walker}) {
-  const {nodes} = await walker.children(parentFront);
-  return nodes.map(node => {
-    if (node.isMarkerPseudoElement) {
-      return node.displayName;
-    }
-    return node.id;
-  });
-}
deleted file mode 100644
--- a/devtools/client/inspector/markup/test/browser_markup_shadowdom_marker_and_before_pseudos.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/* vim: set ts=2 et sw=2 tw=80: */
-/* Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-requestLongerTimeout(1);
-
-// Test a few static pages using webcomponents with ::marker and ::before
-// pseudos and check that they are displayed as expected in the markup view.
-
-const TEST_DATA = [
-  {
-    // Test that ::before on an empty shadow host is displayed when the host
-    // has a ::marker.
-    title: "::before after ::marker, empty node",
-    url: `data:text/html;charset=utf-8,
-      <style>
-        test-component { display: list-item; }
-        test-component::before { content: "before-host" }
-      </style>
-
-      <test-component></test-component>
-
-      <script>
-        'use strict';
-        customElements.define('test-component', class extends HTMLElement {
-          constructor() {
-            super();
-            let shadowRoot = this.attachShadow({mode: "#MODE#"});
-          }
-        });
-      </script>`,
-    tree: `
-      test-component
-        #shadow-root
-        ::marker
-        ::before`,
-
-  }, {
-    // Test ::before on a shadow host with content is displayed when the host
-    // has a ::marker.
-    title: "::before after ::marker, non-empty node",
-    url: `data:text/html;charset=utf-8,
-      <style>
-        test-component { display: list-item }
-        test-component::before { content: "before-host" }
-      </style>
-
-      <test-component>
-        <div class="light-dom"></div>
-      </test-component>
-
-      <script>
-        "use strict";
-        customElements.define("test-component", class extends HTMLElement {
-          constructor() {
-            super();
-            let shadowRoot = this.attachShadow({mode: "#MODE#"});
-            shadowRoot.innerHTML = "<slot>default content</slot>";
-          }
-        });
-      </script>`,
-    tree: `
-      test-component
-        #shadow-root
-          slot
-            div!slotted
-        ::marker
-        ::before
-        class="light-dom"`,
-  }, {
-    // Test just ::marker on a shadow host
-    title: "just ::marker, no ::before",
-    url: `data:text/html;charset=utf-8,
-      <style>
-        test-component { display: list-item }
-      </style>
-
-      <test-component></test-component>
-
-      <script>
-        "use strict";
-        customElements.define("test-component", class extends HTMLElement {
-          constructor() {
-            super();
-            let shadowRoot = this.attachShadow({mode: "#MODE#"});
-          }
-        });
-      </script>`,
-    tree: `
-      test-component
-        #shadow-root
-        ::marker`,
-  },
-];
-
-for (const {url, tree, title} of TEST_DATA) {
-  // Test each configuration in both open and closed modes
-  add_task(async function() {
-    info(`Testing: [${title}] in OPEN mode`);
-    const {inspector, tab} = await openInspectorForURL(url.replace(/#MODE#/g, "open"));
-    await assertMarkupViewAsTree(tree, "test-component", inspector);
-    await removeTab(tab);
-  });
-  add_task(async function() {
-    info(`Testing: [${title}] in CLOSED mode`);
-    const {inspector, tab} = await openInspectorForURL(url.replace(/#MODE#/g, "closed"));
-    await assertMarkupViewAsTree(tree, "test-component", inspector);
-    await removeTab(tab);
-  });
-}
--- a/devtools/client/inspector/markup/test/doc_markup_dragdrop.html
+++ b/devtools/client/inspector/markup/test/doc_markup_dragdrop.html
@@ -20,22 +20,16 @@ https://bugzilla.mozilla.org/show_bug.cg
   <input id="anonymousParent" /><span id="before">Before<!-- Force not-inline --></span>
   <pre id="test"><span id="firstChild">First</span><span id="middleChild">Middle</span><span id="lastChild">Last</span></pre>  <span id="after">After</span>
 
   <test-component class="test-component">
     <div slot="slot1" class="slotted1">slot1-1</div>
     <div slot="slot1" class="slotted2">slot1-2</div>
   </test-component>
 
-  <ol>
-    <li id="list"><span id="first-list-child"
-      >List item start</span><span id="last-list-child"
-      >List item end</span></li>
-  </ol>
-
   <script>
     "use strict";
     customElements.define("test-component", class extends HTMLElement {
       constructor() {
         super();
         const shadowRoot = this.attachShadow({mode: "open"});
         shadowRoot.innerHTML = '<slot class="slot1" name="slot1"></slot>';
       }
--- a/devtools/client/inspector/markup/views/read-only-editor.js
+++ b/devtools/client/inspector/markup/views/read-only-editor.js
@@ -11,23 +11,17 @@ const nodeConstants = require("devtools/
  */
 function ReadOnlyEditor(container, node) {
   this.container = container;
   this.markup = this.container.markup;
   this.buildMarkup();
 
   if (node.isPseudoElement) {
     this.tag.classList.add("theme-fg-color3");
-    if (node.isMarkerPseudoElement) {
-      this.tag.textContent = "::marker";
-    } else if (node.isBeforePseudoElement) {
-      this.tag.textContent = "::before";
-    } else if (node.isAfterPseudoElement) {
-      this.tag.textContent = "::after";
-    }
+    this.tag.textContent = node.isBeforePseudoElement ? "::before" : "::after";
   } else if (node.nodeType == nodeConstants.DOCUMENT_TYPE_NODE) {
     this.elt.classList.add("comment", "doctype");
     this.tag.textContent = node.doctypeString;
   } else if (node.isShadowRoot) {
     this.tag.textContent = `#shadow-root (${node.shadowRootMode})`;
   } else {
     this.tag.textContent = node.nodeName;
   }
--- a/devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js
+++ b/devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js
@@ -16,28 +16,26 @@ add_task(async function() {
   const {inspector, view} = await openRuleView();
 
   await testTopLeft(inspector, view);
   await testTopRight(inspector, view);
   await testBottomRight(inspector, view);
   await testBottomLeft(inspector, view);
   await testParagraph(inspector, view);
   await testBody(inspector, view);
-  await testList(inspector, view);
 });
 
 async function testTopLeft(inspector, view) {
   const id = "#topleft";
   const rules = await assertPseudoElementRulesNumbers(id,
     inspector, view, {
       elementRulesNb: 4,
       firstLineRulesNb: 2,
       firstLetterRulesNb: 1,
       selectionRulesNb: 1,
-      markerRulesNb: 0,
       afterRulesNb: 1,
       beforeRulesNb: 2,
     }
   );
 
   const gutters = assertGutters(view);
 
   info("Make sure that clicking on the twisty hides pseudo elements");
@@ -120,17 +118,16 @@ async function testTopLeft(inspector, vi
 }
 
 async function testTopRight(inspector, view) {
   await assertPseudoElementRulesNumbers("#topright", inspector, view, {
     elementRulesNb: 4,
     firstLineRulesNb: 1,
     firstLetterRulesNb: 1,
     selectionRulesNb: 0,
-    markerRulesNb: 0,
     beforeRulesNb: 2,
     afterRulesNb: 1,
   });
 
   const gutters = assertGutters(view);
 
   const expander = gutters[0].querySelector(".ruleview-expander");
   ok(!view.element.firstChild.classList.contains("show-expandable-container"),
@@ -143,42 +140,39 @@ async function testTopRight(inspector, v
 }
 
 async function testBottomRight(inspector, view) {
   await assertPseudoElementRulesNumbers("#bottomright", inspector, view, {
     elementRulesNb: 4,
     firstLineRulesNb: 1,
     firstLetterRulesNb: 1,
     selectionRulesNb: 0,
-    markerRulesNb: 0,
     beforeRulesNb: 3,
     afterRulesNb: 1,
   });
 }
 
 async function testBottomLeft(inspector, view) {
   await assertPseudoElementRulesNumbers("#bottomleft", inspector, view, {
     elementRulesNb: 4,
     firstLineRulesNb: 1,
     firstLetterRulesNb: 1,
     selectionRulesNb: 0,
-    markerRulesNb: 0,
     beforeRulesNb: 2,
     afterRulesNb: 1,
   });
 }
 
 async function testParagraph(inspector, view) {
   const rules =
     await assertPseudoElementRulesNumbers("#bottomleft p", inspector, view, {
       elementRulesNb: 3,
       firstLineRulesNb: 1,
       firstLetterRulesNb: 1,
       selectionRulesNb: 2,
-      markerRulesNb: 0,
       beforeRulesNb: 0,
       afterRulesNb: 0,
     });
 
   assertGutters(view);
 
   const elementFirstLineRule = rules.firstLineRules[0];
   is(convertTextPropsToString(elementFirstLineRule.textProps),
@@ -198,30 +192,16 @@ async function testParagraph(inspector, 
 
 async function testBody(inspector, view) {
   await testNode("body", inspector, view);
 
   const gutters = getGutters(view);
   is(gutters.length, 0, "There are no gutter headings");
 }
 
-async function testList(inspector, view) {
-  await assertPseudoElementRulesNumbers("#list", inspector, view, {
-    elementRulesNb: 4,
-    firstLineRulesNb: 1,
-    firstLetterRulesNb: 1,
-    selectionRulesNb: 0,
-    markerRulesNb: 1,
-    beforeRulesNb: 1,
-    afterRulesNb: 1,
-  });
-
-  assertGutters(view);
-}
-
 function convertTextPropsToString(textProps) {
   return textProps.map(t => t.name + ": " + t.value).join("; ");
 }
 
 async function testNode(selector, inspector, view) {
   await selectNode(selector, inspector);
   const elementStyle = view._elementStyle;
   return elementStyle;
@@ -233,34 +213,30 @@ async function assertPseudoElementRulesN
   const rules = {
     elementRules: elementStyle.rules.filter(rule => !rule.pseudoElement),
     firstLineRules: elementStyle.rules.filter(rule =>
       rule.pseudoElement === ":first-line"),
     firstLetterRules: elementStyle.rules.filter(rule =>
       rule.pseudoElement === ":first-letter"),
     selectionRules: elementStyle.rules.filter(rule =>
       rule.pseudoElement === ":selection"),
-    markerRules: elementStyle.rules.filter(rule =>
-      rule.pseudoElement === ":marker"),
     beforeRules: elementStyle.rules.filter(rule =>
       rule.pseudoElement === ":before"),
     afterRules: elementStyle.rules.filter(rule =>
       rule.pseudoElement === ":after"),
   };
 
   is(rules.elementRules.length, ruleNbs.elementRulesNb,
      selector + " has the correct number of non pseudo element rules");
   is(rules.firstLineRules.length, ruleNbs.firstLineRulesNb,
      selector + " has the correct number of :first-line rules");
   is(rules.firstLetterRules.length, ruleNbs.firstLetterRulesNb,
      selector + " has the correct number of :first-letter rules");
   is(rules.selectionRules.length, ruleNbs.selectionRulesNb,
      selector + " has the correct number of :selection rules");
-  is(rules.markerRules.length, ruleNbs.markerRulesNb,
-     selector + " has the correct number of :marker rules");
   is(rules.beforeRules.length, ruleNbs.beforeRulesNb,
      selector + " has the correct number of :before rules");
   is(rules.afterRules.length, ruleNbs.afterRulesNb,
      selector + " has the correct number of :after rules");
 
   return rules;
 }
 
--- a/devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js
+++ b/devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js
@@ -21,23 +21,9 @@ add_task(async function() {
   is(beforeElement.tagName, "_moz_generated_content_before",
     "tag name is correct");
   await selectNode(beforeElement, inspector);
 
   const afterElement = children.nodes[children.nodes.length - 1];
   is(afterElement.tagName, "_moz_generated_content_after",
     "tag name is correct");
   await selectNode(afterElement, inspector);
-
-  const listNode = await getNodeFront("#list", inspector);
-  const listChildren = await inspector.markup.walker.children(listNode);
-
-  is(listChildren.nodes.length, 4, "<li> has correct number of children");
-  const markerElement = listChildren.nodes[0];
-  is(markerElement.tagName, "_moz_generated_content_marker",
-    "tag name is correct");
-  await selectNode(markerElement, inspector);
-
-  const listBeforeElement = listChildren.nodes[1];
-  is(listBeforeElement.tagName, "_moz_generated_content_before",
-    "tag name is correct");
-  await selectNode(listBeforeElement, inspector);
 });
--- a/devtools/client/inspector/rules/test/doc_pseudoelement.html
+++ b/devtools/client/inspector/rules/test/doc_pseudoelement.html
@@ -101,20 +101,16 @@ p:first-letter {
     right:0;
 }
 
 .bottomleft:before {
     bottom:0;
     left:0;
 }
 
-#list::marker {
-    color: purple;
-}
-
     </style>
   </head>
   <body>
     <h1>ruleview pseudoelement($("test"));</h1>
 
     <div id="topleft" class="box topleft">
         <p>Top Left<br />Position</p>
     </div>
@@ -126,14 +122,10 @@ p:first-letter {
     <div id="bottomright" class="box bottomright">
         <p>Bottom Right<br />Position</p>
     </div>
 
     <div id="bottomleft" class="box bottomleft">
         <p>Bottom Left<br />Position</p>
     </div>
 
-    <ol>
-        <li id="list" class="box">List element</li>
-    </ol>
-
   </body>
 </html>
--- a/devtools/client/inspector/shared/utils.js
+++ b/devtools/client/inspector/shared/utils.js
@@ -134,25 +134,20 @@ function getLongString(longStringActorPr
  * @return {String} selector of the element node.
  */
 function getSelectorFromGrip(grip) {
   const {
     attributes,
     nodeName,
     isAfterPseudoElement,
     isBeforePseudoElement,
-    isMarkerPseudoElement,
   } = grip.preview;
 
-  if (isAfterPseudoElement) {
-    return "::after";
-  } else if (isBeforePseudoElement) {
-    return "::before";
-  } else if (isMarkerPseudoElement) {
-    return "::marker";
+  if (isAfterPseudoElement || isBeforePseudoElement) {
+    return `::${isAfterPseudoElement ? "after" : "before"}`;
   }
 
   let selector = nodeName;
 
   if (attributes.id) {
     selector += `#${attributes.id}`;
   }
 
@@ -200,17 +195,16 @@ function translateNodeFrontToGrip(nodeFr
 
   return {
     actor: nodeFront.actorID,
     preview: {
       attributes: attributesMap,
       attributesLength: attributes.length,
       isAfterPseudoElement: nodeFront.isAfterPseudoElement,
       isBeforePseudoElement: nodeFront.isBeforePseudoElement,
-      isMarkerPseudoElement: nodeFront.isMarkerPseudoElement,
       // All the grid containers are assumed to be in the DOM tree.
       isConnected: true,
       // nodeName is already lowerCased in Node grips
       nodeName: nodeFront.nodeName.toLowerCase(),
       nodeType: nodeFront.nodeType,
     },
   };
 }
--- a/devtools/client/shared/components/reps/reps.js
+++ b/devtools/client/shared/components/reps/reps.js
@@ -84,37 +84,37 @@ module.exports = __WEBPACK_EXTERNAL_MODU
 
 /***/ 1:
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_1__;
 
 /***/ }),
 
-/***/ 109:
+/***/ 108:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var _tree = __webpack_require__(110);
+var _tree = __webpack_require__(109);
 
 var _tree2 = _interopRequireDefault(_tree);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 module.exports = {
   Tree: _tree2.default
 }; /* 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/. */
 
 /***/ }),
 
-/***/ 110:
+/***/ 109:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
@@ -132,17 +132,17 @@ var _propTypes = __webpack_require__(0);
 var _propTypes2 = _interopRequireDefault(_propTypes);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 const { Component, createFactory } = _react2.default; /* 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/>. */
 
-__webpack_require__(111);
+__webpack_require__(110);
 
 // depth
 const AUTO_EXPAND_DEPTH = 0;
 
 // Simplied selector targetting elements that can receive the focus,
 // full version at https://stackoverflow.com/questions/1599660.
 const FOCUSABLE_SELECTOR = ["a[href]:not([tabindex='-1'])", "button:not([disabled]):not([tabindex='-1'])", "iframe:not([tabindex='-1'])", "input:not([disabled]):not([tabindex='-1'])", "select:not([disabled]):not([tabindex='-1'])", "textarea:not([disabled]):not([tabindex='-1'])", "[tabindex]:not([tabindex='-1'])"].join(", ");
 
@@ -1083,24 +1083,24 @@ class Tree extends Component {
     }, nodes);
   }
 }
 
 exports.default = Tree;
 
 /***/ }),
 
-/***/ 111:
+/***/ 110:
 /***/ (function(module, exports) {
 
 // removed by extract-text-webpack-plugin
 
 /***/ }),
 
-/***/ 114:
+/***/ 113:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
@@ -1395,33 +1395,33 @@ const Grip = {
   maxLengthMap
 };
 
 // Exports from this module
 module.exports = Grip;
 
 /***/ }),
 
-/***/ 115:
+/***/ 114:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
 
 const { maybeEscapePropertyName } = __webpack_require__(2);
 const ArrayRep = __webpack_require__(38);
-const GripArrayRep = __webpack_require__(191);
-const GripMap = __webpack_require__(193);
-const GripMapEntryRep = __webpack_require__(194);
-const ErrorRep = __webpack_require__(190);
-const BigIntRep = __webpack_require__(187);
+const GripArrayRep = __webpack_require__(192);
+const GripMap = __webpack_require__(194);
+const GripMapEntryRep = __webpack_require__(195);
+const ErrorRep = __webpack_require__(191);
+const BigIntRep = __webpack_require__(188);
 const { isLongString } = __webpack_require__(25);
 
 const MAX_NUMERICAL_PROPERTIES = 100;
 
 const NODE_TYPES = {
   BUCKET: Symbol("[n…m]"),
   DEFAULT_PROPERTIES: Symbol("<default properties>"),
   ENTRIES: Symbol("<entries>"),
@@ -2273,17 +2273,17 @@ module.exports = {
   nodeSupportsNumericalBucketing,
   setNodeChildren,
   sortProperties,
   NODE_TYPES
 };
 
 /***/ }),
 
-/***/ 116:
+/***/ 115:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 function initialState() {
   return {
     expandedPaths: new Set(),
@@ -2382,29 +2382,29 @@ const selectors = {
 Object.defineProperty(module.exports, "__esModule", {
   value: true
 });
 module.exports = selectors;
 module.exports.default = reducer;
 
 /***/ }),
 
-/***/ 117:
+/***/ 116:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
 
-const client = __webpack_require__(196);
-const loadProperties = __webpack_require__(195);
-const node = __webpack_require__(115);
+const client = __webpack_require__(197);
+const loadProperties = __webpack_require__(196);
+const node = __webpack_require__(114);
 const { nodeIsError, nodeIsPrimitive } = node;
 const selection = __webpack_require__(488);
 
 const { MODE } = __webpack_require__(4);
 const {
   REPS: { Rep, Grip }
 } = __webpack_require__(24);
 
@@ -2434,17 +2434,17 @@ module.exports = {
   node,
   renderRep,
   selection,
   shouldRenderRootsInReps
 };
 
 /***/ }),
 
-/***/ 187:
+/***/ 188:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
@@ -2478,17 +2478,17 @@ function supportsObject(object, noGrip =
 
 module.exports = {
   rep: wrapRender(BigInt),
   supportsObject
 };
 
 /***/ }),
 
-/***/ 188:
+/***/ 189:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
@@ -2643,17 +2643,17 @@ module.exports = {
   supportsObject,
   cleanFunctionName,
   // exported for testing purpose.
   getFunctionName
 };
 
 /***/ }),
 
-/***/ 189:
+/***/ 190:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
@@ -2678,31 +2678,31 @@ module.exports = {
   DOCUMENT_POSITION_FOLLOWING: 0x04,
   DOCUMENT_POSITION_CONTAINS: 0x08,
   DOCUMENT_POSITION_CONTAINED_BY: 0x10,
   DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20
 };
 
 /***/ }),
 
-/***/ 190:
+/***/ 191:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
 
 // ReactJS
 const PropTypes = __webpack_require__(0);
 // Utils
 const { getGripType, isGrip, wrapRender } = __webpack_require__(2);
-const { cleanFunctionName } = __webpack_require__(188);
+const { cleanFunctionName } = __webpack_require__(189);
 const { isLongString } = __webpack_require__(25);
 const { MODE } = __webpack_require__(4);
 
 const dom = __webpack_require__(1);
 const { span } = dom;
 const IGNORED_SOURCE_URLS = ["debugger eval code"];
 
 /**
@@ -2905,30 +2905,30 @@ function supportsObject(object, noGrip =
 // Exports from this module
 module.exports = {
   rep: wrapRender(ErrorRep),
   supportsObject
 };
 
 /***/ }),
 
-/***/ 191:
+/***/ 192:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
 
 // Dependencies
 const PropTypes = __webpack_require__(0);
 
-const { lengthBubble } = __webpack_require__(192);
+const { lengthBubble } = __webpack_require__(193);
 const {
   interleave,
   getGripType,
   isGrip,
   wrapRender,
   ellipsisElement
 } = __webpack_require__(2);
 const { MODE } = __webpack_require__(4);
@@ -3137,17 +3137,17 @@ module.exports = {
   rep: wrapRender(GripArray),
   supportsObject,
   maxLengthMap,
   getLength
 };
 
 /***/ }),
 
-/***/ 192:
+/***/ 193:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
@@ -3192,29 +3192,29 @@ function GripLengthBubble(props) {
 }
 
 module.exports = {
   lengthBubble: wrapRender(GripLengthBubble)
 };
 
 /***/ }),
 
-/***/ 193:
+/***/ 194:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
 
 // Dependencies
 
-const { lengthBubble } = __webpack_require__(192);
+const { lengthBubble } = __webpack_require__(193);
 const PropTypes = __webpack_require__(0);
 const {
   interleave,
   isGrip,
   wrapRender,
   ellipsisElement
 } = __webpack_require__(2);
 const PropRep = __webpack_require__(39);
@@ -3387,17 +3387,17 @@ module.exports = {
   rep: wrapRender(GripMap),
   supportsObject,
   maxLengthMap,
   getLength
 };
 
 /***/ }),
 
-/***/ 194:
+/***/ 195:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
@@ -3461,51 +3461,51 @@ function createGripMapEntry(key, value) 
 module.exports = {
   rep: wrapRender(GripMapEntry),
   createGripMapEntry,
   supportsObject
 };
 
 /***/ }),
 
-/***/ 195:
+/***/ 196:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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/>. */
 
 const {
   enumEntries,
   enumIndexedProperties,
   enumNonIndexedProperties,
   getPrototype,
   enumSymbols,
   getFullText
-} = __webpack_require__(196);
+} = __webpack_require__(197);
 
 const {
   getClosestGripNode,
   getClosestNonBucketNode,
   getValue,
   nodeHasAccessors,
   nodeHasAllEntriesInPreview,
   nodeHasProperties,
   nodeIsBucket,
   nodeIsDefaultProperties,
   nodeIsEntries,
   nodeIsMapEntry,
   nodeIsPrimitive,
   nodeIsProxy,
   nodeNeedsNumericalBuckets,
   nodeIsLongString
-} = __webpack_require__(115);
+} = __webpack_require__(114);
 
 function loadItemProperties(item, createObjectClient, createLongStringClient, loadedProperties) {
   const gripItem = getClosestGripNode(item);
   const value = getValue(gripItem);
 
   const [start, end] = item.meta ? [item.meta.startIndex, item.meta.endIndex] : [];
 
   const promises = [];
@@ -3612,23 +3612,23 @@ module.exports = {
   shouldLoadItemNonIndexedProperties,
   shouldLoadItemPrototype,
   shouldLoadItemSymbols,
   shouldLoadItemFullText
 };
 
 /***/ }),
 
-/***/ 196:
+/***/ 197:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-const { getValue, nodeHasFullText } = __webpack_require__(115); /* This Source Code Form is subject to the terms of the Mozilla Public
+const { getValue, nodeHasFullText } = __webpack_require__(114); /* 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/>. */
 
 async function enumIndexedProperties(objectClient, start, end) {
   try {
     const { iterator } = await objectClient.enumProperties({
       ignoreNonIndexedProperties: true
     });
@@ -4183,36 +4183,36 @@ const Obj = __webpack_require__(462);
 const SymbolRep = __webpack_require__(463);
 const InfinityRep = __webpack_require__(464);
 const NaNRep = __webpack_require__(465);
 const Accessor = __webpack_require__(466);
 
 // DOM types (grips)
 const Accessible = __webpack_require__(467);
 const Attribute = __webpack_require__(468);
-const BigInt = __webpack_require__(187);
+const BigInt = __webpack_require__(188);
 const DateTime = __webpack_require__(469);
 const Document = __webpack_require__(470);
 const DocumentType = __webpack_require__(471);
 const Event = __webpack_require__(472);
-const Func = __webpack_require__(188);
+const Func = __webpack_require__(189);
 const PromiseRep = __webpack_require__(473);
 const RegExp = __webpack_require__(474);
 const StyleSheet = __webpack_require__(475);
 const CommentNode = __webpack_require__(476);
 const ElementNode = __webpack_require__(477);
 const TextNode = __webpack_require__(478);
-const ErrorRep = __webpack_require__(190);
+const ErrorRep = __webpack_require__(191);
 const Window = __webpack_require__(479);
 const ObjectWithText = __webpack_require__(480);
 const ObjectWithURL = __webpack_require__(481);
-const GripArray = __webpack_require__(191);
-const GripMap = __webpack_require__(193);
-const GripMapEntry = __webpack_require__(194);
-const Grip = __webpack_require__(114);
+const GripArray = __webpack_require__(192);
+const GripMap = __webpack_require__(194);
+const GripMapEntry = __webpack_require__(195);
+const Grip = __webpack_require__(113);
 
 // List of all registered template.
 // XXX there should be a way for extensions to register a new
 // or modify an existing rep.
 const reps = [RegExp, StyleSheet, Event, DateTime, CommentNode, Accessible, ElementNode, TextNode, Attribute, Func, PromiseRep, ArrayRep, Document, DocumentType, Window, ObjectWithText, ObjectWithURL, ErrorRep, GripArray, GripMap, GripMapEntry, Grip, Undefined, Null, StringRep, Number, BigInt, SymbolRep, InfinityRep, NaNRep, Accessor, Obj];
 
 /**
  * Generic rep that is used for rendering native JS types or an object.
@@ -4775,17 +4775,17 @@ PropRep.propTypes = {
 /**
  * Function that given a name, a delimiter and an object returns an array
  * of React elements representing an object property (e.g. `name: value`)
  *
  * @param {Object} props
  * @return {Array} Array of React elements.
  */
 function PropRep(props) {
-  const Grip = __webpack_require__(114);
+  const Grip = __webpack_require__(113);
   const { Rep } = __webpack_require__(24);
 
   let { name, mode, equal, suppressQuotes } = props;
 
   let key;
   // The key can be a simple string, for plain objects,
   // or another object for maps and weakmaps.
   if (typeof name === "string") {
@@ -5789,17 +5789,17 @@ module.exports = {
 
 // ReactJS
 const PropTypes = __webpack_require__(0);
 
 // Reps
 const { isGrip, wrapRender } = __webpack_require__(2);
 
 const { MODE } = __webpack_require__(4);
-const { rep } = __webpack_require__(114);
+const { rep } = __webpack_require__(113);
 
 /**
  * Renders DOM event objects.
  */
 Event.propTypes = {
   object: PropTypes.object.isRequired,
   // @TODO Change this to Object.values when supported in Node's version of V8
   mode: PropTypes.oneOf(Object.keys(MODE).map(key => MODE[key])),
@@ -6131,17 +6131,17 @@ module.exports = {
 const PropTypes = __webpack_require__(0);
 const {
   isGrip,
   cropString,
   cropMultipleLines,
   wrapRender
 } = __webpack_require__(2);
 const { MODE } = __webpack_require__(4);
-const nodeConstants = __webpack_require__(189);
+const nodeConstants = __webpack_require__(190);
 const dom = __webpack_require__(1);
 const { span } = dom;
 
 /**
  * Renders DOM comment node.
  */
 CommentNode.propTypes = {
   object: PropTypes.object.isRequired,
@@ -6193,17 +6193,17 @@ module.exports = {
 
 // ReactJS
 const PropTypes = __webpack_require__(0);
 
 // Utils
 const { isGrip, wrapRender } = __webpack_require__(2);
 const { rep: StringRep, isLongString } = __webpack_require__(25);
 const { MODE } = __webpack_require__(4);
-const nodeConstants = __webpack_require__(189);
+const nodeConstants = __webpack_require__(190);
 
 const dom = __webpack_require__(1);
 const { span } = dom;
 
 const MAX_ATTRIBUTE_LENGTH = 50;
 
 /**
  * Renders DOM element node.
@@ -6277,33 +6277,24 @@ function ElementNode(props) {
   return span(baseConfig, ...elements, inspectIcon);
 }
 
 function getElements(grip, mode) {
   const {
     attributes,
     nodeName,
     isAfterPseudoElement,
-    isBeforePseudoElement,
-    isMarkerPseudoElement
+    isBeforePseudoElement
   } = grip.preview;
   const nodeNameElement = span({
     className: "tag-name"
   }, nodeName);
 
-  let pseudoNodeName;
-  if (isAfterPseudoElement) {
-    pseudoNodeName = "after";
-  } else if (isBeforePseudoElement) {
-    pseudoNodeName = "before";
-  } else if (isMarkerPseudoElement) {
-    pseudoNodeName = "marker";
-  }
-  if (pseudoNodeName) {
-    return [span({ className: "attrName" }, `::${pseudoNodeName}`)];
+  if (isAfterPseudoElement || isBeforePseudoElement) {
+    return [span({ className: "attrName" }, `::${isAfterPseudoElement ? "after" : "before"}`)];
   }
 
   if (mode === MODE.TINY) {
     const elements = [nodeNameElement];
     if (attributes.id) {
       elements.push(span({ className: "attrName" }, `#${attributes.id}`));
     }
     if (attributes.class) {
@@ -6675,53 +6666,53 @@ module.exports = {
 "use strict";
 
 
 /* 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/>. */
 
 const ObjectInspector = __webpack_require__(483);
-const utils = __webpack_require__(117);
-const reducer = __webpack_require__(116);
+const utils = __webpack_require__(116);
+const reducer = __webpack_require__(115);
 
 module.exports = { ObjectInspector, utils, reducer };
 
 /***/ }),
 
 /***/ 483:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var _devtoolsComponents = __webpack_require__(109);
+var _devtoolsComponents = __webpack_require__(108);
 
 var _devtoolsComponents2 = _interopRequireDefault(_devtoolsComponents);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /* 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/>. */
 
 const { Component, createFactory, createElement } = __webpack_require__(6);
 const { connect } = __webpack_require__(484);
 const actions = __webpack_require__(485);
 
-const selectors = __webpack_require__(116);
+const selectors = __webpack_require__(115);
 
 const Tree = createFactory(_devtoolsComponents2.default.Tree);
 __webpack_require__(486);
 
 const ObjectInspectorItem = createFactory(__webpack_require__(487));
 
 const classnames = __webpack_require__(67);
 
-const Utils = __webpack_require__(117);
+const Utils = __webpack_require__(116);
 const { renderRep, shouldRenderRootsInReps } = Utils;
 const {
   getChildrenWithEvaluations,
   getActor,
   getParent,
   getValue,
   nodeIsPrimitive,
   nodeHasGetter,
@@ -6996,21 +6987,21 @@ module.exports = __WEBPACK_EXTERNAL_MODU
 /***/ }),
 
 /***/ 485:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-const { loadItemProperties } = __webpack_require__(195); /* This Source Code Form is subject to the terms of the Mozilla Public
+const { loadItemProperties } = __webpack_require__(196); /* 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/>. */
 
-const { getLoadedProperties, getActors } = __webpack_require__(116);
+const { getLoadedProperties, getActors } = __webpack_require__(115);
 
 /**
  * This action is responsible for expanding a given node, which also means that
  * it will call the action responsible to fetch properties.
  */
 function nodeExpand(node, actor) {
   return async ({ dispatch, getState }) => {
     dispatch({ type: "NODE_EXPAND", data: { node } });
@@ -7143,17 +7134,17 @@ const { Component } = __webpack_require_
 const dom = __webpack_require__(1);
 
 const { appinfo } = _devtoolsServices2.default;
 const isMacOS = appinfo.OS === "Darwin";
 
 const classnames = __webpack_require__(67);
 const { MODE } = __webpack_require__(4);
 
-const Utils = __webpack_require__(117);
+const Utils = __webpack_require__(116);
 
 const {
   getValue,
   nodeHasAccessors,
   nodeHasProperties,
   nodeIsBlock,
   nodeIsDefaultProperties,
   nodeIsFunction,
--- a/devtools/server/actors/inspector/css-logic.js
+++ b/devtools/server/actors/inspector/css-logic.js
@@ -660,17 +660,17 @@ CssLogic.getSelectors = function(domRule
 /**
  * Given a node, check to see if it is a ::before or ::after element.
  * If so, return the node that is accessible from within the document
  * (the parent of the anonymous node), along with which pseudo element
  * it was.  Otherwise, return the node itself.
  *
  * @returns {Object}
  *            - {DOMNode} node The non-anonymous node
- *            - {string} pseudo One of ':marker', ':before', ':after', or null.
+ *            - {string} pseudo One of ':before', ':after', or null.
  */
 CssLogic.getBindingElementAndPseudo = getBindingElementAndPseudo;
 
 /**
  * Get the computed style on a node.  Automatically handles reading
  * computed styles on a ::before/::after element by reading on the
  * parent node with the proper pseudo argument.
  *
--- a/devtools/server/actors/inspector/event-collector.js
+++ b/devtools/server/actors/inspector/event-collector.js
@@ -7,17 +7,16 @@
 
 "use strict";
 
 const { Cu } = require("chrome");
 const Services = require("Services");
 const {
   isAfterPseudoElement,
   isBeforePseudoElement,
-  isMarkerPseudoElement,
   isNativeAnonymous,
 } = require("devtools/shared/layout/utils");
 const Debugger = require("Debugger");
 
 // eslint-disable-next-line
 const JQUERY_LIVE_REGEX = /return typeof \w+.*.event\.triggered[\s\S]*\.event\.(dispatch|handle).*arguments/;
 
 const REACT_EVENT_NAMES = [
@@ -385,17 +384,17 @@ class DOMEventCollector extends MainEven
  */
 class JQueryEventCollector extends MainEventCollector {
   getListeners(node, {checkOnly} = {}) {
     const jQuery = this.getJQuery(node);
     const handlers = [];
 
     // If jQuery is not on the page, if this is an anonymous node or a pseudo
     // element we need to return early.
-    if (!jQuery || isNativeAnonymous(node) || isMarkerPseudoElement(node) ||
+    if (!jQuery || isNativeAnonymous(node) ||
         isBeforePseudoElement(node) || isAfterPseudoElement(node)) {
       if (checkOnly) {
         return false;
       }
       return handlers;
     }
 
     let eventsObj = null;
--- a/devtools/server/actors/inspector/node.js
+++ b/devtools/server/actors/inspector/node.js
@@ -13,17 +13,16 @@ const { nodeSpec, nodeListSpec } = requi
 loader.lazyRequireGetter(this, "getCssPath", "devtools/shared/inspector/css-logic", true);
 loader.lazyRequireGetter(this, "getXPath", "devtools/shared/inspector/css-logic", true);
 loader.lazyRequireGetter(this, "findCssSelector", "devtools/shared/inspector/css-logic", true);
 
 loader.lazyRequireGetter(this, "isAfterPseudoElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isAnonymous", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isBeforePseudoElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isDirectShadowHostChild", "devtools/shared/layout/utils", true);
-loader.lazyRequireGetter(this, "isMarkerPseudoElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isNativeAnonymous", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isShadowAnonymous", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isShadowHost", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isShadowRoot", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "getShadowRootMode", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isXBLAnonymous", "devtools/shared/layout/utils", true);
 
 loader.lazyRequireGetter(this, "InspectorActorUtils", "devtools/server/actors/inspector/utils");
@@ -123,17 +122,16 @@ const NodeActor = protocol.ActorClassWit
 
       // doctype attributes
       name: this.rawNode.name,
       publicId: this.rawNode.publicId,
       systemId: this.rawNode.systemId,
 
       attrs: this.writeAttrs(),
       customElementLocation: this.getCustomElementLocation(),
-      isMarkerPseudoElement: isMarkerPseudoElement(this.rawNode),
       isBeforePseudoElement: isBeforePseudoElement(this.rawNode),
       isAfterPseudoElement: isAfterPseudoElement(this.rawNode),
       isAnonymous: isAnonymous(this.rawNode),
       isNativeAnonymous: isNativeAnonymous(this.rawNode),
       isXBLAnonymous: isXBLAnonymous(this.rawNode),
       isShadowAnonymous: isShadowAnonymous(this.rawNode),
       isShadowRoot: shadowRoot,
       shadowRootMode: getShadowRootMode(this.rawNode),
@@ -183,19 +181,17 @@ const NodeActor = protocol.ActorClassWit
     this.rawNode.addEventListener("slotchange", this.slotchangeListener);
   },
 
   // Estimate the number of children that the walker will return without making
   // a call to children() if possible.
   get numChildren() {
     // For pseudo elements, childNodes.length returns 1, but the walker
     // will return 0.
-    if (isMarkerPseudoElement(this.rawNode) ||
-      isBeforePseudoElement(this.rawNode) || isAfterPseudoElement(this.rawNode)
-    ) {
+    if (isBeforePseudoElement(this.rawNode) || isAfterPseudoElement(this.rawNode)) {
       return 0;
     }
 
     const rawNode = this.rawNode;
     let numChildren = rawNode.childNodes.length;
     const hasAnonChildren = rawNode.nodeType === Node.ELEMENT_NODE &&
                           rawNode.ownerDocument.getAnonymousNodes(rawNode);
 
--- a/devtools/server/actors/inspector/utils.js
+++ b/devtools/server/actors/inspector/utils.js
@@ -55,24 +55,23 @@ function isInXULDocument(el) {
   const doc = nodeDocument(el);
   return doc &&
          doc.documentElement &&
          doc.documentElement.namespaceURI === XUL_NS;
 }
 
 /**
  * This DeepTreeWalker filter skips whitespace text nodes and anonymous
- * content with the exception of ::marker, ::before, and ::after, plus anonymous
- * content in XUL document (needed to show all elements in the browser toolbox).
+ * content with the exception of ::before and ::after and anonymous content
+ * in XUL document (needed to show all elements in the browser toolbox).
  */
 function standardTreeWalkerFilter(node) {
-  // ::marker, ::before, and ::after are native anonymous content, but we always
+  // ::before and ::after are native anonymous content, but we always
   // want to show them
-  if (node.nodeName === "_moz_generated_content_marker" ||
-      node.nodeName === "_moz_generated_content_before" ||
+  if (node.nodeName === "_moz_generated_content_before" ||
       node.nodeName === "_moz_generated_content_after") {
     return nodeFilterConstants.FILTER_ACCEPT;
   }
 
   // Ignore empty whitespace text nodes that do not impact the layout.
   if (isWhitespaceTextNode(node)) {
     return nodeHasSize(node)
            ? nodeFilterConstants.FILTER_ACCEPT
--- a/devtools/server/actors/inspector/walker.js
+++ b/devtools/server/actors/inspector/walker.js
@@ -12,17 +12,16 @@ const {walkerSpec} = require("devtools/s
 const {LongStringActor} = require("devtools/server/actors/string");
 const InspectorUtils = require("InspectorUtils");
 
 loader.lazyRequireGetter(this, "getFrameElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isAfterPseudoElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isAnonymous", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isBeforePseudoElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isDirectShadowHostChild", "devtools/shared/layout/utils", true);
-loader.lazyRequireGetter(this, "isMarkerPseudoElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isNativeAnonymous", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isShadowHost", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isShadowRoot", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "isTemplateElement", "devtools/shared/layout/utils", true);
 loader.lazyRequireGetter(this, "loadSheet", "devtools/shared/layout/utils", true);
 
 loader.lazyRequireGetter(this, "throttle", "devtools/shared/throttle", true);
 
@@ -83,17 +82,16 @@ const PSEUDO_SELECTORS = [
   [":last-child", 2],
   [":root", 0],
   [":empty", 0],
   [":target", 0],
   [":enabled", 0],
   [":disabled", 0],
   [":checked", 1],
   ["::selection", 0],
-  ["::marker", 0],
 ];
 
 const HELPER_SHEET = "data:text/css;charset=utf-8," + encodeURIComponent(`
   .__fx-devtools-hide-shortcut__ {
     visibility: hidden !important;
   }
 
   :-moz-devtools-highlighted {
@@ -533,18 +531,17 @@ var WalkerActor = protocol.ActorClassWit
   /**
    * If the given NodeActor only has a single text node as a child with a text
    * content small enough to be inlined, return that child's NodeActor.
    *
    * @param NodeActor node
    */
   inlineTextChild: function({ rawNode }) {
     // Quick checks to prevent creating a new walker if possible.
-    if (isMarkerPseudoElement(rawNode) ||
-        isBeforePseudoElement(rawNode) ||
+    if (isBeforePseudoElement(rawNode) ||
         isAfterPseudoElement(rawNode) ||
         isShadowHost(rawNode) ||
         rawNode.nodeType != Node.ELEMENT_NODE ||
         rawNode.children.length > 0) {
       return undefined;
     }
 
     const walker = this.getDocumentWalker(rawNode);
@@ -863,36 +860,30 @@ var WalkerActor = protocol.ActorClassWit
       hasLast = nodes[nodes.length - 1] == lastChild;
     } else {
       // If nodes is still an empty array, we are on a host element with a shadow root but
       // no direct children.
       hasFirst = hasLast = true;
     }
 
     if (shadowHost) {
-      // Use anonymous walkers to fetch ::marker / ::before / ::after pseudo
-      // elements
+      // Use anonymous walkers to fetch ::before / ::after pseudo elements
       const firstChildWalker = this.getDocumentWalker(node.rawNode);
       const first = firstChildWalker.firstChild();
-      const hasMarker = first && first.nodeName === "_moz_generated_content_marker";
-      const maybeBeforeNode = hasMarker ? firstChildWalker.nextSibling() : first;
-      const hasBefore = maybeBeforeNode &&
-        maybeBeforeNode.nodeName === "_moz_generated_content_before";
+      const hasBefore = first && first.nodeName === "_moz_generated_content_before";
 
       const lastChildWalker = this.getDocumentWalker(node.rawNode);
       const last = lastChildWalker.lastChild();
       const hasAfter = last && last.nodeName === "_moz_generated_content_after";
 
       nodes = [
         // #shadow-root
         ...(hideShadowRoot ? [] : [node.rawNode.openOrClosedShadowRoot]),
-        // ::marker
-        ...(hasMarker ? [first] : []),
         // ::before
-        ...(hasBefore ? [maybeBeforeNode] : []),
+        ...(hasBefore ? [first] : []),
         // shadow host direct children
         ...nodes,
         // native anonymous content for UA widgets
         ...(showNativeAnonymousChildren ?
           this.getNativeAnonymousChildren(node.rawNode) : []),
         // ::after
         ...(hasAfter ? [last] : []),
       ];
--- a/devtools/server/actors/utils/walker-search.js
+++ b/devtools/server/actors/utils/walker-search.js
@@ -88,20 +88,17 @@ WalkerIndex.prototype = {
     const documentWalker = this.walker.getDocumentWalker(this.doc);
     while (documentWalker.nextNode()) {
       const node = documentWalker.currentNode;
 
       if (node.nodeType === 1) {
         // For each element node, we get the tagname and all attributes names
         // and values
         const localName = node.localName;
-        if (localName === "_moz_generated_content_marker") {
-          this._addToIndex("tag", node, "::marker");
-          this._addToIndex("text", node, node.textContent.trim());
-        } else if (localName === "_moz_generated_content_before") {
+        if (localName === "_moz_generated_content_before") {
           this._addToIndex("tag", node, "::before");
           this._addToIndex("text", node, node.textContent.trim());
         } else if (localName === "_moz_generated_content_after") {
           this._addToIndex("tag", node, "::after");
           this._addToIndex("text", node, node.textContent.trim());
         } else {
           this._addToIndex("tag", node, node.localName);
         }
--- a/devtools/shared/fronts/node.js
+++ b/devtools/shared/fronts/node.js
@@ -262,28 +262,24 @@ class NodeFront extends FrontClassWithSp
   }
   get numChildren() {
     return this._form.numChildren;
   }
   get hasEventListeners() {
     return this._form.hasEventListeners;
   }
 
-  get isMarkerPseudoElement() {
-    return this._form.isMarkerPseudoElement;
-  }
   get isBeforePseudoElement() {
     return this._form.isBeforePseudoElement;
   }
   get isAfterPseudoElement() {
     return this._form.isAfterPseudoElement;
   }
   get isPseudoElement() {
-    return this.isBeforePseudoElement || this.isAfterPseudoElement ||
-      this.isMarkerPseudoElement;
+    return this.isBeforePseudoElement || this.isAfterPseudoElement;
   }
   get isAnonymous() {
     return this._form.isAnonymous;
   }
   get isInHTMLDocument() {
     return this._form.isInHTMLDocument;
   }
   get tagName() {
--- a/devtools/shared/inspector/css-logic.js
+++ b/devtools/shared/inspector/css-logic.js
@@ -451,32 +451,29 @@ exports.getCssPath = getCssPath;
 /**
  * Get the xpath for a given element.
  * @param {DomNode} ele
  * @returns a string that can be used as an XPath to find the element uniquely.
  */
 exports.getXPath = getXPath;
 
 /**
- * Given a node, check to see if it is a ::marker, ::before, or ::after element.
+ * Given a node, check to see if it is a ::before or ::after element.
  * If so, return the node that is accessible from within the document
  * (the parent of the anonymous node), along with which pseudo element
  * it was.  Otherwise, return the node itself.
  *
  * @returns {Object}
  *            - {DOMNode} node The non-anonymous node
- *            - {string} pseudo One of ':marker', ':before', ':after', or null.
+ *            - {string} pseudo One of ':before', ':after', or null.
  */
 function getBindingElementAndPseudo(node) {
   let bindingElement = node;
   let pseudo = null;
-  if (node.nodeName == "_moz_generated_content_marker") {
-    bindingElement = node.parentNode;
-    pseudo = ":marker";
-  } else if (node.nodeName == "_moz_generated_content_before") {
+  if (node.nodeName == "_moz_generated_content_before") {
     bindingElement = node.parentNode;
     pseudo = ":before";
   } else if (node.nodeName == "_moz_generated_content_after") {
     bindingElement = node.parentNode;
     pseudo = ":after";
   }
   return {
     bindingElement: bindingElement,
--- a/devtools/shared/layout/utils.js
+++ b/devtools/shared/layout/utils.js
@@ -633,40 +633,28 @@ exports.isShadowHost = isShadowHost;
  * still considered to be the "host" element, and we need to walk them differently.
  *
  * @param {DOMNode} node
  * @return {Boolean}
  */
 function isDirectShadowHostChild(node) {
   // Pseudo elements and native anonymous elements are always part of the anonymous tree.
   if (
-    isMarkerPseudoElement(node) ||
     isBeforePseudoElement(node) ||
     isAfterPseudoElement(node) ||
     isNativeAnonymous(node)) {
     return false;
   }
 
   const parentNode = node.parentNode;
   return parentNode && !!parentNode.openOrClosedShadowRoot;
 }
 exports.isDirectShadowHostChild = isDirectShadowHostChild;
 
 /**
- * Determine whether a node is a ::marker pseudo.
- *
- * @param {DOMNode} node
- * @return {Boolean}
- */
-function isMarkerPseudoElement(node) {
-  return node.nodeName === "_moz_generated_content_marker";
-}
-exports.isMarkerPseudoElement = isMarkerPseudoElement;
-
-/**
  * Determine whether a node is a ::before pseudo.
  *
  * @param {DOMNode} node
  * @return {Boolean}
  */
 function isBeforePseudoElement(node) {
   return node.nodeName === "_moz_generated_content_before";
 }