1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | 'use strict';
|
10 |
|
11 | function some(arr, callback) {
|
12 | var length = arr.length;
|
13 |
|
14 | for (var i = 0; i < length; ++i) {
|
15 | if (callback(arr[i], i)) {
|
16 | return true;
|
17 | }
|
18 | }
|
19 |
|
20 | return false;
|
21 | }
|
22 | function find(arr, callback) {
|
23 | var length = arr.length;
|
24 |
|
25 | for (var i = 0; i < length; ++i) {
|
26 | if (callback(arr[i], i)) {
|
27 | return arr[i];
|
28 | }
|
29 | }
|
30 |
|
31 | return null;
|
32 | }
|
33 | function getUserAgent(agent) {
|
34 | var userAgent = agent;
|
35 |
|
36 | if (typeof userAgent === "undefined") {
|
37 | if (typeof navigator === "undefined" || !navigator) {
|
38 | return "";
|
39 | }
|
40 |
|
41 | userAgent = navigator.userAgent || "";
|
42 | }
|
43 |
|
44 | return userAgent.toLowerCase();
|
45 | }
|
46 | function execRegExp(pattern, text) {
|
47 | try {
|
48 | return new RegExp(pattern, "g").exec(text);
|
49 | } catch (e) {
|
50 | return null;
|
51 | }
|
52 | }
|
53 | function hasUserAgentData() {
|
54 | if (typeof navigator === "undefined" || !navigator || !navigator.userAgentData) {
|
55 | return false;
|
56 | }
|
57 |
|
58 | var userAgentData = navigator.userAgentData;
|
59 | var brands = userAgentData.brands || userAgentData.uaList;
|
60 | return !!(brands && brands.length);
|
61 | }
|
62 | function findVersion(versionTest, userAgent) {
|
63 | var result = execRegExp("(" + versionTest + ")((?:\\/|\\s|:)([0-9|\\.|_]+))", userAgent);
|
64 | return result ? result[3] : "";
|
65 | }
|
66 | function convertVersion(text) {
|
67 | return text.replace(/_/g, ".");
|
68 | }
|
69 | function findPreset(presets, userAgent) {
|
70 | var userPreset = null;
|
71 | var version = "-1";
|
72 | some(presets, function (preset) {
|
73 | var result = execRegExp("(" + preset.test + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent);
|
74 |
|
75 | if (!result || preset.brand) {
|
76 | return false;
|
77 | }
|
78 |
|
79 | userPreset = preset;
|
80 | version = result[3] || "-1";
|
81 |
|
82 | if (preset.versionAlias) {
|
83 | version = preset.versionAlias;
|
84 | } else if (preset.versionTest) {
|
85 | version = findVersion(preset.versionTest.toLowerCase(), userAgent) || version;
|
86 | }
|
87 |
|
88 | version = convertVersion(version);
|
89 | return true;
|
90 | });
|
91 | return {
|
92 | preset: userPreset,
|
93 | version: version
|
94 | };
|
95 | }
|
96 | function findPresetBrand(presets, brands) {
|
97 | var brandInfo = {
|
98 | brand: "",
|
99 | version: "-1"
|
100 | };
|
101 | some(presets, function (preset) {
|
102 | var result = findBrand(brands, preset);
|
103 |
|
104 | if (!result) {
|
105 | return false;
|
106 | }
|
107 |
|
108 | brandInfo.brand = preset.id;
|
109 | brandInfo.version = preset.versionAlias || result.version;
|
110 | return brandInfo.version !== "-1";
|
111 | });
|
112 | return brandInfo;
|
113 | }
|
114 | function findBrand(brands, preset) {
|
115 | return find(brands, function (_a) {
|
116 | var brand = _a.brand;
|
117 | return execRegExp("" + preset.test, brand.toLowerCase());
|
118 | });
|
119 | }
|
120 |
|
121 | var BROWSER_PRESETS = [{
|
122 | test: "phantomjs",
|
123 | id: "phantomjs"
|
124 | }, {
|
125 | test: "whale",
|
126 | id: "whale"
|
127 | }, {
|
128 | test: "edgios|edge|edg",
|
129 | id: "edge"
|
130 | }, {
|
131 | test: "msie|trident|windows phone",
|
132 | id: "ie",
|
133 | versionTest: "iemobile|msie|rv"
|
134 | }, {
|
135 | test: "miuibrowser",
|
136 | id: "miui browser"
|
137 | }, {
|
138 | test: "samsungbrowser",
|
139 | id: "samsung internet"
|
140 | }, {
|
141 | test: "samsung",
|
142 | id: "samsung internet",
|
143 | versionTest: "version"
|
144 | }, {
|
145 | test: "chrome|crios",
|
146 | id: "chrome"
|
147 | }, {
|
148 | test: "firefox|fxios",
|
149 | id: "firefox"
|
150 | }, {
|
151 | test: "android",
|
152 | id: "android browser",
|
153 | versionTest: "version"
|
154 | }, {
|
155 | test: "safari|iphone|ipad|ipod",
|
156 | id: "safari",
|
157 | versionTest: "version"
|
158 | }];
|
159 |
|
160 | var CHROMIUM_PRESETS = [{
|
161 | test: "(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)",
|
162 | id: "chrome",
|
163 | versionTest: "chrome"
|
164 | }, {
|
165 | test: "chromium",
|
166 | id: "chrome"
|
167 | }, {
|
168 | test: "whale",
|
169 | id: "chrome",
|
170 | versionAlias: "-1",
|
171 | brand: true
|
172 | }];
|
173 | var WEBKIT_PRESETS = [{
|
174 | test: "applewebkit",
|
175 | id: "webkit",
|
176 | versionTest: "applewebkit|safari"
|
177 | }];
|
178 | var WEBVIEW_PRESETS = [{
|
179 | test: "(?=(iphone|ipad))(?!(.*version))",
|
180 | id: "webview"
|
181 | }, {
|
182 | test: "(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))",
|
183 | id: "webview"
|
184 | }, {
|
185 |
|
186 | test: "webview",
|
187 | id: "webview"
|
188 | }];
|
189 | var OS_PRESETS = [{
|
190 | test: "windows phone",
|
191 | id: "windows phone"
|
192 | }, {
|
193 | test: "windows 2000",
|
194 | id: "window",
|
195 | versionAlias: "5.0"
|
196 | }, {
|
197 | test: "windows nt",
|
198 | id: "window"
|
199 | }, {
|
200 | test: "iphone|ipad|ipod",
|
201 | id: "ios",
|
202 | versionTest: "iphone os|cpu os"
|
203 | }, {
|
204 | test: "mac os x",
|
205 | id: "mac"
|
206 | }, {
|
207 | test: "android",
|
208 | id: "android"
|
209 | }, {
|
210 | test: "tizen",
|
211 | id: "tizen"
|
212 | }, {
|
213 | test: "webos|web0s",
|
214 | id: "webos"
|
215 | }];
|
216 |
|
217 | function parseUserAgentData(osData) {
|
218 | var userAgentData = navigator.userAgentData;
|
219 | var brands = (userAgentData.uaList || userAgentData.brands).slice();
|
220 | var isMobile = userAgentData.mobile || false;
|
221 | var firstBrand = brands[0];
|
222 | var browser = {
|
223 | name: firstBrand.brand,
|
224 | version: firstBrand.version,
|
225 | majorVersion: -1,
|
226 | webkit: false,
|
227 | webkitVersion: "-1",
|
228 | chromium: false,
|
229 | chromiumVersion: "-1",
|
230 | webview: !!findPresetBrand(WEBVIEW_PRESETS, brands).brand
|
231 | };
|
232 | var os = {
|
233 | name: "unknown",
|
234 | version: "-1",
|
235 | majorVersion: -1
|
236 | };
|
237 | browser.webkit = !browser.chromium && some(WEBKIT_PRESETS, function (preset) {
|
238 | return findBrand(brands, preset);
|
239 | });
|
240 | var chromiumBrand = findPresetBrand(CHROMIUM_PRESETS, brands);
|
241 | browser.chromium = !!chromiumBrand.brand;
|
242 | browser.chromiumVersion = chromiumBrand.version;
|
243 |
|
244 | if (!browser.chromium) {
|
245 | var webkitBrand = findPresetBrand(WEBKIT_PRESETS, brands);
|
246 | browser.webkit = !!webkitBrand.brand;
|
247 | browser.webkitVersion = webkitBrand.version;
|
248 | }
|
249 |
|
250 | if (osData) {
|
251 | var platform_1 = osData.platform.toLowerCase();
|
252 | var result = find(OS_PRESETS, function (preset) {
|
253 | return new RegExp("" + preset.test, "g").exec(platform_1);
|
254 | });
|
255 | os.name = result ? result.id : platform_1;
|
256 | os.version = osData.platformVersion;
|
257 | }
|
258 |
|
259 | var browserBrand = findPresetBrand(BROWSER_PRESETS, brands);
|
260 |
|
261 | if (browserBrand.brand) {
|
262 | browser.name = browserBrand.brand;
|
263 | browser.version = osData ? osData.uaFullVersion : browserBrand.version;
|
264 | }
|
265 |
|
266 | if (navigator.platform === "Linux armv8l") {
|
267 | os.name = "android";
|
268 | } else if (browser.webkit) {
|
269 | os.name = isMobile ? "ios" : "mac";
|
270 | }
|
271 |
|
272 | if (os.name === "ios" && browser.webview) {
|
273 | browser.version = "-1";
|
274 | }
|
275 |
|
276 | os.version = convertVersion(os.version);
|
277 | browser.version = convertVersion(browser.version);
|
278 | os.majorVersion = parseInt(os.version, 10);
|
279 | browser.majorVersion = parseInt(browser.version, 10);
|
280 | return {
|
281 | browser: browser,
|
282 | os: os,
|
283 | isMobile: isMobile,
|
284 | isHints: true
|
285 | };
|
286 | }
|
287 |
|
288 | function parseUserAgent(userAgent) {
|
289 | var nextAgent = getUserAgent(userAgent);
|
290 | var isMobile = !!/mobi/g.exec(nextAgent);
|
291 | var browser = {
|
292 | name: "unknown",
|
293 | version: "-1",
|
294 | majorVersion: -1,
|
295 | webview: !!findPreset(WEBVIEW_PRESETS, nextAgent).preset,
|
296 | chromium: false,
|
297 | chromiumVersion: "-1",
|
298 | webkit: false,
|
299 | webkitVersion: "-1"
|
300 | };
|
301 | var os = {
|
302 | name: "unknown",
|
303 | version: "-1",
|
304 | majorVersion: -1
|
305 | };
|
306 |
|
307 | var _a = findPreset(BROWSER_PRESETS, nextAgent),
|
308 | browserPreset = _a.preset,
|
309 | browserVersion = _a.version;
|
310 |
|
311 | var _b = findPreset(OS_PRESETS, nextAgent),
|
312 | osPreset = _b.preset,
|
313 | osVersion = _b.version;
|
314 |
|
315 | var chromiumPreset = findPreset(CHROMIUM_PRESETS, nextAgent);
|
316 | browser.chromium = !!chromiumPreset.preset;
|
317 | browser.chromiumVersion = chromiumPreset.version;
|
318 |
|
319 | if (!browser.chromium) {
|
320 | var webkitPreset = findPreset(WEBKIT_PRESETS, nextAgent);
|
321 | browser.webkit = !!webkitPreset.preset;
|
322 | browser.webkitVersion = webkitPreset.version;
|
323 | }
|
324 |
|
325 | if (osPreset) {
|
326 | os.name = osPreset.id;
|
327 | os.version = osVersion;
|
328 | os.majorVersion = parseInt(osVersion, 10);
|
329 | }
|
330 |
|
331 | if (browserPreset) {
|
332 | browser.name = browserPreset.id;
|
333 | browser.version = browserVersion;
|
334 |
|
335 | if (browser.webview && os.name === "ios" && browser.name !== "safari") {
|
336 | browser.webview = false;
|
337 | }
|
338 | }
|
339 |
|
340 | browser.majorVersion = parseInt(browser.version, 10);
|
341 | return {
|
342 | browser: browser,
|
343 | os: os,
|
344 | isMobile: isMobile,
|
345 | isHints: false
|
346 | };
|
347 | }
|
348 |
|
349 |
|
350 |
|
351 |
|
352 |
|
353 |
|
354 |
|
355 |
|
356 |
|
357 |
|
358 |
|
359 |
|
360 |
|
361 |
|
362 |
|
363 |
|
364 |
|
365 |
|
366 |
|
367 |
|
368 |
|
369 |
|
370 | function getAccurateAgent(callback) {
|
371 | if (hasUserAgentData()) {
|
372 | return navigator.userAgentData.getHighEntropyValues(["architecture", "model", "platform", "platformVersion", "uaFullVersion"]).then(function (info) {
|
373 | var agentInfo = parseUserAgentData(info);
|
374 | callback && callback(agentInfo);
|
375 | return agentInfo;
|
376 | });
|
377 | }
|
378 |
|
379 | callback && callback(agent());
|
380 |
|
381 | if (typeof Promise === "undefined" || !Promise) {
|
382 | return null;
|
383 | }
|
384 |
|
385 | return Promise.resolve(agent());
|
386 | }
|
387 |
|
388 |
|
389 |
|
390 |
|
391 |
|
392 |
|
393 |
|
394 |
|
395 |
|
396 |
|
397 |
|
398 |
|
399 | function agent(userAgent) {
|
400 | if (typeof userAgent === "undefined" && hasUserAgentData()) {
|
401 | return parseUserAgentData();
|
402 | } else {
|
403 | return parseUserAgent(userAgent);
|
404 | }
|
405 | }
|
406 |
|
407 | var modules = {
|
408 | __proto__: null,
|
409 | getAccurateAgent: getAccurateAgent,
|
410 | 'default': agent
|
411 | };
|
412 |
|
413 | for (var name in modules) {
|
414 | agent[name] = modules[name];
|
415 | }
|
416 |
|
417 | module.exports = agent;
|
418 |
|