browser_util.js
6.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { NgZone } from '@angular/core';
import { global } from './facade/lang';
import { getDOM } from './private_import_platform-browser';
export var browserDetection;
export var BrowserDetection = (function () {
function BrowserDetection(ua) {
this._overrideUa = ua;
}
Object.defineProperty(BrowserDetection.prototype, "_ua", {
get: function () {
if (typeof this._overrideUa === 'string') {
return this._overrideUa;
}
return getDOM() ? getDOM().getUserAgent() : '';
},
enumerable: true,
configurable: true
});
BrowserDetection.setup = function () { browserDetection = new BrowserDetection(null); };
Object.defineProperty(BrowserDetection.prototype, "isFirefox", {
get: function () { return this._ua.indexOf('Firefox') > -1; },
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isAndroid", {
get: function () {
return this._ua.indexOf('Mozilla/5.0') > -1 && this._ua.indexOf('Android') > -1 &&
this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Chrome') == -1 &&
this._ua.indexOf('IEMobile') == -1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isEdge", {
get: function () { return this._ua.indexOf('Edge') > -1; },
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isIE", {
get: function () { return this._ua.indexOf('Trident') > -1; },
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isWebkit", {
get: function () {
return this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Edge') == -1 &&
this._ua.indexOf('IEMobile') == -1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isIOS7", {
get: function () {
return (this._ua.indexOf('iPhone OS 7') > -1 || this._ua.indexOf('iPad OS 7') > -1) &&
this._ua.indexOf('IEMobile') == -1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isSlow", {
get: function () { return this.isAndroid || this.isIE || this.isIOS7; },
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "supportsNativeIntlApi", {
// The Intl API is only natively supported in Chrome, Firefox, IE11 and Edge.
// This detector is needed in tests to make the difference between:
// 1) IE11/Edge: they have a native Intl API, but with some discrepancies
// 2) IE9/IE10: they use the polyfill, and so no discrepancies
get: function () {
return !!global.Intl && global.Intl !== global.IntlPolyfill;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isChromeDesktop", {
get: function () {
return this._ua.indexOf('Chrome') > -1 && this._ua.indexOf('Mobile Safari') == -1 &&
this._ua.indexOf('Edge') == -1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BrowserDetection.prototype, "isOldChrome", {
// "Old Chrome" means Chrome 3X, where there are some discrepancies in the Intl API.
// Android 4.4 and 5.X have such browsers by default (respectively 30 and 39).
get: function () {
return this._ua.indexOf('Chrome') > -1 && this._ua.indexOf('Chrome/3') > -1 &&
this._ua.indexOf('Edge') == -1;
},
enumerable: true,
configurable: true
});
return BrowserDetection;
}());
BrowserDetection.setup();
export function dispatchEvent(element /** TODO #9100 */, eventType /** TODO #9100 */) {
getDOM().dispatchEvent(element, getDOM().createEvent(eventType));
}
export function el(html) {
return getDOM().firstChild(getDOM().content(getDOM().createTemplate(html)));
}
export function normalizeCSS(css) {
return css.replace(/\s+/g, ' ')
.replace(/:\s/g, ':')
.replace(/'/g, '"')
.replace(/ }/g, '}')
.replace(/url\((\"|\s)(.+)(\"|\s)\)(\s*)/g, function () {
var match = [];
for (var _i = 0; _i < arguments.length; _i++) {
match[_i - 0] = arguments[_i];
}
return ("url(\"" + match[2] + "\")");
})
.replace(/\[(.+)=([^"\]]+)\]/g, function () {
var match = [];
for (var _i = 0; _i < arguments.length; _i++) {
match[_i - 0] = arguments[_i];
}
return ("[" + match[1] + "=\"" + match[2] + "\"]");
});
}
var _singleTagWhitelist = ['br', 'hr', 'input'];
export function stringifyElement(el /** TODO #9100 */) {
var result = '';
if (getDOM().isElementNode(el)) {
var tagName = getDOM().tagName(el).toLowerCase();
// Opening tag
result += "<" + tagName;
// Attributes in an ordered way
var attributeMap = getDOM().attributeMap(el);
var keys = Array.from(attributeMap.keys()).sort();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var attValue = attributeMap.get(key);
if (typeof attValue !== 'string') {
result += " " + key;
}
else {
result += " " + key + "=\"" + attValue + "\"";
}
}
result += '>';
// Children
var childrenRoot = getDOM().templateAwareRoot(el);
var children = childrenRoot ? getDOM().childNodes(childrenRoot) : [];
for (var j = 0; j < children.length; j++) {
result += stringifyElement(children[j]);
}
// Closing tag
if (_singleTagWhitelist.indexOf(tagName) == -1) {
result += "</" + tagName + ">";
}
}
else if (getDOM().isCommentNode(el)) {
result += "<!--" + getDOM().nodeValue(el) + "-->";
}
else {
result += getDOM().getText(el);
}
return result;
}
export function createNgZone() {
return new NgZone({ enableLongStackTrace: true });
}
//# sourceMappingURL=browser_util.js.map