native-fn
Version:
242 lines (232 loc) • 7.4 kB
JavaScript
;
var USER_AGENT = navigator.userAgent;
var OS;
(function (OS) {
OS["Unknown"] = "Unknown";
OS["Android"] = "Android";
OS["iOS"] = "iOS";
OS["Windows"] = "Windows";
OS["MacOS"] = "MacOS";
})(OS || (OS = {}));
var Devices;
(function (Devices) {
Devices["Unknown"] = "Unknown";
Devices["Mobile"] = "Mobile";
Devices["Desktop"] = "Desktop";
})(Devices || (Devices = {}));
var Engines;
(function (Engines) {
Engines["Unknown"] = "Unknown";
Engines["EdgeHTML"] = "EdgeHTML";
Engines["ArkWeb"] = "ArkWeb";
Engines["Blink"] = "Blink";
Engines["Presto"] = "Presto";
Engines["WebKit"] = "WebKit";
Engines["Trident"] = "Trident";
Engines["NetFront"] = "NetFront";
Engines["KHTML"] = "KHTML";
Engines["Tasman"] = "Tasman";
Engines["Gecko"] = "Gecko";
})(Engines || (Engines = {}));
var OS_RESOLVER_MAP = (function () {
function resolveIOSOrMacVersion(str) {
if (str === undefined)
return '';
return str.replace(/_/g, '.');
}
function resolveWindowsVersion(str) {
if (str === undefined)
return '';
var mapped = {
'4.90': 'ME',
'NT3.51': 'NT 3.11',
'NT4.0': 'NT 4.0',
'NT 5.0': '2000',
'NT 5.1': 'XP',
'NT 5.2': 'XP',
'NT 6.0': 'Vista',
'NT 6.1': '7',
'NT 6.2': '8',
'NT 6.3': '8.1',
'NT 6.4': '10',
'NT 10.0': '10',
'ARM': 'RT'
}[str];
if (mapped !== undefined)
return mapped;
return str;
}
function resolveVersion(str) {
if (str === undefined)
return '';
return str;
}
return [
[/android\w*[-\/.; ]?([\d.]*)/i, OS.Android, Devices.Mobile, resolveVersion],
[/microsoft windows (vista|xp)/i, OS.Windows, Devices.Desktop, resolveVersion],
[/windows (?:phone(?: os)?|mobile|iot)[\/ ]?([.\w ]*)/i, OS.Windows, Devices.Desktop, resolveWindowsVersion],
[/windows nt 6\.2; (arm)/i, OS.Windows, Devices.Desktop, resolveWindowsVersion],
[/windows[\/ ]([ntce\d. ]+\w)(?!.+xbox)/i, OS.Windows, Devices.Desktop, resolveWindowsVersion],
[/(?:win(?=[39n])|win 9x )([nt\d.]+)/i, OS.Windows, Devices.Desktop, resolveWindowsVersion],
[/[adehimnop]{4,7}\b(?:.*os (\w+) like mac|; opera)/i, OS.iOS, Devices.Mobile, resolveIOSOrMacVersion],
[/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d.]+)/i, OS.iOS, Devices.Mobile, resolveIOSOrMacVersion],
[/cfnetwork\/.+darwin/i, OS.iOS, Devices.Mobile, resolveVersion],
[/mac os x ?([\w. ]*)/i, OS.MacOS, Devices.Desktop, resolveIOSOrMacVersion],
[/(?:macintosh|mac_powerpc\b)(?!.+haiku)/i, OS.MacOS, Devices.Desktop, resolveIOSOrMacVersion],
];
})();
var ENGINE_RESOLVER_MAP = [
[/windows.+ edge\/([\w.]+)/i, Engines.EdgeHTML],
[/arkweb\/([\w.]+)/i, Engines.ArkWeb],
[/webkit\/537\.36.+chrome\/(?!27)([\w.]+)/i, Engines.Blink],
[/presto\/([\w.]+)/i, Engines.Presto],
[/webkit\/([\w.]+)/i, Engines.WebKit],
[/trident\/([\w.]+)/i, Engines.Trident],
[/netfront\/([\w.]+)/i, Engines.NetFront],
[/khtml[\/ ]\(?([\w.]+)/i, Engines.KHTML],
[/tasman[\/ ]\(?([\w.]+)/i, Engines.Tasman],
[/rv:([\w.]{1,9})\b.+gecko/i, Engines.Gecko]
];
var OS_NAME = OS.Unknown;
var DEVICE_NAME = Devices.Unknown;
Engines.Unknown;
for (var i = 0; i < OS_RESOLVER_MAP.length; i++) {
var map = OS_RESOLVER_MAP[i];
var regexp = map[0];
var os = map[1];
var device = map[2];
var resolver = map[3];
var matched = USER_AGENT.match(regexp);
if (matched !== null) {
OS_NAME = os;
resolver(matched[1]);
DEVICE_NAME = device;
break;
}
}
for (var i = 0; i < ENGINE_RESOLVER_MAP.length; i++) {
var map = ENGINE_RESOLVER_MAP[i];
var regexp = map[0];
map[1];
var matched = USER_AGENT.match(regexp);
if (matched !== null) {
matched[1];
break;
}
}
((function () {
var canvas = document.createElement('canvas');
if (typeof canvas.getContext !== 'function')
return '';
var context = canvas.getContext('webgl2') || canvas.getContext('experimental-webgl') || canvas.getContext('webgl');
if (context === null)
return '';
if (context instanceof WebGLRenderingContext || 'getParameter' in context && typeof context.getParameter === 'function') {
var extension = context.getExtension('WEBGL_debug_renderer_info');
if (extension === null)
return context.getParameter(context.RENDERER);
else
return context.getParameter(extension.UNMASKED_RENDERER_WEBGL);
}
else {
return '';
}
}))();
DEVICE_NAME === Devices.Mobile;
DEVICE_NAME === Devices.Desktop;
((function () {
if (OS_NAME === OS.iOS)
return 'standalone' in navigator && navigator.standalone;
else
return window.matchMedia('(display-mode: standalone)').matches;
}))();
function getTopmostWindow() {
try {
if (window.top && window.top !== window) {
void window.top.location.href;
return window.top;
}
}
catch (_) {
}
return window;
}
function dispatchClickEvent(element, view) {
if (view === void 0) { view = window; }
var fake;
try {
fake = new MouseEvent('click', {
bubbles: true,
cancelable: true,
view: view
});
}
catch (_) {
fake = document.createEvent('MouseEvents');
fake.initMouseEvent('click', true, true, view, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
}
element.dispatchEvent(fake);
}
function tryOpenCamera(type) {
var top = getTopmostWindow();
var document = top.document;
var input;
try {
input = document.createElement('input');
input.type = 'file';
input.tabIndex = -1;
input.accept = type + '/*';
input.setAttribute('aria-hidden', 'true');
input.style.display = 'none';
input.style.position = 'absolute';
input.style.top = '-9999px';
input.style.left = '-9999px';
if ('capture' in HTMLInputElement.prototype) {
input.capture = 'user';
}
else if (OS_NAME === OS.Android) {
var capture = '';
if (type === 'image')
capture = 'camera';
else if (type === 'video')
capture = 'camcorder';
else if (type === 'audio')
capture = 'microphone';
input.accept = type + '/*;capture=' + capture;
}
document.body.appendChild(input);
dispatchClickEvent(input, top);
}
catch (_) {
}
}
var Media = {
open: open
};
function open(type) {
switch (OS_NAME) {
case OS.Android:
case OS.iOS:
tryOpenCamera(type);
break;
case OS.Windows:
case OS.MacOS:
break;
}
}
var MediaType;
(function (MediaType) {
MediaType["Image"] = "image";
MediaType["Video"] = "video";
MediaType["Audio"] = "audio";
})(MediaType || (MediaType = {}));
var NativeMediaPlugin = {
installed: false,
name: 'Media',
module: Media,
Constants: {
MediaType: MediaType
},
Errors: {}
};
module.exports = NativeMediaPlugin;