Remove unused v3 scripts
This commit is contained in:
parent
49cc586850
commit
7a2bfcb0a9
11 changed files with 0 additions and 812 deletions
|
@ -1,211 +0,0 @@
|
||||||
{
|
|
||||||
"extensionName": {
|
|
||||||
"message": "User-Agent Switcher and Manager",
|
|
||||||
"description": "Name of the extension."
|
|
||||||
},
|
|
||||||
"extensionDescription": {
|
|
||||||
"message": "Spoof websites trying to gather information about your web navigation to deliver distinct content you may not want",
|
|
||||||
"description": "Description of the extension."
|
|
||||||
},
|
|
||||||
"userAgentSwitcherandManagerOptions": {
|
|
||||||
"message": "User-Agent Switcher and Manager :: Options"
|
|
||||||
},
|
|
||||||
"blackListMode": {
|
|
||||||
"message": "Black-List Mode"
|
|
||||||
},
|
|
||||||
"description": {
|
|
||||||
"message": "Description"
|
|
||||||
},
|
|
||||||
"blackListModeDescription": {
|
|
||||||
"message": "Apply the custom user-agent string to all tabs except the tabs with the following top-level hostnames (comma-separated list of hostnames). Note that even if a window-based user-agent string is set from the toolbar popup, your browser's default user-agent string is used."
|
|
||||||
},
|
|
||||||
"whiteListMode": {
|
|
||||||
"message": "White-List Mode"
|
|
||||||
},
|
|
||||||
"whiteListModeDescription": {
|
|
||||||
"message": "Only apply the custom user-agent string to the tabs with following top-level hostnames. Note that if a window-based user-agent string is set from the toolbar popup, this user-agent will overwrite the global one."
|
|
||||||
},
|
|
||||||
"customMode": {
|
|
||||||
"message": "Custom Mode"
|
|
||||||
},
|
|
||||||
"customModeDescription": {
|
|
||||||
"message": "Try to resolve the user-agent string from a JSON object; otherwise either use the default user-agent string or use the one that the user is set from the popup interface. Use \"*\" as the hostname to match all domains. You can randomly select from multiple user-agent strings by providing an array instead of a fixed string. If there is a \"_\" key in your JSON object which refers to an array of hostnames, then the extension only randomly selects the user-agent string once for each hostname inside this list. This is useful if you don't want the random user-agent to change until this browser session is over."
|
|
||||||
},
|
|
||||||
"insertSample": {
|
|
||||||
"message": "Insert a sample"
|
|
||||||
},
|
|
||||||
"cache": {
|
|
||||||
"message": "Use caching to improve performance (recommended value is true). Uncheck this option only if you are using the custom mode and also you need the user-agent string to be altered from the provided list on every single request."
|
|
||||||
},
|
|
||||||
"exactMatch": {
|
|
||||||
"message": "Use exact matching (if checked, you will need to insert all sub-domains in the white-list and black-list modes to be considered. If unchecked, all the sub-domains are passing the matching condition (e.g: www.google.com passes the matching if google.com is in the list))"
|
|
||||||
},
|
|
||||||
"faqs": {
|
|
||||||
"message": "Open FAQs page on updates"
|
|
||||||
},
|
|
||||||
"userAgentData": {
|
|
||||||
"message": "Expose \"navigator.userAgentData\" object on Chromium browsers"
|
|
||||||
},
|
|
||||||
"log": {
|
|
||||||
"message": "Display debugging info in the browser console"
|
|
||||||
},
|
|
||||||
"disableSpoofing": {
|
|
||||||
"message": "Disable Spoofing"
|
|
||||||
},
|
|
||||||
"disableSpoofingDescription": {
|
|
||||||
"message": "A comma-separated list of keywords that the extension should not spoof the user-agent header. Use this list to protect URLs that contain these protected keywords. Each keyword need to be at least 5 char long."
|
|
||||||
},
|
|
||||||
"customUserAgentParsing": {
|
|
||||||
"message": "Custom User-Agent Parsing"
|
|
||||||
},
|
|
||||||
"customUserAgentParsingDescription": {
|
|
||||||
"message": "A JSON object to bypass the internal user-agent string parsing method. The keys are the actual user-agent strings and the value of each key is an object of the keys that need to be set for the \"navigator\" object. You can use the \"[delete]\" keyword if you want a key in the \"navigator\" object to get deleted."
|
|
||||||
},
|
|
||||||
"siblingHostnames": {
|
|
||||||
"message": "Sibling Hostnames"
|
|
||||||
},
|
|
||||||
"siblingHostnamesDescription": {
|
|
||||||
"message": "A JSON array that contains one or more groups of hostnames to have a single user-agent string per group. For all hostnames in one group, the user-agent string calculation only occurs once, and all the other members use the same calculated string. This is useful to make sure a group of connected websites only access to the same user-agent string."
|
|
||||||
},
|
|
||||||
"importSettings": {
|
|
||||||
"message": "Import Settings"
|
|
||||||
},
|
|
||||||
"exportSettings": {
|
|
||||||
"message": "Export Settings"
|
|
||||||
},
|
|
||||||
"exportSettingsTitle": {
|
|
||||||
"message": "To generate minified version, press Shift key while pressing this button"
|
|
||||||
},
|
|
||||||
"help": {
|
|
||||||
"message": "FAQs Page (Help)"
|
|
||||||
},
|
|
||||||
"donate": {
|
|
||||||
"message": "Support Development"
|
|
||||||
},
|
|
||||||
"save": {
|
|
||||||
"message": "Save"
|
|
||||||
},
|
|
||||||
"managedStorage": {
|
|
||||||
"message": "This extension supports managed storage so that preferences can be altered automatically or can be pre-configured by a domain administrator. Read the FAQs page for more info."
|
|
||||||
},
|
|
||||||
"options": {
|
|
||||||
"message": "Options"
|
|
||||||
},
|
|
||||||
"optionsTitle": {
|
|
||||||
"message": "Open options page"
|
|
||||||
},
|
|
||||||
"restart": {
|
|
||||||
"message": "Restart"
|
|
||||||
},
|
|
||||||
"restartTitle": {
|
|
||||||
"message": "Click to reload the extension. This will cause all the window-based user-agent strings to be cleared."
|
|
||||||
},
|
|
||||||
"refreshTab": {
|
|
||||||
"message": "Refresh Tab"
|
|
||||||
},
|
|
||||||
"refreshTabTitle": {
|
|
||||||
"message": "Refresh the current page"
|
|
||||||
},
|
|
||||||
"reset": {
|
|
||||||
"message": "Reset"
|
|
||||||
},
|
|
||||||
"resetTitle": {
|
|
||||||
"message": "Reset browser's user-agent string to the default one. This will not reset window-based UA strings. To reset them, use the 'Restart' button."
|
|
||||||
},
|
|
||||||
"testUA": {
|
|
||||||
"message": "Test UA"
|
|
||||||
},
|
|
||||||
"testUATitle": {
|
|
||||||
"message": "Test your user-agent string"
|
|
||||||
},
|
|
||||||
"considerContainers": {
|
|
||||||
"message": "Consider Containers"
|
|
||||||
},
|
|
||||||
"considerContainersTitle": {
|
|
||||||
"message": "Allow the extension to access your browser's containers. If this permission is granted, tabs inside isolated containers do not follow the default container's user-agent string. You need to set this string for each new container."
|
|
||||||
},
|
|
||||||
"applyActiveWindow": {
|
|
||||||
"message": "Apply (active window)"
|
|
||||||
},
|
|
||||||
"applyActiveWindowTitle": {
|
|
||||||
"message": "Set this user-agent string for all tabs inside the current window"
|
|
||||||
},
|
|
||||||
"applyAllWindows": {
|
|
||||||
"message": "Apply (all windows)"
|
|
||||||
},
|
|
||||||
"applyAllWindowsTitle": {
|
|
||||||
"message": "Set this user-agent string as the browser's User-Agent string"
|
|
||||||
},
|
|
||||||
"applyContainer": {
|
|
||||||
"message": "Apply (container)"
|
|
||||||
},
|
|
||||||
"applyContainerTitle": {
|
|
||||||
"message": "Set this user-agent string as the current container's User-Agent string"
|
|
||||||
},
|
|
||||||
"applyContainerWindow": {
|
|
||||||
"message": "Apply (container on window)"
|
|
||||||
},
|
|
||||||
"applyContainerWindowTitle": {
|
|
||||||
"message": "Set this user-agent string for all tabs inside the current window's container"
|
|
||||||
},
|
|
||||||
"resetContainer": {
|
|
||||||
"message": "Reset (container)"
|
|
||||||
},
|
|
||||||
"resetContainerTitle": {
|
|
||||||
"message": "Reset the container's user-agent string to the default one. This will not reset window-based UA strings. To reset them, use the 'Restart' button."
|
|
||||||
},
|
|
||||||
"oscpuTitle": {
|
|
||||||
"message": "This is a readonly field. Use options page for custom parsing."
|
|
||||||
},
|
|
||||||
"appVersionTitle": {
|
|
||||||
"message": "This is a readonly field. Use options page for custom parsing."
|
|
||||||
},
|
|
||||||
"platformTitle": {
|
|
||||||
"message": "This is a readonly field. Use options page for custom parsing."
|
|
||||||
},
|
|
||||||
"vendorTitle": {
|
|
||||||
"message": "This is a readonly field. Use options page for custom parsing."
|
|
||||||
},
|
|
||||||
"productTitle": {
|
|
||||||
"message": "This is a readonly field. Use options page for custom parsing."
|
|
||||||
},
|
|
||||||
"uaTitle": {
|
|
||||||
"message": "To set a blank user-agent string, use the 'empty' keyword. To construct a custom user-agent string based on the current browser's navigator object, use ${} notation. Whatever is inside this notation is read from the 'navigator' object. For instance, to append a string to the default user-agent, use '${userAgent} THIS IS THE APPENDED STRING'"
|
|
||||||
},
|
|
||||||
"uaPlaceholder": {
|
|
||||||
"message": "Your preferred user-agent string"
|
|
||||||
},
|
|
||||||
"noMatch": {
|
|
||||||
"message": "No matching user-agent string for this query"
|
|
||||||
},
|
|
||||||
"ztoa": {
|
|
||||||
"message": "Z to A"
|
|
||||||
},
|
|
||||||
"atoz": {
|
|
||||||
"message": "A to Z"
|
|
||||||
},
|
|
||||||
"filterAmong": {
|
|
||||||
"message": "Filter among $1"
|
|
||||||
},
|
|
||||||
"filterAgents": {
|
|
||||||
"message": "Filter Agents"
|
|
||||||
},
|
|
||||||
"msgDefaultUA": {
|
|
||||||
"message": "Default UA, press the reset button instead"
|
|
||||||
},
|
|
||||||
"msgUASet": {
|
|
||||||
"message": "User-Agent is Set"
|
|
||||||
},
|
|
||||||
"msgDisabledOnContainer": {
|
|
||||||
"message": "Disabled on this container. Uses the default user-agent string."
|
|
||||||
},
|
|
||||||
"msgDisabled": {
|
|
||||||
"message": "Disabled. Uses the default user-agent string."
|
|
||||||
},
|
|
||||||
"optionsSaved": {
|
|
||||||
"message": "Options saved."
|
|
||||||
},
|
|
||||||
"dbReset": {
|
|
||||||
"message": "Double-click to reset!"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,208 +0,0 @@
|
||||||
{
|
|
||||||
"extensionName": {
|
|
||||||
"message": "User-Agent Switcher and Manager",
|
|
||||||
"description": "Name of the extension."
|
|
||||||
},
|
|
||||||
"extensionDescription": {
|
|
||||||
"message": "Подменяет User-Agent на веб-сайтах, пытающихся собрать информацию о ваших путешествиях по сети и выдать не нужное вам содержимое",
|
|
||||||
"description": "Description of the extension."
|
|
||||||
},
|
|
||||||
"userAgentSwitcherandManagerOptions": {
|
|
||||||
"message": "User-Agent Switcher and Manager :: Настройки"
|
|
||||||
},
|
|
||||||
"blackListMode": {
|
|
||||||
"message": "Режим черного списка"
|
|
||||||
},
|
|
||||||
"description": {
|
|
||||||
"message": "Описание"
|
|
||||||
},
|
|
||||||
"blackListModeDescription": {
|
|
||||||
"message": "Применить установленную строку User-Agent ко всем вкладкам за исключением содержащих следующие домены верхнего уровня (список доменов разделяется запятыми). Важно: даже если применяемая к окну строка User-Agent установлена из всплывающего окна, для этого списка будет использоваться строка User-Agent вашего браузера по умолчанию."
|
|
||||||
},
|
|
||||||
"whiteListMode": {
|
|
||||||
"message": "Режим белого списка"
|
|
||||||
},
|
|
||||||
"whiteListModeDescription": {
|
|
||||||
"message": "Применять установленную строку User-Agent только к вкладкам, содержащим следующие домены верхнего уровня. Важно: даже если применяемая к окну строка User-Agent установлена из всплывающего окна, данный User-Agent заменит собой глобальный."
|
|
||||||
},
|
|
||||||
"customMode": {
|
|
||||||
"message": "Режим настройки"
|
|
||||||
},
|
|
||||||
"customModeDescription": {
|
|
||||||
"message": "Пробовать считывание строки User-Agent из объекта JSON; в другом случае использовать строку User-Agent по умолчанию или установленную во всплывающем окне. Используйте \"*\" в качестве сервера для применения ко всем доменам. Вы можете случайно выбирать из нескольких строк User-Agent с помощью массива вместо фиксированной строки. Если в объекте JSON присутствует ключ \"_\", отсылающий к массиву серверов, то расширение будет случайно выбирать строку User-Agent для каждого сервера в списке. Это полезно, если вы не желаете случайно менять User-Agent до перезапуска браузера."
|
|
||||||
},
|
|
||||||
"insertSample": {
|
|
||||||
"message": "Вставить пример"
|
|
||||||
},
|
|
||||||
"cache": {
|
|
||||||
"message": "Использовать кэширование для улучшения производительности (рекомендуемое значение true). Отключите эту опцию только при использовании режима настройки, когда нужно изменять строку User-Agent с помощью списка при каждом запросе."
|
|
||||||
},
|
|
||||||
"exactMatch": {
|
|
||||||
"message": "Использовать точное совпадение (если включено, вам нужно добавлять все поддомены в черный и белый списки как задумано. Если выключено, все поддомены проходят проверку на совпадение (например, www.google.com проходит проверку, если google.com находится в списке))"
|
|
||||||
},
|
|
||||||
"faqs": {
|
|
||||||
"message": "Открывать страницу FAQ при обновлении"
|
|
||||||
},
|
|
||||||
"log": {
|
|
||||||
"message": "Отображать отладочную информацию в консоли браузера"
|
|
||||||
},
|
|
||||||
"disableSpoofing": {
|
|
||||||
"message": "Отключить подмену User-Agent"
|
|
||||||
},
|
|
||||||
"disableSpoofingDescription": {
|
|
||||||
"message": "Разделяемый запятыми список ключевых слов, на которых расширение не должно подменять заголовок User-Agent. Используйте этот список для защиты URL, содержащих эти ключевые слова. Каждое ключевое слово должно быть длиной не менее 5 символов."
|
|
||||||
},
|
|
||||||
"customUserAgentParsing": {
|
|
||||||
"message": "Парсинг установленного User-Agent"
|
|
||||||
},
|
|
||||||
"customUserAgentParsingDescription": {
|
|
||||||
"message": "Объект JSON для обхода внутреннего метода парсинга строки User-Agent. Ключи — настоящие строки User-Agent. Значение каждого ключа- объект ключей, требуемых для установки объекта \"navigator\". Вы можете использовать ключевое слово \"[delete]\", если вам нужен ключ в объекте \"navigator\" для удаления."
|
|
||||||
},
|
|
||||||
"siblingHostnames": {
|
|
||||||
"message": "Родственные домены"
|
|
||||||
},
|
|
||||||
"siblingHostnamesDescription": {
|
|
||||||
"message": "Массив JSON, содержащий одну или больше групп серверов с отдельной строкой User-Agent на группу. Для всех серверов в одной группе вычисление строки User-Agent проводится только один раз, все остальные члены группы используют ту же самую строку. С помощью этого можно убедиться, что група связанных веб-сайтов имеет доступ только к одной и той же строке User-Agent."
|
|
||||||
},
|
|
||||||
"importSettings": {
|
|
||||||
"message": "Импортировать настройки"
|
|
||||||
},
|
|
||||||
"exportSettings": {
|
|
||||||
"message": "Экспортировать настройки"
|
|
||||||
},
|
|
||||||
"exportSettingsTitle": {
|
|
||||||
"message": "Чтобы сгенерировать уменьшенную версию, нажмите эту кнопку, удерживая клавишу Shift"
|
|
||||||
},
|
|
||||||
"help": {
|
|
||||||
"message": "Страница FAQ (Помощь)"
|
|
||||||
},
|
|
||||||
"donate": {
|
|
||||||
"message": "Поддержать разработку"
|
|
||||||
},
|
|
||||||
"save": {
|
|
||||||
"message": "Сохранить"
|
|
||||||
},
|
|
||||||
"managedStorage": {
|
|
||||||
"message": "Данное расширение поддерживает Managed Storage, и эти настройки могут быть изменены автоматически или установлены изначально администратором домена. Прочтите FAQ для получения более подробной информации."
|
|
||||||
},
|
|
||||||
"options": {
|
|
||||||
"message": "Настройки"
|
|
||||||
},
|
|
||||||
"optionsTitle": {
|
|
||||||
"message": "Открыть страницу настроек"
|
|
||||||
},
|
|
||||||
"restart": {
|
|
||||||
"message": "Перезапустить"
|
|
||||||
},
|
|
||||||
"restartTitle": {
|
|
||||||
"message": "Нажмите, чтобы перезапустить расширение. Это очистит все строки User-Agent, примененные к окну."
|
|
||||||
},
|
|
||||||
"refreshTab": {
|
|
||||||
"message": "Обновить вкладку"
|
|
||||||
},
|
|
||||||
"refreshTabTitle": {
|
|
||||||
"message": "Обновить текущую страницу"
|
|
||||||
},
|
|
||||||
"reset": {
|
|
||||||
"message": "Сбросить"
|
|
||||||
},
|
|
||||||
"resetTitle": {
|
|
||||||
"message": "Сбросить строку User-Agent браузера на значение по умолчанию. Это не сбросит строки User-Agent, примененные к окну. Чтобы сбросить их, нажмите кнопку 'Перезапустить'."
|
|
||||||
},
|
|
||||||
"testUA": {
|
|
||||||
"message": "Тест UA"
|
|
||||||
},
|
|
||||||
"testUATitle": {
|
|
||||||
"message": "Тестировать вашу строку User-Agent"
|
|
||||||
},
|
|
||||||
"considerContainers": {
|
|
||||||
"message": "Учитывать контейнеры"
|
|
||||||
},
|
|
||||||
"considerContainersTitle": {
|
|
||||||
"message": "Позволять расширению иметь доступ к контейнерам вашего браузера. При наличии доступа вкладки внутри изолированных контейнеров не используют строку User-Agent контейнера по умолчанию. Вам нужно устанавливать эту строку для каждого нового контейнера."
|
|
||||||
},
|
|
||||||
"applyActiveWindow": {
|
|
||||||
"message": "Применить (активное окно)"
|
|
||||||
},
|
|
||||||
"applyActiveWindowTitle": {
|
|
||||||
"message": "Установить эту строку User-Agent для всех вкладок внутри текущего окна"
|
|
||||||
},
|
|
||||||
"applyAllWindows": {
|
|
||||||
"message": "Применить (все окна)"
|
|
||||||
},
|
|
||||||
"applyAllWindowsTitle": {
|
|
||||||
"message": "Установить эту строку User-Agent в качестве основной строки браузера"
|
|
||||||
},
|
|
||||||
"applyContainer": {
|
|
||||||
"message": "Применить (контейнер)"
|
|
||||||
},
|
|
||||||
"applyContainerTitle": {
|
|
||||||
"message": "Установить эту строку User-Agent в качестве строки текущего контейнера"
|
|
||||||
},
|
|
||||||
"applyContainerWindow": {
|
|
||||||
"message": "Применить (контейнер в окне)"
|
|
||||||
},
|
|
||||||
"applyContainerWindowTitle": {
|
|
||||||
"message": "Установить эту строку User-Agent для всех вкладок внутри текущего окна контейнера"
|
|
||||||
},
|
|
||||||
"resetContainer": {
|
|
||||||
"message": "Сбросить (контейнер)"
|
|
||||||
},
|
|
||||||
"resetContainerTitle": {
|
|
||||||
"message": "Сбросить строку User-Agent контейнера на значение по умолчанию. Это не сбросит строки User-Agent, примененные к окну. Чтобы сбросить их, нажмите кнопку 'Перезапустить'."
|
|
||||||
},
|
|
||||||
"oscpuTitle": {
|
|
||||||
"message": "Это поле только для чтения. Используйте страницу настроек для парсинга вручную."
|
|
||||||
},
|
|
||||||
"appVersionTitle": {
|
|
||||||
"message": "Это поле только для чтения. Используйте страницу настроек для парсинга вручную."
|
|
||||||
},
|
|
||||||
"platformTitle": {
|
|
||||||
"message": "Это поле только для чтения. Используйте страницу настроек для парсинга вручную."
|
|
||||||
},
|
|
||||||
"vendorTitle": {
|
|
||||||
"message": "Это поле только для чтения. Используйте страницу настроек для парсинга вручную."
|
|
||||||
},
|
|
||||||
"productTitle": {
|
|
||||||
"message": "Это поле только для чтения. Используйте страницу настроек для парсинга вручную."
|
|
||||||
},
|
|
||||||
"uaTitle": {
|
|
||||||
"message": "Чтобы установить пустую строку User-Agent, используйте ключевое слово 'empty'. Чтобы составить собственную строку User-Agent, основанную на текущем объекте navigator браузера, используйте нотацию ${}. Все внутри этой нотации будет прочитано из объекта 'navigator'. Например, чтобы присоединить строку к User-Agent по умолчанию, используйте '${userAgent} ПРИСОЕДИНЕННАЯ СТРОКА'"
|
|
||||||
},
|
|
||||||
"uaPlaceholder": {
|
|
||||||
"message": "Ваша предпочитаемая строка User-Agent"
|
|
||||||
},
|
|
||||||
"noMatch": {
|
|
||||||
"message": "Для данного запроса нет строк User-Agent"
|
|
||||||
},
|
|
||||||
"ztoa": {
|
|
||||||
"message": "От Z до A"
|
|
||||||
},
|
|
||||||
"atoz": {
|
|
||||||
"message": "От A до Z"
|
|
||||||
},
|
|
||||||
"filterAmong": {
|
|
||||||
"message": "Выбрать из $1"
|
|
||||||
},
|
|
||||||
"filterAgents": {
|
|
||||||
"message": "Выбрать UA"
|
|
||||||
},
|
|
||||||
"msgDefaultUA": {
|
|
||||||
"message": "User-Agent по умолчанию, вместо этого нажмите кнопку 'Сбросить'"
|
|
||||||
},
|
|
||||||
"msgUASet": {
|
|
||||||
"message": "User-Agent установлен"
|
|
||||||
},
|
|
||||||
"msgDisabledOnContainer": {
|
|
||||||
"message": "Отключено в этом контейнере. Используется строка User-Agent по умолчанию."
|
|
||||||
},
|
|
||||||
"msgDisabled": {
|
|
||||||
"message": "Отключено. Используется строка User-Agent по умолчанию."
|
|
||||||
},
|
|
||||||
"optionsSaved": {
|
|
||||||
"message": "Настройки сохранены."
|
|
||||||
},
|
|
||||||
"dbReset": {
|
|
||||||
"message": "Щелкните 2 раза левой кнопкой мыши для сброса!"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
const port = document.createElement('span');
|
|
||||||
port.id = 'ua-port-fgTd9n';
|
|
||||||
document.documentElement.append(port);
|
|
||||||
|
|
||||||
// preferences
|
|
||||||
self.prefs = self.prefs || {
|
|
||||||
ua: 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
|
|
||||||
uad: true,
|
|
||||||
major: 100,
|
|
||||||
name: 'Google Chrome',
|
|
||||||
mobile: false,
|
|
||||||
platform: 'Windows',
|
|
||||||
architecture: 'x86',
|
|
||||||
bitness: '64',
|
|
||||||
platformVersion: '10.0.0'
|
|
||||||
};
|
|
||||||
Object.assign(port.dataset, self.prefs);
|
|
||||||
|
|
||||||
port.dataset.enabled = self.ingored ? false : true;
|
|
|
@ -1,104 +0,0 @@
|
||||||
const port = document.getElementById('ua-port-fgTd9n');
|
|
||||||
port.remove();
|
|
||||||
|
|
||||||
// overwrite navigator.userAgent
|
|
||||||
{
|
|
||||||
const {get} = Object.getOwnPropertyDescriptor(Navigator.prototype, 'userAgent');
|
|
||||||
|
|
||||||
Object.defineProperty(Navigator.prototype, 'userAgent', {
|
|
||||||
get: new Proxy(get, {
|
|
||||||
apply(target, self, args) {
|
|
||||||
return port.dataset.enabled === 'true' ? port.dataset.ua : Reflect.apply(target, self, args);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// overwrite navigator.userAgentData
|
|
||||||
if (port.dataset.uad) {
|
|
||||||
self.NavigatorUAData = self.NavigatorUAData || new class NavigatorUAData {
|
|
||||||
brands = [];
|
|
||||||
mobile = false;
|
|
||||||
platform = 'Unknown';
|
|
||||||
toJSON() {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
getHighEntropyValues() {
|
|
||||||
return Promise.resolve({});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Object.defineProperty(self.NavigatorUAData.prototype, 'brands', {
|
|
||||||
get: new Proxy(Object.getOwnPropertyDescriptor(self.NavigatorUAData.prototype, 'brands').get, {
|
|
||||||
apply(target, self, args) {
|
|
||||||
return port.dataset.enabled === 'true' ? [{
|
|
||||||
brand: port.dataset.name,
|
|
||||||
version: port.dataset.major
|
|
||||||
}, {
|
|
||||||
brand: 'Chromium',
|
|
||||||
version: port.dataset.major
|
|
||||||
}, {
|
|
||||||
brand: 'Not=A?Brand',
|
|
||||||
version: '24'
|
|
||||||
}] : Reflect.apply(target, self, args);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
Object.defineProperty(self.NavigatorUAData.prototype, 'mobile', {
|
|
||||||
get: new Proxy(Object.getOwnPropertyDescriptor(self.NavigatorUAData.prototype, 'mobile').get, {
|
|
||||||
apply(target, self, args) {
|
|
||||||
return port.dataset.enabled === 'true' ? port.dataset.mobile === 'true' : Reflect.apply(target, self, args);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
Object.defineProperty(self.NavigatorUAData.prototype, 'platform', {
|
|
||||||
get: new Proxy(Object.getOwnPropertyDescriptor(self.NavigatorUAData.prototype, 'platform').get, {
|
|
||||||
apply(target, self, args) {
|
|
||||||
return port.dataset.enabled === 'true' ? port.dataset.platform : Reflect.apply(target, self, args);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
self.NavigatorUAData.prototype.toJSON = new Proxy(self.NavigatorUAData.prototype.toJSON, {
|
|
||||||
apply(target, self, args) {
|
|
||||||
return port.dataset.enabled === 'true' ? {
|
|
||||||
brands: self.brands,
|
|
||||||
mobile: self.mobile,
|
|
||||||
platform: self.platform
|
|
||||||
} : Reflect.apply(target, self, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
self.NavigatorUAData.prototype.getHighEntropyValues = new Proxy(self.NavigatorUAData.prototype.getHighEntropyValues, {
|
|
||||||
apply(target, self, args) {
|
|
||||||
if (port.dataset.enabled === 'true') {
|
|
||||||
const hints = args[0];
|
|
||||||
|
|
||||||
if (!hints || Array.isArray(hints) === false) {
|
|
||||||
return Promise.reject(Error(`Failed to execute 'getHighEntropyValues' on 'NavigatorUAData'`));
|
|
||||||
}
|
|
||||||
|
|
||||||
const r = self.toJSON();
|
|
||||||
|
|
||||||
if (hints.includes('architecture')) {
|
|
||||||
r.architecture = port.dataset.architecture;
|
|
||||||
}
|
|
||||||
if (hints.includes('bitness')) {
|
|
||||||
r.bitness = port.dataset.bitness;
|
|
||||||
}
|
|
||||||
if (hints.includes('model')) {
|
|
||||||
r.model = '';
|
|
||||||
}
|
|
||||||
if (hints.includes('platformVersion')) {
|
|
||||||
r.platformVersion = port.dataset.platformVersion;
|
|
||||||
}
|
|
||||||
if (hints.includes('uaFullVersion')) {
|
|
||||||
r.uaFullVersion = self.brands[0].version;
|
|
||||||
}
|
|
||||||
if (hints.includes('fullVersionList')) {
|
|
||||||
r.fullVersionList = this.brands;
|
|
||||||
}
|
|
||||||
return Promise.resolve(r);
|
|
||||||
}
|
|
||||||
return Reflect.apply(target, self, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
ua-parser.min.js:
|
|
||||||
https://github.com/faisalman/ua-parser-js/releases/tag/1.0.32
|
|
4
v3/helper/ua-parser.min.js
vendored
4
v3/helper/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
74
v3/policy.js
74
v3/policy.js
|
@ -1,74 +0,0 @@
|
||||||
/* global UAParser */
|
|
||||||
self.importScripts('./helper/ua-parser.min.js');
|
|
||||||
|
|
||||||
const PREFS = {
|
|
||||||
'enabled': true,
|
|
||||||
'mode': 'blacklist',
|
|
||||||
'blacklist-exception-hosts': [],
|
|
||||||
'whitelist-hosts': [],
|
|
||||||
'custom-routing': {
|
|
||||||
'whatismybrowser.com': 'ff'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const policy = {};
|
|
||||||
|
|
||||||
{
|
|
||||||
const cache = new Map();
|
|
||||||
|
|
||||||
policy.parse = d => {
|
|
||||||
const ua = 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36';
|
|
||||||
|
|
||||||
if (cache.has(ua)) {
|
|
||||||
return cache.get(ua);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Promise(resolve => chrome.storage.local.get({
|
|
||||||
'userAgentData': true
|
|
||||||
}, prefs => {
|
|
||||||
const p = (new UAParser(ua)).getResult();
|
|
||||||
|
|
||||||
const r = {
|
|
||||||
ua
|
|
||||||
};
|
|
||||||
r.uad = prefs.userAgentData &&
|
|
||||||
p.browser && p.browser.major && ['Opera', 'Chrome', 'Edge'].includes(p.browser.name);
|
|
||||||
|
|
||||||
if (r.uad) {
|
|
||||||
r.platform = p?.os?.name || 'Windows';
|
|
||||||
if (r.platform.toLowerCase().includes('mac')) {
|
|
||||||
r.platform = 'macOS';
|
|
||||||
}
|
|
||||||
else if (r.platform.toLowerCase().includes('debian')) {
|
|
||||||
r.platform = 'Linux';
|
|
||||||
}
|
|
||||||
|
|
||||||
r.major = p?.browser?.major || 100;
|
|
||||||
|
|
||||||
r.name = p?.browser?.name || 'Google Chrome';
|
|
||||||
if (r.name === 'Chrome') {
|
|
||||||
r.name = 'Google Chrome';
|
|
||||||
}
|
|
||||||
|
|
||||||
r.mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);
|
|
||||||
|
|
||||||
r.architecture = 'x86';
|
|
||||||
|
|
||||||
r.bitness = '64';
|
|
||||||
|
|
||||||
r.platformVersion = '10.0.0';
|
|
||||||
}
|
|
||||||
|
|
||||||
cache.set(ua, r);
|
|
||||||
|
|
||||||
resolve(r);
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
policy.configure = (...methods) => new Promise(resolve => chrome.storage.local.get(PREFS, prefs => {
|
|
||||||
for (const method of methods) {
|
|
||||||
method(prefs);
|
|
||||||
}
|
|
||||||
resolve();
|
|
||||||
}));
|
|
|
@ -1,51 +0,0 @@
|
||||||
/* global policy */
|
|
||||||
|
|
||||||
const request = {};
|
|
||||||
|
|
||||||
request.network = async prefs => {
|
|
||||||
const p = await policy.parse();
|
|
||||||
|
|
||||||
const condition = {
|
|
||||||
'isUrlFilterCaseSensitive': false,
|
|
||||||
'resourceTypes': Object.values(chrome.declarativeNetRequest.ResourceType)
|
|
||||||
};
|
|
||||||
const one = {
|
|
||||||
'id': 1,
|
|
||||||
'priority': 1,
|
|
||||||
'action': {
|
|
||||||
'type': 'modifyHeaders',
|
|
||||||
'requestHeaders': [{
|
|
||||||
'operation': 'set',
|
|
||||||
'header': 'user-agent',
|
|
||||||
'value': p.ua
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
'condition': {
|
|
||||||
...condition
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const o = {
|
|
||||||
addRules: [one],
|
|
||||||
removeRuleIds: (await chrome.declarativeNetRequest.getDynamicRules()).map(o => o.id)
|
|
||||||
};
|
|
||||||
|
|
||||||
if (prefs.enabled) {
|
|
||||||
if (prefs.mode === 'blacklist') {
|
|
||||||
one.condition.excludedInitiatorDomains = prefs['blacklist-exception-hosts'];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (prefs['whitelist-hosts'].length) {
|
|
||||||
one.condition.initiatorDomains = prefs['whitelist-hosts'];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.info('matching list is empty');
|
|
||||||
o.addRules.length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chrome.declarativeNetRequest.updateDynamicRules(o);
|
|
||||||
};
|
|
||||||
|
|
||||||
chrome.declarativeNetRequest.onRuleMatchedDebug.addListener(d => console.log(d));
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"ua": {
|
|
||||||
"title": "Custom User-Agent String",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"json": {
|
|
||||||
"title": "JSON String of all Preferences",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
104
v3/scripting.js
104
v3/scripting.js
|
@ -1,104 +0,0 @@
|
||||||
/* global port, policy */
|
|
||||||
|
|
||||||
const scripting = {};
|
|
||||||
|
|
||||||
scripting.page = async prefs => {
|
|
||||||
await chrome.scripting.unregisterContentScripts();
|
|
||||||
|
|
||||||
if (prefs.enabled) {
|
|
||||||
const common = {
|
|
||||||
'allFrames': true,
|
|
||||||
'matchOriginAsFallback': true,
|
|
||||||
'runAt': 'document_start'
|
|
||||||
};
|
|
||||||
if (prefs.mode === 'blacklist') {
|
|
||||||
common.matches = ['*://*/*'];
|
|
||||||
if (prefs['blacklist-exception-hosts'].length) {
|
|
||||||
common.excludeMatches = prefs['blacklist-exception-hosts'].map(h => [`*://${h}/*`, `*://*.${h}/*`]).flat();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (prefs['whitelist-hosts'].length) {
|
|
||||||
common.matches = prefs['whitelist-hosts'].map(h => [`*://${h}/*`, `*://*.${h}/*`]).flat();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (common.matches.length) {
|
|
||||||
await chrome.scripting.registerContentScripts([{
|
|
||||||
...common,
|
|
||||||
'id': 'protected',
|
|
||||||
'js': ['/data/inject/isolated.js'],
|
|
||||||
'world': 'ISOLATED'
|
|
||||||
}, {
|
|
||||||
...common,
|
|
||||||
'id': 'unprotected',
|
|
||||||
'js': ['/data/inject/main.js'],
|
|
||||||
'world': 'MAIN'
|
|
||||||
}]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.info('matching list is empty');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// web navigation
|
|
||||||
{
|
|
||||||
const onCommitted = async d => {
|
|
||||||
const p = await policy.parse(d);
|
|
||||||
|
|
||||||
if (p) {
|
|
||||||
chrome.scripting.executeScript({
|
|
||||||
target: {
|
|
||||||
tabId: d.tabId,
|
|
||||||
frameIds: [d.frameId]
|
|
||||||
},
|
|
||||||
injectImmediately: true,
|
|
||||||
func: p => {
|
|
||||||
if (typeof port === 'undefined') {
|
|
||||||
self.prefs = p;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.assign(port.dataset, p);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
args: [p]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const onCommittedIgnore = d => {
|
|
||||||
chrome.scripting.executeScript({
|
|
||||||
target: {
|
|
||||||
tabId: d.tabId,
|
|
||||||
frameIds: [d.frameId]
|
|
||||||
},
|
|
||||||
injectImmediately: true,
|
|
||||||
func: () => {
|
|
||||||
if (typeof port === 'undefined') {
|
|
||||||
port.dataset.enabled = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
self.ingored = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).catch(() => {});
|
|
||||||
};
|
|
||||||
|
|
||||||
scripting.commit = prefs => {
|
|
||||||
if (prefs.enabled && prefs.mode === 'blacklist') {
|
|
||||||
chrome.webNavigation.onCommitted.addListener(onCommitted);
|
|
||||||
if (prefs['blacklist-exception-hosts'].length) {
|
|
||||||
chrome.webNavigation.onCommitted.addListener(onCommittedIgnore, {
|
|
||||||
url: prefs['blacklist-exception-hosts'].map(hostContains => ({
|
|
||||||
hostContains
|
|
||||||
}))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (prefs['whitelist-hosts'].length) {
|
|
||||||
chrome.webNavigation.onCommitted.addListener(onCommitted, {
|
|
||||||
url: prefs['whitelist-hosts'].map(hostContains => ({
|
|
||||||
hostContains
|
|
||||||
}))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
22
v3/worker.js
22
v3/worker.js
|
@ -1,22 +0,0 @@
|
||||||
/* global policy, scripting, request */
|
|
||||||
|
|
||||||
self.importScripts('./policy.js');
|
|
||||||
self.importScripts('./scripting.js');
|
|
||||||
self.importScripts('./request.js');
|
|
||||||
|
|
||||||
// run on each wake up
|
|
||||||
policy.configure(scripting.commit, request.network);
|
|
||||||
|
|
||||||
// run once
|
|
||||||
{
|
|
||||||
const once = () => policy.configure(scripting.page);
|
|
||||||
|
|
||||||
chrome.runtime.onStartup.addListener(once);
|
|
||||||
chrome.runtime.onInstalled.addListener(once);
|
|
||||||
}
|
|
||||||
|
|
||||||
chrome.storage.onChanged.addListener(ps => {
|
|
||||||
if (ps.enabled || ps.mode || ps['blacklist-exception-hosts'] || ps['whitelist-hosts']) {
|
|
||||||
policy.configure(scripting.commit, scripting.page, request.network);
|
|
||||||
}
|
|
||||||
});
|
|
Loading…
Reference in a new issue