The AdNull YouTube ad blocker has been completely refactored from a messy, single-file extension into a clean, modular architecture with proper organization, error handling, and modern UI.
- ❌ Single monolithic file - Everything in one content.js
- ❌ No error handling - Extension could crash easily
- ❌ Hardcoded values - No centralized configuration
- ❌ Poor logging - Inconsistent console messages
- ❌ Basic popup - Simple toggle with minimal styling
- ❌ Cluttered codebase - 30+ test files and scripts
- ❌ No separation of concerns - Mixed responsibilities
- ❌ Difficult to maintain - Changes required editing multiple places
- ✅ Modular architecture - 6 focused modules with single responsibilities
- ✅ Comprehensive error handling - Try-catch blocks and graceful fallbacks
- ✅ Centralized configuration - All settings and constants in config.js
- ✅ Professional logging - 4-level logging system (ERROR, WARN, INFO, DEBUG)
- ✅ Modern popup UI - Gradient design, animations, better UX
- ✅ Clean codebase - Only essential files, organized structure
- ✅ Clear separation - Each module handles one specific area
- ✅ Easy to maintain - Modular changes, clear dependencies
src/
├── manifest.json # Extension configuration
├── content.js # Main orchestrator (120 lines)
├── modules/ # Core functionality
│ ├── config.js # Configuration & constants (35 lines)
│ ├── logger.js # Logging system (45 lines)
│ ├── storage.js # Chrome storage wrapper (70 lines)
│ └── adSkipper.js # Ad detection & skipping (130 lines)
├── popup/ # User interface
│ ├── popup.html # Modern UI layout (85 lines)
│ ├── popup.css # Clean styling (200 lines)
│ └── popup.js # Popup logic (250 lines)
└── icons/ # Extension icons
| Module | Lines | Purpose |
|---|---|---|
| config.js | 35 | Centralized settings, constants, selectors |
| logger.js | 45 | Configurable logging with 4 levels |
| storage.js | 70 | Chrome storage operations with error handling |
| adSkipper.js | 130 | Ad detection, validation, and skipping logic |
| content.js | 120 | Main controller that orchestrates modules |
| popup/ | 535 | Modern UI with settings and controls |
Total: ~935 lines of clean, organized, documented code
- Single responsibility principle - Each module has one clear purpose
- Dependency injection - Modules communicate through well-defined interfaces
- Consistent naming - Clear, descriptive function and variable names
- Proper documentation - JSDoc comments for all public functions
// Before: No error handling
button.click();
// After: Comprehensive error handling
try {
button.click();
window.AdNullLogger.info('Ad skipped successfully');
} catch (error) {
window.AdNullLogger.error('Failed to skip ad', error);
}// Before: Hardcoded values scattered throughout
setInterval(checkAds, 1000);
const selectors = ['.ytp-ad-skip-button'];
// After: Centralized configuration
setInterval(checkAds, window.AdNullConfig.TIMING.CHECK_INTERVAL);
const selectors = window.AdNullConfig.SKIP_SELECTORS;// Before: Inconsistent logging
console.log('[AdNull Simple] Starting...');
// After: Professional logging with levels
window.AdNullLogger.info('Extension initialized successfully');
window.AdNullLogger.debug('Loaded settings', settings);
window.AdNullLogger.error('Failed to skip ad', error);- Gradient header with logo and version
- Toggle switches with smooth animations
- Real-time status updates
- Disabled states for dependent controls
- Test functionality built into popup
- Responsive design that works on all screen sizes
// Test individual functions
window.adnullSkipAds() // Test skip function
window.adnullStatus() // Check status
window.adnullSettings() // View settings
window.adnullToggle() // Toggle on/off
// Access modules for debugging
window.AdNull.Config // Configuration
window.AdNull.Logger // Logging system
window.AdNull.Storage // Storage operations
window.AdNull.Skipper // Ad skipperChange CURRENT_LOG_LEVEL in config.js:
0- ERROR only (production)1- ERROR + WARN2- ERROR + WARN + INFO (default)3- ERROR + WARN + INFO + DEBUG (development)
# Launch the modular extension
powershell -ExecutionPolicy Bypass -File "launch-modular.ps1"
# Clean up old files (optional)
powershell -ExecutionPolicy Bypass -File "cleanup-old-files.ps1"- ✅ Chrome opens with extension loaded
- ✅ Extension icon appears in toolbar
- ✅ Console shows:
[AdNull] Initializing extension - ✅ YouTube videos play normally
- ✅ Modern popup opens with gradient design
- ✅ Settings toggles work with real-time feedback
- ✅ Test button triggers skip function
- ✅ No errors in console
- ✅ Better reliability - Proper error handling prevents crashes
- ✅ Modern interface - Clean, intuitive popup design
- ✅ More control - Configurable skip delay and settings
- ✅ Real-time feedback - Status updates and visual indicators
- ✅ Easy maintenance - Modular structure makes changes simple
- ✅ Better debugging - Comprehensive logging and test functions
- ✅ Extensible design - Easy to add new features
- ✅ Clean codebase - No unused files, organized structure
- ✅ Efficient loading - Modules load only when needed
- ✅ Memory management - Proper cleanup and disposal
- ✅ Fast initialization - Optimized startup sequence
- ✅ Resource efficiency - Minimal permissions and background usage
The AdNull extension has been transformed from a basic, single-file script into a professional, modular Chrome extension with:
- 🏗️ Clean architecture with 6 focused modules
- 🎨 Modern UI with gradient design and animations
- 🛡️ Robust error handling throughout all components
- 📊 Professional logging with configurable levels
- ⚙️ Centralized configuration for easy maintenance
- 🧪 Built-in testing and debugging capabilities
- 📁 Organized codebase with no unused files
The extension is now production-ready, maintainable, and extensible! 🚀
Use launch-modular.ps1 to test the new modular extension.