// Content script for DocuElevate browser extension // This script runs on all web pages to enable communication // between page content and the extension /** * Capture the full page HTML with inline styles */ function captureFullPage() { // Get all stylesheets and inline them const styles = Array.from(document.styleSheets) .map(sheet => { try { return Array.from(sheet.cssRules) .map(rule => rule.cssText) .join('\n'); } catch (e) { // Handle CORS issues with external stylesheets console.warn('Could not access stylesheet:', sheet.href, e); return ''; } }) .join('\n'); // Create a complete HTML document with inlined styles const styledHtml = ` ${document.title} ${document.body.innerHTML} `; return { html: styledHtml, title: document.title, url: window.location.href, timestamp: new Date().toISOString() }; } /** * Capture selected content from the page */ function captureSelection() { const selection = window.getSelection(); if (!selection || selection.rangeCount === 0) { throw new Error('No content selected'); } const range = selection.getRangeAt(0); const container = document.createElement('div'); container.appendChild(range.cloneContents()); // Get computed styles for the selection const elements = container.querySelectorAll('*'); elements.forEach(el => { const computed = window.getComputedStyle(el); // Only preserve essential styles const essentialStyles = [ 'font-family', 'font-size', 'font-weight', 'color', 'background-color', 'text-align', 'margin', 'padding' ]; let styleStr = ''; essentialStyles.forEach(prop => { const value = computed.getPropertyValue(prop); if (value) { styleStr += `${prop}: ${value}; `; } }); if (styleStr) { el.setAttribute('style', styleStr); } }); const html = ` ${document.title} - Selection

${document.title}

Source: ${window.location.href}


${container.innerHTML} `; return { html: html, text: selection.toString(), title: document.title + ' - Selection', url: window.location.href, timestamp: new Date().toISOString() }; } // Message handler chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.type === 'GET_PAGE_INFO') { // Return information about the current page (synchronous) const pageInfo = { url: window.location.href, title: document.title }; sendResponse(pageInfo); return false; // Synchronous response, no need to keep channel open } if (message.type === 'CAPTURE_FULL_PAGE') { try { const pageData = captureFullPage(); sendResponse({ success: true, data: pageData }); } catch (error) { sendResponse({ success: false, error: error.message }); } return true; // Keep channel open for async response } if (message.type === 'CAPTURE_SELECTION') { try { const selectionData = captureSelection(); sendResponse({ success: true, data: selectionData }); } catch (error) { sendResponse({ success: false, error: error.message }); } return true; // Keep channel open for async response } }); // Detect if current page is a direct file link function isDirectFileUrl(url) { const fileExtensions = [ '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt', '.csv', '.rtf', '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp', '.svg' ]; const urlLower = url.toLowerCase(); return fileExtensions.some(ext => urlLower.endsWith(ext)); } // Add visual indicator for file pages (optional enhancement) if (isDirectFileUrl(window.location.href)) { console.log('DocuElevate: Direct file URL detected'); }