// background.js (Service Worker) // 1) 확장 프로그램 설치/업데이트 시 컨텍스트 메뉴 생성 chrome.runtime.onInstalled.addListener(() => { chrome.contextMenus.create({ id: "searchTrademark", title: "지재권 검색", contexts: ["selection"] // 텍스트를 드래그 선택한 상태에서만 메뉴 표시 }); // (선택) 서비스 워커 keep-alive chrome.alarms.create("keepAlive", { periodInMinutes: 4 }); }); chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === "keepAlive") { console.log("[background.js] 서비스 워커 유지 알람 실행됨"); } }); // 2) 컨텍스트 메뉴 클릭 시 처리 chrome.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === "searchTrademark") { // 선택된 텍스트(드래그된 내용) const keyword = info.selectionText.trim(); if (!keyword) return; console.log("[background.js] 컨텍스트 메뉴 검색 키워드:", keyword); // MarkInfo 검색 URL (키워드 검색 예시) const url = buildMarkInfoUrl(keyword); // fetch로 마크인포 요청 fetch(url) .then((resp) => { if (!resp.ok) { throw new Error(`네트워크 오류: ${resp.status}`); } return resp.text(); }) .then((html) => { // __NUXT_DATA__ 추출 (정규표현식 예시) const match = /]*id="__NUXT_DATA__"[^>]*>([\s\S]*?)<\/script>/i.exec(html); if (!match) { throw new Error("__NUXT_DATA__ 태그를 찾을 수 없습니다."); } const jsonString = match[1]; const globalData = JSON.parse(jsonString); // 예: globalData 배열 중 첫 번째 아이템이 주요 정보라고 가정 let firstItem = null; if (Array.isArray(globalData) && globalData.length > 0) { firstItem = globalData[0]; } // 노티피케이션에 표시할 문자열 생성 let msg = ""; if (firstItem && typeof firstItem === "object") { // 예: applicationNum, trademarkName 등 필요한 필드만 추출 const applicationNum = firstItem.applicationNum || "(출원번호 없음)"; const trademarkName = firstItem.trademarkName || "(상표명 없음)"; msg = `출원번호: ${applicationNum}\n상표명: ${trademarkName}`; } else { // globalData 전체 중 일부만 표시 msg = JSON.stringify(globalData).slice(0, 80) + "..."; } // 알림 표시 chrome.notifications.create({ type: "basic", iconUrl: "icon.png", title: "지재권 검색 결과", message: `검색 키워드: ${keyword}\n결과: ${msg}` }); }); } }); // 3) URL 생성 함수 function buildMarkInfoUrl(keyword) { const encoded = encodeURIComponent(keyword); return `https://markinfo.kr/search?page=1&size=20&sort=_score,desc&sort=applicationDate,desc&searchType=ST01&searchKeyword=${encoded}&statuses=APPLICATION&statuses=PUBLICATION&statuses=REGISTRATION`; }