Forgot the JS file.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Sep 2007 10:31:56 +0000 (10:31 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Sep 2007 10:31:56 +0000 (10:31 +0000)
        * misc/WebKitDetect.js: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@25385 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKitSite/ChangeLog
WebKitSite/misc/WebKitDetect.js [new file with mode: 0644]

index 3f55e0c..4d5733e 100644 (file)
@@ -1,5 +1,11 @@
 2007-09-06  Maciej Stachowiak  <mjs@apple.com>
 
+        Forgot the JS file.
+
+        * misc/WebKitDetect.js: Added.
+
+2007-09-06  Maciej Stachowiak  <mjs@apple.com>
+
         Not reviewed - copy of WebKitDetect script from wiki
 
         * misc/WebKitDetect.html: Added.
diff --git a/WebKitSite/misc/WebKitDetect.js b/WebKitSite/misc/WebKitDetect.js
new file mode 100644 (file)
index 0000000..1c5c692
--- /dev/null
@@ -0,0 +1,179 @@
+/* 
+Copyright (C) 2007 Apple Computer, Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var WebKitDetect = {  };
+
+// If the user agent is WebKit, returns true. Otherwise, returns false.
+WebKitDetect.isWebKit = function isWebKit()
+{
+    return RegExp(" AppleWebKit/").test(navigator.userAgent);
+}
+
+// If the user agent is WebKit, returns an array of numbers matching the "." separated 
+// fields in the WebKit version number, with an "isNightlyBuild" property specifying
+// whether the user agent is a WebKit nightly build. Otherwise, returns null.
+//
+// Example: 418.10.1 => [ 418, 10, 1 ] isNightlyBuild: false
+WebKitDetect.version = function version() 
+{
+    /* Some example strings: 
+            Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3
+            Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Safari/521.32
+     */
+     
+    // grab (AppleWebKit/)(xxx.x.x)
+    var webKitFields = RegExp("( AppleWebKit/)([^ ]+)").exec(navigator.userAgent);
+    if (!webKitFields || webKitFields.length < 3)
+        return null;
+    var versionString = webKitFields[2];
+
+    var isNightlyBuild = versionString.indexOf("+") != -1;
+
+    // Remove '+' or any other stray characters
+    var invalidCharacter = RegExp("[^\\.0-9]").exec(versionString);
+    if (invalidCharacter)
+        versionString = versionString.slice(0, invalidCharacter.index);
+    
+    var version = versionString.split(".");
+    version.isNightlyBuild = isNightlyBuild;
+    return version;
+}
+
+// If the user agent is a WebKit version greater than or equal to the version specified
+// in the string minimumString, returns true. Returns false otherwise. minimumString 
+// defaults to "".
+//
+// Example usage: WebKitDetect.versionIsAtLeast("418.10.1")
+WebKitDetect.versionIsAtLeast = function versionIsAtLeast(minimumString)
+{
+    function toIntOrZero(s) 
+    {
+        var toInt = parseInt(s);
+        return isNaN(toInt) ? 0 : toInt;
+    }
+
+    if (minimumString === undefined)
+        minimumString = "";
+    
+    var minimum = minimumString.split(".");
+    var version = WebKitDetect.version();
+
+    if (!version)
+        return false;
+        
+    if (version.isNightlyBuild)
+        return true;
+
+    for (var i = 0; i < minimum.length; i++) {
+        var versionField = toIntOrZero(version[i]);
+        var minimumField = toIntOrZero(minimum[i]);
+        
+        if (versionField > minimumField)
+            return true;
+        if (versionField < minimumField)
+            return false;
+    }
+
+    return true;
+}
+
+WebKitDetect.isMobile = function isMobile()
+{
+    return WebKitDetect.isWebKit() && RegExp(" Mobile/").test(navigator.userAgent);
+}
+
+WebKitDetect.mobileDevice = function mobileDevice()
+{
+    if (!WebKitDetect.isMobile())
+        return null;
+        
+    var fields = RegExp("(Mozilla/5.0 \\()([^;]+)").exec(navigator.userAgent);
+    if (!fields || fields.length < 3)
+        return null;
+    return fields[2];
+}
+
+// Example: 1C28 => [ 1, C, 28 ]
+WebKitDetect._mobileVersion = function _mobileVersion(versionString)
+{
+    var fields = RegExp("([0-9]+)([A-Z]+)([0-9]+)").exec(versionString);
+    if (!fields || fields.length != 4)
+        return null;
+    return [ fields[1], fields[2], fields[3] ];
+}
+
+WebKitDetect.mobileVersion = function mobileVersion()
+{
+    // grab (Mobile/)(nxnnn)
+    var fields = RegExp("( Mobile/)([^ ]+)").exec(navigator.userAgent);
+    if (!fields || fields.length < 3)
+        return null;
+    var versionString = fields[2];
+    
+    return WebKitDetect._mobileVersion(versionString);
+}
+
+WebKitDetect.mobileVersionIsAtLeast = function mobileVersionIsAtLeast(minimumString)
+{
+    function toIntOrZero(s) 
+    {
+        var toInt = parseInt(s);
+        return isNaN(toInt) ? 0 : toInt;
+    }
+
+    if (minimumString === undefined)
+        minimumString = "";
+
+    var minimum = WebKitDetect._mobileVersion(minimumString);
+    var version = WebKitDetect.mobileVersion();
+
+    if (!version)
+        return false;
+        
+    var majorVersInt = toIntOrZero(version[0]);
+    var majorMinInt = toIntOrZero(minimum[0]);
+    if (majorVersInt > majorMinInt)
+        return true;
+    if (majorVersInt < majorMinInt)
+        return false;
+    
+    var majorVersAlpha = version[1];
+    var majorMinAlpha = minimum[1];
+    if (majorVersAlpha > majorMinAlpha)
+        return true;
+    if (majorVersAlpha < majorMinAlpha)
+        return false;
+    
+    var minorVersInt = toIntOrZero(version[2]);
+    var minorMinInt = toIntOrZero(minimum[2]);
+    if (minorVersInt > minorMinInt)
+        return true;
+    if (minorVersInt < minorMinInt)
+        return false;
+    
+    return true;
+}
+
+