browser-2.2.0/0000755000004100000410000000000012732547074013241 5ustar www-datawww-databrowser-2.2.0/Rakefile0000644000004100000410000000104012732547074014701 0ustar www-datawww-datarequire "bundler" require "bundler/setup" Bundler::GemHelper.install_tasks require "rake/testtask" Rake::TestTask.new(:test) do |t| t.libs << "lib" t.libs << "test" t.test_files = FileList["test/**/*_test.rb"] t.verbose = true t.warning = false t.ruby_opts = %w[-rubygems] end desc "Run specs against all gemfiles" task "test:all" do %w[ Gemfile gemfiles/rails3.gemfile ].each do |gemfile| puts "=> Running with Gemfile: #{gemfile}" system "BUNDLE_GEMFILE=#{gemfile} rake test" end end task default: "test" browser-2.2.0/bin/0000755000004100000410000000000012732547074014011 5ustar www-datawww-databrowser-2.2.0/bin/rake0000755000004100000410000000055412732547074014665 0ustar www-datawww-data#!/usr/bin/env ruby # # This file was generated by Bundler. # # The application 'rake' is installed as part of a gem, and # this file is here to facilitate running it. # require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath) require "rubygems" require "bundler/setup" load Gem.bin_path("rake", "rake") browser-2.2.0/Gemfile0000644000004100000410000000004512732547074014533 0ustar www-datawww-datasource "http://rubygems.org" gemspec browser-2.2.0/languages.yml0000644000004100000410000000466312732547074015743 0ustar www-datawww-data"af": "Afrikaans" "sq": "Albanian" "eu": "Basque" "bg": "Bulgarian" "be": "Byelorussian" "ca": "Catalan" "zh": "Chinese" "zh-CN": "Chinese/China" "zh-TW": "Chinese/Taiwan" "zh-HK": "Chinese/Hong Kong" "zh-SG": "Chinese/singapore" "hr": "Croatian" "cs": "Czech" "da": "Danish" "nl": "Dutch" "nl-NL": "Dutch/Netherlands" "nl-BE": "Dutch/Belgium" "en": "English" "en-GB": "English/United Kingdom" "en-US": "English/United States" "en-AU": "English/Australian" "en-CA": "English/Canada" "en-NZ": "English/New Zealand" "en-IE": "English/Ireland" "en-ZA": "English/South Africa" "en-JM": "English/Jamaica" "en-BZ": "English/Belize" "en-TT": "English/Trinidad" "et": "Estonian" "fo": "Faeroese" "fa": "Farsi" "fi": "Finnish" "fr": "French" "fr-BE": "French/Belgium" "fr-FR": "French/France" "fr-CH": "French/Switzerland" "fr-CA": "French/Canada" "fr-LU": "French/Luxembourg" "gl": "Galician" "de": "German" "de-AT": "German/Austria" "de-DE": "German/Germany" "de-CH": "German/Switzerland" "de-LU": "German/Luxembourg" "de-LI": "German/Liechtenstein" "el": "Greek" "he": "Hebrew" "he-IL": "Hebrew/Israel" "hi": "Hindi" "hu": "Hungarian" "ie-EE": "Internet Explorer/Easter Egg" "is": "Icelandic" "id": "Indonesian" "in": "Indonesian" "ga": "Irish" "it": "Italian" "it-CH": "Italian/ Switzerland" "ja": "Japanese" "km": "Khmer" "km-KH": "Khmer/Cambodia" "ko": "Korean" "lv": "Latvian" "lt": "Lithuanian" "mk": "Macedonian" "ms": "Malaysian" "mt": "Maltese" "no": "Norwegian" "pl": "Polish" "pt": "Portuguese" "pt-BR": "Portuguese/Brazil" "rm": "Rhaeto-Romanic" "ro": "Romanian" "ro-MO": "Romanian/Moldavia" "ru": "Russian" "ru-MO": "Russian /Moldavia" "gd": "Scots Gaelic" "sr": "Serbian" "sk": "Slovack" "sl": "Slovenian" "sb": "Sorbian" "es": "Spanish" "es-DO": "Spanish" "es-AR": "Spanish/Argentina" "es-CO": "Spanish/Colombia" "es-MX": "Spanish/Mexico" "es-ES": "Spanish/Spain" "es-GT": "Spanish/Guatemala" "es-CR": "Spanish/Costa Rica" "es-PA": "Spanish/Panama" "es-VE": "Spanish/Venezuela" "es-PE": "Spanish/Peru" "es-EC": "Spanish/Ecuador" "es-CL": "Spanish/Chile" "es-UY": "Spanish/Uruguay" "es-PY": "Spanish/Paraguay" "es-BO": "Spanish/Bolivia" "es-SV": "Spanish/El salvador" "es-HN": "Spanish/Honduras" "es-NI": "Spanish/Nicaragua" "es-PR": "Spanish/Puerto Rico" "sx": "Sutu" "sv": "Swedish" "sv-SE": "Swedish/Sweden" "sv-FI": "Swedish/Finland" "ts": "Thai" "tn": "Tswana" "tr": "Turkish" "uk": "Ukrainian" "ur": "Urdu" "vi": "Vietnamese" "xh": "Xshosa" "ji": "Yiddish" "zu": "Zulu" browser-2.2.0/.hound.yml0000644000004100000410000000274612732547074015170 0ustar www-datawww-dataStyle/ClassCheck: EnforcedStyle: kind_of? Metrics/LineLength: Max: 80 Style/BlockDelimiters: Enabled: false Style/RegexpLiteral: Enabled: false Metrics/AbcSize: Enabled: false Style/PerlBackrefs: Enabled: false ClassLength: Enabled: false CyclomaticComplexity: Enabled: false Documentation: Enabled: false Encoding: Enabled: false FileName: Enabled: false IfUnlessModifier: Enabled: false MethodLength: Enabled: false ModuleFunction: Enabled: false OneLineConditional: Enabled: false ParameterLists: Enabled: false Proc: Enabled: false SingleLineBlockParams: Enabled: false VariableInterpolation: Enabled: false TrailingComma: Enabled: false WhileUntilModifier: Enabled: false PredicateName: NamePrefixBlacklist: - is_ StringLiterals: EnforcedStyle: double_quotes SupportedStyles: - single_quotes - double_quotes DotPosition: EnforcedStyle: leading SpaceBeforeBlockBraces: EnforcedStyle: space SpaceInsideBlockBraces: EnforcedStyle: no_space DoubleNegation: Enabled: false SpaceInsideBlockBraces: SpaceBeforeBlockParameters: false SpaceInsideHashLiteralBraces: Enabled: false PercentLiteralDelimiters: PreferredDelimiters: '%': '[]' '%i': '[]' '%q': '[]' '%Q': '[]' '%r': '[]' '%s': '[]' '%w': '[]' '%W': '[]' '%x': '[]' Style/CollectionMethods: PreferredMethods: collect: 'map' collect!: 'map!' inject: 'reduce' detect: 'find' find_all: 'select' browser-2.2.0/.travis.yml0000644000004100000410000000056512732547074015360 0ustar www-datawww-datalanguage: ruby sudo: false cache: bundler rvm: - '2.3.1' - '2.2' - '2.1' gemfile: - Gemfile - gemfiles/rails3.gemfile script: bundle exec rake notifications: email: false env: global: secure: egPPk/jMVzOoZGkk8jcf1f1N++oI4p4hqtk53T2kpHChxpmR8sP/oFlAhebvqMhM8svbQx+lWTvdxPDj9GBQGsC4ekqubV6S0MNJQS4/F41PSEU+DFUzNU1PHiDO+/0AbIheTj15UIt8IC4NVaM236HuSdMDWOjVI3ydBsgJ/GY= browser-2.2.0/lib/0000755000004100000410000000000012732547074014007 5ustar www-datawww-databrowser-2.2.0/lib/browser.rb0000644000004100000410000000454012732547074016022 0ustar www-datawww-data# frozen_string_literal: true require "set" require "yaml" require "pathname" require "browser/version" require "browser/detect_version" require "browser/accept_language" require "browser/base" require "browser/safari" require "browser/chrome" require "browser/internet_explorer" require "browser/firefox" require "browser/edge" require "browser/opera" require "browser/blackberry" require "browser/generic" require "browser/phantom_js" require "browser/uc_browser" require "browser/nokia" require "browser/micro_messenger" require "browser/weibo" require "browser/qq" require "browser/bot" require "browser/middleware" require "browser/rails" if defined?(::Rails) require "browser/platform" require "browser/device" require "browser/meta" module Browser EMPTY_STRING = "".freeze def self.root @root ||= Pathname.new(File.expand_path("../..", __FILE__)) end # Hold the list of browser matchers. # Order is important. def self.matchers @matchers ||= [ Nokia, UCBrowser, PhantomJS, BlackBerry, Opera, Edge, InternetExplorer, Firefox, Weibo, # must be placed before Chrome and Safari QQ, # must be placed before Chrome and Safari Chrome, Safari, MicroMessenger, Generic ] end # Define the rules which define a modern browser. # A rule must be a proc/lambda or any object that implements the method # === and accepts the browser object. # # To redefine all rules, clear the existing rules before adding your own. # # # Only Chrome Canary is considered modern. # Browser.modern_rules.clear # Browser.modern_rules << -> b { b.chrome? && b.version >= "37" } # def self.modern_rules @modern_rules ||= [] end modern_rules.tap do |rules| rules << -> (b) { b.webkit? } rules << -> (b) { b.firefox? && b.version.to_i >= 17 } rules << -> (b) { b.ie? && b.version.to_i >= 9 && !b.compatibility_view? } rules << -> (b) { b.edge? && !b.compatibility_view? } rules << -> (b) { b.opera? && b.version.to_i >= 12 } rules << -> (b) { b.firefox? && b.device.tablet? && b.platform.android? && b.version.to_i >= 14 } # rubocop:disable Metrics/LineLength end def self.new(user_agent, **kwargs) matchers .map {|klass| klass.new(user_agent || EMPTY_STRING, **kwargs) } .find(&:match?) end end browser-2.2.0/lib/browser/0000755000004100000410000000000012732547074015472 5ustar www-datawww-databrowser-2.2.0/lib/browser/middleware/0000755000004100000410000000000012732547074017607 5ustar www-datawww-databrowser-2.2.0/lib/browser/middleware/context/0000755000004100000410000000000012732547074021273 5ustar www-datawww-databrowser-2.2.0/lib/browser/middleware/context/additions.rb0000644000004100000410000000052212732547074023575 0ustar www-datawww-data# frozen_string_literal: true require "browser/middleware/context/url_methods" module Browser class Middleware class Context module Additions extend ActiveSupport::Concern included do include Rails.application.routes.url_helpers include UrlMethods end end end end end browser-2.2.0/lib/browser/middleware/context/url_methods.rb0000644000004100000410000000050312732547074024143 0ustar www-datawww-data# frozen_string_literal: true module Browser class Middleware class Context module UrlMethods def default_url_options Rails.configuration.browser.default_url_options || Rails.configuration.action_mailer.default_url_options || {} end end end end end browser-2.2.0/lib/browser/middleware/context.rb0000644000004100000410000000064112732547074021621 0ustar www-datawww-data# frozen_string_literal: true module Browser class Middleware class Context attr_reader :browser, :request def initialize(request) @request = request @browser = Browser.new( request.user_agent, accept_language: request.env["HTTP_ACCEPT_LANGUAGE"] ) end def redirect_to(path) throw :redirected, path.to_s end end end end browser-2.2.0/lib/browser/device.rb0000644000004100000410000001316312732547074017262 0ustar www-datawww-data# frozen_string_literal: true require "browser/device/base" require "browser/device/unknown" require "browser/device/ipad" require "browser/device/ipod_touch" require "browser/device/iphone" require "browser/device/playstation3" require "browser/device/playstation4" require "browser/device/psp" require "browser/device/psvita" require "browser/device/kindle" require "browser/device/kindle_fire" require "browser/device/wii" require "browser/device/wiiu" require "browser/device/blackberry_playbook" require "browser/device/surface" require "browser/device/tv" require "browser/device/xbox_one" require "browser/device/xbox_360" module Browser class Device attr_reader :ua # Hold the list of device matchers. # Order is important. def self.matchers @matchers ||= [ XboxOne, Xbox360, Surface, TV, BlackBerryPlaybook, WiiU, Wii, KindleFire, Kindle, PlayStation4, PlayStation3, PSVita, PSP, Iphone, Ipad, IpodTouch, Unknown ] end def initialize(ua) @ua = ua end def subject @subject ||= self.class.matchers .map {|matcher| matcher.new(ua) } .find(&:match?) end def id subject.id end def name subject.name end # Detect if browser is tablet (currently iPad, Android, Surface or # Playbook). def tablet? ipad? || (platform.android? && !detect_mobile?) || surface? || playbook? end # Detect if browser is mobile. def mobile? detect_mobile? && !tablet? end def ipad? id == :ipad end def unknown? id == :unknown end def ipod_touch? id == :ipod_touch end alias_method :ipod?, :ipod_touch? def iphone? id == :iphone end def ps3? id == :ps3 end alias_method :playstation3?, :ps3? def ps4? id == :ps4 end alias_method :playstation4?, :ps4? alias_method :playstation4?, :ps4? def psp? id == :psp end def playstation_vita? id == :psvita end alias_method :vita?, :playstation_vita? alias_method :psp_vita?, :playstation_vita? def kindle? id == :kindle || kindle_fire? end def kindle_fire? id == :kindle_fire end def nintendo_wii? id == :wii end alias_method :wii?, :nintendo_wii? def nintendo_wiiu? id == :wiiu end alias_method :wiiu?, :nintendo_wiiu? def blackberry_playbook? id == :playbook end alias_method :playbook?, :blackberry_playbook? def surface? id == :surface end def tv? id == :tv end # Detect if browser is Silk. def silk? ua =~ /Silk/ end # Detect if browser is running under Xbox. def xbox? ua =~ /Xbox/ end # Detect if browser is running under Xbox 360. def xbox_360? id == :xbox_360 end # Detect if browser is running under Xbox One. def xbox_one? id == :xbox_one end # Detect if browser is running under PlayStation. def playstation? ps3? || ps4? end # Detect if browser is Nintendo. def nintendo? wii? || wiiu? end # Detect if browser is console (currently Xbox, PlayStation, or Nintendo). def console? xbox? || playstation? || nintendo? end private # Regex taken from http://detectmobilebrowsers.com # rubocop:disable Metrics/LineLength def detect_mobile? psp? || /zunewp7/i.match(ua) || /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.match(ua) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.match(ua[0..3]) end # rubocop:enable Metrics/LineLength def platform @platform ||= Platform.new(ua) end end end browser-2.2.0/lib/browser/meta.rb0000644000004100000410000000064112732547074016746 0ustar www-datawww-data# frozen_string_literal: true require "browser/meta/base" require "browser/meta/generic_browser" require "browser/meta/id" require "browser/meta/ie" require "browser/meta/ios" require "browser/meta/mobile" require "browser/meta/modern" require "browser/meta/platform" require "browser/meta/proxy" require "browser/meta/safari" require "browser/meta/webkit" require "browser/meta/tablet" require "browser/meta/device" browser-2.2.0/lib/browser/phantom_js.rb0000644000004100000410000000043012732547074020156 0ustar www-datawww-data# frozen_string_literal: true module Browser class PhantomJS < Base def id :phantom_js end def name "PhantomJS" end def full_version ua[%r[PhantomJS/([\d.]+)], 1] || "0.0" end def match? ua =~ /PhantomJS/ end end end browser-2.2.0/lib/browser/meta/0000755000004100000410000000000012732547074016420 5ustar www-datawww-databrowser-2.2.0/lib/browser/meta/webkit.rb0000644000004100000410000000024212732547074020230 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Webkit < Base def meta "webkit" if browser.webkit? end end end end browser-2.2.0/lib/browser/meta/id.rb0000644000004100000410000000021512732547074017337 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Id < Base def meta browser.id end end end end browser-2.2.0/lib/browser/meta/device.rb0000644000004100000410000000023012732547074020177 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Device < Base def meta browser.device.id end end end end browser-2.2.0/lib/browser/meta/modern.rb0000644000004100000410000000024212732547074020227 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Modern < Base def meta "modern" if browser.modern? end end end end browser-2.2.0/lib/browser/meta/proxy.rb0000644000004100000410000000023712732547074020130 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Proxy < Base def meta "proxy" if browser.proxy? end end end end browser-2.2.0/lib/browser/meta/generic_browser.rb0000644000004100000410000000044412732547074022126 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class GenericBrowser < Base def meta "#{browser.id} #{browser.id}#{browser.version}" if generic? end private def generic? !browser.safari? && !browser.chrome? end end end end browser-2.2.0/lib/browser/meta/ios.rb0000644000004100000410000000024212732547074017535 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class IOS < Base def meta "ios" if browser.platform.ios? end end end end browser-2.2.0/lib/browser/meta/ie.rb0000644000004100000410000000055312732547074017345 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class IE < Base def version @version ||= browser.version.to_i end def meta return unless browser.ie? meta = [] meta << "oldie lt-ie8 lt-ie9" if version < 8 meta << "lt-ie9" if version == 8 meta.join(" ") end end end end browser-2.2.0/lib/browser/meta/platform.rb0000644000004100000410000000023412732547074020570 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Platform < Base def meta browser.platform.id end end end end browser-2.2.0/lib/browser/meta/safari.rb0000644000004100000410000000027312732547074020214 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Safari < Base def meta "safari safari#{browser.version}" if browser.safari? end end end end browser-2.2.0/lib/browser/meta/base.rb0000644000004100000410000000131612732547074017660 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta def self.rules @rules ||= [ Device, GenericBrowser, Id, IE, IOS, Mobile, Modern, Platform, Proxy, Safari, Tablet, Webkit ] end def self.get(browser) rules.each_with_object(Set.new) do |rule, meta| meta.merge(rule.new(browser).to_a) end.to_a end class Base # Set the browser instance. attr_reader :browser def initialize(browser) @browser = browser end def meta nil end def to_a meta.to_s.squeeze(" ").split(" ") end end end end browser-2.2.0/lib/browser/meta/tablet.rb0000644000004100000410000000025112732547074020216 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Tablet < Base def meta "tablet" if browser.device.tablet? end end end end browser-2.2.0/lib/browser/meta/mobile.rb0000644000004100000410000000025112732547074020212 0ustar www-datawww-data# frozen_string_literal: true module Browser module Meta class Mobile < Base def meta "mobile" if browser.device.mobile? end end end end browser-2.2.0/lib/browser/qq.rb0000644000004100000410000000050012732547074016433 0ustar www-datawww-data# frozen_string_literal: true module Browser class QQ < Base def id :qq end def name "QQ Browser" end def full_version ua[%r[(?:Mobile MQQBrowser)/([\d.]+)]i, 1] || ua[%r[(?:QQ)/([\d.]+)]i, 1] || "0.0" end def match? ua =~ /QQ/i end end end browser-2.2.0/lib/browser/uc_browser.rb0000644000004100000410000000043012732547074020166 0ustar www-datawww-data# frozen_string_literal: true module Browser class UCBrowser < Base def id :uc_browser end def name "UCBrowser" end def full_version ua[%r[UCBrowser/([\d.]+)], 1] || "0.0" end def match? ua =~ /UCBrowser/ end end end browser-2.2.0/lib/browser/bot.rb0000644000004100000410000000253312732547074016606 0ustar www-datawww-data# frozen_string_literal: true module Browser class Bot def self.detect_empty_ua! @detect_empty_ua = true end def self.detect_empty_ua? @detect_empty_ua end def self.bots @bots ||= YAML.load_file(Browser.root.join("bots.yml")) end def self.bot_exceptions @bot_exceptions ||= YAML .load_file(Browser.root.join("bot_exceptions.yml")) end def self.search_engines @search_engines ||= YAML .load_file(Browser.root.join("search_engines.yml")) end attr_reader :ua def initialize(ua) @ua = ua end def bot? bot_with_empty_ua? || (!bot_exception? && detect_bot?) end def search_engine? self.class.search_engines.any? {|key, _| downcased_ua.include?(key) } end def name return unless bot? return "Generic Bot" if bot_with_empty_ua? self.class.bots.find {|key, _| downcased_ua.include?(key) }.last end private def bot_with_empty_ua? self.class.detect_empty_ua? && ua.strip == "" end def bot_exception? self.class.bot_exceptions.any? {|key| downcased_ua.include?(key) } end def detect_bot? self.class.bots.any? {|key, _| downcased_ua.include?(key) } end def downcased_ua @downcased_ua ||= ua.downcase end end end browser-2.2.0/lib/browser/generic.rb0000644000004100000410000000102212732547074017426 0ustar www-datawww-data# frozen_string_literal: true module Browser class Generic < Base NAMES = { "QuickTime" => "QuickTime", "CoreMedia" => "Apple CoreMedia" } def id :generic end def name infer_name || "Generic Browser" end def full_version ua[%r[(?:QuickTime)/([\d.]+)], 1] || ua[%r[CoreMedia v([\d.]+)], 1] || "0.0" end def match? true end private def infer_name (NAMES.find {|key, _| ua.include?(key) } || []).last end end end browser-2.2.0/lib/browser/micro_messenger.rb0000644000004100000410000000046612732547074021206 0ustar www-datawww-data# frozen_string_literal: true module Browser class MicroMessenger < Base def id :micro_messenger end def name "MicroMessenger" end def full_version ua[%r[(?:MicroMessenger)/([\d.]+)]i, 1] || "0.0" end def match? ua =~ /MicroMessenger/i end end endbrowser-2.2.0/lib/browser/opera.rb0000644000004100000410000000044612732547074017131 0ustar www-datawww-data# frozen_string_literal: true module Browser class Opera < Base def id :opera end def name "Opera" end def full_version ua[%r[OPR/([\d.]+)], 1] || ua[%r[Version/([\d.]+)], 1] || "0.0" end def match? ua =~ /(Opera|OPR)/ end end end browser-2.2.0/lib/browser/blackberry.rb0000644000004100000410000000053012732547074020135 0ustar www-datawww-data# frozen_string_literal: true module Browser class BlackBerry < Base def id :blackberry end def name "BlackBerry" end def full_version ua[%r[BlackBerry[\da-z]+/([\d.]+)], 1] || ua[%r[Version/([\d.]+)], 1] || "0.0" end def match? ua =~ /BlackBerry|BB10/ end end end browser-2.2.0/lib/browser/version.rb0000644000004100000410000000010512732547074017500 0ustar www-datawww-data# frozen_string_literal: true module Browser VERSION = "2.2.0" end browser-2.2.0/lib/browser/middleware.rb0000644000004100000410000000277312732547074020145 0ustar www-datawww-data# frozen_string_literal: true require "uri" require "browser/middleware/context" module Browser class Middleware # Detect the most common assets. ASSETS_REGEX = /\.(css|png|jpe?g|gif|js|svg|ico|flv|mov|m4v|ogg|swf)\z/i # Detect the ACCEPT header. IE8 send */*. ACCEPT_REGEX = %r[(text/html|\*/\*)] def initialize(app, &block) fail ArgumentError, "Browser::Middleware requires a block" unless block @app = app @block = block end def call(env) request = Rack::Request.new(env) # Only apply verification on HTML requests. # This ensures that images, CSS and JavaScript # will be rendered. return run_app(env) unless process?(request) path = catch(:redirected) do Context.new(request).instance_eval(&@block) end # No path, no match. return run_app(env) unless path resolve_redirection(env, request.path, path) end def resolve_redirection(env, current_path, path) uri = URI.parse(path) if uri.path == current_path run_app(env) else redirect(path) end end def redirect(path) [302, {"Content-Type" => "text/html", "Location" => path}, []] end def run_app(env) @app.call(env) end def process?(request) html?(request) && !assets?(request) end def html?(request) request.env["HTTP_ACCEPT"].to_s.match(ACCEPT_REGEX) end def assets?(request) request.path.match(ASSETS_REGEX) end end end browser-2.2.0/lib/browser/accept_language.rb0000644000004100000410000000212212732547074021116 0ustar www-datawww-data# frozen_string_literal: true module Browser class AcceptLanguage def self.languages @languages ||= YAML.load_file(Browser.root.join("languages.yml")) end def self.parse(accept_language) return [] unless accept_language accept_language .split(",") .map {|string| string.squeeze(" ").strip } .map {|part| new(part) } .reject {|al| al.quality.zero? } .sort_by(&:quality) .reverse end attr_reader :part def initialize(part) @part = part end def full @full ||= [code, region].compact.join("-") end def name self.class.languages[full] || self.class.languages[code] end def code @code ||= part[/\A([^-;]+)/, 1] end def region @region ||= begin region = part[/\A(?:.*?)-([^;-]+)/, 1] region.upcase if region end end def quality @quality ||= Float(quality_value || 1.0) end private def quality_value qvalue = part[/;q=([\d.]+)/, 1] qvalue =~ /\A0\.0?\z/ ? "0.0" : qvalue end end end browser-2.2.0/lib/browser/chrome.rb0000644000004100000410000000073312732547074017277 0ustar www-datawww-data# frozen_string_literal: true module Browser class Chrome < Base def id :chrome end def name "Chrome" end def full_version # Each regex on its own line to enforce precedence. ua[%r[Chrome/([\d.]+)], 1] || ua[%r[CriOS/([\d.]+)], 1] || ua[%r[Safari/([\d.]+)], 1] || ua[%r[AppleWebKit/([\d.]+)], 1] || "0.0" end def match? ua =~ /Chrome|CriOS/ && !opera? && !edge? end end end browser-2.2.0/lib/browser/detect_version.rb0000644000004100000410000000107612732547074021040 0ustar www-datawww-data# frozen_string_literal: true module Browser module DetectVersion private def detect_version?(actual_version, expected_version) return true unless expected_version return false if expected_version && !actual_version expected_version = parse_version(expected_version) actual_version = parse_version(actual_version) Gem::Requirement.create(expected_version) .satisfied_by?(Gem::Version.create(actual_version)) end def parse_version(version) version.kind_of?(Numeric) ? "#{version}" : version end end end browser-2.2.0/lib/browser/platform.rb0000644000004100000410000000667412732547074017660 0ustar www-datawww-data# frozen_string_literal: true require "browser/platform/base" require "browser/platform/ios" require "browser/platform/linux" require "browser/platform/windows" require "browser/platform/mac" require "browser/platform/windows_phone" require "browser/platform/windows_mobile" require "browser/platform/firefox_os" require "browser/platform/blackberry" require "browser/platform/android" require "browser/platform/other" require "browser/platform/chrome_os" require "browser/platform/adobe_air" module Browser class Platform include DetectVersion attr_reader :ua # Hold the list of platform matchers. # Order is important. def self.matchers @matchers ||= [ AdobeAir, ChromeOS, WindowsMobile, WindowsPhone, Android, BlackBerry, IOS, Mac, FirefoxOS, Windows, Linux, Other ] end def initialize(ua) @ua = ua end def subject @subject ||= self.class.matchers .map {|matcher| matcher.new(ua) } .find(&:match?) end def adobe_air? id == :adobe_air end def chrome_os? id == :chrome_os end def android?(expected_version = nil) id == :android && detect_version?(version, expected_version) end def other? id == :other end def linux? id == :linux end def mac?(expected_version = nil) id == :mac && detect_version?(version, expected_version) end def windows?(expected_version = nil) id == :windows && detect_version?(version, expected_version) end def firefox_os? id == :firefox_os end def ios?(expected_version = nil) id == :ios && detect_version?(version, expected_version) end def blackberry?(expected_version = nil) id == :blackberry && detect_version?(version, expected_version) end def windows_phone?(expected_version = nil) id == :windows_phone && detect_version?(version, expected_version) end def windows_mobile?(expected_version = nil) id == :windows_mobile && detect_version?(version, expected_version) end def id subject.id end def version subject.version end def name subject.name end def to_s id.to_s end def ==(other) id == other end # Detect if running on iOS app webview. def ios_app? ios? && !ua.include?("Safari") end # Detect if is iOS webview. def ios_webview? ios_app? end # http://msdn.microsoft.com/fr-FR/library/ms537503.aspx#PltToken def windows_xp? windows? && ua =~ /Windows NT 5\.[12]/ end def windows_vista? windows? && ua =~ /Windows NT 6\.0/ end def windows7? windows? && ua =~ /Windows NT 6\.1/ end def windows8? windows? && ua =~ /Windows NT 6\.[2-3]/ end def windows8_1? windows? && ua =~ /Windows NT 6\.3/ end def windows10? windows? && ua =~ /Windows NT 10/ end def windows_rt? windows8? && ua =~ /ARM/ end # Detect if current platform is Windows in 64-bit architecture. def windows_x64? windows? && ua =~ /(Win64|x64|Windows NT 5\.2)/ end def windows_wow64? windows? && ua =~ /WOW64/i end def windows_x64_inclusive? windows_x64? || windows_wow64? end def windows_touchscreen_desktop? windows? && ua =~ /Touch/ end end end browser-2.2.0/lib/browser/platform/0000755000004100000410000000000012732547074017316 5ustar www-datawww-databrowser-2.2.0/lib/browser/platform/firefox_os.rb0000644000004100000410000000052412732547074022007 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class FirefoxOS < Base def version "0" end def name "Firefox OS" end def id :firefox_os end def match? ua !~ /(Android|Linux|BlackBerry|Windows|Mac)/ && ua =~ /Firefox/ end end end end browser-2.2.0/lib/browser/platform/blackberry.rb0000644000004100000410000000053212732547074021763 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class BlackBerry < Base def match? ua =~ /BB10|BlackBerry/ end def name "BlackBerry" end def id :blackberry end def version ua[%r[(?:Version|BlackBerry[\da-z]+)/([\d.]+)], 1] end end end end browser-2.2.0/lib/browser/platform/linux.rb0000644000004100000410000000043212732547074021001 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class Linux < Base def version "0" end def name "Generic Linux" end def id :linux end def match? ua =~ /Linux/ end end end end browser-2.2.0/lib/browser/platform/windows_mobile.rb0000644000004100000410000000046112732547074022665 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class WindowsMobile < Base def version "0" end def name "Windows Mobile" end def id :windows_mobile end def match? ua =~ /Windows CE/ end end end end browser-2.2.0/lib/browser/platform/ios.rb0000644000004100000410000000066112732547074020440 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class IOS < Base MATCHER = /(iPhone|iPad|iPod)/ VERSION_MATCHER = /OS ([\d.]+)/ def version ua[VERSION_MATCHER, 1] || "0" end def name "iOS (#{device})" end def id :ios end def match? ua =~ MATCHER end def device ua[MATCHER, 1] end end end end browser-2.2.0/lib/browser/platform/adobe_air.rb0000644000004100000410000000047112732547074021552 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class AdobeAir < Base def match? ua =~ /AdobeAIR/ end def version ua[%r[AdobeAIR/([\d.]+)], 1] end def name "Adobe AIR" end def id :adobe_air end end end end browser-2.2.0/lib/browser/platform/other.rb0000644000004100000410000000041112732547074020760 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class Other < Base def version "0" end def name "Other" end def id :other end def match? true end end end end browser-2.2.0/lib/browser/platform/windows_phone.rb0000644000004100000410000000051512732547074022527 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class WindowsPhone < Base def version ua[/Windows Phone ([\d.]+)/, 1] end def name "Windows Phone" end def id :windows_phone end def match? ua =~ /Windows Phone/ end end end end browser-2.2.0/lib/browser/platform/base.rb0000644000004100000410000000032412732547074020554 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class Base attr_reader :ua def initialize(ua) @ua = ua end def match? false end end end end browser-2.2.0/lib/browser/platform/windows.rb0000644000004100000410000000050012732547074021330 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class Windows < Base def version ua[/Windows NT\s*([0-9_\.]+)?/, 1] || "0" end def name "Windows" end def id :windows end def match? ua =~ /Windows/ end end end end browser-2.2.0/lib/browser/platform/mac.rb0000644000004100000410000000050512732547074020403 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class Mac < Base def version (ua[/Mac OS X\s*([0-9_\.]+)?/, 1] || "0").gsub("_", ".") end def name "Macintosh" end def id :mac end def match? ua =~ /Mac/ end end end end browser-2.2.0/lib/browser/platform/android.rb0000644000004100000410000000046012732547074021263 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class Android < Base def match? ua =~ /Android/ end def name "Android" end def id :android end def version ua[/Android ([\d.]+)/, 1] end end end end browser-2.2.0/lib/browser/platform/chrome_os.rb0000644000004100000410000000047312732547074021625 0ustar www-datawww-data# frozen_string_literal: true module Browser class Platform class ChromeOS < Base def match? ua =~ /CrOS/ end def name "Chrome OS" end def id :chrome_os end def version ua[/CrOS(?: x86_64)? ([\d.]+)/, 1] end end end end browser-2.2.0/lib/browser/safari.rb0000644000004100000410000000061212732547074017263 0ustar www-datawww-data# frozen_string_literal: true module Browser class Safari < Base def id :safari end def name "Safari" end def full_version ua[%r[Version/([\d.]+)], 1] || ua[%r[Safari/([\d.]+)], 1] || ua[%r[AppleWebKit/([\d.]+)], 1] || "0.0" end def match? ua =~ /Safari/ && ua !~ /Chrome|CriOS|PhantomJS|FxiOS/ end end end browser-2.2.0/lib/browser/action_controller.rb0000644000004100000410000000057712732547074021550 0ustar www-datawww-data# frozen_string_literal: true require "action_controller/railtie" module Browser module ActionController extend ActiveSupport::Concern included do helper_method :browser end private def browser @browser ||= Browser.new( request.headers["User-Agent"], accept_language: request.headers["Accept-Language"] ) end end end browser-2.2.0/lib/browser/internet_explorer.rb0000644000004100000410000000222412732547074021567 0ustar www-datawww-data# frozen_string_literal: true module Browser class InternetExplorer < Base # https://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx#TriToken TRIDENT_MAPPING = { "4.0" => "8", "5.0" => "9", "6.0" => "10", "7.0" => "11", "8.0" => "12" } def id :ie end def name "Internet Explorer" end def full_version "#{ie_version}.0" end def msie_full_version (ua.match(%r{MSIE ([\d.]+)|Trident/.*?; rv:([\d.]+)}) && ($1 || $2)) || "0.0" end def msie_version msie_full_version.split(".").first end def match? msie? || modern_ie? end # Detect if IE is running in compatibility mode. def compatibility_view? trident_version && msie_version.to_i < (trident_version.to_i + 4) end private def ie_version TRIDENT_MAPPING[trident_version] || msie_version end # Return the trident version. def trident_version ua.match(%r[Trident/([0-9.]+)]) && $1 end def msie? ua =~ /MSIE/ && ua !~ /Opera/ end def modern_ie? ua =~ %r[Trident/.*?; rv:(.*?)] end end end browser-2.2.0/lib/browser/testing.rb0000644000004100000410000000120412732547074017471 0ustar www-datawww-data# frozen_string_literal: true module Browser def self.user_agents @user_agents ||= browser_user_agents .merge(bot_user_agents) .merge(search_engine_user_agents) end def self.browser_user_agents @browser_user_agents ||= YAML.load_file(Browser.root.join("test/ua.yml")) end def self.bot_user_agents @bot_user_agents ||= YAML.load_file(Browser.root.join("test/ua_bots.yml")) end def self.search_engine_user_agents @search_engine_user_agents ||= YAML.load_file(Browser.root.join("test/ua_search_engines.yml")) end def self.[](key) user_agents.fetch(key) end end browser-2.2.0/lib/browser/weibo.rb0000644000004100000410000000042012732547074017120 0ustar www-datawww-data# frozen_string_literal: true module Browser class Weibo < Base def id :weibo end def name "Weibo" end def full_version ua[%r[(?:__weibo__)([\d.]+)]i, 1] || "0.0" end def match? ua =~ /__weibo__/i end end end browser-2.2.0/lib/browser/firefox.rb0000644000004100000410000000043512732547074017463 0ustar www-datawww-data# frozen_string_literal: true module Browser class Firefox < Base def id :firefox end def name "Firefox" end def full_version ua[%r[(?:Firefox|FxiOS)/([\d.]+)], 1] || "0.0" end def match? ua =~ /Firefox|FxiOS/ end end end browser-2.2.0/lib/browser/edge.rb0000644000004100000410000000045112732547074016723 0ustar www-datawww-data# frozen_string_literal: true module Browser class Edge < InternetExplorer def id :edge end def name "Microsoft Edge" end def full_version ua[%r[Edge/([\d.]+)], 1] || super end def match? ua =~ %r[(Edge/[\d.]+|Trident/8)] end end end browser-2.2.0/lib/browser/nokia.rb0000644000004100000410000000044312732547074017121 0ustar www-datawww-data# frozen_string_literal: true module Browser class Nokia < Base def id :nokia end def name "Nokia S40 Ovi Browser" end def full_version ua[%r[S40OviBrowser/([\d.]+)], 1] || "0.0" end def match? ua =~ /S40OviBrowser/ end end end browser-2.2.0/lib/browser/base.rb0000644000004100000410000000641612732547074016740 0ustar www-datawww-data# frozen_string_literal: true module Browser class Base include DetectVersion attr_reader :ua # Return an array with all preferred languages that this browser accepts. attr_reader :accept_language def initialize(ua, accept_language: nil) @ua = ua @accept_language = AcceptLanguage.parse(accept_language) end # Return a meta info about this browser. def meta Meta.get(self) end alias_method :to_a, :meta # Return meta representation as string. def to_s meta.to_a.join(" ") end def version full_version.split(".").first end # Return the platform. def platform @platform ||= Platform.new(ua) end # Return the bot info. def bot @bot ||= Bot.new(ua) end # Detect if current user agent is from a bot. def bot? bot.bot? end # Return the device info. def device @device ||= Device.new(ua) end # Return true if browser is modern (Webkit, Firefox 17+, IE9+, Opera 12+). def modern? Browser.modern_rules.any? {|rule| rule === self } # rubocop:disable Metrics/LineLength, Style/CaseEquality end # Detect if browser is Microsoft Internet Explorer. def ie?(expected_version = nil) InternetExplorer.new(ua).match? && detect_version?(version, expected_version) end # Detect if browser is Microsoft Edge. def edge? Edge.new(ua).match? end def compatibility_view? false end def msie_full_version "0.0" end def msie_version "0" end # Detect if browser is WebKit-based. def webkit? ua =~ /AppleWebKit/i && !edge? end # Detect if browser is QuickTime def quicktime? ua =~ /QuickTime/i end # Detect if browser is Apple CoreMedia. def core_media? ua =~ /CoreMedia/ end # Detect if browser is PhantomJS def phantom_js? PhantomJS.new(ua).match? end # Detect if browser is Safari. def safari?(expected_version = nil) Safari.new(ua).match? && detect_version?(version, expected_version) end def safari_webapp_mode? (device.ipad? || device.iphone?) && ua =~ /AppleWebKit/ end # Detect if browser is Firefox. def firefox? Firefox.new(ua).match? end # Detect if browser is Chrome. def chrome? Chrome.new(ua).match? end # Detect if browser is Opera. def opera? Opera.new(ua).match? end # Detect if browser is Yandex. def yandex? ua =~ /YaBrowser/ end # Detect if browser is UCBrowser. def uc_browser? UCBrowser.new(ua).match? end # Detect if browser is Nokia S40 Ovi Browser. def nokia? Nokia.new(ua).match? end # Detect if browser is MicroMessenger. def micro_messenger? MicroMessenger.new(ua).match? end alias_method :wechat?, :micro_messenger? def weibo? Weibo.new(ua).match? end # Detect if browser is Opera Mini. def opera_mini? ua =~ /Opera Mini/ end def webkit_full_version ua[%r[AppleWebKit/([\d.]+)], 1] || "0.0" end def known? id != :generic end # Detect if browser is a proxy browser. def proxy? nokia? || uc_browser? || opera_mini? end end end browser-2.2.0/lib/browser/rails.rb0000644000004100000410000000075312732547074017136 0ustar www-datawww-data# frozen_string_literal: true require "rails/railtie" require "browser/action_controller" require "browser/middleware/context/additions" module Browser class Railtie < Rails::Railtie config.browser = ActiveSupport::OrderedOptions.new initializer "browser" do ::ActionController::Base.send :include, Browser::ActionController Browser::Middleware::Context.send :include, Browser::Middleware::Context::Additions end end end browser-2.2.0/lib/browser/device/0000755000004100000410000000000012732547074016731 5ustar www-datawww-databrowser-2.2.0/lib/browser/device/wii.rb0000644000004100000410000000036212732547074020047 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Wii < Base def id :wii end def name "Nintendo Wii" end def match? ua =~ /Nintendo Wii/i end end end end browser-2.2.0/lib/browser/device/wiiu.rb0000644000004100000410000000036612732547074020240 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class WiiU < Base def id :wiiu end def name "Nintendo WiiU" end def match? ua =~ /Nintendo WiiU/i end end end end browser-2.2.0/lib/browser/device/kindle.rb0000644000004100000410000000035312732547074020525 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Kindle < Base def id :kindle end def name "Kindle" end def match? ua =~ /Kindle/ end end end end browser-2.2.0/lib/browser/device/unknown.rb0000644000004100000410000000034412732547074020756 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Unknown < Base def id :unknown end def name "Unknown" end def match? true end end end end browser-2.2.0/lib/browser/device/playstation3.rb0000644000004100000410000000037512732547074021715 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class PlayStation3 < Base def id :ps3 end def name "PlayStation 3" end def match? ua =~ /PLAYSTATION 3/i end end end end browser-2.2.0/lib/browser/device/psp.rb0000644000004100000410000000040112732547074020053 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class PSP < Base def id :psp end def name "PlayStation Portable" end def match? ua =~ /PlayStation Portable/ end end end end browser-2.2.0/lib/browser/device/ipad.rb0000644000004100000410000000034312732547074020173 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Ipad < Base def id :ipad end def name "iPad" end def match? ua =~ /iPad/ end end end end browser-2.2.0/lib/browser/device/xbox_360.rb0000644000004100000410000000035712732547074020633 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Xbox360 < Base def id :xbox_360 end def name "Xbox 360" end def match? ua =~ /Xbox/i end end end end browser-2.2.0/lib/browser/device/psvita.rb0000644000004100000410000000037712732547074020573 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class PSVita < Base def id :psvita end def name "PlayStation Vita" end def match? ua =~ /Playstation Vita/ end end end end browser-2.2.0/lib/browser/device/blackberry_playbook.rb0000644000004100000410000000042512732547074023277 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class BlackBerryPlaybook < Base def id :playbook end def name "BlackBerry Playbook" end def match? ua =~ /PlayBook.*?RIM Tablet/ end end end end browser-2.2.0/lib/browser/device/playstation4.rb0000644000004100000410000000037512732547074021716 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class PlayStation4 < Base def id :ps4 end def name "PlayStation 4" end def match? ua =~ /PLAYSTATION 4/i end end end end browser-2.2.0/lib/browser/device/iphone.rb0000644000004100000410000000035312732547074020541 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Iphone < Base def id :iphone end def name "iPhone" end def match? ua =~ /iPhone/ end end end end browser-2.2.0/lib/browser/device/surface.rb0000644000004100000410000000054312732547074020710 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Surface < Base def id :surface end def name "Microsoft Surface" end def match? platform.windows_rt? && ua =~ /Touch/ end private def platform @platform ||= Platform.new(ua) end end end end browser-2.2.0/lib/browser/device/tv.rb0000644000004100000410000000037312732547074017712 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class TV < Base def id :tv end def name "TV" end def match? ua =~ /(tv|Android.*?ADT-1|Nexus Player)/i end end end end browser-2.2.0/lib/browser/device/base.rb0000644000004100000410000000025012732547074020165 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class Base attr_reader :ua def initialize(ua) @ua = ua end end end end browser-2.2.0/lib/browser/device/xbox_one.rb0000644000004100000410000000036312732547074021101 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class XboxOne < Base def id :xbox_one end def name "Xbox One" end def match? ua =~ /Xbox One/i end end end end browser-2.2.0/lib/browser/device/kindle_fire.rb0000644000004100000410000000040312732547074021526 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class KindleFire < Base def id :kindle_fire end def name "Kindle Fire" end def match? ua =~ /Kindle Fire|KFTT/ end end end end browser-2.2.0/lib/browser/device/ipod_touch.rb0000644000004100000410000000036412732547074021416 0ustar www-datawww-data# frozen_string_literal: true module Browser class Device class IpodTouch < Base def id :ipod_touch end def name "iPod Touch" end def match? ua =~ /iPod/ end end end end browser-2.2.0/gemfiles/0000755000004100000410000000000012732547074015034 5ustar www-datawww-databrowser-2.2.0/gemfiles/rails3.gemfile0000644000004100000410000000011312732547074017556 0ustar www-datawww-datasource "https://rubygems.org" gemspec path: ".." gem "rails", "~> 3.2.13" browser-2.2.0/.rubocop.yml0000644000004100000410000000304112732547074015511 0ustar www-datawww-dataStyle/FrozenStringLiteralComment: EnforcedStyle: always Style/ClassCheck: EnforcedStyle: kind_of? Metrics/LineLength: Max: 80 Style/BlockDelimiters: Enabled: false Style/RegexpLiteral: Enabled: false Metrics/AbcSize: Enabled: false Style/PerlBackrefs: Enabled: false ClassLength: Enabled: false CyclomaticComplexity: Enabled: false Documentation: Enabled: false Encoding: Enabled: false FileName: Enabled: false IfUnlessModifier: Enabled: false MethodLength: Enabled: false ModuleFunction: Enabled: false OneLineConditional: Enabled: false ParameterLists: Enabled: false Proc: Enabled: false SingleLineBlockParams: Enabled: false VariableInterpolation: Enabled: false TrailingComma: Enabled: false WhileUntilModifier: Enabled: false PredicateName: NamePrefixBlacklist: - is_ StringLiterals: EnforcedStyle: double_quotes SupportedStyles: - single_quotes - double_quotes DotPosition: EnforcedStyle: leading SpaceBeforeBlockBraces: EnforcedStyle: space SpaceInsideBlockBraces: EnforcedStyle: no_space DoubleNegation: Enabled: false SpaceInsideBlockBraces: SpaceBeforeBlockParameters: false SpaceInsideHashLiteralBraces: Enabled: false PercentLiteralDelimiters: PreferredDelimiters: '%': '[]' '%i': '[]' '%q': '[]' '%Q': '[]' '%r': '[]' '%s': '[]' '%w': '[]' '%W': '[]' '%x': '[]' Style/CollectionMethods: PreferredMethods: collect: 'map' collect!: 'map!' inject: 'reduce' detect: 'find' find_all: 'select' browser-2.2.0/test/0000755000004100000410000000000012732547074014220 5ustar www-datawww-databrowser-2.2.0/test/sample_app.rb0000644000004100000410000000213112732547074016663 0ustar www-datawww-data# frozen_string_literal: true require "rails" require "browser" class PagesController < ActionController::Base def home render text: "#{browser.name}:#{browser.accept_language.first.full}" end end class SampleApp < Rails::Application config.secret_token = "99f19f08db7a37bdcb9d6701f54dca" config.secret_key_base = "99f19f08db7a37bdcb9d6701f54dca" config.eager_load = true config.active_support.deprecation = :log routes.append do default_headers = {"Content-Type" => "text/html"} root to: -> (_env) { [200, default_headers, ["ROOT"]] } get "upgrade", to: lambda {|env| browser = Rack::Request.new(env).params["browser"] [200, default_headers, ["UPGRADE: #{browser}"]] }, as: "upgrade" get "/asset", to: proc { [200, {"Content-Type" => "image/png"}, []] } get "/home", to: "pages#home" end config.middleware.use Browser::Middleware do redirect_to upgrade_path(browser: "ie6") if browser.ie?(6) redirect_to upgrade_path(browser: "ie7") if browser.ie?(7) redirect_to "/invalid" if browser.ie?(8) end end SampleApp.initialize! browser-2.2.0/test/ua.yml0000644000004100000410000004003512732547074015352 0ustar www-datawww-dataADOBE_AIR: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/13.0' ANDROID: 'Android SDK 1.5r3: Mozilla/5.0 (Linux; U; Android 1.5; de-; sdk Build/CUPCAKE) AppleWebkit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' ANDROID_CUPCAKE: Mozilla/5.0 (Linux; U; Android 1.5; en-gb; T-Mobile G1 Build/CRC1) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 ANDROID_DONUT: Mozilla/5.0 (Linux; U; Android 1.6; ar-us; SonyEricssonX10i Build/R2BA026) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 ANDROID_ECLAIR_21: Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 ANDROID_FROYO: Mozilla/5.0 (Linux; U; Android 2.2; en-sa; HTC_DesireHD_A9191 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 ANDROID_GINGERBREAD: Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; Sensation_4G Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 ANDROID_HONEYCOMB_30: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 ANDROID_ICECREAM: Mozilla/5.0 (Linux; U; Android 4.0.1; en-us; sdk Build/ICS_MR0) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 ANDROID_JELLYBEAN_41: Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Nexus S Build/JRO03E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 ANDROID_JELLYBEAN_42: Mozilla/5.0 (Linux; U; Android 4.2; en-us; Nexus 10 Build/JVP15I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 ANDROID_JELLYBEAN_43: Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JWR66D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.111 Safari/537.36 ANDROID_KITKAT: Mozilla/5.0 (Linux; Android 4.4; Nexus 7 Build/KOT24) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.105 Safari/537.36 ANDROID_LOLLIPOP_50: Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36 ANDROID_LOLLIPOP_51: Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.0.0 Mobile Safari/537.36; DailymotionEmbedSDK 1.0 ANDROID_NEXUS_PLAYER: Mozilla/5.0 (Linux; Android 5.0; Nexus Player Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.0 ANDROID_TV: Mozilla/5.0 (Linux; Android 5.0; ADT-1 Build/LRW87K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 ANDROID_WITH_SAFARI: 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SCH-I535 Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' BLACKBERRY10: 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.1675 Mobile Safari/537.10+' BLACKBERRY4: 'BlackBerry8100/4.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103' BLACKBERRY5: 'BlackBerry9000/5.0.0.93 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/179' BLACKBERRY6: 'Mozilla/5.0 (BlackBerry; U; BlackBerry AAAA; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/6.0.0.141 Mobile Safari/534.11+' BLACKBERRY7: 'Mozilla/5.0 (BlackBerry; U; BlackBerry AAAA; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.1 Mobile Safari/534.11+' BLACKBERRY: 'BlackBerry7100i/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103' CHROME: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4' CHROME_OS: 'Mozilla/5.0 (X11; CrOS x86_64 3701.81.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.57 Safari/537.31.' COREMEDIA: 'Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569' CUSTOM_APP: "Our App 0.0.1 (Linux; Android 4.0.3; HTC Ruby Build/IML74K; en_CA)" FIREFOX: 'Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8' FIREFOX_ANDROID: 'Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0' FIREFOX_IOS: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) FxiOS/1.2 Mobile/13C75 Safari/601.1.46' FIREFOX_MODERN: 'Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0' FIREFOX_OS: 'Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0' FIREFOX_TABLET: 'Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0' IE10: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSMSN)' IE10_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; EIE10;ENUSMSN)' IE10_X64_WINX64: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)' IE11: 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko' IE11_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)' IE11_TOUCH_SCREEN: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; Touch; rv:11.0) like Gecko' IE6: 'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)' IE7: 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)' IE8: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)' IE8_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; SLCC1; Media Center PC 5.0; .NET CLR 3.5.21022)' IE9: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' IE9_CHROME_FRAME: 'Mozilla/5.0 (Windows NT 6.1; WOW64; chromeframe/26.0.1410.43) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31' IE9_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)' IE_WITHOUT_TRIDENT: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.0) .NET CLR 2.0.50727) IOS4: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7' IOS5: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3' IOS6: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25' IOS7: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' IOS8: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4' IOS9: 'Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.17 (KHTML, like Gecko) Version/8.0 Mobile/13A175 Safari/600.1.4' IOS_WEBVIEW: Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H141 IPAD: 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10' IPHONE: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3' IPOD: 'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3' KINDLE: 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600×800; rotate)' KINDLE_FIRE: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' KINDLE_FIRE_HD: 'Mozilla/5.0 (Linux; U; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Safari/535.19 Silk-Accelerated=true' KINDLE_FIRE_HD_MOBILE: 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true' LUMIA800: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7' MIDP: MIDP-2.0 MOBILE_CHROME: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3' MS_EDGE: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0' MS_EDGE_COMPAT: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; Microsoft Outlook 15.0.4433; ms-office; MSOffice 15)' MS_EDGE_MOBILE: 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0' NEXUS7: 'Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' NEXUS_TABLET: 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' NINTENDO_WII: 'Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)' NINTENDO_WIIU: 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU' NOKIA: 'Mozilla/5.0 (Series40; NokiaX3-02/le6.32; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.0.2.62.10' NOOK: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; NOOK BNTV250A Build/GINGERBREAD 1.4.3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1' OPERA: 'Opera/9.80 (Macintosh; Intel Mac OS X 10.7.4; U; en) Presto/2.10.229 Version/11.64' OPERA_ANDROID: 'Mozill/5.0 (Linux; Android 4.4.2; A1-810 Build/KOT49H) Apple/WebKit/537.36 (KHTML, like Gecko) Chrome/48.0.25 64.99 Safari/537.36 OPR/35.0.2070.100283' OPERA_MINI: 'Opera/9.80 (Android; Opera Mini/7.029952/28.2359;u; fr) Presto/2.8.119 Version/11.10' OPERA_MOBI: 'Opera/9.8 (Android 2.3.5; Linux; Opera Mobi/ADR-1205181138; U; en) Presto/2.10.254 Version/12.00' OPERA_NEXT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36 OPR/15.0.1147.44 (Edition Next)' PHANTOM_JS: 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.0 Safari/534.34' PLAYBOOK: 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+' PLAYSTATION3: 'Mozilla/5.0 (PLAYSTATION 3; 3.55)' PLAYSTATION4: 'Mozilla/5.0 (PlayStation 4 1.020) AppleWebKit/536.26 (KHTML, like Gecko)' PSP: 'Mozilla/4.0 (PSP (PlayStation Portable); 2.00)' PSP_VITA: 'Mozilla/5.0 (Playstation Vita 1.61) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2' QUICKTIME: 'QuickTime/7.6.8 (qtver=7.6.8;os=Windows NT 5.1Service Pack 3)' SAFARI3: 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5' SAFARI4: 'Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-ch) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9' SAFARI5: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4' SAFARI6: 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25' SAFARI7: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71' SAFARI8: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_90) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25' SAFARI9: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9' SAFARI: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8' SAFARI_IPAD_WEBAPP_MODE: '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' SAFARI_IPHONE_WEBAPP_MODE: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g' SAMSUNG: 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SAMSUNG-SGH-I497 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' SAMSUNG_CHROME: 'Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG GT-I9195/I9195XXUCNEA Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36' SMART_TV: 'Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+' SURFACE: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' SYMBIAN: 'Nokia5250/10.0.011 (SymbianOS/9.4; U; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Safari/525 3gpp-gba' TABLOID: 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' UC_BROWSER: 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-US; GT-I9500 Build/KOT49H) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.4.484 U3/0.8.0 Mobile Safari/533.1' WINDOWS_2000: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 5.0; Trident/6.0)' WINDOWS_2000_SP1: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 5.01; Trident/6.0)' WINDOWS7: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205' WINDOWS81: 'Mozilla/5.0 (IE 11.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko' WINDOWS8: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)' WINDOWS10: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; Trident/6.0)' WINDOWS_MOBILE: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12)' WINDOWS_PHONE8: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)' WINDOWS_PHONE: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)' WINDOWS_PHONE_81: 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 929) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' WINDOWS_VISTA: 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)' WINDOWS_WOW64: "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko" WINDOWS_XP: 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; FDM; .NET CLR 1.1.4322)' WINDOWS_XP_64: 'Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)' XBOX360: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox), or Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)' XBOXONE: 'Mozilla/5.0 (Compatible; MSIE 10.0; Windows NT 6.2; Trident /6.0; Xbox; Xbox One)' XOOM: 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' YANDEX_BROWSER: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 YaBrowser/15.4.2272.3909 (beta) Yowser/2.0 Safari/537.36' MICRO_MESSENGER: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 MicroMessenger/6.3.15 NetType/3G+ Language/zh_CN' WEIBO_IOS: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H143 Weibo (iPhone7,2__weibo__5.7.1__iphone__os8.4)' WEIBO_ANDROID: 'Mozilla/5.0 (Linux; Android 5.0.2; vivo X5M Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 Weibo (vivo-vivo X5M__weibo__5.7.1__android__android5.0.2)' QQ_BROWSER_IOS: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 QQ/6.3.3.432 V1_IPH_SQ_6.3.3_1_APP_A Pixel/640 Core/UIWebView NetType/WIFI Mem/47' QQ_BROWSER_ANDROID: 'Mozilla/5.0 (Linux; Android 5.1.1; SM-N9108V Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036222 Safari/537.36 V1_AND_SQ_6.2.0_320_YYB_D QQ/6.2.0.2655 NetType/WIFI WebP/0.3.0 Pixel/1440' browser-2.2.0/test/middleware_test.rb0000644000004100000410000000244712732547074017730 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" require "browser/rails" require "sample_app" class MiddlewareTest < Minitest::Test include Rack::Test::Methods def app Rails.application end test "redirects with 302" do get "/", {}, "HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "text/html" assert_equal 302, last_response.status end test "redirects ie6 to upgrade path" do get "/", {}, "HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "text/html" follow_redirect! assert_equal "UPGRADE: ie6", last_response.body end test "redirects ie7 to upgrade path" do get "/", {}, "HTTP_USER_AGENT" => "MSIE 7", "HTTP_ACCEPT" => "text/html" follow_redirect! assert_equal "UPGRADE: ie7", last_response.body end test "redirects ie8 and returns 404" do get "/", {}, "HTTP_USER_AGENT" => "MSIE 8", "HTTP_ACCEPT" => "text/html" follow_redirect! assert_equal 404, last_response.status end test "redirects ie8 with wildcard http accept" do get "/", {}, "HTTP_USER_AGENT" => "MSIE 8", "HTTP_ACCEPT" => "*/*" follow_redirect! assert_equal 404, last_response.status end test "ignores non-html requests" do get "/", {}, "HTTP_USER_AGENT" => "MSIE 6", "HTTP_ACCEPT" => "image/png" assert_equal 200, last_response.status end end browser-2.2.0/test/test_helper.rb0000644000004100000410000000116412732547074017065 0ustar www-datawww-data# frozen_string_literal: true require "codeclimate-test-reporter" CodeClimate::TestReporter.start ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__) require "bundler/setup" require "minitest/autorun" require "minitest/utils" require "browser" require "browser/testing" require "yaml" module Minitest class Test setup do Browser::Bot.instance_variable_set("@detect_empty_ua", false) end def assert_deprecated(message, file, line, &block) message = "#{message} (called from #{file}:#{line})" _out, err = capture_io(&block) assert_includes err, message end end end browser-2.2.0/test/browser_test.rb0000644000004100000410000000763012732547074017275 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class BrowserTest < Minitest::Test test "sets user agent while instantianting object" do browser = Browser.new("Safari") assert_equal "Safari", browser.ua end test "don't fail with nil user agent" do browser = Browser.new(nil) refute browser.known? end %w[ BlackBerry Chrome Edge Firefox MSIE Opera PhantomJS S40OviBrowser Safari UCBrowser ].each do |ua| test "don't fail when have no version info (#{ua})" do browser = Browser.new(ua) assert_equal "0", browser.version assert_equal "0.0", browser.full_version end end test "detects android" do browser = Browser.new(Browser["ANDROID"]) assert_equal "Safari", browser.name assert browser.platform.android? assert browser.safari? assert browser.webkit? assert browser.modern? assert_equal "3.1.2", browser.full_version assert_equal "3", browser.version end test "detects android tablet" do browser = Browser.new(Browser["TABLOID"]) assert_equal "Safari", browser.name assert browser.platform.android? assert browser.safari? assert browser.webkit? assert browser.modern? assert_equal "4.0", browser.full_version assert_equal "4", browser.version end test "detects surface tablet" do browser = Browser.new(Browser["SURFACE"]) assert_equal "Internet Explorer", browser.name assert browser.device.surface? assert browser.ie? assert browser.modern? assert_equal "10.0", browser.full_version assert_equal "10", browser.version end test "detects quicktime" do browser = Browser.new(Browser["QUICKTIME"]) assert_equal "QuickTime", browser.name assert browser.quicktime? assert_equal "7.6.8", browser.full_version assert_equal "7", browser.version end test "detects core media" do browser = Browser.new(Browser["COREMEDIA"]) assert_equal "Apple CoreMedia", browser.name assert browser.core_media? assert_equal "1.0.0.10", browser.full_version assert_equal "1", browser.version end test "detects phantom.js" do browser = Browser.new(Browser["PHANTOM_JS"]) assert_equal "PhantomJS", browser.name assert_equal :phantom_js, browser.id assert browser.phantom_js? assert browser.modern? assert_equal "1.9.0", browser.full_version assert_equal "1", browser.version end test "returns a zero version" do browser = Browser.new("Bot") assert_equal "0.0", browser.full_version assert_equal "0", browser.version end test "detects unknown id" do browser = Browser.new("Unknown") assert_equal :generic, browser.id end test "detects unknown name" do browser = Browser.new("Unknown") assert_equal "Generic Browser", browser.name end test "returns empty language set for missing accept language" do browser = Browser.new("") assert_equal [], browser.accept_language end test "sets accept language while instantiating object" do browser = Browser.new("", accept_language: "pt-br") assert_kind_of Array, browser.accept_language assert_equal ["pt-BR"], browser.accept_language.map(&:full) end test "returns all known languages" do browser = Browser.new("", accept_language: "en-us,en;q=0.8,pt-br;q=0.5,pt;q=0.3") assert_equal ["en-US", "en", "pt-BR", "pt"], browser.accept_language.map(&:full) end test "removes duplicate items" do browser = Browser.new(Browser["SAFARI"]) assert_equal ["safari"], browser.meta.select {|item| item == "safari" } end test "detects meta aliased as to_a" do browser = Browser.new(Browser["SAFARI"]) assert_equal browser.meta, browser.to_a end test "knows a supported browser" do browser = Browser.new("Chrome") assert browser.known? end test "does not know an unsupported browser" do browser = Browser.new("Fancy new browser") refute browser.known? end end browser-2.2.0/test/ua_search_engines.yml0000644000004100000410000000077112732547074020412 0ustar www-datawww-dataASK: 'Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)' BAIDU: 'Baiduspider+(+http://www.baidu.com/search/spider.htm)' BINGBOT: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)' DUCKDUCKGO: 'DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)' GOOGLE_BOT: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' YAHOO_SLURP: 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)' browser-2.2.0/test/ua_bots.yml0000644000004100000410000000574512732547074016412 0ustar www-datawww-dataAPPLE_BOT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1)' ASK: 'Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)' BAIDU: 'Baiduspider+(+http://www.baidu.com/search/spider.htm)' BINGBOT: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)' DAUMOA: Mozilla/5.0 (compatible; MSIE or Firefox mutant; not on Windows server;) Daumoa 4.0 DOMAINAREANIMATOR: 'Domain Re-Animator Bot (http://domainreanimator.com) - support@domainreanimator.com' DOT_BOT: 'Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)' DUCKDUCKGO: 'DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)' FACEBOOK_BOT: 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)' GOOGLE_BOT: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' GOOGLE_PAGE_SPEED_INSIGHTS: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Page Speed Insights) Chrome/22.0.1229 Safari/537.4' GOOGLE_STRUCTURED_DATA_TESTING_TOOL: 'Mozilla/5.0 (compatible; X11; Linux x86_64; Google-StructuredDataTestingTool; +http://www.google.com/webmasters/tools/richsnippets)' GOOGLE_STRUCTURED_DATA_TESTING_TOOL2: 'Mozilla/5.0 (compatible; Google-Structured-Data-Testing-Tool +http://developers.google.com/structured-data/testing-tool/)' GRAPESHOT: 'Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)' LINKDEXBOT: 'Mozilla/5.0 (compatible; linkdexbot/2.0; +http://www.linkdex.com/bots/)' LOAD_TIME_BOT: 'Mozilla/5.0 (compatible; LoadTimeBot/0.9; +http://www.loadtime.net/bot.html)' LTX71: 'ltx71 - (http://ltx71.com/)' MAIL_RU: 'Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)' MEGAINDEX_RU: 'Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)' MRCHROME: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.107 Amigo/45.0.2454.107 MRCHROME SOC Safari/537.36' MSN_BOT: 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)' PRIVACYAWAREBOT: 'Mozilla/5.0 (compatible; PrivacyAwareBot/1.1; +http://www.privacyaware.org)' QUERYSEEKER: 'QuerySeekerSpider ( http://queryseeker.com/bot.html )' SCRAPY: 'Scrapy/0.18.4 (+http://scrapy.org)' SEOKICKS: 'Mozilla/5.0 (compatible; SEOkicks-Robot; +http://www.seokicks.de/robot.html)' SISTRIX: 'Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)' SQUIDER: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36 Squider/0.01' TINEYE: 'TinEye-bot/0.51 (see http://www.tineye.com/crawler.html)' TRAACKR: 'Traackr.com' YAHOO_SLURP: 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)' YANDEX_DIRECT: 'Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)' YANDEX_METRIKA: 'Mozilla/5.0 (compatible; YandexMetrika/3.0; +http://yandex.com/bots)' browser-2.2.0/test/unit/0000755000004100000410000000000012732547074015177 5ustar www-datawww-databrowser-2.2.0/test/unit/platform_test.rb0000644000004100000410000001252512732547074020414 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class PlatformTest < Minitest::Test class CustomPlatform < Browser::Platform::Base def match? ua =~ /Custom/ end def id :custom end end test "extend matchers" do Browser::Platform.matchers.unshift(CustomPlatform) platform = Browser::Platform.new("Custom") assert_equal :custom, platform.id Browser::Platform.matchers.shift platform = Browser::Platform.new("Custom") assert_equal :other, platform.id end test "implements to_s" do platform = Browser::Platform.new(Browser["IOS9"]) assert_equal "ios", platform.to_s end test "implements ==" do platform = Browser::Platform.new(Browser["IOS9"]) assert platform == :ios refute platform == :android end test "detect other" do platform = Browser::Platform.new("Other") assert_equal "Other", platform.name assert_equal :other, platform.id assert_equal "0", platform.version assert platform.other? end test "detect ios (iPhone)" do platform = Browser::Platform.new(Browser["IOS4"]) assert_equal "iOS (iPhone)", platform.name assert_equal :ios, platform.id assert platform.ios? assert_equal "4", platform.version end test "detect ios (iPad)" do platform = Browser::Platform.new(Browser["IOS9"]) assert_equal "iOS (iPad)", platform.name assert_equal :ios, platform.id assert platform.ios? assert_equal "9", platform.version end test "detect ios (iPod Touch)" do platform = Browser::Platform.new(Browser["IPOD"]) assert_equal "iOS (iPod)", platform.name assert_equal :ios, platform.id assert platform.ios? assert_equal "0", platform.version end test "detect linux" do platform = Browser::Platform.new(Browser["FIREFOX"]) assert_equal "Generic Linux", platform.name assert_equal :linux, platform.id assert platform.linux? assert_equal "0", platform.version end test "detect mac" do platform = Browser::Platform.new(Browser["SAFARI"]) assert_equal "Macintosh", platform.name assert_equal :mac, platform.id assert platform.mac? assert_equal "10.6.4", platform.version assert platform.mac?(["=10.6.4"]) end test "return stub version for Mac user agent without version" do platform = Browser::Platform.new("Macintosh") assert_equal "0", platform.version end test "detect firefox os" do platform = Browser::Platform.new(Browser["FIREFOX_OS"]) assert_equal "Firefox OS", platform.name assert_equal :firefox_os, platform.id assert platform.firefox_os? assert_equal "0", platform.version end test "detect windows phone" do platform = Browser::Platform.new(Browser["MS_EDGE_MOBILE"]) assert_equal "Windows Phone", platform.name assert_equal :windows_phone, platform.id assert platform.windows_phone? assert_equal "10.0", platform.version end test "detect windows mobile" do platform = Browser::Platform.new(Browser["WINDOWS_MOBILE"]) assert_equal "Windows Mobile", platform.name assert_equal :windows_mobile, platform.id assert platform.windows_mobile? assert_equal "0", platform.version end test "detect blackberry 10" do platform = Browser::Platform.new(Browser["BLACKBERRY10"]) assert_equal "BlackBerry", platform.name assert_equal :blackberry, platform.id assert platform.blackberry? assert_equal "10.0.9.1675", platform.version end test "detect blackberry 4" do platform = Browser::Platform.new(Browser["BLACKBERRY4"]) assert_equal "BlackBerry", platform.name assert_equal :blackberry, platform.id assert platform.blackberry? assert_equal "4.2.1", platform.version end test "detect blackberry 4 (other)" do platform = Browser::Platform.new(Browser["BLACKBERRY"]) assert_equal "BlackBerry", platform.name assert_equal :blackberry, platform.id assert platform.blackberry? assert_equal "4.1.0", platform.version end test "detect blackberry 5" do platform = Browser::Platform.new(Browser["BLACKBERRY5"]) assert_equal "BlackBerry", platform.name assert_equal :blackberry, platform.id assert platform.blackberry? assert_equal "5.0.0.93", platform.version end test "detect blackberry 6" do platform = Browser::Platform.new(Browser["BLACKBERRY6"]) assert_equal "BlackBerry", platform.name assert_equal :blackberry, platform.id assert platform.blackberry? assert_equal "6.0.0.141", platform.version end test "detect blackberry 7" do platform = Browser::Platform.new(Browser["BLACKBERRY7"]) assert_equal "BlackBerry", platform.name assert_equal :blackberry, platform.id assert platform.blackberry? assert_equal "7.0.0.1", platform.version end test "detect android" do platform = Browser::Platform.new(Browser["ANDROID_CUPCAKE"]) assert_equal "Android", platform.name assert_equal :android, platform.id assert platform.android? assert_equal "1.5", platform.version end test "detect chrome os" do platform = Browser::Platform.new(Browser["CHROME_OS"]) assert_equal "Chrome OS", platform.name assert_equal :chrome_os, platform.id assert platform.chrome_os? assert_equal "3701.81.0", platform.version end test "detect adobe air" do platform = Browser::Platform.new(Browser["ADOBE_AIR"]) assert platform.adobe_air? end end browser-2.2.0/test/unit/ios_test.rb0000644000004100000410000000713512732547074017363 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class IosTest < Minitest::Test test "detects iphone" do browser = Browser.new(Browser["IPHONE"]) assert_equal "Safari", browser.name assert browser.safari? assert browser.webkit? assert browser.modern? assert browser.platform.ios? refute browser.platform.mac? assert_equal "3.0", browser.full_version assert_equal "3", browser.version end test "detects safari" do browser = Browser.new(Browser["SAFARI"]) assert_equal "Safari", browser.name assert browser.safari? assert browser.webkit? assert browser.modern? assert_equal "5.0.1", browser.full_version assert_equal "5", browser.version end test "detects safari in webapp mode" do browser = Browser.new(Browser["SAFARI_IPAD_WEBAPP_MODE"]) refute browser.safari? assert browser.platform.ios_webview? browser = Browser.new(Browser["SAFARI_IPHONE_WEBAPP_MODE"]) refute browser.safari? assert browser.platform.ios_webview? end test "detects ipod" do browser = Browser.new(Browser["IPOD"]) assert_equal "Safari", browser.name assert browser.safari? assert browser.webkit? assert browser.platform.ios? refute browser.device.tablet? refute browser.platform.mac? assert_equal "3.0", browser.full_version assert_equal "3", browser.version end test "detects ipad" do browser = Browser.new(Browser["IPAD"]) assert_equal "Safari", browser.name assert browser.safari? assert browser.webkit? assert browser.modern? assert browser.platform.ios? refute browser.platform.mac? assert_equal "4.0.4", browser.full_version assert_equal "4", browser.version end test "detects ios4" do browser = Browser.new(Browser["IOS4"]) assert browser.platform.ios? assert browser.platform.ios?(4) refute browser.platform.mac? end test "detects ios5" do browser = Browser.new(Browser["IOS5"]) assert browser.platform.ios? assert browser.platform.ios?(5) refute browser.platform.mac? end test "detects ios6" do browser = Browser.new(Browser["IOS6"]) assert browser.platform.ios? assert browser.platform.ios?(6) refute browser.platform.mac? end test "detects ios7" do browser = Browser.new(Browser["IOS7"]) assert browser.platform.ios? assert browser.platform.ios?(7) refute browser.platform.mac? end test "detects ios8" do browser = Browser.new(Browser["IOS8"]) assert browser.platform.ios? assert browser.platform.ios?(8) refute browser.platform.mac? end test "detects ios9" do browser = Browser.new(Browser["IOS9"]) assert browser.platform.ios? assert browser.platform.ios?(9) refute browser.platform.mac? end test "don't detect as two different versions" do browser = Browser.new(Browser["IOS8"]) assert browser.platform.ios?(8) refute browser.platform.ios?(7) end test "returns string representation for iphone" do browser = Browser.new(Browser["IPHONE"]) meta = browser.to_s assert meta.include?("webkit") assert meta.include?("ios") assert meta.include?("safari") assert meta.include?("safari3") assert meta.include?("modern") assert meta.include?("mobile") refute meta.include?("tablet") end test "returns string representation for ipad" do browser = Browser.new(Browser["IPAD"]) meta = browser.to_s assert meta.include?("webkit") assert meta.include?("ios") assert meta.include?("safari") assert meta.include?("modern") assert meta.include?("tablet") refute meta.include?("mobile") end end browser-2.2.0/test/unit/safari_test.rb0000644000004100000410000000404312732547074020031 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class SafariTest < Minitest::Test test "detect safari 3" do browser = Browser.new(Browser["SAFARI3"]) assert browser.safari? assert browser.safari?(3) assert_equal "3", browser.version assert_equal "3.0.3", browser.full_version end test "detect safari 4" do browser = Browser.new(Browser["SAFARI4"]) assert browser.safari? assert browser.safari?(4) assert_equal "4", browser.version assert_equal "4.0.3", browser.full_version end test "detect safari 5" do browser = Browser.new(Browser["SAFARI5"]) assert browser.safari? assert browser.safari?(5) assert_equal "5", browser.version assert_equal "5.0.3", browser.full_version end test "detect safari 6" do browser = Browser.new(Browser["SAFARI6"]) assert browser.safari? assert browser.safari?(6) assert_equal "6", browser.version assert_equal "6.0", browser.full_version end test "detect safari 7" do browser = Browser.new(Browser["SAFARI7"]) assert browser.safari? assert browser.safari?(7) assert_equal "7", browser.version assert_equal "7.0", browser.full_version end test "detect safari 8" do browser = Browser.new(Browser["SAFARI8"]) assert browser.safari? assert browser.safari?(8) assert_equal "8", browser.version assert_equal "8.0", browser.full_version end test "detect safari 9" do browser = Browser.new(Browser["SAFARI9"]) assert browser.safari? assert browser.safari?(9) assert_equal "9", browser.version assert_equal "9.0.2", browser.full_version end test "detect web app mode" do browser = Browser.new(Browser["SAFARI_IPHONE_WEBAPP_MODE"]) assert browser.safari_webapp_mode? end test "reject regular safari as web app mode" do browser = Browser.new(Browser["SAFARI9"]) refute browser.safari_webapp_mode? end test "returns webkit version" do browser = Browser.new(Browser["SAFARI9"]) assert_equal "601.3.9", browser.webkit_full_version end end browser-2.2.0/test/unit/windows_test.rb0000644000004100000410000000616312732547074020263 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class WindowsTest < Minitest::Test test "detects windows x64" do browser = Browser.new(Browser["IE10_X64_WINX64"]) assert browser.platform.windows_x64? refute browser.platform.windows_wow64? assert browser.platform.windows_x64_inclusive? assert_equal browser.platform.version, "6.2" end test "detects windows wow64" do browser = Browser.new(Browser["WINDOWS_WOW64"]) refute browser.platform.windows_x64? assert browser.platform.windows_wow64? assert browser.platform.windows_x64_inclusive? assert_equal browser.platform.version, "6.3" end test "detects windows_2000" do browser = Browser.new(Browser["WINDOWS_2000"]) assert browser.platform.windows? assert_equal browser.platform.version, "5.0" assert browser.platform.windows?(["=5.0"]) end test "detects windows_2000_sp1" do browser = Browser.new(Browser["WINDOWS_2000_SP1"]) assert browser.platform.windows? assert_equal browser.platform.version, "5.01" assert browser.platform.windows?(["=5.01"]) end test "detects windows_xp" do browser = Browser.new(Browser["WINDOWS_XP"]) assert browser.platform.windows? assert browser.platform.windows_xp? assert_equal browser.platform.version, "5.1" assert browser.platform.windows?(["=5.1"]) end test "detects windows_xp (64-bit)" do browser = Browser.new(Browser["WINDOWS_XP_64"]) assert browser.platform.windows? assert browser.platform.windows_xp? assert browser.platform.windows_x64? assert_equal browser.platform.version, "5.2" assert browser.platform.windows?(["=5.2"]) end test "detects windows_vista" do browser = Browser.new(Browser["WINDOWS_VISTA"]) assert browser.platform.windows? assert browser.platform.windows_vista? assert_equal browser.platform.version, "6.0" assert browser.platform.windows?(["=6.0"]) end test "detects windows7" do browser = Browser.new(Browser["WINDOWS7"]) assert browser.platform.windows? assert browser.platform.windows7? assert_equal browser.platform.version, "6.1" assert browser.platform.windows?(["=6.1"]) end test "detects windows8" do browser = Browser.new(Browser["WINDOWS8"]) assert browser.platform.windows? assert browser.platform.windows8? refute browser.platform.windows8_1? assert_equal browser.platform.version, "6.2" assert browser.platform.windows?(["=6.2"]) end test "detects windows8.1" do browser = Browser.new(Browser["WINDOWS81"]) assert browser.platform.windows? assert browser.platform.windows8? assert browser.platform.windows8_1? assert_equal browser.platform.version, "6.3" assert browser.platform.windows?(["=6.3"]) end test "detects windows10" do browser = Browser.new(Browser["WINDOWS10"]) assert browser.platform.windows? assert browser.platform.windows10? assert_equal browser.platform.version, "10.0" assert browser.platform.windows?(["=10.0"]) end test "returns name" do browser = Browser.new(Browser["WINDOWS8"]) assert_equal "Windows", browser.platform.name end end browser-2.2.0/test/unit/firefox_test.rb0000644000004100000410000000243212732547074020226 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class FirefoxTest < Minitest::Test test "detects firefox" do browser = Browser.new(Browser["FIREFOX"]) assert_equal "Firefox", browser.name assert browser.firefox? refute browser.modern? assert_equal "3.8", browser.full_version assert_equal "3", browser.version end test "detects firefox for iOS" do browser = Browser.new(Browser["FIREFOX_IOS"]) assert_equal "Firefox", browser.name assert browser.firefox? assert browser.platform.ios? assert_equal "1.2", browser.full_version assert_equal "1", browser.version end test "detects modern firefox" do browser = Browser.new(Browser["FIREFOX_MODERN"]) assert_equal :firefox, browser.id assert_equal "Firefox", browser.name assert browser.firefox? assert browser.modern? assert_equal "17.0", browser.full_version assert_equal "17", browser.version end test "detects firefox android tablet" do browser = Browser.new(Browser["FIREFOX_TABLET"]) assert_equal :firefox, browser.id assert_equal "Firefox", browser.name assert browser.firefox? assert browser.modern? assert browser.platform.android? assert_equal "14.0", browser.full_version assert_equal "14", browser.version end end browser-2.2.0/test/unit/windows_phone_test.rb0000644000004100000410000000170312732547074021447 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class WindowPhoneTest < Minitest::Test test "detects windows phone" do browser = Browser.new(Browser["WINDOWS_PHONE"]) assert browser.ie? assert_equal "7", browser.version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end test "detects windows phone 8" do browser = Browser.new(Browser["WINDOWS_PHONE8"]) assert browser.ie? assert_equal "10", browser.version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end test "detects windows phone 8.1" do browser = Browser.new(Browser["WINDOWS_PHONE_81"]) assert browser.ie? assert_equal "Internet Explorer", browser.name assert_equal :ie, browser.id assert_equal "11", browser.version assert_equal "11.0", browser.full_version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end end browser-2.2.0/test/unit/chrome_test.rb0000644000004100000410000000342112732547074020040 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class ChromeTest < Minitest::Test test "detects chrome" do browser = Browser.new(Browser["CHROME"]) assert_equal "Chrome", browser.name assert browser.chrome? refute browser.safari? assert browser.webkit? assert browser.modern? assert_equal "5.0.375.99", browser.full_version assert_equal "5", browser.version end test "detects mobile chrome" do browser = Browser.new(Browser["MOBILE_CHROME"]) assert_equal "Chrome", browser.name assert browser.chrome? refute browser.safari? assert browser.webkit? assert browser.modern? assert_equal "19.0.1084.60", browser.full_version assert_equal "19", browser.version end test "detects samsung chrome" do browser = Browser.new(Browser["SAMSUNG_CHROME"]) assert_equal "Chrome", browser.name assert browser.chrome? assert browser.platform.android? refute browser.safari? assert browser.webkit? assert browser.modern? assert_equal "28.0.1500.94", browser.full_version assert_equal "28", browser.version end test "detects chrome os" do browser = Browser.new(Browser["CHROME_OS"]) assert browser.platform.chrome_os? end test "detects yandex browser" do browser = Browser.new(Browser["YANDEX_BROWSER"]) assert browser.yandex? assert browser.chrome? refute browser.safari? assert browser.webkit? assert_equal "41.0.2272.118", browser.full_version assert_equal "41", browser.version end test "detects chrome frame" do browser = Browser.new(Browser["IE9_CHROME_FRAME"]) assert browser.chrome? refute browser.safari? assert browser.webkit? assert_equal "26.0.1410.43", browser.full_version assert_equal "26", browser.version end end browser-2.2.0/test/unit/meta_test.rb0000644000004100000410000000210412732547074017506 0ustar www-datawww-datarequire "test_helper" class MetaTest < Minitest::Test class CustomRule < Browser::Meta::Base def meta "custom" if browser.ua =~ /Custom/ end end test "extend rules" do Browser::Meta.rules.unshift(CustomRule) browser = Browser.new("Custom") assert browser.meta.include?("custom") browser = Browser.new("Safari") refute browser.meta.include?("custom") Browser::Meta.rules.shift browser = Browser.new("Custom") refute browser.meta.include?("custom") end test "sets meta" do browser = Browser.new(Browser["CHROME"]) assert_kind_of Array, browser.meta end test "returns string representation" do browser = Browser.new(Browser["CHROME"]) meta = browser.to_s assert meta.include?("chrome") assert meta.include?("webkit") assert meta.include?("mac") assert meta.include?("modern") end test "returns string representation for mobile" do browser = Browser.new(Browser["BLACKBERRY"]) meta = browser.to_s assert meta.include?("blackberry") assert meta.include?("mobile") end end browser-2.2.0/test/unit/android_test.rb0000644000004100000410000000567512732547074020220 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class AndroidTest < Minitest::Test test "detect android cupcake (1.5)" do browser = Browser.new(Browser["ANDROID_CUPCAKE"]) assert browser.platform.android? assert browser.platform.android?(1.5) end test "detect android donut (1.6)" do browser = Browser.new(Browser["ANDROID_DONUT"]) assert browser.platform.android? assert browser.platform.android?(1.6) end test "detect android eclair (2.1)" do browser = Browser.new(Browser["ANDROID_ECLAIR_21"]) assert browser.platform.android? assert browser.platform.android?(2.1) end test "detect android froyo (2.2)" do browser = Browser.new(Browser["ANDROID_FROYO"]) assert browser.platform.android? assert browser.platform.android?(2.2) end test "detect android gingerbread (2.3)" do browser = Browser.new(Browser["ANDROID_GINGERBREAD"]) assert browser.platform.android? assert browser.platform.android?("~> 2.3.0") end test "detect android honeycomb (3.0)" do browser = Browser.new(Browser["ANDROID_HONEYCOMB_30"]) assert browser.platform.android? assert browser.platform.android?("~> 3.0") end test "detect android ice cream sandwich (4.0)" do browser = Browser.new(Browser["ANDROID_ICECREAM"]) assert browser.platform.android? assert browser.platform.android?("~> 4.0") end test "detect android jellybean (4.1)" do browser = Browser.new(Browser["ANDROID_JELLYBEAN_41"]) assert browser.platform.android? assert browser.platform.android?("~> 4.1") end test "detect android jellybean (4.2)" do browser = Browser.new(Browser["ANDROID_JELLYBEAN_42"]) assert browser.platform.android? assert browser.platform.android?(4.2) end test "detect android jellybean (4.3)" do browser = Browser.new(Browser["ANDROID_JELLYBEAN_43"]) assert browser.platform.android? assert browser.platform.android?(4.3) end test "detect android kitkat (4.4)" do browser = Browser.new(Browser["ANDROID_KITKAT"]) assert browser.platform.android? assert browser.platform.android?(4.4) end test "detect android lollipop (5.0)" do browser = Browser.new(Browser["ANDROID_LOLLIPOP_50"]) assert browser.platform.android? assert browser.platform.android?(5.0) end test "detect android lollipop (5.1)" do browser = Browser.new(Browser["ANDROID_LOLLIPOP_51"]) assert browser.platform.android? assert browser.platform.android?(5.1) end test "detect android tv" do browser = Browser.new(Browser["ANDROID_TV"]) assert browser.platform.android? assert browser.device.tv? end test "detect nexus player" do browser = Browser.new(Browser["ANDROID_NEXUS_PLAYER"]) assert browser.platform.android? end test "detect firefox for android without android version" do browser = Browser.new(Browser["FIREFOX_ANDROID"]) assert browser.platform.android? refute browser.platform.android?(5) end end browser-2.2.0/test/unit/uc_browser_test.rb0000644000004100000410000000037612732547074020743 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class UcBrowserTest < Minitest::Test test "detects UC Browser" do browser = Browser.new(Browser["UC_BROWSER"]) assert browser.uc_browser? assert_equal browser.name, "UCBrowser" end end browser-2.2.0/test/unit/kindle_test.rb0000644000004100000410000000117512732547074020035 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class KindleTest < Minitest::Test test "detects kindle monochrome" do browser = Browser.new(Browser["KINDLE"]) assert browser.webkit? end test "detects kindle fire" do browser = Browser.new(Browser["KINDLE_FIRE"]) assert browser.webkit? end test "detects kindle fire hd" do browser = Browser.new(Browser["KINDLE_FIRE_HD"]) assert browser.webkit? assert browser.modern? end test "detects kindle fire hd mobile" do browser = Browser.new(Browser["KINDLE_FIRE_HD_MOBILE"]) assert browser.webkit? assert browser.modern? end end browser-2.2.0/test/unit/weibo_test.rb0000644000004100000410000000107612732547074017674 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class MicroMessengerTest < Minitest::Test test "detects weibo iOS" do browser = Browser.new(Browser["WEIBO_IOS"]) assert_equal :weibo, browser.id assert browser.weibo? assert_equal "Weibo", browser.name assert_equal "5.7.1", browser.full_version end test "detects weibo Android" do browser = Browser.new(Browser["WEIBO_ANDROID"]) assert_equal :weibo, browser.id assert browser.weibo? assert_equal "Weibo", browser.name assert_equal "5.7.1", browser.full_version end end browser-2.2.0/test/unit/nokia_test.rb0000644000004100000410000000037312732547074017667 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class NokiaTest < Minitest::Test test "detects Nokia S40" do browser = Browser.new(Browser["NOKIA"]) assert browser.nokia? assert_equal "Nokia S40 Ovi Browser", browser.name end end browser-2.2.0/test/unit/blackberry_test.rb0000644000004100000410000000457712732547074020720 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class BlackberryTest < Minitest::Test test "detects blackberry" do browser = Browser.new(Browser["BLACKBERRY"]) assert_equal "BlackBerry", browser.name refute browser.device.tablet? assert browser.device.mobile? refute browser.modern? assert_equal "4.1.0", browser.full_version assert_equal "4", browser.version end test "detects blackberry4" do browser = Browser.new(Browser["BLACKBERRY4"]) assert_equal "BlackBerry", browser.name refute browser.modern? assert_equal "4.2.1", browser.full_version assert_equal "4", browser.version end test "detects blackberry5" do browser = Browser.new(Browser["BLACKBERRY5"]) assert_equal "BlackBerry", browser.name refute browser.device.tablet? assert browser.device.mobile? refute browser.modern? assert_equal "5.0.0.93", browser.full_version assert_equal "5", browser.version end test "detects blackberry6" do browser = Browser.new(Browser["BLACKBERRY6"]) assert_equal "BlackBerry", browser.name refute browser.device.tablet? assert browser.device.mobile? assert browser.modern? assert_equal "6.0.0.141", browser.full_version assert_equal "6", browser.version end test "detects blackberry7" do browser = Browser.new(Browser["BLACKBERRY7"]) assert_equal "BlackBerry", browser.name refute browser.device.tablet? assert browser.device.mobile? assert browser.modern? assert_equal "7.0.0.1", browser.full_version assert_equal "7", browser.version end test "detects blackberry10" do browser = Browser.new(Browser["BLACKBERRY10"]) assert_equal "BlackBerry", browser.name refute browser.device.tablet? assert browser.device.mobile? assert browser.modern? assert_equal "10.0.9.1675", browser.full_version assert_equal "10", browser.version end test "detects blackberry playbook tablet" do browser = Browser.new(Browser["PLAYBOOK"]) refute browser.platform.android? assert browser.device.tablet? refute browser.device.mobile? assert_equal "7.2.1.0", browser.full_version assert_equal "7", browser.version end test "don't detect as two different versions" do browser = Browser.new(Browser["BLACKBERRY10"]) assert browser.platform.blackberry?("~> 10.0") refute browser.platform.blackberry?("~> 7.0") end end browser-2.2.0/test/unit/adobe_air_test.rb0000644000004100000410000000066712732547074020501 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class AdobeAirTest < Minitest::Test test "detects adobe air" do browser = Browser.new(Browser["ADOBE_AIR"]) assert browser.webkit? assert_equal "0", browser.version assert_equal "0.0", browser.full_version assert_equal "Generic Browser", browser.name assert_equal "Adobe AIR", browser.platform.name assert_equal "13.0", browser.platform.version end end browser-2.2.0/test/unit/proxy_test.rb0000644000004100000410000000052012732547074017741 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class ProxyTest < Minitest::Test %w[ NOKIA OPERA_MINI UC_BROWSER ].each do |name| ua = Browser[name] test "detect #{name} as proxy" do browser = Browser.new(ua) assert browser.proxy? assert browser.meta.include?("proxy") end end end browser-2.2.0/test/unit/ios_app_test.rb0000644000004100000410000000055012732547074020215 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class IosAppTest < Minitest::Test let(:browser) { Browser.new(Browser["IOS_WEBVIEW"]) } test "detect as ios" do assert browser.platform.ios? end test "don't detect as safari" do refute browser.safari? end test "detect as webview" do assert browser.platform.ios_webview? end end browser-2.2.0/test/unit/accept_language_test.rb0000644000004100000410000000747612732547074021703 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class AcceptLanguageTest < Minitest::Test def assert_language(item, expect = {}) assert_equal expect[:code], item.code, "failed code comparison" assert_equal expect[:region], item.region, "failed region comparison" assert_equal expect[:quality], item.quality, "failed quality comparison" end test "returns full language" do language = Browser::AcceptLanguage.new("en-GB") assert_equal "en-GB", language.full end test "returns language name" do language = Browser::AcceptLanguage.new("en-GB") assert_equal "English/United Kingdom", language.name language = Browser::AcceptLanguage.new("en") assert_equal "English", language.name end test "returns nil for unknown languages" do language = Browser::AcceptLanguage.new("unknown") assert_nil language.name end test "parses language with quality" do language = Browser::AcceptLanguage.new("en-GB;q=0.8") assert_language language, code: "en", region: "GB", quality: 0.8 end test "parses language without quality" do language = Browser::AcceptLanguage.new("en-GB") assert_language language, code: "en", region: "GB", quality: 1.0 end test "parses language without region" do language = Browser::AcceptLanguage.new("en") assert_language language, code: "en", region: nil, quality: 1.0 end test "ignores multi-part region" do language = Browser::AcceptLanguage.new("az-AZ-Cyrl") assert_language language, code: "az", region: "AZ", quality: 1.0 end test "parses multi-language set" do result = Browser::AcceptLanguage.parse("fr-CA,fr;q=0.8") assert_equal 2, result.count assert_language result[0], code: "fr", region: "CA", quality: 1.0 assert_language result[1], code: "fr", region: nil, quality: 0.8 end test "parses wildcard" do result = Browser::AcceptLanguage.parse("fr-CA,*;q=0.8") assert_language result[0], code: "fr", region: "CA", quality: 1.0 assert_language result[1], code: "*", region: nil, quality: 0.8 end test "parses complex set" do result = Browser::AcceptLanguage.parse("fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1") assert_language result[0], code: "fr", region: "CA", quality: 1.0 assert_language result[1], code: "fr", region: nil, quality: 0.8 assert_language result[2], code: "en", region: "US", quality: 0.6 assert_language result[3], code: "en", region: nil, quality: 0.4 assert_language result[4], code: "*", region: nil, quality: 0.1 end test "handles random white spaces" do result = Browser::AcceptLanguage.parse("fr-CA, fr;q=0.8, en-US;q=0.6,en;q=0.4, *;q=0.1") assert_language result[0], code: "fr", region: "CA", quality: 1.0 assert_language result[1], code: "fr", region: nil, quality: 0.8 assert_language result[2], code: "en", region: "US", quality: 0.6 assert_language result[3], code: "en", region: nil, quality: 0.4 assert_language result[4], code: "*", region: nil, quality: 0.1 end test "sorts based on quality" do result = Browser::AcceptLanguage.parse("fr-CA,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5") assert_language result[0], code: "fr", region: "CA", quality: 1.0 assert_language result[1], code: "en", region: "US", quality: 0.6 assert_language result[2], code: "*", region: nil, quality: 0.5 assert_language result[3], code: "en", region: nil, quality: 0.4 assert_language result[4], code: "fr", region: nil, quality: 0.2 end test "rejects quality values equals to zero (#241)" do result = Browser::AcceptLanguage.parse("de-DE,ru;q=0.9,de;q=0.8,en;q=0.") assert_equal 3, result.size assert_language result[0], code: "de", region: "DE", quality: 1.0 assert_language result[1], code: "ru", region: nil, quality: 0.9 assert_language result[2], code: "de", region: nil, quality: 0.8 end end browser-2.2.0/test/unit/generic_test.rb0000644000004100000410000000073712732547074020206 0ustar www-datawww-datarequire "test_helper" class GenericTest < Minitest::Test test "return default msie version" do browser = Browser.new("") assert_equal "0.0", browser.msie_full_version assert_equal "0", browser.msie_version end test "return default compatibility view" do browser = Browser.new("") refute browser.compatibility_view? end test "return default safari web app mode" do browser = Browser.new("") refute browser.safari_webapp_mode? end end browser-2.2.0/test/unit/ie_test.rb0000644000004100000410000002440312732547074017163 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class IeTest < Minitest::Test test "detects ie6" do browser = Browser.new(Browser["IE6"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(6) refute browser.modern? assert_equal "6.0", browser.full_version assert_equal "6", browser.version end test "detects ie7" do browser = Browser.new(Browser["IE7"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(7) refute browser.modern? assert_equal "7.0", browser.full_version assert_equal "7", browser.version end test "detects ie8" do browser = Browser.new(Browser["IE8"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(8) refute browser.modern? refute browser.compatibility_view? assert_equal "8.0", browser.full_version assert_equal "8", browser.version end test "detects ie8 in compatibility view" do browser = Browser.new(Browser["IE8_COMPAT"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(8) refute browser.modern? assert browser.compatibility_view? assert_equal "8.0", browser.full_version assert_equal "8", browser.version assert_equal "7.0", browser.msie_full_version assert_equal "7", browser.msie_version end test "detects ie9" do browser = Browser.new(Browser["IE9"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(9) assert browser.modern? refute browser.compatibility_view? assert_equal "9.0", browser.full_version assert_equal "9", browser.version end test "detects ie9 in compatibility view" do browser = Browser.new(Browser["IE9_COMPAT"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(9) refute browser.modern? assert browser.compatibility_view? assert_equal "9.0", browser.full_version assert_equal "9", browser.version assert_equal "7.0", browser.msie_full_version assert_equal "7", browser.msie_version end test "detects ie10" do browser = Browser.new(Browser["IE10"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(10) assert browser.modern? refute browser.compatibility_view? assert_equal "10.0", browser.full_version assert_equal "10", browser.version end test "detects ie10 in compatibility view" do browser = Browser.new(Browser["IE10_COMPAT"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(10) refute browser.modern? assert browser.compatibility_view? assert_equal "10.0", browser.full_version assert_equal "10", browser.version assert_equal "7.0", browser.msie_full_version assert_equal "7", browser.msie_version end test "detects ie11" do browser = Browser.new(Browser["IE11"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(11) assert browser.modern? refute browser.compatibility_view? assert_equal "11.0", browser.full_version assert_equal "11", browser.version end test "detects ie11 in compatibility view" do browser = Browser.new(Browser["IE11_COMPAT"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(11) refute browser.modern? assert browser.compatibility_view? assert_equal "11.0", browser.full_version assert_equal "11", browser.version assert_equal "7.0", browser.msie_full_version assert_equal "7", browser.msie_version end test "detects Lumia 800" do browser = Browser.new(Browser["LUMIA800"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(9) assert_equal "9.0", browser.full_version assert_equal "9", browser.version end test "detects ie11 touch desktop pc" do browser = Browser.new(Browser["IE11_TOUCH_SCREEN"]) assert_equal "Internet Explorer", browser.name assert browser.ie? assert browser.ie?(11) assert browser.modern? refute browser.compatibility_view? refute browser.platform.windows_rt? assert browser.platform.windows_touchscreen_desktop? assert browser.platform.windows8? assert_equal "11.0", browser.full_version assert_equal "11", browser.version end test "detects Microsoft Edge" do browser = Browser.new(Browser["MS_EDGE"]) assert_equal :edge, browser.id assert_equal "Microsoft Edge", browser.name assert_equal "12.0", browser.full_version assert_equal "12", browser.version assert browser.platform.windows10? assert browser.edge? assert browser.modern? refute browser.webkit? refute browser.chrome? refute browser.safari? refute browser.device.mobile? end test "detects Microsoft Edge in compatibility view" do browser = Browser.new(Browser["MS_EDGE_COMPAT"]) assert_equal :edge, browser.id assert_equal "Microsoft Edge", browser.name assert_equal "12.0", browser.full_version assert_equal "12", browser.version assert_equal "7.0", browser.msie_full_version assert_equal "7", browser.msie_version assert browser.edge? assert browser.compatibility_view? refute browser.modern? refute browser.webkit? refute browser.chrome? refute browser.safari? refute browser.device.mobile? end test "detects Microsoft Edge Mobile" do browser = Browser.new(Browser["MS_EDGE_MOBILE"]) assert_equal :edge, browser.id assert_equal "Microsoft Edge", browser.name assert_equal "12.0", browser.full_version assert_equal "12", browser.version refute browser.platform.windows10? assert browser.platform.windows_phone? assert browser.edge? assert browser.modern? refute browser.webkit? refute browser.chrome? refute browser.safari? end test "detects IE without Trident" do browser = Browser.new(Browser["IE_WITHOUT_TRIDENT"]) assert_equal :ie, browser.id assert_equal "Internet Explorer", browser.name assert_equal "0.0", browser.msie_full_version assert_equal "0", browser.msie_version assert_equal "0.0", browser.full_version assert_equal "0", browser.version refute browser.platform.windows10? refute browser.platform.windows_phone? refute browser.edge? refute browser.modern? refute browser.device.mobile? refute browser.webkit? refute browser.chrome? refute browser.safari? end test "detects windows phone" do browser = Browser.new(Browser["WINDOWS_PHONE"]) assert browser.ie? assert_equal "7", browser.version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end test "detects windows phone 8" do browser = Browser.new(Browser["WINDOWS_PHONE8"]) assert browser.ie? assert_equal "10", browser.version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end test "detects windows phone 8.1" do browser = Browser.new(Browser["WINDOWS_PHONE_81"]) assert browser.ie? assert_equal "Internet Explorer", browser.name assert_equal :ie, browser.id assert_equal "11", browser.version assert_equal "11.0", browser.full_version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end test "detects windows mobile (windows phone 8)" do browser = Browser.new(Browser["WINDOWS_PHONE8"]) assert browser.ie? assert_equal "10", browser.version assert browser.platform.windows_phone? refute browser.platform.windows_mobile? end test "detects windows x64" do browser = Browser.new(Browser["IE10_X64_WINX64"]) assert browser.platform.windows_x64? refute browser.platform.windows_wow64? assert browser.platform.windows_x64_inclusive? end test "detects windows wow64" do browser = Browser.new(Browser["WINDOWS_WOW64"]) refute browser.platform.windows_x64? assert browser.platform.windows_wow64? assert browser.platform.windows_x64_inclusive? end test "detects windows platform" do browser = Browser.new("Windows") assert_equal :windows, browser.platform.id assert browser.platform.windows? end test "detects windows_xp" do browser = Browser.new(Browser["WINDOWS_XP"]) assert browser.platform.windows? assert browser.platform.windows_xp? end test "detects windows_vista" do browser = Browser.new(Browser["WINDOWS_VISTA"]) assert browser.platform.windows? assert browser.platform.windows_vista? end test "detects windows7" do browser = Browser.new(Browser["WINDOWS7"]) assert browser.platform.windows? assert browser.platform.windows7? end test "detects windows8" do browser = Browser.new(Browser["WINDOWS8"]) assert browser.platform.windows? assert browser.platform.windows8? refute browser.platform.windows8_1? end test "detects windows8.1" do browser = Browser.new(Browser["WINDOWS81"]) assert browser.platform.windows? assert browser.platform.windows8? assert browser.platform.windows8_1? end test "returns string representation for ie6" do browser = Browser.new(Browser["IE6"]) meta = browser.meta assert meta.include?("ie") assert meta.include?("ie6") assert meta.include?("oldie") assert meta.include?("lt-ie8") assert meta.include?("lt-ie9") assert meta.include?("windows") end test "returns string representation for ie7" do browser = Browser.new(Browser["IE7"]) meta = browser.meta assert meta.include?("ie") assert meta.include?("ie7") assert meta.include?("oldie") assert meta.include?("lt-ie8") assert meta.include?("lt-ie9") assert meta.include?("windows") end test "returns string representation for ie8" do browser = Browser.new(Browser["IE8"]) meta = browser.meta assert meta.include?("ie") assert meta.include?("ie8") assert meta.include?("lt-ie9") assert meta.include?("windows") end test "don't detect as two different versions" do browser = Browser.new(Browser["IE8"]) assert browser.ie?(8) refute browser.ie?(7) end test "more complex versioning check" do browser = Browser.new(Browser["IE8"]) assert browser.ie?(["> 7", "< 9"]) end end browser-2.2.0/test/unit/console_test.rb0000644000004100000410000000053112732547074020224 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class ConsoleTest < Minitest::Test test "detects psp" do browser = Browser.new(Browser["PSP"]) assert_equal "Generic Browser", browser.name end test "detects psp vita" do browser = Browser.new(Browser["PSP_VITA"]) assert_equal "Generic Browser", browser.name end end browser-2.2.0/test/unit/device_test.rb0000644000004100000410000001227112732547074020025 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class DeviceTest < Minitest::Test class CustomDevice < Browser::Device::Base def match? ua =~ /Custom/ end def id :custom end end test "extend matchers" do Browser::Device.matchers.unshift(CustomDevice) device = Browser::Device.new("Custom") assert_equal :custom, device.id Browser::Device.matchers.shift device = Browser::Device.new("Custom") assert_equal :unknown, device.id end test "detect generic device" do device = Browser::Device.new("") assert device.unknown? assert_equal :unknown, device.id end test "detect ipad" do device = Browser::Device.new(Browser["IOS9"]) assert device.ipad? assert_equal :ipad, device.id assert_equal "iPad", device.name end test "detect ipod" do device = Browser::Device.new(Browser["IPOD"]) assert device.ipod_touch? assert device.ipod? assert_equal :ipod_touch, device.id assert_equal "iPod Touch", device.name end test "detect iphone" do device = Browser::Device.new(Browser["IOS8"]) assert device.iphone? assert_equal :iphone, device.id assert_equal "iPhone", device.name end test "detect ps3" do device = Browser::Device.new(Browser["PLAYSTATION3"]) assert device.ps3? assert device.playstation3? assert device.playstation? assert_equal :ps3, device.id assert_equal "PlayStation 3", device.name end test "detect ps4" do device = Browser::Device.new(Browser["PLAYSTATION4"]) assert device.ps4? assert device.playstation4? assert device.playstation? assert_equal :ps4, device.id assert_equal "PlayStation 4", device.name end test "detects xbox 360" do device = Browser::Device.new(Browser["XBOX360"]) assert device.console? assert device.xbox? assert device.xbox_360? refute device.xbox_one? assert_equal :xbox_360, device.id assert_equal "Xbox 360", device.name end test "detects xbox one" do device = Browser::Device.new(Browser["XBOXONE"]) assert device.console? assert device.xbox? assert device.xbox_one? refute device.xbox_360? assert_equal :xbox_one, device.id assert_equal "Xbox One", device.name end test "detect psp" do device = Browser::Device.new(Browser["PSP"]) assert device.psp? assert_equal :psp, device.id assert_equal "PlayStation Portable", device.name end test "detect psvita" do device = Browser::Device.new(Browser["PSP_VITA"]) assert device.playstation_vita? assert device.vita? assert_equal :psvita, device.id assert_equal "PlayStation Vita", device.name end test "detect kindle" do device = Browser::Device.new(Browser["KINDLE"]) assert device.kindle? assert_equal :kindle, device.id assert_equal "Kindle", device.name refute device.silk? end %w[ KINDLE_FIRE KINDLE_FIRE_HD KINDLE_FIRE_HD_MOBILE ].each do |key| test "detect #{key} as kindle fire" do device = Browser::Device.new(Browser[key]) assert device.kindle? assert device.kindle_fire? assert_equal :kindle_fire, device.id assert_equal "Kindle Fire", device.name end end test "detect wii" do device = Browser::Device.new(Browser["NINTENDO_WII"]) assert device.nintendo_wii? assert device.console? assert device.nintendo? assert device.wii? assert_equal :wii, device.id assert_equal "Nintendo Wii", device.name end test "detect wiiu" do device = Browser::Device.new(Browser["NINTENDO_WIIU"]) assert device.nintendo_wiiu? assert device.wiiu? assert device.console? assert device.nintendo? assert_equal :wiiu, device.id assert_equal "Nintendo WiiU", device.name end test "detect blackberry playbook" do device = Browser::Device.new(Browser["PLAYBOOK"]) assert device.playbook? assert device.blackberry_playbook? assert_equal :playbook, device.id assert_equal "BlackBerry Playbook", device.name end test "detect surface" do device = Browser::Device.new(Browser["SURFACE"]) assert device.surface? assert_equal :surface, device.id assert_equal "Microsoft Surface", device.name end test "detect tv" do device = Browser::Device.new(Browser["SMART_TV"]) assert device.tv? assert_equal :tv, device.id assert_equal "TV", device.name end test "detect unknown device" do device = Browser::Device.new("") assert device.unknown? assert_equal "Unknown", device.name end %w[ ANDROID SYMBIAN MIDP IPHONE IPOD WINDOWS_MOBILE WINDOWS_PHONE WINDOWS_PHONE8 WINDOWS_PHONE_81 OPERA_MINI LUMIA800 MS_EDGE_MOBILE UC_BROWSER NOKIA OPERA_MOBI KINDLE_FIRE_HD_MOBILE ].each do |key| test "detect #{key} as mobile" do device = Browser::Device.new(Browser[key]) assert device.mobile? refute device.tablet? end end %w[ PLAYBOOK IPAD NEXUS_TABLET SURFACE XOOM NOOK SAMSUNG FIREFOX_TABLET NEXUS7 ].each do |key| test "detect #{key} as tablet" do device = Browser::Device.new(Browser[key]) assert device.tablet? refute device.mobile? end end end browser-2.2.0/test/unit/qq_test.rb0000644000004100000410000000104012732547074017177 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class QQTest < Minitest::Test test "detects QQ browser for iOS" do browser = Browser.new(Browser["QQ_BROWSER_IOS"]) assert_equal "6.3.3.432", browser.full_version assert_equal "QQ Browser", browser.name assert_equal :qq, browser.id end test "detects QQ browser for Android" do browser = Browser.new(Browser["QQ_BROWSER_ANDROID"]) assert_equal "6.2", browser.full_version assert_equal "QQ Browser", browser.name assert_equal :qq, browser.id end end browser-2.2.0/test/unit/opera_test.rb0000644000004100000410000000207012732547074017670 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class OperaTest < Minitest::Test test "detects opera" do browser = Browser.new(Browser["OPERA"]) assert_equal "Opera", browser.name assert browser.opera? refute browser.modern? assert_equal "11.64", browser.full_version assert_equal "11", browser.version end test "detects opera next" do browser = Browser.new(Browser["OPERA_NEXT"]) assert_equal "Opera", browser.name assert_equal :opera, browser.id assert browser.opera? assert browser.webkit? assert browser.modern? refute browser.chrome? assert_equal "15.0.1147.44", browser.full_version assert_equal "15", browser.version end test "detects opera mini" do browser = Browser.new(Browser["OPERA_MINI"]) assert browser.opera_mini? end test "detects opera mobi" do browser = Browser.new(Browser["OPERA_MOBI"]) assert browser.opera? end test "detects opera running in Android" do browser = Browser.new(Browser["OPERA_ANDROID"]) assert browser.platform.android? end end browser-2.2.0/test/unit/bots_test.rb0000644000004100000410000000437312732547074017541 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class BotsTest < Minitest::Test Browser.bot_user_agents.each do |key, ua| test "detect #{key} as bot" do browser = Browser.new(ua) assert browser.bot? end end test "don't detect as bot" do browser = Browser.new(Browser["CHROME"]) refute browser.bot? end test "doesn't consider empty UA as bot" do browser = Browser.new("") refute browser.bot? end test "allows setting empty string as bots" do Browser::Bot.detect_empty_ua! browser = Browser.new("") assert browser.bot? end test "doesn't detect mozilla as a bot when considering empty UA" do Browser::Bot.detect_empty_ua! browser = Browser.new("Mozilla") refute browser.bot? end test "returns bot name" do browser = Browser.new(Browser["GOOGLE_BOT"]) assert_equal "Google Bot", browser.bot.name browser = Browser.new(Browser["FACEBOOK_BOT"]) assert_equal "Facebook Bot", browser.bot.name end test "returns bot name (empty string ua detection enabled)" do Browser::Bot.detect_empty_ua! browser = Browser.new("") assert_equal browser.bot.name, "Generic Bot" end test "returns nil for non-bots" do browser = Browser.new(Browser["CHROME"]) assert_nil browser.bot.name end Browser.search_engine_user_agents.each do |key, ua| test "detects #{key} as search engine" do browser = Browser.new(ua) assert browser.bot.search_engine? end end test "detects Daumoa" do browser = Browser.new(Browser["DAUMOA"]) assert_equal :ie, browser.id assert_equal "Internet Explorer", browser.name assert_equal "0.0", browser.msie_full_version assert_equal "0", browser.msie_version assert_equal "0.0", browser.full_version assert_equal "0", browser.version assert browser.ie? assert browser.bot? refute browser.platform.windows10? refute browser.platform.windows_phone? refute browser.edge? refute browser.modern? refute browser.device.mobile? refute browser.webkit? refute browser.chrome? refute browser.safari? end test "custom android user agent (#144)" do browser = Browser.new(Browser["CUSTOM_APP"]) assert browser.platform.android? refute browser.bot? end end browser-2.2.0/test/unit/micro_messenger_test.rb0000644000004100000410000000063012732547074021743 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" class MicroMessengerTest < Minitest::Test test "detects micro messenger 6.3.15" do browser = Browser.new(Browser["MICRO_MESSENGER"]) assert browser.micro_messenger? assert browser.wechat? assert_equal "6.3.15", browser.full_version assert_equal "MicroMessenger", browser.name assert_equal :micro_messenger, browser.id end end browser-2.2.0/test/rails_test.rb0000644000004100000410000000077112732547074016723 0ustar www-datawww-data# frozen_string_literal: true require "test_helper" require "browser/rails" require "sample_app" class RailsTest < Minitest::Test include Rack::Test::Methods def app Rails.application end test "renders page" do get "/home", {}, "HTTP_USER_AGENT" => Browser["CHROME"], "HTTP_ACCEPT" => "text/html", "HTTP_ACCEPT_LANGUAGE" => "en-US;q=0.8" assert_equal 200, last_response.status assert_equal "Chrome:en-US", last_response.body end end browser-2.2.0/bots.yml0000644000004100000410000001515512732547074014742 0ustar www-datawww-data200pleasebot: "200PleaseBot" 360spider: "360Spider" abot: "CrawlDaddy, abot" addthis: "AddThis" admantx: "ADmantX Platform Semantic Analyzer" adsbot-google: "Google Adwords" advbot: "AdvBot" ahrefsbot: "Ahrefs backlinks research tool" alexa: "Alexa Crawler" apache-httpclient: "Java http library" apachebench: "ApacheBench (ab)" appengine-google: "Google App Engine" applebot: "Apple Bot" archive.org_bot: "Internet Archive (archive.org)" ask jeeves: "Ask Jeeves" asynchttpclient: "Java http and WebSocket client library" awe.sm: "Awe.sm URL expander" baidu: "Baidu" bdcbot: "Big Data Corp" bingbot: "Microsoft bing bot" bitlybot: "bit.ly bot" blekkobot: "Blekkobot" blexbot: "BLEXBot (webmeup)" bot@linkfluence.net: "Linkfluence bot" bufferbot: "BufferBot" buibui-checkbot: "buibui" butterfly: "Topsy Labs" buzztalk: "buzztalk" catchbot: "CatchBot (catchbot.com)" check_http: "Nagios monitor" cliqzbot: "Cliqzbot" cmradar/0.1: "CMRadar/0.1" coldfusion: "ColdFusion http library" comodo-webinspector-crawler: "Comodo" crowsnest: "Crowsnest" curabot: "cura.yt" curl: "curl unix CLI http client" dap/nethttp: "DAP/NetHTTP" datagnionbot: "datagnion.com/bot.html" daumoa: "Korean portal and search engine indexing bot" developers.google.com/+/web/snippet/: "Google Plus" diffbot: "Diffbot" digitalpersona fingerprint software: "HP Fingerprint scanner" domain re-animator bot: "Domain Re-Animator Bot" domainsbot: "DomainsBot" domaintunocrawler: "DomainTuno" dotbot: "Dot Bot" duckduck: "Duck Duck Go" embedly: "Embedly" eoaagent: "EOAAgent" eventmachine httpclient: "Ruby http library" everyonesocialbot: "EveryoneSocial" evrinid: "Evri bot" exabot: "Exalead's bot" exaleadcloudview: "ExaleadCloudView" facebookexternalhit: "Facebook Bot" facebot: "Facebook Bot" feedburner: "RSS bot" feedfetcher-google: "Google Feedfetcher" findxbot: "Findxbot" flipboardproxy: "FlipboardProxy" friendfeedbot: "FriendFeed" genieo: "Genieo Web filter bot" getprismatic.com: "getprismatic.com" gigabot: "Gigabot spider" gimme60bot: "Gimme60 (gimme60.com)" gimmeusabot: "Gimme60 (gimme60.com)" go http package: "Go http library" google page speed insights: "Google Page Speed Insights" google Web Preview: "Google Instant Previews crawler" google-structured-data-testing-tool: "Google-StructuredDataTestingTool" google-structureddatatestingtool: "Google-StructuredDataTestingTool" googlebot: "Google Bot" grapeshotcrawler: "GrapeshotCrawler" gravitybot: "Gravity Bot" hatena::bookmark: "Hatena::Bookmark" heritrix: "heritrix" htmlparser: "HTMLParser" http_request2: "HTTP_Request2" httpclient: "HTTPClient" https://developers.google.com/+/web/snippet: "Google+ Snippet Fetcher" hubspot: "HubSpot" ia_archiver: "Internet Archive (WayBackMachine)" icoreservice: "iCoreService" idmarch: "idmarch.org/bot.html" inagist: "URL resolver" insieve: "Insieve Bot" insitesbot: "Insitesbot" instapaper: "Instapaper" istellabot: "IstellaBot" jack: "jack" jakarta commons: "Jakarta Commons HttpClient" java: "Generic Java http library" jetslide: "Jetslide" js-kit: "URL resolver" kemvibot: "Kemvi" kimengi: "Kimengi Bot" knows.is: "knows.is" kojitsubot: "Kojitsubot" komodiabot: "KomodiaBot" kraken: "kraken" laconica: "Laconica" libwww-perl: "Perl client-server library" lijit crawler: "Lijit" linkdexbot: "Linkdex Bot" linkedinbot: "LinkedIn" linkscrawler: "LinksCrawler" linode: "Linode Longview" lipperhey: "Lipperhey" livelapbot: "Livelapbot" loadtimebot: "Load Time Bot" longurl: "URL expander service" ltx71: "ltx71.com" lumibot: "Lumibot" lwp-trivial: "Another Perl library" magpie-crawler: "magpie-crawler" mail.ru_bot: "Mail.ru Bot" meanpathbot: "meanpath" mediapartners-google: "Google Adsense bot" megaindex.ru: "MegaIndex" memorybot: "mignify.com/bot.html" metauri: "MetaURI" mfe_expand: "Mcafee spider" mir web crawler: "MIR web crawler" mj12bot: "Majestic-12 spider" mojeekbot: "Mojeek UK search crawler" mrchrome: "MrChrome" ms search 6.0 robot: "MS Search 6.0 Robot" msnbot: "Microsoft bot" nerdybot: "NerdyBot" netstate: "netEstate NE Crawler" netvibes: "Personalized dashboard bot" netzcheckbot: "netzcheck" newrelicpinger: "NewRelic monitor" newsme: "newsme" niki-bot: "niki-bot" ning: "NING - Yet Another Twitter Swarmer" nutch: "Apache search spider" openhosebot: "OpenHoseBot" orangebot: "OrangeBot" pagesinventory: "pagesinventory.com" panopta: "Monitoring service" paperlibot: "PaperLi" peerindex: "peerindex" percolatecrawler: "PercolateCrawler" perfectmarketkwtbot: "PerfectMarket" phantomjs: "PhantomJS" pingdom: "Pingdom monitoring" pinterest: "Pinterest" plukkie: "botje.com/plukkie.htm" privacyawarebot: "PrivacyAwareBot" psbot-page: "Picsearch" publiclibraryarchive.org: "publiclibraryarchive.org" pycurl: "Python http library" python-httplib2: "Python-httplib2" python-requests: "Python http library" python-urllib: "Python http library" queryseeker: "QuerySeekerSpider" quicklook: "QuickLook" re-animator: "Domain Re-Animator Bot" readability: "Readability" rebelmouse: "RebelMouse" redditbot: "Reddit Bot" relateiq: "RelateIQ" riddler: "Riddler Bot" rogerbot: "SeoMoz spider" rssmicro: "RSS/Atom Feed Robot (rssmicro.com)" ruby: "Ruby" scrapy: "Scrapy" screaming frog seo spider: Screaming Frog SEO Spider searchmetricsbot: "SearchmetricsBot" semrushbot: "SEO analysis bot" seokicks: "SEOKicks" seznambot: "SeznamBot" shopwiki: "ShopWiki" shortlinktranslate: "Link shortener" showyoubot: "Showyou iOS app spider" siege: "Joe Dog Siege" sistrix: "SISTRIX" siteuptime: "Site monitoring services" slack: "Slackbot-LinkExpanding" slackbot: "Slack Bot" slurp: "Yahoo spider" smtbot: "SimilarTech" sogou: "Chinese search engine" spbot: "OpenLinkProfiler" spider: "generic web spider" spinn3r: "Spinn3r aggregator" sputnikbot: "SputnikBot" squider: "Squider" statuscake: "StatusCake" test certificate info: "C http library?" tineye: "TinEye Bot" traackr: "Traackr Bot" trendictionbot: "Trendiction Search" turnitinbot: "TurnitinBot" tweetedtimes: "The Tweeted Times" tweetmemebot: "TweetMeMe Crawler" twikle: "Social web search bot" twitjobsearch: "TwitJobSearch" twitmunin: "Twitmunin" twitterbot: "Twitter URL expander" twurly: "Twurly" typhoeus: "Typhoeus" umbot: "uberMetrics" unwindfetch: "Gnip" uptimerobot: "Uptime Robot" vagabondo: "Vagabondo" vb project: "Visual Basic" vigil: "Vigil" vkshare: "VKontake Sharer" voilabot: "VoilaBot" vrcrawler: "Venture Radar" wasalive-bot: "Wasalive Bots" wbsearchbot: "Ware Bay Best Buys" webscout: "Webscout" wesee: "WeSEE" wget: "wget unix CLI http client" wordpress: "WordPress spider" wormly: "WormlyBot" wotbox: "Wotbox" xenu link sleuth: "Xenu Link Sleuth" xovibot: "XoviBot" yacybot: "YaCy" yandex: "Yandex" yeti: "Naver Corp" yourls: "YOURLS" zelist.ro: "feed parser" zibb: "ZIBB spider" zitebot: "Zite" zyborg: "Zyborg" browser-2.2.0/.gitignore0000644000004100000410000000003412732547074015226 0ustar www-datawww-datapkg coverage doc log *.lock browser-2.2.0/browser.gemspec0000644000004100000410000000231112732547074016266 0ustar www-datawww-datarequire "./lib/browser/version" Gem::Specification.new do |s| s.required_ruby_version = ">= 2.0" s.name = "browser" s.version = Browser::VERSION s.platform = Gem::Platform::RUBY s.authors = ["Nando Vieira"] s.email = ["fnando.vieira@gmail.com"] s.homepage = "http://github.com/fnando/browser" s.summary = "Do some browser detection with Ruby." s.description = s.summary s.license = "MIT" s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.executables = `git ls-files -- exe/*` .split("\n") .map {|f| File.basename(f) } s.require_paths = ["lib"] s.add_development_dependency "bundler", ">= 0" s.add_development_dependency "rake" s.add_development_dependency "rails" s.add_development_dependency "rack-test" s.add_development_dependency "minitest" s.add_development_dependency "minitest-utils" s.add_development_dependency "pry-meta" s.add_development_dependency "minitest-autotest" s.add_development_dependency "codeclimate-test-reporter" end browser-2.2.0/.github/0000755000004100000410000000000012732547074014601 5ustar www-datawww-databrowser-2.2.0/.github/ISSUE_TEMPLATE.md0000644000004100000410000000074512732547074017314 0ustar www-datawww-data## Description [Add feature/bug description here] ## How to reproduce [Add steps on how to reproduce this issue] ## What do you expect [Describe what do you expect to happen] ## What happened instead [Describe the actual results] ## Software: - Rails version: [Add rails version here] - Browser gem version: [Add browser gem version here] ## Full backtrace ```text [Paste full backtrace here] ``` ## Report [Visit and paste the URL here] browser-2.2.0/bot_exceptions.yml0000644000004100000410000000001512732547074017005 0ustar www-datawww-data- ruby build browser-2.2.0/search_engines.yml0000644000004100000410000000024312732547074016740 0ustar www-datawww-databaidu: "Chinese search engine" bingbot: "Microsoft bing bot" googlebot: "Google spider" slurp: "Yahoo spider" duckduckbot: "Duck Duck Go" ask jeeves: "Ask Jeeves" browser-2.2.0/CHANGELOG.md0000644000004100000410000000244412732547074015056 0ustar www-datawww-data# Changelog ## v2.2.0 - `Browser::Platform#windows?` can now compare versions. - `Browser::Platform#mac?` can now compare versions. - Detect QQ Browser. - Fix issue with Mac user agents that didn't include the version. ## v2.1.0 - Add PrivacyAwareBot, ltx71, Squider and Traackr to bots. - Match Google Structured Data alternative bot. - Match MicroMessenger (WeChat). - Match Weibo. - Detect Windows & Mac OS versions. ## v2.0.3 - Fix issue with version detection when no actual version is provided (i.e. the user agent doesn't have any version information). ## v2.0.2 - Fix issue when user agent is set to `nil`. - Fix issue with user agent without version information. ## v2.0.1 - Fix Rails integration. ## v2.0.0 - `Browser#platform` now returns instance of `Browser::Platform`, instead of a `String`. It contains information about the platform (software). - `Browser#device` was added. It returns information about the device (hardware). - `Browser#accept_language` now returns a list of `Browser::AcceptLanguage` objects. - `Browser#bot` now returns a `Browser::Bot` instance. - Safari running as web app mode is not recognized as Safari anymore. - ruby-2.3+ will always activate frozen strings. - [List of all commits since last release](https://github.com/fnando/browser/compare/v1.1.0...v2.0.0) browser-2.2.0/.bundle/0000755000004100000410000000000012732547074014570 5ustar www-datawww-databrowser-2.2.0/.bundle/config0000644000004100000410000000002412732547074015754 0ustar www-datawww-data--- BUNDLE_BIN: bin browser-2.2.0/README.md0000644000004100000410000002602512732547074014525 0ustar www-datawww-data# Browser [![Travis-CI](https://travis-ci.org/fnando/browser.png)](https://travis-ci.org/fnando/browser) [![Code Climate](https://codeclimate.com/github/fnando/browser/badges/gpa.svg)](https://codeclimate.com/github/fnando/browser) [![Test Coverage](https://codeclimate.com/github/fnando/browser/badges/coverage.svg)](https://codeclimate.com/github/fnando/browser/coverage) [![Gem](https://img.shields.io/gem/v/browser.svg)](https://rubygems.org/gems/browser) [![Gem](https://img.shields.io/gem/dt/browser.svg)](https://rubygems.org/gems/browser) Do some browser detection with Ruby. Includes ActionController integration. ## Installation ```bash gem install browser ``` ## Usage ```ruby require "browser" browser = Browser.new("Some User Agent", accept_language: "en-us") # General info browser.bot? browser.chrome? browser.core_media? browser.edge? # Newest MS browser browser.firefox? browser.full_version browser.ie? browser.ie?(6) # detect specific IE version browser.ie?([">8", "<10"]) # detect specific IE (IE9). browser.known? # has the browser been successfully detected? browser.meta # an array with several attributes browser.modern? # Webkit, Firefox 17+, IE 9+ and Opera 12+ browser.name # readable browser name browser.nokia? browser.opera? browser.opera_mini? browser.phantom_js? browser.quicktime? browser.safari? browser.safari_webapp_mode? browser.to_s # the meta info joined by space browser.uc_browser? browser.version # major version number browser.webkit? browser.webkit_full_version browser.yandex? browser.wechat? # detect the MicroMessenger(WeChat) browser.weibo? # detect Weibo embedded browser (Sina Weibo) # Get bot info browser.bot.name browser.bot.search_engine? browser.bot? # Get device info browser.device browser.device.id browser.device.name browser.device.blackberry_playbook? browser.device.console? browser.device.ipad? browser.device.iphone? browser.device.ipod_touch? browser.device.kindle? browser.device.kindle_fire? browser.device.mobile? browser.device.nintendo? browser.device.playstation? browser.device.ps3? browser.device.ps4? browser.device.psp? browser.device.silk? browser.device.surface? browser.device.tablet? browser.device.tv? browser.device.vita? browser.device.wii? browser.device.wiiu? browser.device.xbox? browser.device.xbox_360? browser.device.xbox_one? # Get platform info browser.platform browser.platform.id browser.platform.name browser.platform.version # e.g. 9 (for iOS9) browser.platform.adobe_air? browser.platform.android? browser.platform.android?(4.2) # detect Android Jelly Bean 4.2 browser.platform.blackberry? browser.platform.blackberry?(10) # detect specific BlackBerry version browser.platform.chrome_os? browser.platform.firefox_os? browser.platform.ios? # detect iOS browser.platform.ios?(9) # detect specific iOS version browser.platform.ios_app? browser.platform.ios_webview? browser.platform.ios_webview? # request performed by ios' app webview browser.platform.linux? browser.platform.mac? browser.platform.other? browser.platform.windows10? browser.platform.windows7? browser.platform.windows8? browser.platform.windows8_1? browser.platform.windows? browser.platform.windows_mobile? browser.platform.windows_phone? browser.platform.windows_rt? browser.platform.windows_touchscreen_desktop? browser.platform.windows_vista? browser.platform.windows_wow64? browser.platform.windows_x64? browser.platform.windows_x64? browser.platform.windows_x64_inclusive? browser.platform.windows_xp? ``` ### What's being detected? - For a list of platform detections, check [lib/browser/platform.rb](https://github.com/fnando/browser/blob/master/lib/browser/platform.rb) - For a list of device detections, check [lib/browser/device.rb](https://github.com/fnando/browser/blob/master/lib/browser/device.rb) - For a list of bot detections, check [bots.yml](https://github.com/fnando/browser/blob/master/bots.yml) ### What defines a modern browser? The current rules that define a modern browser are pretty loose: * Webkit * IE9+ * Microsoft Edge * Firefox 17+ * Firefox Tablet 14+ * Opera 12+ You can define your own rules. A rule must be a proc/lambda or any object that implements the method === and accepts the browser object. To redefine all rules, clear the existing rules before adding your own. ```ruby # Only Chrome Canary is considered modern. Browser.modern_rules.clear Browser.modern_rules << -> b { b.chrome? && b.version.to_i >= 37 } ``` ### Rails integration Just add it to the Gemfile. ```ruby gem "browser" ``` This adds a helper method called `browser`, that inspects your current user agent. ```erb <% if browser.ie?(6) %>

