File: base.rb

package info (click to toggle)
ruby-browser 5.3.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 872 kB
  • sloc: ruby: 4,752; makefile: 13
file content (277 lines) | stat: -rw-r--r-- 7,719 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# frozen_string_literal: true

module Browser
  class Base
    include DetectVersion

    attr_reader :ua

    def initialize(ua, accept_language: nil)
      validate_size(:user_agent, ua.to_s)

      @ua = ua
      @accept_language_raw = accept_language.to_s
    end

    # Return a meta info about this browser.
    def meta
      Meta.get(self)
    end

    # Return an array with all preferred languages that this browser accepts.
    def accept_language
      @accept_language ||= begin
        validate_size(:accept_language, @accept_language_raw)
        AcceptLanguage.parse(@accept_language_raw)
      end
    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

    # Detect if browser is Microsoft Internet Explorer.
    def ie?(expected_version = nil)
      InternetExplorer.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Microsoft Edge.
    def edge?(expected_version = nil)
      Edge.new(ua).match? && detect_version?(full_version, expected_version)
    end

    def compatibility_view?
      false
    end

    def msie_full_version
      "0.0"
    end

    def msie_version
      "0"
    end

    # Detect if browser is Instagram.
    def instagram?(expected_version = nil)
      Instagram.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Snapchat.
    def snapchat?(expected_version = nil)
      Snapchat.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser if Facebook.
    def facebook?(expected_version = nil)
      Facebook.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Otter.
    def otter?(expected_version = nil)
      Otter.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is WebKit-based.
    def webkit?(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 QuickTime
    def quicktime?(expected_version = nil)
      ua.match?(/QuickTime/i) && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Apple CoreMedia.
    def core_media?(expected_version = nil)
      ua.include?("CoreMedia") && detect_version?(full_version,
                                                  expected_version)
    end

    # Detect if browser is PhantomJS
    def phantom_js?(expected_version = nil)
      PhantomJS.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Safari.
    def safari?(expected_version = nil)
      Safari.new(ua).match? && detect_version?(full_version, expected_version)
    end

    def safari_webapp_mode?
      (device.ipad? || device.iphone?) && ua.include?("AppleWebKit")
    end

    # Detect if browser is Firefox.
    def firefox?(expected_version = nil)
      Firefox.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Chrome.
    def chrome?(expected_version = nil)
      Chrome.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Opera.
    def opera?(expected_version = nil)
      Opera.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Sputnik.
    def sputnik?(expected_version = nil)
      Sputnik.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Yandex.
    def yandex?(expected_version = nil)
      Yandex.new(ua).match? && detect_version?(full_version, expected_version)
    end
    alias_method :yandex_browser?, :yandex?

    # Detect if browser is UCBrowser.
    def uc_browser?(expected_version = nil)
      UCBrowser.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Nokia S40 Ovi Browser.
    def nokia?(expected_version = nil)
      Nokia.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is MicroMessenger.
    def micro_messenger?(expected_version = nil)
      MicroMessenger.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    alias_method :wechat?, :micro_messenger?

    def weibo?(expected_version = nil)
      Weibo.new(ua).match? && detect_version?(full_version, expected_version)
    end

    def alipay?(expected_version = nil)
      Alipay.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Opera Mini.
    def opera_mini?(expected_version = nil)
      ua.include?("Opera Mini") && detect_version?(full_version,
                                                   expected_version)
    end

    # Detect if browser is DuckDuckGo.
    def duck_duck_go?(expected_version = nil)
      ua.include?("DuckDuckGo") && detect_version?(full_version,
                                                   expected_version)
    end

    # Detect if browser is Samsung.
    def samsung_browser?(expected_version = nil)
      ua.include?("SamsungBrowser") && detect_version?(full_version,
                                                       expected_version)
    end

    # Detect if browser is Huawei.
    def huawei_browser?(expected_version = nil)
      HuaweiBrowser.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Xiaomi Miui.
    def miui_browser?(expected_version = nil)
      MiuiBrowser.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Maxthon.
    def maxthon?(expected_version = nil)
      Maxthon.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is QQ.
    def qq?(expected_version = nil)
      QQ.new(ua).match? && detect_version?(full_version, expected_version)
    end

    # Detect if browser is Sougou.
    def sougou_browser?(expected_version = nil)
      SougouBrowser.new(ua).match? &&
        detect_version?(full_version, expected_version)
    end

    # Detect if browser is Google Search App
    def google_search_app?(expected_version = nil)
      ua.include?("GSA") && detect_version?(full_version, expected_version)
    end

    def webkit_full_version
      ua[%r{AppleWebKit/([\d.]+)}, 1] || "0.0"
    end

    def known?
      !unknown?
    end

    def unknown?
      id == :unknown_browser
    end

    # Detect if browser is a proxy browser.
    def proxy?
      nokia? || uc_browser? || opera_mini?
    end

    # Detect if the browser is Electron.
    def electron?(expected_version = nil)
      Electron.new(ua).match? && detect_version?(full_version, expected_version)
    end

    private def validate_size(subject, input)
      actual_bytesize = input.bytesize
      size_limit = Browser.public_send("#{subject}_size_limit")

      return if actual_bytesize < size_limit

      raise Error,
            "#{subject} cannot be larger than #{size_limit} bytes; " \
            "actual size is #{actual_bytesize} bytes"
    end
  end
end