| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| (async function() { |
| TestRunner.addResult( |
| `Tests that weak references are ignored when dominators are calculated and that weak references won't affect object's retained size.\n`); |
| await TestRunner.loadModule('heap_profiler_test_runner'); |
| await TestRunner.showPanel('heap_profiler'); |
| |
| HeapProfilerTestRunner.runHeapSnapshotTestSuite([function testWeakReferencesDoNotAffectRetainedSize(next) { |
| function createHeapSnapshot() { |
| // Mocking results of running the following code: |
| // root = [new Uint8Array(1000), new Uint8Array(1000), new Uint8Array(1000)] |
| var builder = new HeapProfilerTestRunner.HeapSnapshotBuilder(); |
| var rootNode = builder.rootNode; |
| |
| var gcRootsNode = new HeapProfilerTestRunner.HeapNode('(GC roots)'); |
| rootNode.linkNode(gcRootsNode, HeapProfilerTestRunner.HeapEdge.Type.element); |
| |
| var windowNode = new HeapProfilerTestRunner.HeapNode('Window', 20); |
| rootNode.linkNode(windowNode, HeapProfilerTestRunner.HeapEdge.Type.shortcut); |
| gcRootsNode.linkNode(windowNode, HeapProfilerTestRunner.HeapEdge.Type.element); |
| |
| var arrayNode = new HeapProfilerTestRunner.HeapNode('Array', 10); |
| windowNode.linkNode(arrayNode, HeapProfilerTestRunner.HeapEdge.Type.property, 'root'); |
| var prevBufferNode = null; |
| for (var i = 0; i < 3; i++) { |
| var typedArrayNode = new HeapProfilerTestRunner.HeapNode('Uint8Array', 100); |
| arrayNode.linkNode(typedArrayNode, HeapProfilerTestRunner.HeapEdge.Type.element); |
| |
| var bufferNode = new HeapProfilerTestRunner.HeapNode('ArrayBuffer', 1000); |
| typedArrayNode.linkNode(bufferNode, HeapProfilerTestRunner.HeapEdge.Type.internal); |
| if (prevBufferNode) |
| prevBufferNode.linkNode(bufferNode, HeapProfilerTestRunner.HeapEdge.Type.weak, 'weak_next'); |
| prevBufferNode = bufferNode; |
| } |
| |
| return builder.generateSnapshot(); |
| } |
| |
| HeapProfilerTestRunner.takeAndOpenSnapshot(createHeapSnapshot, step1); |
| |
| function step1() { |
| HeapProfilerTestRunner.switchToView('Summary', step2); |
| } |
| |
| function step2() { |
| var row = HeapProfilerTestRunner.findRow('Array'); |
| TestRunner.assertEquals(true, !!row, '"Array" row'); |
| HeapProfilerTestRunner.expandRow(row, step3); |
| } |
| |
| function step3(row) { |
| TestRunner.assertEquals(1, row._count); |
| TestRunner.assertEquals(3310, row._retainedSize); |
| TestRunner.assertEquals(10, row._shallowSize); |
| HeapProfilerTestRunner.expandRow(row.children[0], step4); |
| } |
| |
| function step4(arrayInstanceRow) { |
| TestRunner.assertEquals(2, arrayInstanceRow._distance); |
| TestRunner.assertEquals(3310, arrayInstanceRow._retainedSize); |
| TestRunner.assertEquals(10, arrayInstanceRow._shallowSize); |
| |
| var children = arrayInstanceRow.children; |
| TestRunner.assertEquals(3, children.length); |
| |
| for (var i = 0; i < children.length; i++) { |
| TestRunner.assertEquals('Uint8Array', children[i]._name); |
| TestRunner.assertEquals(100, children[i]._shallowSize); |
| TestRunner.assertEquals(1100, children[i]._retainedSize); |
| } |
| setTimeout(next, 0); |
| } |
| }]); |
| })(); |