Development
<?php
/* class Browser
*
* This PHP class determines, given the user-agent string, what browser
* rendering engine and rendering engine version you happen to be running.
* It then sets a bunch of array values based on what's known not to be
* supported in that browser rendering engine version.
*
* This is greatly simplified and should not at all be considered
* authoritative. This was really just written for my interests.
*
* Author: Spencer Wohlers <spencer [%at] geekwithoutacause.com>
* Last Updated: September 7, 2009
*/
class Browser {
public static $renderingEngine = "null";
public static $renderingEngineVersion = 0;
public static $userAgentString = "null";
public static $javascriptOn = false;
public static $browserSupport = array(
"HTML5Support" => true,
"HTML5StyleSupport" => true,
"HTML5FormSupport" => true,
"CSS21Support" => true,
"CSS3Support" => true,
"AdvancedColorSupport" => true,
"JSONSupport" => true,
"SVGSupport" => true,
"PNGSupport" => true,
"CrossDocMessagingSupport" => true,
"DragDropSupport" => true,
"ContentEditableSupport" => true,
"CanvasSupport" => true,
"AudioVideoSupport" => true,
"ElementsByClassNameSupport" => true,
"FontLinkingSupport" => true);
public function __construct($string) {
self::$userAgentString = $string;
self::parseUAString();
}
private function setTrident($version) {
$browsersup = &self::$browserSupport;
self::$renderingEngine = "Trident";
self::$renderingEngineVersion = $version;
if ($version <= 6) {
$browsersup["HTML5Support"] = false;
$browsersup["HTML5StyleSupport"] = false;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = false;
$browsersup["CSS3Support"] = false;
$browsersup["AdvancedColorSupport"] = false;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = false;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = false;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = false;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = false;
$browsersup["FontLinkingSupport"] = false;
}
if ($version == 7) {
$browsersup["HTML5Support"] = false;
$browsersup["HTML5StyleSupport"] = false;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = false;
$browsersup["CSS3Support"] = false;
$browsersup["AdvancedColorSupport"] = false;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = false;
$browsersup["PNGSupport"] = true;
$browsersup["CrossDocMessagingSupport"] = false;
$browsersup["DragDropSupport"] = true;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = false;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = false;
$browsersup["FontLinkingSupport"] = false;
}
if ($version == 8) {
$browsersup["HTML5Support"] = false;
$browsersup["HTML5StyleSupport"] = false;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = false;
$browsersup["AdvancedColorSupport"] = false;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = false;
$browsersup["PNGSupport"] = true;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = true;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = false;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = false;
$browsersup["FontLinkingSupport"] = false;
}
}
private function setGecko($version) {
$browsersup = &self::$browserSupport;
self::$renderingEngine = "Gecko";
self::$renderingEngineVersion = $version;
if ($version <= 181) {
// Firefox 1.0 and 2.0
$browsersup["HTML5Support"] = false;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = false;
$browsersup["AdvancedColorSupport"] = false;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = false;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = false;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = false;
$browsersup["FontLinkingSupport"] = false;
}
if ($version > 181) {
// Firefox 3.0
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = false;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = false;
}
if ($version > 190) {
// Firefox 3.5
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = true;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = true;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
if ($version > 191) {
// Firefox 3.6
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = true;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = true;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
}
private function setWebkit($version) {
$browsersup = &self::$browserSupport;
self::$renderingEngine = "Webkit";
self::$renderingEngineVersion = $version;
if ($version < 527) {
// Chrome 1.0, Safari 3
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = false;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = false;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
if ($version > 527) {
// Chrome 2.0, Safari 4.0
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = true;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = true;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = true;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
if ($version > 530) {
// Chrome 3.0
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = true;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = true;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = true;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = true;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
}
private function setPresto($version) {
$browsersup = &self::$browserSupport;
self::$renderingEngine = "Presto";
self::$renderingEngineVersion = $version;
if ($version < 98) {
// Opera pre-10
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = true;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = false;
$browsersup["AdvancedColorSupport"] = false;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = false;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = false;
$browsersup["FontLinkingSupport"] = false;
}
if ($version == 98) {
// Opera 10
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = true;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = false;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
if ($version > 98) {
// Opera post-10
$browsersup["HTML5Support"] = true;
$browsersup["HTML5StyleSupport"] = true;
$browsersup["HTML5FormSupport"] = true;
$browsersup["CSS21Support"] = true;
$browsersup["CSS3Support"] = true;
$browsersup["AdvancedColorSupport"] = true;
$browsersup["JSONSupport"] = false;
$browsersup["SVGSupport"] = true;
$browsersup["PNGSupport"] = false;
$browsersup["CrossDocMessagingSupport"] = true;
$browsersup["DragDropSupport"] = false;
$browsersup["ContentEditableSupport"] = true;
$browsersup["CanvasSupport"] = true;
$browsersup["AudioVideoSupport"] = true;
$browsersup["ElementsByClassNameSupport"] = true;
$browsersup["FontLinkingSupport"] = true;
}
}
/* In order to identify the rendering engine so that we
know what features it doesn't support, we have to parse
the user-agent string for the rendering engine and its
version. */
private function parseUAString() {
$string = &self::$userAgentString;
// the user-agent string.
$relevantlocation = -1;
// the part of the UA String relevant to identifying
// the rendering engine.
$version = 0;
// the version of the rendering engine.
if (($relevantlocation = strpos($string, "Opera")) === 0) {
$preparseversion = substr($string,
$relevantlocation + 6,
strpos($string, " ", $relevantlocation)
- ($relevantlocation + 6));
$version = $preparseversion[0] * 10 + $preparseversion[2];
self::setPresto($version);
return;
}
if (($relevantlocation = strpos($string, "WebKit")) > 0) {
$version = substr($string, $relevantlocation + 7, 3);
self::setWebkit($version);
return;
}
if (($relevantlocation = strpos($string, "Gecko")) > 0) {
$preparseversion = substr($string,
strpos($string, "rv:") + 3,
5);
$version = $preparseversion[0] * 100 + $preparseversion[2] * 10 +
$preparseversion[4];
self::setGecko($version);
return;
}
if (($relevantlocation = strpos($string, "MSIE")) > 0) {
$version = substr($string, $relevantlocation + 5, 1);
self::setTrident($version);
return;
}
}
/* Prints the array of values the browser is determined to support. */
public function printTable() {
echo "<p>I recognize you as " . self::$renderingEngine . " " . self::$renderingEngineVersion . ". I think you support: </p>";
print_r(self::$browserSupport);
}
/* Returns a value from the array. */
public function checkFeature($feature) {
return self::$browserSupport[$feature];
}
}
?>