webfontloader 1.4.5 → 1.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +4 -0
- data/lib/webfontloader.rb +1 -1
- data/spec/core/fontwatcher_spec.js +36 -42
- data/spec/core/fontwatchrunner_spec.js +4 -6
- data/spec/core/useragentparser_spec.js +50 -0
- data/spec/core/webfont_spec.js +10 -18
- data/spec/deps.js +3 -4
- data/spec/index.html +1 -2
- data/src/core/fontmodule.js +22 -0
- data/src/core/fontmoduleloader.js +0 -21
- data/src/core/fontwatcher.js +18 -20
- data/src/core/useragentparser.js +2 -2
- data/src/core/webfont.js +7 -18
- data/src/modules.yml +1 -1
- data/src/modules/google/googlefontapi.js +7 -10
- data/webfontloader.gemspec +3 -4
- metadata +5 -6
- data/spec/modules/google/lastresortwebkitfontwatchrunner_spec.js +0 -137
- data/src/modules/google/lastresortwebkitfontwatchrunner.js +0 -115
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
v1.4.6 (May 29, 2013)
|
2
|
+
* Merge font watching strategies from core and the Google module
|
3
|
+
* Add support for the Samsung Galaxy S4 user agent string
|
4
|
+
|
1
5
|
v1.4.5 (May 23, 2013)
|
2
6
|
* Move modules into their own namespace
|
3
7
|
* Add new methods into DomHelper and add specs for all DomHelper methods
|
data/lib/webfontloader.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
describe('FontWatcher', function () {
|
2
2
|
var FontWatcher = webfont.FontWatcher,
|
3
|
+
FontWatchRunner = webfont.FontWatchRunner,
|
3
4
|
Font = webfont.Font,
|
4
5
|
UserAgent = webfont.UserAgent,
|
5
6
|
BrowserInfo = webfont.BrowserInfo,
|
@@ -30,42 +31,34 @@ describe('FontWatcher', function () {
|
|
30
31
|
eventDispatcher.dispatchFontInactive = jasmine.createSpy('dispatchFontInactive');
|
31
32
|
eventDispatcher.dispatchActive = jasmine.createSpy('dispatchActive');
|
32
33
|
eventDispatcher.dispatchInactive = jasmine.createSpy('dispatchInactive');
|
33
|
-
});
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
found = true;
|
53
|
-
break;
|
35
|
+
spyOn(FontWatchRunner.prototype, 'start').andCallFake(function (font, fontTestString) {
|
36
|
+
var found = false;
|
37
|
+
|
38
|
+
testStrings(this.fontTestString_);
|
39
|
+
timeout(this.timeout_);
|
40
|
+
|
41
|
+
for (var i = 0; i < activeFonts.length; i += 1) {
|
42
|
+
if (activeFonts[i].getName() === this.font_.getName()) {
|
43
|
+
found = true;
|
44
|
+
break;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
if (found) {
|
49
|
+
this.activeCallback_(this.font_);
|
50
|
+
} else {
|
51
|
+
this.inactiveCallback_(this.font_);
|
54
52
|
}
|
55
|
-
}
|
56
|
-
|
57
|
-
this.activeCallback(this.font);
|
58
|
-
} else {
|
59
|
-
this.inactiveCallback(this.font);
|
60
|
-
}
|
61
|
-
};
|
53
|
+
});
|
54
|
+
});
|
62
55
|
|
63
56
|
describe('watch zero fonts', function () {
|
64
57
|
it('should call inactive when there are no fonts to load', function () {
|
65
58
|
activeFonts = [];
|
66
59
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
67
60
|
|
68
|
-
fontWatcher.watchFonts([], {},
|
61
|
+
fontWatcher.watchFonts([], {}, null, true);
|
69
62
|
expect(eventDispatcher.dispatchInactive).toHaveBeenCalled();
|
70
63
|
});
|
71
64
|
|
@@ -73,7 +66,7 @@ describe('FontWatcher', function () {
|
|
73
66
|
activeFonts = [];
|
74
67
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
75
68
|
|
76
|
-
fontWatcher.watchFonts([], {},
|
69
|
+
fontWatcher.watchFonts([], {}, null, false);
|
77
70
|
expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
|
78
71
|
});
|
79
72
|
});
|
@@ -83,7 +76,7 @@ describe('FontWatcher', function () {
|
|
83
76
|
activeFonts = [font1];
|
84
77
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
85
78
|
|
86
|
-
fontWatcher.watchFonts([font1], {},
|
79
|
+
fontWatcher.watchFonts([font1], {}, null, false);
|
87
80
|
expect(eventDispatcher.dispatchFontInactive).not.toHaveBeenCalled();
|
88
81
|
expect(eventDispatcher.dispatchActive).not.toHaveBeenCalled();
|
89
82
|
expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
|
@@ -95,7 +88,7 @@ describe('FontWatcher', function () {
|
|
95
88
|
activeFonts = [font1];
|
96
89
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
97
90
|
|
98
|
-
fontWatcher.watchFonts([font1], {},
|
91
|
+
fontWatcher.watchFonts([font1], {}, null, true);
|
99
92
|
expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
|
100
93
|
expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith(font1);
|
101
94
|
expect(eventDispatcher.dispatchFontInactive).not.toHaveBeenCalled();
|
@@ -109,7 +102,7 @@ describe('FontWatcher', function () {
|
|
109
102
|
activeFonts = [];
|
110
103
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
111
104
|
|
112
|
-
fontWatcher.watchFonts([font1], {},
|
105
|
+
fontWatcher.watchFonts([font1], {}, null, true);
|
113
106
|
expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
|
114
107
|
expect(eventDispatcher.dispatchFontActive).not.toHaveBeenCalled();
|
115
108
|
expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font1);
|
@@ -123,7 +116,7 @@ describe('FontWatcher', function () {
|
|
123
116
|
activeFonts = [font1, font2, font3];
|
124
117
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
125
118
|
|
126
|
-
fontWatcher.watchFonts([font1, font2, font3], {},
|
119
|
+
fontWatcher.watchFonts([font1, font2, font3], {}, null, true);
|
127
120
|
expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
|
128
121
|
expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith(font1);
|
129
122
|
expect(eventDispatcher.dispatchFontInactive).not.toHaveBeenCalled();
|
@@ -137,7 +130,7 @@ describe('FontWatcher', function () {
|
|
137
130
|
activeFonts = [];
|
138
131
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
139
132
|
|
140
|
-
fontWatcher.watchFonts([font1, font2, font3], {},
|
133
|
+
fontWatcher.watchFonts([font1, font2, font3], {}, null, true);
|
141
134
|
expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
|
142
135
|
expect(eventDispatcher.dispatchFontActive).not.toHaveBeenCalled();
|
143
136
|
expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font1);
|
@@ -151,7 +144,7 @@ describe('FontWatcher', function () {
|
|
151
144
|
activeFonts = [font1, font3];
|
152
145
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
153
146
|
|
154
|
-
fontWatcher.watchFonts([font1, font2, font3], {},
|
147
|
+
fontWatcher.watchFonts([font1, font2, font3], {}, null, true);
|
155
148
|
expect(eventDispatcher.dispatchFontLoading.callCount).toEqual(3);
|
156
149
|
expect(eventDispatcher.dispatchFontLoading.calls[0].args[0]).toEqual(font1);
|
157
150
|
expect(eventDispatcher.dispatchFontLoading.calls[1].args[0]).toEqual(font2);
|
@@ -180,8 +173,7 @@ describe('FontWatcher', function () {
|
|
180
173
|
activeFonts = [font5, font6];
|
181
174
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
|
182
175
|
|
183
|
-
fontWatcher.watchFonts([font5, font6, font7, font8, font9], {},
|
184
|
-
|
176
|
+
fontWatcher.watchFonts([font5, font6, font7, font8, font9], {}, null, true);
|
185
177
|
expect(eventDispatcher.dispatchFontLoading.callCount).toEqual(5);
|
186
178
|
expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font5);
|
187
179
|
expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font6);
|
@@ -214,18 +206,20 @@ describe('FontWatcher', function () {
|
|
214
206
|
'font2': null,
|
215
207
|
'font3': 'testString2',
|
216
208
|
'font4': null
|
217
|
-
},
|
209
|
+
}, null, true);
|
218
210
|
|
219
|
-
expect(testStrings.callCount).toEqual(
|
220
|
-
expect(testStrings).
|
221
|
-
expect(testStrings).
|
211
|
+
expect(testStrings.callCount).toEqual(4);
|
212
|
+
expect(testStrings.calls[0].args[0]).toEqual('testString1');
|
213
|
+
expect(testStrings.calls[1].args[0]).toEqual(FontWatchRunner.DEFAULT_TEST_STRING);
|
214
|
+
expect(testStrings.calls[2].args[0]).toEqual('testString2');
|
215
|
+
expect(testStrings.calls[3].args[0]).toEqual(FontWatchRunner.DEFAULT_TEST_STRING);
|
222
216
|
});
|
223
217
|
});
|
224
218
|
|
225
219
|
it('should pass on the timeout to FontWatchRunner', function () {
|
226
220
|
var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher, 4000);
|
227
221
|
|
228
|
-
fontWatcher.watchFonts([font1], {},
|
222
|
+
fontWatcher.watchFonts([font1], {}, null, true);
|
229
223
|
|
230
224
|
expect(timeout).toHaveBeenCalledWith(4000);
|
231
225
|
});
|
@@ -189,8 +189,7 @@ describe('FontWatchRunner', function () {
|
|
189
189
|
timesToGetTimeBeforeTimeout = 2;
|
190
190
|
|
191
191
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
192
|
-
domHelper, font, fallbackBugBrowserInfo,
|
193
|
-
0, { 'My Other Family': true });
|
192
|
+
domHelper, font, fallbackBugBrowserInfo, 0, { 'My Other Family': true });
|
194
193
|
|
195
194
|
fontWatchRunner.start();
|
196
195
|
|
@@ -207,13 +206,12 @@ describe('FontWatchRunner', function () {
|
|
207
206
|
timesToGetTimeBeforeTimeout = 2;
|
208
207
|
|
209
208
|
var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
210
|
-
domHelper,
|
211
|
-
0, { 'My Family': true });
|
209
|
+
domHelper, new Font('Arimo'), fallbackBugBrowserInfo, 0, { 'Arimo': true });
|
212
210
|
|
213
211
|
fontWatchRunner.start();
|
214
212
|
|
215
213
|
jasmine.Clock.tick(1 * 25);
|
216
|
-
expect(activeCallback).toHaveBeenCalledWith(
|
214
|
+
expect(activeCallback).toHaveBeenCalledWith(new Font('Arimo'));
|
217
215
|
});
|
218
216
|
});
|
219
217
|
|
@@ -243,7 +241,7 @@ describe('FontWatchRunner', function () {
|
|
243
241
|
];
|
244
242
|
|
245
243
|
fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
|
246
|
-
domHelper, font, browserInfo, 0,
|
244
|
+
domHelper, font, browserInfo, 0, null, 'TestString');
|
247
245
|
|
248
246
|
fontWatchRunner.start();
|
249
247
|
|
@@ -277,6 +277,22 @@ describe('UserAgentParser', function () {
|
|
277
277
|
hasWebKitMetricsBug: false
|
278
278
|
}
|
279
279
|
});
|
280
|
+
|
281
|
+
expect(parse('Mozilla/5.0 (Linux; Android 4.2.2; SGH-M919 Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22'))
|
282
|
+
.toMatchUserAgent({
|
283
|
+
name: 'Chrome',
|
284
|
+
version: new Version(25, 0, 1364, 169),
|
285
|
+
platform: 'Android',
|
286
|
+
platformVersion: new Version(4, 2, 2),
|
287
|
+
engine: 'AppleWebKit',
|
288
|
+
engineVersion: new Version(537, 22),
|
289
|
+
documentMode: undefined,
|
290
|
+
browserInfo: {
|
291
|
+
hasWebFontSupport: true,
|
292
|
+
hasWebKitFallbackBug: false,
|
293
|
+
hasWebKitMetricsBug: false
|
294
|
+
}
|
295
|
+
});
|
280
296
|
});
|
281
297
|
|
282
298
|
it('should detect Chrome on iPad', function () {
|
@@ -617,6 +633,40 @@ describe('UserAgentParser', function () {
|
|
617
633
|
});
|
618
634
|
});
|
619
635
|
|
636
|
+
it('should detect Samsung Galaxy S4 builtin browser', function () {
|
637
|
+
expect(parse('Mozilla/5.0 (Linux; Android 4.2.2; sl-si; SAMSUNG GT-I9505 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19'))
|
638
|
+
.toMatchUserAgent({
|
639
|
+
name: 'Chrome',
|
640
|
+
version: new Version(18, 0, 1025, 308),
|
641
|
+
platform: 'Android',
|
642
|
+
platformVersion: new Version(4, 2, 2),
|
643
|
+
engine: 'AppleWebKit',
|
644
|
+
engineVersion: new Version(535, 19),
|
645
|
+
documentMode: undefined,
|
646
|
+
browserInfo: {
|
647
|
+
hasWebFontSupport: true,
|
648
|
+
hasWebKitFallbackBug: true,
|
649
|
+
hasWebKitMetricsBug: false
|
650
|
+
}
|
651
|
+
});
|
652
|
+
|
653
|
+
expect(parse('Mozilla/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG SGH-M919 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19'))
|
654
|
+
.toMatchUserAgent({
|
655
|
+
name: 'Chrome',
|
656
|
+
version: new Version(18, 0, 1025, 308),
|
657
|
+
platform: 'Android',
|
658
|
+
platformVersion: new Version(4, 2, 2),
|
659
|
+
engine: 'AppleWebKit',
|
660
|
+
engineVersion: new Version(535, 19),
|
661
|
+
documentMode: undefined,
|
662
|
+
browserInfo: {
|
663
|
+
hasWebFontSupport: true,
|
664
|
+
hasWebKitFallbackBug: true,
|
665
|
+
hasWebKitMetricsBug: false
|
666
|
+
}
|
667
|
+
});
|
668
|
+
});
|
669
|
+
|
620
670
|
it('should detect Android builtin browser in Desktop mode (Nexus 7)', function () {
|
621
671
|
expect(parse('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24'))
|
622
672
|
.toMatchUserAgent({
|
data/spec/core/webfont_spec.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
describe('WebFont', function () {
|
2
2
|
var WebFont = webfont.WebFont,
|
3
3
|
UserAgent = webfont.UserAgent,
|
4
|
+
FontWatchRunner = webfont.FontWatchRunner,
|
4
5
|
BrowserInfo = webfont.BrowserInfo,
|
5
6
|
Version = webfont.Version,
|
6
7
|
Font = webfont.Font,
|
@@ -141,22 +142,13 @@ describe('WebFont', function () {
|
|
141
142
|
this.fonts = [];
|
142
143
|
};
|
143
144
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
if (conf.id) {
|
152
|
-
this.active(font);
|
153
|
-
} else {
|
154
|
-
this.inactive(font);
|
155
|
-
}
|
156
|
-
};
|
157
|
-
|
158
|
-
return FakeFontWatchRunner;
|
159
|
-
};
|
145
|
+
spyOn(FontWatchRunner.prototype, 'start').andCallFake(function () {
|
146
|
+
if (conf.id) {
|
147
|
+
active(font);
|
148
|
+
} else {
|
149
|
+
inactive(font);
|
150
|
+
}
|
151
|
+
});
|
160
152
|
|
161
153
|
testModule.supportUserAgent = function (userAgent, support) {
|
162
154
|
if (conf.id) {
|
@@ -231,8 +223,8 @@ describe('WebFont', function () {
|
|
231
223
|
});
|
232
224
|
|
233
225
|
expect(font.onModuleReady_).toHaveBeenCalled();
|
234
|
-
expect(font.onModuleReady_.calls[0].args[
|
235
|
-
expect(font.onModuleReady_.calls[0].args[
|
226
|
+
expect(font.onModuleReady_.calls[0].args[2]).toEqual([new Font('Elena')]);
|
227
|
+
expect(font.onModuleReady_.calls[0].args[3]).toEqual({ 'Elena': '1234567' });
|
236
228
|
});
|
237
229
|
});
|
238
230
|
|
data/spec/deps.js
CHANGED
@@ -19,9 +19,8 @@ goog.addDependency("../../src/core/webfont.js", ["webfont.WebFont"], ["webfont.D
|
|
19
19
|
goog.addDependency("../../src/modules/ascender.js", ["webfont.modules.Ascender"], ["webfont.Font"]);
|
20
20
|
goog.addDependency("../../src/modules/custom.js", ["webfont.modules.Custom"], ["webfont.Font"]);
|
21
21
|
goog.addDependency("../../src/modules/fontdeck.js", ["webfont.modules.Fontdeck"], ["webfont.Font"]);
|
22
|
-
goog.addDependency("../../src/modules/google/fontapiparser.js", ["webfont.modules.FontApiParser"], ["webfont.Font"]);
|
23
|
-
goog.addDependency("../../src/modules/google/fontapiurlbuilder.js", ["webfont.modules.FontApiUrlBuilder"], []);
|
24
|
-
goog.addDependency("../../src/modules/google/googlefontapi.js", ["webfont.modules.GoogleFontApi"], ["webfont.modules.FontApiUrlBuilder","webfont.modules.FontApiParser","webfont.FontWatchRunner"
|
25
|
-
goog.addDependency("../../src/modules/google/lastresortwebkitfontwatchrunner.js", ["webfont.modules.LastResortWebKitFontWatchRunner"], ["webfont.Font","webfont.FontRuler"]);
|
22
|
+
goog.addDependency("../../src/modules/google/fontapiparser.js", ["webfont.modules.google.FontApiParser"], ["webfont.Font"]);
|
23
|
+
goog.addDependency("../../src/modules/google/fontapiurlbuilder.js", ["webfont.modules.google.FontApiUrlBuilder"], []);
|
24
|
+
goog.addDependency("../../src/modules/google/googlefontapi.js", ["webfont.modules.google.GoogleFontApi"], ["webfont.modules.google.FontApiUrlBuilder","webfont.modules.google.FontApiParser","webfont.FontWatchRunner"]);
|
26
25
|
goog.addDependency("../../src/modules/monotype.js", ["webfont.modules.Monotype"], ["webfont.Font"]);
|
27
26
|
goog.addDependency("../../src/modules/typekit.js", ["webfont.modules.Typekit"], ["webfont.Font"]);
|
data/spec/index.html
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
goog.require('webfont.modules.Fontdeck');
|
31
31
|
goog.require('webfont.modules.Monotype');
|
32
32
|
goog.require('webfont.modules.Custom');
|
33
|
-
goog.require('webfont.modules.GoogleFontApi');
|
33
|
+
goog.require('webfont.modules.google.GoogleFontApi');
|
34
34
|
</script>
|
35
35
|
|
36
36
|
<script src="../spec/core/domhelper_spec.js"></script>
|
@@ -47,7 +47,6 @@
|
|
47
47
|
<script src="../spec/modules/google/fontapiparser_spec.js"></script>
|
48
48
|
<script src="../spec/modules/google/fontapiurlbuilder_spec.js"></script>
|
49
49
|
<script src="../spec/modules/google/googlefontapi_spec.js"></script>
|
50
|
-
<script src="../spec/modules/google/lastresortwebkitfontwatchrunner_spec.js"></script>
|
51
50
|
<script src="../spec/modules/custom_spec.js"></script>
|
52
51
|
<script src="../spec/modules/ascender_spec.js"></script>
|
53
52
|
<script src="../spec/modules/fontdeck_spec.js"></script>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
goog.provide('webfont.FontModule');
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @interface
|
5
|
+
*/
|
6
|
+
webfont.FontModule = function () {};
|
7
|
+
|
8
|
+
goog.scope(function () {
|
9
|
+
var FontModule = webfont.FontModule;
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @param {webfont.UserAgent} userAgent
|
13
|
+
* @param {function(boolean)} support
|
14
|
+
*/
|
15
|
+
FontModule.prototype.supportUserAgent = function (userAgent, support) {};
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @param {function(Array.<webfont.Font>, webfont.FontTestStrings=, Object.<string, boolean>=)} onReady
|
19
|
+
*/
|
20
|
+
FontModule.prototype.load = function (onReady) {};
|
21
|
+
});
|
22
|
+
|
@@ -1,27 +1,6 @@
|
|
1
1
|
goog.provide('webfont.FontModuleLoader');
|
2
|
-
goog.provide('webfont.FontModule');
|
3
2
|
goog.provide('webfont.FontModuleFactory');
|
4
3
|
|
5
|
-
/**
|
6
|
-
* @interface
|
7
|
-
*/
|
8
|
-
webfont.FontModule = function () {};
|
9
|
-
|
10
|
-
goog.scope(function () {
|
11
|
-
var FontModule = webfont.FontModule;
|
12
|
-
|
13
|
-
/**
|
14
|
-
* @param {webfont.UserAgent} userAgent
|
15
|
-
* @param {function(boolean)} support
|
16
|
-
*/
|
17
|
-
FontModule.prototype.supportUserAgent = function (userAgent, support) {};
|
18
|
-
|
19
|
-
/**
|
20
|
-
* @param {function(Array.<webfont.Font>, webfont.FontTestStrings=)} onReady
|
21
|
-
*/
|
22
|
-
FontModule.prototype.load = function (onReady) {};
|
23
|
-
});
|
24
|
-
|
25
4
|
/** @typedef {function(Object, webfont.DomHelper): webfont.FontModule} */
|
26
5
|
webfont.FontModuleFactory;
|
27
6
|
|
data/src/core/fontwatcher.js
CHANGED
@@ -21,26 +21,19 @@ webfont.FontWatcher = function(userAgent, domHelper, eventDispatcher, opt_timeou
|
|
21
21
|
};
|
22
22
|
|
23
23
|
goog.scope(function () {
|
24
|
-
var FontWatcher = webfont.FontWatcher
|
24
|
+
var FontWatcher = webfont.FontWatcher,
|
25
|
+
FontWatchRunner = webfont.FontWatchRunner;
|
25
26
|
|
26
27
|
/**
|
27
28
|
* Watches a set of font families.
|
28
29
|
* @param {Array.<webfont.Font>} fonts The fonts to watch.
|
29
30
|
* @param {Object.<string, string>} fontTestStrings The font test strings for
|
30
31
|
* each family.
|
31
|
-
* @param {
|
32
|
-
* function(webfont.Font),
|
33
|
-
* function(webfont.Font),
|
34
|
-
* webfont.DomHelper,
|
35
|
-
* webfont.Font,
|
36
|
-
* webfont.BrowserInfo,
|
37
|
-
* number=,
|
38
|
-
* Object.<string, boolean>=,
|
39
|
-
* string=)} fontWatchRunnerCtor The font watch runner constructor.
|
32
|
+
* @param {Object.<String, boolean>} metricCompatibleFonts
|
40
33
|
* @param {boolean} last True if this is the last set of fonts to watch.
|
41
34
|
*/
|
42
35
|
FontWatcher.prototype.watchFonts = function(fonts,
|
43
|
-
fontTestStrings,
|
36
|
+
fontTestStrings, metricCompatibleFonts, last) {
|
44
37
|
var length = fonts.length;
|
45
38
|
|
46
39
|
if (length === 0 && last) {
|
@@ -48,23 +41,28 @@ goog.scope(function () {
|
|
48
41
|
return;
|
49
42
|
}
|
50
43
|
|
51
|
-
this.currentlyWatched_ += length;
|
44
|
+
this.currentlyWatched_ += fonts.length;
|
52
45
|
|
53
46
|
if (last) {
|
54
47
|
this.last_ = last;
|
55
48
|
}
|
56
49
|
|
57
|
-
for (var i = 0; i < length; i++) {
|
58
|
-
var font = fonts[i]
|
59
|
-
|
50
|
+
for (var i = 0; i < fonts.length; i++) {
|
51
|
+
var font = fonts[i],
|
52
|
+
fontTestString = fontTestStrings[font.getName()];
|
60
53
|
|
61
54
|
this.eventDispatcher_.dispatchFontLoading(font);
|
62
55
|
|
63
|
-
var
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
56
|
+
var fontWatchRunner = new FontWatchRunner(
|
57
|
+
goog.bind(this.fontActive_, this),
|
58
|
+
goog.bind(this.fontInactive_, this),
|
59
|
+
this.domHelper_,
|
60
|
+
font,
|
61
|
+
this.browserInfo_,
|
62
|
+
this.timeout_,
|
63
|
+
metricCompatibleFonts,
|
64
|
+
fontTestString
|
65
|
+
);
|
68
66
|
|
69
67
|
fontWatchRunner.start();
|
70
68
|
}
|
data/src/core/useragentparser.js
CHANGED
@@ -313,10 +313,10 @@ goog.scope(function () {
|
|
313
313
|
browserVersion = new Version();
|
314
314
|
} else if (browserName == "Silk") {
|
315
315
|
browserVersion = Version.parse(this.getMatchingGroup_(this.userAgent_, /Silk\/([\d\._]+)/, 1));
|
316
|
-
} else if (this.userAgent_.indexOf("Version/") != -1) {
|
317
|
-
browserVersion = Version.parse(this.getMatchingGroup_(this.userAgent_, /Version\/([\d\.\w]+)/, 1));
|
318
316
|
} else if (browserName == "Chrome") {
|
319
317
|
browserVersion = Version.parse(this.getMatchingGroup_(this.userAgent_, /(Chrome|CrMo|CriOS)\/([\d\.]+)/, 2));
|
318
|
+
} else if (this.userAgent_.indexOf("Version/") != -1) {
|
319
|
+
browserVersion = Version.parse(this.getMatchingGroup_(this.userAgent_, /Version\/([\d\.\w]+)/, 1));
|
320
320
|
} else if (browserName == "AdobeAIR") {
|
321
321
|
browserVersion = Version.parse(this.getMatchingGroup_(this.userAgent_, /AdobeAIR\/([\d\.]+)/, 1));
|
322
322
|
}
|
data/src/core/webfont.js
CHANGED
@@ -58,9 +58,7 @@ goog.scope(function () {
|
|
58
58
|
*/
|
59
59
|
WebFont.prototype.isModuleSupportingUserAgent_ = function(module, eventDispatcher,
|
60
60
|
fontWatcher, support) {
|
61
|
-
var
|
62
|
-
module.getFontWatchRunnerCtor() : webfont.FontWatchRunner,
|
63
|
-
that = this;
|
61
|
+
var that = this;
|
64
62
|
|
65
63
|
if (!support) {
|
66
64
|
var allModulesLoaded = --this.moduleLoading_ == 0;
|
@@ -73,32 +71,23 @@ goog.scope(function () {
|
|
73
71
|
eventDispatcher.dispatchLoading();
|
74
72
|
}
|
75
73
|
}
|
76
|
-
fontWatcher.watchFonts([], {},
|
74
|
+
fontWatcher.watchFonts([], {}, null, allModulesLoaded);
|
77
75
|
return;
|
78
76
|
}
|
79
77
|
|
80
|
-
module.load(function (fonts, opt_fontTestStrings) {
|
81
|
-
that.onModuleReady_(eventDispatcher, fontWatcher,
|
78
|
+
module.load(function (fonts, opt_fontTestStrings, opt_metricCompatibleFonts) {
|
79
|
+
that.onModuleReady_(eventDispatcher, fontWatcher, fonts, opt_fontTestStrings, opt_metricCompatibleFonts);
|
82
80
|
});
|
83
81
|
};
|
84
82
|
|
85
83
|
/**
|
86
84
|
* @param {webfont.EventDispatcher} eventDispatcher
|
87
85
|
* @param {webfont.FontWatcher} fontWatcher
|
88
|
-
* @param {function(new:webfont.FontWatchRunner,
|
89
|
-
* function(webfont.Font),
|
90
|
-
* function(webfont.Font),
|
91
|
-
* webfont.DomHelper,
|
92
|
-
* webfont.Font,
|
93
|
-
* webfont.BrowserInfo,
|
94
|
-
* number=,
|
95
|
-
* Object.<string, boolean>=,
|
96
|
-
* string=)} fontWatchRunnerCtor
|
97
86
|
* @param {Array.<webfont.Font>} fonts
|
98
87
|
* @param {webfont.FontTestStrings=} opt_fontTestStrings
|
88
|
+
* @param {Object.<string, boolean>=} opt_metricCompatibleFonts
|
99
89
|
*/
|
100
|
-
WebFont.prototype.onModuleReady_ = function(eventDispatcher, fontWatcher,
|
101
|
-
fontWatchRunnerCtor, fonts, opt_fontTestStrings) {
|
90
|
+
WebFont.prototype.onModuleReady_ = function(eventDispatcher, fontWatcher, fonts, opt_fontTestStrings, opt_metricCompatibleFonts) {
|
102
91
|
var allModulesLoaded = --this.moduleLoading_ == 0;
|
103
92
|
|
104
93
|
if (allModulesLoaded) {
|
@@ -106,7 +95,7 @@ goog.scope(function () {
|
|
106
95
|
}
|
107
96
|
|
108
97
|
setTimeout(function () {
|
109
|
-
fontWatcher.watchFonts(fonts, opt_fontTestStrings || {},
|
98
|
+
fontWatcher.watchFonts(fonts, opt_fontTestStrings || {}, opt_metricCompatibleFonts || null, allModulesLoaded);
|
110
99
|
}, 0);
|
111
100
|
};
|
112
101
|
|
data/src/modules.yml
CHANGED
@@ -8,6 +8,7 @@ core:
|
|
8
8
|
- core/cssclassname.js
|
9
9
|
- core/font.js
|
10
10
|
- core/eventdispatcher.js
|
11
|
+
- core/fontmodule.js
|
11
12
|
- core/fontmoduleloader.js
|
12
13
|
- core/fontruler.js
|
13
14
|
- core/fontwatchrunner.js
|
@@ -19,7 +20,6 @@ ascender:
|
|
19
20
|
- modules/ascender.js
|
20
21
|
|
21
22
|
google:
|
22
|
-
- modules/google/lastresortwebkitfontwatchrunner.js
|
23
23
|
- modules/google/fontapiurlbuilder.js
|
24
24
|
- modules/google/fontapiparser.js
|
25
25
|
- modules/google/googlefontapi.js
|
@@ -3,7 +3,6 @@ goog.provide('webfont.modules.google.GoogleFontApi');
|
|
3
3
|
goog.require('webfont.modules.google.FontApiUrlBuilder');
|
4
4
|
goog.require('webfont.modules.google.FontApiParser');
|
5
5
|
goog.require('webfont.FontWatchRunner');
|
6
|
-
goog.require('webfont.modules.google.LastResortWebKitFontWatchRunner');
|
7
6
|
|
8
7
|
/**
|
9
8
|
* @constructor
|
@@ -20,19 +19,17 @@ webfont.modules.google.GoogleFontApi.NAME = 'google';
|
|
20
19
|
goog.scope(function () {
|
21
20
|
var GoogleFontApi = webfont.modules.google.GoogleFontApi,
|
22
21
|
FontWatchRunner = webfont.FontWatchRunner,
|
23
|
-
LastResortWebKitFontWatchRunner = webfont.modules.google.LastResortWebKitFontWatchRunner,
|
24
22
|
FontApiUrlBuilder = webfont.modules.google.FontApiUrlBuilder,
|
25
23
|
FontApiParser = webfont.modules.google.FontApiParser;
|
26
24
|
|
27
|
-
GoogleFontApi.
|
28
|
-
|
25
|
+
GoogleFontApi.METRICS_COMPATIBLE_FONTS = {
|
26
|
+
"Arimo": true,
|
27
|
+
"Cousine": true,
|
28
|
+
"Tinos": true
|
29
29
|
};
|
30
30
|
|
31
|
-
GoogleFontApi.prototype.
|
32
|
-
|
33
|
-
return LastResortWebKitFontWatchRunner;
|
34
|
-
}
|
35
|
-
return FontWatchRunner;
|
31
|
+
GoogleFontApi.prototype.supportUserAgent = function(userAgent, support) {
|
32
|
+
support(userAgent.getBrowserInfo().hasWebFontSupport());
|
36
33
|
};
|
37
34
|
|
38
35
|
GoogleFontApi.prototype.load = function(onReady) {
|
@@ -59,7 +56,7 @@ goog.scope(function () {
|
|
59
56
|
|
60
57
|
domHelper.insertInto('head', domHelper.createCssLink(
|
61
58
|
fontApiUrlBuilder.build()));
|
62
|
-
onReady(fontApiParser.getFonts(), fontApiParser.getFontTestStrings());
|
59
|
+
onReady(fontApiParser.getFonts(), fontApiParser.getFontTestStrings(), GoogleFontApi.METRICS_COMPATIBLE_FONTS);
|
63
60
|
};
|
64
61
|
});
|
65
62
|
|
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.4.
|
17
|
-
s.date = '2013-05-
|
16
|
+
s.version = '1.4.6'
|
17
|
+
s.date = '2013-05-29'
|
18
18
|
|
19
19
|
## Make sure your summary is short. The description may be as long
|
20
20
|
## as you like.
|
@@ -142,7 +142,6 @@ DESC
|
|
142
142
|
spec/modules/google/fontapiparser_spec.js
|
143
143
|
spec/modules/google/fontapiurlbuilder_spec.js
|
144
144
|
spec/modules/google/googlefontapi_spec.js
|
145
|
-
spec/modules/google/lastresortwebkitfontwatchrunner_spec.js
|
146
145
|
spec/modules/monotype_spec.js
|
147
146
|
spec/modules/typekit_spec.js
|
148
147
|
src/async_load.js
|
@@ -152,6 +151,7 @@ DESC
|
|
152
151
|
src/core/domhelper.js
|
153
152
|
src/core/eventdispatcher.js
|
154
153
|
src/core/font.js
|
154
|
+
src/core/fontmodule.js
|
155
155
|
src/core/fontmoduleloader.js
|
156
156
|
src/core/fontruler.js
|
157
157
|
src/core/fontwatcher.js
|
@@ -169,7 +169,6 @@ DESC
|
|
169
169
|
src/modules/google/fontapiparser.js
|
170
170
|
src/modules/google/fontapiurlbuilder.js
|
171
171
|
src/modules/google/googlefontapi.js
|
172
|
-
src/modules/google/lastresortwebkitfontwatchrunner.js
|
173
172
|
src/modules/monotype.js
|
174
173
|
src/modules/typekit.js
|
175
174
|
tools/compiler/base.js
|
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: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 1.4.
|
9
|
+
- 6
|
10
|
+
version: 1.4.6
|
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-05-
|
19
|
+
date: 2013-05-29 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: rake
|
@@ -170,7 +170,6 @@ files:
|
|
170
170
|
- spec/modules/google/fontapiparser_spec.js
|
171
171
|
- spec/modules/google/fontapiurlbuilder_spec.js
|
172
172
|
- spec/modules/google/googlefontapi_spec.js
|
173
|
-
- spec/modules/google/lastresortwebkitfontwatchrunner_spec.js
|
174
173
|
- spec/modules/monotype_spec.js
|
175
174
|
- spec/modules/typekit_spec.js
|
176
175
|
- src/async_load.js
|
@@ -180,6 +179,7 @@ files:
|
|
180
179
|
- src/core/domhelper.js
|
181
180
|
- src/core/eventdispatcher.js
|
182
181
|
- src/core/font.js
|
182
|
+
- src/core/fontmodule.js
|
183
183
|
- src/core/fontmoduleloader.js
|
184
184
|
- src/core/fontruler.js
|
185
185
|
- src/core/fontwatcher.js
|
@@ -197,7 +197,6 @@ files:
|
|
197
197
|
- src/modules/google/fontapiparser.js
|
198
198
|
- src/modules/google/fontapiurlbuilder.js
|
199
199
|
- src/modules/google/googlefontapi.js
|
200
|
-
- src/modules/google/lastresortwebkitfontwatchrunner.js
|
201
200
|
- src/modules/monotype.js
|
202
201
|
- src/modules/typekit.js
|
203
202
|
- tools/compiler/base.js
|
@@ -1,137 +0,0 @@
|
|
1
|
-
describe('modules.google.LastResortWebKitFontWatchRunner', function () {
|
2
|
-
var LastResortWebKitFontWatchRunner = webfont.modules.google.LastResortWebKitFontWatchRunner,
|
3
|
-
BrowserInfo = webfont.BrowserInfo,
|
4
|
-
DomHelper = webfont.DomHelper,
|
5
|
-
FontRuler = webfont.FontRuler,
|
6
|
-
Font = webfont.Font,
|
7
|
-
domHelper = new DomHelper(window),
|
8
|
-
font = new Font('My Family', 'n4');
|
9
|
-
|
10
|
-
var TARGET_SIZE = 3,
|
11
|
-
FALLBACK_SIZE_A = 1,
|
12
|
-
FALLBACK_SIZE_B = 2,
|
13
|
-
LAST_RESORT_SIZE = 4,
|
14
|
-
|
15
|
-
browserInfo = new BrowserInfo(true, true, false),
|
16
|
-
setupWidths = [FALLBACK_SIZE_A, FALLBACK_SIZE_B, LAST_RESORT_SIZE],
|
17
|
-
actualWidths = [],
|
18
|
-
timesToGetTimeBeforeTimeout = 10,
|
19
|
-
activeCallback = null,
|
20
|
-
inactiveCallback = null;
|
21
|
-
|
22
|
-
beforeEach(function () {
|
23
|
-
jasmine.Clock.useMock();
|
24
|
-
|
25
|
-
actualWidths = [];
|
26
|
-
|
27
|
-
activeCallback = jasmine.createSpy('activeCallback');
|
28
|
-
inactiveCallback = jasmine.createSpy('inactiveCallback');
|
29
|
-
timesToGetTimeBeforeTimeout = 10;
|
30
|
-
|
31
|
-
var setupFinished = false,
|
32
|
-
fakeGetWidthCount = 0;
|
33
|
-
|
34
|
-
spyOn(FontRuler.prototype, 'getWidth').andCallFake(function () {
|
35
|
-
var result = null;
|
36
|
-
|
37
|
-
if (setupFinished) {
|
38
|
-
// If you are getting an exception here your tests does not specify enough
|
39
|
-
// size data to run properly.
|
40
|
-
if (fakeGetWidthCount >= actualWidths.length) {
|
41
|
-
throw 'Invalid test data';
|
42
|
-
}
|
43
|
-
result = actualWidths[fakeGetWidthCount];
|
44
|
-
fakeGetWidthCount += 1;
|
45
|
-
} else {
|
46
|
-
result = setupWidths[Math.min(fakeGetWidthCount, setupWidths.length - 1)];
|
47
|
-
fakeGetWidthCount += 1;
|
48
|
-
}
|
49
|
-
return result;
|
50
|
-
});
|
51
|
-
|
52
|
-
spyOn(goog, 'now').andCallFake(function () {
|
53
|
-
if (timesToGetTimeBeforeTimeout <= 0) {
|
54
|
-
return 6000;
|
55
|
-
} else {
|
56
|
-
timesToGetTimeBeforeTimeout -= 1;
|
57
|
-
return 1;
|
58
|
-
}
|
59
|
-
});
|
60
|
-
|
61
|
-
var originalStart = LastResortWebKitFontWatchRunner.prototype.start;
|
62
|
-
|
63
|
-
spyOn(LastResortWebKitFontWatchRunner.prototype, 'start').andCallFake(function () {
|
64
|
-
setupFinished = true;
|
65
|
-
fakeGetWidthCount = 0;
|
66
|
-
originalStart.apply(this);
|
67
|
-
});
|
68
|
-
});
|
69
|
-
|
70
|
-
it('should ignore fallback size and call active', function () {
|
71
|
-
actualWidths = [
|
72
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE,
|
73
|
-
TARGET_SIZE, TARGET_SIZE
|
74
|
-
];
|
75
|
-
|
76
|
-
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
77
|
-
domHelper, font, browserInfo);
|
78
|
-
|
79
|
-
fontWatchRunner.start();
|
80
|
-
|
81
|
-
jasmine.Clock.tick(1 * 25);
|
82
|
-
expect(activeCallback).toHaveBeenCalledWith(font);
|
83
|
-
});
|
84
|
-
|
85
|
-
it('should consider last resort font as having identical metrics and call active', function () {
|
86
|
-
actualWidths = [
|
87
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE,
|
88
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE
|
89
|
-
];
|
90
|
-
|
91
|
-
timesToGetTimeBeforeTimeout = 2;
|
92
|
-
|
93
|
-
var arimo = new Font('Arimo');
|
94
|
-
|
95
|
-
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
96
|
-
domHelper, arimo, browserInfo);
|
97
|
-
|
98
|
-
fontWatchRunner.start();
|
99
|
-
|
100
|
-
jasmine.Clock.tick(1 * 25);
|
101
|
-
expect(activeCallback).toHaveBeenCalledWith(arimo);
|
102
|
-
});
|
103
|
-
|
104
|
-
it('should fail to load font and call inactive', function () {
|
105
|
-
actualWidths = [
|
106
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE,
|
107
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE,
|
108
|
-
FALLBACK_SIZE_A, FALLBACK_SIZE_B
|
109
|
-
];
|
110
|
-
|
111
|
-
timesToGetTimeBeforeTimeout = 3;
|
112
|
-
|
113
|
-
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
114
|
-
domHelper, font, browserInfo);
|
115
|
-
|
116
|
-
fontWatchRunner.start();
|
117
|
-
|
118
|
-
jasmine.Clock.tick(2 * 25);
|
119
|
-
expect(inactiveCallback).toHaveBeenCalledWith(font);
|
120
|
-
});
|
121
|
-
|
122
|
-
it('should call inactive when we are loading a metric incompatible font', function () {
|
123
|
-
actualWidths = [
|
124
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE,
|
125
|
-
LAST_RESORT_SIZE, LAST_RESORT_SIZE
|
126
|
-
];
|
127
|
-
|
128
|
-
timesToGetTimeBeforeTimeout = 2;
|
129
|
-
|
130
|
-
var fontWatchRunner = new LastResortWebKitFontWatchRunner(activeCallback, inactiveCallback,
|
131
|
-
domHelper, font, browserInfo);
|
132
|
-
|
133
|
-
fontWatchRunner.start();
|
134
|
-
jasmine.Clock.tick(1 * 25);
|
135
|
-
expect(inactiveCallback).toHaveBeenCalledWith(font);
|
136
|
-
});
|
137
|
-
});
|
@@ -1,115 +0,0 @@
|
|
1
|
-
goog.provide('webfont.modules.google.LastResortWebKitFontWatchRunner');
|
2
|
-
|
3
|
-
goog.require('webfont.Font');
|
4
|
-
goog.require('webfont.FontRuler');
|
5
|
-
|
6
|
-
/**
|
7
|
-
* @constructor
|
8
|
-
* @param {function(webfont.Font)} activeCallback
|
9
|
-
* @param {function(webfont.Font)} inactiveCallback
|
10
|
-
* @param {webfont.DomHelper} domHelper
|
11
|
-
* @param {webfont.Font} font
|
12
|
-
* @param {webfont.BrowserInfo} browserInfo
|
13
|
-
* @param {number=} opt_timeout
|
14
|
-
* @param {Object.<string, boolean>=} opt_metricCompatibleFonts
|
15
|
-
* @param {string=} opt_fontTestString
|
16
|
-
* @extends webfont.FontWatchRunner
|
17
|
-
*/
|
18
|
-
webfont.modules.google.LastResortWebKitFontWatchRunner = function(activeCallback,
|
19
|
-
inactiveCallback, domHelper, font,
|
20
|
-
browserInfo, opt_timeout, opt_metricCompatibleFonts, opt_fontTestString) {
|
21
|
-
|
22
|
-
goog.base(this, activeCallback, inactiveCallback, domHelper,
|
23
|
-
font, browserInfo, opt_timeout, opt_metricCompatibleFonts, opt_fontTestString);
|
24
|
-
|
25
|
-
this.webKitLastResortFontWidths_ = this.setUpWebKitLastResortFontWidths_();
|
26
|
-
this.webKitLastResortWidthChange_ = false;
|
27
|
-
this.lastObservedWidthA_ = this.lastResortWidths_[webfont.FontWatchRunner.LastResortFonts.SERIF];
|
28
|
-
this.lastObservedWidthB_ = this.lastResortWidths_[webfont.FontWatchRunner.LastResortFonts.SANS_SERIF];;
|
29
|
-
};
|
30
|
-
|
31
|
-
goog.inherits(webfont.modules.google.LastResortWebKitFontWatchRunner, webfont.FontWatchRunner)
|
32
|
-
|
33
|
-
webfont.modules.google.LastResortWebKitFontWatchRunner.METRICS_COMPATIBLE_FONTS = {
|
34
|
-
"Arimo": true,
|
35
|
-
"Cousine": true,
|
36
|
-
"Tinos": true
|
37
|
-
};
|
38
|
-
|
39
|
-
goog.scope(function () {
|
40
|
-
var LastResortWebKitFontWatchRunner = webfont.modules.google.LastResortWebKitFontWatchRunner,
|
41
|
-
Font = webfont.Font,
|
42
|
-
FontRuler = webfont.FontRuler;
|
43
|
-
|
44
|
-
/**
|
45
|
-
* While loading a web font webkit applies a last resort fallback font to the
|
46
|
-
* element on which the web font is applied.
|
47
|
-
* See file: WebKit/Source/WebCore/css/CSSFontFaceSource.cpp.
|
48
|
-
* Looking at the different implementation for the different platforms,
|
49
|
-
* the last resort fallback font is different. This code uses the default
|
50
|
-
* OS/browsers values.
|
51
|
-
*/
|
52
|
-
LastResortWebKitFontWatchRunner.prototype
|
53
|
-
.setUpWebKitLastResortFontWidths_ = function() {
|
54
|
-
var lastResortFonts = ['Times New Roman', 'Arial', 'Times', 'Sans', 'Serif'];
|
55
|
-
var variation = this.font_.getVariation();
|
56
|
-
var lastResortFontWidths = lastResortFonts.length;
|
57
|
-
var webKitLastResortFontWidths = {};
|
58
|
-
var fontRuler = new FontRuler(this.domHelper_, this.fontTestString_);
|
59
|
-
|
60
|
-
fontRuler.insert();
|
61
|
-
fontRuler.setFont(new Font(lastResortFonts[0], variation));
|
62
|
-
|
63
|
-
webKitLastResortFontWidths[fontRuler.getWidth()] = true;
|
64
|
-
for (var i = 1; i < lastResortFontWidths; i++) {
|
65
|
-
var font = lastResortFonts[i];
|
66
|
-
fontRuler.setFont(new Font(font, variation));
|
67
|
-
webKitLastResortFontWidths[fontRuler.getWidth()] = true;
|
68
|
-
|
69
|
-
// Another WebKit quirk if the normal weight/style is loaded first,
|
70
|
-
// the size of the normal weight is returned when loading another weight.
|
71
|
-
if (variation.toString().charAt(1) != '4') {
|
72
|
-
fontRuler.setFont(new Font(font, variation.charAt(0) + '4'));
|
73
|
-
webKitLastResortFontWidths[fontRuler.getWidth()] = true;
|
74
|
-
}
|
75
|
-
}
|
76
|
-
fontRuler.remove();
|
77
|
-
return webKitLastResortFontWidths;
|
78
|
-
};
|
79
|
-
|
80
|
-
/**
|
81
|
-
* @override
|
82
|
-
*/
|
83
|
-
LastResortWebKitFontWatchRunner.prototype.check_ = function() {
|
84
|
-
var widthA = this.fontRulerA_.getWidth();
|
85
|
-
var widthB = this.fontRulerB_.getWidth();
|
86
|
-
|
87
|
-
if (!this.webKitLastResortWidthChange_ && widthA == widthB &&
|
88
|
-
this.webKitLastResortFontWidths_[widthA]) {
|
89
|
-
this.webKitLastResortFontWidths_ = {};
|
90
|
-
this.webKitLastResortFontWidths_[widthA] = true;
|
91
|
-
this.webKitLastResortWidthChange_ = true;
|
92
|
-
}
|
93
|
-
if ((this.lastObservedWidthA_ != widthA || this.lastObservedWidthB_ != widthB) &&
|
94
|
-
(!this.webKitLastResortFontWidths_[widthA] &&
|
95
|
-
!this.webKitLastResortFontWidths_[widthB])) {
|
96
|
-
this.finish_(this.activeCallback_);
|
97
|
-
} else if (this.hasTimedOut_()) {
|
98
|
-
|
99
|
-
// In order to handle the fact that a font could be the same size as the
|
100
|
-
// default browser font on a webkit browser, mark the font as active
|
101
|
-
// after 5 seconds if the latest 2 widths are in webKitLastResortFontWidths_
|
102
|
-
// and the font name is known to be metrics compatible.
|
103
|
-
if (this.webKitLastResortFontWidths_[widthA]
|
104
|
-
&& this.webKitLastResortFontWidths_[widthB] &&
|
105
|
-
LastResortWebKitFontWatchRunner.METRICS_COMPATIBLE_FONTS[
|
106
|
-
this.font_.getName()]) {
|
107
|
-
this.finish_(this.activeCallback_);
|
108
|
-
} else {
|
109
|
-
this.finish_(this.inactiveCallback_);
|
110
|
-
}
|
111
|
-
} else {
|
112
|
-
this.asyncCheck_();
|
113
|
-
}
|
114
|
-
};
|
115
|
-
});
|