# 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.string');
30 | goog.require('goog.userAgent');
31 | goog.require('goog.userAgent.product');
32 |
33 |
34 | /**
35 | * @return {string} The string that describes the version number of the user
36 | * agent product. This is a string rather than a number because it may
37 | * contain 'b', 'a', and so on.
38 | * @private
39 | */
40 | goog.userAgent.product.determineVersion_ = function() {
41 | // All browsers have different ways to detect the version and they all have
42 | // different naming schemes.
43 |
44 | if (goog.userAgent.product.FIREFOX) {
45 | // Firefox/2.0.0.1 or Firefox/3.5.3
46 | return goog.userAgent.product.getFirstRegExpGroup_(/Firefox\/([0-9.]+)/);
47 | }
48 |
49 | if (goog.userAgent.product.IE || goog.userAgent.product.OPERA) {
50 | return goog.userAgent.VERSION;
51 | }
52 |
53 | if (goog.userAgent.product.CHROME) {
54 | // Chrome/4.0.223.1
55 | return goog.userAgent.product.getFirstRegExpGroup_(/Chrome\/([0-9.]+)/);
56 | }
57 |
58 | if (goog.userAgent.product.SAFARI) {
59 | // Version/5.0.3
60 | //
61 | // NOTE: Before version 3, Safari did not report a product version number.
62 | // The product version number for these browsers will be the empty string.
63 | // They may be differentiated by WebKit version number in goog.userAgent.
64 | return goog.userAgent.product.getFirstRegExpGroup_(/Version\/([0-9.]+)/);
65 | }
66 |
67 | if (goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) {
68 | // Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1
69 | // (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3
70 | // Version is the browser version, Mobile is the build number. We combine
71 | // the version string with the build number: 3.0.3A100a for the example.
72 | var arr = goog.userAgent.product.execRegExp_(
73 | /Version\/(\S+).*Mobile\/(\S+)/);
74 | if (arr) {
75 | return arr[1] + '.' + arr[2];
76 | }
77 | } else if (goog.userAgent.product.ANDROID) {
78 | // Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522+
79 | // (KHTML, like Gecko) Safari/419.3
80 | //
81 | // Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10+
82 | // (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2
83 | //
84 | // Prefer Version number if present, else make do with the OS number
85 | var version = goog.userAgent.product.getFirstRegExpGroup_(
86 | /Android\s+([0-9.]+)/);
87 | if (version) {
88 | return version;
89 | }
90 |
91 | return goog.userAgent.product.getFirstRegExpGroup_(/Version\/([0-9.]+)/);
92 | } else if (goog.userAgent.product.CAMINO) {
93 | return goog.userAgent.product.getFirstRegExpGroup_(/Camino\/([0-9.]+)/);
94 | }
95 |
96 | return '';
97 | };
98 |
99 |
100 | /**
101 | * Return the first group of the given regex.
102 | * @param {!RegExp} re Regular expression with at least one group.
103 | * @return {string} Contents of the first group or an empty string if no match.
104 | * @private
105 | */
106 | goog.userAgent.product.getFirstRegExpGroup_ = function(re) {
107 | var arr = goog.userAgent.product.execRegExp_(re);
108 | return arr ? arr[1] : '';
109 | };
110 |
111 |
112 | /**
113 | * Run regexp's exec() on the userAgent string.
114 | * @param {!RegExp} re Regular expression.
115 | * @return {Array<?>} A result array, or null for no match.
116 | * @private
117 | */
118 | goog.userAgent.product.execRegExp_ = function(re) {
119 | return re.exec(goog.userAgent.getUserAgentString());
120 | };
121 |
122 |
123 | /**
124 | * The version of the user agent. This is a string because it might contain
125 | * 'b' (as in beta) as well as multiple dots.
126 | * @type {string}
127 | */
128 | goog.userAgent.product.VERSION = goog.userAgent.product.determineVersion_();
129 |
130 |
131 | /**
132 | * Whether the user agent product version is higher or the same as the given
133 | * version.
134 | *
135 | * @param {string|number} version The version to check.
136 | * @return {boolean} Whether the user agent product version is higher or the
137 | * same as the given version.
138 | */
139 | goog.userAgent.product.isVersion = function(version) {
140 | return goog.string.compareVersions(
141 | goog.userAgent.product.VERSION, version) >= 0;
142 | };