Add chrome/version.md
It also adds an associated template for the page.
Change-Id: I07cbbccfc1af4d0f65ba741e0e86fa72182c99fa
diff --git a/docs/chrome/version.md b/docs/chrome/version.md
new file mode 100644
index 0000000..3ffc95c
--- /dev/null
+++ b/docs/chrome/version.md
@@ -0,0 +1,10 @@
+---
+template: versionpage.html
+description: Averigua cuál es tu versión de Chrome fácilmente.
+---
+
+# ¿Qué versión de Chrome tengo?
+<div class="version-box">
+ <p><span id="version"></span></p>
+ <p><span id="updated"></span></p>
+</div>
diff --git a/mkdocs.yml b/mkdocs.yml
index f7d0b72..f52c665 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -14,7 +14,9 @@
- search
- minify:
minify_html: true
- - git-revision-date-localized
+ - git-revision-date-localized:
+ exclude:
+ - chrome/version.md
markdown_extensions:
- markdown.extensions.admonition
- markdown.extensions.footnotes
@@ -31,6 +33,7 @@
- 'Malware en Chrome': 'chrome/malware.md'
- 'Inhabilitar extensiones de Chrome': 'chrome/diagnostico-extensiones.md'
- 'Chrome no carga páginas web': 'chrome/no-carga-paginas-web.md'
+ - '¿Qué versión de Chrome tengo?': 'chrome/version.md'
- 'Canales de Chrome': 'chrome/canales.md'
- 'Error con certificado': 'chrome/error-certificado.md'
- 'Volver a mostrar flags antiguas': 'chrome/mostrar-flags-antiguas.md'
diff --git a/overrides/assets/javascripts/screenshot_page.js b/overrides/assets/javascripts/screenshot_page.js
index 4ef3e73..8f443c3 100644
--- a/overrides/assets/javascripts/screenshot_page.js
+++ b/overrides/assets/javascripts/screenshot_page.js
@@ -1,3 +1,26 @@
+// @Author: avm99963 (https://www.avm99963.com)
+/* @License: The MIT License (MIT)
+
+Copyright (c) 2021 Adrià Vilanova Martínez
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. */
+
// Detect the current OS
function detectOS() {
var linuxRegex = /Linux/i;
diff --git a/overrides/assets/javascripts/version_page.js b/overrides/assets/javascripts/version_page.js
new file mode 100644
index 0000000..a49596e
--- /dev/null
+++ b/overrides/assets/javascripts/version_page.js
@@ -0,0 +1,292 @@
+// @Author: avm99963 (https://www.avm99963.com)
+/* @License: The MIT License (MIT)
+
+Copyright (c) 2021 Adrià Vilanova Martínez
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. */
+
+var actualversion;
+
+var app = {
+ init: function() {
+ fetch('https://omahaproxy.appspot.com/all.json')
+ .then(res => res.json())
+ .then(chromeversions => {
+ var browser = BrowserDetect.browser, version = BrowserDetect.version,
+ version2, os3, os2 = System.OS(), os = BrowserDetect.OS;
+ if (navigator.appVersion.indexOf('OPR') != -1) browser = 'Opera';
+ if (browser == 'Chrome') {
+ version2 = window.navigator.appVersion.match(/Chrome\/(.*?) /)[1];
+ if (navigator.appVersion.indexOf('CrOS') != -1)
+ var os = 'Chrome OS', os2 = 'cros', os3 = 'Chrome OS';
+ else
+ var os3 = os2,
+ os2 = str_replace(
+ ['Windows', 'Mac', 'iPhone/iPod', 'Chrome OS', 'Linux'],
+ ['win64', 'mac', 'ios', 'cros', 'linux'], os);
+ var matches = chromeversions.filter(function(val, index, array) {
+ return val.os === os2;
+ });
+ var actualchrome =
+ matches[0].versions.filter(function(val, index, array) {
+ return val.channel === 'stable';
+ });
+ actualversion = actualchrome[0].version.split('.')[0];
+ if (version < actualversion) {
+ document.getElementById('updated').innerHTML = '¡Oh, no!' +
+ 'Google Chrome <a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
+ } else if (version > actualversion) {
+ document.getElementById('updated').innerHTML =
+ 'No estás usando el canal estable de Chrome. Ve con cuidado ;-)';
+ } else if (version2 != actualchrome[0].version) {
+ document.getElementById('updated').innerHTML =
+ 'Oops, Google Chrome <a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
+ } else {
+ document.getElementById('updated').innerHTML =
+ 'Chrome está actualizado';
+ }
+ } else {
+ os3 = os2;
+ version2 = version;
+ }
+ document.getElementById('version').textContent =
+ 'Usas la versión ' + version2 + ' de ' + browser + ' en ' + os3;
+ });
+ }
+}
+
+// Function to detect navigator (informally browser)
+// Source:
+
+var BrowserDetect = {
+ init: function() {
+ this.browser = this.searchString(this.dataBrowser) || '?';
+ this.version = this.searchVersion(navigator.userAgent) ||
+ this.searchVersion(navigator.appVersion) || '?';
+ this.OS = this.searchString(this.dataOS) || '?';
+ },
+ searchString: function(data) {
+ for (var i = 0; i < data.length; i++) {
+ var dataString = data[i].string;
+ var dataProp = data[i].prop;
+ this.versionSearchString = data[i].versionSearch || data[i].identity;
+ if (dataString) {
+ if (dataString.indexOf(data[i].subString) != -1)
+ return data[i].identity;
+ } else if (dataProp)
+ return data[i].identity;
+ }
+ },
+ searchVersion: function(dataString) {
+ var index = dataString.indexOf(this.versionSearchString);
+ if (index == -1) return;
+ return parseFloat(
+ dataString.substring(index + this.versionSearchString.length + 1));
+ },
+ dataBrowser: [
+ {string: navigator.userAgent, subString: 'Chrome', identity: 'Chrome'}, {
+ string: navigator.userAgent,
+ subString: 'OmniWeb',
+ versionSearch: 'OmniWeb/',
+ identity: 'OmniWeb'
+ },
+ {
+ string: navigator.vendor,
+ subString: 'Apple',
+ identity: 'Safari',
+ versionSearch: 'Version'
+ },
+ {prop: window.opera, identity: 'Opera', versionSearch: 'Version'},
+ {string: navigator.vendor, subString: 'iCab', identity: 'iCab'},
+ {string: navigator.vendor, subString: 'KDE', identity: 'Konqueror'},
+ {string: navigator.userAgent, subString: 'Firefox', identity: 'Firefox'},
+ {string: navigator.vendor, subString: 'Camino', identity: 'Camino'}, {
+ // for newer Netscapes (6+)
+ string: navigator.userAgent,
+ subString: 'Netscape',
+ identity: 'Netscape'
+ },
+ {
+ string: navigator.userAgent,
+ subString: 'MSIE',
+ identity: 'Explorer',
+ versionSearch: 'MSIE'
+ },
+ {
+ string: navigator.userAgent,
+ subString: 'Gecko',
+ identity: 'Mozilla',
+ versionSearch: 'rv'
+ },
+ {
+ // for older Netscapes (4-)
+ string: navigator.userAgent,
+ subString: 'Mozilla',
+ identity: 'Netscape',
+ versionSearch: 'Mozilla'
+ }
+ ],
+ dataOS: [
+ {string: navigator.platform, subString: 'Win', identity: 'Windows'},
+ {string: navigator.platform, subString: 'Mac', identity: 'Mac'},
+ {string: navigator.userAgent, subString: 'iPhone', identity: 'iPhone/iPod'},
+ {string: navigator.platform, subString: 'Linux', identity: 'Linux'}
+ ]
+};
+
+function str_replace(search, replace, subject, count) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: Gabriel Paderni
+ // + improved by: Philip Peterson
+ // + improved by: Simon Willison (http://simonwillison.net)
+ // + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
+ // + bugfixed by: Anton Ongson
+ // + input by: Onno Marsman
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + tweaked by: Onno Marsman
+ // + input by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + input by: Oleg Eremeev
+ // + improved by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Oleg Eremeev
+ // % note 1: The count parameter must be passed as a string in order
+ // % note 1: to find a global variable in which the result will be
+ // given
+ // * example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
+ // * returns 1: 'Kevin.van.Zonneveld'
+ // * example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name},
+ // lars');
+ // * returns 2: 'hemmo, mars'
+ var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, f = [].concat(search),
+ r = [].concat(replace), s = subject,
+ ra = Object.prototype.toString.call(r) === '[object Array]',
+ sa = Object.prototype.toString.call(s) === '[object Array]';
+ s = [].concat(s);
+ if (count) {
+ this.window[count] = 0;
+ }
+
+ for (i = 0, sl = s.length; i < sl; i++) {
+ if (s[i] === '') {
+ continue;
+ }
+ for (j = 0, fl = f.length; j < fl; j++) {
+ temp = s[i] + '';
+ repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
+ s[i] = (temp).split(f[j]).join(repl);
+ if (count && s[i] !== temp) {
+ this.window[count] += (temp.length - s[i].length) / f[j].length;
+ }
+ }
+ }
+ return sa ? s : s[0];
+}
+
+/**
+ * JavaScript Client Detection
+ * (C) viazenetti GmbH (Christian Ludwig)
+ */
+
+var System = {
+ OS: function() {
+ var unknown = '?';
+
+ // browser
+ var nVer = navigator.appVersion;
+ var nAgt = navigator.userAgent;
+ var browser = navigator.appName;
+ var version = '' + parseFloat(navigator.appVersion);
+ var majorVersion = parseInt(navigator.appVersion, 10);
+ var nameOffset, verOffset, ix;
+
+ // system
+ var os = unknown;
+ var clientStrings = [
+ {s: 'Windows 3.11', r: /Win16/},
+ {s: 'Windows 95', r: /(Windows 95|Win95|Windows_95)/},
+ {s: 'Windows ME', r: /(Win 9x 4.90|Windows ME)/},
+ {s: 'Windows 98', r: /(Windows 98|Win98)/},
+ {s: 'Windows CE', r: /Windows CE/},
+ {s: 'Windows 2000', r: /(Windows NT 5.0|Windows 2000)/},
+ {s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/},
+ {s: 'Windows Server 2003', r: /Windows NT 5.2/},
+ {s: 'Windows Vista', r: /Windows NT 6.0/},
+ {s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/},
+ {s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/},
+ {s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/},
+ {s: 'Windows NT 4.0', r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
+ {s: 'Windows ME', r: /Windows ME/},
+ {s: 'Android', r: /Android/},
+ {s: 'Open BSD', r: /OpenBSD/},
+ {s: 'Sun OS', r: /SunOS/},
+ {s: 'Linux', r: /(Linux|X11)/},
+ {s: 'iOS', r: /(iPhone|iPad|iPod)/},
+ {s: 'Mac OS X', r: /Mac OS X/},
+ {s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
+ {s: 'QNX', r: /QNX/},
+ {s: 'UNIX', r: /UNIX/},
+ {s: 'BeOS', r: /BeOS/},
+ {s: 'OS/2', r: /OS\/2/},
+ {
+ s: 'Search Bot',
+ r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/
+ }
+ ];
+ for (var id in clientStrings) {
+ var cs = clientStrings[id];
+ if (cs.r.test(nAgt)) {
+ os = cs.s;
+ break;
+ }
+ }
+
+ var osVersion = 'unknown';
+
+ if (/Windows/.test(os)) {
+ osVersion = /Windows (.*)/.exec(os)[1];
+ os = 'Windows';
+ }
+
+ switch (os) {
+ case 'Mac OS X':
+ osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
+ break;
+
+ case 'Android':
+ osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
+ break;
+
+ case 'iOS':
+ osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
+ osVersion =
+ osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
+ break;
+ }
+
+ var jscd = {os: os, osVersion: osVersion};
+
+ return (jscd.os + ' ' + jscd.osVersion);
+ }
+};
+
+window.addEventListener('load', _ => {
+ BrowserDetect.init();
+ app.init();
+});
diff --git a/overrides/versionpage.html b/overrides/versionpage.html
new file mode 100644
index 0000000..26dbb0b
--- /dev/null
+++ b/overrides/versionpage.html
@@ -0,0 +1,57 @@
+{% extends "base.html" %}
+
+{% block extrahead %}
+ <style>
+ .version-box {
+ display: block;
+ background: #F2F3F0;
+ border: solid 1px #DDDFDA;
+ border-radius: 4px;
+ padding: 5px 5px 5px 5px;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ }
+
+ @media screen and (min-width: 641px) {
+ .version-box {
+ width: 300px;
+ }
+ }
+
+ .version-box #version {
+ font-size: 16px;
+ }
+
+ .version-box #updated {
+ font-size: 12px;
+ color: gray;
+ }
+
+ .version-box a:link {
+ color: #306CEF;
+ }
+
+ .version-box a:visited {
+ color: #306CEF;
+ }
+
+ .version-box a:hover {
+ color: #306CEF;
+ }
+
+ .version-box a:active {
+ color: #306CEF;
+ }
+ </style>
+{% endblock %}
+
+{#
+ This removes all material-mkdocs js files (therefore disabling the search bar,
+ repo info, etc.), because they are overriden by the following code.
+
+ This is working as intended, since this also makes the page load faster.
+#}
+{% block scripts %}
+ <script src="{{ 'assets/javascripts/version_page.js' | url }}"></script>
+{% endblock %}