diff --git a/v3/_locales/en/messages.json b/v3/_locales/en/messages.json deleted file mode 100644 index 6ef1b38..0000000 --- a/v3/_locales/en/messages.json +++ /dev/null @@ -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!" - } -} diff --git a/v3/_locales/ru/messages.json b/v3/_locales/ru/messages.json deleted file mode 100644 index 0ac10e9..0000000 --- a/v3/_locales/ru/messages.json +++ /dev/null @@ -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 раза левой кнопкой мыши для сброса!" - } -} diff --git a/v3/data/inject/isolated.js b/v3/data/inject/isolated.js deleted file mode 100644 index 2607aba..0000000 --- a/v3/data/inject/isolated.js +++ /dev/null @@ -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; diff --git a/v3/data/inject/main.js b/v3/data/inject/main.js deleted file mode 100644 index 93d1fde..0000000 --- a/v3/data/inject/main.js +++ /dev/null @@ -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); - } - }); -} diff --git a/v3/helper/ReadMe.txt b/v3/helper/ReadMe.txt deleted file mode 100644 index 4937dd7..0000000 --- a/v3/helper/ReadMe.txt +++ /dev/null @@ -1,2 +0,0 @@ -ua-parser.min.js: - https://github.com/faisalman/ua-parser-js/releases/tag/1.0.32 diff --git a/v3/helper/ua-parser.min.js b/v3/helper/ua-parser.min.js deleted file mode 100644 index 8365377..0000000 --- a/v3/helper/ua-parser.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/* UAParser.js v1.0.32 - Copyright © 2012-2021 Faisal Salman - MIT License */ -(function(window,undefined){"use strict";var LIBVERSION="1.0.32",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",UA_MAX_LENGTH=350;var AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",BROWSER="Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",OPERA="Opera",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",FACEBOOK="Facebook";var extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){if(extensions[i]&&extensions[i].length%2===0){mergedRegexes[i]=extensions[i].concat(regexes[i])}else{mergedRegexes[i]=regexes[i]}}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;jUA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this};this.setUA(_ua);return this};UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(typeof window!==UNDEF_TYPE){window.UAParser=UAParser}}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); diff --git a/v3/policy.js b/v3/policy.js deleted file mode 100644 index 24027f6..0000000 --- a/v3/policy.js +++ /dev/null @@ -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(); -})); diff --git a/v3/request.js b/v3/request.js deleted file mode 100644 index 570f640..0000000 --- a/v3/request.js +++ /dev/null @@ -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)); - diff --git a/v3/schema.json b/v3/schema.json deleted file mode 100644 index 96b767d..0000000 --- a/v3/schema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "object", - "properties": { - "ua": { - "title": "Custom User-Agent String", - "type": "string" - }, - "json": { - "title": "JSON String of all Preferences", - "type": "string" - } - } -} diff --git a/v3/scripting.js b/v3/scripting.js deleted file mode 100644 index dbac8ba..0000000 --- a/v3/scripting.js +++ /dev/null @@ -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 - })) - }); - } - }; -} diff --git a/v3/worker.js b/v3/worker.js deleted file mode 100644 index 8d40dd7..0000000 --- a/v3/worker.js +++ /dev/null @@ -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); - } -});