summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js
blob: ec9ffa7b71c3cb02b34e4313d94f4791708b9ca4 (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
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript 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 case that ensures Array and other list types are not sorted in variables
 * view.
 *
 * The tested types are:
 *  - Array
 *  - Int8Array
 *  - Int16Array
 *  - Int32Array
 *  - Uint8Array
 *  - Uint16Array
 *  - Uint32Array
 *  - Uint8ClampedArray
 *  - Float32Array
 *  - Float64Array
 *  - NodeList
 */

function test() {
  const TEST_URI = "data:text/html;charset=utf-8,   \
    <html>                                          \
      <head>                                        \
        <title>Test document for bug 977500</title> \
      </head>                                       \
      <body>                                        \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      <div></div>                                   \
      </body>                                       \
    </html>";

  let jsterm;

  function* runner() {
    const typedArrayTypes = ["Int8Array", "Int16Array", "Int32Array",
                             "Uint8Array", "Uint16Array", "Uint32Array",
                             "Uint8ClampedArray", "Float32Array",
                             "Float64Array"];

    const {tab} = yield loadTab(TEST_URI);
    const hud = yield openConsole(tab);
    jsterm = hud.jsterm;

    // Create an ArrayBuffer of 80 bytes to test TypedArrays. 80 bytes is
    // enough to get 10 items in all different TypedArrays.
    yield jsterm.execute("let buf = new ArrayBuffer(80);");

    // Array
    yield testNotSorted("Array(0,1,2,3,4,5,6,7,8,9,10)");
    // NodeList
    yield testNotSorted("document.querySelectorAll('div')");
    // Object
    yield testSorted("Object({'hello':1,1:5,10:2,4:2,'abc':1})");

    // Typed arrays.
    for (let type of typedArrayTypes) {
      yield testNotSorted("new " + type + "(buf)");
    }
  }

  /**
   * A helper that ensures the properties are not sorted when an object
   * specified by aObject is inspected.
   *
   * @param string aObject
   *        A string that, once executed, creates and returns the object to
   *        inspect.
   */
  function* testNotSorted(aObject) {
    info("Testing " + aObject);
    let deferred = promise.defer();
    jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar));
    jsterm.execute("inspect(" + aObject + ")");

    let variableScope = yield deferred.promise;
    ok(variableScope, "Variables view opened");

    // If the properties are sorted: keys = ["0", "1", "10",...] <- incorrect
    // If the properties are not sorted: keys = ["0", "1", "2",...] <- correct
    let keyIterator = variableScope._store.keys();
    is(keyIterator.next().value, "0", "First key is 0");
    is(keyIterator.next().value, "1", "Second key is 1");

    // If the properties are sorted, the next one will be 10.
    is(keyIterator.next().value, "2", "Third key is 2, not 10");
  }
  /**
   * A helper that ensures the properties are sorted when an object
   * specified by aObject is inspected.
   *
   * @param string aObject
   *        A string that, once executed, creates and returns the object to
   *        inspect.
   */
  function* testSorted(aObject) {
    info("Testing " + aObject);
    let deferred = promise.defer();
    jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar));
    jsterm.execute("inspect(" + aObject + ")");

    let variableScope = yield deferred.promise;
    ok(variableScope, "Variables view opened");

    // If the properties are sorted:
    // keys = ["1", "4", "10",..., "abc", "hello"] <- correct
    // If the properties are not sorted:
    // keys = ["1", "10", "4",...] <- incorrect
    let keyIterator = variableScope._store.keys();
    is(keyIterator.next().value, "1", "First key should be 1");
    is(keyIterator.next().value, "4", "Second key should be 4");

    // If the properties are sorted, the next one will be 10.
    is(keyIterator.next().value, "10", "Third key is 10");
    // If sorted next properties should be "abc" then "hello"
    is(keyIterator.next().value, "abc", "Fourth key is abc");
    is(keyIterator.next().value, "hello", "Fifth key is hello");
  }

  Task.spawn(runner).then(finishTest);
}