Проблема:
Расширению Chrome, над которым я работаю, нужен спуфер местоположения. Это работает, однако я не могу «сбросить» его.
Что у меня так далеко:
Давайте рассмотрим соответствующий код. Это часть скрипта контента.
let cachedGeoLocFunc = navigator.geolocation.getCurrentPosition
let geoSpoofCode = conf => `
(function() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition = function(success) { return success(${conf}); }
} else {
console.error('Geolocation is not supported in this browser');
}
})()
`
browser.runtime
.sendMessage({ type: 'request-spoofed-coords' })
.then(curCoords => {
//json from state, contains current spoofed locale
if (curCoords) {
let script = document.createElement('script')
script.textContent = geoSpoofCode(curCoords)
document.documentElement.appendChild(script)
script.remove()
} else {
//revert to default behavior
let unSetScript = document.createElement('script')
unSetScript.textContent = `
(function() {
navigator.geolocation.getCurrentPosition = ${cachedGeoLocFunc};
})()`
document.documentElement.appendChild(unSetScript)
unSetScript.remove()
}
})
Как видите, я переопределяю встроенную функцию Chrome и предоставляю свою собственную ценность. Это прекрасно работает для подмены местоположения.
Неожиданное поведение:
Концептуально я предполагал, что это сработает. Я кеширую встроенную функцию Chrome, чтобы позже я мог ее сбросить (см. Остальное). На практике я получаю эту ошибку, когда этот скрипт контента внедряется в страницу.
Uncaught SyntaxError: Unexpected identifier
И он ломается здесь (согласно инспектору хрома)
Снимок экрана с ошибкой
Мои вопросы!
Итак, он просто вставляет [собственный код] вместо реальной функции (по крайней мере, так это выглядит).
Кто-нибудь знает, как я могу отменить эту функцию. Есть ли элегантный способ сделать это?
Как работает кэширование в Chrome, есть ли способ просмотреть этот собственный код
В любом случае, помощь будет принята с благодарностью. Надеюсь, у всех вас есть отличный день!