// 当前平台是否支持V8 Break Iterator。 V8检查对于检测所有基于Blink的浏览器是必需的。
let hasV8BreakIterator;
// 我们需要对`Intl`的引用进行尝试/捕获,因为在某些情况下访问它可能导致IE抛出异常。
// 这些情况与Windows的特定版本有关,如果用户提供了一个多填充的“地图”,则可能会发生这种情况。参阅:
// https://github.com/Microsoft/ChakraCore/issues/3189
// https://github.com/angular/components/issues/15687
try {
hasV8BreakIterator = (typeof Intl !== 'undefined' && (Intl as any).v8BreakIterator);
} catch {
hasV8BreakIterator = false;
}
export class Platform {
/** 当前浏览器是否为 Microsoft Edge */
isEdge = /(edge)/i.test(navigator.userAgent);
/** 当前渲染引擎是否为 Microsoft Trident. */
isTrident = /(msie|trident)/i.test(navigator.userAgent);
// EdgeHTML和Trident模拟了Blink特定的事情,需要从此检查中排除。
/** 当前渲染引擎是否为 Blink. */
isBlink = (!!((window as any).chrome || hasV8BreakIterator) && typeof CSS !== 'undefined' && !this.isEdge && !this.isTrident);
// Webkit是EdgeHTML,Blink和Trident中userAgent的一部分。 因此,我们需要确保Webkit独立运行,并且不会用作其他引擎的基础。
/** 当前渲染引擎是否为 WebKit. */
isWebKit = /AppleWebKit/i.test(navigator.userAgent) && !this.isBlink && !this.isEdge && !this.isTrident;
/** 当前系统平台是否为 Apple iOS. */
isIos = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);
// 很难检测到普通的Gecko引擎,因为大多数浏览器将其自身识别为类似Gecko的浏览器并根据此内容修改userAgent。
// 由于我们仅涵盖了一个明确的Firefox案例,因此我们可以简单地检查Firefox而无需进行不稳定的检查
/** 当前浏览器是否为 Firefox. */
isFirefox = /(firefox|minefield)/i.test(navigator.userAgent);
// 移动端上的Trident将android平台添加到userAgent来欺骗检测。
/** 当前系统平台是否为 Android. */
isAndroid = /android/i.test(navigator.userAgent) && !this.isTrident;
// Safari浏览器将在其userAgent中包含Safari关键字。
// 一些浏览器可能会伪造此代码,而只是将Safari关键字放在userAgent中。
// 为了更安全地使用Safari,每个Safari浏览器还应该使用Webkit作为其布局引擎。
/** 当前浏览器是否为 Safari. */
isSafari = /safari/i.test(navigator.userAgent) && this.isWebKit;
}
以上代码整理自 Angular CDK
网友评论