webfontloader 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/CHANGELOG +9 -0
  2. data/Gemfile +2 -8
  3. data/README.md +31 -32
  4. data/Rakefile +2 -33
  5. data/docs/EVENTS.md +10 -1
  6. data/docs/MODULES.md +4 -3
  7. data/lib/webfontloader.rb +1 -1
  8. data/spec/ascender/ascenderscript_spec.js +43 -0
  9. data/spec/core/cssclassname_spec.js +42 -0
  10. data/spec/core/cssfontfamilyname_spec.js +38 -0
  11. data/spec/core/domhelper_spec.js +158 -0
  12. data/spec/core/eventdispatcher_spec.js +209 -0
  13. data/spec/core/font_spec.js +218 -0
  14. data/spec/core/fontmoduleloader_spec.js +55 -0
  15. data/spec/core/fontruler_spec.js +33 -0
  16. data/spec/core/fontvariationdescription_spec.js +67 -0
  17. data/spec/core/fontwatcher_spec.js +204 -0
  18. data/spec/core/fontwatchrunner_spec.js +398 -0
  19. data/spec/core/size_spec.js +17 -0
  20. data/spec/core/useragentparser_spec.js +921 -0
  21. data/spec/custom/customcss_spec.js +36 -0
  22. data/spec/fontdeck/fontdeckscript_spec.js +111 -0
  23. data/spec/fonts/LICENSE.txt +93 -0
  24. data/spec/fonts/nullfont.css +1 -0
  25. data/spec/fonts/nullfont1.css +1 -0
  26. data/spec/fonts/nullfont2.css +1 -0
  27. data/spec/fonts/nullfont3.css +1 -0
  28. data/spec/fonts/sourcesans.eot +0 -0
  29. data/spec/fonts/sourcesans.otf +0 -0
  30. data/spec/fonts/sourcesans.svg +2523 -0
  31. data/spec/fonts/sourcesans.ttf +0 -0
  32. data/spec/fonts/sourcesans.woff +0 -0
  33. data/spec/fonts/sourcesansa.css +1 -0
  34. data/spec/fonts/sourcesansb.css +1 -0
  35. data/spec/google/fontapiparser_spec.js +348 -0
  36. data/spec/google/fontapiurlbuilder_spec.js +40 -0
  37. data/spec/google/googlefontapi_spec.js +123 -0
  38. data/spec/google/lastresortwebkitfontwatchrunner_spec.js +145 -0
  39. data/spec/index.html +95 -0
  40. data/spec/monotype/monotypescript_spec.js +49 -0
  41. data/spec/typekit/typekitscript_spec.js +93 -0
  42. data/src/core/domhelper.js +6 -3
  43. data/src/core/fontruler.js +1 -1
  44. data/src/core/fontwatcher.js +5 -0
  45. data/src/core/fontwatchrunner.js +7 -4
  46. data/src/monotype/monotype_script.js +4 -3
  47. data/tools/jasmine-phantomjs/jasmine-phantomjs.js +26 -0
  48. data/tools/jasmine-phantomjs/terminal-reporter.js +177 -0
  49. data/tools/jasmine/MIT.LICENSE +20 -0
  50. data/tools/jasmine/jasmine-html.js +681 -0
  51. data/tools/jasmine/jasmine.css +82 -0
  52. data/tools/jasmine/jasmine.js +2600 -0
  53. data/webfontloader.gemspec +46 -25
  54. metadata +77 -42
  55. data/src-test/ascender/ascender_script_test.js +0 -51
  56. data/src-test/core/cssclassnametest.js +0 -42
  57. data/src-test/core/cssfontfamilynametest.js +0 -54
  58. data/src-test/core/domhelpertest.js +0 -151
  59. data/src-test/core/eventdispatchertest.js +0 -275
  60. data/src-test/core/fontmoduleloadertest.js +0 -30
  61. data/src-test/core/fonttest.js +0 -121
  62. data/src-test/core/fontvariationdescriptiontest.js +0 -76
  63. data/src-test/core/fontwatchertest.js +0 -287
  64. data/src-test/core/fontwatchrunnertest.js +0 -454
  65. data/src-test/core/useragenttest.js +0 -755
  66. data/src-test/custom/customcsstest.js +0 -35
  67. data/src-test/fontdeck/fontdeck_script_test.js +0 -116
  68. data/src-test/google/fontapiparsertest.js +0 -252
  69. data/src-test/google/fontapiurlbuildertest.js +0 -71
  70. data/src-test/google/googlefontapitest.js +0 -185
  71. data/src-test/google/lastresortwebkitfontwatchrunnertest.js +0 -204
  72. data/src-test/monotype/monotype_script_test.js +0 -304
  73. data/src-test/typekit/typekit_script_test.js +0 -195
  74. data/tools/jstestdriver/JsTestDriver-1.2.1.jar +0 -0
