lib/browser/base.rb



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.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

    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 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