| // Copyright 2013 The Closure Library Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS-IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| /** |
| * @fileoverview Utilities used by goog.labs.userAgent tools. These functions |
| * should not be used outside of goog.labs.userAgent.*. |
| * |
| * |
| * @author nnaze@google.com (Nathan Naze) |
| */ |
| |
| goog.provide('goog.labs.userAgent.util'); |
| |
| goog.require('goog.string'); |
| |
| |
| /** |
| * Gets the native userAgent string from navigator if it exists. |
| * If navigator or navigator.userAgent string is missing, returns an empty |
| * string. |
| * @return {string} |
| * @private |
| */ |
| goog.labs.userAgent.util.getNativeUserAgentString_ = function() { |
| var navigator = goog.labs.userAgent.util.getNavigator_(); |
| if (navigator) { |
| var userAgent = navigator.userAgent; |
| if (userAgent) { |
| return userAgent; |
| } |
| } |
| return ''; |
| }; |
| |
| |
| /** |
| * Getter for the native navigator. |
| * This is a separate function so it can be stubbed out in testing. |
| * @return {Navigator} |
| * @private |
| */ |
| goog.labs.userAgent.util.getNavigator_ = function() { |
| return goog.global.navigator; |
| }; |
| |
| |
| /** |
| * A possible override for applications which wish to not check |
| * navigator.userAgent but use a specified value for detection instead. |
| * @private {string} |
| */ |
| goog.labs.userAgent.util.userAgent_ = |
| goog.labs.userAgent.util.getNativeUserAgentString_(); |
| |
| |
| /** |
| * Applications may override browser detection on the built in |
| * navigator.userAgent object by setting this string. Set to null to use the |
| * browser object instead. |
| * @param {?string=} opt_userAgent The User-Agent override. |
| */ |
| goog.labs.userAgent.util.setUserAgent = function(opt_userAgent) { |
| goog.labs.userAgent.util.userAgent_ = opt_userAgent || |
| goog.labs.userAgent.util.getNativeUserAgentString_(); |
| }; |
| |
| |
| /** |
| * @return {string} The user agent string. |
| */ |
| goog.labs.userAgent.util.getUserAgent = function() { |
| return goog.labs.userAgent.util.userAgent_; |
| }; |
| |
| |
| /** |
| * @param {string} str |
| * @return {boolean} Whether the user agent contains the given string, ignoring |
| * case. |
| */ |
| goog.labs.userAgent.util.matchUserAgent = function(str) { |
| var userAgent = goog.labs.userAgent.util.getUserAgent(); |
| return goog.string.contains(userAgent, str); |
| }; |
| |
| |
| /** |
| * @param {string} str |
| * @return {boolean} Whether the user agent contains the given string. |
| */ |
| goog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) { |
| var userAgent = goog.labs.userAgent.util.getUserAgent(); |
| return goog.string.caseInsensitiveContains(userAgent, str); |
| }; |
| |
| |
| /** |
| * Parses the user agent into tuples for each section. |
| * @param {string} userAgent |
| * @return {!Array<!Array<string>>} Tuples of key, version, and the contents |
| * of the parenthetical. |
| */ |
| goog.labs.userAgent.util.extractVersionTuples = function(userAgent) { |
| // Matches each section of a user agent string. |
| // Example UA: |
| // Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) |
| // AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405 |
| // This has three version tuples: Mozilla, AppleWebKit, and Mobile. |
| |
| var versionRegExp = new RegExp( |
| // Key. Note that a key may have a space. |
| // (i.e. 'Mobile Safari' in 'Mobile Safari/5.0') |
| '(\\w[\\w ]+)' + |
| |
| '/' + // slash |
| '([^\\s]+)' + // version (i.e. '5.0b') |
| '\\s*' + // whitespace |
| '(?:\\((.*?)\\))?', // parenthetical info. parentheses not matched. |
| 'g'); |
| |
| var data = []; |
| var match; |
| |
| // Iterate and collect the version tuples. Each iteration will be the |
| // next regex match. |
| while (match = versionRegExp.exec(userAgent)) { |
| data.push([ |
| match[1], // key |
| match[2], // value |
| // || undefined as this is not undefined in IE7 and IE8 |
| match[3] || undefined // info |
| ]); |
| } |
| |
| return data; |
| }; |
| |