UNPKG

@casoon/auditmysite

Version:

A comprehensive command-line tool for automated accessibility, security, performance, and SEO testing using Playwright and pa11y, based on sitemap URLs

111 lines 5.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PerformanceMemoryTest = void 0; const base_test_1 = require("../base-test"); class PerformanceMemoryTest extends base_test_1.BaseAccessibilityTest { constructor() { super(...arguments); this.name = 'Performance Memory Test'; this.description = 'Checks memory usage and potential memory leaks'; this.category = 'performance'; this.priority = 'medium'; this.standards = ['WCAG 2.1 AA', 'WCAG 2.2 AA']; } async run(context) { const { page } = context; try { const result = await this.evaluateOnPage(page, () => { const issues = []; const warnings = []; // Check if memory API is available (Chrome-specific) const memory = performance.memory; if (!memory) { warnings.push('Memory API not available (Chrome-specific feature)'); return { issues, warnings }; } // Check memory usage const usedMemoryMB = memory.usedJSHeapSize / (1024 * 1024); const totalMemoryMB = memory.totalJSHeapSize / (1024 * 1024); const memoryLimitMB = memory.jsHeapSizeLimit / (1024 * 1024); // Check if memory usage is high (>80% of limit) const memoryUsagePercent = (usedMemoryMB / memoryLimitMB) * 100; if (memoryUsagePercent > 80) { issues.push(`High memory usage: ${usedMemoryMB.toFixed(2)}MB (${memoryUsagePercent.toFixed(1)}% of limit)`); } else if (memoryUsagePercent > 60) { warnings.push(`Moderate memory usage: ${usedMemoryMB.toFixed(2)}MB (${memoryUsagePercent.toFixed(1)}% of limit)`); } // Check for potential memory leaks by counting DOM nodes const totalNodes = document.querySelectorAll('*').length; if (totalNodes > 1000) { warnings.push(`Large DOM tree: ${totalNodes} nodes (consider optimizing)`); } // Check for event listeners (approximation) const elementsWithEvents = document.querySelectorAll('[onclick], [onmouseover], [onmouseout], [onfocus], [onblur]'); if (elementsWithEvents.length > 50) { warnings.push(`Many inline event handlers: ${elementsWithEvents.length} (consider using event delegation)`); } // Check for iframes (potential memory consumers) const iframes = document.querySelectorAll('iframe'); if (iframes.length > 3) { warnings.push(`Multiple iframes detected: ${iframes.length} (each iframe consumes additional memory)`); } // Check for large images that might consume memory const images = document.querySelectorAll('img'); let largeImages = 0; images.forEach(img => { const width = img.naturalWidth || img.width; const height = img.naturalHeight || img.height; if (width > 1920 || height > 1080) { largeImages++; } }); if (largeImages > 3) { warnings.push(`Found ${largeImages} large images (consider resizing for better memory usage)`); } // Check for canvas elements (potential memory consumers) const canvases = document.querySelectorAll('canvas'); if (canvases.length > 2) { warnings.push(`Multiple canvas elements: ${canvases.length} (monitor for memory leaks)`); } // Check for video elements (high memory usage) const videos = document.querySelectorAll('video'); if (videos.length > 1) { warnings.push(`Multiple video elements: ${videos.length} (videos consume significant memory)`); } // Check for WebGL contexts (high memory usage) const webglCanvases = document.querySelectorAll('canvas'); let webglContexts = 0; webglCanvases.forEach(canvas => { try { const gl = canvas.getContext('webgl') || canvas.getContext('webgl2'); if (gl) webglContexts++; } catch (e) { // Ignore errors } }); if (webglContexts > 0) { warnings.push(`WebGL contexts detected: ${webglContexts} (monitor memory usage carefully)`); } // Check for localStorage/sessionStorage usage const localStorageKeys = Object.keys(localStorage).length; const sessionStorageKeys = Object.keys(sessionStorage).length; if (localStorageKeys > 20) { warnings.push(`Large localStorage usage: ${localStorageKeys} keys (consider cleanup)`); } if (sessionStorageKeys > 10) { warnings.push(`Large sessionStorage usage: ${sessionStorageKeys} keys (consider cleanup)`); } return { issues, warnings }; }); return this.createResult(result.issues.length === 0, result.issues.length + result.warnings.length, result.issues, result.warnings); } catch (error) { return this.createErrorResult(`Performance memory test failed: ${error}`); } } } exports.PerformanceMemoryTest = PerformanceMemoryTest; //# sourceMappingURL=performance-memory-test.js.map