class Browser
def self.modern_rules
Browser.modern_rules << -> b { b.chrome? && b.version >= '37' }
Browser.modern_rules.clear
# Only Chrome Canary is considered modern.
To redefine all rules, clear the existing rules before adding your own.
=== and accepts the browser object.
A rule must be a proc/lambda or any object that implements the method
Define the rules which define a modern browser.
def self.modern_rules @modern_rules ||= [] end
def chrome?
def chrome? !!(ua =~ /Chrome|CriOS/) && !opera? end
def core_media?
def core_media? !!(ua =~ /CoreMedia/) end
def firefox?
def firefox? !!(ua =~ /Firefox/) end
def full_version
def full_version _, *v = *ua.match(VERSIONS.fetch(id, VERSIONS[:default])) v.compact.first || "0.0" end
def id
def id NAMES.keys .find {|id| respond_to?("#{id}?") ? public_send("#{id}?") : id } end
def initialize(options = {}, &block)
})
:accept_language => "pt-br"
:ua => "Safari",
browser = Browser.new({
the UA and Accept-Language headers.
Create a new browser instance and set
def initialize(options = {}, &block) self.user_agent = (options[:user_agent] || options[:ua]).to_s self.accept_language = options[:accept_language].to_s yield self if block end
def meta
def meta Meta.constants.each_with_object(Set.new) do |meta_name, meta| meta_class = Meta.const_get(meta_name) meta.merge(meta_class.new(self).to_a) end.to_a end
def modern?
def modern? self.class.modern_rules.any? {|rule| rule === self } end
def name
def name NAMES[id] end
def opera?
def opera? !!(ua =~ /(Opera|OPR)/) end
def phantom_js?
def phantom_js? !!(ua =~ /PhantomJS/) end
def quicktime?
def quicktime? !!(ua =~ /QuickTime/i) end
def safari?
def safari? (ua =~ /Safari/ || safari_webapp_mode?) && ua !~ /Android|Chrome|CriOS|PhantomJS/ end
def safari_webapp_mode?
def safari_webapp_mode? (ipad? || iphone?) && ua =~ /AppleWebKit/ end
def silk?
def silk? !!(ua =~ /Silk/) end
def to_s
def to_s meta.to_a.join(" ") end
def version
def version full_version.to_s.split(".").first end
def webkit?
def webkit? !!(ua =~ /AppleWebKit/i) end