// background.js - 백그라운드 서비스 워커 // 확장프로그램 설치 시 실행 chrome.runtime.onInstalled.addListener((details) => { console.log('Extension installed:', details); // 초기 데이터 설정 chrome.storage.sync.set({ extensionData: { installDate: new Date().toISOString(), version: chrome.runtime.getManifest().version } }); // 컨텍스트 메뉴 생성 (옵션) chrome.contextMenus.create({ id: 'myExtensionMenu', title: 'My Extension으로 처리', contexts: ['selection'] }); }); // 메시지 수신 리스너 chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { console.log('Background received message:', request); switch (request.action) { case 'processData': // 데이터 처리 로직 processData(request.data) .then(result => sendResponse({ success: true, result })) .catch(error => sendResponse({ success: false, error: error.message })); return true; // 비동기 응답을 위해 true 반환 case 'saveToStorage': chrome.storage.sync.set(request.data, () => { sendResponse({ success: true }); }); return true; case 'getFromStorage': chrome.storage.sync.get(request.keys, (result) => { sendResponse({ success: true, data: result }); }); return true; } }); // 탭 업데이트 이벤트 리스너 chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { if (changeInfo.status === 'complete' && tab.url) { console.log('Tab updated:', tab.url); // 특정 사이트에서만 동작하도록 제한 if (tab.url.includes('example.com')) { // Content script에 메시지 전송 chrome.tabs.sendMessage(tabId, { action: 'pageLoaded', url: tab.url }); } } }); // 컨텍스트 메뉴 클릭 이벤트 chrome.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === 'myExtensionMenu') { chrome.tabs.sendMessage(tab.id, { action: 'processSelection', selectionText: info.selectionText }); } }); // 알람 설정 (선택사항) chrome.alarms.create('dailyCheck', { delayInMinutes: 1, periodInMinutes: 1440 }); chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === 'dailyCheck') { console.log('Daily check alarm triggered'); // 일일 체크 로직 실행 } }); // 데이터 처리 함수 async function processData(data) { return new Promise((resolve, reject) => { try { // 실제 데이터 처리 로직 const processedData = data.map(item => ({ ...item, processed: true, timestamp: Date.now() })); setTimeout(() => resolve(processedData), 100); } catch (error) { reject(error); } }); }