You're running an older IE version. Please update it!

<% end %> ``` ### Accept Language Parses the accept-language header from an HTTP request and produces an array of language objects sorted by quality. ```ruby browser = Browser.new("Some User Agent", accept_language: "en-us") browser.accept_language.class #=> Array language = browser.accept_language.first language.code #=> "en" language.region #=> "US" language.full #=> "en-US" language.quality #=> 1.0 language.name #=> "English/United States" ``` Result is always sorted in quality order from highest -> lowest. As per the HTTP spec: - omitting the quality value implies 1.0. - quality value equal to zero means that is not accepted by the client. ### Internet Explorer Internet Explorer has a compatibility view mode that allows newer versions (IE8+) to run as an older version. Browser will always return the navigator version, ignoring the compatibility view version, when defined. If you need to get the engine's version, you have to use `Browser#msie_version` and `Browser#msie_full_version`. So, let's say an user activates compatibility view in a IE11 browser. This is what you'll get: ```ruby browser.version #=> 11 browser.full_version #=> 11.0 browser.msie_version #=> 7 browser.msie_full_version #=> 7.0 browser.compatibility_view? #=> true browser.modern? #=> false ``` This behavior changed in `v1.0.0`; previously there wasn't a way of getting the real browser version. ### Safari iOS webviews and web apps aren't detect as Safari anymore, so be aware of that if that's your case. You can use a combination of platform and webkit detection to do whatever you want. ```ruby # iPad's Safari running as web app mode. browser = Browser.new("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") browser.safari? #=> false browser.webkit? #=> true browser.platform.ios? #=> true ``` ### Bots Browser used to detect empty user agents as bots, but this behavior has changed. If you want to bring this detection back, you can activate it through the following call: ```ruby Browser::Bot.detect_empty_ua! ``` ### Middleware You can use the `Browser::Middleware` to redirect user agents. ```ruby use Browser::Middleware do redirect_to "/upgrade" unless browser.modern? end ``` If you're using Rails, you can use the route helper methods. Just add something like the following to a initializer file (`config/initializers/browser.rb`). ```ruby Rails.configuration.middleware.use Browser::Middleware do redirect_to upgrade_path unless browser.modern? end ``` Notice that you can have multiple conditionals. ```ruby Rails.configuration.middleware.use Browser::Middleware do next if browser.bot.search_engine? redirect_to upgrade_path(browser: "oldie") if browser.ie? && !browser.modern? redirect_to upgrade_path(browser: "oldfx") if browser.firefox? && !browser.modern? end ``` If you need access to the `Rack::Request` object (e.g. to exclude a path), you can do so with `request`. ```ruby Rails.configuration.middleware.use Browser::Middleware do redirect_to upgrade_path unless browser.modern? || request.env["PATH_INFO"] == "/exclude_me" end ``` ### Migrating to v2 #### Troubleshooting ##### `TypeError: no implicit conversion of Hash into String` The class constructor now has a different signature. Change the instantiation from `Browser.new(options)` to `Browser.new(ua, options)`, where: - `ua`: must be a string representing the user agent. - `options`: must be a hash (for now it only accepts the `accept_language` option). ##### `NoMethodError: undefined method 'user_agent'` `.ua` can now be used to retrieve the full User Agent string. ## Development ### Writing code Once you've made your great commits (include tests, please): 1. [Fork](http://help.github.com/forking/) browser 2. Create a topic branch - `git checkout -b my_branch` 3. Push to your branch - `git push origin my_branch` 4. Create a pull request 5. That's it! Please respect the indentation rules and code style. And use 2 spaces, not tabs. And don't touch the version thing. ## Configuring environment To configure your environment, you must have Ruby and bundler installed. Then run `bundle install` to install all dependencies. To run tests, execute `./bin/rake`. ### Adding new features Before using your time to code a new feature, open a ticket asking if it makes sense and if it's on this project's scope. Don't forget to add a new entry to `CHANGELOG.md`. #### Adding a new bot 1. Add the user agent to `test/ua_bots.yml`. 2. Add the readable name to `bots.yml`. The key must be something that matches the user agent, in lowercased text. 3. Run tests. Don't forget to add a new entry to `CHANGELOG.md`. #### Adding a new search engine 1. Add the user agent to `test/ua_search_engines.yml`. 2. Add the same user agent to `test/ua_bots.yml`. 3. Add the readable name to `search_engines.yml`. The key must be something that matches the user agent, in lowercased text. 4. Run tests. Don't forget to add a new entry to `CHANGELOG.md`. #### Wrong browser/platform/device detection If you know how to fix it, follow the "Writing code" above. Open an issue otherwise; make sure you fill in the issue template with all the required information. ## Maintainer * Nando Vieira - http://nandovieira.com ## Contributors * https://github.com/fnando/browser/contributors ## License (The MIT License) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. browser-2.2.0/config.ru0000644000004100000410000000006212732547074015054 0ustar www-datawww-datarequire "./test/sample_app" run Rails.application