⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 195305 in webkit


Ignore:
Timestamp:
Jan 19, 2016, 12:20:53 PM (11 years ago)
Author:
Nikita Vasilyev
Message:

Web Inspector: WebInspector.Object.addEventListener is O(n), make it O(1)
https://bugs.webkit.org/show_bug.cgi?id=152422
<rdar://problem/24038047>

Reviewed by Timothy Hatcher.

Source/WebInspectorUI:

Slow addEventListener was the main cause of Console sluggishness[1].

This patch changes:
addEventListener from O(n) to O(1)
removeEventListener from O(n) to O(1)

Now, addEventListener and removeEventListener take <1ms regardless of the
number of listeners attached.

removeEventListener(null, null, thisObject), a special case when all events
for thisObject are removed, was improved from O(n2) to O(n).

  • UserInterface/Base/LinkedList.js: Added.

(LinkedList):
(LinkedList.prototype.clear):
(LinkedList.prototype.get last):
(LinkedList.prototype.push):
(LinkedList.prototype.remove):
(LinkedList.prototype.forEach):
(LinkedList.prototype.toArray):
(LinkedList.prototype.toJSON):
(LinkedListNode):
LinkedList ensures O(1) time complexity for push and remove operations.

  • UserInterface/Base/ListMultimap.js: Added.

(ListMultimap):
(ListMultimap.prototype.get size):
(ListMultimap.prototype.add):
(ListMultimap.prototype.delete):
(ListMultimap.prototype.deleteAll):
(ListMultimap.prototype.has):
(ListMultimap.prototype.clear):
(ListMultimap.prototype.forEach):
(ListMultimap.prototype.toArray):
(ListMultimap.prototype.toJSON):
ListMultimap unsures O(1) time complexity for add, has and delete operations.
ListMultimap preserves insertion order by using a LinkedList.

  • UserInterface/Base/Object.js:

(WebInspector.Object):
(WebInspector.Object.addEventListener):
(WebInspector.Object.removeEventListener):
(WebInspector.Object.hasEventListeners):
(WebInspector.Object.retainedObjectsWithPrototype):
(WebInspector.Object.prototype.dispatchEventToListeners):
Replace this._listeners[eventType] from array of objects to ListMultimap.

  • UserInterface/Main.html:
  • UserInterface/Test.html:
  • UserInterface/TestStub.html:

LayoutTests:

  • inspector/console/console-api-expected.txt:
  • inspector/console/console-table-expected.txt:
  • inspector/model/remote-object-expected.txt:

Rebaseline tests, add "_listeners: null" to all WebInspector.Object instances.

  • inspector/unit-tests/linked-list-expected.txt: Added.
  • inspector/unit-tests/linked-list.html: Added.
  • inspector/unit-tests/list-multimap-expected.txt: Added.
  • inspector/unit-tests/list-multimap.html: Added.
