webfontloader 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/docs/EVENTS.md +12 -1
- data/lib/webfontloader.rb +1 -1
- data/spec/core/font_spec.js +2 -2
- data/spec/core/fontwatcher_spec.js +14 -2
- data/spec/core/fontwatchrunner_spec.js +47 -16
- data/spec/core/useragentparser_spec.js +105 -50
- data/spec/google/lastresortwebkitfontwatchrunner_spec.js +6 -4
- data/spec/monotype/monotypescript_spec.js +1 -1
- data/spec/typekit/typekitscript_spec.js +1 -1
- data/src/core/browserinfo.js +39 -1
- data/src/core/font.js +2 -1
- data/src/core/fontwatcher.js +7 -4
- data/src/core/fontwatchrunner.js +13 -6
- data/src/core/size.js +19 -1
- data/src/core/useragentparser.js +11 -10
- data/src/typekit/typekit_script.js +1 -1
- data/webfontloader.gemspec +2 -2
- metadata +5 -5
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
v1.3.0 (February 28, 2013)
|
2
|
+
* New optional configuration parameter `timeout` which lets you customize the default timeout.
|
3
|
+
* Change the Typekit module to use `use.typekit.net` instead of `use.typekit.com`.
|
4
|
+
* Disable height check on OSX and iOS WebKit based browsers which suffer from a metrics bug when loading web fonts.
|
5
|
+
|
1
6
|
v1.2.1 (February 26, 2013)
|
2
7
|
* Fix the possibility of test strings wrapping to a new line and thereby breaking font watching.
|
3
8
|
* Change the FontWatchRunner to not create DOM elements until it is started.
|
data/docs/EVENTS.md
CHANGED
@@ -112,7 +112,18 @@ load. You can use events to gracefully degrade in this situation.
|
|
112
112
|
|
113
113
|
> The `Font Inactive` event will be triggered after 5 seconds if the font
|
114
114
|
fails to render. If *at least* one font succesfully renders, the `Active`
|
115
|
-
event will be triggered, else the `
|
115
|
+
event will be triggered, else the `Inactive` even will be triggered.
|
116
|
+
|
117
|
+
You can configure the timeout by using the `timeout` configuration on the
|
118
|
+
`WebFont.load` function.
|
119
|
+
|
120
|
+
WebFont.load({
|
121
|
+
timeout: 2000, // Set the timeout to two seconds
|
122
|
+
...
|
123
|
+
});
|
124
|
+
|
125
|
+
The timeout value should be in milliseconds, and defaults to 5 seconds if
|
126
|
+
not supplied.
|
116
127
|
|
117
128
|
### Browser Support
|
118
129
|
|
data/lib/webfontloader.rb
CHANGED
data/spec/core/font_spec.js
CHANGED
@@ -7,7 +7,7 @@ describe('WebFont', function () {
|
|
7
7
|
userAgent = null;
|
8
8
|
|
9
9
|
beforeEach(function () {
|
10
|
-
userAgent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false));
|
10
|
+
userAgent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false, false));
|
11
11
|
fontModuleLoader = new FontModuleLoader();
|
12
12
|
});
|
13
13
|
|
@@ -190,7 +190,7 @@ describe('WebFont', function () {
|
|
190
190
|
testModule = null;
|
191
191
|
|
192
192
|
beforeEach(function () {
|
193
|
-
font = new WebFont(window, fontModuleLoader, function (func, timeout) { func(); }, new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(false, false)));
|
193
|
+
font = new WebFont(window, fontModuleLoader, function (func, timeout) { func(); }, new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(false, false, false)));
|
194
194
|
font.addModule('test', function (conf, domHelper) {
|
195
195
|
testModule = new function () {
|
196
196
|
this.conf = conf;
|
@@ -6,13 +6,15 @@ describe('FontWatcher', function () {
|
|
6
6
|
domHelper = new DomHelper(window),
|
7
7
|
eventDispatcher = {},
|
8
8
|
testStrings = null,
|
9
|
+
timeout = null,
|
9
10
|
userAgent = null,
|
10
11
|
activeFontFamilies = [];
|
11
12
|
|
12
13
|
beforeEach(function () {
|
13
|
-
userAgent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.3', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false));
|
14
|
+
userAgent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.3', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false, false));
|
14
15
|
activeFontFamilies = [];
|
15
16
|
testStrings = jasmine.createSpy('testStrings');
|
17
|
+
timeout = jasmine.createSpy('timeout');
|
16
18
|
eventDispatcher.dispatchLoading = jasmine.createSpy('dispatchLoading');
|
17
19
|
eventDispatcher.dispatchFontLoading = jasmine.createSpy('dispatchFontLoading');
|
18
20
|
eventDispatcher.dispatchFontActive = jasmine.createSpy('dispatchFontActive');
|
@@ -22,11 +24,12 @@ describe('FontWatcher', function () {
|
|
22
24
|
});
|
23
25
|
|
24
26
|
function FakeFontWatchRunner(activeCallback, inactiveCallback, domHelper, fontSizer, asyncCall, getTime,
|
25
|
-
fontFamily, fontDescription, hasWebKitFallbackBug, opt_metricCompatibleFonts, opt_fontTestString) {
|
27
|
+
fontFamily, fontDescription, hasWebKitFallbackBug, opt_timeout, opt_metricCompatibleFonts, opt_fontTestString) {
|
26
28
|
this.activeCallback = activeCallback;
|
27
29
|
this.inactiveCallback = inactiveCallback;
|
28
30
|
this.fontFamily = fontFamily;
|
29
31
|
this.fontDescription = fontDescription;
|
32
|
+
timeout(opt_timeout);
|
30
33
|
|
31
34
|
if (opt_fontTestString) {
|
32
35
|
testStrings(opt_fontTestString);
|
@@ -201,4 +204,13 @@ describe('FontWatcher', function () {
|
|
201
204
|
expect(testStrings).toHaveBeenCalledWith('testString2');
|
202
205
|
});
|
203
206
|
});
|
207
|
+
|
208
|
+
it('should pass on the timeout to FontWatchRunner', function () {
|
209
|
+
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher, jasmine.createSpy('fakeFontSizer'),
|
210
|
+
jasmine.createSpy('fakeAsyncCall'), jasmine.createSpy('fakeGetTime'), 4000);
|
211
|
+
|
212
|
+
fontWatcher.watch(['fontFamily1'], {}, {}, FakeFontWatchRunner, true);
|
213
|
+
|
214
|
+
expect(timeout).toHaveBeenCalledWith(4000);
|
215
|
+
});
|
204
216
|
});
|
@@ -1,5 +1,6 @@
|
|
1
1
|
describe('FontWatchRunner', function () {
|
2
2
|
var FontWatchRunner = webfont.FontWatchRunner,
|
3
|
+
BrowserInfo = webfont.BrowserInfo,
|
3
4
|
UserAgentParser = webfont.UserAgentParser,
|
4
5
|
Size = webfont.Size,
|
5
6
|
DomHelper = webfont.DomHelper,
|
@@ -14,6 +15,7 @@ describe('FontWatchRunner', function () {
|
|
14
15
|
FALLBACK_SIZE_B = new Size(2, 2),
|
15
16
|
LAST_RESORT_SIZE = new Size(4, 4),
|
16
17
|
|
18
|
+
browserInfo = new BrowserInfo(true, false, false),
|
17
19
|
setupSizes = [FALLBACK_SIZE_A, FALLBACK_SIZE_B, LAST_RESORT_SIZE],
|
18
20
|
actualSizes = [],
|
19
21
|
fakeGetSizeCount = 0,
|
@@ -85,7 +87,7 @@ describe('FontWatchRunner', function () {
|
|
85
87
|
];
|
86
88
|
|
87
89
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
88
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
90
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
89
91
|
|
90
92
|
fontWatchRunner.start();
|
91
93
|
|
@@ -102,7 +104,7 @@ describe('FontWatchRunner', function () {
|
|
102
104
|
];
|
103
105
|
|
104
106
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
105
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
107
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
106
108
|
|
107
109
|
fontWatchRunner.start();
|
108
110
|
expect(asyncCount).toEqual(3);
|
@@ -121,7 +123,7 @@ describe('FontWatchRunner', function () {
|
|
121
123
|
];
|
122
124
|
|
123
125
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
124
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
126
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
125
127
|
|
126
128
|
fontWatchRunner.start();
|
127
129
|
|
@@ -130,6 +132,12 @@ describe('FontWatchRunner', function () {
|
|
130
132
|
});
|
131
133
|
|
132
134
|
describe('WebKit fallback bug', function () {
|
135
|
+
var fallbackBugBrowserInfo = null;
|
136
|
+
|
137
|
+
beforeEach(function () {
|
138
|
+
fallbackBugBrowserInfo = new BrowserInfo(true, true, false);
|
139
|
+
});
|
140
|
+
|
133
141
|
it('should ignore fallback size and call active', function () {
|
134
142
|
actualSizes = [
|
135
143
|
LAST_RESORT_SIZE, LAST_RESORT_SIZE,
|
@@ -137,7 +145,7 @@ describe('FontWatchRunner', function () {
|
|
137
145
|
];
|
138
146
|
|
139
147
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
140
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
148
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, fallbackBugBrowserInfo);
|
141
149
|
|
142
150
|
fontWatchRunner.start();
|
143
151
|
|
@@ -154,7 +162,7 @@ describe('FontWatchRunner', function () {
|
|
154
162
|
timesToGetTimeBeforeTimeout = 2;
|
155
163
|
|
156
164
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
157
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
165
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, fallbackBugBrowserInfo);
|
158
166
|
|
159
167
|
fontWatchRunner.start();
|
160
168
|
|
@@ -172,7 +180,7 @@ describe('FontWatchRunner', function () {
|
|
172
180
|
timesToGetTimeBeforeTimeout = 3;
|
173
181
|
|
174
182
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
175
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
183
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, fallbackBugBrowserInfo);
|
176
184
|
|
177
185
|
fontWatchRunner.start();
|
178
186
|
|
@@ -189,8 +197,8 @@ describe('FontWatchRunner', function () {
|
|
189
197
|
timesToGetTimeBeforeTimeout = 2;
|
190
198
|
|
191
199
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
192
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
193
|
-
{ 'My Other Family': true });
|
200
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, fallbackBugBrowserInfo,
|
201
|
+
0, { 'My Other Family': true });
|
194
202
|
|
195
203
|
fontWatchRunner.start();
|
196
204
|
expect(asyncCount).toEqual(1);
|
@@ -206,8 +214,8 @@ describe('FontWatchRunner', function () {
|
|
206
214
|
timesToGetTimeBeforeTimeout = 2;
|
207
215
|
|
208
216
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
209
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
210
|
-
{ 'My Family': true });
|
217
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, fallbackBugBrowserInfo,
|
218
|
+
0, { 'My Family': true });
|
211
219
|
|
212
220
|
fontWatchRunner.start();
|
213
221
|
expect(asyncCount).toEqual(1);
|
@@ -215,6 +223,24 @@ describe('FontWatchRunner', function () {
|
|
215
223
|
});
|
216
224
|
});
|
217
225
|
|
226
|
+
describe('webkit metrics bug', function () {
|
227
|
+
it('should correctly call active even though the height is different', function () {
|
228
|
+
actualSizes = [
|
229
|
+
FALLBACK_SIZE_A, FALLBACK_SIZE_B,
|
230
|
+
new Size(1, 2), new Size(2, 3), // Same as FALLBACK_SIZE_A and FALLBACK_SIZE_B except that the height is different.
|
231
|
+
TARGET_SIZE, TARGET_SIZE
|
232
|
+
];
|
233
|
+
|
234
|
+
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
235
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, new BrowserInfo(true, false, true));
|
236
|
+
|
237
|
+
fontWatchRunner.start();
|
238
|
+
|
239
|
+
expect(asyncCount).toEqual(2);
|
240
|
+
expect(activeCallback).toHaveBeenCalledWith('My Family', 'n4');
|
241
|
+
});
|
242
|
+
});
|
243
|
+
|
218
244
|
describe('real browser testing', function () {
|
219
245
|
var fontSizer = null,
|
220
246
|
asyncCall = null,
|
@@ -243,7 +269,8 @@ describe('FontWatchRunner', function () {
|
|
243
269
|
|
244
270
|
it('should fail to load a null font', function () {
|
245
271
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
246
|
-
domHelper, fontSizer, asyncCall, getTime, '__webfontloader_test__', '',
|
272
|
+
domHelper, fontSizer, asyncCall, getTime, '__webfontloader_test__', '',
|
273
|
+
userAgent.getBrowserInfo(), 500);
|
247
274
|
|
248
275
|
runs(function () {
|
249
276
|
fontWatchRunner.start();
|
@@ -260,7 +287,8 @@ describe('FontWatchRunner', function () {
|
|
260
287
|
|
261
288
|
it('should load font succesfully', function () {
|
262
289
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
263
|
-
domHelper, fontSizer, asyncCall, getTime, 'SourceSansA', '',
|
290
|
+
domHelper, fontSizer, asyncCall, getTime, 'SourceSansA', '',
|
291
|
+
userAgent.getBrowserInfo(), 500),
|
264
292
|
ruler = new FontRuler(domHelper, fontSizer, 'abcdef'),
|
265
293
|
activeSize = null,
|
266
294
|
originalSize = null,
|
@@ -300,7 +328,8 @@ describe('FontWatchRunner', function () {
|
|
300
328
|
|
301
329
|
it('should attempt to load a non-existing font', function () {
|
302
330
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
303
|
-
domHelper, fontSizer, asyncCall, getTime, 'Elena', '',
|
331
|
+
domHelper, fontSizer, asyncCall, getTime, 'Elena', '',
|
332
|
+
userAgent.getBrowserInfo(), 500);
|
304
333
|
|
305
334
|
runs(function () {
|
306
335
|
fontWatchRunner.start();
|
@@ -317,7 +346,8 @@ describe('FontWatchRunner', function () {
|
|
317
346
|
|
318
347
|
it('should load even if @font-face is inserted after watching has started', function () {
|
319
348
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
320
|
-
domHelper, fontSizer, asyncCall, getTime, 'SourceSansB', '',
|
349
|
+
domHelper, fontSizer, asyncCall, getTime, 'SourceSansB', '',
|
350
|
+
userAgent.getBrowserInfo(), 500),
|
321
351
|
ruler = new FontRuler(domHelper, fontSizer, 'abcdef'),
|
322
352
|
activeSize = null,
|
323
353
|
originalSize = null,
|
@@ -375,7 +405,7 @@ describe('FontWatchRunner', function () {
|
|
375
405
|
];
|
376
406
|
|
377
407
|
fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
378
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
408
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
379
409
|
|
380
410
|
fontWatchRunner.start();
|
381
411
|
|
@@ -388,7 +418,8 @@ describe('FontWatchRunner', function () {
|
|
388
418
|
];
|
389
419
|
|
390
420
|
fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
391
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily,
|
421
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily,
|
422
|
+
fontDescription, browserInfo, 0, {}, 'TestString');
|
392
423
|
|
393
424
|
fontWatchRunner.start();
|
394
425
|
|
@@ -58,6 +58,11 @@ describe('UserAgentParser', function () {
|
|
58
58
|
return false;
|
59
59
|
}
|
60
60
|
|
61
|
+
if (actual.getBrowserInfo().hasWebKitMetricsBug() !== expected.browserInfo.hasWebKitMetricsBug) {
|
62
|
+
this.message = msg('web kit metrics bug', actual.getBrowserInfo().hasWebKitMetricsBug(), expected.browserInfo.hasWebKitFallbackBug);
|
63
|
+
return false;
|
64
|
+
}
|
65
|
+
|
61
66
|
return true;
|
62
67
|
}
|
63
68
|
});
|
@@ -81,7 +86,8 @@ describe('UserAgentParser', function () {
|
|
81
86
|
documentMode: undefined,
|
82
87
|
browserInfo: {
|
83
88
|
hasWebFontSupport: true,
|
84
|
-
hasWebKitFallbackBug: true
|
89
|
+
hasWebKitFallbackBug: true,
|
90
|
+
hasWebKitMetricsBug: true
|
85
91
|
}
|
86
92
|
});
|
87
93
|
});
|
@@ -98,7 +104,8 @@ describe('UserAgentParser', function () {
|
|
98
104
|
documentMode: undefined,
|
99
105
|
browserInfo: {
|
100
106
|
hasWebFontSupport: false,
|
101
|
-
hasWebKitFallbackBug: true
|
107
|
+
hasWebKitFallbackBug: true,
|
108
|
+
hasWebKitMetricsBug: true
|
102
109
|
}
|
103
110
|
});
|
104
111
|
});
|
@@ -117,7 +124,8 @@ describe('UserAgentParser', function () {
|
|
117
124
|
documentMode: undefined,
|
118
125
|
browserInfo: {
|
119
126
|
hasWebFontSupport: true,
|
120
|
-
hasWebKitFallbackBug: false
|
127
|
+
hasWebKitFallbackBug: false,
|
128
|
+
hasWebKitMetricsBug: false
|
121
129
|
}
|
122
130
|
});
|
123
131
|
|
@@ -132,7 +140,8 @@ describe('UserAgentParser', function () {
|
|
132
140
|
documentMode: undefined,
|
133
141
|
browserInfo: {
|
134
142
|
hasWebFontSupport: true,
|
135
|
-
hasWebKitFallbackBug: false
|
143
|
+
hasWebKitFallbackBug: false,
|
144
|
+
hasWebKitMetricsBug: false
|
136
145
|
}
|
137
146
|
});
|
138
147
|
});
|
@@ -149,7 +158,8 @@ describe('UserAgentParser', function () {
|
|
149
158
|
documentMode: undefined,
|
150
159
|
browserInfo: {
|
151
160
|
hasWebFontSupport: true,
|
152
|
-
hasWebKitFallbackBug: false
|
161
|
+
hasWebKitFallbackBug: false,
|
162
|
+
hasWebKitMetricsBug: false
|
153
163
|
}
|
154
164
|
});
|
155
165
|
});
|
@@ -168,7 +178,8 @@ describe('UserAgentParser', function () {
|
|
168
178
|
documentMode: undefined,
|
169
179
|
browserInfo: {
|
170
180
|
hasWebFontSupport: true,
|
171
|
-
hasWebKitFallbackBug: false
|
181
|
+
hasWebKitFallbackBug: false,
|
182
|
+
hasWebKitMetricsBug: false
|
172
183
|
}
|
173
184
|
});
|
174
185
|
});
|
@@ -185,7 +196,8 @@ describe('UserAgentParser', function () {
|
|
185
196
|
documentMode: undefined,
|
186
197
|
browserInfo: {
|
187
198
|
hasWebFontSupport: false,
|
188
|
-
hasWebKitFallbackBug: false
|
199
|
+
hasWebKitFallbackBug: false,
|
200
|
+
hasWebKitMetricsBug: false
|
189
201
|
}
|
190
202
|
});
|
191
203
|
});
|
@@ -204,7 +216,8 @@ describe('UserAgentParser', function () {
|
|
204
216
|
documentMode: undefined,
|
205
217
|
browserInfo: {
|
206
218
|
hasWebFontSupport: true,
|
207
|
-
hasWebKitFallbackBug: true
|
219
|
+
hasWebKitFallbackBug: true,
|
220
|
+
hasWebKitMetricsBug: true
|
208
221
|
}
|
209
222
|
});
|
210
223
|
});
|
@@ -221,7 +234,8 @@ describe('UserAgentParser', function () {
|
|
221
234
|
documentMode: undefined,
|
222
235
|
browserInfo: {
|
223
236
|
hasWebFontSupport: true,
|
224
|
-
hasWebKitFallbackBug: true
|
237
|
+
hasWebKitFallbackBug: true,
|
238
|
+
hasWebKitMetricsBug: false
|
225
239
|
}
|
226
240
|
});
|
227
241
|
});
|
@@ -238,7 +252,8 @@ describe('UserAgentParser', function () {
|
|
238
252
|
documentMode: undefined,
|
239
253
|
browserInfo: {
|
240
254
|
hasWebFontSupport: true,
|
241
|
-
hasWebKitFallbackBug: true
|
255
|
+
hasWebKitFallbackBug: true,
|
256
|
+
hasWebKitMetricsBug: false
|
242
257
|
}
|
243
258
|
});
|
244
259
|
});
|
@@ -255,7 +270,8 @@ describe('UserAgentParser', function () {
|
|
255
270
|
documentMode: undefined,
|
256
271
|
browserInfo: {
|
257
272
|
hasWebFontSupport: true,
|
258
|
-
hasWebKitFallbackBug: true
|
273
|
+
hasWebKitFallbackBug: true,
|
274
|
+
hasWebKitMetricsBug: true
|
259
275
|
}
|
260
276
|
});
|
261
277
|
});
|
@@ -272,7 +288,8 @@ describe('UserAgentParser', function () {
|
|
272
288
|
documentMode: undefined,
|
273
289
|
browserInfo: {
|
274
290
|
hasWebFontSupport: true,
|
275
|
-
hasWebKitFallbackBug: true
|
291
|
+
hasWebKitFallbackBug: true,
|
292
|
+
hasWebKitMetricsBug: true
|
276
293
|
}
|
277
294
|
});
|
278
295
|
});
|
@@ -291,7 +308,8 @@ describe('UserAgentParser', function () {
|
|
291
308
|
documentMode: undefined,
|
292
309
|
browserInfo: {
|
293
310
|
hasWebFontSupport: true,
|
294
|
-
hasWebKitFallbackBug: true
|
311
|
+
hasWebKitFallbackBug: true,
|
312
|
+
hasWebKitMetricsBug: true
|
295
313
|
}
|
296
314
|
});
|
297
315
|
|
@@ -306,7 +324,8 @@ describe('UserAgentParser', function () {
|
|
306
324
|
documentMode: undefined,
|
307
325
|
browserInfo: {
|
308
326
|
hasWebFontSupport: true,
|
309
|
-
hasWebKitFallbackBug: true
|
327
|
+
hasWebKitFallbackBug: true,
|
328
|
+
hasWebKitMetricsBug: true
|
310
329
|
}
|
311
330
|
});
|
312
331
|
});
|
@@ -323,7 +342,8 @@ describe('UserAgentParser', function () {
|
|
323
342
|
documentMode: undefined,
|
324
343
|
browserInfo: {
|
325
344
|
hasWebFontSupport: true,
|
326
|
-
hasWebKitFallbackBug: true
|
345
|
+
hasWebKitFallbackBug: true,
|
346
|
+
hasWebKitMetricsBug: true
|
327
347
|
}
|
328
348
|
});
|
329
349
|
});
|
@@ -340,7 +360,8 @@ describe('UserAgentParser', function () {
|
|
340
360
|
documentMode: undefined,
|
341
361
|
browserInfo: {
|
342
362
|
hasWebFontSupport: true,
|
343
|
-
hasWebKitFallbackBug: true
|
363
|
+
hasWebKitFallbackBug: true,
|
364
|
+
hasWebKitMetricsBug: true
|
344
365
|
}
|
345
366
|
});
|
346
367
|
|
@@ -355,7 +376,8 @@ describe('UserAgentParser', function () {
|
|
355
376
|
documentMode: undefined,
|
356
377
|
browserInfo: {
|
357
378
|
hasWebFontSupport: true,
|
358
|
-
hasWebKitFallbackBug: true
|
379
|
+
hasWebKitFallbackBug: true,
|
380
|
+
hasWebKitMetricsBug: true
|
359
381
|
}
|
360
382
|
});
|
361
383
|
|
@@ -370,7 +392,8 @@ describe('UserAgentParser', function () {
|
|
370
392
|
documentMode: undefined,
|
371
393
|
browserInfo: {
|
372
394
|
hasWebFontSupport: true,
|
373
|
-
hasWebKitFallbackBug: true
|
395
|
+
hasWebKitFallbackBug: true,
|
396
|
+
hasWebKitMetricsBug: true
|
374
397
|
}
|
375
398
|
});
|
376
399
|
});
|
@@ -387,7 +410,8 @@ describe('UserAgentParser', function () {
|
|
387
410
|
documentMode: undefined,
|
388
411
|
browserInfo: {
|
389
412
|
hasWebFontSupport: true,
|
390
|
-
hasWebKitFallbackBug: true
|
413
|
+
hasWebKitFallbackBug: true,
|
414
|
+
hasWebKitMetricsBug: true
|
391
415
|
}
|
392
416
|
});
|
393
417
|
|
@@ -402,7 +426,8 @@ describe('UserAgentParser', function () {
|
|
402
426
|
documentMode: undefined,
|
403
427
|
browserInfo: {
|
404
428
|
hasWebFontSupport: true,
|
405
|
-
hasWebKitFallbackBug: true
|
429
|
+
hasWebKitFallbackBug: true,
|
430
|
+
hasWebKitMetricsBug: true
|
406
431
|
}
|
407
432
|
});
|
408
433
|
});
|
@@ -421,7 +446,8 @@ describe('UserAgentParser', function () {
|
|
421
446
|
documentMode: undefined,
|
422
447
|
browserInfo: {
|
423
448
|
hasWebFontSupport: true,
|
424
|
-
hasWebKitFallbackBug: false
|
449
|
+
hasWebKitFallbackBug: false,
|
450
|
+
hasWebKitMetricsBug: false
|
425
451
|
}
|
426
452
|
});
|
427
453
|
|
@@ -436,7 +462,8 @@ describe('UserAgentParser', function () {
|
|
436
462
|
documentMode: undefined,
|
437
463
|
browserInfo: {
|
438
464
|
hasWebFontSupport: true,
|
439
|
-
hasWebKitFallbackBug: false
|
465
|
+
hasWebKitFallbackBug: false,
|
466
|
+
hasWebKitMetricsBug: false
|
440
467
|
}
|
441
468
|
});
|
442
469
|
});
|
@@ -453,7 +480,8 @@ describe('UserAgentParser', function () {
|
|
453
480
|
documentMode: undefined,
|
454
481
|
browserInfo: {
|
455
482
|
hasWebFontSupport: true,
|
456
|
-
hasWebKitFallbackBug: false
|
483
|
+
hasWebKitFallbackBug: false,
|
484
|
+
hasWebKitMetricsBug: false
|
457
485
|
}
|
458
486
|
});
|
459
487
|
});
|
@@ -470,7 +498,8 @@ describe('UserAgentParser', function () {
|
|
470
498
|
documentMode: undefined,
|
471
499
|
browserInfo: {
|
472
500
|
hasWebFontSupport: true,
|
473
|
-
hasWebKitFallbackBug: false
|
501
|
+
hasWebKitFallbackBug: false,
|
502
|
+
hasWebKitMetricsBug: false
|
474
503
|
}
|
475
504
|
});
|
476
505
|
});
|
@@ -487,7 +516,8 @@ describe('UserAgentParser', function () {
|
|
487
516
|
documentMode: undefined,
|
488
517
|
browserInfo: {
|
489
518
|
hasWebFontSupport: false,
|
490
|
-
hasWebKitFallbackBug: false
|
519
|
+
hasWebKitFallbackBug: false,
|
520
|
+
hasWebKitMetricsBug: false
|
491
521
|
}
|
492
522
|
});
|
493
523
|
});
|
@@ -504,7 +534,8 @@ describe('UserAgentParser', function () {
|
|
504
534
|
documentMode: undefined,
|
505
535
|
browserInfo: {
|
506
536
|
hasWebFontSupport: false,
|
507
|
-
hasWebKitFallbackBug: false
|
537
|
+
hasWebKitFallbackBug: false,
|
538
|
+
hasWebKitMetricsBug: false
|
508
539
|
}
|
509
540
|
});
|
510
541
|
});
|
@@ -521,7 +552,8 @@ describe('UserAgentParser', function () {
|
|
521
552
|
documentMode: 8,
|
522
553
|
browserInfo: {
|
523
554
|
hasWebFontSupport: true,
|
524
|
-
hasWebKitFallbackBug: false
|
555
|
+
hasWebKitFallbackBug: false,
|
556
|
+
hasWebKitMetricsBug: false
|
525
557
|
}
|
526
558
|
});
|
527
559
|
});
|
@@ -540,7 +572,8 @@ describe('UserAgentParser', function () {
|
|
540
572
|
documentMode: undefined,
|
541
573
|
browserInfo: {
|
542
574
|
hasWebFontSupport: true,
|
543
|
-
hasWebKitFallbackBug: true
|
575
|
+
hasWebKitFallbackBug: true,
|
576
|
+
hasWebKitMetricsBug: false
|
544
577
|
}
|
545
578
|
});
|
546
579
|
});
|
@@ -557,7 +590,8 @@ describe('UserAgentParser', function () {
|
|
557
590
|
documentMode: undefined,
|
558
591
|
browserInfo: {
|
559
592
|
hasWebFontSupport: false,
|
560
|
-
hasWebKitFallbackBug: true
|
593
|
+
hasWebKitFallbackBug: true,
|
594
|
+
hasWebKitMetricsBug: false
|
561
595
|
}
|
562
596
|
});
|
563
597
|
});
|
@@ -574,7 +608,8 @@ describe('UserAgentParser', function () {
|
|
574
608
|
documentMode: undefined,
|
575
609
|
browserInfo: {
|
576
610
|
hasWebFontSupport: true,
|
577
|
-
hasWebKitFallbackBug: true
|
611
|
+
hasWebKitFallbackBug: true,
|
612
|
+
hasWebKitMetricsBug: false
|
578
613
|
}
|
579
614
|
});
|
580
615
|
});
|
@@ -591,7 +626,8 @@ describe('UserAgentParser', function () {
|
|
591
626
|
documentMode: undefined,
|
592
627
|
browserInfo: {
|
593
628
|
hasWebFontSupport: true,
|
594
|
-
hasWebKitFallbackBug: true
|
629
|
+
hasWebKitFallbackBug: true,
|
630
|
+
hasWebKitMetricsBug: false
|
595
631
|
}
|
596
632
|
});
|
597
633
|
});
|
@@ -608,7 +644,8 @@ describe('UserAgentParser', function () {
|
|
608
644
|
documentMode: undefined,
|
609
645
|
browserInfo: {
|
610
646
|
hasWebFontSupport: true,
|
611
|
-
hasWebKitFallbackBug: true
|
647
|
+
hasWebKitFallbackBug: true,
|
648
|
+
hasWebKitMetricsBug: false
|
612
649
|
}
|
613
650
|
});
|
614
651
|
});
|
@@ -625,7 +662,8 @@ describe('UserAgentParser', function () {
|
|
625
662
|
documentMode: undefined,
|
626
663
|
browserInfo: {
|
627
664
|
hasWebFontSupport: true,
|
628
|
-
hasWebKitFallbackBug: true
|
665
|
+
hasWebKitFallbackBug: true,
|
666
|
+
hasWebKitMetricsBug: false
|
629
667
|
}
|
630
668
|
});
|
631
669
|
});
|
@@ -642,7 +680,8 @@ describe('UserAgentParser', function () {
|
|
642
680
|
documentMode: undefined,
|
643
681
|
browserInfo: {
|
644
682
|
hasWebFontSupport: true,
|
645
|
-
hasWebKitFallbackBug: false
|
683
|
+
hasWebKitFallbackBug: false,
|
684
|
+
hasWebKitMetricsBug: false
|
646
685
|
}
|
647
686
|
});
|
648
687
|
});
|
@@ -659,7 +698,8 @@ describe('UserAgentParser', function () {
|
|
659
698
|
documentMode: undefined,
|
660
699
|
browserInfo: {
|
661
700
|
hasWebFontSupport: false,
|
662
|
-
hasWebKitFallbackBug: true
|
701
|
+
hasWebKitFallbackBug: true,
|
702
|
+
hasWebKitMetricsBug: false
|
663
703
|
}
|
664
704
|
});
|
665
705
|
});
|
@@ -678,7 +718,8 @@ describe('UserAgentParser', function () {
|
|
678
718
|
documentMode: undefined,
|
679
719
|
browserInfo: {
|
680
720
|
hasWebFontSupport: true,
|
681
|
-
hasWebKitFallbackBug: false
|
721
|
+
hasWebKitFallbackBug: false,
|
722
|
+
hasWebKitMetricsBug: false
|
682
723
|
}
|
683
724
|
});
|
684
725
|
});
|
@@ -695,7 +736,8 @@ describe('UserAgentParser', function () {
|
|
695
736
|
documentMode: undefined,
|
696
737
|
browserInfo: {
|
697
738
|
hasWebFontSupport: false,
|
698
|
-
hasWebKitFallbackBug: false
|
739
|
+
hasWebKitFallbackBug: false,
|
740
|
+
hasWebKitMetricsBug: false
|
699
741
|
}
|
700
742
|
});
|
701
743
|
});
|
@@ -712,7 +754,8 @@ describe('UserAgentParser', function () {
|
|
712
754
|
documentMode: undefined,
|
713
755
|
browserInfo: {
|
714
756
|
hasWebFontSupport: false,
|
715
|
-
hasWebKitFallbackBug: false
|
757
|
+
hasWebKitFallbackBug: false,
|
758
|
+
hasWebKitMetricsBug: false
|
716
759
|
}
|
717
760
|
});
|
718
761
|
});
|
@@ -729,7 +772,8 @@ describe('UserAgentParser', function () {
|
|
729
772
|
documentMode: undefined,
|
730
773
|
browserInfo: {
|
731
774
|
hasWebFontSupport: true,
|
732
|
-
hasWebKitFallbackBug: false
|
775
|
+
hasWebKitFallbackBug: false,
|
776
|
+
hasWebKitMetricsBug: false
|
733
777
|
}
|
734
778
|
});
|
735
779
|
});
|
@@ -746,7 +790,8 @@ describe('UserAgentParser', function () {
|
|
746
790
|
documentMode: undefined,
|
747
791
|
browserInfo: {
|
748
792
|
hasWebFontSupport: false,
|
749
|
-
hasWebKitFallbackBug: false
|
793
|
+
hasWebKitFallbackBug: false,
|
794
|
+
hasWebKitMetricsBug: false
|
750
795
|
}
|
751
796
|
});
|
752
797
|
});
|
@@ -765,7 +810,8 @@ describe('UserAgentParser', function () {
|
|
765
810
|
documentMode: undefined,
|
766
811
|
browserInfo: {
|
767
812
|
hasWebFontSupport: true,
|
768
|
-
hasWebKitFallbackBug: true
|
813
|
+
hasWebKitFallbackBug: true,
|
814
|
+
hasWebKitMetricsBug: false
|
769
815
|
}
|
770
816
|
});
|
771
817
|
});
|
@@ -782,7 +828,8 @@ describe('UserAgentParser', function () {
|
|
782
828
|
documentMode: undefined,
|
783
829
|
browserInfo: {
|
784
830
|
hasWebFontSupport: true,
|
785
|
-
hasWebKitFallbackBug: false
|
831
|
+
hasWebKitFallbackBug: false,
|
832
|
+
hasWebKitMetricsBug: false
|
786
833
|
}
|
787
834
|
});
|
788
835
|
});
|
@@ -801,7 +848,8 @@ describe('UserAgentParser', function () {
|
|
801
848
|
documentMode: undefined,
|
802
849
|
browserInfo: {
|
803
850
|
hasWebFontSupport: true,
|
804
|
-
hasWebKitFallbackBug: false
|
851
|
+
hasWebKitFallbackBug: false,
|
852
|
+
hasWebKitMetricsBug: false
|
805
853
|
}
|
806
854
|
});
|
807
855
|
});
|
@@ -818,7 +866,8 @@ describe('UserAgentParser', function () {
|
|
818
866
|
documentMode: undefined,
|
819
867
|
browserInfo: {
|
820
868
|
hasWebFontSupport: true,
|
821
|
-
hasWebKitFallbackBug: false
|
869
|
+
hasWebKitFallbackBug: false,
|
870
|
+
hasWebKitMetricsBug: false
|
822
871
|
}
|
823
872
|
});
|
824
873
|
});
|
@@ -835,7 +884,8 @@ describe('UserAgentParser', function () {
|
|
835
884
|
documentMode: undefined,
|
836
885
|
browserInfo: {
|
837
886
|
hasWebFontSupport: true,
|
838
|
-
hasWebKitFallbackBug: false
|
887
|
+
hasWebKitFallbackBug: false,
|
888
|
+
hasWebKitMetricsBug: false
|
839
889
|
}
|
840
890
|
});
|
841
891
|
});
|
@@ -852,7 +902,8 @@ describe('UserAgentParser', function () {
|
|
852
902
|
documentMode: undefined,
|
853
903
|
browserInfo: {
|
854
904
|
hasWebFontSupport: false,
|
855
|
-
hasWebKitFallbackBug: false
|
905
|
+
hasWebKitFallbackBug: false,
|
906
|
+
hasWebKitMetricsBug: false
|
856
907
|
}
|
857
908
|
});
|
858
909
|
|
@@ -867,7 +918,8 @@ describe('UserAgentParser', function () {
|
|
867
918
|
documentMode: undefined,
|
868
919
|
browserInfo: {
|
869
920
|
hasWebFontSupport: false,
|
870
|
-
hasWebKitFallbackBug: false
|
921
|
+
hasWebKitFallbackBug: false,
|
922
|
+
hasWebKitMetricsBug: false
|
871
923
|
}
|
872
924
|
});
|
873
925
|
|
@@ -882,7 +934,8 @@ describe('UserAgentParser', function () {
|
|
882
934
|
documentMode: undefined,
|
883
935
|
browserInfo: {
|
884
936
|
hasWebFontSupport: false,
|
885
|
-
hasWebKitFallbackBug: false
|
937
|
+
hasWebKitFallbackBug: false,
|
938
|
+
hasWebKitMetricsBug: false
|
886
939
|
}
|
887
940
|
});
|
888
941
|
|
@@ -897,7 +950,8 @@ describe('UserAgentParser', function () {
|
|
897
950
|
documentMode: undefined,
|
898
951
|
browserInfo: {
|
899
952
|
hasWebFontSupport: false,
|
900
|
-
hasWebKitFallbackBug: false
|
953
|
+
hasWebKitFallbackBug: false,
|
954
|
+
hasWebKitMetricsBug: false
|
901
955
|
}
|
902
956
|
});
|
903
957
|
|
@@ -912,7 +966,8 @@ describe('UserAgentParser', function () {
|
|
912
966
|
documentMode: undefined,
|
913
967
|
browserInfo: {
|
914
968
|
hasWebFontSupport: false,
|
915
|
-
hasWebKitFallbackBug: false
|
969
|
+
hasWebKitFallbackBug: false,
|
970
|
+
hasWebKitMetricsBug: false
|
916
971
|
}
|
917
972
|
});
|
918
973
|
});
|
@@ -1,5 +1,6 @@
|
|
1
1
|
describe('LastResortWebKitFontWatchRunner', function () {
|
2
2
|
var LastResortWebKitFontWatchRunner = webfont.LastResortWebKitFontWatchRunner,
|
3
|
+
BrowserInfo = webfont.BrowserInfo,
|
3
4
|
Size = webfont.Size,
|
4
5
|
DomHelper = webfont.DomHelper,
|
5
6
|
domHelper = new DomHelper(window),
|
@@ -12,6 +13,7 @@ describe('LastResortWebKitFontWatchRunner', function () {
|
|
12
13
|
FALLBACK_SIZE_B = new Size(2, 2),
|
13
14
|
LAST_RESORT_SIZE = new Size(4, 4),
|
14
15
|
|
16
|
+
browserInfo = new BrowserInfo(true, true, false),
|
15
17
|
setupSizes = [FALLBACK_SIZE_A, FALLBACK_SIZE_B, LAST_RESORT_SIZE],
|
16
18
|
actualSizes = [],
|
17
19
|
fakeGetSizeCount = 0,
|
@@ -84,7 +86,7 @@ describe('LastResortWebKitFontWatchRunner', function () {
|
|
84
86
|
];
|
85
87
|
|
86
88
|
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
87
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
89
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
88
90
|
|
89
91
|
fontWatchRunner.start();
|
90
92
|
|
@@ -101,7 +103,7 @@ describe('LastResortWebKitFontWatchRunner', function () {
|
|
101
103
|
timesToGetTimeBeforeTimeout = 2;
|
102
104
|
|
103
105
|
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
104
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, 'Arimo', fontDescription,
|
106
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, 'Arimo', fontDescription, browserInfo);
|
105
107
|
|
106
108
|
fontWatchRunner.start();
|
107
109
|
|
@@ -119,7 +121,7 @@ describe('LastResortWebKitFontWatchRunner', function () {
|
|
119
121
|
timesToGetTimeBeforeTimeout = 3;
|
120
122
|
|
121
123
|
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
122
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
124
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
123
125
|
|
124
126
|
fontWatchRunner.start();
|
125
127
|
|
@@ -136,7 +138,7 @@ describe('LastResortWebKitFontWatchRunner', function () {
|
|
136
138
|
timesToGetTimeBeforeTimeout = 2;
|
137
139
|
|
138
140
|
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
139
|
-
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription,
|
141
|
+
domHelper, fakeFontSizer, fakeAsyncCall, fakeGetTime, fontFamily, fontDescription, browserInfo);
|
140
142
|
|
141
143
|
fontWatchRunner.start();
|
142
144
|
expect(asyncCount).toEqual(1);
|
@@ -27,7 +27,7 @@ describe('MonotypeScript', function () {
|
|
27
27
|
};
|
28
28
|
support = jasmine.createSpy('support');
|
29
29
|
load = jasmine.createSpy('load');
|
30
|
-
useragent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.3', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false));
|
30
|
+
useragent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.3', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false, false));
|
31
31
|
|
32
32
|
monotype = new MonotypeScript(useragent, fakeDomHelper, configuration);
|
33
33
|
monotype.supportUserAgent(useragent, support);
|
@@ -31,7 +31,7 @@ describe('TypekitScript', function () {
|
|
31
31
|
typekit.supportUserAgent('useragent', support);
|
32
32
|
|
33
33
|
expect(fakeDomHelper.insertInto.calls[0].args[0]).toEqual('head');
|
34
|
-
expect(fakeDomHelper.createScriptSrc).toHaveBeenCalledWith('http://use.typekit.
|
34
|
+
expect(fakeDomHelper.createScriptSrc).toHaveBeenCalledWith('http://use.typekit.net/abc.js');
|
35
35
|
expect(support).not.toHaveBeenCalled();
|
36
36
|
|
37
37
|
expect(global.__webfonttypekitmodule__).not.toBeNull();
|
data/src/core/browserinfo.js
CHANGED
@@ -2,13 +2,17 @@
|
|
2
2
|
* @constructor
|
3
3
|
* @param {boolean} webfontSupport
|
4
4
|
* @param {boolean} webKitFallbackBug
|
5
|
+
* @param {boolean} webKitMetricsBug
|
5
6
|
*/
|
6
|
-
webfont.BrowserInfo = function (webfontSupport, webKitFallbackBug) {
|
7
|
+
webfont.BrowserInfo = function (webfontSupport, webKitFallbackBug, webKitMetricsBug) {
|
7
8
|
this.webfontSupport_ = webfontSupport;
|
8
9
|
this.webKitFallbackBug_ = webKitFallbackBug;
|
10
|
+
this.webKitMetricsBug_ = webKitMetricsBug;
|
9
11
|
};
|
10
12
|
|
11
13
|
/**
|
14
|
+
* Returns true if the browser supports web fonts.
|
15
|
+
*
|
12
16
|
* @return {boolean}
|
13
17
|
*/
|
14
18
|
webfont.BrowserInfo.prototype.hasWebFontSupport = function () {
|
@@ -16,8 +20,42 @@ webfont.BrowserInfo.prototype.hasWebFontSupport = function () {
|
|
16
20
|
};
|
17
21
|
|
18
22
|
/**
|
23
|
+
* Returns true if the browser has the WebKit fallback bug.
|
24
|
+
*
|
25
|
+
* The bug causes the normal CSS font stack to be ignored while
|
26
|
+
* loading web fonts. Instead it picks the generic font family
|
27
|
+
* (or the default generic font family) of the first instance
|
28
|
+
* the web font is mentioned in CSS. It switches to this font
|
29
|
+
* immediately while loading web font, causing two changes in
|
30
|
+
* font to occur (compared to other browsers which only change
|
31
|
+
* font once the web font has loaded.)
|
32
|
+
*
|
33
|
+
* The bug has been fixed and is only happens in WebKit versions
|
34
|
+
* below 536.11. Even though it is fixed we still have a large
|
35
|
+
* percentage of users on older WebKit versions, mostly on mobile
|
36
|
+
* platforms.
|
37
|
+
*
|
38
|
+
* Also see: https://bugs.webkit.org/show_bug.cgi?id=76684
|
39
|
+
*
|
19
40
|
* @return {boolean}
|
20
41
|
*/
|
21
42
|
webfont.BrowserInfo.prototype.hasWebKitFallbackBug = function () {
|
22
43
|
return this.webKitFallbackBug_;
|
23
44
|
};
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Returns true if the browser has the WebKit metrics bug
|
48
|
+
*
|
49
|
+
* The metrics bug causes WebKit to change the height of a font
|
50
|
+
* while loading a web font. Other browsers do not modify
|
51
|
+
* the width or height of the fallback font while a web font is
|
52
|
+
* loading. This caused our width and height check to be incorrect,
|
53
|
+
* triggering a false positive.
|
54
|
+
*
|
55
|
+
* Also see: https://bugs.webkit.org/show_bug.cgi?id=110977
|
56
|
+
*
|
57
|
+
* @return {boolean}
|
58
|
+
*/
|
59
|
+
webfont.BrowserInfo.prototype.hasWebKitMetricsBug = function () {
|
60
|
+
return this.webKitMetricsBug_;
|
61
|
+
};
|
data/src/core/font.js
CHANGED
@@ -73,6 +73,7 @@ webfont.WebFont.prototype.onModuleReady_ = function(eventDispatcher, fontWatcher
|
|
73
73
|
|
74
74
|
webfont.WebFont.prototype.load_ = function(eventDispatcher, configuration) {
|
75
75
|
var modules = this.fontModuleLoader_.getModules(configuration, this.domHelper_),
|
76
|
+
timeout = configuration['timeout'],
|
76
77
|
self = this;
|
77
78
|
|
78
79
|
this.moduleFailedLoading_ = this.moduleLoading_ = modules.length;
|
@@ -83,7 +84,7 @@ webfont.WebFont.prototype.load_ = function(eventDispatcher, configuration) {
|
|
83
84
|
return new webfont.Size(elem.offsetWidth, elem.offsetHeight);
|
84
85
|
}}, self.asyncCall_, function() {
|
85
86
|
return new Date().getTime();
|
86
|
-
});
|
87
|
+
}, timeout);
|
87
88
|
|
88
89
|
for (var i = 0, len = modules.length; i < len; i++) {
|
89
90
|
var module = modules[i];
|
data/src/core/fontwatcher.js
CHANGED
@@ -6,9 +6,10 @@
|
|
6
6
|
* @param {Object.<string, function(Object): webfont.Size>} fontSizer
|
7
7
|
* @param {function(function(), number=)} asyncCall
|
8
8
|
* @param {function(): number} getTime
|
9
|
+
* @param {number=} opt_timeout
|
9
10
|
*/
|
10
11
|
webfont.FontWatcher = function(userAgent, domHelper, eventDispatcher, fontSizer,
|
11
|
-
asyncCall, getTime) {
|
12
|
+
asyncCall, getTime, opt_timeout) {
|
12
13
|
this.domHelper_ = domHelper;
|
13
14
|
this.eventDispatcher_ = eventDispatcher;
|
14
15
|
this.fontSizer_ = fontSizer;
|
@@ -17,8 +18,9 @@ webfont.FontWatcher = function(userAgent, domHelper, eventDispatcher, fontSizer,
|
|
17
18
|
this.currentlyWatched_ = 0;
|
18
19
|
this.last_ = false;
|
19
20
|
this.success_ = false;
|
21
|
+
this.timeout_ = opt_timeout;
|
20
22
|
|
21
|
-
this.
|
23
|
+
this.browserInfo_ = userAgent.getBrowserInfo();
|
22
24
|
};
|
23
25
|
|
24
26
|
/**
|
@@ -38,7 +40,7 @@ webfont.FontWatcher.DEFAULT_VARIATION = 'n4';
|
|
38
40
|
* function(string, string), webfont.DomHelper,
|
39
41
|
* Object.<string, function(Object): number>,
|
40
42
|
* function(function(), number=), function(): number, string, string,
|
41
|
-
*
|
43
|
+
* webfont.BrowserInfo, number=, Object.<string,boolean>=, string=)} fontWatchRunnerCtor The font watch runner constructor.
|
42
44
|
* @param {boolean} last True if this is the last set of families to watch.
|
43
45
|
*/
|
44
46
|
webfont.FontWatcher.prototype.watch = function(fontFamilies, fontDescriptions,
|
@@ -76,7 +78,8 @@ webfont.FontWatcher.prototype.watch = function(fontFamilies, fontDescriptions,
|
|
76
78
|
var inactiveCallback = webfont.bind(this, this.fontInactive_)
|
77
79
|
var fontWatchRunner = new fontWatchRunnerCtor(activeCallback,
|
78
80
|
inactiveCallback, this.domHelper_, this.fontSizer_, this.asyncCall_,
|
79
|
-
this.getTime_, fontFamily, fontDescription,
|
81
|
+
this.getTime_, fontFamily, fontDescription,
|
82
|
+
this.browserInfo_, this.timeout_, null, fontTestString);
|
80
83
|
|
81
84
|
fontWatchRunner.start();
|
82
85
|
}
|
data/src/core/fontwatchrunner.js
CHANGED
@@ -8,12 +8,14 @@
|
|
8
8
|
* @param {function(): number} getTime
|
9
9
|
* @param {string} fontFamily
|
10
10
|
* @param {string} fontDescription
|
11
|
-
* @param {
|
11
|
+
* @param {webfont.BrowserInfo} browserInfo
|
12
|
+
* @param {number=} opt_timeout
|
12
13
|
* @param {Object.<string, boolean>=} opt_metricCompatibleFonts
|
13
14
|
* @param {string=} opt_fontTestString
|
14
15
|
*/
|
15
16
|
webfont.FontWatchRunner = function(activeCallback, inactiveCallback, domHelper,
|
16
|
-
fontSizer, asyncCall, getTime, fontFamily, fontDescription,
|
17
|
+
fontSizer, asyncCall, getTime, fontFamily, fontDescription, browserInfo,
|
18
|
+
opt_timeout, opt_metricCompatibleFonts, opt_fontTestString) {
|
17
19
|
this.activeCallback_ = activeCallback;
|
18
20
|
this.inactiveCallback_ = inactiveCallback;
|
19
21
|
this.domHelper_ = domHelper;
|
@@ -23,8 +25,9 @@ webfont.FontWatchRunner = function(activeCallback, inactiveCallback, domHelper,
|
|
23
25
|
this.fontFamily_ = fontFamily;
|
24
26
|
this.fontDescription_ = fontDescription;
|
25
27
|
this.fontTestString_ = opt_fontTestString || webfont.FontWatchRunner.DEFAULT_TEST_STRING;
|
26
|
-
this.
|
28
|
+
this.browserInfo_ = browserInfo;
|
27
29
|
this.lastResortSizes_ = {};
|
30
|
+
this.timeout_ = opt_timeout || 5000;
|
28
31
|
|
29
32
|
this.metricCompatibleFonts_ = opt_metricCompatibleFonts || null;
|
30
33
|
|
@@ -102,7 +105,11 @@ webfont.FontWatchRunner.prototype.start = function() {
|
|
102
105
|
* @return {boolean}
|
103
106
|
*/
|
104
107
|
webfont.FontWatchRunner.prototype.sizeMatches_ = function(size, lastResortFont) {
|
105
|
-
|
108
|
+
if (this.browserInfo_.hasWebKitMetricsBug()) {
|
109
|
+
return size.equalsWidth(this.lastResortSizes_[lastResortFont]);
|
110
|
+
} else {
|
111
|
+
return size.equals(this.lastResortSizes_[lastResortFont]);
|
112
|
+
}
|
106
113
|
};
|
107
114
|
|
108
115
|
/**
|
@@ -132,7 +139,7 @@ webfont.FontWatchRunner.prototype.sizesMatchLastResortSizes_ = function(a, b) {
|
|
132
139
|
* @return {boolean}
|
133
140
|
*/
|
134
141
|
webfont.FontWatchRunner.prototype.hasTimedOut_ = function() {
|
135
|
-
return this.getTime_() - this.started_ >=
|
142
|
+
return this.getTime_() - this.started_ >= this.timeout_;
|
136
143
|
};
|
137
144
|
|
138
145
|
/**
|
@@ -157,7 +164,7 @@ webfont.FontWatchRunner.prototype.isFallbackFont_ = function (sizeA, sizeB) {
|
|
157
164
|
* @return {boolean}
|
158
165
|
*/
|
159
166
|
webfont.FontWatchRunner.prototype.isLastResortFont_ = function (sizeA, sizeB) {
|
160
|
-
return this.
|
167
|
+
return this.browserInfo_.hasWebKitFallbackBug() && this.sizesMatchLastResortSizes_(sizeA, sizeB);
|
161
168
|
};
|
162
169
|
|
163
170
|
/**
|
data/src/core/size.js
CHANGED
@@ -15,5 +15,23 @@ webfont.Size = function (width, height) {
|
|
15
15
|
* @return {boolean}
|
16
16
|
*/
|
17
17
|
webfont.Size.prototype.equals = function (other) {
|
18
|
-
return
|
18
|
+
return this.equalsWidth(other) && this.equalsHeight(other);
|
19
|
+
};
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Returns true if this.width equals other.width
|
23
|
+
* @param {webfont.Size} other
|
24
|
+
* @return {boolean}
|
25
|
+
*/
|
26
|
+
webfont.Size.prototype.equalsWidth = function (other) {
|
27
|
+
return !!other && this.width == other.width;
|
28
|
+
};
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Returns true if this.height equals other.height
|
32
|
+
* @param {webfont.Size} other
|
33
|
+
* @return {boolean}
|
34
|
+
*/
|
35
|
+
webfont.Size.prototype.equalsHeight = function (other) {
|
36
|
+
return !!other && this.height == other.height;
|
19
37
|
};
|
data/src/core/useragentparser.js
CHANGED
@@ -35,7 +35,7 @@ webfont.UserAgentParser.UNKNOWN_USER_AGENT = new webfont.UserAgent(
|
|
35
35
|
webfont.UserAgentParser.UNKNOWN,
|
36
36
|
webfont.UserAgentParser.UNKNOWN,
|
37
37
|
undefined,
|
38
|
-
new webfont.BrowserInfo(false, false));
|
38
|
+
new webfont.BrowserInfo(false, false, false));
|
39
39
|
|
40
40
|
/**
|
41
41
|
* Parses the user agent string and returns an object.
|
@@ -142,12 +142,12 @@ webfont.UserAgentParser.prototype.parseIeUserAgentString_ = function() {
|
|
142
142
|
(platform == "Windows Phone" && platformVersion.major >= 8);
|
143
143
|
|
144
144
|
return new webfont.UserAgent(name, version, name, version,
|
145
|
-
platform, platformVersionString, this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(supportWebFont, false));
|
145
|
+
platform, platformVersionString, this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(supportWebFont, false, false));
|
146
146
|
}
|
147
147
|
|
148
148
|
return new webfont.UserAgent("MSIE", webfont.UserAgentParser.UNKNOWN,
|
149
149
|
"MSIE", webfont.UserAgentParser.UNKNOWN,
|
150
|
-
platform, platformVersionString, this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(false, false));
|
150
|
+
platform, platformVersionString, this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(false, false, false));
|
151
151
|
};
|
152
152
|
|
153
153
|
/**
|
@@ -192,7 +192,7 @@ webfont.UserAgentParser.prototype.parseOperaUserAgentString_ = function() {
|
|
192
192
|
|
193
193
|
return new webfont.UserAgent("OperaMini", version, engineName,
|
194
194
|
engineVersion, this.getPlatform_(), this.getPlatformVersion_(),
|
195
|
-
this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(false, false));
|
195
|
+
this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(false, false, false));
|
196
196
|
}
|
197
197
|
|
198
198
|
// Otherwise, find version information for normal Opera or Opera Mobile
|
@@ -203,7 +203,7 @@ webfont.UserAgentParser.prototype.parseOperaUserAgentString_ = function() {
|
|
203
203
|
var version = this.parseVersion_(versionString);
|
204
204
|
return new webfont.UserAgent("Opera", versionString, engineName, engineVersion,
|
205
205
|
this.getPlatform_(), this.getPlatformVersion_(),
|
206
|
-
this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(version.major >= 10, false));
|
206
|
+
this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(version.major >= 10, false, false));
|
207
207
|
}
|
208
208
|
}
|
209
209
|
var versionString = this.getMatchingGroup_(this.userAgent_, /Opera[\/ ]([\d\.]+)/, 1);
|
@@ -212,11 +212,11 @@ webfont.UserAgentParser.prototype.parseOperaUserAgentString_ = function() {
|
|
212
212
|
var version = this.parseVersion_(versionString);
|
213
213
|
return new webfont.UserAgent("Opera", versionString, engineName, engineVersion,
|
214
214
|
this.getPlatform_(), this.getPlatformVersion_(),
|
215
|
-
this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(version.major >= 10, false));
|
215
|
+
this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(version.major >= 10, false, false));
|
216
216
|
}
|
217
217
|
return new webfont.UserAgent("Opera", webfont.UserAgentParser.UNKNOWN,
|
218
218
|
engineName, engineVersion, this.getPlatform_(),
|
219
|
-
this.getPlatformVersion_(), this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(false, false));
|
219
|
+
this.getPlatformVersion_(), this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(false, false, false));
|
220
220
|
};
|
221
221
|
|
222
222
|
/**
|
@@ -279,10 +279,11 @@ webfont.UserAgentParser.prototype.parseWebKitUserAgentString_ = function() {
|
|
279
279
|
supportWebFont = webKitVersion.major >= 526 || webKitVersion.major >= 525 && webKitVersion.minor >= 13;
|
280
280
|
}
|
281
281
|
|
282
|
-
var hasWebKitFallbackBug = webKitVersion.major < 536 || (webKitVersion.major == 536 && webKitVersion.minor < 11)
|
282
|
+
var hasWebKitFallbackBug = webKitVersion.major < 536 || (webKitVersion.major == 536 && webKitVersion.minor < 11),
|
283
|
+
hasWebKitMetricsBug = platform == 'iPhone' || platform == 'iPad' || platform == 'iPod' || platform == 'Macintosh';
|
283
284
|
|
284
285
|
return new webfont.UserAgent(name, version, "AppleWebKit", webKitVersionString,
|
285
|
-
platform, platformVersionString, this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(supportWebFont, hasWebKitFallbackBug));
|
286
|
+
platform, platformVersionString, this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(supportWebFont, hasWebKitFallbackBug, hasWebKitMetricsBug));
|
286
287
|
};
|
287
288
|
|
288
289
|
/**
|
@@ -331,7 +332,7 @@ webfont.UserAgentParser.prototype.parseGeckoUserAgentString_ = function() {
|
|
331
332
|
}
|
332
333
|
}
|
333
334
|
return new webfont.UserAgent(name, version, "Gecko", geckoVersionString,
|
334
|
-
this.getPlatform_(), this.getPlatformVersion_(), this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(supportWebFont, false));
|
335
|
+
this.getPlatform_(), this.getPlatformVersion_(), this.getDocumentMode_(this.doc_), new webfont.BrowserInfo(supportWebFont, false, false));
|
335
336
|
};
|
336
337
|
|
337
338
|
/**
|
@@ -13,7 +13,7 @@ webfont.TypekitScript.HOOK = '__webfonttypekitmodule__';
|
|
13
13
|
|
14
14
|
webfont.TypekitScript.prototype.getScriptSrc = function(kitId) {
|
15
15
|
var protocol = this.domHelper_.getProtocol();
|
16
|
-
var api = this.configuration_['api'] || protocol + '//use.typekit.
|
16
|
+
var api = this.configuration_['api'] || protocol + '//use.typekit.net';
|
17
17
|
return api + '/' + kitId + '.js';
|
18
18
|
};
|
19
19
|
|
data/webfontloader.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'webfontloader'
|
16
|
-
s.version = '1.
|
17
|
-
s.date = '2013-02-
|
16
|
+
s.version = '1.3.0'
|
17
|
+
s.date = '2013-02-28'
|
18
18
|
|
19
19
|
## Make sure your summary is short. The description may be as long
|
20
20
|
## as you like.
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webfontloader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 1.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Carver
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2013-02-
|
19
|
+
date: 2013-02-28 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
prerelease: false
|