Skip to content

Commit

Permalink
Merge pull request #78 from cbschuld/palemoon
Browse files Browse the repository at this point in the history
added palemoon
  • Loading branch information
cbschuld authored Jul 8, 2019
2 parents f48bdc9 + fd6374a commit bc3e602
Show file tree
Hide file tree
Showing 7 changed files with 677 additions and 93 deletions.
23 changes: 22 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,25 @@ changes when it socially makes sense.
## 0.0.3 - 2009-02-19
### Fixed
* updated typical usage to show a correct example! (thanks David!)

* Updated the version detection for Amaya
* Updated the version detection for Firefox
* Updated the version detection for Lynx
* Updated the version detection for WebTV
* Updated the version detection for NetPositive
* Updated the version detection for IE
* Updated the version detection for OmniWeb
* Updated the version detection for iCab
* Updated the version detection for Safari
* Updated Safari to remove mobile devices (iPhone)
### Added
* Added version detectionf for edge via [pixelbacon](https://github.com/pixelbacon)
* Added detection for Chrome
* Added detection for iPhone
* Added detection for robots
* Added detection for mobile devices
* Added detection for BlackBerry
* Added detection for iPhone
* Added detection for iPad
* Added detection for Android
### Removed
* Removed Netscape checks
159 changes: 71 additions & 88 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,106 +1,89 @@
Browser.php
=============
# cbschuld/browser.php

[![Build Status](https://travis-ci.org/cbschuld/Browser.php.png?branch=master)](https://travis-ci.org/cbschuld/Browser.php)

Helps detect the user's browser and platform at the PHP level via the user agent


Installation
============
## Installation

To install, simply `require` the `Browser.php` file under `lib`.
You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/):

You can also install it via `Composer` by using the [Packagist archive](https://packagist.org/packages/cbschuld/browser.php).
composer require cbschuld/browser.php

If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:

Background
============
composer require --dev cbschuld/browser.php

Detecting the user's browser type and version is helpful in web applications that harness some of the newer bleeding edge concepts. With the browser type and version you can notify users about challenges they may experience and suggest they upgrade before using such application. Not a great idea on a large scale public site; but on a private application this type of check can be helpful.

In an active project of mine we have a pretty graphically intensive and visually appealing user interface which leverages a lot of transparent PNG files. Because we all know how great IE6 supports PNG files it was necessary for us to tell our users the lack of power their browser has in a kind way.

Searching for a way to do this at the PHP layer and not at the client layer was more of a challenge than I would have guessed; the only script available was written by Gary White and Gary no longer maintains this script because of reliability. I do agree 100% with Gary about the readability; however, there are realistic reasons to desire the user.s browser and browser version and if your visitor is not echoing a false user agent we can take an educated guess.

I based this solution off of Gary White.s original solution but added a few things:

I added the ability to view the return values as class constants to increase the readability

* Added version detectionf for edge via [pixelbacon](https://github.com/pixelbacon)
* Updated the version detection for Amaya
* Updated the version detection for Firefox
* Updated the version detection for Lynx
* Updated the version detection for WebTV
* Updated the version detection for NetPositive
* Updated the version detection for IE
* Updated the version detection for OmniWeb
* Updated the version detection for iCab
* Updated the version detection for Safari
* Added detection for Chrome
* Added detection for iPhone
* Added detection for robots
* Added detection for mobile devices
* Added detection for BlackBerry
* Added detection for iPhone
* Added detection for iPad
* Added detection for Android
* Removed Netscape checks
* Updated Safari to remove mobile devices (iPhone)

**This solution identifies the following Operating Systems:**

* Windows (Browser::PLATFORM_WINDOWS)
* Windows CE (Browser::PLATFORM_WINDOWS_CE)
* Apple (Browser::PLATFORM_APPLE)
* Linux (Browser::PLATFORM_LINUX)
* Android (Browser::PLATFORM_ANDROID)
* OS/2 (Browser::PLATFORM_OS2)
* BeOS (Browser::PLATFORM_BEOS)
* iPhone (Browser::PLATFORM_IPHONE)
* iPod (Browser::PLATFORM_IPOD)
* BlackBerry (Browser::PLATFORM_BLACKBERRY)
* FreeBSD (Browser::PLATFORM_FREEBSD)
* OpenBSD (Browser::PLATFORM_OPENBSD)
* NetBSD (Browser::PLATFORM_NETBSD)
* SunOS (Browser::PLATFORM_SUNOS)
* OpenSolaris (Browser::PLATFORM_OPENSOLARIS)
* iPad (Browser::PLATFORM_IPAD)

**This solution identifies the following Browsers and does a best-guess on the version:**

* Opera (Browser::BROWSER_OPERA)
* WebTV (Browser::BROWSER_WEBTV)
* NetPositive (Browser::BROWSER_NETPOSITIVE)
* Edge (Browser::BROWSER_EDGE)
* Internet Explorer (Browser::BROWSER_IE)
* Pocket Internet Explorer (Browser::BROWSER_POCKET_IE)
* Galeon (Browser::BROWSER_GALEON)
* Konqueror (Browser::BROWSER_KONQUEROR)
* iCab (Browser::BROWSER_ICAB)
* OmniWeb (Browser::BROWSER_OMNIWEB)
* Phoenix (Browser::BROWSER_PHOENIX)
* Firebird (Browser::BROWSER_FIREBIRD)
* Firefox (Browser::BROWSER_FIREFOX)
* Mozilla (Browser::BROWSER_MOZILLA)
* Amaya (Browser::BROWSER_AMAYA)
* Lynx (Browser::BROWSER_LYNX)
* Safari (Browser::BROWSER_SAFARI)
* iPhone (Browser::BROWSER_IPHONE)
* iPod (Browser::BROWSER_IPOD)
* Google.s Android(Browser::BROWSER_ANDROID)
* Google.s Chrome(Browser::BROWSER_CHROME)
* GoogleBot(Browser::BROWSER_GOOGLEBOT)
* Yahoo!.s Slurp(Browser::BROWSER_SLURP)
* W3C.s Validator(Browser::BROWSER_W3CVALIDATOR)
* BlackBerry(Browser::BROWSER_BLACKBERRY)

**Typical Usage:**
## Typical Usage:

```php
$browser = new Browser();
if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
echo 'You have FireFox version 2 or greater';
if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >=10 ) {
echo 'You have FireFox version 10 or greater';
}
```

## Browser Detection

This solution identifies the following Browsers and does a best-guess on the version:

* Opera (`Browser::BROWSER_OPERA`)
* WebTV (`Browser::BROWSER_WEBTV`)
* NetPositive (`Browser::BROWSER_NETPOSITIVE`)
* Edge (`Browser::BROWSER_EDGE`)
* Internet Explorer (`Browser::BROWSER_IE`)
* Pocket Internet Explorer (`Browser::BROWSER_POCKET_IE`)
* Galeon (`Browser::BROWSER_GALEON`)
* Konqueror (`Browser::BROWSER_KONQUEROR`)
* iCab (`Browser::BROWSER_ICAB`)
* OmniWeb (`Browser::BROWSER_OMNIWEB`)
* Phoenix (`Browser::BROWSER_PHOENIX`)
* Firebird (`Browser::BROWSER_FIREBIRD`)
* Firefox (`Browser::BROWSER_FIREFOX`)
* Mozilla (`Browser::BROWSER_MOZILLA`)
* Palemoon (`Browser::BROWSER_PALEMOON`)
* Amaya (`Browser::BROWSER_AMAYA`)
* Lynx (`Browser::BROWSER_LYNX`)
* Safari (`Browser::BROWSER_SAFARI`)
* iPhone (`Browser::BROWSER_IPHONE`)
* iPod (`Browser::BROWSER_IPOD`)
* Google.s Android(`Browser::BROWSER_ANDROID`)
* Google.s Chrome(`Browser::BROWSER_CHROME`)
* GoogleBot(`Browser::BROWSER_GOOGLEBOT`)
* Yahoo!.s Slurp(`Browser::BROWSER_SLURP`)
* W3C.s Validator(`Browser::BROWSER_W3CVALIDATOR`)
* BlackBerry(`Browser::BROWSER_BLACKBERRY`)

## Operating System Detection

This solution identifies the following Operating Systems:

* Windows (`Browser::PLATFORM_WINDOWS`)
* Windows CE (`Browser::PLATFORM_WINDOWS_CE`)
* Apple (`Browser::PLATFORM_APPLE`)
* Linux (`Browser::PLATFORM_LINUX`)
* Android (`Browser::PLATFORM_ANDROID`)
* OS/2 (`Browser::PLATFORM_OS2`)
* BeOS (`Browser::PLATFORM_BEOS`)
* iPhone (`Browser::PLATFORM_IPHONE`)
* iPod (`Browser::PLATFORM_IPOD`)
* BlackBerry (`Browser::PLATFORM_BLACKBERRY`)
* FreeBSD (`Browser::PLATFORM_FREEBSD`)
* OpenBSD (`Browser::PLATFORM_OPENBSD`)
* NetBSD (`Browser::PLATFORM_NETBSD`)
* SunOS (`Browser::PLATFORM_SUNOS`)
* OpenSolaris (`Browser::PLATFORM_OPENSOLARIS`)
* iPad (`Browser::PLATFORM_IPAD`)

## History and Legacy

Detecting the user's browser type and version is helpful in web applications that harness some of the newer bleeding edge concepts. With the browser type and version you can notify users about challenges they may experience and suggest they upgrade before using such application. Not a great idea on a large scale public site; but on a private application this type of check can be helpful.

In an active project of mine we have a pretty graphically intensive and visually appealing user interface which leverages a lot of transparent PNG files. Because we all know how great IE6 supports PNG files it was necessary for us to tell our users the lack of power their browser has in a kind way.

Searching for a way to do this at the PHP layer and not at the client layer was more of a challenge than I would have guessed; the only script available was written by Gary White and Gary no longer maintains this script because of reliability. I do agree 100% with Gary about the readability; however, there are realistic reasons to desire the user.s browser and browser version and if your visitor is not echoing a false user agent we can take an educated guess.

I based this solution off of Gary White's original work but have since replaced all of his original code. Either way, thank you to Gary. Sadly, I never was able to get in touch with him regarding this soludion.

26 changes: 26 additions & 0 deletions lib/Browser.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class Browser
const BROWSER_OMNIWEB = 'OmniWeb'; // http://www.omnigroup.com/applications/omniweb/
const BROWSER_FIREBIRD = 'Firebird'; // http://www.ibphoenix.com/
const BROWSER_FIREFOX = 'Firefox'; // http://www.mozilla.com/en-US/firefox/firefox.html
const BROWSER_PALEMOON = 'Palemoon'; // https://www.palemoon.org/
const BROWSER_ICEWEASEL = 'Iceweasel'; // http://www.geticeweasel.org/
const BROWSER_SHIRETOKO = 'Shiretoko'; // http://wiki.mozilla.org/Projects/shiretoko
const BROWSER_MOZILLA = 'Mozilla'; // http://www.mozilla.com/en-US/
Expand Down Expand Up @@ -426,6 +427,7 @@ protected function checkBrowsers()
$this->checkBrowserNetscapeNavigator9Plus() ||
$this->checkBrowserVivaldi() ||
$this->checkBrowserYandex() ||
$this->checkBrowserPalemoon() ||
$this->checkBrowserFirefox() ||
$this->checkBrowserChrome() ||
$this->checkBrowserOmniWeb() ||
Expand Down Expand Up @@ -1265,6 +1267,30 @@ protected function checkBrowserNokia()
return false;
}

/**
* Determine if the browser is Palemoon or not
* @return boolean True if the browser is Palemoon otherwise false
*/
protected function checkBrowserPalemoon()
{
if (stripos($this->_agent, 'safari') === false) {
if (preg_match("/Palemoon[\/ \(]([^ ;\)]+)/i", $this->_agent, $matches)) {
$this->setVersion($matches[1]);
$this->setBrowser(self::BROWSER_PALEMOON);
return true;
} else if (preg_match("/Palemoon([0-9a-zA-Z\.]+)/i", $this->_agent, $matches)) {
$this->setVersion($matches[1]);
$this->setBrowser(self::BROWSER_PALEMOON);
return true;
} else if (preg_match("/Palemoon/i", $this->_agent, $matches)) {
$this->setVersion('');
$this->setBrowser(self::BROWSER_PALEMOON);
return true;
}
}
return false;
}

/**
* Determine if the browser is Firefox or not (last updated 1.7)
* @return boolean True if the browser is Firefox otherwise false
Expand Down
6 changes: 3 additions & 3 deletions tests/ChromeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
final class ChromeTest extends TestCase
{
/**
* @dataProvider userAgentFirefoxProvider
* @dataProvider userAgentChromeProvider
* @param $userAgent string Browser's User Agent
* @param $type string Type of the Browser
* @param $browser string Name of the Browser
Expand All @@ -18,15 +18,15 @@ final class ChromeTest extends TestCase
* @param $osVersionName string Version of the Operating System (name)
* @param $osVersionNumber string Version of the Operating System (number)
*/
public function testFirefoxUserAgent($userAgent,$type,$browser,$version,$osType,$osName,$osVersionName,$osVersionNumber)
public function testChromeUserAgent($userAgent,$type,$browser,$version,$osType,$osName,$osVersionName,$osVersionNumber)
{
$b = new Browser($userAgent);

$this->assertSame($browser, $b->getBrowser());
$this->assertSame($version, $b->getVersion());
}

public function userAgentFirefoxProvider()
public function userAgentChromeProvider()
{
return new TabDelimitedFileIterator(dirname(__FILE__).'/lists/chrome.txt');
}
Expand Down
2 changes: 1 addition & 1 deletion tests/FirefoxTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

require_once dirname(__FILE__)."/TabDelimitedFileIterator.php";

final class MozillaTest extends TestCase
final class FirefoxTest extends TestCase
{
/**
* @dataProvider userAgentFirefoxProvider
Expand Down
33 changes: 33 additions & 0 deletions tests/PalemoonTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php
declare(strict_types=1);

use PHPUnit\Framework\TestCase;

require_once dirname(__FILE__)."/TabDelimitedFileIterator.php";

final class PalemoonTest extends TestCase
{
/**
* @dataProvider userAgentPalemoonProvider
* @param $userAgent string Browser's User Agent
* @param $type string Type of the Browser
* @param $browser string Name of the Browser
* @param $version string Version of the Browser
* @param $osType string Type of operating system associated with the Browser
* @param $osName string Name of the operating system associated with the Browser, typically has the version number
* @param $osVersionName string Version of the Operating System (name)
* @param $osVersionNumber string Version of the Operating System (number)
*/
public function testPalemoonUserAgent($userAgent,$type,$browser,$version,$osType,$osName,$osVersionName,$osVersionNumber)
{
$b = new Browser($userAgent);

$this->assertSame($browser, $b->getBrowser());
$this->assertSame($version, $b->getVersion());
}

public function userAgentPalemoonProvider()
{
return new TabDelimitedFileIterator(dirname(__FILE__).'/lists/palemoon.txt');
}
}
Loading

0 comments on commit bc3e602

Please sign in to comment.