Location:
trunk
Files:
6 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r195301 r195305  
     12016-01-19  Nikita Vasilyev  <nvasilyev@apple.com>
     2
     3        Web Inspector: WebInspector.Object.addEventListener is O(n), make it O(1)
     4        https://bugs.webkit.org/show_bug.cgi?id=152422
     5        <rdar://problem/24038047>
     6
     7        Reviewed by Timothy Hatcher.
     8
     9        * inspector/console/console-api-expected.txt:
     10        * inspector/console/console-table-expected.txt:
     11        * inspector/model/remote-object-expected.txt:
     12        Rebaseline tests, add "_listeners: null" to all WebInspector.Object instances.
     13
     14        * inspector/unit-tests/linked-list-expected.txt: Added.
     15        * inspector/unit-tests/linked-list.html: Added.
     16        * inspector/unit-tests/list-multimap-expected.txt: Added.
     17        * inspector/unit-tests/list-multimap.html: Added.
     18
    1192016-01-19  Brady Eidson  <beidson@apple.com>
    220
  • trunk/LayoutTests/inspector/console/console-api-expected.txt

    r194981 r195305  
    2020STEP: console.log('console.log')
    2121{
     22  "_listeners": null,
    2223  "_source": "console-api",
    2324  "_level": "log",
     
    4243STEP: console.warn('console.warn')
    4344{
     45  "_listeners": null,
    4446  "_source": "console-api",
    4547  "_level": "warning",
     
    6466STEP: console.error('console.error')
    6567{
     68  "_listeners": null,
    6669  "_source": "console-api",
    6770  "_level": "error",
     
    8689STEP: console.debug('console.debug')
    8790{
     91  "_listeners": null,
    8892  "_source": "console-api",
    8993  "_level": "debug",
     
    108112STEP: console.info('console.info')
    109113{
     114  "_listeners": null,
    110115  "_source": "console-api",
    111116  "_level": "info",
     
    130135STEP: console.assert(false, 'assertion message')
    131136{
     137  "_listeners": null,
    132138  "_source": "console-api",
    133139  "_level": "error",
     
    152158STEP: console.trace()
    153159{
     160  "_listeners": null,
    154161  "_source": "console-api",
    155162  "_level": "log",
     
    166173STEP: console.log('string message', string)
    167174{
     175  "_listeners": null,
    168176  "_source": "console-api",
    169177  "_level": "log",
     
    194202STEP: console.log('message', object, object)
    195203{
     204  "_listeners": null,
    196205  "_source": "console-api",
    197206  "_level": "log",
     
    215224      "_hasChildren": true,
    216225      "_preview": {
     226        "_listeners": null,
    217227        "_type": "object",
    218228        "_description": "Object",
     
    221231        "_properties": [
    222232          {
     233            "_listeners": null,
    223234            "_name": "a",
    224235            "_type": "number",
     
    235246      "_hasChildren": true,
    236247      "_preview": {
     248        "_listeners": null,
    237249        "_type": "object",
    238250        "_description": "Object",
     
    241253        "_properties": [
    242254          {
     255            "_listeners": null,
    243256            "_name": "a",
    244257            "_type": "number",
     
    256269STEP: console.error('message', object)
    257270{
     271  "_listeners": null,
    258272  "_source": "console-api",
    259273  "_level": "error",
     
    277291      "_hasChildren": true,
    278292      "_preview": {
     293        "_listeners": null,
    279294        "_type": "object",
    280295        "_description": "Object",
     
    283298        "_properties": [
    284299          {
     300            "_listeners": null,
    285301            "_name": "a",
    286302            "_type": "number",
     
    298314STEP: console.warn('message', object)
    299315{
     316  "_listeners": null,
    300317  "_source": "console-api",
    301318  "_level": "warning",
     
    319336      "_hasChildren": true,
    320337      "_preview": {
     338        "_listeners": null,
    321339        "_type": "object",
    322340        "_description": "Object",
     
    325343        "_properties": [
    326344          {
     345            "_listeners": null,
    327346            "_name": "a",
    328347            "_type": "number",
     
    340359STEP: console.debug('message', object)
    341360{
     361  "_listeners": null,
    342362  "_source": "console-api",
    343363  "_level": "debug",
     
    361381      "_hasChildren": true,
    362382      "_preview": {
     383        "_listeners": null,
    363384        "_type": "object",
    364385        "_description": "Object",
     
    367388        "_properties": [
    368389          {
     390            "_listeners": null,
    369391            "_name": "a",
    370392            "_type": "number",
     
    382404STEP: console.info('message', object)
    383405{
     406  "_listeners": null,
    384407  "_source": "console-api",
    385408  "_level": "info",
     
    403426      "_hasChildren": true,
    404427      "_preview": {
     428        "_listeners": null,
    405429        "_type": "object",
    406430        "_description": "Object",
     
    409433        "_properties": [
    410434          {
     435            "_listeners": null,
    411436            "_name": "a",
    412437            "_type": "number",
     
    424449STEP: console.dir(object)
    425450{
     451  "_listeners": null,
    426452  "_source": "console-api",
    427453  "_level": "log",
     
    439465      "_hasChildren": true,
    440466      "_preview": {
     467        "_listeners": null,
    441468        "_type": "object",
    442469        "_description": "Object",
     
    445472        "_properties": [
    446473          {
     474            "_listeners": null,
    447475            "_name": "a",
    448476            "_type": "number",
     
    460488STEP: console.dirxml(object)
    461489{
     490  "_listeners": null,
    462491  "_source": "console-api",
    463492  "_level": "log",
     
    475504      "_hasChildren": true,
    476505      "_preview": {
     506        "_listeners": null,
    477507        "_type": "object",
    478508        "_description": "Object",
     
    481511        "_properties": [
    482512          {
     513            "_listeners": null,
    483514            "_name": "a",
    484515            "_type": "number",
     
    496527STEP: console.group('groupName')
    497528{
     529  "_listeners": null,
    498530  "_source": "console-api",
    499531  "_level": "log",
     
    518550STEP: console.groupEnd('groupName')
    519551{
     552  "_listeners": null,
    520553  "_source": "console-api",
    521554  "_level": "log",
     
    540573STEP: console.groupCollapsed('collapsedGroupName')
    541574{
     575  "_listeners": null,
    542576  "_source": "console-api",
    543577  "_level": "log",
     
    562596STEP: console.groupEnd('collapsedGroupName')
    563597{
     598  "_listeners": null,
    564599  "_source": "console-api",
    565600  "_level": "log",
     
    584619STEP: console.count()
    585620{
     621  "_listeners": null,
    586622  "_source": "console-api",
    587623  "_level": "debug",
     
    598634STEP: console.count()
    599635{
     636  "_listeners": null,
    600637  "_source": "console-api",
    601638  "_level": "debug",
     
    612649STEP: console.count('')
    613650{
     651  "_listeners": null,
    614652  "_source": "console-api",
    615653  "_level": "debug",
     
    626664STEP: console.count('    ')
    627665{
     666  "_listeners": null,
    628667  "_source": "console-api",
    629668  "_level": "debug",
     
    640679STEP: console.count('')
    641680{
     681  "_listeners": null,
    642682  "_source": "console-api",
    643683  "_level": "debug",
     
    654694STEP: console.count('    ')
    655695{
     696  "_listeners": null,
    656697  "_source": "console-api",
    657698  "_level": "debug",
     
    668709STEP: console.count(string)
    669710{
     711  "_listeners": null,
    670712  "_source": "console-api",
    671713  "_level": "debug",
     
    682724STEP: console.count(string)
    683725{
     726  "_listeners": null,
    684727  "_source": "console-api",
    685728  "_level": "debug",
     
    696739STEP: console.count(object)
    697740{
     741  "_listeners": null,
    698742  "_source": "console-api",
    699743  "_level": "debug",
     
    710754STEP: console.count(object)
    711755{
     756  "_listeners": null,
    712757  "_source": "console-api",
    713758  "_level": "debug",
     
    724769STEP: console.count(otherObject)
    725770{
     771  "_listeners": null,
    726772  "_source": "console-api",
    727773  "_level": "debug",
     
    738784STEP: console.count(otherObject)
    739785{
     786  "_listeners": null,
    740787  "_source": "console-api",
    741788  "_level": "debug",
     
    752799STEP: console.count(number)
    753800{
     801  "_listeners": null,
    754802  "_source": "console-api",
    755803  "_level": "debug",
     
    766814STEP: console.count(number)
    767815{
     816  "_listeners": null,
    768817  "_source": "console-api",
    769818  "_level": "debug",
  • trunk/LayoutTests/inspector/console/console-table-expected.txt

    r194981 r195305  
    88STEP: console.table([])
    99{
     10  "_listeners": null,
    1011  "_source": "console-api",
    1112  "_level": "log",
     
    2526      "_size": 0,
    2627      "_preview": {
     28        "_listeners": null,
    2729        "_type": "object",
    2830        "_subtype": "array",
     
    4244STEP: console.table(['apple', 'orange', 'banana'])
    4345{
     46  "_listeners": null,
    4447  "_source": "console-api",
    4548  "_level": "log",
     
    5962      "_size": 3,
    6063      "_preview": {
     64        "_listeners": null,
    6165        "_type": "object",
    6266        "_subtype": "array",
     
    6771        "_properties": [
    6872          {
     73            "_listeners": null,
    6974            "_name": "0",
    7075            "_type": "string",
     
    7277          },
    7378          {
     79            "_listeners": null,
    7480            "_name": "1",
    7581            "_type": "string",
     
    7783          },
    7884          {
     85            "_listeners": null,
    7986            "_name": "2",
    8087            "_type": "string",
     
    9299STEP: console.table({firstName: 'John', lastName: 'Smith'})
    93100{
     101  "_listeners": null,
    94102  "_source": "console-api",
    95103  "_level": "log",
     
    107115      "_hasChildren": true,
    108116      "_preview": {
     117        "_listeners": null,
    109118        "_type": "object",
    110119        "_description": "Object",
     
    113122        "_properties": [
    114123          {
     124            "_listeners": null,
    115125            "_name": "firstName",
    116126            "_type": "string",
     
    118128          },
    119129          {
     130            "_listeners": null,
    120131            "_name": "lastName",
    121132            "_type": "string",
     
    133144STEP: console.table([['John', 'Smith'], ['Jane', 'Doe'], ['Emily', 'Jones']])
    134145{
     146  "_listeners": null,
    135147  "_source": "console-api",
    136148  "_level": "log",
     
    150162      "_size": 3,
    151163      "_preview": {
     164        "_listeners": null,
    152165        "_type": "object",
    153166        "_subtype": "array",
     
    158171        "_properties": [
    159172          {
     173            "_listeners": null,
    160174            "_name": "0",
    161175            "_type": "object",
    162176            "_subtype": "array",
    163177            "_valuePreview": {
     178              "_listeners": null,
    164179              "_type": "object",
    165180              "_subtype": "array",
     
    170185              "_properties": [
    171186                {
     187                  "_listeners": null,
    172188                  "_name": "0",
    173189                  "_type": "string",
     
    175191                },
    176192                {
     193                  "_listeners": null,
    177194                  "_name": "1",
    178195                  "_type": "string",
     
    184201          },
    185202          {
     203            "_listeners": null,
    186204            "_name": "1",
    187205            "_type": "object",
    188206            "_subtype": "array",
    189207            "_valuePreview": {
     208              "_listeners": null,
    190209              "_type": "object",
    191210              "_subtype": "array",
     
    196215              "_properties": [
    197216                {
     217                  "_listeners": null,
    198218                  "_name": "0",
    199219                  "_type": "string",
     
    201221                },
    202222                {
     223                  "_listeners": null,
    203224                  "_name": "1",
    204225                  "_type": "string",
     
    210231          },
    211232          {
     233            "_listeners": null,
    212234            "_name": "2",
    213235            "_type": "object",
    214236            "_subtype": "array",
    215237            "_valuePreview": {
     238              "_listeners": null,
    216239              "_type": "object",
    217240              "_subtype": "array",
     
    222245              "_properties": [
    223246                {
     247                  "_listeners": null,
    224248                  "_name": "0",
    225249                  "_type": "string",
     
    227251                },
    228252                {
     253                  "_listeners": null,
    229254                  "_name": "1",
    230255                  "_type": "string",
     
    246271STEP: console.table([john, jane, emily])
    247272{
     273  "_listeners": null,
    248274  "_source": "console-api",
    249275  "_level": "log",
     
    263289      "_size": 3,
    264290      "_preview": {
     291        "_listeners": null,
    265292        "_type": "object",
    266293        "_subtype": "array",
     
    271298        "_properties": [
    272299          {
     300            "_listeners": null,
    273301            "_name": "0",
    274302            "_type": "object",
    275303            "_valuePreview": {
     304              "_listeners": null,
    276305              "_type": "object",
    277306              "_description": "Person",
     
    280309              "_properties": [
    281310                {
     311                  "_listeners": null,
    282312                  "_name": "firstName",
    283313                  "_type": "string",
     
    285315                },
    286316                {
     317                  "_listeners": null,
    287318                  "_name": "lastName",
    288319                  "_type": "string",
     
    294325          },
    295326          {
     327            "_listeners": null,
    296328            "_name": "1",
    297329            "_type": "object",
    298330            "_valuePreview": {
     331              "_listeners": null,
    299332              "_type": "object",
    300333              "_description": "Person",
     
    303336              "_properties": [
    304337                {
     338                  "_listeners": null,
    305339                  "_name": "firstName",
    306340                  "_type": "string",
     
    308342                },
    309343                {
     344                  "_listeners": null,
    310345                  "_name": "lastName",
    311346                  "_type": "string",
     
    317352          },
    318353          {
     354            "_listeners": null,
    319355            "_name": "2",
    320356            "_type": "object",
    321357            "_valuePreview": {
     358              "_listeners": null,
    322359              "_type": "object",
    323360              "_description": "Person",
     
    326363              "_properties": [
    327364                {
     365                  "_listeners": null,
    328366                  "_name": "firstName",
    329367                  "_type": "string",
     
    331369                },
    332370                {
     371                  "_listeners": null,
    333372                  "_name": "lastName",
    334373                  "_type": "string",
     
    350389STEP: console.table([john, jane, emily], ['firstName'])
    351390{
     391  "_listeners": null,
    352392  "_source": "console-api",
    353393  "_level": "log",
     
    367407      "_size": 3,
    368408      "_preview": {
     409        "_listeners": null,
    369410        "_type": "object",
    370411        "_subtype": "array",
     
    375416        "_properties": [
    376417          {
     418            "_listeners": null,
    377419            "_name": "0",
    378420            "_type": "object",
    379421            "_valuePreview": {
     422              "_listeners": null,
    380423              "_type": "object",
    381424              "_description": "Person",
     
    384427              "_properties": [
    385428                {
     429                  "_listeners": null,
    386430                  "_name": "firstName",
    387431                  "_type": "string",
     
    389433                },
    390434                {
     435                  "_listeners": null,
    391436                  "_name": "lastName",
    392437                  "_type": "string",
     
    398443          },
    399444          {
     445            "_listeners": null,
    400446            "_name": "1",
    401447            "_type": "object",
    402448            "_valuePreview": {
     449              "_listeners": null,
    403450              "_type": "object",
    404451              "_description": "Person",
     
    407454              "_properties": [
    408455                {
     456                  "_listeners": null,
    409457                  "_name": "firstName",
    410458                  "_type": "string",
     
    412460                },
    413461                {
     462                  "_listeners": null,
    414463                  "_name": "lastName",
    415464                  "_type": "string",
     
    421470          },
    422471          {
     472            "_listeners": null,
    423473            "_name": "2",
    424474            "_type": "object",
    425475            "_valuePreview": {
     476              "_listeners": null,
    426477              "_type": "object",
    427478              "_description": "Person",
     
    430481              "_properties": [
    431482                {
     483                  "_listeners": null,
    432484                  "_name": "firstName",
    433485                  "_type": "string",
     
    435487                },
    436488                {
     489                  "_listeners": null,
    437490                  "_name": "lastName",
    438491                  "_type": "string",
     
    455508      "_size": 1,
    456509      "_preview": {
     510        "_listeners": null,
    457511        "_type": "object",
    458512        "_subtype": "array",
     
    463517        "_properties": [
    464518          {
     519            "_listeners": null,
    465520            "_name": "0",
    466521            "_type": "string",
  • trunk/LayoutTests/inspector/model/remote-object-expected.txt

    r188735 r195305  
    264264  "_description": "/ /",
    265265  "_preview": {
     266    "_listeners": null,
    266267    "_type": "object",
    267268    "_subtype": "regexp",
     
    271272    "_properties": [
    272273      {
     274        "_listeners": null,
    273275        "_name": "lastIndex",
    274276        "_type": "number",
     
    288290  "_description": "/(?:)/",
    289291  "_preview": {
     292    "_listeners": null,
    290293    "_type": "object",
    291294    "_subtype": "regexp",
     
    295298    "_properties": [
    296299      {
     300        "_listeners": null,
    297301        "_name": "lastIndex",
    298302        "_type": "number",
     
    312316  "_description": "/^r(e)g[e]{1,}x+/",
    313317  "_preview": {
     318    "_listeners": null,
    314319    "_type": "object",
    315320    "_subtype": "regexp",
     
    319324    "_properties": [
    320325      {
     326        "_listeners": null,
    321327        "_name": "lastIndex",
    322328        "_type": "number",
     
    336342  "_description": "/^r(e)g[e]{1,}x+/gi",
    337343  "_preview": {
     344    "_listeners": null,
    338345    "_type": "object",
    339346    "_subtype": "regexp",
     
    343350    "_properties": [
    344351      {
     352        "_listeners": null,
    345353        "_name": "lastIndex",
    346354        "_type": "number",
     
    360368  "_description": "/(?:)/",
    361369  "_preview": {
     370    "_listeners": null,
    362371    "_type": "object",
    363372    "_subtype": "regexp",
     
    367376    "_properties": [
    368377      {
     378        "_listeners": null,
    369379        "_name": "lastIndex",
    370380        "_type": "number",
     
    384394  "_description": "/test/i",
    385395  "_preview": {
     396    "_listeners": null,
    386397    "_type": "object",
    387398    "_subtype": "regexp",
     
    391402    "_properties": [
    392403      {
     404        "_listeners": null,
    393405        "_name": "lastIndex",
    394406        "_type": "number",
     
    409421  "_size": 0,
    410422  "_preview": {
     423    "_listeners": null,
    411424    "_type": "object",
    412425    "_subtype": "array",
     
    429442  "_size": 4,
    430443  "_preview": {
     444    "_listeners": null,
    431445    "_type": "object",
    432446    "_subtype": "array",
     
    437451    "_properties": [
    438452      {
     453        "_listeners": null,
    439454        "_name": "0",
    440455        "_type": "number",
     
    442457      },
    443458      {
     459        "_listeners": null,
    444460        "_name": "1",
    445461        "_type": "number",
     
    447463      },
    448464      {
     465        "_listeners": null,
    449466        "_name": "2",
    450467        "_type": "number",
     
    452469      },
    453470      {
     471        "_listeners": null,
    454472        "_name": "3",
    455473        "_type": "number",
     
    470488  "_size": 3,
    471489  "_preview": {
     490    "_listeners": null,
    472491    "_type": "object",
    473492    "_subtype": "array",
     
    478497    "_properties": [
    479498      {
     499        "_listeners": null,
    480500        "_name": "0",
    481501        "_type": "object",
    482502        "_subtype": "array",
    483503        "_valuePreview": {
     504          "_listeners": null,
    484505          "_type": "object",
    485506          "_subtype": "array",
     
    490511          "_properties": [
    491512            {
     513              "_listeners": null,
    492514              "_name": "0",
    493515              "_type": "number",
     
    499521      },
    500522      {
     523        "_listeners": null,
    501524        "_name": "1",
    502525        "_type": "object",
    503526        "_subtype": "array",
    504527        "_valuePreview": {
     528          "_listeners": null,
    505529          "_type": "object",
    506530          "_subtype": "array",
     
    511535          "_properties": [
    512536            {
     537              "_listeners": null,
    513538              "_name": "0",
    514539              "_type": "number",
     
    520545      },
    521546      {
     547        "_listeners": null,
    522548        "_name": "2",
    523549        "_type": "object",
    524550        "_subtype": "array",
    525551        "_valuePreview": {
     552          "_listeners": null,
    526553          "_type": "object",
    527554          "_subtype": "array",
     
    532559          "_properties": [
    533560            {
     561              "_listeners": null,
    534562              "_name": "0",
    535563              "_type": "number",
     
    554582  "_size": 5,
    555583  "_preview": {
     584    "_listeners": null,
    556585    "_type": "object",
    557586    "_subtype": "array",
     
    562591    "_properties": [
    563592      {
     593        "_listeners": null,
    564594        "_name": "0",
    565595        "_type": "boolean",
     
    567597      },
    568598      {
     599        "_listeners": null,
    569600        "_name": "1",
    570601        "_type": "number",
     
    572603      },
    573604      {
     605        "_listeners": null,
    574606        "_name": "2",
    575607        "_type": "number",
     
    577609      },
    578610      {
     611        "_listeners": null,
    579612        "_name": "3",
    580613        "_type": "string",
     
    582615      },
    583616      {
     617        "_listeners": null,
    584618        "_name": "4",
    585619        "_type": "object",
     
    601635  "_size": 1,
    602636  "_preview": {
     637    "_listeners": null,
    603638    "_type": "object",
    604639    "_subtype": "array",
     
    609644    "_properties": [
    610645      {
     646        "_listeners": null,
    611647        "_name": "0",
    612648        "_type": "object",
    613649        "_subtype": "array",
    614650        "_valuePreview": {
     651          "_listeners": null,
    615652          "_type": "object",
    616653          "_subtype": "array",
     
    621658          "_properties": [
    622659            {
     660              "_listeners": null,
    623661              "_name": "0",
    624662              "_type": "object",
     
    644682  "_size": 1,
    645683  "_preview": {
     684    "_listeners": null,
    646685    "_type": "object",
    647686    "_subtype": "array",
     
    652691    "_properties": [
    653692      {
     693        "_listeners": null,
    654694        "_name": "0",
    655695        "_type": "object",
    656696        "_subtype": "array",
    657697        "_valuePreview": {
     698          "_listeners": null,
    658699          "_type": "object",
    659700          "_subtype": "array",
     
    664705          "_properties": [
    665706            {
     707              "_listeners": null,
    666708              "_name": "0",
    667709              "_type": "undefined",
     
    686728  "_size": 3,
    687729  "_preview": {
     730    "_listeners": null,
    688731    "_type": "object",
    689732    "_subtype": "array",
     
    694737    "_properties": [
    695738      {
     739        "_listeners": null,
    696740        "_name": "0",
    697741        "_type": "object",
    698742        "_valuePreview": {
     743          "_listeners": null,
    699744          "_type": "object",
    700745          "_description": "Object",
     
    703748          "_properties": [
    704749            {
     750              "_listeners": null,
    705751              "_name": "a",
    706752              "_type": "number",
     
    712758      },
    713759      {
     760        "_listeners": null,
    714761        "_name": "1",
    715762        "_type": "object",
    716763        "_valuePreview": {
     764          "_listeners": null,
    717765          "_type": "object",
    718766          "_description": "Object",
     
    721769          "_properties": [
    722770            {
     771              "_listeners": null,
    723772              "_name": "b",
    724773              "_type": "number",
     
    730779      },
    731780      {
     781        "_listeners": null,
    732782        "_name": "2",
    733783        "_type": "object",
    734784        "_valuePreview": {
     785          "_listeners": null,
    735786          "_type": "object",
    736787          "_description": "Object",
     
    739790          "_properties": [
    740791            {
     792              "_listeners": null,
    741793              "_name": "c",
    742794              "_type": "number",
     
    761813  "_size": 1,
    762814  "_preview": {
     815    "_listeners": null,
    763816    "_type": "object",
    764817    "_subtype": "array",
     
    769822    "_properties": [
    770823      {
     824        "_listeners": null,
    771825        "_name": "0",
    772826        "_type": "object",
    773827        "_subtype": "array",
    774828        "_valuePreview": {
     829          "_listeners": null,
    775830          "_type": "object",
    776831          "_subtype": "array",
     
    781836          "_properties": [
    782837            {
     838              "_listeners": null,
    783839              "_name": "0",
    784840              "_type": "object",
    785841              "_valuePreview": {
     842                "_listeners": null,
    786843                "_type": "object",
    787844                "_description": "Object",
     
    790847                "_properties": [
    791848                  {
     849                    "_listeners": null,
    792850                    "_name": "a",
    793851                    "_type": "number",
     
    799857            },
    800858            {
     859              "_listeners": null,
    801860              "_name": "1",
    802861              "_type": "object",
    803862              "_valuePreview": {
     863                "_listeners": null,
    804864                "_type": "object",
    805865                "_description": "Object",
     
    808868                "_properties": [
    809869                  {
     870                    "_listeners": null,
    810871                    "_name": "b",
    811872                    "_type": "number",
     
    817878            },
    818879            {
     880              "_listeners": null,
    819881              "_name": "2",
    820882              "_type": "object",
    821883              "_valuePreview": {
     884                "_listeners": null,
    822885                "_type": "object",
    823886                "_description": "Object",
     
    826889                "_properties": [
    827890                  {
     891                    "_listeners": null,
    828892                    "_name": "c",
    829893                    "_type": "number",
     
    852916  "_size": 1,
    853917  "_preview": {
     918    "_listeners": null,
    854919    "_type": "object",
    855920    "_subtype": "array",
     
    860925    "_properties": [
    861926      {
     927        "_listeners": null,
    862928        "_name": "0",
    863929        "_type": "object",
     
    879945  "_size": 100,
    880946  "_preview": {
     947    "_listeners": null,
    881948    "_type": "object",
    882949    "_subtype": "array",
     
    899966  "_size": 100,
    900967  "_preview": {
     968    "_listeners": null,
    901969    "_type": "object",
    902970    "_subtype": "array",
     
    907975    "_properties": [
    908976      {
     977        "_listeners": null,
    909978        "_name": "0",
    910979        "_type": "number",
     
    912981      },
    913982      {
     983        "_listeners": null,
    914984        "_name": "1",
    915985        "_type": "number",
     
    917987      },
    918988      {
     989        "_listeners": null,
    919990        "_name": "2",
    920991        "_type": "number",
     
    922993      },
    923994      {
     995        "_listeners": null,
    924996        "_name": "3",
    925997        "_type": "number",
     
    927999      },
    9281000      {
     1001        "_listeners": null,
    9291002        "_name": "4",
    9301003        "_type": "number",
     
    9321005      },
    9331006      {
     1007        "_listeners": null,
    9341008        "_name": "5",
    9351009        "_type": "number",
     
    9371011      },
    9381012      {
     1013        "_listeners": null,
    9391014        "_name": "6",
    9401015        "_type": "number",
     
    9421017      },
    9431018      {
     1019        "_listeners": null,
    9441020        "_name": "7",
    9451021        "_type": "number",
     
    9471023      },
    9481024      {
     1025        "_listeners": null,
    9491026        "_name": "8",
    9501027        "_type": "number",
     
    9521029      },
    9531030      {
     1031        "_listeners": null,
    9541032        "_name": "9",
    9551033        "_type": "number",
     
    9701048  "_size": 100,
    9711049  "_preview": {
     1050    "_listeners": null,
    9721051    "_type": "object",
    9731052    "_subtype": "array",
     
    9781057    "_properties": [
    9791058      {
     1059        "_listeners": null,
    9801060        "_name": "10",
    9811061        "_type": "number",
     
    9961076  "_size": 3,
    9971077  "_preview": {
     1078    "_listeners": null,
    9981079    "_type": "object",
    9991080    "_subtype": "array",
     
    10041085    "_properties": [
    10051086      {
     1087        "_listeners": null,
    10061088        "_name": "0",
    10071089        "_type": "number",
     
    10091091      },
    10101092      {
     1093        "_listeners": null,
    10111094        "_name": "1",
    10121095        "_type": "string",
     
    10141097      },
    10151098      {
     1099        "_listeners": null,
    10161100        "_name": "2",
    10171101        "_type": "object",
     
    10331117  "_size": 4,
    10341118  "_preview": {
     1119    "_listeners": null,
    10351120    "_type": "object",
    10361121    "_subtype": "array",
     
    10411126    "_properties": [
    10421127      {
     1128        "_listeners": null,
    10431129        "_name": "0",
    10441130        "_type": "number",
     
    10461132      },
    10471133      {
     1134        "_listeners": null,
    10481135        "_name": "1",
    10491136        "_type": "number",
     
    10511138      },
    10521139      {
     1140        "_listeners": null,
    10531141        "_name": "2",
    10541142        "_type": "number",
     
    10561144      },
    10571145      {
     1146        "_listeners": null,
    10581147        "_name": "3",
    10591148        "_type": "number",
     
    10741163  "_size": 4,
    10751164  "_preview": {
     1165    "_listeners": null,
    10761166    "_type": "object",
    10771167    "_subtype": "array",
     
    10821172    "_properties": [
    10831173      {
     1174        "_listeners": null,
    10841175        "_name": "0",
    10851176        "_type": "number",
     
    10871178      },
    10881179      {
     1180        "_listeners": null,
    10891181        "_name": "1",
    10901182        "_type": "number",
     
    10921184      },
    10931185      {
     1186        "_listeners": null,
    10941187        "_name": "2",
    10951188        "_type": "number",
     
    10971190      },
    10981191      {
     1192        "_listeners": null,
    10991193        "_name": "3",
    11001194        "_type": "number",
     
    11151209  "_size": 10000000,
    11161210  "_preview": {
     1211    "_listeners": null,
    11171212    "_type": "object",
    11181213    "_subtype": "array",
     
    11231218    "_properties": [
    11241219      {
     1220        "_listeners": null,
    11251221        "_name": "0",
    11261222        "_type": "number",
     
    11281224      },
    11291225      {
     1226        "_listeners": null,
    11301227        "_name": "1",
    11311228        "_type": "number",
     
    11331230      },
    11341231      {
     1232        "_listeners": null,
    11351233        "_name": "2",
    11361234        "_type": "number",
     
    11381236      },
    11391237      {
     1238        "_listeners": null,
    11401239        "_name": "3",
    11411240        "_type": "number",
     
    11431242      },
    11441243      {
     1244        "_listeners": null,
    11451245        "_name": "4",
    11461246        "_type": "number",
     
    11481248      },
    11491249      {
     1250        "_listeners": null,
    11501251        "_name": "5",
    11511252        "_type": "number",
     
    11531254      },
    11541255      {
     1256        "_listeners": null,
    11551257        "_name": "6",
    11561258        "_type": "number",
     
    11581260      },
    11591261      {
     1262        "_listeners": null,
    11601263        "_name": "7",
    11611264        "_type": "number",
     
    11631266      },
    11641267      {
     1268        "_listeners": null,
    11651269        "_name": "8",
    11661270        "_type": "number",
     
    11681272      },
    11691273      {
     1274        "_listeners": null,
    11701275        "_name": "9",
    11711276        "_type": "number",
     
    11841289  "_description": "Object",
    11851290  "_preview": {
     1291    "_listeners": null,
    11861292    "_type": "object",
    11871293    "_description": "Object",
     
    12001306  "_description": "Object",
    12011307  "_preview": {
     1308    "_listeners": null,
    12021309    "_type": "object",
    12031310    "_description": "Object",
     
    12061313    "_properties": [
    12071314      {
     1315        "_listeners": null,
    12081316        "_name": "a",
    12091317        "_type": "number",
     
    12221330  "_description": "Object",
    12231331  "_preview": {
     1332    "_listeners": null,
    12241333    "_type": "object",
    12251334    "_description": "Object",
     
    12281337    "_properties": [
    12291338      {
     1339        "_listeners": null,
    12301340        "_name": "a",
    12311341        "_type": "number",
     
    12331343      },
    12341344      {
     1345        "_listeners": null,
    12351346        "_name": "b",
    12361347        "_type": "number",
     
    12381349      },
    12391350      {
     1351        "_listeners": null,
    12401352        "_name": "c",
    12411353        "_type": "number",
     
    12541366  "_description": "Object",
    12551367  "_preview": {
     1368    "_listeners": null,
    12561369    "_type": "object",
    12571370    "_description": "Object",
     
    12601373    "_properties": [
    12611374      {
     1375        "_listeners": null,
    12621376        "_name": "a",
    12631377        "_type": "number",
     
    12651379      },
    12661380      {
     1381        "_listeners": null,
    12671382        "_name": "b",
    12681383        "_type": "string",
     
    12701385      },
    12711386      {
     1387        "_listeners": null,
    12721388        "_name": "c",
    12731389        "_type": "object",
     
    12761392      },
    12771393      {
     1394        "_listeners": null,
    12781395        "_name": "d",
    12791396        "_type": "symbol",
     
    12921409  "_description": "Object",
    12931410  "_preview": {
     1411    "_listeners": null,
    12941412    "_type": "object",
    12951413    "_description": "Object",
     
    12981416    "_properties": [
    12991417      {
     1418        "_listeners": null,
    13001419        "_name": "a",
    13011420        "_type": "number",
     
    13031422      },
    13041423      {
     1424        "_listeners": null,
    13051425        "_name": "b",
    13061426        "_type": "object",
     
    13191439  "_description": "Object",
    13201440  "_preview": {
     1441    "_listeners": null,
    13211442    "_type": "object",
    13221443    "_description": "Object",
     
    13251446    "_properties": [
    13261447      {
     1448        "_listeners": null,
    13271449        "_name": "a",
    13281450        "_type": "function",
     
    13301452      },
    13311453      {
     1454        "_listeners": null,
    13321455        "_name": "b",
    13331456        "_type": "function",
     
    13351458      },
    13361459      {
     1460        "_listeners": null,
    13371461        "_name": "getter",
    13381462        "_type": "accessor"
    13391463      },
    13401464      {
     1465        "_listeners": null,
    13411466        "_name": "setter",
    13421467        "_type": "accessor"
     
    13541479  "_description": "Foo",
    13551480  "_preview": {
     1481    "_listeners": null,
    13561482    "_type": "object",
    13571483    "_description": "Foo",
     
    13701496  "_description": "Foo2",
    13711497  "_preview": {
     1498    "_listeners": null,
    13721499    "_type": "object",
    13731500    "_description": "Foo2",
     
    13861513  "_description": "Foo3",
    13871514  "_preview": {
     1515    "_listeners": null,
    13881516    "_type": "object",
    13891517    "_description": "Foo3",
     
    14021530  "_description": "Bar",
    14031531  "_preview": {
     1532    "_listeners": null,
    14041533    "_type": "object",
    14051534    "_description": "Bar",
     
    14081537    "_properties": [
    14091538      {
     1539        "_listeners": null,
    14101540        "_name": "_x",
    14111541        "_type": "number",
     
    14131543      },
    14141544      {
     1545        "_listeners": null,
    14151546        "_name": "constructor",
    14161547        "_type": "function",
     
    14181549      },
    14191550      {
     1551        "_listeners": null,
    14201552        "_name": "x",
    14211553        "_type": "accessor"
     
    14331565  "_description": "Bar2",
    14341566  "_preview": {
     1567    "_listeners": null,
    14351568    "_type": "object",
    14361569    "_description": "Bar2",
     
    14391572    "_properties": [
    14401573      {
     1574        "_listeners": null,
    14411575        "_name": "_x",
    14421576        "_type": "number",
     
    14551589  "_description": "Event",
    14561590  "_preview": {
     1591    "_listeners": null,
    14571592    "_type": "object",
    14581593    "_description": "Event",
     
    14611596    "_properties": [
    14621597      {
     1598        "_listeners": null,
    14631599        "_name": "clipboardData",
    14641600        "_type": "undefined",
     
    14661602      },
    14671603      {
     1604        "_listeners": null,
    14681605        "_name": "type",
    14691606        "_type": "string",
     
    14711608      },
    14721609      {
     1610        "_listeners": null,
    14731611        "_name": "target",
    14741612        "_type": "object",
     
    14771615      },
    14781616      {
     1617        "_listeners": null,
    14791618        "_name": "currentTarget",
    14801619        "_type": "object",
     
    14821621      },
    14831622      {
     1623        "_listeners": null,
    14841624        "_name": "eventPhase",
    14851625        "_type": "number",
     
    14981638  "_description": "ArrayBuffer",
    14991639  "_preview": {
     1640    "_listeners": null,
    15001641    "_type": "object",
    15011642    "_description": "ArrayBuffer",
     
    15041645    "_properties": [
    15051646      {
     1647        "_listeners": null,
    15061648        "_name": "byteLength",
    15071649        "_type": "number",
     
    15201662  "_description": "DataView",
    15211663  "_preview": {
     1664    "_listeners": null,
    15221665    "_type": "object",
    15231666    "_description": "DataView",
     
    15261669    "_properties": [
    15271670      {
     1671        "_listeners": null,
    15281672        "_name": "byteOffset",
    15291673        "_type": "number",
     
    15311675      },
    15321676      {
     1677        "_listeners": null,
    15331678        "_name": "byteLength",
    15341679        "_type": "number",
     
    15361681      },
    15371682      {
     1683        "_listeners": null,
    15381684        "_name": "buffer",
    15391685        "_type": "object",
     
    15521698  "_description": "Object",
    15531699  "_preview": {
     1700    "_listeners": null,
    15541701    "_type": "object",
    15551702    "_description": "Object",
     
    15581705    "_properties": [
    15591706      {
     1707        "_listeners": null,
    15601708        "_name": "prop",
    15611709        "_type": "number",
     
    15631711      },
    15641712      {
     1713        "_listeners": null,
    15651714        "_name": "Symbol()",
    15661715        "_type": "number",
     
    15681717      },
    15691718      {
     1719        "_listeners": null,
    15701720        "_name": "Symbol(sym)",
    15711721        "_type": "number",
     
    15731723      },
    15741724      {
     1725        "_listeners": null,
    15751726        "_name": "Symbol(sym)",
    15761727        "_type": "number",
     
    15781729      },
    15791730      {
     1731        "_listeners": null,
    15801732        "_name": "Symbol(Symbol.iterator)",
    15811733        "_type": "symbol",
     
    15951747  "_description": "body",
    15961748  "_preview": {
     1749    "_listeners": null,
    15971750    "_type": "object",
    15981751    "_subtype": "node",
     
    16021755    "_properties": [
    16031756      {
     1757        "_listeners": null,
    16041758        "_name": "aLink",
    16051759        "_type": "string",
     
    16071761      },
    16081762      {
     1763        "_listeners": null,
    16091764        "_name": "background",
    16101765        "_type": "string",
     
    16121767      },
    16131768      {
     1769        "_listeners": null,
    16141770        "_name": "bgColor",
    16151771        "_type": "string",
     
    16171773      },
    16181774      {
     1775        "_listeners": null,
    16191776        "_name": "link",
    16201777        "_type": "string",
     
    16221779      },
    16231780      {
     1781        "_listeners": null,
    16241782        "_name": "text",
    16251783        "_type": "string",
     
    16391797  "_description": "div.foo.bar",
    16401798  "_preview": {
     1799    "_listeners": null,
    16411800    "_type": "object",
    16421801    "_subtype": "node",
     
    16461805    "_properties": [
    16471806      {
     1807        "_listeners": null,
    16481808        "_name": "align",
    16491809        "_type": "string",
     
    16511811      },
    16521812      {
     1813        "_listeners": null,
    16531814        "_name": "title",
    16541815        "_type": "string",
     
    16561817      },
    16571818      {
     1819        "_listeners": null,
    16581820        "_name": "lang",
    16591821        "_type": "string",
     
    16611823      },
    16621824      {
     1825        "_listeners": null,
    16631826        "_name": "translate",
    16641827        "_type": "boolean",
     
    16661829      },
    16671830      {
     1831        "_listeners": null,
    16681832        "_name": "dir",
    16691833        "_type": "string",
     
    16831847  "_description": "span#foo",
    16841848  "_preview": {
     1849    "_listeners": null,
    16851850    "_type": "object",
    16861851    "_subtype": "node",
     
    16901855    "_properties": [
    16911856      {
     1857        "_listeners": null,
    16921858        "_name": "title",
    16931859        "_type": "string",
     
    16951861      },
    16961862      {
     1863        "_listeners": null,
    16971864        "_name": "lang",
    16981865        "_type": "string",
     
    17001867      },
    17011868      {
     1869        "_listeners": null,
    17021870        "_name": "translate",
    17031871        "_type": "boolean",
     
    17051873      },
    17061874      {
     1875        "_listeners": null,
    17071876        "_name": "dir",
    17081877        "_type": "string",
     
    17101879      },
    17111880      {
     1881        "_listeners": null,
    17121882        "_name": "tabIndex",
    17131883        "_type": "number",
     
    17271897  "_description": "input",
    17281898  "_preview": {
     1899    "_listeners": null,
    17291900    "_type": "object",
    17301901    "_subtype": "node",
     
    17341905    "_properties": [
    17351906      {
     1907        "_listeners": null,
    17361908        "_name": "selectionStart",
    17371909        "_type": "number",
     
    17391911      },
    17401912      {
     1913        "_listeners": null,
    17411914        "_name": "selectionEnd",
    17421915        "_type": "number",
     
    17441917      },
    17451918      {
     1919        "_listeners": null,
    17461920        "_name": "selectionDirection",
    17471921        "_type": "string",
     
    17491923      },
    17501924      {
     1925        "_listeners": null,
    17511926        "_name": "accept",
    17521927        "_type": "string",
     
    17541929      },
    17551930      {
     1931        "_listeners": null,
    17561932        "_name": "alt",
    17571933        "_type": "string",
     
    17711947  "_description": "#text",
    17721948  "_preview": {
     1949    "_listeners": null,
    17731950    "_type": "object",
    17741951    "_subtype": "node",
     
    17781955    "_properties": [
    17791956      {
     1957        "_listeners": null,
    17801958        "_name": "wholeText",
    17811959        "_type": "string",
     
    17831961      },
    17841962      {
     1963        "_listeners": null,
    17851964        "_name": "splitText",
    17861965        "_type": "function",
     
    17881967      },
    17891968      {
     1969        "_listeners": null,
    17901970        "_name": "replaceWholeText",
    17911971        "_type": "function",
     
    17931973      },
    17941974      {
     1975        "_listeners": null,
    17951976        "_name": "data",
    17961977        "_type": "string",
     
    17981979      },
    17991980      {
     1981        "_listeners": null,
    18001982        "_name": "length",
    18011983        "_type": "number",
     
    18151997  "_description": "#comment",
    18161998  "_preview": {
     1999    "_listeners": null,
    18172000    "_type": "object",
    18182001    "_subtype": "node",
     
    18222005    "_properties": [
    18232006      {
     2007        "_listeners": null,
    18242008        "_name": "data",
    18252009        "_type": "string",
     
    18272011      },
    18282012      {
     2013        "_listeners": null,
    18292014        "_name": "length",
    18302015        "_type": "number",
     
    18322017      },
    18332018      {
     2019        "_listeners": null,
    18342020        "_name": "previousElementSibling",
    18352021        "_type": "object",
     
    18382024      },
    18392025      {
     2026        "_listeners": null,
    18402027        "_name": "nextElementSibling",
    18412028        "_type": "object",
     
    18442031      },
    18452032      {
     2033        "_listeners": null,
    18462034        "_name": "substringData",
    18472035        "_type": "function",
     
    18612049  "_description": "rect.test",
    18622050  "_preview": {
     2051    "_listeners": null,
    18632052    "_type": "object",
    18642053    "_subtype": "node",
     
    18682057    "_properties": [
    18692058      {
     2059        "_listeners": null,
    18702060        "_name": "x",
    18712061        "_type": "object",
     
    18732063      },
    18742064      {
     2065        "_listeners": null,
    18752066        "_name": "y",
    18762067        "_type": "object",
     
    18782069      },
    18792070      {
     2071        "_listeners": null,
    18802072        "_name": "width",
    18812073        "_type": "object",
     
    18832075      },
    18842076      {
     2077        "_listeners": null,
    18852078        "_name": "height",
    18862079        "_type": "object",
     
    18882081      },
    18892082      {
     2083        "_listeners": null,
    18902084        "_name": "rx",
    18912085        "_type": "object",
     
    19062100  "_size": 7,
    19072101  "_preview": {
     2102    "_listeners": null,
    19082103    "_type": "object",
    19092104    "_subtype": "array",
     
    19142109    "_properties": [
    19152110      {
     2111        "_listeners": null,
    19162112        "_name": "0",
    19172113        "_type": "object",
     
    19202116      },
    19212117      {
     2118        "_listeners": null,
    19222119        "_name": "1",
    19232120        "_type": "object",
     
    19262123      },
    19272124      {
     2125        "_listeners": null,
    19282126        "_name": "2",
    19292127        "_type": "object",
     
    19322130      },
    19332131      {
     2132        "_listeners": null,
    19342133        "_name": "3",
    19352134        "_type": "object",
     
    19382137      },
    19392138      {
     2139        "_listeners": null,
    19402140        "_name": "4",
    19412141        "_type": "object",
     
    19442144      },
    19452145      {
     2146        "_listeners": null,
    19462147        "_name": "5",
    19472148        "_type": "object",
     
    19502151      },
    19512152      {
     2153        "_listeners": null,
    19522154        "_name": "6",
    19532155        "_type": "object",
     
    19692171  "_size": 3,
    19702172  "_preview": {
     2173    "_listeners": null,
    19712174    "_type": "object",
    19722175    "_subtype": "array",
     
    19772180    "_properties": [
    19782181      {
     2182        "_listeners": null,
    19792183        "_name": "0",
    19802184        "_type": "object",
     
    19832187      },
    19842188      {
     2189        "_listeners": null,
    19852190        "_name": "1",
    19862191        "_type": "object",
     
    19892194      },
    19902195      {
     2196        "_listeners": null,
    19912197        "_name": "2",
    19922198        "_type": "object",
     
    20082214  "_size": 3,
    20092215  "_preview": {
     2216    "_listeners": null,
    20102217    "_type": "object",
    20112218    "_subtype": "array",
     
    20162223    "_properties": [
    20172224      {
     2225        "_listeners": null,
    20182226        "_name": "0",
    20192227        "_type": "object",
     
    20222230      },
    20232231      {
     2232        "_listeners": null,
    20242233        "_name": "1",
    20252234        "_type": "object",
     
    20282237      },
    20292238      {
     2239        "_listeners": null,
    20302240        "_name": "2",
    20312241        "_type": "object",
     
    20472257  "_size": 3,
    20482258  "_preview": {
     2259    "_listeners": null,
    20492260    "_type": "object",
    20502261    "_subtype": "array",
     
    20552266    "_properties": [
    20562267      {
     2268        "_listeners": null,
    20572269        "_name": "0",
    20582270        "_type": "object",
     
    20612273      },
    20622274      {
     2275        "_listeners": null,
    20632276        "_name": "1",
    20642277        "_type": "object",
     
    20672280      },
    20682281      {
     2282        "_listeners": null,
    20692283        "_name": "2",
    20702284        "_type": "object",
     
    20852299  "_description": "TypeError: undefined is not an object (evaluating '[].x.x')",
    20862300  "_preview": {
     2301    "_listeners": null,
    20872302    "_type": "object",
    20882303    "_subtype": "error",
     
    20922307    "_properties": [
    20932308      {
     2309        "_listeners": null,
    20942310        "_name": "message",
    20952311        "_type": "string",
     
    20972313      },
    20982314      {
     2315        "_listeners": null,
    20992316        "_name": "line",
    21002317        "_type": "number",
     
    21022319      },
    21032320      {
     2321        "_listeners": null,
    21042322        "_name": "column",
    21052323        "_type": "number",
     
    21072325      },
    21082326      {
     2327        "_listeners": null,
    21092328        "_name": "stack",
    21102329        "_type": "string",
     
    21242343  "_description": "SyntaxError: Unexpected token ')'",
    21252344  "_preview": {
     2345    "_listeners": null,
    21262346    "_type": "object",
    21272347    "_subtype": "error",
     
    21312351    "_properties": [
    21322352      {
     2353        "_listeners": null,
    21332354        "_name": "message",
    21342355        "_type": "string",
     
    21362357      },
    21372358      {
     2359        "_listeners": null,
    21382360        "_name": "line",
    21392361        "_type": "number",
     
    21412363      },
    21422364      {
     2365        "_listeners": null,
    21432366        "_name": "column",
    21442367        "_type": "number",
     
    21462369      },
    21472370      {
     2371        "_listeners": null,
    21482372        "_name": "stack",
    21492373        "_type": "string",
     
    21632387  "_description": "Error: IndexSizeError: DOM Exception 1",
    21642388  "_preview": {
     2389    "_listeners": null,
    21652390    "_type": "object",
    21662391    "_subtype": "error",
     
    21702395    "_properties": [
    21712396      {
     2397        "_listeners": null,
    21722398        "_name": "code",
    21732399        "_type": "number",
     
    21752401      },
    21762402      {
     2403        "_listeners": null,
    21772404        "_name": "name",
    21782405        "_type": "string",
     
    21802407      },
    21812408      {
     2409        "_listeners": null,
    21822410        "_name": "message",
    21832411        "_type": "string",
     
    21852413      },
    21862414      {
     2415        "_listeners": null,
    21872416        "_name": "line",
    21882417        "_type": "number",
     
    21902419      },
    21912420      {
     2421        "_listeners": null,
    21922422        "_name": "column",
    21932423        "_type": "number",
     
    22082438  "_size": 0,
    22092439  "_preview": {
     2440    "_listeners": null,
    22102441    "_type": "object",
    22112442    "_subtype": "map",
     
    22282459  "_size": 2,
    22292460  "_preview": {
     2461    "_listeners": null,
    22302462    "_type": "object",
    22312463    "_subtype": "map",
     
    22372469    "_entries": [
    22382470      {
     2471        "_listeners": null,
    22392472        "_key": {
     2473          "_listeners": null,
    22402474          "_type": "number",
    22412475          "_description": "1",
     
    22462480        },
    22472481        "_value": {
     2482          "_listeners": null,
    22482483          "_type": "number",
    22492484          "_description": "2",
     
    22552490      },
    22562491      {
     2492        "_listeners": null,
    22572493        "_key": {
     2494          "_listeners": null,
    22582495          "_type": "string",
    22592496          "_description": "key",
     
    22642501        },
    22652502        "_value": {
     2503          "_listeners": null,
    22662504          "_type": "string",
    22672505          "_description": "value",
     
    22852523  "_size": 2,
    22862524  "_preview": {
     2525    "_listeners": null,
    22872526    "_type": "object",
    22882527    "_subtype": "map",
     
    22942533    "_entries": [
    22952534      {
     2535        "_listeners": null,
    22962536        "_key": {
     2537          "_listeners": null,
    22972538          "_type": "object",
    22982539          "_description": "Object",
     
    23012542          "_properties": [
    23022543            {
     2544              "_listeners": null,
    23032545              "_name": "a",
    23042546              "_type": "number",
     
    23092551        },
    23102552        "_value": {
     2553          "_listeners": null,
    23112554          "_type": "object",
    23122555          "_description": "Object",
     
    23152558          "_properties": [
    23162559            {
     2560              "_listeners": null,
    23172561              "_name": "b",
    23182562              "_type": "number",
     
    23242568      },
    23252569      {
     2570        "_listeners": null,
    23262571        "_key": {
     2572          "_listeners": null,
    23272573          "_type": "object",
    23282574          "_subtype": "node",
     
    23322578          "_properties": [
    23332579            {
     2580              "_listeners": null,
    23342581              "_name": "aLink",
    23352582              "_type": "string",
     
    23372584            },
    23382585            {
     2586              "_listeners": null,
    23392587              "_name": "background",
    23402588              "_type": "string",
     
    23422590            },
    23432591            {
     2592              "_listeners": null,
    23442593              "_name": "bgColor",
    23452594              "_type": "string",
     
    23472596            },
    23482597            {
     2598              "_listeners": null,
    23492599              "_name": "link",
    23502600              "_type": "string",
     
    23522602            },
    23532603            {
     2604              "_listeners": null,
    23542605              "_name": "text",
    23552606              "_type": "string",
     
    23602611        },
    23612612        "_value": {
     2613          "_listeners": null,
    23622614          "_type": "object",
    23632615          "_subtype": "array",
     
    23682620          "_properties": [
    23692621            {
     2622              "_listeners": null,
    23702623              "_name": "0",
    23712624              "_type": "number",
     
    23732626            },
    23742627            {
     2628              "_listeners": null,
    23752629              "_name": "1",
    23762630              "_type": "number",
     
    23942648  "_size": 101,
    23952649  "_preview": {
     2650    "_listeners": null,
    23962651    "_type": "object",
    23972652    "_subtype": "map",
     
    24032658    "_entries": [
    24042659      {
     2660        "_listeners": null,
    24052661        "_key": {
     2662          "_listeners": null,
    24062663          "_type": "number",
    24072664          "_description": "0",
     
    24122669        },
    24132670        "_value": {
     2671          "_listeners": null,
    24142672          "_type": "number",
    24152673          "_description": "0",
     
    24212679      },
    24222680      {
     2681        "_listeners": null,
    24232682        "_key": {
     2683          "_listeners": null,
    24242684          "_type": "number",
    24252685          "_description": "1",
     
    24302690        },
    24312691        "_value": {
     2692          "_listeners": null,
    24322693          "_type": "number",
    24332694          "_description": "1",
     
    24392700      },
    24402701      {
     2702        "_listeners": null,
    24412703        "_key": {
     2704          "_listeners": null,
    24422705          "_type": "number",
    24432706          "_description": "2",
     
    24482711        },
    24492712        "_value": {
     2713          "_listeners": null,
    24502714          "_type": "number",
    24512715          "_description": "2",
     
    24572721      },
    24582722      {
     2723        "_listeners": null,
    24592724        "_key": {
     2725          "_listeners": null,
    24602726          "_type": "number",
    24612727          "_description": "3",
     
    24662732        },
    24672733        "_value": {
     2734          "_listeners": null,
    24682735          "_type": "number",
    24692736          "_description": "3",
     
    24752742      },
    24762743      {
     2744        "_listeners": null,
    24772745        "_key": {
     2746          "_listeners": null,
    24782747          "_type": "number",
    24792748          "_description": "4",
     
    24842753        },
    24852754        "_value": {
     2755          "_listeners": null,
    24862756          "_type": "number",
    24872757          "_description": "4",
     
    25052775  "_size": 1,
    25062776  "_preview": {
     2777    "_listeners": null,
    25072778    "_type": "object",
    25082779    "_subtype": "map",
     
    25142785    "_entries": [
    25152786      {
     2787        "_listeners": null,
    25162788        "_key": {
     2789          "_listeners": null,
    25172790          "_type": "object",
    25182791          "_subtype": "map",
     
    25252798        },
    25262799        "_value": {
     2800          "_listeners": null,
    25272801          "_type": "object",
    25282802          "_subtype": "map",
     
    25482822  "_size": 1,
    25492823  "_preview": {
     2824    "_listeners": null,
    25502825    "_type": "object",
    25512826    "_subtype": "weakmap",
     
    25572832    "_entries": [
    25582833      {
     2834        "_listeners": null,
    25592835        "_key": {
     2836          "_listeners": null,
    25602837          "_type": "object",
    25612838          "_description": "Object",
     
    25642841          "_properties": [
    25652842            {
     2843              "_listeners": null,
    25662844              "_name": "id",
    25672845              "_type": "number",
     
    25722850        },
    25732851        "_value": {
     2852          "_listeners": null,
    25742853          "_type": "object",
    25752854          "_subtype": "array",
     
    25802859          "_properties": [
    25812860            {
     2861              "_listeners": null,
    25822862              "_name": "0",
    25832863              "_type": "number",
     
    25852865            },
    25862866            {
     2867              "_listeners": null,
    25872868              "_name": "1",
    25882869              "_type": "number",
     
    26062887  "_size": 0,
    26072888  "_preview": {
     2889    "_listeners": null,
    26082890    "_type": "object",
    26092891    "_subtype": "set",
     
    26262908  "_size": 3,
    26272909  "_preview": {
     2910    "_listeners": null,
    26282911    "_type": "object",
    26292912    "_subtype": "set",
     
    26352918    "_entries": [
    26362919      {
    2637         "_value": {
     2920        "_listeners": null,
     2921        "_value": {
     2922          "_listeners": null,
    26382923          "_type": "number",
    26392924          "_description": "1",
     
    26452930      },
    26462931      {
    2647         "_value": {
     2932        "_listeners": null,
     2933        "_value": {
     2934          "_listeners": null,
    26482935          "_type": "number",
    26492936          "_description": "2",
     
    26552942      },
    26562943      {
    2657         "_value": {
     2944        "_listeners": null,
     2945        "_value": {
     2946          "_listeners": null,
    26582947          "_type": "string",
    26592948          "_description": "key",
     
    26772966  "_size": 3,
    26782967  "_preview": {
     2968    "_listeners": null,
    26792969    "_type": "object",
    26802970    "_subtype": "set",
     
    26862976    "_entries": [
    26872977      {
    2688         "_value": {
     2978        "_listeners": null,
     2979        "_value": {
     2980          "_listeners": null,
    26892981          "_type": "object",
    26902982          "_description": "Object",
     
    26932985          "_properties": [
    26942986            {
     2987              "_listeners": null,
    26952988              "_name": "a",
    26962989              "_type": "number",
     
    27022995      },
    27032996      {
    2704         "_value": {
     2997        "_listeners": null,
     2998        "_value": {
     2999          "_listeners": null,
    27053000          "_type": "object",
    27063001          "_subtype": "node",
     
    27103005          "_properties": [
    27113006            {
     3007              "_listeners": null,
    27123008              "_name": "aLink",
    27133009              "_type": "string",
     
    27153011            },
    27163012            {
     3013              "_listeners": null,
    27173014              "_name": "background",
    27183015              "_type": "string",
     
    27203017            },
    27213018            {
     3019              "_listeners": null,
    27223020              "_name": "bgColor",
    27233021              "_type": "string",
     
    27253023            },
    27263024            {
     3025              "_listeners": null,
    27273026              "_name": "link",
    27283027              "_type": "string",
     
    27303029            },
    27313030            {
     3031              "_listeners": null,
    27323032              "_name": "text",
    27333033              "_type": "string",
     
    27393039      },
    27403040      {
    2741         "_value": {
     3041        "_listeners": null,
     3042        "_value": {
     3043          "_listeners": null,
    27423044          "_type": "object",
    27433045          "_subtype": "array",
     
    27483050          "_properties": [
    27493051            {
     3052              "_listeners": null,
    27503053              "_name": "0",
    27513054              "_type": "number",
     
    27533056            },
    27543057            {
     3058              "_listeners": null,
    27553059              "_name": "1",
    27563060              "_type": "number",
     
    27743078  "_size": 101,
    27753079  "_preview": {
     3080    "_listeners": null,
    27763081    "_type": "object",
    27773082    "_subtype": "set",
     
    27833088    "_entries": [
    27843089      {
    2785         "_value": {
     3090        "_listeners": null,
     3091        "_value": {
     3092          "_listeners": null,
    27863093          "_type": "number",
    27873094          "_description": "0",
     
    27933100      },
    27943101      {
    2795         "_value": {
     3102        "_listeners": null,
     3103        "_value": {
     3104          "_listeners": null,
    27963105          "_type": "number",
    27973106          "_description": "1",
     
    28033112      },
    28043113      {
    2805         "_value": {
     3114        "_listeners": null,
     3115        "_value": {
     3116          "_listeners": null,
    28063117          "_type": "number",
    28073118          "_description": "2",
     
    28133124      },
    28143125      {
    2815         "_value": {
     3126        "_listeners": null,
     3127        "_value": {
     3128          "_listeners": null,
    28163129          "_type": "number",
    28173130          "_description": "3",
     
    28233136      },
    28243137      {
    2825         "_value": {
     3138        "_listeners": null,
     3139        "_value": {
     3140          "_listeners": null,
    28263141          "_type": "number",
    28273142          "_description": "4",
     
    28453160  "_size": 1,
    28463161  "_preview": {
     3162    "_listeners": null,
    28473163    "_type": "object",
    28483164    "_subtype": "set",
     
    28543170    "_entries": [
    28553171      {
    2856         "_value": {
     3172        "_listeners": null,
     3173        "_value": {
     3174          "_listeners": null,
    28573175          "_type": "object",
    28583176          "_subtype": "set",
     
    28783196  "_size": 1,
    28793197  "_preview": {
     3198    "_listeners": null,
    28803199    "_type": "object",
    28813200    "_subtype": "weakset",
     
    28873206    "_entries": [
    28883207      {
    2889         "_value": {
     3208        "_listeners": null,
     3209        "_value": {
     3210          "_listeners": null,
    28903211          "_type": "object",
    28913212          "_description": "Object",
     
    28943215          "_properties": [
    28953216            {
     3217              "_listeners": null,
    28963218              "_name": "id",
    28973219              "_type": "number",
     
    29143236  "_description": "String Iterator",
    29153237  "_preview": {
     3238    "_listeners": null,
    29163239    "_type": "object",
    29173240    "_subtype": "iterator",
     
    29213244    "_properties": [
    29223245      {
     3246        "_listeners": null,
    29233247        "_name": "string",
    29243248        "_type": "string",
     
    29293253    "_entries": [
    29303254      {
    2931         "_value": {
     3255        "_listeners": null,
     3256        "_value": {
     3257          "_listeners": null,
    29323258          "_type": "string",
    29333259          "_description": "a",
     
    29503276  "_description": "String Iterator",
    29513277  "_preview": {
     3278    "_listeners": null,
    29523279    "_type": "object",
    29533280    "_subtype": "iterator",
     
    29573284    "_properties": [
    29583285      {
     3286        "_listeners": null,
    29593287        "_name": "string",
    29603288        "_type": "string",
     
    29653293    "_entries": [
    29663294      {
    2967         "_value": {
     3295        "_listeners": null,
     3296        "_value": {
     3297          "_listeners": null,
    29683298          "_type": "string",
    29693299          "_description": "l",
     
    29753305      },
    29763306      {
    2977         "_value": {
     3307        "_listeners": null,
     3308        "_value": {
     3309          "_listeners": null,
    29783310          "_type": "string",
    29793311          "_description": "o",
     
    29853317      },
    29863318      {
    2987         "_value": {
     3319        "_listeners": null,
     3320        "_value": {
     3321          "_listeners": null,
    29883322          "_type": "string",
    29893323          "_description": "n",
     
    29953329      },
    29963330      {
    2997         "_value": {
     3331        "_listeners": null,
     3332        "_value": {
     3333          "_listeners": null,
    29983334          "_type": "string",
    29993335          "_description": "g",
     
    30053341      },
    30063342      {
    3007         "_value": {
     3343        "_listeners": null,
     3344        "_value": {
     3345          "_listeners": null,
    30083346          "_type": "string",
    30093347          "_description": " ",
     
    30263364  "_description": "Array Iterator",
    30273365  "_preview": {
     3366    "_listeners": null,
    30283367    "_type": "object",
    30293368    "_subtype": "iterator",
     
    30333372    "_properties": [
    30343373      {
     3374        "_listeners": null,
    30353375        "_name": "array",
    30363376        "_type": "object",
    30373377        "_subtype": "array",
    30383378        "_valuePreview": {
     3379          "_listeners": null,
    30393380          "_type": "object",
    30403381          "_subtype": "array",
     
    30493390      },
    30503391      {
     3392        "_listeners": null,
    30513393        "_name": "kind",
    30523394        "_type": "string",
     
    30673409  "_description": "Array Iterator",
    30683410  "_preview": {
     3411    "_listeners": null,
    30693412    "_type": "object",
    30703413    "_subtype": "iterator",
     
    30743417    "_properties": [
    30753418      {
     3419        "_listeners": null,
    30763420        "_name": "array",
    30773421        "_type": "object",
    30783422        "_subtype": "array",
    30793423        "_valuePreview": {
     3424          "_listeners": null,
    30803425          "_type": "object",
    30813426          "_subtype": "array",
     
    30863431          "_properties": [
    30873432            {
     3433              "_listeners": null,
    30883434              "_name": "0",
    30893435              "_type": "number",
     
    30963442      },
    30973443      {
     3444        "_listeners": null,
    30983445        "_name": "kind",
    30993446        "_type": "string",
     
    31043451    "_entries": [
    31053452      {
    3106         "_value": {
     3453        "_listeners": null,
     3454        "_value": {
     3455          "_listeners": null,
    31073456          "_type": "number",
    31083457          "_description": "1",
     
    31253474  "_description": "Array Iterator",
    31263475  "_preview": {
     3476    "_listeners": null,
    31273477    "_type": "object",
    31283478    "_subtype": "iterator",
     
    31323482    "_properties": [
    31333483      {
     3484        "_listeners": null,
    31343485        "_name": "array",
    31353486        "_type": "object",
     
    31393490      },
    31403491      {
     3492        "_listeners": null,
    31413493        "_name": "kind",
    31423494        "_type": "string",
     
    31473499    "_entries": [
    31483500      {
    3149         "_value": {
     3501        "_listeners": null,
     3502        "_value": {
     3503          "_listeners": null,
    31503504          "_type": "number",
    31513505          "_description": "1",
     
    31573511      },
    31583512      {
    3159         "_value": {
     3513        "_listeners": null,
     3514        "_value": {
     3515          "_listeners": null,
    31603516          "_type": "string",
    31613517          "_description": "two",
     
    31673523      },
    31683524      {
    3169         "_value": {
     3525        "_listeners": null,
     3526        "_value": {
     3527          "_listeners": null,
    31703528          "_type": "number",
    31713529          "_description": "3",
     
    31773535      },
    31783536      {
    3179         "_value": {
     3537        "_listeners": null,
     3538        "_value": {
     3539          "_listeners": null,
    31803540          "_type": "string",
    31813541          "_description": "four",
     
    31873547      },
    31883548      {
    3189         "_value": {
     3549        "_listeners": null,
     3550        "_value": {
     3551          "_listeners": null,
    31903552          "_type": "number",
    31913553          "_description": "5",
     
    32083570  "_description": "Array Iterator",
    32093571  "_preview": {
     3572    "_listeners": null,
    32103573    "_type": "object",
    32113574    "_subtype": "iterator",
     
    32153578    "_properties": [
    32163579      {
     3580        "_listeners": null,
    32173581        "_name": "array",
    32183582        "_type": "object",
     
    32223586      },
    32233587      {
     3588        "_listeners": null,
    32243589        "_name": "kind",
    32253590        "_type": "string",
     
    32303595    "_entries": [
    32313596      {
    3232         "_value": {
     3597        "_listeners": null,
     3598        "_value": {
     3599          "_listeners": null,
    32333600          "_type": "number",
    32343601          "_description": "0",
     
    32403607      },
    32413608      {
    3242         "_value": {
     3609        "_listeners": null,
     3610        "_value": {
     3611          "_listeners": null,
    32433612          "_type": "number",
    32443613          "_description": "1",
     
    32503619      },
    32513620      {
    3252         "_value": {
     3621        "_listeners": null,
     3622        "_value": {
     3623          "_listeners": null,
    32533624          "_type": "number",
    32543625          "_description": "2",
     
    32603631      },
    32613632      {
    3262         "_value": {
     3633        "_listeners": null,
     3634        "_value": {
     3635          "_listeners": null,
    32633636          "_type": "number",
    32643637          "_description": "3",
     
    32703643      },
    32713644      {
    3272         "_value": {
     3645        "_listeners": null,
     3646        "_value": {
     3647          "_listeners": null,
    32733648          "_type": "number",
    32743649          "_description": "4",
     
    32913666  "_description": "Array Iterator",
    32923667  "_preview": {
     3668    "_listeners": null,
    32933669    "_type": "object",
    32943670    "_subtype": "iterator",
     
    32983674    "_properties": [
    32993675      {
     3676        "_listeners": null,
    33003677        "_name": "array",
    33013678        "_type": "object",
     
    33053682      },
    33063683      {
     3684        "_listeners": null,
    33073685        "_name": "kind",
    33083686        "_type": "string",
     
    33133691    "_entries": [
    33143692      {
    3315         "_value": {
     3693        "_listeners": null,
     3694        "_value": {
     3695          "_listeners": null,
    33163696          "_type": "object",
    33173697          "_subtype": "array",
     
    33223702          "_properties": [
    33233703            {
     3704              "_listeners": null,
    33243705              "_name": "0",
    33253706              "_type": "number",
     
    33273708            },
    33283709            {
     3710              "_listeners": null,
    33293711              "_name": "1",
    33303712              "_type": "number",
     
    33363718      },
    33373719      {
    3338         "_value": {
     3720        "_listeners": null,
     3721        "_value": {
     3722          "_listeners": null,
    33393723          "_type": "object",
    33403724          "_subtype": "array",
     
    33453729          "_properties": [
    33463730            {
     3731              "_listeners": null,
    33473732              "_name": "0",
    33483733              "_type": "number",
     
    33503735            },
    33513736            {
     3737              "_listeners": null,
    33523738              "_name": "1",
    33533739              "_type": "string",
     
    33593745      },
    33603746      {
    3361         "_value": {
     3747        "_listeners": null,
     3748        "_value": {
     3749          "_listeners": null,
    33623750          "_type": "object",
    33633751          "_subtype": "array",
     
    33683756          "_properties": [
    33693757            {
     3758              "_listeners": null,
    33703759              "_name": "0",
    33713760              "_type": "number",
     
    33733762            },
    33743763            {
     3764              "_listeners": null,
    33753765              "_name": "1",
    33763766              "_type": "number",
     
    33823772      },
    33833773      {
    3384         "_value": {
     3774        "_listeners": null,
     3775        "_value": {
     3776          "_listeners": null,
    33853777          "_type": "object",
    33863778          "_subtype": "array",
     
    33913783          "_properties": [
    33923784            {
     3785              "_listeners": null,
    33933786              "_name": "0",
    33943787              "_type": "number",
     
    33963789            },
    33973790            {
     3791              "_listeners": null,
    33983792              "_name": "1",
    33993793              "_type": "string",
     
    34053799      },
    34063800      {
    3407         "_value": {
     3801        "_listeners": null,
     3802        "_value": {
     3803          "_listeners": null,
    34083804          "_type": "object",
    34093805          "_subtype": "array",
     
    34143810          "_properties": [
    34153811            {
     3812              "_listeners": null,
    34163813              "_name": "0",
    34173814              "_type": "number",
     
    34193816            },
    34203817            {
     3818              "_listeners": null,
    34213819              "_name": "1",
    34223820              "_type": "number",
     
    34393837  "_description": "Map Iterator",
    34403838  "_preview": {
     3839    "_listeners": null,
    34413840    "_type": "object",
    34423841    "_subtype": "iterator",
     
    34463845    "_properties": [
    34473846      {
     3847        "_listeners": null,
    34483848        "_name": "map",
    34493849        "_type": "object",
     
    34533853      },
    34543854      {
     3855        "_listeners": null,
    34553856        "_name": "kind",
    34563857        "_type": "string",
     
    34613862    "_entries": [
    34623863      {
    3463         "_value": {
     3864        "_listeners": null,
     3865        "_value": {
     3866          "_listeners": null,
    34643867          "_type": "number",
    34653868          "_description": "2",
     
    34713874      },
    34723875      {
    3473         "_value": {
     3876        "_listeners": null,
     3877        "_value": {
     3878          "_listeners": null,
    34743879          "_type": "string",
    34753880          "_description": "value",
     
    34923897  "_description": "Map Iterator",
    34933898  "_preview": {
     3899    "_listeners": null,
    34943900    "_type": "object",
    34953901    "_subtype": "iterator",
     
    34993905    "_properties": [
    35003906      {
     3907        "_listeners": null,
    35013908        "_name": "map",
    35023909        "_type": "object",
     
    35063913      },
    35073914      {
     3915        "_listeners": null,
    35083916        "_name": "kind",
    35093917        "_type": "string",
     
    35143922    "_entries": [
    35153923      {
    3516         "_value": {
     3924        "_listeners": null,
     3925        "_value": {
     3926          "_listeners": null,
    35173927          "_type": "number",
    35183928          "_description": "1",
     
    35243934      },
    35253935      {
    3526         "_value": {
     3936        "_listeners": null,
     3937        "_value": {
     3938          "_listeners": null,
    35273939          "_type": "string",
    35283940          "_description": "key",
     
    35453957  "_description": "Map Iterator",
    35463958  "_preview": {
     3959    "_listeners": null,
    35473960    "_type": "object",
    35483961    "_subtype": "iterator",
     
    35523965    "_properties": [
    35533966      {
     3967        "_listeners": null,
    35543968        "_name": "map",
    35553969        "_type": "object",
     
    35593973      },
    35603974      {
     3975        "_listeners": null,
    35613976        "_name": "kind",
    35623977        "_type": "string",
     
    35673982    "_entries": [
    35683983      {
    3569         "_value": {
     3984        "_listeners": null,
     3985        "_value": {
     3986          "_listeners": null,
    35703987          "_type": "object",
    35713988          "_subtype": "array",
     
    35763993          "_properties": [
    35773994            {
     3995              "_listeners": null,
    35783996              "_name": "0",
    35793997              "_type": "number",
     
    35813999            },
    35824000            {
     4001              "_listeners": null,
    35834002              "_name": "1",
    35844003              "_type": "number",
     
    35904009      },
    35914010      {
    3592         "_value": {
     4011        "_listeners": null,
     4012        "_value": {
     4013          "_listeners": null,
    35934014          "_type": "object",
    35944015          "_subtype": "array",
     
    35994020          "_properties": [
    36004021            {
     4022              "_listeners": null,
    36014023              "_name": "0",
    36024024              "_type": "string",
     
    36044026            },
    36054027            {
     4028              "_listeners": null,
    36064029              "_name": "1",
    36074030              "_type": "string",
     
    36244047  "_description": "Set Iterator",
    36254048  "_preview": {
     4049    "_listeners": null,
    36264050    "_type": "object",
    36274051    "_subtype": "iterator",
     
    36314055    "_properties": [
    36324056      {
     4057        "_listeners": null,
    36334058        "_name": "set",
    36344059        "_type": "object",
     
    36384063      },
    36394064      {
     4065        "_listeners": null,
    36404066        "_name": "kind",
    36414067        "_type": "string",
     
    36464072    "_entries": [
    36474073      {
    3648         "_value": {
     4074        "_listeners": null,
     4075        "_value": {
     4076          "_listeners": null,
    36494077          "_type": "number",
    36504078          "_description": "0",
     
    36564084      },
    36574085      {
    3658         "_value": {
     4086        "_listeners": null,
     4087        "_value": {
     4088          "_listeners": null,
    36594089          "_type": "number",
    36604090          "_description": "1",
     
    36664096      },
    36674097      {
    3668         "_value": {
     4098        "_listeners": null,
     4099        "_value": {
     4100          "_listeners": null,
    36694101          "_type": "number",
    36704102          "_description": "2",
     
    36764108      },
    36774109      {
    3678         "_value": {
     4110        "_listeners": null,
     4111        "_value": {
     4112          "_listeners": null,
    36794113          "_type": "number",
    36804114          "_description": "3",
     
    36864120      },
    36874121      {
    3688         "_value": {
     4122        "_listeners": null,
     4123        "_value": {
     4124          "_listeners": null,
    36894125          "_type": "number",
    36904126          "_description": "4",
     
    37074143  "_description": "Map Iterator",
    37084144  "_preview": {
     4145    "_listeners": null,
    37094146    "_type": "object",
    37104147    "_subtype": "iterator",
     
    37144151    "_properties": [
    37154152      {
     4153        "_listeners": null,
    37164154        "_name": "map",
    37174155        "_type": "object",
     
    37214159      },
    37224160      {
     4161        "_listeners": null,
    37234162        "_name": "kind",
    37244163        "_type": "string",
     
    37294168    "_entries": [
    37304169      {
    3731         "_value": {
     4170        "_listeners": null,
     4171        "_value": {
     4172          "_listeners": null,
    37324173          "_type": "object",
    37334174          "_subtype": "array",
     
    37384179          "_properties": [
    37394180            {
     4181              "_listeners": null,
    37404182              "_name": "0",
    37414183              "_type": "number",
     
    37434185            },
    37444186            {
     4187              "_listeners": null,
    37454188              "_name": "1",
    37464189              "_type": "number",
     
    37524195      },
    37534196      {
    3754         "_value": {
     4197        "_listeners": null,
     4198        "_value": {
     4199          "_listeners": null,
    37554200          "_type": "object",
    37564201          "_subtype": "array",
     
    37614206          "_properties": [
    37624207            {
     4208              "_listeners": null,
    37634209              "_name": "0",
    37644210              "_type": "string",
     
    37664212            },
    37674213            {
     4214              "_listeners": null,
    37684215              "_name": "1",
    37694216              "_type": "string",
     
    37864233  "_description": "Array Iterator",
    37874234  "_preview": {
     4235    "_listeners": null,
    37884236    "_type": "object",
    37894237    "_subtype": "iterator",
     
    37934241    "_properties": [
    37944242      {
     4243        "_listeners": null,
    37954244        "_name": "array",
    37964245        "_type": "object",
    37974246        "_subtype": "array",
    37984247        "_valuePreview": {
     4248          "_listeners": null,
    37994249          "_type": "object",
    38004250          "_subtype": "array",
     
    38054255          "_properties": [
    38064256            {
     4257              "_listeners": null,
    38074258              "_name": "0",
    38084259              "_type": "number",
     
    38104261            },
    38114262            {
     4263              "_listeners": null,
    38124264              "_name": "1",
    38134265              "_type": "string",
     
    38204272      },
    38214273      {
     4274        "_listeners": null,
    38224275        "_name": "kind",
    38234276        "_type": "string",
     
    38284281    "_entries": [
    38294282      {
    3830         "_value": {
     4283        "_listeners": null,
     4284        "_value": {
     4285          "_listeners": null,
    38314286          "_type": "number",
    38324287          "_description": "1",
     
    38384293      },
    38394294      {
    3840         "_value": {
     4295        "_listeners": null,
     4296        "_value": {
     4297          "_listeners": null,
    38414298          "_type": "string",
    38424299          "_description": "two",
     
    38594316  "_description": "PropertyName Iterator",
    38604317  "_preview": {
     4318    "_listeners": null,
    38614319    "_type": "object",
    38624320    "_subtype": "iterator",
     
    38664324    "_properties": [
    38674325      {
     4326        "_listeners": null,
    38684327        "_name": "object",
    38694328        "_type": "object",
    38704329        "_valuePreview": {
     4330          "_listeners": null,
    38714331          "_type": "object",
    38724332          "_description": "Object",
     
    38754335          "_properties": [
    38764336            {
     4337              "_listeners": null,
    38774338              "_name": "a",
    38784339              "_type": "number",
     
    38804341            },
    38814342            {
     4343              "_listeners": null,
    38824344              "_name": "b",
    38834345              "_type": "number",
     
    38854347            },
    38864348            {
     4349              "_listeners": null,
    38874350              "_name": "c",
    38884351              "_type": "number",
     
    38974360    "_entries": [
    38984361      {
    3899         "_value": {
     4362        "_listeners": null,
     4363        "_value": {
     4364          "_listeners": null,
    39004365          "_type": "string",
    39014366          "_description": "a",
     
    39074372      },
    39084373      {
    3909         "_value": {
     4374        "_listeners": null,
     4375        "_value": {
     4376          "_listeners": null,
    39104377          "_type": "string",
    39114378          "_description": "b",
     
    39174384      },
    39184385      {
    3919         "_value": {
     4386        "_listeners": null,
     4387        "_value": {
     4388          "_listeners": null,
    39204389          "_type": "string",
    39214390          "_description": "c",
     
    39384407  "_description": "PropertyName Iterator",
    39394408  "_preview": {
     4409    "_listeners": null,
    39404410    "_type": "object",
    39414411    "_subtype": "iterator",
     
    39454415    "_properties": [
    39464416      {
     4417        "_listeners": null,
    39474418        "_name": "object",
    39484419        "_type": "object",
     
    39544425    "_entries": [
    39554426      {
    3956         "_value": {
     4427        "_listeners": null,
     4428        "_value": {
     4429          "_listeners": null,
    39574430          "_type": "string",
    39584431          "_description": "0",
     
    39644437      },
    39654438      {
    3966         "_value": {
     4439        "_listeners": null,
     4440        "_value": {
     4441          "_listeners": null,
    39674442          "_type": "string",
    39684443          "_description": "1",
     
    39744449      },
    39754450      {
    3976         "_value": {
     4451        "_listeners": null,
     4452        "_value": {
     4453          "_listeners": null,
    39774454          "_type": "string",
    39784455          "_description": "2",
     
    39844461      },
    39854462      {
    3986         "_value": {
     4463        "_listeners": null,
     4464        "_value": {
     4465          "_listeners": null,
    39874466          "_type": "string",
    39884467          "_description": "3",
     
    39944473      },
    39954474      {
    3996         "_value": {
     4475        "_listeners": null,
     4476        "_value": {
     4477          "_listeners": null,
    39974478          "_type": "string",
    39984479          "_description": "4",
     
    40144495  "_description": "Promise",
    40154496  "_preview": {
     4497    "_listeners": null,
    40164498    "_type": "object",
    40174499    "_description": "Promise",
     
    40204502    "_properties": [
    40214503      {
     4504        "_listeners": null,
    40224505        "_name": "status",
    40234506        "_type": "string",
     
    40374520  "_description": "Promise",
    40384521  "_preview": {
     4522    "_listeners": null,
    40394523    "_type": "object",
    40404524    "_description": "Promise",
     
    40434527    "_properties": [
    40444528      {
     4529        "_listeners": null,
    40454530        "_name": "status",
    40464531        "_type": "string",
     
    40494534      },
    40504535      {
     4536        "_listeners": null,
    40514537        "_name": "result",
    40524538        "_type": "undefined",
     
    40664552  "_description": "Promise",
    40674553  "_preview": {
     4554    "_listeners": null,
    40684555    "_type": "object",
    40694556    "_description": "Promise",
     
    40724559    "_properties": [
    40734560      {
     4561        "_listeners": null,
    40744562        "_name": "status",
    40754563        "_type": "string",
     
    40784566      },
    40794567      {
     4568        "_listeners": null,
    40804569        "_name": "result",
    40814570        "_type": "string",
     
    40954584  "_description": "Promise",
    40964585  "_preview": {
     4586    "_listeners": null,
    40974587    "_type": "object",
    40984588    "_description": "Promise",
     
    41014591    "_properties": [
    41024592      {
     4593        "_listeners": null,
    41034594        "_name": "status",
    41044595        "_type": "string",
     
    41074598      },
    41084599      {
     4600        "_listeners": null,
    41094601        "_name": "result",
    41104602        "_type": "undefined",
     
    41244616  "_description": "Promise",
    41254617  "_preview": {
     4618    "_listeners": null,
    41264619    "_type": "object",
    41274620    "_description": "Promise",
     
    41304623    "_properties": [
    41314624      {
     4625        "_listeners": null,
    41324626        "_name": "status",
    41334627        "_type": "string",
     
    41364630      },
    41374631      {
     4632        "_listeners": null,
    41384633        "_name": "result",
    41394634        "_type": "object",
    41404635        "_valuePreview": {
     4636          "_listeners": null,
    41414637          "_type": "object",
    41424638          "_description": "Object",
     
    41454641          "_properties": [
    41464642            {
     4643              "_listeners": null,
    41474644              "_name": "result",
    41484645              "_type": "number",
     
    42064703  "_size": 1,
    42074704  "_preview": {
     4705    "_listeners": null,
    42084706    "_type": "object",
    42094707    "_subtype": "array",
     
    42144712    "_properties": [
    42154713      {
     4714        "_listeners": null,
    42164715        "_name": "0",
    42174716        "_type": "function",
     
    42314730  "_description": "Object",
    42324731  "_preview": {
     4732    "_listeners": null,
    42334733    "_type": "object",
    42344734    "_description": "Object",
     
    42474747  "_description": "Object",
    42484748  "_preview": {
     4749    "_listeners": null,
    42494750    "_type": "object",
    42504751    "_description": "Object",
  • trunk/Source/WebInspectorUI/ChangeLog

    r195303 r195305  
     12016-01-19  Nikita Vasilyev  <nvasilyev@apple.com>
     2
     3        Web Inspector: WebInspector.Object.addEventListener is O(n), make it O(1)
     4        https://bugs.webkit.org/show_bug.cgi?id=152422
     5        <rdar://problem/24038047>
     6
     7        Reviewed by Timothy Hatcher.
     8
     9        Slow addEventListener was the main cause of Console sluggishness[1].
     10
     11        This patch changes:
     12        addEventListener from O(n) to O(1)
     13        removeEventListener from O(n) to O(1)
     14
     15        Now, addEventListener and removeEventListener take <1ms regardless of the
     16        number of listeners attached.
     17
     18        removeEventListener(null, null, thisObject), a special case when all events
     19        for thisObject are removed, was improved from O(n^2) to O(n).
     20
     21        * UserInterface/Base/LinkedList.js: Added.
     22        (LinkedList):
     23        (LinkedList.prototype.clear):
     24        (LinkedList.prototype.get last):
     25        (LinkedList.prototype.push):
     26        (LinkedList.prototype.remove):
     27        (LinkedList.prototype.forEach):
     28        (LinkedList.prototype.toArray):
     29        (LinkedList.prototype.toJSON):
     30        (LinkedListNode):
     31        LinkedList ensures O(1) time complexity for push and remove operations.
     32
     33        * UserInterface/Base/ListMultimap.js: Added.
     34        (ListMultimap):
     35        (ListMultimap.prototype.get size):
     36        (ListMultimap.prototype.add):
     37        (ListMultimap.prototype.delete):
     38        (ListMultimap.prototype.deleteAll):
     39        (ListMultimap.prototype.has):
     40        (ListMultimap.prototype.clear):
     41        (ListMultimap.prototype.forEach):
     42        (ListMultimap.prototype.toArray):
     43        (ListMultimap.prototype.toJSON):
     44        ListMultimap unsures O(1) time complexity for add, has and delete operations.
     45        ListMultimap preserves insertion order by using a LinkedList.
     46
     47        * UserInterface/Base/Object.js:
     48        (WebInspector.Object):
     49        (WebInspector.Object.addEventListener):
     50        (WebInspector.Object.removeEventListener):
     51        (WebInspector.Object.hasEventListeners):
     52        (WebInspector.Object.retainedObjectsWithPrototype):
     53        (WebInspector.Object.prototype.dispatchEventToListeners):
     54        Replace this._listeners[eventType] from array of objects to ListMultimap.
     55
     56        * UserInterface/Main.html:
     57        * UserInterface/Test.html:
     58        * UserInterface/TestStub.html:
     59
    1602016-01-19  Matt Baker  <mattbaker@apple.com>
    261
  • trunk/Source/WebInspectorUI/UserInterface/Base/Object.js

    r194356 r195305  
    2626WebInspector.Object = class WebInspectorObject
    2727{
     28    constructor()
     29    {
     30        this._listeners = null;
     31    }
     32
    2833    // Static
    2934
     
    4146
    4247        if (!this._listeners)
    43             this._listeners = {};
    44 
    45         var listeners = this._listeners[eventType];
    46         if (!listeners)
    47             listeners = this._listeners[eventType] = [];
    48 
    49         // Prevent registering multiple times.
    50         for (var i = 0; i < listeners.length; ++i) {
    51             if (listeners[i].listener === listener && listeners[i].thisObject === thisObject)
    52                 return;
    53         }
    54 
    55         listeners.push({thisObject, listener});
     48            this._listeners = new Map();
     49
     50        let listenersTable = this._listeners.get(eventType);
     51        if (!listenersTable) {
     52            listenersTable = new ListMultimap();
     53            this._listeners.set(eventType, listenersTable);
     54        }
     55
     56        listenersTable.add(thisObject, listener);
    5657    }
    5758
     
    7677            return;
    7778
    78         if (!eventType) {
    79             for (eventType in this._listeners)
    80                 this.removeEventListener(eventType, listener, thisObject);
    81             return;
    82         }
    83 
    84         var listeners = this._listeners[eventType];
    85         if (!listeners)
    86             return;
    87 
    88         for (var i = listeners.length - 1; i >= 0; --i) {
    89             if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
    90                 listeners.splice(i, 1);
    91             else if (!listener && thisObject && listeners[i].thisObject === thisObject)
    92                 listeners.splice(i, 1);
    93         }
    94 
    95         if (!listeners.length)
    96             delete this._listeners[eventType];
    97 
    98         if (!Object.keys(this._listeners).length)
    99             delete this._listeners;
    100     }
    101 
     79        if (thisObject && !eventType) {
     80            this._listeners.forEach(function(listenersTable) {
     81                let listenerPairs = listenersTable.toArray();
     82                for (let i = 0, length = listenerPairs.length; i < length; ++i) {
     83                    let existingThisObject = listenerPairs[i][0];
     84                    if (existingThisObject === thisObject)
     85                        listenersTable.deleteAll(existingThisObject);
     86                }
     87            });
     88
     89            return;
     90        }
     91
     92        let listenersTable = this._listeners.get(eventType);
     93        if (!listenersTable || listenersTable.size === 0)
     94            return;
     95
     96        let didDelete = listenersTable.delete(thisObject, listener);
     97        console.assert(didDelete, "removeEventListener cannot remove " + eventType.toString() + " because it doesn't exist.");
     98    }
     99
     100    // Only used by tests.
    102101    static hasEventListeners(eventType)
    103102    {
    104         if (!this._listeners || !this._listeners[eventType])
     103        if (!this._listeners)
    105104            return false;
    106         return true;
     105
     106        let listenersTable = this._listeners.get(eventType);
     107        return listenersTable && listenersTable.size > 0;
    107108    }
    108109
     
    111112    {
    112113        let results = new Set;
    113         for (let eventType in this._listeners) {
    114             let recordsForEvent = this._listeners[eventType];
    115             for (let listener of recordsForEvent) {
    116                 if (listener.thisObject instanceof proto)
    117                     results.add(listener.thisObject);
    118             }
    119         }
     114
     115        if (this._listeners) {
     116            this._listeners.forEach(function(listenersTable, eventType) {
     117                listenersTable.forEach(function(pair) {
     118                    let thisObject = pair[0];
     119                    if (thisObject instanceof proto)
     120                        results.add(thisObject);
     121                });
     122            });
     123        }
     124
    120125        return results;
    121126    }
     
    131136    dispatchEventToListeners(eventType, eventData)
    132137    {
    133         var event = new WebInspector.Event(this, eventType, eventData);
     138        let event = new WebInspector.Event(this, eventType, eventData);
    134139
    135140        function dispatch(object)
    136141        {
    137             if (!object || !object.hasOwnProperty("_listeners") || event._stoppedPropagation)
     142            if (!object || !object._listeners || event._stoppedPropagation)
    138143                return;
    139144
    140             let listenersForThisEvent = object._listeners[eventType];
    141             if (!listenersForThisEvent)
     145            if (!(object._listeners instanceof Map)) {
     146                console.error("object._listeners should be a Map but it isn't.\n`object` is most likely a WebInspector.EventListenerSet.");
    142147                return;
     148            }
     149
     150            let listenersTable = object._listeners.get(eventType);
     151            if (!listenersTable)
     152                return;
    143153
    144154            // Make a copy with slice so mutations during the loop doesn't affect us.
    145             listenersForThisEvent = listenersForThisEvent.slice(0);
     155            let listeners = listenersTable.toArray();
    146156
    147157            // Iterate over the listeners and call them. Stop if stopPropagation is called.
    148             for (var i = 0; i < listenersForThisEvent.length; ++i) {
    149                 listenersForThisEvent[i].listener.call(listenersForThisEvent[i].thisObject, event);
     158            for (let i = 0, length = listeners.length; i < length; ++i) {
     159                let [thisObject, listener] = listeners[i];
     160                listener.call(thisObject, event);
    150161                if (event._stoppedPropagation)
    151162                    break;
     
    160171
    161172        // Dispatch to listeners on all constructors up the prototype chain, including the immediate constructor.
    162         var constructor = this.constructor;
     173        let constructor = this.constructor;
    163174        while (constructor) {
    164175            dispatch(constructor);
  • trunk/Source/WebInspectorUI/UserInterface/Main.html

    r195303 r195305  
    217217    <script src="Protocol/InspectorFrontendHostStub.js"></script>
    218218    <script src="Base/Platform.js"></script>
     219    <script src="Base/LinkedList.js"></script>
     220    <script src="Base/ListMultimap.js"></script>
    219221    <script src="Base/Object.js"></script>
    220222
  • trunk/Source/WebInspectorUI/UserInterface/Test.html

    r193870 r195305  
    3737
    3838    <script src="Base/WebInspector.js"></script>
     39    <script src="Base/LinkedList.js"></script>
     40    <script src="Base/ListMultimap.js"></script>
    3941    <script src="Base/Object.js"></script>
    4042
  • trunk/Source/WebInspectorUI/UserInterface/TestStub.html

    r188965 r195305  
    3131    -->
    3232    <script src="Base/WebInspector.js"></script>
     33    <script src="Base/LinkedList.js"></script>
     34    <script src="Base/ListMultimap.js"></script>
    3335    <script src="Base/Object.js"></script>
    3436
Note: See TracChangeset for help on using the changeset viewer.