UNPKG

10.2 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'use strict';
10
11function 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}
22function 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}
33function 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}
46function execRegExp(pattern, text) {
47 try {
48 return new RegExp(pattern, "g").exec(text);
49 } catch (e) {
50 return null;
51 }
52}
53function 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}
62function findVersion(versionTest, userAgent) {
63 var result = execRegExp("(" + versionTest + ")((?:\\/|\\s|:)([0-9|\\.|_]+))", userAgent);
64 return result ? result[3] : "";
65}
66function convertVersion(text) {
67 return text.replace(/_/g, ".");
68}
69function 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}
96function 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}
114function findBrand(brands, preset) {
115 return find(brands, function (_a) {
116 var brand = _a.brand;
117 return execRegExp("" + preset.test, brand.toLowerCase());
118 });
119}
120
121var 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}]; // chromium's engine(blink) is based on applewebkit 537.36.
159
160var 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}];
173var WEBKIT_PRESETS = [{
174 test: "applewebkit",
175 id: "webkit",
176 versionTest: "applewebkit|safari"
177}];
178var WEBVIEW_PRESETS = [{
179 test: "(?=(iphone|ipad))(?!(.*version))",
180 id: "webview"
181}, {
182 test: "(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))",
183 id: "webview"
184}, {
185 // test webview
186 test: "webview",
187 id: "webview"
188}];
189var 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
217function 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
288function 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 * @namespace eg.agent
351 */
352
353/**
354* Extracts accuate browser and operating system information from the user agent string or client hints.
355* @ko 유저 에이전트 문자열 또는 client hints에서 정확한 브라우저와 운영체제 정보를 추출한다.
356* @function eg.agent#getAccurateAgent
357* @param - Callback function to get the accuate agent <ko>정확한 에이전트를 가져오기 위한 callback 함수</ko>
358* @return - get the accuate agent promise. If Promise are not supported, null is returned. <ko> 정확한 에이전트 promise를 가져온다. Promise를 지원 하지 않는 경우, null을 반환한다. </ko>
359* @example
360import { getAccurateAgent } from "@egjs/agent";
361// eg.agent.getAccurateAgent()
362getAccurateAgent().then(agent => {
363 const { os, browser, isMobile } = agent;
364});
365getAccurateAgent(agent => {
366 const { os, browser, isMobile } = agent;
367});
368*/
369
370function 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 * Extracts browser and operating system information from the user agent string.
389 * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다.
390 * @function eg.agent#agent
391 * @param - user agent string to parse <ko>파싱할 유저에이전트 문자열</ko>
392 * @return - agent Info <ko> 에이전트 정보 </ko>
393 * @example
394import agent from "@egjs/agent";
395// eg.agent();
396const { os, browser, isMobile } = agent();
397 */
398
399function agent(userAgent) {
400 if (typeof userAgent === "undefined" && hasUserAgentData()) {
401 return parseUserAgentData();
402 } else {
403 return parseUserAgent(userAgent);
404 }
405}
406
407var modules = {
408 __proto__: null,
409 getAccurateAgent: getAccurateAgent,
410 'default': agent
411};
412
413for (var name in modules) {
414 agent[name] = modules[name];
415}
416
417module.exports = agent;
418//# sourceMappingURL=agent.cjs.js.map