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
26goog.provide('goog.userAgent.product.isVersion');
27
28
29goog.require('goog.string');
30goog.require('goog.userAgent');
31goog.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 */
40goog.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 */
106goog.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 */
118goog.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 */
128goog.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 */
139goog.userAgent.product.isVersion = function(version) {
140 return goog.string.compareVersions(
141 goog.userAgent.product.VERSION, version) >= 0;
142};