| Index: tracing/tracing/metrics/system_health/memory_metric_test.html | 
| diff --git a/tracing/tracing/metrics/system_health/memory_metric_test.html b/tracing/tracing/metrics/system_health/memory_metric_test.html | 
| index 500333d61f910a0eb14e9686e67c17f539e048c2..f70dd2d02680d94aba787264e259cc8c8401266c 100644 | 
| --- a/tracing/tracing/metrics/system_health/memory_metric_test.html | 
| +++ b/tracing/tracing/metrics/system_health/memory_metric_test.html | 
| @@ -5,6 +5,8 @@ Use of this source code is governed by a BSD-style license that can be | 
| found in the LICENSE file. | 
| --> | 
|  | 
| +<link rel="import" href="/tracing/base/iteration_helpers.html"> | 
| +<link rel="import" href="/tracing/base/range.html"> | 
| <link rel="import" href="/tracing/core/test_utils.html"> | 
| <link rel="import" href="/tracing/metrics/system_health/memory_metric.html"> | 
| <link rel="import" href="/tracing/model/container_memory_dump.html"> | 
| @@ -32,7 +34,8 @@ tr.b.unittest.testSuite(function() { | 
| var sizeInBytes_smallerIsBetter = | 
| tr.v.Unit.byName.sizeInBytes_smallerIsBetter; | 
|  | 
| -  function memoryMetricTest(name, modelCallback, expectedNumerics) { | 
| +  function memoryMetricTest( | 
| +      name, modelCallback, opt_options, expectedNumerics) { | 
| test(name, function() { | 
| // Create a model and a fake value list. | 
| var model = tr.c.TestUtils.newModel(modelCallback); | 
| @@ -47,7 +50,7 @@ tr.b.unittest.testSuite(function() { | 
| }; | 
|  | 
| // Run the memory metric on the model. | 
| -      tr.metrics.sh.memoryMetric(fakeValueList, model); | 
| +      tr.metrics.sh.memoryMetric(fakeValueList, model, opt_options); | 
|  | 
| // Check that the names of the added values match expectations. | 
| var actualValueNames = Object.keys(valueNameToValues).sort(); | 
| @@ -158,13 +161,13 @@ tr.b.unittest.testSuite(function() { | 
|  | 
| memoryMetricTest('noDumps_noBrowser', function(model) { | 
| createProcessWithName(model, 'Non-browser'); | 
| -  }, { | 
| +  }, undefined /* opt_options */, { | 
| /* no values */ | 
| }); | 
|  | 
| memoryMetricTest('noDumps_chrome', function(model) { | 
| createChromeBrowserProcess(model); | 
| -  }, { | 
| +  }, undefined /* opt_options */, { | 
| 'memory:chrome:all_processes:dump_count:detailed': { | 
| value: 0, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -190,7 +193,7 @@ tr.b.unittest.testSuite(function() { | 
| createWebViewProcess(model); | 
| createProcessWithName(model, 'Non-browser'); | 
| createChromeBrowserProcess(model); | 
| -  }, { | 
| +  }, undefined /* opt_options */, { | 
| 'memory:chrome2:all_processes:dump_count:detailed': { | 
| value: 0, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -248,10 +251,10 @@ tr.b.unittest.testSuite(function() { | 
| }); | 
|  | 
| memoryMetricTest('dumpCountsOnly_unknownBrowser', function(model) { | 
| -    addGlobalMemoryDump(model, 45, DETAILED); | 
| -    addGlobalMemoryDump(model, 68, LIGHT); | 
| -    addGlobalMemoryDump(model, 89, DETAILED); | 
| -  }, { | 
| +    addGlobalMemoryDump(model, {ts: 45, levelOfDetail: DETAILED}); | 
| +    addGlobalMemoryDump(model, {ts: 68, levelOfDetail: LIGHT}); | 
| +    addGlobalMemoryDump(model, {ts: 89, levelOfDetail: DETAILED}); | 
| +  }, undefined /* opt_options */, { | 
| 'memory:unknown_browser:all_processes:dump_count:detailed': { | 
| value: 2, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -274,9 +277,11 @@ tr.b.unittest.testSuite(function() { | 
|  | 
| memoryMetricTest('dumpCountsOnly_webview', function(model) { | 
| var p = createWebViewProcess(model); | 
| -    addProcessMemoryDump(addGlobalMemoryDump(model, 45, LIGHT), p, 45); | 
| -    addProcessMemoryDump(addGlobalMemoryDump(model, 68, LIGHT), p, 68); | 
| -  }, { | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 45, levelOfDetail: LIGHT}), p, {ts: 45}); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 68, levelOfDetail: LIGHT}), p, {ts: 68}); | 
| +  }, undefined /* opt_options */, { | 
| 'memory:webview:all_processes:dump_count:detailed': { | 
| value: 0, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -315,105 +320,113 @@ tr.b.unittest.testSuite(function() { | 
| var pUnknown = createProcessWithName(model, undefined); | 
|  | 
| // Timestamp 1. | 
| -    var gmd1 = addGlobalMemoryDump(model, 20); | 
| -    var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, 19); | 
| +    var gmd1 = addGlobalMemoryDump(model, {ts: 20}); | 
| +    var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, {ts: 19}); | 
| pmdBrowser1.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser1, 'malloc', { | 
| -        'size': 8, | 
| -        'allocated_objects_size': 4 | 
| -      }) | 
| +      newAllocatorDump(pmdBrowser1, 'malloc', {numerics: { | 
| +        size: 8, | 
| +        allocated_objects_size: 4 | 
| +      }}) | 
| ]; | 
| -    var pmdRendererA1 = addProcessMemoryDump(gmd1, pRendererA, 20); | 
| +    var pmdRendererA1 = addProcessMemoryDump(gmd1, pRendererA, {ts: 20}); | 
| pmdRendererA1.memoryAllocatorDumps = (function() { | 
| var mallocDump = | 
| -          newAllocatorDump(pmdRendererA1, 'malloc', { 'size': 16 }); | 
| +          newAllocatorDump(pmdRendererA1, 'malloc', {numerics: {size: 16}}); | 
| var partitionAllocDump = | 
| newAllocatorDump(pmdRendererA1, 'partition_alloc'); | 
| addOwnershipLink( | 
| -          addChildDump(partitionAllocDump, 'allocated_objects', { 'size': 32 }), | 
| -          addChildDump(partitionAllocDump, 'partitions', { 'size': 24 })); | 
| +          addChildDump(partitionAllocDump, 'allocated_objects', | 
| +              {numerics: {size: 32}}), | 
| +          addChildDump(partitionAllocDump, 'partitions', | 
| +              {numerics: {size: 24}})); | 
| return [mallocDump, partitionAllocDump]; | 
| })(); | 
| -    var pmdGpu1 = addProcessMemoryDump(gmd1, pPpapi, 21); | 
| +    var pmdGpu1 = addProcessMemoryDump(gmd1, pPpapi, {ts: 21}); | 
| pmdGpu1.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdGpu1, 'gpu', { | 
| -        'size': 30, | 
| -        'allocated_objects_size': 25 | 
| -      }) | 
| +      newAllocatorDump(pmdGpu1, 'gpu', {numerics: { | 
| +        size: 30, | 
| +        allocated_objects_size: 25 | 
| +      }}) | 
| ]; | 
|  | 
| // Timestamp 2. | 
| -    var gmd2 = addGlobalMemoryDump(model, 40); | 
| -    var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, 41); | 
| +    var gmd2 = addGlobalMemoryDump(model, {ts: 40}); | 
| +    var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, {ts: 41}); | 
| pmdBrowser2.memoryAllocatorDumps = (function() { | 
| -      var mallocDump = newAllocatorDump(pmdBrowser2, 'malloc', { 'size': 120 }); | 
| +      var mallocDump = newAllocatorDump(pmdBrowser2, 'malloc', | 
| +          {numerics: {size: 120}}); | 
| var tracingDump = | 
| -          newAllocatorDump(pmdBrowser2, 'tracing', { 'size': 40 }); | 
| +          newAllocatorDump(pmdBrowser2, 'tracing', {numerics: {size: 40}}); | 
| return [mallocDump, tracingDump]; | 
| })(); | 
| -    var pmdRendererA2 = addProcessMemoryDump(gmd2, pRendererA, 39); | 
| +    var pmdRendererA2 = addProcessMemoryDump(gmd2, pRendererA, {ts: 39}); | 
| pmdRendererA2.memoryAllocatorDumps = (function() { | 
| var partitionAllocDump = | 
| newAllocatorDump(pmdRendererA2, 'partition_alloc'); | 
| addOwnershipLink( | 
| addChildDump(partitionAllocDump, 'allocated_objects', | 
| -              { 'size': 320 }), | 
| -          addChildDump(partitionAllocDump, 'partitions', { 'size': 240 })); | 
| -      var v8Dump = newAllocatorDump(pmdRendererA2, 'v8', { 'size': 650 }); | 
| +              {numerics: {size: 320}}), | 
| +          addChildDump(partitionAllocDump, 'partitions', | 
| +              {numerics: {size: 240}})); | 
| +      var v8Dump = newAllocatorDump(pmdRendererA2, 'v8', | 
| +          {numerics: {size: 650}}); | 
| +      var isolateDumpA = addChildDump(v8Dump, 'isolate_A'); | 
| +      addChildDump(isolateDumpA, 'malloc', {numerics: {size: 1 }}); | 
| +      var isolateDumpB = addChildDump(v8Dump, 'isolate_B'); | 
| +      addChildDump(isolateDumpB, 'malloc', {numerics: {size: 10 }}); | 
| return [partitionAllocDump, v8Dump]; | 
| })(); | 
| -    var pmdRendererB2 = addProcessMemoryDump(gmd2, pRendererB, 40); | 
| +    var pmdRendererB2 = addProcessMemoryDump(gmd2, pRendererB, {ts: 40}); | 
| pmdRendererB2.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdRendererB2, 'v8', { | 
| -        'size': 970, | 
| -        'allocated_objects_size': 860 | 
| -      }), | 
| -      newAllocatorDump(pmdRendererB2, 'malloc', { | 
| -        'allocated_objects_size': 750 | 
| -      }) | 
| +      newAllocatorDump(pmdRendererB2, 'v8', {numerics: { | 
| +        size: 970, | 
| +        allocated_objects_size: 860 | 
| +      }}), | 
| +      newAllocatorDump(pmdRendererB2, 'malloc', | 
| +          {numerics: {allocated_objects_size: 750}}) | 
| ]; | 
| -    var pmdUnknown = addProcessMemoryDump(gmd2, pUnknown, 42); | 
| +    var pmdUnknown = addProcessMemoryDump(gmd2, pUnknown, {ts: 42}); | 
| pmdUnknown.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdRendererB2, 'v8', { | 
| -        'size': 111 | 
| -      }) | 
| +      newAllocatorDump(pmdRendererB2, 'v8', {numerics: {size: 111}}) | 
| ]; | 
|  | 
| // Timestamp 3. | 
| -    var gmd3 = addGlobalMemoryDump(model, 60); | 
| -    var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, 60); | 
| +    var gmd3 = addGlobalMemoryDump(model, {ts: 60}); | 
| +    var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, {ts: 60}); | 
| pmdBrowser3.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser3, 'malloc', { | 
| -        'size': 8000, | 
| -        'allocated_objects_size': 4000 | 
| -      }) | 
| +      newAllocatorDump(pmdBrowser3, 'malloc', {numerics: { | 
| +        size: 8000, | 
| +        allocated_objects_size: 4000 | 
| +      }}) | 
| ]; | 
| -    var pmdRendererB3 = addProcessMemoryDump(gmd3, pRendererB, 61); | 
| +    var pmdRendererB3 = addProcessMemoryDump(gmd3, pRendererB, {ts: 61}); | 
| // Intentionally pmdRendererB3.memoryAllocatorDumps undefined. | 
| -    var pmdGpu3 = addProcessMemoryDump(gmd3, pPpapi, 59); | 
| +    var pmdGpu3 = addProcessMemoryDump(gmd3, pPpapi, {ts: 59}); | 
| pmdGpu3.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdGpu3, 'gpu', { 'size': 300 }) | 
| +      newAllocatorDump(pmdGpu3, 'gpu', {numerics: {size: 300}}) | 
| ]; | 
|  | 
| // Timestamp 4. | 
| -    var gmd4 = addGlobalMemoryDump(model, 80); | 
| -    var pmdBrowser4 = addProcessMemoryDump(gmd4, pBrowser, 81); | 
| +    var gmd4 = addGlobalMemoryDump(model, {ts: 80}); | 
| +    var pmdBrowser4 = addProcessMemoryDump(gmd4, pBrowser, {ts: 81}); | 
| pmdBrowser4.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser4, 'malloc', { 'size': 80000 }) | 
| +      newAllocatorDump(pmdBrowser4, 'malloc', {numerics: {size: 80000}}) | 
| ]; | 
| -    var pmdRendererB4 = addProcessMemoryDump(gmd4, pRendererB, 79); | 
| +    var pmdRendererB4 = addProcessMemoryDump(gmd4, pRendererB, {ts: 79}); | 
| pmdRendererB4.memoryAllocatorDumps = (function() { | 
| -      var v8Dump = newAllocatorDump(pmdRendererB4, 'v8', { 'size': 9e5 }); | 
| +      var v8Dump = newAllocatorDump(pmdRendererB4, 'v8', | 
| +          {numerics: {size: 9e5}}); | 
| var partitionAllocDump = newAllocatorDump(pmdRendererB4, | 
| -          'partition_alloc', { 'size': 5e5 }); | 
| +          'partition_alloc', {numerics: {size: 5e5}}); | 
| addOwnershipLink(partitionAllocDump, v8Dump); | 
| return [v8Dump, partitionAllocDump]; | 
| })(); | 
| -    var pmdGpu4 = addProcessMemoryDump(gmd4, pPpapi, 80); | 
| +    var pmdGpu4 = addProcessMemoryDump(gmd4, pPpapi, {ts: 80}); | 
| pmdGpu4.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdGpu4, 'gpu', { 'memtrack_pss': 666 /* ignored */ }) | 
| +      newAllocatorDump(pmdGpu4, 'gpu', | 
| +          {numerics: {memtrack_pss: 666 /* ignored */}}) | 
| ]; | 
| -  }, { | 
| +  }, undefined /* opt_options */, { | 
| 'memory:chrome:all_processes:dump_count:detailed': { | 
| value: 0, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -486,6 +499,13 @@ tr.b.unittest.testSuite(function() { | 
| unit: sizeInBytes_smallerIsBetter, | 
| description: 'effective size of tracing in all processes in Chrome' | 
| }, | 
| +    'memory:chrome:all_processes:reported_by_chrome:v8:allocated_by_malloc:effective_size': | 
| +        { | 
| +          value: [0, 1 + 10, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'effective size of objects allocated by malloc for v8 ' + | 
| +              'in all processes in Chrome' | 
| +        }, | 
| 'memory:chrome:all_processes:reported_by_chrome:v8:effective_size': { | 
| value: [0, 650 + 970 + 111, 0, 4e5], | 
| unit: sizeInBytes_smallerIsBetter, | 
| @@ -600,6 +620,13 @@ tr.b.unittest.testSuite(function() { | 
| description: 'effective size of partition_alloc in renderer ' + | 
| 'processes in Chrome' | 
| }, | 
| +    'memory:chrome:renderer_processes:reported_by_chrome:v8:allocated_by_malloc:effective_size': | 
| +        { | 
| +          value: [0, 1 + 10, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'effective size of objects allocated by malloc for v8 ' + | 
| +              'in renderer processes in Chrome' | 
| +        }, | 
| 'memory:chrome:renderer_processes:reported_by_chrome:v8:effective_size': { | 
| value: [0, 650 + 970, 0, 4e5], | 
| unit: sizeInBytes_smallerIsBetter, | 
| @@ -638,101 +665,100 @@ tr.b.unittest.testSuite(function() { | 
| var pGpu = createProcessWithName(model, 'GPU Process'); | 
|  | 
| // Timestamp 1. | 
| -    var gmd1 = addGlobalMemoryDump(model, 10, DETAILED); | 
| -    var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, 9); | 
| +    var gmd1 = addGlobalMemoryDump(model, {ts: 10, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, {ts: 9}); | 
| pmdBrowser1.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 128, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 8 }) | 
| +          {privateDirtyResident: 8}) | 
| ]); | 
| -    var pmdRendererA1 = addProcessMemoryDump(gmd1, pRendererA, 10); | 
| +    var pmdRendererA1 = addProcessMemoryDump(gmd1, pRendererA, {ts: 10}); | 
| pmdRendererA1.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xEF01, 256, 0, '[anon:libc_malloc]', | 
| -          { 'privateDirtyResident': 17 }) | 
| +          {privateDirtyResident: 17}) | 
| ]); | 
| -    var pmdRendererB1 = addProcessMemoryDump(gmd1, pRendererB, 11); | 
| +    var pmdRendererB1 = addProcessMemoryDump(gmd1, pRendererB, {ts: 11}); | 
| pmdRendererB1.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0x2345, 512, 0, '[heap]', | 
| -          { 'proportionalResident': 67, 'privateDirtyResident': 34 }) | 
| +          {proportionalResident: 67, privateDirtyResident: 34}) | 
| ]); | 
| pmdRendererB1.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdRendererA4, 'v8', { 'code_and_metadata_size': 16 }) | 
| +      newAllocatorDump(pmdRendererA4, 'v8', | 
| +          {numerics: {code_and_metadata_size: 16}}) | 
| ]; | 
| -    var pmdGpu1 = addProcessMemoryDump(gmd1, pGpu, 10); | 
| +    var pmdGpu1 = addProcessMemoryDump(gmd1, pGpu, {ts: 10}); | 
| pmdGpu1.memoryAllocatorDumps = (function() { | 
| var gpuDump = newAllocatorDump(pmdGpu1, 'gpu'); | 
| var memtrackDump = addChildDump(gpuDump, 'android_memtrack'); | 
| -      addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 100 }); | 
| -      addChildDump(memtrackDump, 'graphics', { 'memtrack_pss': 200 }); | 
| +      addChildDump(memtrackDump, 'gl', {numerics: {memtrack_pss: 100}}); | 
| +      addChildDump(memtrackDump, 'graphics', {numerics: {memtrack_pss: 200}}); | 
| return [gpuDump]; | 
| })(); | 
|  | 
| // Timestamp 2 (light global memory dump, so it should be skipped for | 
| // mmaps_* values). | 
| -    var gmd2 = addGlobalMemoryDump(model, 20, LIGHT); | 
| -    var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, 18); | 
| +    var gmd2 = addGlobalMemoryDump(model, {ts: 20, levelOfDetail: LIGHT}); | 
| +    var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, {ts: 18}); | 
| pmdBrowser2.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0x999, 999, 999, '/dev/ashmem/dalvik-main space', | 
| -          { 'proportionalResident': 999 }) | 
| +          {proportionalResident: 999}) | 
| ]); | 
| -    var pmdRendererA2 = addProcessMemoryDump(gmd2, pRendererA, 19); | 
| +    var pmdRendererA2 = addProcessMemoryDump(gmd2, pRendererA, {ts: 19}); | 
| pmdRendererA2.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdRendererA4, 'v8', { | 
| -        'bytecode_and_metadata_size': 678 | 
| -      }) | 
| +      newAllocatorDump(pmdRendererA4, 'v8', | 
| +          {numerics: {bytecode_and_metadata_size: 678}}) | 
| ]; | 
| -    var pmdRendererB2 = addProcessMemoryDump(gmd2, pRendererB, 21); | 
| -    var pmdRendererC2 = addProcessMemoryDump(gmd2, pRendererC, 22); | 
| -    var pmdGpu2 = addProcessMemoryDump(gmd2, pGpu, 20); | 
| +    var pmdRendererB2 = addProcessMemoryDump(gmd2, pRendererB, {ts: 21}); | 
| +    var pmdRendererC2 = addProcessMemoryDump(gmd2, pRendererC, {ts: 22}); | 
| +    var pmdGpu2 = addProcessMemoryDump(gmd2, pGpu, {ts: 20}); | 
| pmdGpu2.memoryAllocatorDumps = (function() { | 
| var gpuDump = newAllocatorDump(pmdGpu2, 'gpu'); | 
| var memtrackDump = addChildDump(gpuDump, 'android_memtrack'); | 
| -      addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 12345 }); | 
| +      addChildDump(memtrackDump, 'gl', {numerics: {memtrack_pss: 12345}}); | 
| return [gpuDump]; | 
| })(); | 
|  | 
| // Timestamp 3. | 
| -    var gmd3 = addGlobalMemoryDump(model, 30, DETAILED); | 
| -    var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, 30); | 
| +    var gmd3 = addGlobalMemoryDump(model, {ts: 30, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, {ts: 30}); | 
| pmdBrowser3.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 1024, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'proportionalResident': 3, 'privateDirtyResident': 80 }) | 
| +          {proportionalResident: 3, privateDirtyResident: 80}) | 
| ]); | 
| -    var pmdRendererA3 = addProcessMemoryDump(gmd3, pRendererA, 29); | 
| +    var pmdRendererA3 = addProcessMemoryDump(gmd3, pRendererA, {ts: 29}); | 
| // Intentionally pmdRendererA3.vmRegions undefined. | 
| -    var pmdRendererC3 = addProcessMemoryDump(gmd3, pRendererC, 31); | 
| +    var pmdRendererC3 = addProcessMemoryDump(gmd3, pRendererC, {ts: 31}); | 
| pmdRendererC3.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0x2345, 2048, 0, '/no/matching/category', | 
| -          { 'proportionalResident': 200 }), | 
| -      new VMRegion(0x2345, 2048, 0, '/dev/ashmem', | 
| -          { 'proportionalResident': 500 }), | 
| +          {proportionalResident: 200}), | 
| +      new VMRegion(0x2345, 2048, 0, '/dev/ashmem', {proportionalResident: 500}), | 
| ]); | 
| -    var pmdGpu3 = addProcessMemoryDump(gmd3, pGpu, 30); | 
| +    var pmdGpu3 = addProcessMemoryDump(gmd3, pGpu, {ts: 30}); | 
| pmdGpu3.memoryAllocatorDumps = (function() { | 
| var gpuDump = newAllocatorDump(pmdGpu3, 'gpu', | 
| -          { 'memtrack_pss': 6000 /* ignored */ }); | 
| +          {numerics: {memtrack_pss: 6000 /* ignored */}}); | 
| var memtrackDump = addChildDump(gpuDump, 'android_memtrack', | 
| -          { 'memtrack_pss': 5000 /* ignored */ }); | 
| -      addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 3000 }); | 
| -      addChildDump(memtrackDump, 'graphics', { 'ignored': 2000 }); | 
| -      addChildDump(memtrackDump, 'gfx', { 'memtrack_pss': 1000 }); | 
| +          {numerics: {memtrack_pss: 5000 /* ignored */}}); | 
| +      addChildDump(memtrackDump, 'gl', {numerics: {memtrack_pss: 3000}}); | 
| +      addChildDump(memtrackDump, 'graphics', {numerics: {ignored: 2000}}); | 
| +      addChildDump(memtrackDump, 'gfx', {numerics: {memtrack_pss: 1000}}); | 
| return [gpuDump]; | 
| })(); | 
| pmdGpu3.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xCDCD, 4096, 0, '/dev/ashmem/dalvik-zygote space', | 
| -          { 'proportionalResident': 150, 'privateDirtyResident': 90 }) | 
| +          {proportionalResident: 150, privateDirtyResident: 90}) | 
| ]); | 
|  | 
| // Timestamp 4. | 
| -    var gmd4 = addGlobalMemoryDump(model, 40, DETAILED); | 
| -    var pmdBrowser4 = addProcessMemoryDump(gmd4, pBrowser, 40); | 
| -    var pmdRendererA4 = addProcessMemoryDump(gmd4, pRendererA, 40); | 
| +    var gmd4 = addGlobalMemoryDump(model, {ts: 40, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser4 = addProcessMemoryDump(gmd4, pBrowser, {ts: 40}); | 
| +    var pmdRendererA4 = addProcessMemoryDump(gmd4, pRendererA, {ts: 40}); | 
| pmdRendererA4.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdRendererA4, 'v8', { | 
| -        'code_and_metadata_size': 21, | 
| -        'bytecode_and_metadata_size': 35 | 
| -      }) | 
| +      newAllocatorDump(pmdRendererA4, 'v8', {numerics: { | 
| +        code_and_metadata_size: 21, | 
| +        bytecode_and_metadata_size: 35 | 
| +      }}) | 
| ]; | 
| -  }, { | 
| +  }, undefined /* opt_options */, { | 
| 'memory:unknown_browser:all_processes:dump_count:detailed': { | 
| value: 3, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -1141,32 +1167,32 @@ tr.b.unittest.testSuite(function() { | 
| var pBrowser = createChromeBrowserProcess(model); | 
|  | 
| // Timestamp 1. | 
| -    var gmd1 = addGlobalMemoryDump(model, 10, DETAILED); | 
| -    var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, 10); | 
| +    var gmd1 = addGlobalMemoryDump(model, {ts: 10, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser1 = addProcessMemoryDump(gmd1, pBrowser, {ts: 10}); | 
| pmdBrowser1.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 128, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 100 }) | 
| +          {privateDirtyResident: 100}) | 
| ]); | 
|  | 
| // Timestamp 2 (light global memory dump, so it should be skipped for | 
| // mmaps_* values). | 
| -    var gmd2 = addGlobalMemoryDump(model, 20, LIGHT); | 
| -    var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, 20); | 
| +    var gmd2 = addGlobalMemoryDump(model, {ts: 20, levelOfDetail: LIGHT}); | 
| +    var pmdBrowser2 = addProcessMemoryDump(gmd2, pBrowser, {ts: 20}); | 
| pmdBrowser2.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser2, 'malloc', { size: 32 }) | 
| +      newAllocatorDump(pmdBrowser2, 'malloc', {numerics: {size: 32}}) | 
| ]; | 
|  | 
| // Timestamp 3. | 
| -    var gmd3 = addGlobalMemoryDump(model, 30, DETAILED); | 
| -    var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, 30); | 
| +    var gmd3 = addGlobalMemoryDump(model, {ts: 30, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser3 = addProcessMemoryDump(gmd3, pBrowser, {ts: 30}); | 
| pmdBrowser3.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser3, 'malloc', { size: 48 }) | 
| +      newAllocatorDump(pmdBrowser3, 'malloc', {numerics: {size: 48}}) | 
| ]; | 
| pmdBrowser3.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 1024, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 150 }) | 
| +          {privateDirtyResident: 150}) | 
| ]); | 
| -  }, { | 
| +  }, {} /* opt_options */, { | 
| 'memory:chrome:all_processes:dump_count:detailed': { | 
| value: 2, | 
| unit: unitlessNumber_smallerIsBetter, | 
| @@ -1364,102 +1390,107 @@ tr.b.unittest.testSuite(function() { | 
| var pRenderer2 = createProcessWithName(model, 'Renderer'); | 
|  | 
| // Timestamp 1 (WebView). | 
| -    var gmd1 = addGlobalMemoryDump(model, 0, LIGHT); | 
| -    var pmdBrowser1 = addProcessMemoryDump(gmd1, pWebView, 0); | 
| +    var gmd1 = addGlobalMemoryDump(model, {ts: 0, levelOfDetail: LIGHT}); | 
| +    var pmdBrowser1 = addProcessMemoryDump(gmd1, pWebView, {ts: 0}); | 
| pmdBrowser1.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser1, 'malloc', { size: 2 }), | 
| -      newAllocatorDump(pmdBrowser1, 'v8', { size: 4 }) | 
| +      newAllocatorDump(pmdBrowser1, 'malloc', {numerics: {size: 2}}), | 
| +      newAllocatorDump(pmdBrowser1, 'v8', {numerics: {size: 4}}) | 
| ]; | 
|  | 
| // Timestamp 2 (Chrome 1 + Renderer + GPU Process). | 
| -    var gmd2 = addGlobalMemoryDump(model, 10, DETAILED); | 
| -    var pmdBrowser2 = addProcessMemoryDump(gmd2, pChrome1, 12); | 
| +    var gmd2 = addGlobalMemoryDump(model, {ts: 10, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser2 = addProcessMemoryDump(gmd2, pChrome1, {ts: 12}); | 
| pmdBrowser2.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 9999, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 8 }) | 
| +          {privateDirtyResident: 8}) | 
| ]); | 
| -    var pmdGpu2 = addProcessMemoryDump(gmd2, pGpu1, 8); | 
| +    var pmdGpu2 = addProcessMemoryDump(gmd2, pGpu1, {ts: 8}); | 
| pmdGpu2.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 9999, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 16 }) | 
| +          {privateDirtyResident: 16}) | 
| ]); | 
| -    var pmdRenderer2 = addProcessMemoryDump(gmd2, pRenderer1, 8); | 
| +    var pmdRenderer2 = addProcessMemoryDump(gmd2, pRenderer1, {ts: 8}); | 
| pmdRenderer2.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser2, 'malloc', { size: 32 }) | 
| +      newAllocatorDump(pmdBrowser2, 'malloc', {numerics: {size: 32}}) | 
| ]; | 
|  | 
| // Timestamp 3 (Chrome 2). | 
| -    var gmd3 = addGlobalMemoryDump(model, 20, DETAILED); | 
| -    var pmdBrowser3 = addProcessMemoryDump(gmd3, pChrome2, 20); | 
| +    var gmd3 = addGlobalMemoryDump(model, {ts: 20, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser3 = addProcessMemoryDump(gmd3, pChrome2, {ts: 20}); | 
| pmdBrowser3.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser3, 'malloc', { size: 64 }), | 
| -      newAllocatorDump(pmdBrowser3, 'sqlite', { size: 128 }), | 
| -      newAllocatorDump(pmdBrowser3, 'discardable', { | 
| +      newAllocatorDump(pmdBrowser3, 'malloc', {numerics: {size: 64}}), | 
| +      newAllocatorDump(pmdBrowser3, 'sqlite', {numerics: {size: 128}}), | 
| +      newAllocatorDump(pmdBrowser3, 'discardable', {numerics: { | 
| size: 8388608, | 
| locked_size: 4194304 | 
| -      }) | 
| +      }}) | 
| ]; | 
| pmdBrowser3.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 99, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 256 }) | 
| +          {privateDirtyResident: 256}) | 
| ]); | 
|  | 
| // Timestamp 4 (Chrome 2 + Renderer). | 
| -    var gmd4 = addGlobalMemoryDump(model, 30, LIGHT); | 
| -    var pmdBrowser4 = addProcessMemoryDump(gmd4, pChrome2, 28); | 
| +    var gmd4 = addGlobalMemoryDump(model, {ts: 30, levelOfDetail: LIGHT}); | 
| +    var pmdBrowser4 = addProcessMemoryDump(gmd4, pChrome2, {ts: 28}); | 
| pmdBrowser4.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser4, 'malloc', { size: 512 }), | 
| -      newAllocatorDump(pmdBrowser3, 'discardable', { size: 16777216 }) | 
| +      newAllocatorDump(pmdBrowser4, 'malloc', {numerics: {size: 512}}), | 
| +      newAllocatorDump(pmdBrowser3, 'discardable', {numerics: {size: 16777216}}) | 
| ]; | 
| -    var pmdRenderer4 = addProcessMemoryDump(gmd4, pRenderer2, 32); | 
| +    var pmdRenderer4 = addProcessMemoryDump(gmd4, pRenderer2, {ts: 32}); | 
| pmdRenderer4.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdRenderer4, 'malloc', { size: 1024 }), | 
| -      newAllocatorDump(pmdRenderer4, 'v8', { size: 2048 }) | 
| +      newAllocatorDump(pmdRenderer4, 'malloc', {numerics: {size: 1024}}), | 
| +      newAllocatorDump(pmdRenderer4, 'v8', {numerics: {size: 2048}}) | 
| ]; | 
|  | 
| // Timestamp 5 (Unknown browser). | 
| -    var gmd5 = addGlobalMemoryDump(model, 40, LIGHT); | 
| -    var pmdBrowser5 = addProcessMemoryDump(gmd5, pUnknownBrowser, 40); | 
| +    var gmd5 = addGlobalMemoryDump(model, {ts: 40, levelOfDetail: LIGHT}); | 
| +    var pmdBrowser5 = addProcessMemoryDump(gmd5, pUnknownBrowser, {ts: 40}); | 
| pmdBrowser5.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser5, 'malloc', { size: 4096 }), | 
| -      newAllocatorDump(pmdBrowser5, 'sqlite', { size: 8192 }), | 
| +      newAllocatorDump(pmdBrowser5, 'malloc', {numerics: {size: 4096}}), | 
| +      newAllocatorDump(pmdBrowser5, 'sqlite', {numerics: {size: 8192}}), | 
| ]; | 
|  | 
| // Timestamp 6 (WebView). | 
| -    var gmd6 = addGlobalMemoryDump(model, 50, DETAILED); | 
| -    var pmdBrowser6 = addProcessMemoryDump(gmd6, pWebView, 50); | 
| -    pmdBrowser6.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser6, 'malloc', { size: 16384 }), | 
| -      newAllocatorDump(pmdBrowser6, 'v8', { | 
| -        'allocated_objects_size': 32768, | 
| -        'code_and_metadata_size': 33554432, | 
| -        'size': 67108864 | 
| -      }) | 
| -    ]; | 
| +    var gmd6 = addGlobalMemoryDump(model, {ts: 50, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser6 = addProcessMemoryDump(gmd6, pWebView, {ts: 50}); | 
| +    pmdBrowser6.memoryAllocatorDumps = (function() { | 
| +      var mallocDump = newAllocatorDump(pmdBrowser6, 'malloc', | 
| +          {numerics: {size: 16384}}); | 
| +      var v8Dump = newAllocatorDump(pmdBrowser6, 'v8', {numerics: { | 
| +        allocated_objects_size: 32768, | 
| +        code_and_metadata_size: 33554432, | 
| +        size: 67108864 | 
| +      }}); | 
| +      var isolateDump = addChildDump(v8Dump, 'isolate'); | 
| +      addChildDump(isolateDump, 'malloc', {numerics: {size: 1 }}); | 
| +      return [mallocDump, v8Dump]; | 
| +    })(); | 
| pmdBrowser6.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 99999, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 65536 }) | 
| +          {privateDirtyResident: 65536}) | 
| ]); | 
|  | 
| // Timestamp 7 (Chrome 1 + GPU Process). | 
| -    var gmd7 = addGlobalMemoryDump(model, 60, DETAILED); | 
| -    var pmdBrowser7 = addProcessMemoryDump(gmd7, pChrome1, 63); | 
| +    var gmd7 = addGlobalMemoryDump(model, {ts: 60, levelOfDetail: DETAILED}); | 
| +    var pmdBrowser7 = addProcessMemoryDump(gmd7, pChrome1, {ts: 63}); | 
| pmdBrowser7.memoryAllocatorDumps = [ | 
| -      newAllocatorDump(pmdBrowser4, 'malloc', { size: 131072 }), | 
| -      newAllocatorDump(pmdBrowser4, 'sqlite', { size: 262144 }) | 
| +      newAllocatorDump(pmdBrowser4, 'malloc', {numerics: {size: 131072}}), | 
| +      newAllocatorDump(pmdBrowser4, 'sqlite', {numerics: {size: 262144}}) | 
| ]; | 
| pmdBrowser7.vmRegions = VMRegionClassificationNode.fromRegions([ | 
| new VMRegion(0xABCD, 999999, 0, '/dev/ashmem/dalvik-non moving space', | 
| -          { 'privateDirtyResident': 524288 }) | 
| +          {privateDirtyResident: 524288}) | 
| ]); | 
| -    var pmdGpu7 = addProcessMemoryDump(gmd7, pGpu1, 57); | 
| +    var pmdGpu7 = addProcessMemoryDump(gmd7, pGpu1, {ts: 57}); | 
| pmdGpu7.memoryAllocatorDumps = (function() { | 
| -      var gpuDump = newAllocatorDump(pmdGpu7, 'gpu', { 'size': 1048576 }); | 
| +      var gpuDump = newAllocatorDump(pmdGpu7, 'gpu', | 
| +          {numerics: {size: 1048576}}); | 
| var memtrackDump = addChildDump(gpuDump, 'android_memtrack'); | 
| -      addChildDump(memtrackDump, 'gl', { 'memtrack_pss': 2097152 }); | 
| +      addChildDump(memtrackDump, 'gl', {numerics: {memtrack_pss: 2097152}}); | 
| return [gpuDump]; | 
| })(); | 
| -  }, { | 
| +  }, undefined /* opt_options */, { | 
| // WebView (GMD1, GMD6). | 
| 'memory:webview:all_processes:dump_count:detailed': { | 
| value: 1, | 
| @@ -1507,6 +1538,13 @@ tr.b.unittest.testSuite(function() { | 
| unit: sizeInBytes_smallerIsBetter, | 
| description: 'effective size of malloc in all processes in WebView' | 
| }, | 
| +    'memory:webview:all_processes:reported_by_chrome:v8:allocated_by_malloc:effective_size': | 
| +        { | 
| +          value: [0, 1], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'effective size of objects allocated by malloc for v8 ' + | 
| +              'in all processes in WebView' | 
| +        }, | 
| 'memory:webview:all_processes:reported_by_chrome:v8:effective_size': { | 
| value: [4, 67108864], | 
| unit: sizeInBytes_smallerIsBetter, | 
| @@ -1624,6 +1662,13 @@ tr.b.unittest.testSuite(function() { | 
| unit: sizeInBytes_smallerIsBetter, | 
| description: 'effective size of malloc in the browser process in WebView' | 
| }, | 
| +    'memory:webview:browser_process:reported_by_chrome:v8:allocated_by_malloc:effective_size': | 
| +        { | 
| +          value: [0, 1], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'effective size of objects allocated by malloc for v8 ' + | 
| +              'in the browser process in WebView' | 
| +        }, | 
| 'memory:webview:browser_process:reported_by_chrome:v8:effective_size': { | 
| value: [4, 67108864], | 
| unit: sizeInBytes_smallerIsBetter, | 
| @@ -2454,14 +2499,266 @@ tr.b.unittest.testSuite(function() { | 
| } | 
| }); | 
|  | 
| +  memoryMetricTest('rangeOfInterest', function(model) { | 
| +    var pChrome = createChromeBrowserProcess(model); | 
| +    var pWebView = createWebViewProcess(model); | 
| + | 
| +    // Chrome: only the LIGHT dumps should be kept. | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 5, duration: 4, levelOfDetail: DETAILED}), pChrome); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 10, duration: 2, levelOfDetail: LIGHT}), pChrome); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 13, duration: 3, levelOfDetail: LIGHT}), pChrome); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 20, duration: 1, levelOfDetail: LIGHT}), pChrome); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 22, duration: 5, levelOfDetail: DETAILED}), pChrome); | 
| + | 
| +    // WebView: only the DETAILED dumps should be kept. | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 4, duration: 1, levelOfDetail: LIGHT}), pWebView); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 5, duration: 5, levelOfDetail: DETAILED}), pWebView); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 10, duration: 0, levelOfDetail: DETAILED}), pWebView); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 11, duration: 7, levelOfDetail: DETAILED}), pWebView); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 19, duration: 2, levelOfDetail: DETAILED}), pWebView); | 
| +    addProcessMemoryDump(addGlobalMemoryDump( | 
| +        model, {ts: 21, duration: 5, levelOfDetail: LIGHT}), pWebView); | 
| + | 
| +    // Unknown browser: only the LIGHT dump should be kept. | 
| +    addGlobalMemoryDump(model, {ts: 5, duration: 3, levelOfDetail: DETAILED}); | 
| +    addGlobalMemoryDump(model, {ts: 9, duration: 12, levelOfDetail: LIGHT}); | 
| +    addGlobalMemoryDump(model, {ts: 22, duration: 3, levelOfDetail: DETAILED}); | 
| +  }, {  /* opt_options */ | 
| +    rangeOfInterest: tr.b.Range.fromExplicitRange(10, 20) | 
| +  }, { | 
| +    'memory:chrome:all_processes:dump_count': { | 
| +      value: 3, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of all memory dumps added by Chrome to the ' + | 
| +          'trace' | 
| +    }, | 
| +    'memory:chrome:all_processes:dump_count:detailed': { | 
| +      value: 0, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of detailed memory dumps added by Chrome to ' + | 
| +          'the trace' | 
| +    }, | 
| +    'memory:chrome:all_processes:dump_count:light': { | 
| +      value: 3, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of light memory dumps added by Chrome to ' + | 
| +          'the trace' | 
| +    }, | 
| +    'memory:chrome:all_processes:process_count': { | 
| +      value: [1, 1, 1], | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of all processes in Chrome' | 
| +    }, | 
| +    'memory:chrome:browser_process:process_count': { | 
| +      value: [1, 1, 1], | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of browser processes in Chrome' | 
| +    }, | 
| + | 
| +    'memory:webview:all_processes:dump_count': { | 
| +      value: 4, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of all memory dumps added by WebView to the ' + | 
| +          'trace' | 
| +    }, | 
| +    'memory:webview:all_processes:dump_count:detailed': { | 
| +      value: 4, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of detailed memory dumps added by WebView ' + | 
| +          'to the trace' | 
| +    }, | 
| +    'memory:webview:all_processes:dump_count:light': { | 
| +      value: 0, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of light memory dumps added by WebView to ' + | 
| +          'the trace' | 
| +    }, | 
| +    'memory:webview:all_processes:process_count': { | 
| +      value: [1, 1, 1, 1], | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of all processes in WebView' | 
| +    }, | 
| +    'memory:webview:all_processes:reported_by_os:private_dirty_size': { | 
| +      value: [0, 0, 0, 0], | 
| +      unit: sizeInBytes_smallerIsBetter, | 
| +      description: 'total private dirty size reported by the OS for all ' + | 
| +          'processes in WebView' | 
| +    }, | 
| +    'memory:webview:all_processes:reported_by_os:proportional_resident_size': { | 
| +      value: [0, 0, 0, 0], | 
| +      unit: sizeInBytes_smallerIsBetter, | 
| +      description: 'total proportional resident size (PSS) reported by the ' + | 
| +          'OS for all processes in WebView' | 
| +    }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:ashmem:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'private dirty size of ashmem in all processes in ' + | 
| +              'WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:ashmem:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'proportional resident size (PSS) of ashmem in all ' + | 
| +              'processes in WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:java_heap:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'private dirty size of the Java heap in all processes ' + | 
| +              'in WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:java_heap:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'proportional resident size (PSS) of the Java heap in ' + | 
| +              'all processes in WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:native_heap:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'private dirty size of the native heap in all ' + | 
| +              'processes in WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:native_heap:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'proportional resident size (PSS) of the native heap ' + | 
| +              'in all processes in WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'total private dirty size of system memory (RAM) used ' + | 
| +              'by all processes in WebView' | 
| +        }, | 
| +    'memory:webview:all_processes:reported_by_os:system_memory:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'total proportional resident size (PSS) of system ' + | 
| +              'memory (RAM) used by all processes in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:process_count': { | 
| +      value: [1, 1, 1, 1], | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of browser processes in WebView' | 
| +    }, | 
| +    'memory:webview:browser_process:reported_by_os:private_dirty_size': { | 
| +      value: [0, 0, 0, 0], | 
| +      unit: sizeInBytes_smallerIsBetter, | 
| +      description: 'total private dirty size reported by the OS for the ' + | 
| +          'browser process in WebView' | 
| +    }, | 
| +    'memory:webview:browser_process:reported_by_os:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'total proportional resident size (PSS) reported by ' + | 
| +              'the OS for the browser process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:ashmem:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'private dirty size of ashmem in the browser process ' + | 
| +              'in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:ashmem:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'proportional resident size (PSS) of ashmem in the ' + | 
| +              'browser process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:java_heap:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'private dirty size of the Java heap in the browser ' + | 
| +              'process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:java_heap:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'proportional resident size (PSS) of the Java heap in ' + | 
| +              'the browser process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:native_heap:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'private dirty size of the native heap in the browser ' + | 
| +              'process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:native_heap:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'proportional resident size (PSS) of the native heap ' + | 
| +              'in the browser process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:private_dirty_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'total private dirty size of system memory (RAM) used ' + | 
| +              'by the browser process in WebView' | 
| +        }, | 
| +    'memory:webview:browser_process:reported_by_os:system_memory:proportional_resident_size': | 
| +        { | 
| +          value: [0, 0, 0, 0], | 
| +          unit: sizeInBytes_smallerIsBetter, | 
| +          description: 'total proportional resident size (PSS) of system ' + | 
| +              'memory (RAM) used by the browser process in WebView' | 
| +        }, | 
| + | 
| +    'memory:unknown_browser:all_processes:dump_count': { | 
| +      value: 1, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of all memory dumps added by an unknown ' + | 
| +          'browser to the trace' | 
| +    }, | 
| +    'memory:unknown_browser:all_processes:dump_count:detailed': { | 
| +      value: 0, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of detailed memory dumps added by an ' + | 
| +          'unknown browser to the trace' | 
| +    }, | 
| +    'memory:unknown_browser:all_processes:dump_count:light': { | 
| +      value: 1, | 
| +      unit: unitlessNumber_smallerIsBetter, | 
| +      description: 'total number of light memory dumps added by an unknown ' + | 
| +          'browser to the trace' | 
| +    } | 
| +  }); | 
| + | 
| test('dumpIdBrowserClashThrows', function() { | 
| var model = tr.c.TestUtils.newModel(function(model) { | 
| var pWebView = createWebViewProcess(model); | 
| var pChrome = createChromeBrowserProcess(model); | 
|  | 
| -      var gmd = addGlobalMemoryDump(model, 10); | 
| -      addProcessMemoryDump(gmd, pWebView, 9); | 
| -      addProcessMemoryDump(gmd, pChrome, 11); | 
| +      var gmd = addGlobalMemoryDump(model, {ts: 10}); | 
| +      addProcessMemoryDump(gmd, pWebView, {ts: 9}); | 
| +      addProcessMemoryDump(gmd, pChrome, {ts: 11}); | 
| }); | 
| var values = new tr.v.ValueSet(); | 
|  | 
|  |