| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2013 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. |
| --> |
| |
| <link rel="import" href="/extras/chrome/cc/input_latency_async_slice.html"> |
| <link rel="import" href="/core/test_utils.html"> |
| <link rel="import" href="/model/event_set.html"> |
| <link rel="import" href="/model/model.html"> |
| <link rel="import" href="/model/model_indices.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.b.unittest.testSuite(function() { |
| var newAsyncSliceEx = tr.c.test_utils.newAsyncSliceEx; |
| var newSliceEx = tr.c.test_utils.newSliceEx; |
| var newFlowEventEx = tr.c.test_utils.newFlowEventEx; |
| var newModel = tr.c.test_utils.newModel; |
| var EventSet = tr.model.EventSet; |
| |
| test('matchByType_oldStyle', function() { |
| var sOuter = newAsyncSliceEx({ |
| title: 'InputLatency', |
| cat: 'benchmark', |
| start: 0, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| args: { |
| data: { |
| INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT: {'time' : 0}, |
| INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT: {time: 10} |
| } |
| } |
| }); |
| assert.throws(function() { |
| sOuter.typeName; |
| }); |
| |
| var sInner = newAsyncSliceEx({ |
| title: 'InputLatency:GestureScrollUpdate', |
| cat: 'benchmark', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| args: { |
| 'step': 'GestureScrollUpdate' |
| } |
| }); |
| sOuter.subSlices.push(sInner); |
| assert.isTrue(sOuter instanceof tr.e.cc.InputLatencyAsyncSlice); |
| assert.isTrue(sInner instanceof tr.e.cc.InputLatencyAsyncSlice); |
| assert.equal(sOuter.inputLatency, 10); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.SCROLL_UPDATE, sInner.typeName); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.SCROLL_UPDATE, sOuter.typeName); |
| }); |
| |
| test('matchByType_newStyle', function() { |
| var sInfo = newAsyncSliceEx({ |
| title: 'InputLatency::GestureScrollUpdate', |
| cat: 'benchmark', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| args: { |
| data: { |
| INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT: {'time' : 0}, |
| INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT: {time: 10} |
| } |
| } |
| }); |
| |
| assert.isTrue(sInfo instanceof tr.e.cc.InputLatencyAsyncSlice); |
| assert.equal(sInfo.inputLatency, 10); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.SCROLL_UPDATE, sInfo.typeName); |
| }); |
| |
| test('unknownType', function() { |
| var sInfo = newAsyncSliceEx({ |
| title: 'InputLatency::BadTypeName', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| args: { |
| data: { |
| INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT: {'time' : 0}, |
| INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT: {'time' : 0}, |
| INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT: {time: 10} |
| } |
| } |
| }); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.UNKNOWN, sInfo.typeName); |
| }); |
| |
| test('getAssociatedEventsBypassRendererMain', function() { |
| var m = newModel(function(m) { |
| |
| var pb = m.getOrCreateProcess(1); |
| var pr = m.getOrCreateProcess(2); |
| var mainBrowserThread = pb.getOrCreateThread(10); |
| var mainRendererThread = pr.getOrCreateThread(20); |
| var compositorThread = pr.getOrCreateThread(21); |
| |
| mainBrowserThread.name = 'CrBrowserMain'; |
| mainRendererThread.name = 'CrRendererMain'; |
| compositorThread.name = 'Compositor'; |
| |
| // Expectation: None of s2 and s3 should be included |
| // CrBrowserMain: [s0] [s1] |
| // | /|\ |
| // CrRendererMain: | [s2] [s3] | |
| // \|/ | |
| // Compositor: [s4]-------------| |
| |
| m.s0 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's0', start: 0.0, duration: 1.0 })); |
| m.s1 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's1', start: 6.0, duration: 1.0 })); |
| m.s2 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's2', start: 2.0, duration: 1.0 })); |
| m.s3 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's3', start: 4.0, duration: 1.0 })); |
| m.s4 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's4', start: 0.5, duration: 1.0 })); |
| |
| m.f1 = newFlowEventEx({ |
| title: 'test1', |
| start: 0, |
| end: 10, |
| startSlice: m.s0, |
| endSlice: m.s4, |
| id: '0x100' |
| }); |
| |
| m.f2 = newFlowEventEx({ |
| title: 'test2', |
| start: 20, |
| end: 30, |
| startSlice: m.s4, |
| endSlice: m.s1, |
| id: '0x100' |
| }); |
| |
| m.flowEvents.push(m.f1); |
| m.flowEvents.push(m.f2); |
| |
| m.as0 = newAsyncSliceEx({ |
| title: 'test1', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x101', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| m.as1 = newAsyncSliceEx({ |
| title: 'test2', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| startThread: compositorThread |
| }); |
| |
| }); |
| |
| assert.isTrue(m.as0.associatedEvents.length === 0); |
| assert.isTrue(m.as1.associatedEvents.equals( |
| new EventSet([m.f1, m.s0, m.f2, m.s4, m.s1]))); |
| assert.equal(m.as1.associatedEvents[0].id, '0x100'); |
| }); |
| |
| test('getAssociatedEventsBypassRendererMainWithOnScroll', function() { |
| var m = newModel(function(m) { |
| |
| var pb = m.getOrCreateProcess(1); |
| var pr = m.getOrCreateProcess(2); |
| var mainBrowserThread = pb.getOrCreateThread(10); |
| var mainRendererThread = pr.getOrCreateThread(20); |
| var compositorThread = pr.getOrCreateThread(21); |
| |
| mainBrowserThread.name = 'CrBrowserMain'; |
| mainRendererThread.name = 'CrRendererMain'; |
| compositorThread.name = 'Compositor'; |
| |
| // Expectation: s2 should be included but not s3 |
| // GestureScrollUpdate: [ as1 ] |
| // CrBrowserMain: [s0] [s1] |
| // | /|\ |
| // CrRendererMain: | [s2] [s3] | |
| // \|/ /|\ | |
| // Compositor: [s4]___|__________| |
| // ScrollUpdate: [ as2 ] |
| |
| m.s0 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's0', start: 0.0, duration: 1.0 })); |
| m.s1 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's1', start: 6.0, duration: 1.0 })); |
| m.s2 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's2', start: 2.0, duration: 1.0 })); |
| m.s3 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's3', start: 4.0, duration: 1.0 })); |
| m.s4 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's4', start: 0.5, duration: 1.0 })); |
| |
| m.f1 = newFlowEventEx({ |
| title: 'f1', |
| start: 0, |
| end: 10, |
| startSlice: m.s0, |
| endSlice: m.s4, |
| id: '0x100' |
| }); |
| |
| m.f2 = newFlowEventEx({ |
| title: 'f2', |
| start: 20, |
| end: 30, |
| startSlice: m.s4, |
| endSlice: m.s1, |
| id: '0x100' |
| }); |
| |
| m.f3 = newFlowEventEx({ |
| title: 'f3', |
| start: 20, |
| end: 30, |
| startSlice: m.s4, |
| endSlice: m.s2, |
| id: '0x800' |
| }); |
| |
| m.flowEvents.push(m.f1); |
| m.flowEvents.push(m.f2); |
| m.flowEvents.push(m.f3); |
| |
| m.as0 = mainBrowserThread.asyncSliceGroup.push(newAsyncSliceEx({ |
| title: 'InputLatency::GestureScrollUpdate', |
| cat: 'benchmark,latencyInfo', |
| args: { |
| data: { |
| INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT: 100 |
| } |
| }, |
| start: 2, |
| end: 10, |
| id: '0x101', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| })); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.SCROLL_UPDATE, |
| m.as0.typeName); |
| |
| m.as1 = mainBrowserThread.asyncSliceGroup.push(newAsyncSliceEx({ |
| title: 'InputLatency::GestureScrollUpdate', |
| cat: 'benchmark,latencyInfo', |
| args: { |
| data: {} |
| }, |
| start: 0, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| })); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.SCROLL_UPDATE, |
| m.as1.typeName); |
| |
| m.as2 = compositorThread.asyncSliceGroup.push(newAsyncSliceEx({ |
| title: 'Latency::ScrollUpdate', |
| cat: 'benchmark,latencyInfo', |
| args: { |
| data: { |
| INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT: 100 |
| } |
| }, |
| start: 1.5, |
| end: 8, |
| id: '0x800', |
| isTopLevel: true, |
| startThread: compositorThread |
| })); |
| assert.equal(tr.e.cc.INPUT_EVENT_TYPE_NAMES.LATENCY_SCROLL_UPDATE, |
| m.as2.typeName); |
| }); |
| |
| assert.isTrue(m.as0.associatedEvents.length === 0); |
| assert.isTrue(m.as1.associatedEvents.equals( |
| new EventSet([m.f1, m.s0, m.f2, m.s4, m.s1, m.f3, m.s2]))); |
| assert.equal(m.as1.associatedEvents[0].id, '0x100'); |
| }); |
| |
| test('getAssociatedEventsWithoutCommit', function() { |
| var m = newModel(function(m) { |
| |
| var pb = m.getOrCreateProcess(1); |
| var pr = m.getOrCreateProcess(2); |
| var mainBrowserThread = pb.getOrCreateThread(10); |
| var mainRendererThread = pr.getOrCreateThread(20); |
| var compositorThread = pr.getOrCreateThread(21); |
| |
| mainBrowserThread.name = 'CrBrowserMain'; |
| mainRendererThread.name = 'CrRendererMain'; |
| compositorThread.name = 'Compositor'; |
| |
| // Expectation: none of s3 and s5 should be included |
| // CrBrowserMain: [s0] [s1] |
| // | /|\ |
| // | __________| |
| // | | |
| // CrRendererMain: | [s2] [s3] [s5] |
| // \|/ /|\ |
| // Compositor: [s4]___| |
| |
| m.s0 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's0', start: 0.0, duration: 1.0 })); |
| m.s1 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's1', start: 6.0, duration: 1.0 })); |
| m.s2 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's2', start: 2.0, duration: 1.0 })); |
| m.s3 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's3', start: 4.0, duration: 1.0 })); |
| m.s4 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's4', start: 0.5, duration: 1.0 })); |
| m.s5 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's5', start: 100.0, duration: 1.0 })); |
| |
| m.f1 = newFlowEventEx({ |
| title: 'f1', |
| start: 0, |
| end: 10, |
| startSlice: m.s0, |
| endSlice: m.s4, |
| id: '0x100' |
| }); |
| |
| m.f2 = newFlowEventEx({ |
| title: 'f2', |
| start: 20, |
| end: 30, |
| startSlice: m.s4, |
| endSlice: m.s2, |
| id: '0x100' |
| }); |
| |
| m.f3 = newFlowEventEx({ |
| title: 'f3', |
| start: 20, |
| end: 30, |
| startSlice: m.s2, |
| endSlice: m.s1, |
| id: '0x100' |
| }); |
| |
| m.flowEvents.push(m.f1); |
| m.flowEvents.push(m.f2); |
| m.flowEvents.push(m.f3); |
| |
| m.as0 = newAsyncSliceEx({ |
| title: 'test1', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x101', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| m.as1 = newAsyncSliceEx({ |
| title: 'test2', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| }); |
| |
| assert.isTrue(m.as0.associatedEvents.length === 0); |
| assert.isTrue(m.as1.associatedEvents.equals( |
| new EventSet([m.f1, m.s0, m.f2, m.s4, m.f3, m.s2, m.s1]))); |
| assert.equal(m.as1.associatedEvents[0].id, '0x100'); |
| }); |
| |
| test('getAssociatedEventsWillCommit', function() { |
| var m = newModel(function(m) { |
| |
| var pb = m.getOrCreateProcess(1); |
| var pr = m.getOrCreateProcess(2); |
| var mainBrowserThread = pb.getOrCreateThread(10); |
| var mainRendererThread = pr.getOrCreateThread(20); |
| var compositorThread = pr.getOrCreateThread(21); |
| |
| mainBrowserThread.name = 'CrBrowserMain'; |
| mainRendererThread.name = 'CrRendererMain'; |
| compositorThread.name = 'Compositor'; |
| |
| // Expectation: s3 should be included by getOtherCasuallyRelatedEvents, |
| // because there is a PostTask s7 -> s3, but s6 shouldn't be included. |
| // CrBrowserMain: [s0] [ s1 ] |
| // | /|\ |
| // | | |
| // | [ s2 ]____ | |
| // CrRendererMain: | /|\ [s7] | | [s6] |
| // | | | | | |
| // | | | | | |
| // \|/ | \|/ \|/ | |
| // Compositor: [s4]__| [s3] [s5]__| |
| |
| m.s0 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's0', start: 0.0, duration: 1.0 })); |
| m.s1 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's1', start: 6.0, duration: 1.0 })); |
| m.s2 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's2', start: 2.0, duration: 1.0 })); |
| m.s3 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's3', start: 4.0, duration: 1.0 })); |
| m.s4 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's4', start: 0.5, duration: 1.0 })); |
| m.s5 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's5', start: 5.5, duration: 1.0 })); |
| m.s6 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's6', start: 1000.0, duration: 1.0 })); |
| m.s7 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's7', start: 2.5, duration: 0.2 })); |
| |
| mainBrowserThread.sliceGroup.createSubSlices(); |
| mainRendererThread.sliceGroup.createSubSlices(); |
| compositorThread.sliceGroup.createSubSlices(); |
| |
| m.f1 = newFlowEventEx({ |
| title: 'f1', |
| start: 0, |
| end: 10, |
| startSlice: m.s0, |
| endSlice: m.s4, |
| id: '0x100' |
| }); |
| |
| m.f2 = newFlowEventEx({ |
| title: 'f2', |
| start: 20, |
| end: 30, |
| startSlice: m.s4, |
| endSlice: m.s2, |
| id: '0x100' |
| }); |
| |
| m.f3 = newFlowEventEx({ |
| title: 'f3', |
| start: 20, |
| end: 30, |
| startSlice: m.s2, |
| endSlice: m.s5, |
| id: '0x100' |
| }); |
| |
| m.f4 = newFlowEventEx({ |
| title: 'f4', |
| start: 20, |
| end: 30, |
| startSlice: m.s5, |
| endSlice: m.s1, |
| id: '0x100' |
| }); |
| |
| m.f5 = newFlowEventEx({ |
| title: 'f5', |
| cat: 'disabled-by-default-toplevel.flow', |
| start: 20, |
| end: 30, |
| startSlice: m.s7, |
| endSlice: m.s3, |
| id: '0xAAA' |
| }); |
| |
| m.flowEvents.push(m.f1); |
| m.flowEvents.push(m.f2); |
| m.flowEvents.push(m.f3); |
| m.flowEvents.push(m.f4); |
| m.flowEvents.push(m.f5); |
| |
| m.as0 = newAsyncSliceEx({ |
| title: 'test1', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x101', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| m.as1 = newAsyncSliceEx({ |
| title: 'test2', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| }); |
| |
| assert.isTrue(m.as0.associatedEvents.length === 0); |
| assert.isTrue(m.as1.associatedEvents.equals(new EventSet( |
| [m.f1, m.f2, m.f3, m.f4, m.f5, |
| m.s0, m.s1, m.s2, m.s3, m.s4, m.s5, m.s7]))); |
| assert.equal(m.as1.associatedEvents[0].id, '0x100'); |
| }); |
| |
| test('getAssociatedEventsExcludeOtherInputs', function() { |
| var m = newModel(function(m) { |
| |
| var pb = m.getOrCreateProcess(1); |
| var pr = m.getOrCreateProcess(2); |
| var mainBrowserThread = pb.getOrCreateThread(10); |
| var mainRendererThread = pr.getOrCreateThread(20); |
| var compositorThread = pr.getOrCreateThread(21); |
| |
| mainBrowserThread.name = 'CrBrowserMain'; |
| mainRendererThread.name = 'CrRendererMain'; |
| compositorThread.name = 'Compositor'; |
| |
| // Expectation: s3 should be included by getOtherCasuallyRelatedEvents, |
| // because there is a PostTask s7 -> s3. Even though there is also a |
| // PostTask from s9 to s6, s6 shouldn't be included because it's tracked |
| // by LatencyInfo of another input. |
| // CrBrowserMain: [s0] [ s1 ] [s8] |
| // | /|\ | |
| // | | | |
| // | [ s2 ]____ | \|/ |
| // CrRendererMain: | /|\ [s7] | | [s6] |
| // | | | | | /|\ |
| // | | | | | | |
| // \|/ | \|/ \|/ | | |
| // Compositor: [s4]__| [s3] [ s5 ]_| | |
| // [s9]_________| |
| |
| m.s0 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's0', start: 0.0, duration: 1.0 })); |
| m.s1 = mainBrowserThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's1', start: 6.0, duration: 1.0 })); |
| m.s2 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's2', start: 2.0, duration: 1.0 })); |
| m.s3 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's3', start: 4.0, duration: 1.0 })); |
| m.s4 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's4', start: 0.5, duration: 1.0 })); |
| m.s5 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's5', start: 5.5, duration: 1.0 })); |
| m.s6 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's6', start: 10.0, duration: 1.0 })); |
| m.s7 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's7', start: 2.5, duration: 0.2 })); |
| m.s8 = mainRendererThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 's8', start: 9.5, duration: 1.0 })); |
| m.s9 = compositorThread.sliceGroup.pushSlice(newSliceEx( |
| { title: 'Scheduler::ScheduleBeginImplFrameDeadline', |
| start: 5.7, duration: 0.2 })); |
| |
| mainBrowserThread.sliceGroup.createSubSlices(); |
| mainRendererThread.sliceGroup.createSubSlices(); |
| compositorThread.sliceGroup.createSubSlices(); |
| |
| m.f1 = newFlowEventEx({ |
| title: 'f1', |
| cat: 'input', |
| start: 0, |
| end: 10, |
| startSlice: m.s0, |
| endSlice: m.s4, |
| id: '0x100' |
| }); |
| |
| m.f2 = newFlowEventEx({ |
| title: 'f2', |
| cat: 'input', |
| start: 20, |
| end: 30, |
| startSlice: m.s4, |
| endSlice: m.s2, |
| id: '0x100' |
| }); |
| |
| m.f3 = newFlowEventEx({ |
| title: 'f3', |
| cat: 'input', |
| start: 20, |
| end: 30, |
| startSlice: m.s2, |
| endSlice: m.s5, |
| id: '0x100' |
| }); |
| |
| m.f4 = newFlowEventEx({ |
| title: 'f4', |
| cat: 'input', |
| start: 20, |
| end: 30, |
| startSlice: m.s5, |
| endSlice: m.s1, |
| id: '0x100' |
| }); |
| |
| m.f5 = newFlowEventEx({ |
| title: 'f5', |
| cat: 'disabled-by-default-toplevel.flow', |
| start: 20, |
| end: 30, |
| startSlice: m.s7, |
| endSlice: m.s3, |
| id: '0xAAA' |
| }); |
| |
| m.f6 = newFlowEventEx({ |
| title: 'f6', |
| cat: 'disabled-by-default-toplevel.flow', |
| start: 20, |
| end: 30, |
| startSlice: m.s9, |
| endSlice: m.s6, |
| id: '0xAAB' |
| }); |
| |
| m.f7 = newFlowEventEx({ |
| title: 'f7', |
| cat: 'input', |
| start: 20, |
| end: 30, |
| startSlice: m.s8, |
| endSlice: m.s6, |
| id: '0x102' |
| }); |
| |
| m.flowEvents.push(m.f1); |
| m.flowEvents.push(m.f2); |
| m.flowEvents.push(m.f3); |
| m.flowEvents.push(m.f4); |
| m.flowEvents.push(m.f5); |
| m.flowEvents.push(m.f6); |
| m.flowEvents.push(m.f7); |
| |
| m.as0 = newAsyncSliceEx({ |
| title: 'test1', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x101', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| m.as1 = newAsyncSliceEx({ |
| title: 'test2', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x100', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| m.as2 = newAsyncSliceEx({ |
| title: 'test2', |
| cat: 'benchmark,latencyInfo', |
| start: 2, |
| end: 10, |
| id: '0x102', |
| isTopLevel: true, |
| startThread: mainBrowserThread |
| }); |
| |
| }); |
| |
| assert.isTrue(m.as0.associatedEvents.length === 0); |
| assert.isTrue(m.as1.associatedEvents.equals(new EventSet( |
| [m.f1, m.f2, m.f3, m.f4, m.f5, |
| m.s0, m.s1, m.s2, m.s3, m.s4, m.s5, m.s7, m.s9]))); |
| assert.equal(m.as1.associatedEvents[0].id, '0x100'); |
| }); |
| |
| }); |
| </script> |