UNPKG

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