// Background service worker for Chrome extension console.log('Quality Recticel Print Helper - Background script loaded'); // Listen for messages from content script chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { console.log('Background received message:', request); if (request.action === 'print_label') { handlePrintLabel(request.data, sendResponse); return true; // Keep message channel open for async response } if (request.action === 'fallback_print') { handleFallbackPrint(request.data, sendResponse); return true; } if (request.action === 'get_printers') { getPrinters(sendResponse); return true; } if (request.action === 'check_extension') { sendResponse({status: 'installed', version: chrome.runtime.getManifest().version}); return true; } }); // Function to handle label printing async function handlePrintLabel(printData, sendResponse) { try { console.log('Attempting to print label with data:', printData); // Check if printing API is available if (!chrome.printing || !chrome.printing.getPrinters) { console.error('Chrome printing API not available - browser may be Brave, Edge, or older Chrome'); sendResponse({ success: false, error: 'Direct printing API not available in this browser. The extension works best in Google Chrome 85+. Using fallback method instead.' }); return; } // Get available printers const printers = await chrome.printing.getPrinters(); console.log('Available printers:', printers); if (printers.length === 0) { sendResponse({success: false, error: 'No printers found. Please ensure a printer is installed and set as default.'}); return; } // Find selected printer or use default/first available let selectedPrinter; if (printData.printerId && printData.printerId !== 'default') { selectedPrinter = printers.find(p => p.id === printData.printerId); } if (!selectedPrinter) { selectedPrinter = printers.find(p => p.isDefault) || printers[0]; } console.log('Using printer:', selectedPrinter); // Create print job const printJob = { printerId: selectedPrinter.id, ticket: { version: '1.0', print: { color: { type: 'STANDARD_MONOCHROME' }, duplex: { type: 'NO_DUPLEX' }, page_orientation: { type: 'PORTRAIT' }, copies: { copies: 1 }, dpi: { horizontal_dpi: 300, vertical_dpi: 300 }, media_size: { width_microns: 210000, // A4 width height_microns: 297000 // A4 height }, collate: { collate: false } } }, documentBlob: new Blob([printData.html], {type: 'text/html'}) }; // Submit print job const result = await chrome.printing.submitJob(printJob); console.log('Print job result:', result); if (result.status === 'OK') { sendResponse({success: true, jobId: result.jobId}); // Store successful print in extension storage chrome.storage.local.set({ lastPrint: { timestamp: Date.now(), jobId: result.jobId, printer: selectedPrinter.displayName } }); } else { sendResponse({success: false, error: result.status}); } } catch (error) { console.error('Print error:', error); sendResponse({success: false, error: error.message}); } } // Function to get available printers async function getPrinters(sendResponse) { try { // Check if printing API is available if (!chrome.printing || !chrome.printing.getPrinters) { sendResponse({ success: false, error: 'Direct printing API not available in this browser (works in Chrome only)' }); return; } const printers = await chrome.printing.getPrinters(); sendResponse({success: true, printers: printers}); } catch (error) { console.error('Error getting printers:', error); sendResponse({success: false, error: error.message}); } } // Extension installation/startup chrome.runtime.onInstalled.addListener((details) => { console.log('Quality Recticel Print Helper installed:', details); // Set initial storage values chrome.storage.local.set({ extensionVersion: chrome.runtime.getManifest().version, installDate: Date.now() }); }); // Fallback print method using tabs API (works in Brave, Edge, Chrome) async function handleFallbackPrint(printData, sendResponse) { try { console.log('Using fallback print method for Brave/Edge/Chrome'); // Create enhanced HTML with better print styles const enhancedHTML = `