Appcodename mozilla что это
Во всех браузерах, которые я тестировал (IE, Firefox, Chrome, Safari, Opera, Yandex), window.navigator.appCodeName возвращает "Mozilla" . Я знаю историю веб-браузеров, «захватывающих» пользовательский агент, чтобы обмануть страницы, заставив их думать, что они совместимы со всеми другими браузерами, и я был доволен тем, appCodeName что просто являлся расширением этого принципала, однако я прочитал стандарт , и оказывается, в самом стандарте сказано, что это будет захардкоженное значение "Mozilla". Так что все эти браузеры на самом деле следуют стандартам.
Почему существует это значение? Я предполагаю, что он зарезервирован для будущего использования, но каков план?
Этот вопрос на самом деле не объясняет это, потому что все, что в нем говорится, это то, что это произошло из-за того, что браузеры захватили его, что я уже понимаю, но мне больше интересно, что было / есть в прошлом или будущем.
Я перечитал ваш вопрос и согласен с тем, что это не совсем тот дубликат, о котором я думал. Извини за это.
К сожалению, я не думаю, что есть какая-либо задокументированная история appCodeName и почему именно она была создана в то время. Этот материал уходит корнями в середину 90-х.
The NavigatorID.appCodeName always returns 'Mozilla' , on any browser. This property is kept only for compatibility purposes.
Note: Do not rely on this property to return a real product name. All browsers return "Mozilla" as the value of this property.
Это похоже на NavigatorID.product , который всегда возвращает строку 'Gecko' .
Как объясняет Себастьян Г. в своем ответе , он использовался для прослушивания пользовательского агента. Это означает, что в какой-то момент браузеры, отличные от Mozilla, не содержали Mozilla в своей строке UA. Хотя я не уверен, сколько времени прошло между браузерами на основе Mozilla/Mozilla "Mozilla" в строке UA и добавлением "Mozilla" в браузерах, отличных от Mozilla.
Я не могу найти никакой документации о том, когда appCodeName свойство впервые стало доступным в navigator объекте (предположительно, до 2000 года, поскольку в 2000 году оно упоминалось как «давно назад» ).
Да, я заметил, что есть пара похожих значений. Какая цель была раньше? Всегда ли все браузеры использовали значение «Mozilla» или в прошлом были другие значения?
Я полагаю, что все браузеры (за возможным исключением некоторых действительно малоизвестных) использовали значение Mozilla, поскольку они либо на самом деле были основаны на Mozilla, либо притворялись Mozilla.
Если значение всегда было «Mozilla» во всех браузерах, то как это могло когда-либо использоваться на практике? Каким будет выражение «else»? если(мозилла) < showContent(); >иначе < neverRuns(); >
Ах, значит, мог быть момент, когда appCodeName не было бы «Mozilla», по крайней мере, в течение короткого времени.
Properties
Doesn't inherit any properties.
Потому что до недавних пор он был просто не нужен
Браузер для того, чтобы сидеть в интернете.
Через браузер мы заходим на сайт. Если мы зашли на сайт — нам отдали страничку. А раз нам ее отдали — значит мы связаны с сетевым узлом который может сгенерировать UUID и сами мы можем этого не делать. По факту, нам как фронту вообще на ID информации все равно, мы отдали, а дальше это уже проблема принимающей стороны.
Вы можете возразить, что есть PWA, и что оно есть аж с 2007 года. Но так уж вышло, что PWA никому не нужен, примерно, с того же самого времени. (Хотя нынче Play Market позволяет загружать PWA как приложения, но. ). Сами посудите, много вы PWA приложений установили? Я даже Хабр не поставил.
Другой вопрос — почему до сих тор нет никакого API типа getUUID() , чтобы переложить эту проблему на браузер? Скорее всего ответ кроется все в той же ссылке на то, что в 99 случаев из 100 сайту это просто-напросто незачем.
Но осадочек остался.
Что такое UUID
UUID — стандарт идентификации данных используемый, преимущественно, для распределенных систем. Его задача позволить генерировать ключи, которые не вызовут конфликтов при сохранении в то, или иное хранилище данных.
UUID представляет собой 16-байтное число в HEX'е формате:
Здесь я не буду вдаваться в подробности, что из этого что означает. С этим вы подробно можете ознакомиться в википедии.
Первоначальная цель
Целью этого свойства в первую очередь было представление внутреннего кодового имени браузера (например, «Lollipop» для Android 5). Mozilla была одной из первых, кто реализовал это — вероятно, как API для JS-разработчиков для изучения или для своих собственных скриптов. И он был предназначен для представления кодового имени каждого браузера в отдельности. Но, как уже упоминалось, история пошла по другому пути.
The Navigator interface represents the state and the identity of the user agent. It allows scripts to query it and to register themselves to carry on some activities.
A Navigator object can be retrieved using the read-only window.navigator property.
Какие трудности вас ждут
Точность времени
Я бы не стал называть это большой проблемой.
Мы можем получить время с точностью только до миллисекунды, в то время как первая версия UUID делала это с точностью до 100 наносекунд.
Ну чисто теоретически мы можем получить и с точностью до 1 микросекунды, но это будет время от открытия вкладки (это если мы сейчас про performance.now() ), что уже не так заманчиво.
Идентификация браузера
Браузеры вообще не уникальны и сейчас я вам это докажу.
Для идентификации клиента HTML Living Standard нам предлагает использовать The Navigator object.
А теперь внимание сравним то, что нам предлагают сравнивать
Браузер | appCodeName | appName | platform | product | productSub | vendor | vendorSub |
---|---|---|---|---|---|---|---|
Chrome | Mozilla | Netscape | Win32 | Gecko | 20030107 | Google Inc. | - |
Mozilla 75 | Mozilla | Netscape | Win32 | Gecko | 20100101 | - | - |
Mozilla 45 | Mozilla | Netscape | Win32 | Gecko | 20100101 | - | - |
Internet Explorer | Mozilla | Netscape | Win32 | Gecko | - | - | - |
Microsoft Edge | Mozilla | Netscape | Win32 | Gecko | 20030107 | Google Inc. | - |
Как вам такое? Почувствовали все разнообразие клиентов? Вот и я нет.
Но надо признать, что местами отличаются userAgent и appVersion :
Тут Edge впереди планеты всей, так как он отображает IP, и мы можем использовать его. Но это только в Edge. А так, как видите, многого с навигатором не навоюешь.
Deprecated methods
Returns a promise that resolves to an array of VRDisplay objects representing any available VR devices connected to the computer.
After having prompted the user for permission, returns the audio or video stream associated to a camera or microphone on the local computer.
Returns false . JavaScript taint/untaint functions removed in JavaScript 1.2.
Решил я делать свой пет-проект по учету прочитанных книг на PWA. Покорять новые технологии и все такое. Расчет был на то, что с его выложу и установлю на телефон и вот у меня есть мобильное приложение, которое можно использовать оффлайн. Хочу я сгенерировать UUID, чтобы сохранить книгу, а не нахожу API. Предлагаю разобраться почему.
2 ответа
NavigatorID.appCodeName всегда возвращает 'Mozilla' в любом браузере. Это свойство сохраняется только для совместимости.
Примечание. Не полагайтесь на это свойство, чтобы вернуть настоящее название продукта. Все браузеры возвращают «Mozilla» в качестве значения этого свойства.
Это похоже на NavigatorID.product , который всегда возвращает строку 'Gecko' .
Как объясняет Себастьян Г. в своем ответе, он использовался для прослушивания пользовательского агента. Это подразумевает, что в какой-то момент браузеры, не являющиеся Mozilla, не содержали Mozilla в своей строке UA. Хотя я не уверен, сколько времени прошло между браузерами на основе Mozilla / Mozilla "Mozilla" в строке UA и добавлением "Mozilla" в браузерах не-Mozilla.
Я не могу найти никакой документации о том, когда свойство appCodeName впервые стало доступно в объекте navigator (предположительно до 2000 года, так как это было упоминается в 2000 году как" давным-давно ").
Эта статья может быть вам интересна: Строки агента в популярных браузерах
Non-standard properties
Returns the build identifier of the browser. In modern browsers this property now returns a fixed timestamp as a privacy measure, e.g. 20181001000000 in Firefox 64 onwards.
Returns a ContactsManager interface which allows users to select entries from their contact list and share limited details of the selected entries with a website or application.
Returns an empty string. In Netscape 4.7x, returns "US & CA domestic policy" or "Export policy".
Returns a boolean indicating whether the browser is running in standalone mode. Available on Apple's iOS Safari only.
Returns a WakeLock interface you can use to request screen wake locks and prevent screen from dimming, turning off, or showing a screen saver.
Как это реализовал я
Для себя я решил отталкиваться от своих нужд и особенностей архитектуры своего приложения.
- Книги очень сложно добавлять несколько раз в миллисекунду. Даже просто тыкать на кнопочку сложно.
- Книги может добавлять только авторизованный пользователь.
Последние 6 байт я беру из SHA-1 хеша логина — можно идентифицировать 281,474,976,710,656 уникальных пользователей (если взять расчет на то, что не будет коллизий). Тоже с запасом (у меня их всего 30).
1 байт у нас отводится на версию (M) и вариант (N).
Оставшиеся 3 байта я солю рандомом.
Если вдруг мое приложение станет супер-пупер популярным и 100,000 и они будут за минуту каждый делать по 100 книг, то за миллисекунду будет генерироваться:
$$
100,000 * 100 / 60,000 = 166
$$
Вероятность того, что совпадут два:
Это очень мало и этого мне хватает
Реализацию можно посмотреть тут.
JS не имеет доступа к данным машины
Мы не можем получить MAC-адрес пользователя, мы не можем получить данные его IP, а так же вообще что-либо с его машины без разрешения пользователя.
Да, мы можем загружать файлы и делать красивые file-инпуты на фронте, но мы можем получить только конкретный файл, который нам предоставит пользователь. Но согласитесь, как бы не шибко удобно запрашивать на каждый UUID по файлу. Неудобно их запрашивать даже каждый раз при входе на сайт.
Сделано же это из благих целей: представьте, что читаете вы Хабр, а тут:
И больше никаких проблем с высшим образованием.
Способы генерации UUID
1 и 2 версии использовали время с точностью до 0.1 микросекунды + MAC адрес, что гарантировало практически полное отсутствие возможности получить дубликат. Чтобы полностью добить эту вероятность первая версия добавляет рандомную соль, а вторая ничего не делает (вторую версию мы не любим, она вообще может сгенерировать только 64 уникальных id за семь минут).
3 и 5 хешируют пространство имен (Url, FQDN, OID) + само имя. Таким образом в каждый момент времени мы получаем абсолютно идентичные UUID для одних и тех же входных параметров.
4 же версия просто использует рандом ¯_(ツ)_/¯.
Война между браузерами
Это историческая и совместимая цель.
Все началось, когда появились первые браузеры. Вскоре началась битва реализации функций (которая еще не окончена). Они хотели, чтобы разработчики использовали свой браузер.
Поскольку обнаружение функций в то время не было чем-то особенным, сниффинг в браузере был горячим методом определения возможности использования функции. Поэтому разработчики поняли и внедрили новые приятные функции только для конкретного браузера. Но затем другой поставщик браузеров также реализовал функцию , но пользователи ее не увидели, потому что это не «Mozilla» (например).
Решение? Пользователи браузера, не являющегося Mozilla, также должны увидеть эту приятную небольшую функцию и использовать веб-сайт по назначению - , чтобы они все начали врать .
Это в значительной степени это в двух словах. Это не зарезервировано для будущих планов, но для доступа к прошлому контенту. И это все еще так, потому что сеть рассчитана на длительный срок. Поэтому сегодня вы можете посетить действительно старый сайт и получить всю информацию и функции, как в старые времена.
Война между браузерами
Это историческая цель и цель совместимости.
Все началось, когда появились первые браузеры. Вскоре началась битва за реализацию функций (которая, в конце концов, еще не окончена). Они хотели, чтобы разработчики использовали их браузер.
Поскольку в то время не существовало функции обнаружения, сниффинг браузера был популярным методом определения того, можно ли использовать какую-либо функцию. Так что разработчики принюхивались и реализовали приятные новые функции только для конкретного браузера. Но затем другой поставщик браузера также реализовал эту функцию, но пользователи ее не видели, потому что это была не «Мозилла» (например).
Решение? Пользователи браузера, отличного от Mozilla, тоже должны видеть эту приятную маленькую функцию и пользоваться сайтом по назначению — так они все начали врать .
Вот вкратце. Он зарезервирован не для планов на будущее, а для доступа к прошлому контенту. И это все еще так, потому что сеть рассчитана на длительное время. Итак, сегодня вы можете посетить действительно старый веб-сайт и получить всю информацию и функции, как и в старые времена.
Оригинальная цель
В первую очередь целью свойства было представление внутреннего кодового имени браузера (например, «Lollipop» для Android 5). Mozilla была одной из первых, кто это реализовал - вероятно, в качестве API для JS-Developer для собственных исследований или для собственных сценариев. И это было предназначено для представления кодового имени каждого браузера в отдельности. Но, как уже упоминалось, история пошла другим путем.
Предвещая вопрос "А почему же не рандом?"
Да, есть такой легендарный код
В моем случае на бэкенде UUID используется как первичный ключ.
Когда первые байты ключа идут по порядку больше вероятность, что новая запись встанет в конец таблицы. Даже если на клиенте будет запущена синхронизация. Ведь вряд ли юзер выполнит синхронизацию данных внесенных полгода назад и СУБД будет сдвигать половину таблицы.
В случае же с рандомом — данные будут вставляться в табличку куда ни попадя.
Всю необходимую информацию о запущенном браузере и системе у пользователя можно узнать при помощи объекта navigator. Каждый браузер имеет несколько общих методов и свойств данного объекта, а также несколько своих, только ему присущих свойств. Я попытался составить небольшой перечень совместимости трех браузеров: Internet Explorer, Mozilla Firefox и Opera. Сначала перечислим общие для всех свойства и методы объекта navigator :
- appCodeName — кодовое имя браузера. Обычно используется Mozilla;
- appName — официальное имя браузера (Internet Explorer, Netscape, Opera);
- appVersion — версия браузера;
- platform — платформа, на которой работает браузер (обычно Win32);
- cookieEnabied — доступность сохранения Cookie ;
- javaEnabied — доступность на запуск сценариев JavaScript;
- userAgent — специальная строка для служебных целей.
Давайте на основе этой информации напишем сценарий, который будет работать в трех рассмотренных браузерах. Вставляем в теле документа следующий код (листинг 1).
Листинг 1. Получение информации о браузере и системе
При загрузке Web-страницы браузер покажет всю информацию о себе (рис. 1 и 2).
Рис. 1. Определение настроек в Internet Explorer
Для любознательных читателей сообщу, что Internet Explorer также поддерживает несколько своих свойств и методов:
- appMinorVersion ;
- online ;
- systemLanguage .
Я не стану приводить расшифровку данных свойств, поищите эту информацию в документации.
А мы напишем сценарий, предназначенный только для Internet Explorer (листинг 2).
Рис. 2. Определение настроек в Mozilla Firefox
Листинг 2. Свойства, доступные только в Internet Explorer
А теперь приведу список свойств, присущих только Mozilla Firefox:
- language ;
- oscpu ;
- product ;
- productSub ;
- vendor ;
- vendorSub .
А теперь сценарий, предназначенный для Mozilla Firefox (листинг 3).
Листинг 3. Свойства, работающие только в Mozilla Firefox
Как видите, различия у браузеров довольно значительны. А ведь мы рассмотрели только один объект navigator. С другими объектами такая же история.
Во всех браузерах, которые я тестировал (IE, Firefox, Chrome, Safari, Opera, Яндекс), window.navigator.appCodeName возвращает "Mozilla" . Я знаю историю о том, что веб-браузеры «угоняли» пользовательский агент, чтобы обмануть страницы, заставляя их думать, что они совместимы со всеми другими браузерами, и я согласился жить с appCodeName , просто являющимся расширением этого принципала, однако я прочитайте стандарт, и выясняется, что Сам стандарт говорит, что это будет жестко закодированное значение «Mozilla». Так что все эти браузеры на самом деле соответствуют стандартам.
Почему это значение существует? Я предполагаю, что это зарезервировано для будущего использования, но каков план?
Этот вопрос на самом деле не объясняет, потому что все, что он заявляет, это то, что он это произошло из-за того, что браузеры взломали его, что я уже понимаю, но мне больше интересно, что использовалось в прошлом или будущем.
Deprecated properties
Always returns 'Mozilla' , in any browser.
Always returns 'Netscape' , in any browser.
Returns the version of the browser as a DOMString . Do not rely on this property to return the correct value.
Returns an array containing every VRDisplay object that is currently presenting ( VRDisplay.ispresenting is true ).
Reports the value of the user's do-not-track preference. When this value is "yes", your web site or application should not track the user.
Returns an MimeTypeArray listing the MIME types supported by the browser.
Returns a string that represents the current operating system.
Returns a string representing the platform of the browser. Do not rely on this function to return a significant value.
Returns a PluginArray listing the plugins installed in the browser.
Always returns 'Gecko' , in any browser.
Returns either the string '20030107' , or '"20100101' .
Returns either the empty string, 'Apple Computer Inc.' , or 'Google Inc.' .
Always returns the empty string.
Methods
Doesn't inherit any method.
Returns true if a call to Navigator.share() would succeed.
Clears a badge on the current app's icon and returns a Promise that resolves with undefined .
Returns a promise that resolves with a BatteryManager object that returns information about the battery charging status.
Allows web sites to register themselves as a possible handler for a given protocol.
Returns a Promise for a MediaKeySystemAccess object.
Returns a Promise representing a request for access to MIDI devices on the user's system.
Sets a badge on the icon associated with this app and returns a Promise that resolves with undefined .
Invokes the native sharing mechanism of the current platform.
Causes vibration on devices with support for it. Does nothing if vibration support isn't available.
Почему его нет в браузере
Standard properties
Provides a NetworkInformation object containing information about the network connection of a device.
Returns false if setting a cookie will be ignored and true otherwise.
Returns the CredentialsContainer interface which exposes methods to request credentials and notify the user agent when interesting events occur such as successful sign in or sign out.
Returns the amount of device memory in gigabytes. This value is an approximation given by rounding to the nearest power of 2 and dividing that number by 1024.
Returns a Geolocation object allowing accessing the location of the device.
Returns an HID object providing methods for connecting to HID devices, listing attached HID devices, and event handlers for connected HID devices.
Returns the number of logical processor cores available.
Returns a Keyboard object which provides access to functions that retrieve keyboard layout maps and toggle capturing of key presses from the physical keyboard.
Returns a DOMString representing the preferred language of the user, usually the language of the browser UI. The null value is returned when this is unknown.
Returns an array of DOMString representing the languages known to the user, by order of preference.
Returns a LockManager object that provides methods for requesting a new Lock object and querying for an existing Lock object.
Returns the maximum number of simultaneous touch contact points are supported by the current device.
Returns a MediaCapabilities object that can expose information about the decoding and encoding capabilities for a given format and output capabilities.
Returns a reference to a MediaDevices object which can then be used to get information about available media devices ( MediaDevices.enumerateDevices() ), find out what constrainable properties are supported for media on the user's computer and user agent ( MediaDevices.getSupportedConstraints() ), and to request access to media using MediaDevices.getUserMedia() .
Returns MediaSession object which can be used to provide metadata that can be used by the browser to present information about the currently-playing media to the user, such as in a global media controls UI.
Returns a boolean value indicating whether the browser is working online.
Returns true if the browser can display PDF files inline when navigating to them, and false otherwise.
Returns a Permissions object that can be used to query and update permission status of APIs covered by the Permissions API.
Returns a reference to the Presentation API.
Returns a Serial object, which represents the entry point into the Web Serial API to enable the control of serial ports.
Returns a ServiceWorkerContainer object, which provides access to registration, removal, upgrade, and communication with the ServiceWorker objects for the associated document.
Returns the singleton StorageManager object used for managing persistence permissions and estimating available storage on a site-by-site/app-by-app basis.
Returns the user agent string for the current browser.
Returns a NavigatorUAData object, which gives access to information about the browser and operating system of the user.
Indicates whether the user agent is controlled by automation.
Returns the WindowControlsOverlay interface which exposes information about the geometry of the title bar in desktop Progressive Web Apps, and an event to know whenever it changes.
Returns XRSystem object, which represents the entry point into the WebXR API.
Читайте также: