# frozen_string_literal: truemoduleBrowserclassBaseincludeDetectVersionattr_reader:uadefinitialize(ua,accept_language: nil)validate_size(:user_agent,ua.to_s)@ua=ua@accept_language_raw=accept_language.to_send# Return a meta info about this browser.defmetaMeta.get(self)end# Return an array with all preferred languages that this browser accepts.defaccept_language@accept_language||=beginvalidate_size(:accept_language,@accept_language_raw)AcceptLanguage.parse(@accept_language_raw)endendalias_method:to_a,:meta# Return meta representation as string.defto_smeta.to_a.join(" ")enddefversionfull_version.split(".").firstend# Return the platform.defplatform@platform||=Platform.new(ua)end# Return the bot info.defbot@bot||=Bot.new(ua)end# Detect if current user agent is from a bot.defbot?bot.bot?end# Return the device info.defdevice@device||=Device.new(ua)end# Detect if browser is Microsoft Internet Explorer.defie?(expected_version=nil)InternetExplorer.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Microsoft Edge.defedge?(expected_version=nil)Edge.new(ua).match?&&detect_version?(full_version,expected_version)enddefcompatibility_view?falseenddefmsie_full_version"0.0"enddefmsie_version"0"end# Detect if browser is Instagram.definstagram?(expected_version=nil)Instagram.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Snapchat.defsnapchat?(expected_version=nil)Snapchat.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser if Facebook.deffacebook?(expected_version=nil)Facebook.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Otter.defotter?(expected_version=nil)Otter.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is WebKit-based.defwebkit?(expected_version=nil)ua.match?(/AppleWebKit/i)&&(!edge?||Edge.new(ua).chrome_based?)&&detect_version?(webkit_full_version,expected_version)end# Detect if browser is QuickTimedefquicktime?(expected_version=nil)ua.match?(/QuickTime/i)&&detect_version?(full_version,expected_version)end# Detect if browser is Apple CoreMedia.defcore_media?(expected_version=nil)ua.include?("CoreMedia")&&detect_version?(full_version,expected_version)end# Detect if browser is PhantomJSdefphantom_js?(expected_version=nil)PhantomJS.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Safari.defsafari?(expected_version=nil)Safari.new(ua).match?&&detect_version?(full_version,expected_version)enddefsafari_webapp_mode?(device.ipad?||device.iphone?)&&ua.include?("AppleWebKit")end# Detect if browser is Firefox.deffirefox?(expected_version=nil)Firefox.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Chrome.defchrome?(expected_version=nil)Chrome.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Opera.defopera?(expected_version=nil)Opera.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Sputnik.defsputnik?(expected_version=nil)Sputnik.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Yandex.defyandex?(expected_version=nil)Yandex.new(ua).match?&&detect_version?(full_version,expected_version)endalias_method:yandex_browser?,:yandex?# Detect if browser is UCBrowser.defuc_browser?(expected_version=nil)UCBrowser.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Nokia S40 Ovi Browser.defnokia?(expected_version=nil)Nokia.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is MicroMessenger.defmicro_messenger?(expected_version=nil)MicroMessenger.new(ua).match?&&detect_version?(full_version,expected_version)endalias_method:wechat?,:micro_messenger?defweibo?(expected_version=nil)Weibo.new(ua).match?&&detect_version?(full_version,expected_version)enddefalipay?(expected_version=nil)Alipay.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Opera Mini.defopera_mini?(expected_version=nil)ua.include?("Opera Mini")&&detect_version?(full_version,expected_version)end# Detect if browser is DuckDuckGo.defduck_duck_go?(expected_version=nil)ua.include?("DuckDuckGo")&&detect_version?(full_version,expected_version)end# Detect if browser is Samsung.defsamsung_browser?(expected_version=nil)ua.include?("SamsungBrowser")&&detect_version?(full_version,expected_version)end# Detect if browser is Huawei.defhuawei_browser?(expected_version=nil)HuaweiBrowser.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Xiaomi Miui.defmiui_browser?(expected_version=nil)MiuiBrowser.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Maxthon.defmaxthon?(expected_version=nil)Maxthon.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is QQ.defqq?(expected_version=nil)QQ.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Sougou.defsougou_browser?(expected_version=nil)SougouBrowser.new(ua).match?&&detect_version?(full_version,expected_version)end# Detect if browser is Google Search Appdefgoogle_search_app?(expected_version=nil)ua.include?("GSA")&&detect_version?(full_version,expected_version)enddefwebkit_full_versionua[%r{AppleWebKit/([\d.]+)},1]||"0.0"enddefknown?!unknown?enddefunknown?id==:unknown_browserend# Detect if browser is a proxy browser.defproxy?nokia?||uc_browser?||opera_mini?end# Detect if the browser is Electron.defelectron?(expected_version=nil)Electron.new(ua).match?&&detect_version?(full_version,expected_version)endprivatedefvalidate_size(subject,input)actual_bytesize=input.bytesizesize_limit=Browser.public_send("#{subject}_size_limit")returnifactual_bytesize<size_limitraiseError,"#{subject} cannot be larger than #{size_limit} bytes; "\"actual size is #{actual_bytesize} bytes"endendend