Created
November 17, 2024 12:26
-
-
Save lunamoth/153a9726b1abafca7424cacfba0c981c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// background.js | |
// 마우스 이벤트를 모니터링하기 위한 content script 주입 | |
chrome.runtime.onInstalled.addListener(() => { | |
chrome.tabs.query({}, (tabs) => { | |
tabs.forEach((tab) => { | |
if (tab.url.startsWith('http')) { | |
chrome.scripting.executeScript({ | |
target: { tabId: tab.id }, | |
function: injectMouseTracking, | |
}); | |
} | |
}); | |
}); | |
}); | |
// 새로운 탭이 로드될 때마다 content script 주입 | |
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { | |
if (changeInfo.status === 'complete' && tab.url.startsWith('http')) { | |
chrome.scripting.executeScript({ | |
target: { tabId }, | |
function: injectMouseTracking, | |
}); | |
} | |
}); | |
// Content script에서 실행될 함수 | |
function injectMouseTracking() { | |
let isMouseDown = false; | |
let startX = 0; | |
let startY = 0; | |
let hasGestured = false; | |
let lastGestureTime = 0; | |
let hasMoved = false; // 마우스가 움직였는지 추적하는 새로운 플래그 | |
document.addEventListener('mousedown', (e) => { | |
if (e.button === 2) { // 오른쪽 마우스 버튼 | |
isMouseDown = true; | |
hasGestured = false; | |
hasMoved = false; // 마우스 다운시 초기화 | |
startX = e.clientX; | |
startY = e.clientY; | |
} | |
}); | |
document.addEventListener('mousemove', (e) => { | |
if (isMouseDown) { | |
const currentX = e.clientX; | |
const currentY = e.clientY; | |
const deltaX = currentX - startX; | |
const deltaY = currentY - startY; | |
// 작은 움직임도 감지 | |
if (Math.abs(deltaX) > 5 || Math.abs(deltaY) > 5) { | |
hasMoved = true; | |
} | |
const currentTime = Date.now(); | |
if (!hasGestured && currentTime - lastGestureTime > 500) { | |
// 수평 이동이 수직 이동보다 크고, 일정 거리 이상 이동했을 때 | |
if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 100) { | |
const gesture = deltaX < 0 ? 'left' : 'right'; | |
chrome.runtime.sendMessage({ type: 'GESTURE', gesture }); | |
hasGestured = true; | |
lastGestureTime = currentTime; | |
} | |
} | |
} | |
}); | |
document.addEventListener('mouseup', (e) => { | |
if (e.button === 2) { | |
isMouseDown = false; | |
} | |
}); | |
// 컨텍스트 메뉴 방지 로직 개선 | |
document.addEventListener('contextmenu', (e) => { | |
// 마우스가 조금이라도 움직였거나 제스처가 감지된 경우 컨텍스트 메뉴 방지 | |
if (hasMoved || hasGestured) { | |
e.preventDefault(); | |
return false; | |
} | |
}); | |
// 페이지를 벗어날 때도 이벤트 처리 | |
document.addEventListener('mouseleave', () => { | |
isMouseDown = false; | |
hasGestured = false; | |
hasMoved = false; | |
}); | |
} | |
// 제스처 메시지 수신 및 처리 | |
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { | |
if (message.type === 'GESTURE') { | |
const tabId = sender.tab.id; | |
if (message.gesture === 'left') { | |
chrome.tabs.goBack(tabId); | |
} else if (message.gesture === 'right') { | |
chrome.tabs.goForward(tabId); | |
} | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment