diff --git a/package.json b/package.json index 60c98f0..f84acfa 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "test-eventlistener": "node ./test/tests/eventlistener/index.js", "test-eventlistener-remove": "node ./test/tests/eventlistener/remove.js", "test-eventlistener-hammerjs": "node ./test/tests/eventlistener/hammerjs.js", + "test-eventlistener-hammerjs-destroy": "node ./test/tests/eventlistener/hammerjs-destroy.js", "build": "rollup --config ./rollup.config.js", "watch": "rollup --watch --config ./rollup.config.js", "3rdparty": "gulp", diff --git a/test/tests/eventlistener/hammerjs-destroy.html b/test/tests/eventlistener/hammerjs-destroy.html new file mode 100644 index 0000000..cc6e677 --- /dev/null +++ b/test/tests/eventlistener/hammerjs-destroy.html @@ -0,0 +1,99 @@ + + + + + + Test EventListener + + + + + + +
+
+

+ Memory Test EventListener with HammerJS and destroy +

+

Test EventListener in dynamic content!

+
+
+ +
+
+ +
+
+ + + + diff --git a/test/tests/eventlistener/hammerjs-destroy.js b/test/tests/eventlistener/hammerjs-destroy.js new file mode 100644 index 0000000..f297e4b --- /dev/null +++ b/test/tests/eventlistener/hammerjs-destroy.js @@ -0,0 +1,155 @@ +/* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */ + +const puppeteer = require('puppeteer') +const fse = require('fs-extra') +const _ = require('lodash') + +const CYCLES = 5000 +const TIMEOUT = 250 + +;(async () => { + const browser = await puppeteer.launch({ + headless: false, + args: ['--disable-web-security'], + defaultViewport: { + width: 1920, + height: 1280, + hasTouch: true + } + }) + const page = await browser.newPage() + await page.goto(`file://${__dirname}/hammerjs-destroy.html`) + + console.log('App loaded') + + const metrics = [] + + for (let i = 0; i < CYCLES; i++) { + console.log(`Cycle ${i + 1} of ${CYCLES}`) + + await sleep(TIMEOUT) + metrics.push(await page.metrics()) + + await page.tap('#add') // button 1 + await sleep(100) + for (let j = 0; j < 10; j++) { + await page.tap('#contentRandom') // button in card + } + await sleep(100) + await page.tap('#delete') // button 2 + } + + await writeMetrics(metrics) + + await page.setViewport({ + width: 1920, + height: 1280, + deviceScaleFactor: 1 + }) + + await page.goto(`file://${__dirname}/../../chart/index.html`) + + //await browser.close() +})() + +function sleep(milliseconds) { + return new Promise(resolve => setTimeout(resolve, milliseconds)) +} + +async function writeMetrics(metrics) { + const first = metrics[0].Timestamp + const timestamp = metrics.map(it => _.round(it.Timestamp - first, 1)) + const documents = metrics.map(it => it.Documents) + const frames = metrics.map(it => it.Frames) + const jsEventListeners = metrics.map(it => it.JSEventListeners) + const nodes = metrics.map(it => it.Nodes) + const layoutCount = metrics.map(it => it.LayoutCount) + const recalcStyleCount = metrics.map(it => it.RecalcStyleCount) + const layoutDuration = metrics.map(it => it.LayoutDuration) + const recalcStyleDuration = metrics.map(it => it.RecalcStyleDuration) + const scriptDuration = metrics.map(it => it.ScriptDuration) + const taskDuration = metrics.map(it => it.TaskDuration) + const jsHeapUsedSize = metrics.map(it => it.JSHeapUsedSize / 1024 / 1024) + const jsHeapTotalSize = metrics.map(it => it.JSHeapTotalSize / 1024 / 1024) + + const labels = `[${timestamp.join(', ')}]` + + await fse.outputFile( + `${__dirname}/../../chart/data.js`, + ` + var data = [{ + labels: ${labels}, + datasets: [{ + label: 'Documents', + backgroundColor: 'rgba(205, 37, 44, 0.2)', + borderColor: 'rgba(205, 37, 44, 1.00)', + data: [${documents.join(', ')}] + }, { + label: 'Frames', + backgroundColor: 'rgba(239, 116, 55, 0.2)', + borderColor: 'rgba(239, 116, 55, 1.00)', + data: [${frames.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSEventListeners', + backgroundColor: 'rgba(248, 189, 64, 0.2)', + borderColor: 'rgba(248, 189, 64, 1.00)', + data: [${jsEventListeners.join(', ')}] + }, { + label: 'Nodes', + backgroundColor: 'rgba(181, 202, 62, 0.2)', + borderColor: 'rgba(181, 202, 62, 1.00)', + data: [${nodes.join(', ')}] + }, { + label: 'LayoutCount', + backgroundColor: 'rgba(50, 184, 79, 0.2)', + borderColor: 'rgba(50, 184, 79, 1.00)', + data: [${layoutCount.join(', ')}] + }, { + label: 'RecalcStyleCount', + backgroundColor: 'rgba(37, 180, 171, 0.2)', + borderColor: 'rgba(37, 180, 171, 1.00)', + data: [${recalcStyleCount.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'LayoutDuration', + backgroundColor: 'rgba(45, 134, 203, 0.2)', + borderColor: 'rgba(45, 134, 203, 1.00)', + data: [${layoutDuration.join(', ')}] + }, { + label: 'RecalcStyleDuration', + backgroundColor: 'rgba(100, 58, 195, 0.2)', + borderColor: 'rgba(100, 58, 195, 1.00)', + data: [${recalcStyleDuration.join(', ')}] + }, { + label: 'ScriptDuration', + backgroundColor: 'rgba(161, 59, 195, 0.2)', + borderColor: 'rgba(161, 59, 195, 1.00)', + data: [${scriptDuration.join(', ')}] + }, { + label: 'TaksDuration', + backgroundColor: 'rgba(221, 65, 150, 0.2)', + borderColor: 'rgba(221, 65, 150, 1.00)', + data: [${taskDuration.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSHeapUsedSize', + backgroundColor: 'rgba(163, 104, 70, 0.2)', + borderColor: 'rgba(163, 104, 70, 1.00)', + data: [${jsHeapUsedSize.join(', ')}] + }, { + label: 'JSHeapTotalSize', + backgroundColor: 'rgba(118, 118, 118, 0.2)', + borderColor: 'rgba(118, 118, 118, 1.00)', + data: [${jsHeapTotalSize.join(', ')}] + }] + }] + ` + ) +}