UNPKG

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