summaryrefslogtreecommitdiffstats
path: root/devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js
blob: 4e2122a24acdff3fe03aefe776c700aa9962076e (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
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";

// Test that attribute items work in the context menu

const TEST_URL = URL_ROOT + "doc_inspector_menu.html";

add_task(async function () {
  const { inspector } = await openInspectorForURL(TEST_URL);
  await selectNode("#attributes", inspector);

  await testAddAttribute();
  await testCopyAttributeValue();
  await testCopyLongAttributeValue();
  await testEditAttribute();
  await testRemoveAttribute();

  async function testAddAttribute() {
    info("Triggering 'Add Attribute' and waiting for mutation to occur");
    const addAttribute = getMenuItem("node-menu-add-attribute");
    addAttribute.click();

    EventUtils.sendString('class="u-hidden"');
    const onMutation = inspector.once("markupmutation");
    EventUtils.synthesizeKey("KEY_Enter");
    await onMutation;

    const hasAttribute = await hasMatchingElementInContentPage(
      "#attributes.u-hidden"
    );
    ok(hasAttribute, "attribute was successfully added");
  }

  async function testCopyAttributeValue() {
    info(
      "Testing 'Copy Attribute Value' and waiting for clipboard promise to resolve"
    );
    const copyAttributeValue = getMenuItem("node-menu-copy-attribute");

    info(
      "Triggering 'Copy Attribute Value' and waiting for clipboard to copy the value"
    );
    inspector.markup.contextMenu.nodeMenuTriggerInfo = {
      type: "attribute",
      name: "data-edit",
      value: "the",
    };

    await waitForClipboardPromise(() => copyAttributeValue.click(), "the");
  }

  async function testCopyLongAttributeValue() {
    info("Testing 'Copy Attribute Value' copies very long attribute values");
    const copyAttributeValue = getMenuItem("node-menu-copy-attribute");
    const longAttribute =
      "#01234567890123456789012345678901234567890123456789" +
      "12345678901234567890123456789012345678901234567890123456789012345678901" +
      "23456789012345678901234567890123456789012345678901234567890123456789012" +
      "34567890123456789012345678901234567890123456789012345678901234567890123";

    inspector.markup.contextMenu.nodeMenuTriggerInfo = {
      type: "attribute",
      name: "data-edit",
      value: longAttribute,
    };

    await waitForClipboardPromise(
      () => copyAttributeValue.click(),
      longAttribute
    );
  }

  async function testEditAttribute() {
    info("Testing 'Edit Attribute' menu item");
    const editAttribute = getMenuItem("node-menu-edit-attribute");

    info("Triggering 'Edit Attribute' and waiting for mutation to occur");
    inspector.markup.contextMenu.nodeMenuTriggerInfo = {
      type: "attribute",
      name: "data-edit",
    };
    editAttribute.click();
    EventUtils.sendString("data-edit='edited'");
    const onMutation = inspector.once("markupmutation");
    EventUtils.synthesizeKey("KEY_Enter");
    await onMutation;

    const isAttributeChanged = await hasMatchingElementInContentPage(
      "#attributes[data-edit='edited']"
    );
    ok(isAttributeChanged, "attribute was successfully edited");
  }

  async function testRemoveAttribute() {
    info("Testing 'Remove Attribute' menu item");
    const removeAttribute = getMenuItem("node-menu-remove-attribute");

    info("Triggering 'Remove Attribute' and waiting for mutation to occur");
    inspector.markup.contextMenu.nodeMenuTriggerInfo = {
      type: "attribute",
      name: "data-remove",
    };
    const onMutation = inspector.once("markupmutation");
    removeAttribute.click();
    await onMutation;

    const hasAttribute = await hasMatchingElementInContentPage(
      "#attributes[data-remove]"
    );
    ok(!hasAttribute, "attribute was successfully removed");
  }

  function getMenuItem(id) {
    const allMenuItems = openContextMenuAndGetAllItems(inspector, {
      target: getContainerForSelector("#attributes", inspector).tagLine,
    });
    const menuItem = allMenuItems.find(i => i.id === id);
    ok(menuItem, "Menu item '" + id + "' found");
    // Close the menu so synthesizing future keys won't select menu items.
    EventUtils.synthesizeKey("KEY_Escape");
    return menuItem;
  }
});