@@ -0,0 +1,17 @@
1
+ describe('Size', function () {
2
+ var Size = webfont.Size;
3
+
4
+ it('should return true on identical sizes', function () {
5
+ expect(new Size(10, 10).equals(new Size(10, 10))).toBe(true);
6
+ });
7
+
8
+ it('should return false when two sizes are different', function () {
9
+ expect(new Size(10, 10).equals(new Size(20, 20))).toBe(false);
10
+ expect(new Size(10, 10).equals(new Size(10, 20))).toBe(false);
11
+ });
12
+
13
+ it('should return false when one font is undefined or null', function () {
14
+ expect(new Size(10, 10).equals(undefined)).toBe(false);
15
+ expect(new Size(10, 10).equals(null)).toBe(false);
16
+ });
17
+ });
@@ -0,0 +1,921 @@
1
+ describe('UserAgentParser', function () {
2
+ var UserAgentParser = webfont.UserAgentParser;
3
+
4
+ beforeEach(function () {
5
+ this.addMatchers({
6
+ toMatchUserAgent: function (expected) {
7
+ var actual = this.actual,
8
+ notText = this.isNot ? 'not' : '';
9
+
10
+ function msg(description, actual, expected) {
11
+ return function () {
12
+ return 'Expected ' + description + ' ' + actual + notText + ' to match ' + expected;
13
+ };
14
+ }
15
+
16
+ if (actual.getName() !== expected.name) {
17
+ this.message = msg('name', actual.getName(), expected.name);
18
+ return false;
19
+ }
20
+
21
+ if (actual.getVersion() !== expected.version) {
22
+ this.message = msg('version', actual.getVersion(), expected.version);
23
+ return false;
24
+ }
25
+
26
+ if (actual.getPlatform() !== expected.platform) {
27
+ this.message = msg('platform', actual.getPlatform(), expected.platform);
28
+ return false;
29
+ }
30
+
31
+ if (actual.getPlatformVersion() !== expected.platformVersion) {
32
+ this.message = msg('platform version', actual.getPlatformVersion(), expected.platformVersion);
33
+ return false;
34
+ }
35
+
36
+ if (actual.getEngine() !== expected.engine) {
37
+ this.message = msg('engine', actual.getEngine(), expected.engine);
38
+ return false;
39
+ }
40
+
41
+ if (actual.getEngineVersion() !== expected.engineVersion) {
42
+ this.message = msg('engine version', actual.getEngineVersion(), expected.engineVersion);
43
+ return false;
44
+ }
45
+
46
+ if (actual.getDocumentMode() !== expected.documentMode) {
47
+ this.message = msg('document mode', actual.getDocumentMode(), expected.documentMode);
48
+ return false;
49
+ }
50
+
51
+ if (actual.getBrowserInfo().hasWebFontSupport() !== expected.browserInfo.hasWebFontSupport) {
52
+ this.message = msg('web font support', actual.getBrowserInfo().hasWebFontSupport(), expected.browserInfo.hasWebFontSupport);
53
+ return false;
54
+ }
55
+
56
+ if (actual.getBrowserInfo().hasWebKitFallbackBug() !== expected.browserInfo.hasWebKitFallbackBug) {
57
+ this.message = msg('web kit fallback bug', actual.getBrowserInfo().hasWebKitFallbackBug(), expected.browserInfo.hasWebKitFallbackBug);
58
+ return false;
59
+ }
60
+
61
+ return true;
62
+ }
63
+ });
64
+ });
65
+
66
+ describe('#parse', function () {
67
+ function parse(userAgentString, doc) {
68
+ return new UserAgentParser(userAgentString, doc || {}).parse();
69
+ }
70
+
71
+ describe('Adobe Air', function () {
72
+ it('should detect Adobe Air', function () {
73
+ expect(parse('Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.5'))
74
+ .toMatchUserAgent({
75
+ name: 'AdobeAIR',
76
+ version: '2.5',
77
+ platform: 'Macintosh',
78
+ platformVersion: 'Unknown',
79
+ engine: 'AppleWebKit',
80
+ engineVersion: '531.9',
81
+ documentMode: undefined,
82
+ browserInfo: {
83
+ hasWebFontSupport: true,
84
+ hasWebKitFallbackBug: true
85
+ }
86
+ });
87
+ });
88
+
89
+ it('should detect unsupported Adobe Air browsers', function () {
90
+ expect(parse('Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.0'))
91
+ .toMatchUserAgent({
92
+ name: 'AdobeAIR',
93
+ version: '2.0',
94
+ platform: 'Macintosh',
95
+ platformVersion: 'Unknown',
96
+ engine: 'AppleWebKit',
97
+ engineVersion: '531.9',
98
+ documentMode: undefined,
99
+ browserInfo: {
100
+ hasWebFontSupport: false,
101
+ hasWebKitFallbackBug: true
102
+ }
103
+ });
104
+ });
105
+ });
106
+
107
+ describe('Firefox', function () {
108
+ it('should detect Firefox', function () {
109
+ expect(parse('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1'))
110
+ .toMatchUserAgent({
111
+ name: 'Firefox',
112
+ version: '3.6.3',
113
+ platform: 'Macintosh',
114
+ platformVersion: '10.5',
115
+ engine: 'Gecko',
116
+ engineVersion: '1.9.2.3',
117
+ documentMode: undefined,
118
+ browserInfo: {
119
+ hasWebFontSupport: true,
120
+ hasWebKitFallbackBug: false
121
+ }
122
+ });
123
+
124
+ expect(parse('Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.2a1pre) Gecko/20090405 Ubuntu/9.04 (jaunty) Firefox/3.6a1pre'))
125
+ .toMatchUserAgent({
126
+ name: 'Firefox',
127
+ version: '3.6a1pre',
128
+ platform: 'Linux',
129
+ platformVersion: 'i686',
130
+ engine: 'Gecko',
131
+ engineVersion: '1.9.2a1pre',
132
+ documentMode: undefined,
133
+ browserInfo: {
134
+ hasWebFontSupport: true,
135
+ hasWebKitFallbackBug: false
136
+ }
137
+ });
138
+ });
139
+
140
+ it('should detect Firefox 4 beta', function () {
141
+ expect(parse('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:2.0b1) Gecko/20100630 Firefox/4.0b1'))
142
+ .toMatchUserAgent({
143
+ name: 'Firefox',
144
+ version: '4.0b1',
145
+ platform: 'Macintosh',
146
+ platformVersion: '10.6',
147
+ engine: 'Gecko',
148
+ engineVersion: '2.0b1',
149
+ documentMode: undefined,
150
+ browserInfo: {
151
+ hasWebFontSupport: true,
152
+ hasWebKitFallbackBug: false
153
+ }
154
+ });
155
+ });
156
+
157
+ it('should detect Firefox on Android', function () {
158
+ // This useragent has been slightly doctored with versions to ensure the right
159
+ // info is coming from the right places.
160
+ expect(parse('Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/15.0 Firefox/14.0'))
161
+ .toMatchUserAgent({
162
+ name: 'Firefox',
163
+ version: '14.0',
164
+ platform: 'Android',
165
+ platformVersion: 'Unknown',
166
+ engine: 'Gecko',
167
+ engineVersion: '13.0',
168
+ documentMode: undefined,
169
+ browserInfo: {
170
+ hasWebFontSupport: true,
171
+ hasWebKitFallbackBug: false
172
+ }
173
+ });
174
+ });
175
+
176
+ it('should detect Firefox without version', function () {
177
+ expect(parse('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081202 Firefox (Debian-2.0.0.19-0etch1)'))
178
+ .toMatchUserAgent({
179
+ name: 'Firefox',
180
+ version: 'Unknown',
181
+ platform: 'Linux',
182
+ platformVersion: 'i686',
183
+ engine: 'Gecko',
184
+ engineVersion: '1.8.1.19',
185
+ documentMode: undefined,
186
+ browserInfo: {
187
+ hasWebFontSupport: false,
188
+ hasWebKitFallbackBug: false
189
+ }
190
+ });
191
+ });
192
+ });
193
+
194
+ describe('Chrome', function () {
195
+ it('should detect Chrome', function () {
196
+ expect(parse('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2'))
197
+ .toMatchUserAgent({
198
+ name: 'Chrome',
199
+ version: '5.0.342.9',
200
+ platform: 'Macintosh',
201
+ platformVersion: '10_5_8',
202
+ engine: 'AppleWebKit',
203
+ engineVersion: '533.2',
204
+ documentMode: undefined,
205
+ browserInfo: {
206
+ hasWebFontSupport: true,
207
+ hasWebKitFallbackBug: true
208
+ }
209
+ });
210
+ });
211
+
212
+ it('should detect Chrome on ChromeOS', function () {
213
+ expect(parse('Mozilla/5.0 (X11; CrOS i686 1660.57.0) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.46 Safari/535.19'))
214
+ .toMatchUserAgent({
215
+ name: 'Chrome',
216
+ version: '18.0.1025.46',
217
+ platform: 'CrOS',
218
+ platformVersion: 'i686 1660.57.0',
219
+ engine: 'AppleWebKit',
220
+ engineVersion: '535.19',
221
+ documentMode: undefined,
222
+ browserInfo: {
223
+ hasWebFontSupport: true,
224
+ hasWebKitFallbackBug: true
225
+ }
226
+ });
227
+ });
228
+
229
+ it('should detect Chrome on Android', function () {
230
+ expect(parse('Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Nexus S Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7'))
231
+ .toMatchUserAgent({
232
+ name: 'Chrome',
233
+ version: '16.0.912.75',
234
+ platform: 'Android',
235
+ platformVersion: '4.0.3',
236
+ engine: 'AppleWebKit',
237
+ engineVersion: '535.7',
238
+ documentMode: undefined,
239
+ browserInfo: {
240
+ hasWebFontSupport: true,
241
+ hasWebKitFallbackBug: true
242
+ }
243
+ });
244
+ });
245
+
246
+ it('should detect Chrome on iPad', function () {
247
+ expect(parse('Mozilla/5.0 (iPad; U; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3'))
248
+ .toMatchUserAgent({
249
+ name: 'Chrome',
250
+ version: '19.0.1084.60',
251
+ platform: 'iPad',
252
+ platformVersion: '5_1_1',
253
+ engine: 'AppleWebKit',
254
+ engineVersion: '534.46.0',
255
+ documentMode: undefined,
256
+ browserInfo: {
257
+ hasWebFontSupport: true,
258
+ hasWebKitFallbackBug: true
259
+ }
260
+ });
261
+ });
262
+
263
+ it('should detect Chrome on iPod', function () {
264
+ expect(parse('Mozilla/5.0 (iPod; U; CPU iPhone OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3'))
265
+ .toMatchUserAgent({
266
+ name: 'Chrome',
267
+ version: '19.0.1084.60',
268
+ platform: 'iPod',
269
+ platformVersion: '5_1_1',
270
+ engine: 'AppleWebKit',
271
+ engineVersion: '534.46.0',
272
+ documentMode: undefined,
273
+ browserInfo: {
274
+ hasWebFontSupport: true,
275
+ hasWebKitFallbackBug: true
276
+ }
277
+ });
278
+ });
279
+ });
280
+
281
+ describe('Safari', function () {
282
+ it('should detect Safari', function () {
283
+ expect(parse('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10'))
284
+ .toMatchUserAgent({
285
+ name: 'Safari',
286
+ version: '4.0.4',
287
+ platform: 'Macintosh',
288
+ platformVersion: '10_5_8',
289
+ engine: 'AppleWebKit',
290
+ engineVersion: '531.21.8',
291
+ documentMode: undefined,
292
+ browserInfo: {
293
+ hasWebFontSupport: true,
294
+ hasWebKitFallbackBug: true
295
+ }
296
+ });
297
+
298
+ expect(parse('Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; tr) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2'))
299
+ .toMatchUserAgent({
300
+ name: 'Safari',
301
+ version: '4.0dp1',
302
+ platform: 'Macintosh',
303
+ platformVersion: '10_4_11',
304
+ engine: 'AppleWebKit',
305
+ engineVersion: '528.4+',
306
+ documentMode: undefined,
307
+ browserInfo: {
308
+ hasWebFontSupport: true,
309
+ hasWebKitFallbackBug: true
310
+ }
311
+ });
312
+ });
313
+
314
+ it('should detect Safari on iPhone', function () {
315
+ expect(parse('Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16'))
316
+ .toMatchUserAgent({
317
+ name: 'Safari',
318
+ version: '4.0',
319
+ platform: 'iPhone',
320
+ platformVersion: '3_1_2',
321
+ engine: 'AppleWebKit',
322
+ engineVersion: '528.18',
323
+ documentMode: undefined,
324
+ browserInfo: {
325
+ hasWebFontSupport: true,
326
+ hasWebKitFallbackBug: true
327
+ }
328
+ });
329
+ });
330
+
331
+ it('should detect Safari on iPad', function () {
332
+ expect(parse('Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10'))
333
+ .toMatchUserAgent({
334
+ name: 'Safari',
335
+ version: '4.0.4',
336
+ platform: 'iPad',
337
+ platformVersion: '3_2',
338
+ engine: 'AppleWebKit',
339
+ engineVersion: '531.21.10',
340
+ documentMode: undefined,
341
+ browserInfo: {
342
+ hasWebFontSupport: true,
343
+ hasWebKitFallbackBug: true
344
+ }
345
+ });
346
+
347
+ expect(parse('Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B360 Safari/531.21.10"'))
348
+ .toMatchUserAgent({
349
+ name: 'Safari',
350
+ version: '4.0.4',
351
+ platform: 'iPad',
352
+ platformVersion: '3_2',
353
+ engine: 'AppleWebKit',
354
+ engineVersion: '531.21.10',
355
+ documentMode: undefined,
356
+ browserInfo: {
357
+ hasWebFontSupport: true,
358
+ hasWebKitFallbackBug: true
359
+ }
360
+ });
361
+
362
+ expect(parse('Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10'))
363
+ .toMatchUserAgent({
364
+ name: 'Safari',
365
+ version: '4.0.4',
366
+ platform: 'iPad',
367
+ platformVersion: '3_2',
368
+ engine: 'AppleWebKit',
369
+ engineVersion: '531.21.10',
370
+ documentMode: undefined,
371
+ browserInfo: {
372
+ hasWebFontSupport: true,
373
+ hasWebKitFallbackBug: true
374
+ }
375
+ });
376
+ });
377
+
378
+ it('should detect Safari on iPod', function () {
379
+ expect(parse('Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Mobile/5H11a'))
380
+ .toMatchUserAgent({
381
+ name: 'Unknown',
382
+ version: 'Unknown',
383
+ platform: 'iPod',
384
+ platformVersion: '2_2_1',
385
+ engine: 'AppleWebKit',
386
+ engineVersion: '525.18.1',
387
+ documentMode: undefined,
388
+ browserInfo: {
389
+ hasWebFontSupport: true,
390
+ hasWebKitFallbackBug: true
391
+ }
392
+ });
393
+
394
+ expect(parse('Mozilla/5.0 (iPod; U; CPU iPhone OS 3_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7C144 Safari/528.16'))
395
+ .toMatchUserAgent({
396
+ name: 'Safari',
397
+ version: '4.0',
398
+ platform: 'iPod',
399
+ platformVersion: '3_1',
400
+ engine: 'AppleWebKit',
401
+ engineVersion: '528.18',
402
+ documentMode: undefined,
403
+ browserInfo: {
404
+ hasWebFontSupport: true,
405
+ hasWebKitFallbackBug: true
406
+ }
407
+ });
408
+ });
409
+ });
410
+
411
+ describe('Internet Explorer', function () {
412
+ it('should detect Internet Explorer', function () {
413
+ expect(parse('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'))
414
+ .toMatchUserAgent({
415
+ name: 'MSIE',
416
+ version: '7.0',
417
+ platform: 'Windows',
418
+ platformVersion: '5.1',
419
+ engine: 'MSIE',
420
+ engineVersion: '7.0',
421
+ documentMode: undefined,
422
+ browserInfo: {
423
+ hasWebFontSupport: true,
424
+ hasWebKitFallbackBug: false
425
+ }
426
+ });
427
+
428
+ expect(parse('Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)'))
429
+ .toMatchUserAgent({
430
+ name: 'MSIE',
431
+ version: '7.0b',
432
+ platform: 'Windows',
433
+ platformVersion: '5.1',
434
+ engine: 'MSIE',
435
+ engineVersion: '7.0b',
436
+ documentMode: undefined,
437
+ browserInfo: {
438
+ hasWebFontSupport: true,
439
+ hasWebKitFallbackBug: false
440
+ }
441
+ });
442
+ });
443
+
444
+ it('should detect minimal Internet Explorer', function () {
445
+ expect(parse('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'))
446
+ .toMatchUserAgent({
447
+ name: 'MSIE',
448
+ version: '7.0',
449
+ platform: 'Windows',
450
+ platformVersion: '5.1',
451
+ engine: 'MSIE',
452
+ engineVersion: '7.0',
453
+ documentMode: undefined,
454
+ browserInfo: {
455
+ hasWebFontSupport: true,
456
+ hasWebKitFallbackBug: false
457
+ }
458
+ });
459
+ });
460
+
461
+ it('should detect Internet Explorer on Windows Phone', function () {
462
+ expect(parse('Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; ARM; Touch; IEMobile/10.0; <Manufacturer>; <Device>; <Operator>)'))
463
+ .toMatchUserAgent({
464
+ name: 'MSIE',
465
+ version: '10.0',
466
+ platform: 'Windows Phone',
467
+ platformVersion: '8.0',
468
+ engine: 'MSIE',
469
+ engineVersion: '10.0',
470
+ documentMode: undefined,
471
+ browserInfo: {
472
+ hasWebFontSupport: true,
473
+ hasWebKitFallbackBug: false
474
+ }
475
+ });
476
+ });
477
+
478
+ it('should detect unsupported Internet Explorer on Windows Phone', function () {
479
+ expect(parse('Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)'))
480
+ .toMatchUserAgent({
481
+ name: 'MSIE',
482
+ version: '9.0',
483
+ platform: 'Windows Phone',
484
+ platformVersion: '7.5',
485
+ engine: 'MSIE',
486
+ engineVersion: '9.0',
487
+ documentMode: undefined,
488
+ browserInfo: {
489
+ hasWebFontSupport: false,
490
+ hasWebKitFallbackBug: false
491
+ }
492
+ });
493
+ });
494
+
495
+ it('should detect Internet Explorer on Mac', function () {
496
+ expect(parse('Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)'))
497
+ .toMatchUserAgent({
498
+ name: 'MSIE',
499
+ version: '5.23',
500
+ platform: 'Macintosh',
501
+ platformVersion: 'Unknown',
502
+ engine: 'MSIE',
503
+ engineVersion: '5.23',
504
+ documentMode: undefined,
505
+ browserInfo: {
506
+ hasWebFontSupport: false,
507
+ hasWebKitFallbackBug: false
508
+ }
509
+ });
510
+ });
511
+
512
+ it('should detect Internet Explorer with Trident version', function () {
513
+ expect(parse('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)', { documentMode: 8 }))
514
+ .toMatchUserAgent({
515
+ name: 'MSIE',
516
+ version: '8.0',
517
+ platform: 'Windows',
518
+ platformVersion: '6.1',
519
+ engine: 'MSIE',
520
+ engineVersion: '8.0',
521
+ documentMode: 8,
522
+ browserInfo: {
523
+ hasWebFontSupport: true,
524
+ hasWebKitFallbackBug: false
525
+ }
526
+ });
527
+ });
528
+ });
529
+
530
+ describe('Builtin Browser', function () {
531
+ it('should detect Android builtin browser', function () {
532
+ expect(parse('Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; LG-P505R Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'))
533
+ .toMatchUserAgent({
534
+ name: 'BuiltinBrowser',
535
+ version: 'Unknown',
536
+ platform: 'Android',
537
+ platformVersion: '2.2.1',
538
+ engine: 'AppleWebKit',
539
+ engineVersion: '533.1',
540
+ documentMode: undefined,
541
+ browserInfo: {
542
+ hasWebFontSupport: true,
543
+ hasWebKitFallbackBug: true
544
+ }
545
+ });
546
+ });
547
+
548
+ it('should detect unsupported Android builtin browser', function () {
549
+ expect(parse('Mozilla/5.0 (Linux; U; Android 2.1-update1; en-us; Nexus One Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17'))
550
+ .toMatchUserAgent({
551
+ name: 'BuiltinBrowser',
552
+ version: 'Unknown',
553
+ platform: 'Android',
554
+ platformVersion: '2.1-update1',
555
+ engine: 'AppleWebKit',
556
+ engineVersion: '530.17',
557
+ documentMode: undefined,
558
+ browserInfo: {
559
+ hasWebFontSupport: false,
560
+ hasWebKitFallbackBug: true
561
+ }
562
+ });
563
+ });
564
+
565
+ it('should detect Android builtin browser in Desktop mode (Nexus 7)', function () {
566
+ expect(parse('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24'))
567
+ .toMatchUserAgent({
568
+ name: 'Chrome',
569
+ version: '11.0.696.34',
570
+ platform: 'Linux',
571
+ platformVersion: 'Unknown',
572
+ engine: 'AppleWebKit',
573
+ engineVersion: '534.24',
574
+ documentMode: undefined,
575
+ browserInfo: {
576
+ hasWebFontSupport: true,
577
+ hasWebKitFallbackBug: true
578
+ }
579
+ });
580
+ });
581
+
582
+ it('should detect Android builtin browser in Mobile mode (Nexus 7)', function () {
583
+ expect(parse('Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build/MASTER) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30'))
584
+ .toMatchUserAgent({
585
+ name: 'BuiltinBrowser',
586
+ version: 'Unknown',
587
+ platform: 'Android',
588
+ platformVersion: '4.1.2',
589
+ engine: 'AppleWebKit',
590
+ engineVersion: '534.30',
591
+ documentMode: undefined,
592
+ browserInfo: {
593
+ hasWebFontSupport: true,
594
+ hasWebKitFallbackBug: true
595
+ }
596
+ });
597
+ });
598
+
599
+ it('should detect Android builtin browser in Desktop mode (Nexus S)', function () {
600
+ expect(parse('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24'))
601
+ .toMatchUserAgent({
602
+ name: 'Chrome',
603
+ version: '11.0.696.34',
604
+ platform: 'Linux',
605
+ platformVersion: 'Unknown',
606
+ engine: 'AppleWebKit',
607
+ engineVersion: '534.24',
608
+ documentMode: undefined,
609
+ browserInfo: {
610
+ hasWebFontSupport: true,
611
+ hasWebKitFallbackBug: true
612
+ }
613
+ });
614
+ });
615
+
616
+ it('should detect Android builtin browser in Mobile mode (Nexus S)', function () {
617
+ expect(parse('Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; Nexus S Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'))
618
+ .toMatchUserAgent({
619
+ name: 'BuiltinBrowser',
620
+ version: 'Unknown',
621
+ platform: 'Android',
622
+ platformVersion: '4.1.2',
623
+ engine: 'AppleWebKit',
624
+ engineVersion: '534.30',
625
+ documentMode: undefined,
626
+ browserInfo: {
627
+ hasWebFontSupport: true,
628
+ hasWebKitFallbackBug: true
629
+ }
630
+ });
631
+ });
632
+
633
+ it('should detect BlackBerry 10 as supporting web fonts', function () {
634
+ expect(parse('Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.388 Mobile Safari/537.3+'))
635
+ .toMatchUserAgent({
636
+ name: 'BuiltinBrowser',
637
+ version: 'Unknown',
638
+ platform: 'BlackBerry',
639
+ platformVersion: '10.0.9.388',
640
+ engine: 'AppleWebKit',
641
+ engineVersion: '537.3+',
642
+ documentMode: undefined,
643
+ browserInfo: {
644
+ hasWebFontSupport: true,
645
+ hasWebKitFallbackBug: false
646
+ }
647
+ });
648
+ });
649
+
650
+ it('should detect BlackBerry < 10 as not supporting web fonts', function () {
651
+ expect(parse('Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+'))
652
+ .toMatchUserAgent({
653
+ name: 'BuiltinBrowser',
654
+ version: 'Unknown',
655
+ platform: 'BlackBerry',
656
+ platformVersion: '7.1.0.346',
657
+ engine: 'AppleWebKit',
658
+ engineVersion: '534.11+',
659
+ documentMode: undefined,
660
+ browserInfo: {
661
+ hasWebFontSupport: false,
662
+ hasWebKitFallbackBug: true
663
+ }
664
+ });
665
+ });
666
+ });
667
+
668
+ describe('Opera', function () {
669
+ it('should detect Opera', function () {
670
+ expect(parse('Opera/9.80 (Linux i686; U; en) Presto/2.5.22 Version/10.51'))
671
+ .toMatchUserAgent({
672
+ name: 'Opera',
673
+ version: '10.51',
674
+ platform: 'Linux',
675
+ platformVersion: 'i686',
676
+ engine: 'Presto',
677
+ engineVersion: '2.5.22',
678
+ documentMode: undefined,
679
+ browserInfo: {
680
+ hasWebFontSupport: true,
681
+ hasWebKitFallbackBug: false
682
+ }
683
+ });
684
+ });
685
+
686
+ it('should detect Opera with Firefox in useragent', function () {
687
+ expect(parse('Mozilla/5.0 (Linux i686 ; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.70'))
688
+ .toMatchUserAgent({
689
+ name: 'Opera',
690
+ version: '9.70',
691
+ platform: 'Linux',
692
+ platformVersion: 'i686',
693
+ engine: 'Gecko',
694
+ engineVersion: '1.8.1',
695
+ documentMode: undefined,
696
+ browserInfo: {
697
+ hasWebFontSupport: false,
698
+ hasWebKitFallbackBug: false
699
+ }
700
+ });
701
+ });
702
+
703
+ it('should detect Opera before v10', function () {
704
+ expect(parse('Opera/9.64 (X11; Linux i686; U; Linux Mint; nb) Presto/2.1.1'))
705
+ .toMatchUserAgent({
706
+ name: 'Opera',
707
+ version: '9.64',
708
+ platform: 'Linux',
709
+ platformVersion: 'i686',
710
+ engine: 'Presto',
711
+ engineVersion: '2.1.1',
712
+ documentMode: undefined,
713
+ browserInfo: {
714
+ hasWebFontSupport: false,
715
+ hasWebKitFallbackBug: false
716
+ }
717
+ });
718
+ });
719
+
720
+ it('should detect Opera Mobile on Android', function () {
721
+ expect(parse('Opera/9.80 (Android 4.1.1; Linux; Opera Mobi/ADR-1207201819; U; en) Presto/2.10.254 Version/12.00'))
722
+ .toMatchUserAgent({
723
+ name: 'Opera',
724
+ version: '12.00',
725
+ platform: 'Android',
726
+ platformVersion: '4.1.1',
727
+ engine: 'Presto',
728
+ engineVersion: '2.10.254',
729
+ documentMode: undefined,
730
+ browserInfo: {
731
+ hasWebFontSupport: true,
732
+ hasWebKitFallbackBug: false
733
+ }
734
+ });
735
+ });
736
+
737
+ it('should detect Opera Mini on Android', function () {
738
+ expect(parse('Opera/9.80 (Android; Opera Mini/7.0.29952/28.2144; U; en) Presto/2.8.119 Version/11.10'))
739
+ .toMatchUserAgent({
740
+ name: 'OperaMini',
741
+ version: '7.0.29952',
742
+ platform: 'Android',
743
+ platformVersion: 'Unknown',
744
+ engine: 'Presto',
745
+ engineVersion: '2.8.119',
746
+ documentMode: undefined,
747
+ browserInfo: {
748
+ hasWebFontSupport: false,
749
+ hasWebKitFallbackBug: false
750
+ }
751
+ });
752
+ });
753
+ });
754
+
755
+ describe('WebKit fallback bug', function () {
756
+ it('should detect the bug in older browsers', function () {
757
+ expect(parse('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5'))
758
+ .toMatchUserAgent({
759
+ name: 'Chrome',
760
+ version: '19.0.1084.9',
761
+ platform: 'Linux',
762
+ platformVersion: 'Unknown',
763
+ engine: 'AppleWebKit',
764
+ engineVersion: '536.5',
765
+ documentMode: undefined,
766
+ browserInfo: {
767
+ hasWebFontSupport: true,
768
+ hasWebKitFallbackBug: true
769
+ }
770
+ });
771
+ });
772
+
773
+ it('should detect the bug in older browsers', function () {
774
+ expect(parse('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.814.2 Safari/536.11'))
775
+ .toMatchUserAgent({
776
+ name: 'Chrome',
777
+ version: '20.0.814.2',
778
+ platform: 'Linux',
779
+ platformVersion: 'Unknown',
780
+ engine: 'AppleWebKit',
781
+ engineVersion: '536.11',
782
+ documentMode: undefined,
783
+ browserInfo: {
784
+ hasWebFontSupport: true,
785
+ hasWebKitFallbackBug: false
786
+ }
787
+ });
788
+ });
789
+ });
790
+
791
+ describe('Invented user agents', function () {
792
+ it('should detect Gecko as supporting web fonts', function () {
793
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.9.1.4) Gecko/20091016 (.NET CLR 3.5.30729)'))
794
+ .toMatchUserAgent({
795
+ name: 'Mozilla',
796
+ version: 'Unknown',
797
+ platform: 'Windows',
798
+ platformVersion: '5.1',
799
+ engine: 'Gecko',
800
+ engineVersion: '1.9.1.4',
801
+ documentMode: undefined,
802
+ browserInfo: {
803
+ hasWebFontSupport: true,
804
+ hasWebKitFallbackBug: false
805
+ }
806
+ });
807
+ });
808
+
809
+ it('should detect unknown versions of Gecko as supporting web fonts', function () {
810
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:2.5.8) Gecko/20091016 (.NET CLR 3.5.30729)'))
811
+ .toMatchUserAgent({
812
+ name: 'Mozilla',
813
+ version: 'Unknown',
814
+ platform: 'Windows',
815
+ platformVersion: '5.1',
816
+ engine: 'Gecko',
817
+ engineVersion: '2.5.8',
818
+ documentMode: undefined,
819
+ browserInfo: {
820
+ hasWebFontSupport: true,
821
+ hasWebKitFallbackBug: false
822
+ }
823
+ });
824
+ });
825
+
826
+ it('should detect Gecko v1.10 as supporting web fonts', function () {
827
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.10.1b) Gecko/20091016 (.NET CLR 3.5.30729)'))
828
+ .toMatchUserAgent({
829
+ name: 'Mozilla',
830
+ version: 'Unknown',
831
+ platform: 'Windows',
832
+ platformVersion: '5.1',
833
+ engine: 'Gecko',
834
+ engineVersion: '1.10.1b',
835
+ documentMode: undefined,
836
+ browserInfo: {
837
+ hasWebFontSupport: true,
838
+ hasWebKitFallbackBug: false
839
+ }
840
+ });
841
+ });
842
+
843
+ it('should detect Gecko with an invalid version number as not supporting web fonts', function () {
844
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.b) Gecko/20091016 (.NET CLR 3.5.30729)'))
845
+ .toMatchUserAgent({
846
+ name: 'Mozilla',
847
+ version: 'Unknown',
848
+ platform: 'Windows',
849
+ platformVersion: '5.1',
850
+ engine: 'Gecko',
851
+ engineVersion: '1.b',
852
+ documentMode: undefined,
853
+ browserInfo: {
854
+ hasWebFontSupport: false,
855
+ hasWebKitFallbackBug: false
856
+ }
857
+ });
858
+
859
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.b) Gecko/20091016 (.NET CLR 3.5.30729)'))
860
+ .toMatchUserAgent({
861
+ name: 'Mozilla',
862
+ version: 'Unknown',
863
+ platform: 'Windows',
864
+ platformVersion: '5.1',
865
+ engine: 'Gecko',
866
+ engineVersion: '1.b',
867
+ documentMode: undefined,
868
+ browserInfo: {
869
+ hasWebFontSupport: false,
870
+ hasWebKitFallbackBug: false
871
+ }
872
+ });
873
+
874
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.9) Gecko/20091016 (.NET CLR 3.5.30729)'))
875
+ .toMatchUserAgent({
876
+ name: 'Mozilla',
877
+ version: 'Unknown',
878
+ platform: 'Windows',
879
+ platformVersion: '5.1',
880
+ engine: 'Gecko',
881
+ engineVersion: '1.9',
882
+ documentMode: undefined,
883
+ browserInfo: {
884
+ hasWebFontSupport: false,
885
+ hasWebKitFallbackBug: false
886
+ }
887
+ });
888
+
889
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:0.10.1) Gecko/20091016 (.NET CLR 3.5.30729)'))
890
+ .toMatchUserAgent({
891
+ name: 'Mozilla',
892
+ version: 'Unknown',
893
+ platform: 'Windows',
894
+ platformVersion: '5.1',
895
+ engine: 'Gecko',
896
+ engineVersion: '0.10.1',
897
+ documentMode: undefined,
898
+ browserInfo: {
899
+ hasWebFontSupport: false,
900
+ hasWebKitFallbackBug: false
901
+ }
902
+ });
903
+
904
+ expect(parse('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:0.3.42) Gecko/20091016 (.NET CLR 3.5.30729)'))
905
+ .toMatchUserAgent({
906
+ name: 'Mozilla',
907
+ version: 'Unknown',
908
+ platform: 'Windows',
909
+ platformVersion: '5.1',
910
+ engine: 'Gecko',
911
+ engineVersion: '0.3.42',
912
+ documentMode: undefined,
913
+ browserInfo: {
914
+ hasWebFontSupport: false,
915
+ hasWebKitFallbackBug: false
916
+ }
917
+ });
918
+ });
919
+ });
920
+ });
921
+ });