# lib/goog/useragent/product_isversion.js

1 | // Copyright 2009 The Closure Library Authors. All Rights Reserved.
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS-IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 |
15 | /**
16 | * @fileoverview Functions for understanding the version of the browser.
17 | * This is pulled out of product.js to ensure that only builds that need
18 | * this functionality actually get it, without having to rely on the compiler
19 | * to strip out unneeded pieces.
20 | *
21 | * TODO(nnaze): Move to more appropriate filename/namespace.
22 | *
23 | */
24 |
25 |
26 | goog.provide('goog.userAgent.product.isVersion');
27 |
28 |
29 | goog.require('goog.labs.userAgent.platform');
30 | goog.require('goog.string');
31 | goog.require('goog.userAgent');
32 | goog.require('goog.userAgent.product');
33 |
34 |
35 | /**
36 | * @return {string} The string that describes the version number of the user
37 | * agent product. This is a string rather than a number because it may
38 | * contain 'b', 'a', and so on.
39 | * @private
40 | */
41 | goog.userAgent.product.determineVersion_ = function() {
42 | // All browsers have different ways to detect the version and they all have
43 | // different naming schemes.
44 |
45 | if (goog.userAgent.product.FIREFOX) {
46 | // Firefox/2.0.0.1 or Firefox/3.5.3
47 | return goog.userAgent.product.getFirstRegExpGroup_(/Firefox\/([0-9.]+)/);
48 | }
49 |
50 | if (goog.userAgent.product.IE || goog.userAgent.product.EDGE ||
51 | goog.userAgent.product.OPERA) {
52 | return goog.userAgent.VERSION;
53 | }
54 |
55 | if (goog.userAgent.product.CHROME) {
56 | // Chrome/4.0.223.1
57 | return goog.userAgent.product.getFirstRegExpGroup_(/Chrome\/([0-9.]+)/);
58 | }
59 |
60 | // This replicates legacy logic, which considered Safari and iOS to be
61 | // different products.
62 | if (goog.userAgent.product.SAFARI && !goog.labs.userAgent.platform.isIos()) {
63 | // Version/5.0.3
64 | //
65 | // NOTE: Before version 3, Safari did not report a product version number.
66 | // The product version number for these browsers will be the empty string.
67 | // They may be differentiated by WebKit version number in goog.userAgent.
68 | return goog.userAgent.product.getFirstRegExpGroup_(/Version\/([0-9.]+)/);
69 | }
70 |
71 | if (goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) {
72 | // Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1
73 | // (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3
74 | // Version is the browser version, Mobile is the build number. We combine
75 | // the version string with the build number: 3.0.3A100a for the example.
76 | var arr = goog.userAgent.product.execRegExp_(
77 | /Version\/(\S+).*Mobile\/(\S+)/);
78 | if (arr) {
79 | return arr[1] + '.' + arr[2];
80 | }
81 | } else if (goog.userAgent.product.ANDROID) {
82 | // Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522+
83 | // (KHTML, like Gecko) Safari/419.3
84 | //
85 | // Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10+
86 | // (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2
87 | //
88 | // Prefer Version number if present, else make do with the OS number
89 | var version = goog.userAgent.product.getFirstRegExpGroup_(
90 | /Android\s+([0-9.]+)/);
91 | if (version) {
92 | return version;
93 | }
94 |
95 | return goog.userAgent.product.getFirstRegExpGroup_(/Version\/([0-9.]+)/);
96 | }
97 |
98 | return '';
99 | };
100 |
101 |
102 | /**
103 | * Return the first group of the given regex.
104 | * @param {!RegExp} re Regular expression with at least one group.
105 | * @return {string} Contents of the first group or an empty string if no match.
106 | * @private
107 | */
108 | goog.userAgent.product.getFirstRegExpGroup_ = function(re) {
109 | var arr = goog.userAgent.product.execRegExp_(re);
110 | return arr ? arr[1] : '';
111 | };
112 |
113 |
114 | /**
115 | * Run regexp's exec() on the userAgent string.
116 | * @param {!RegExp} re Regular expression.
117 | * @return {Array<?>} A result array, or null for no match.
118 | * @private
119 | */
120 | goog.userAgent.product.execRegExp_ = function(re) {
121 | return re.exec(goog.userAgent.getUserAgentString());
122 | };
123 |
124 |
125 | /**
126 | * The version of the user agent. This is a string because it might contain
127 | * 'b' (as in beta) as well as multiple dots.
128 | * @type {string}
129 | */
130 | goog.userAgent.product.VERSION = goog.userAgent.product.determineVersion_();
131 |
132 |
133 | /**
134 | * Whether the user agent product version is higher or the same as the given
135 | * version.
136 | *
137 | * @param {string|number} version The version to check.
138 | * @return {boolean} Whether the user agent product version is higher or the
139 | * same as the given version.
140 | */
141 | goog.userAgent.product.isVersion = function(version) {
142 | return goog.string.compareVersions(
143 | goog.userAgent.product.VERSION, version) >= 0;
144 | };