webfontloader 1.4.0 → 1.4.1

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.
Files changed (44) hide show
  1. data/CHANGELOG +4 -0
  2. data/lib/webfontloader.rb +1 -1
  3. data/spec/ascender/ascenderscript_spec.js +24 -1
  4. data/spec/core/eventdispatcher_spec.js +15 -11
  5. data/spec/core/font_spec.js +83 -192
  6. data/spec/core/fontruler_spec.js +7 -4
  7. data/spec/core/fontwatcher_spec.js +78 -61
  8. data/spec/core/fontwatchrunner_spec.js +85 -33
  9. data/spec/core/webfont_spec.js +224 -0
  10. data/spec/custom/customcss_spec.js +5 -2
  11. data/spec/deps.js +13 -13
  12. data/spec/fontdeck/fontdeckscript_spec.js +4 -6
  13. data/spec/fonts/sourcesansc.css +1 -0
  14. data/spec/fonts/sourcesanscbold.css +1 -0
  15. data/spec/fonts/sourcesanscbold.otf +0 -0
  16. data/spec/google/fontapiparser_spec.js +58 -178
  17. data/spec/google/googlefontapi_spec.js +14 -42
  18. data/spec/google/lastresortwebkitfontwatchrunner_spec.js +12 -10
  19. data/spec/index.html +5 -3
  20. data/spec/monotype/monotypescript_spec.js +3 -2
  21. data/spec/typekit/typekitscript_spec.js +9 -4
  22. data/src/ascender/ascender_script.js +43 -26
  23. data/src/core/eventdispatcher.js +23 -23
  24. data/src/core/font.js +80 -99
  25. data/src/core/fontmoduleloader.js +1 -1
  26. data/src/core/fontruler.js +10 -20
  27. data/src/core/fontwatcher.js +24 -46
  28. data/src/core/fontwatchrunner.js +13 -13
  29. data/src/core/initialize.js +0 -10
  30. data/src/core/webfont.js +134 -0
  31. data/src/custom/customcss.js +14 -10
  32. data/src/fontdeck/fontdeck_script.js +7 -9
  33. data/src/google/fontapiparser.js +11 -15
  34. data/src/google/googlefontapi.js +1 -2
  35. data/src/google/lastresortwebkitfontwatchrunner.js +15 -13
  36. data/src/modules.yml +2 -3
  37. data/src/monotype/monotype_script.js +9 -8
  38. data/src/typekit/typekit_script.js +17 -7
  39. data/webfontloader.gemspec +7 -6
  40. metadata +9 -8
  41. data/spec/core/cssfontfamilyname_spec.js +0 -38
  42. data/spec/core/fontvariationdescription_spec.js +0 -67
  43. data/src/core/cssfontfamilyname.js +0 -33
  44. data/src/core/fontvariationdescription.js +0 -140
@@ -1,10 +1,13 @@
1
1
  describe('FontRuler', function () {
2
- var FontRuler = webfont.FontRuler,
2
+ var Font = webfont.Font,
3
+ FontRuler = webfont.FontRuler,
3
4
  DomHelper = webfont.DomHelper,
4
5
  Size = webfont.Size,
5
- domHelper = null;
6
+ domHelper = null,
7
+ font = null;
6
8
 
7
9
  beforeEach(function () {
10
+ font = new Font('sans-serif');
8
11
  domHelper = new DomHelper(window);
9
12
  });
10
13
 
@@ -15,8 +18,8 @@ describe('FontRuler', function () {
15
18
  fontRulerA.insert();
16
19
  fontRulerB.insert();
17
20
 
18
- fontRulerA.setFont('sans-serif');
19
- fontRulerB.setFont('sans-serif');
21
+ fontRulerA.setFont(font);
22
+ fontRulerB.setFont(font);
20
23
 
21
24
  var widthA = fontRulerA.getWidth(),
22
25
  widthB = fontRulerB.getWidth();
@@ -1,5 +1,6 @@
1
1
  describe('FontWatcher', function () {
2
2
  var FontWatcher = webfont.FontWatcher,
3
+ Font = webfont.Font,
3
4
  UserAgent = webfont.UserAgent,
4
5
  BrowserInfo = webfont.BrowserInfo,
5
6
  DomHelper = webfont.DomHelper,
@@ -7,12 +8,20 @@ describe('FontWatcher', function () {
7
8
  eventDispatcher = {},
8
9
  testStrings = null,
9
10
  timeout = null,
11
+ font1 = null,
12
+ font2 = null,
13
+ font3 = null,
14
+ font4 = null,
10
15
  userAgent = null,
11
- activeFontFamilies = [];
16
+ activeFonts = [];
12
17
 
13
18
  beforeEach(function () {
14
19
  userAgent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.3', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false, false));
15
- activeFontFamilies = [];
20
+ font1 = new Font('font1');
21
+ font2 = new Font('font2');
22
+ font3 = new Font('font3');
23
+ font4 = new Font('font4');
24
+ activeFonts = [];
16
25
  testStrings = jasmine.createSpy('testStrings');
17
26
  timeout = jasmine.createSpy('timeout');
18
27
  eventDispatcher.dispatchLoading = jasmine.createSpy('dispatchLoading');
@@ -24,11 +33,10 @@ describe('FontWatcher', function () {
24
33
  });
25
34
 
26
35
  function FakeFontWatchRunner(activeCallback, inactiveCallback, domHelper,
27
- fontFamily, fontDescription, browserInfo, opt_timeout, opt_metricCompatibleFonts, opt_fontTestString) {
36
+ font, browserInfo, opt_timeout, opt_metricCompatibleFonts, opt_fontTestString) {
28
37
  this.activeCallback = activeCallback;
29
38
  this.inactiveCallback = inactiveCallback;
30
- this.fontFamily = fontFamily;
31
- this.fontDescription = fontDescription;
39
+ this.font = font;
32
40
  timeout(opt_timeout);
33
41
 
34
42
  if (opt_fontTestString) {
@@ -39,36 +47,43 @@ describe('FontWatcher', function () {
39
47
  FakeFontWatchRunner.prototype.start = function () {
40
48
  var found = false;
41
49
 
42
- for (var i = 0; i < activeFontFamilies.length; i += 1) {
43
- if (activeFontFamilies[i] === this.fontFamily) {
50
+ for (var i = 0; i < activeFonts.length; i += 1) {
51
+ if (activeFonts[i].getName() === this.font.getName()) {
44
52
  found = true;
45
53
  break;
46
54
  }
47
55
  }
48
-
49
56
  if (found) {
50
- this.activeCallback(this.fontFamily, this.fontDescription);
57
+ this.activeCallback(this.font);
51
58
  } else {
52
- this.inactiveCallback(this.fontFamily, this.fontDescription);
59
+ this.inactiveCallback(this.font);
53
60
  }
54
61
  };
55
62
 
56
63
  describe('watch zero fonts', function () {
57
64
  it('should call inactive when there are no fonts to load', function () {
58
- activeFontFamilies = [];
65
+ activeFonts = [];
59
66
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
60
67
 
61
- fontWatcher.watch([], {}, {}, FakeFontWatchRunner, true);
68
+ fontWatcher.watch([], {}, FakeFontWatchRunner, true);
62
69
  expect(eventDispatcher.dispatchInactive).toHaveBeenCalled();
63
70
  });
71
+
72
+ it('should not call inactive when there are no fonts to load, but this is not the last set', function () {
73
+ activeFonts = [];
74
+ var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
75
+
76
+ fontWatcher.watch([], {}, FakeFontWatchRunner, false);
77
+ expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
78
+ });
64
79
  });
65
80
 
66
81
  describe('watch one font not last', function () {
67
82
  it('should not call font inactive, inactive or active', function () {
68
- activeFontFamilies = ['fontFamily1'];
83
+ activeFonts = [font1];
69
84
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
70
85
 
71
- fontWatcher.watch(['fontFamily1'], {}, {}, FakeFontWatchRunner, false);
86
+ fontWatcher.watch([font1], {}, FakeFontWatchRunner, false);
72
87
  expect(eventDispatcher.dispatchFontInactive).not.toHaveBeenCalled();
73
88
  expect(eventDispatcher.dispatchActive).not.toHaveBeenCalled();
74
89
  expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
@@ -77,12 +92,12 @@ describe('FontWatcher', function () {
77
92
 
78
93
  describe('watch one font active', function () {
79
94
  it('should call font active and active', function () {
80
- activeFontFamilies = ['fontFamily1'];
95
+ activeFonts = [font1];
81
96
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
82
97
 
83
- fontWatcher.watch(['fontFamily1'], {}, {}, FakeFontWatchRunner, true);
84
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily1', 'n4');
85
- expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith('fontFamily1', 'n4');
98
+ fontWatcher.watch([font1], {}, FakeFontWatchRunner, true);
99
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
100
+ expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith(font1);
86
101
  expect(eventDispatcher.dispatchFontInactive).not.toHaveBeenCalled();
87
102
  expect(eventDispatcher.dispatchActive).toHaveBeenCalled();
88
103
  expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
@@ -91,13 +106,13 @@ describe('FontWatcher', function () {
91
106
 
92
107
  describe('watch one font inactive', function () {
93
108
  it('should call inactive', function () {
94
- activeFontFamilies = [];
109
+ activeFonts = [];
95
110
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
96
111
 
97
- fontWatcher.watch(['fontFamily1'], {}, {}, FakeFontWatchRunner, true);
98
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily1', 'n4');
112
+ fontWatcher.watch([font1], {}, FakeFontWatchRunner, true);
113
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
99
114
  expect(eventDispatcher.dispatchFontActive).not.toHaveBeenCalled();
100
- expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith('fontFamily1', 'n4');
115
+ expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font1);
101
116
  expect(eventDispatcher.dispatchActive).not.toHaveBeenCalled();
102
117
  expect(eventDispatcher.dispatchInactive).toHaveBeenCalled();
103
118
  });
@@ -105,12 +120,12 @@ describe('FontWatcher', function () {
105
120
 
106
121
  describe('watch multiple fonts active', function () {
107
122
  it('should call font active and active', function () {
108
- activeFontFamilies = ['fontFamily1', 'fontFamily2', 'fontFamily3'];
123
+ activeFonts = [font1, font2, font3];
109
124
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
110
125
 
111
- fontWatcher.watch(['fontFamily1', 'fontFamily2', 'fontFamily3'], {}, {}, FakeFontWatchRunner, true);
112
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily1', 'n4');
113
- expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith('fontFamily1', 'n4');
126
+ fontWatcher.watch([font1, font2, font3], {}, FakeFontWatchRunner, true);
127
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
128
+ expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith(font1);
114
129
  expect(eventDispatcher.dispatchFontInactive).not.toHaveBeenCalled();
115
130
  expect(eventDispatcher.dispatchActive).toHaveBeenCalled();
116
131
  expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
@@ -119,13 +134,13 @@ describe('FontWatcher', function () {
119
134
 
120
135
  describe('watch multiple fonts inactive', function () {
121
136
  it('should call inactive', function () {
122
- activeFontFamilies = [];
137
+ activeFonts = [];
123
138
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
124
139
 
125
- fontWatcher.watch(['fontFamily1', 'fontFamily2', 'fontFamily3'], {}, {}, FakeFontWatchRunner, true);
126
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily1', 'n4');
140
+ fontWatcher.watch([font1, font2, font3], {}, FakeFontWatchRunner, true);
141
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font1);
127
142
  expect(eventDispatcher.dispatchFontActive).not.toHaveBeenCalled();
128
- expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith('fontFamily1', 'n4');
143
+ expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font1);
129
144
  expect(eventDispatcher.dispatchActive).not.toHaveBeenCalled();
130
145
  expect(eventDispatcher.dispatchInactive).toHaveBeenCalled();
131
146
  });
@@ -133,21 +148,21 @@ describe('FontWatcher', function () {
133
148
 
134
149
  describe('watch multiple fonts mixed', function () {
135
150
  it('should call the correct callbacks', function () {
136
- activeFontFamilies = ['fontFamily1', 'fontFamily3'];
151
+ activeFonts = [font1, font3];
137
152
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
138
153
 
139
- fontWatcher.watch(['fontFamily1', 'fontFamily2', 'fontFamily3'], {}, {}, FakeFontWatchRunner, true);
154
+ fontWatcher.watch([font1, font2, font3], {}, FakeFontWatchRunner, true);
140
155
  expect(eventDispatcher.dispatchFontLoading.callCount).toEqual(3);
141
- expect(eventDispatcher.dispatchFontLoading.calls[0].args[0]).toEqual('fontFamily1');
142
- expect(eventDispatcher.dispatchFontLoading.calls[1].args[0]).toEqual('fontFamily2');
143
- expect(eventDispatcher.dispatchFontLoading.calls[2].args[0]).toEqual('fontFamily3');
156
+ expect(eventDispatcher.dispatchFontLoading.calls[0].args[0]).toEqual(font1);
157
+ expect(eventDispatcher.dispatchFontLoading.calls[1].args[0]).toEqual(font2);
158
+ expect(eventDispatcher.dispatchFontLoading.calls[2].args[0]).toEqual(font3);
144
159
 
145
160
  expect(eventDispatcher.dispatchFontActive.callCount).toEqual(2);
146
- expect(eventDispatcher.dispatchFontActive.calls[0].args[0]).toEqual('fontFamily1');
147
- expect(eventDispatcher.dispatchFontActive.calls[1].args[0]).toEqual('fontFamily3');
161
+ expect(eventDispatcher.dispatchFontActive.calls[0].args[0]).toEqual(font1);
162
+ expect(eventDispatcher.dispatchFontActive.calls[1].args[0]).toEqual(font3);
148
163
 
149
164
  expect(eventDispatcher.dispatchFontInactive.callCount).toEqual(1);
150
- expect(eventDispatcher.dispatchFontInactive.calls[0].args[0]).toEqual('fontFamily2');
165
+ expect(eventDispatcher.dispatchFontInactive.calls[0].args[0]).toEqual(font2);
151
166
 
152
167
  expect(eventDispatcher.dispatchActive).toHaveBeenCalled();
153
168
  expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
@@ -156,30 +171,32 @@ describe('FontWatcher', function () {
156
171
 
157
172
  describe('watch multiple fonts with descriptions', function () {
158
173
  it('should call the correct callbacks', function () {
159
- activeFontFamilies = ['fontFamily1', 'fontFamily2'];
174
+ var font5 = new Font('font4', 'i7'),
175
+ font6 = new Font('font5'),
176
+ font7 = new Font('font6'),
177
+ font8 = new Font('font7', 'i4'),
178
+ font9 = new Font('font8', 'n7');
179
+
180
+ activeFonts = [font5, font6];
160
181
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
161
182
 
162
- fontWatcher.watch(['fontFamily1', 'fontFamily2', 'fontFamily3'], {
163
- 'fontFamily1': ['i7'],
164
- 'fontFamily2': null,
165
- 'fontFamily3': ['n4', 'i4', 'n7']
166
- }, {}, FakeFontWatchRunner, true);
183
+ fontWatcher.watch([font5, font6, font7, font8, font9], {}, FakeFontWatchRunner, true);
167
184
 
168
185
  expect(eventDispatcher.dispatchFontLoading.callCount).toEqual(5);
169
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily1', 'i7');
170
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily2', 'n4');
171
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily3', 'n4');
172
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily3', 'i4');
173
- expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith('fontFamily3', 'n7');
186
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font5);
187
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font6);
188
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font7);
189
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font8);
190
+ expect(eventDispatcher.dispatchFontLoading).toHaveBeenCalledWith(font9);
174
191
 
175
192
  expect(eventDispatcher.dispatchFontActive.callCount).toEqual(2);
176
- expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith('fontFamily1', 'i7');
177
- expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith('fontFamily2', 'n4');
193
+ expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith(font5);
194
+ expect(eventDispatcher.dispatchFontActive).toHaveBeenCalledWith(font6);
178
195
 
179
196
  expect(eventDispatcher.dispatchFontInactive.callCount).toEqual(3);
180
- expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith('fontFamily3', 'n4');
181
- expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith('fontFamily3', 'i4');
182
- expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith('fontFamily3', 'n7');
197
+ expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font7);
198
+ expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font8);
199
+ expect(eventDispatcher.dispatchFontInactive).toHaveBeenCalledWith(font9);
183
200
 
184
201
  expect(eventDispatcher.dispatchInactive).not.toHaveBeenCalled();
185
202
  expect(eventDispatcher.dispatchActive).toHaveBeenCalled();
@@ -188,15 +205,15 @@ describe('FontWatcher', function () {
188
205
 
189
206
  describe('watch multiple fonts with test strings', function () {
190
207
  it('should use the correct tests strings', function () {
191
- activeFontFamilies = ['fontFamily1', 'fontFamily2'];
208
+ activeFonts = [font1, font2];
192
209
 
193
210
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher);
194
211
 
195
- fontWatcher.watch(['fontFamily1', 'fontFamily2', 'fontFamily3', 'fontFamily4'], {}, {
196
- 'fontFamily1': 'testString1',
197
- 'fontFamily2': null,
198
- 'fontFamily3': 'testString2',
199
- 'fontFamily4': null
212
+ fontWatcher.watch([font1, font2, font3, font4], {
213
+ 'font1': 'testString1',
214
+ 'font2': null,
215
+ 'font3': 'testString2',
216
+ 'font4': null
200
217
  }, FakeFontWatchRunner, true);
201
218
 
202
219
  expect(testStrings.callCount).toEqual(2);
@@ -208,7 +225,7 @@ describe('FontWatcher', function () {
208
225
  it('should pass on the timeout to FontWatchRunner', function () {
209
226
  var fontWatcher = new FontWatcher(userAgent, domHelper, eventDispatcher, 4000);
210
227
 
211
- fontWatcher.watch(['fontFamily1'], {}, {}, FakeFontWatchRunner, true);
228
+ fontWatcher.watch([font1], {}, FakeFontWatchRunner, true);
212
229
 
213
230
  expect(timeout).toHaveBeenCalledWith(4000);
214
231
  });
@@ -1,5 +1,6 @@
1
1
  describe('FontWatchRunner', function () {
2
2
  var FontWatchRunner = webfont.FontWatchRunner,
3
+ Font = webfont.Font,
3
4
  BrowserInfo = webfont.BrowserInfo,
4
5
  UserAgentParser = webfont.UserAgentParser,
5
6
  DomHelper = webfont.DomHelper,
@@ -17,8 +18,7 @@ describe('FontWatchRunner', function () {
17
18
  });
18
19
 
19
20
  describe('Fake browser', function () {
20
- var fontFamily = 'My Family',
21
- fontDescription = 'n4',
21
+ var font = new Font('My Family', 'n4'),
22
22
  TARGET_SIZE = 3,
23
23
  FALLBACK_SIZE_A = 1,
24
24
  FALLBACK_SIZE_B = 2,
@@ -84,12 +84,12 @@ describe('FontWatchRunner', function () {
84
84
  ];
85
85
 
86
86
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
87
- domHelper, fontFamily, fontDescription, browserInfo);
87
+ domHelper, font, browserInfo);
88
88
 
89
89
  fontWatchRunner.start();
90
90
 
91
91
  jasmine.Clock.tick(1 * 25);
92
- expect(activeCallback).toHaveBeenCalledWith('My Family', 'n4');
92
+ expect(activeCallback).toHaveBeenCalledWith(font);
93
93
  });
94
94
 
95
95
  it('should wait for font load and call active', function () {
@@ -101,12 +101,12 @@ describe('FontWatchRunner', function () {
101
101
  ];
102
102
 
103
103
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
104
- domHelper, fontFamily, fontDescription, browserInfo);
104
+ domHelper, font, browserInfo);
105
105
 
106
106
  fontWatchRunner.start();
107
107
 
108
108
  jasmine.Clock.tick(3 * 25);
109
- expect(activeCallback).toHaveBeenCalledWith('My Family', 'n4');
109
+ expect(activeCallback).toHaveBeenCalledWith(font);
110
110
  });
111
111
 
112
112
  it('should wait for font inactive and call inactive', function () {
@@ -121,12 +121,12 @@ describe('FontWatchRunner', function () {
121
121
  ];
122
122
 
123
123
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
124
- domHelper, fontFamily, fontDescription, browserInfo);
124
+ domHelper, font, browserInfo);
125
125
 
126
126
  fontWatchRunner.start();
127
127
 
128
128
  jasmine.Clock.tick(4 * 25);
129
- expect(inactiveCallback).toHaveBeenCalledWith('My Family', 'n4');
129
+ expect(inactiveCallback).toHaveBeenCalledWith(font);
130
130
  });
131
131
 
132
132
  describe('WebKit fallback bug', function () {
@@ -137,12 +137,12 @@ describe('FontWatchRunner', function () {
137
137
  ];
138
138
 
139
139
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
140
- domHelper, fontFamily, fontDescription, fallbackBugBrowserInfo);
140
+ domHelper, font, fallbackBugBrowserInfo);
141
141
 
142
142
  fontWatchRunner.start();
143
143
 
144
144
  jasmine.Clock.tick(1 * 25);
145
- expect(activeCallback).toHaveBeenCalledWith('My Family', 'n4');
145
+ expect(activeCallback).toHaveBeenCalledWith(font);
146
146
  });
147
147
 
148
148
  it('should consider last resort font as having identical metrics and call active', function () {
@@ -154,12 +154,12 @@ describe('FontWatchRunner', function () {
154
154
  timesToGetTimeBeforeTimeout = 2;
155
155
 
156
156
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
157
- domHelper, fontFamily, fontDescription, fallbackBugBrowserInfo);
157
+ domHelper, font, fallbackBugBrowserInfo);
158
158
 
159
159
  fontWatchRunner.start();
160
160
 
161
161
  jasmine.Clock.tick(1 * 25);
162
- expect(activeCallback).toHaveBeenCalledWith('My Family', 'n4');
162
+ expect(activeCallback).toHaveBeenCalledWith(font);
163
163
  });
164
164
 
165
165
  it('should fail to load font and call inactive', function () {
@@ -172,12 +172,12 @@ describe('FontWatchRunner', function () {
172
172
  timesToGetTimeBeforeTimeout = 3;
173
173
 
174
174
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
175
- domHelper, fontFamily, fontDescription, fallbackBugBrowserInfo);
175
+ domHelper, font, fallbackBugBrowserInfo);
176
176
 
177
177
  fontWatchRunner.start();
178
178
 
179
179
  jasmine.Clock.tick(2 * 25);
180
- expect(inactiveCallback).toHaveBeenCalledWith('My Family', 'n4');
180
+ expect(inactiveCallback).toHaveBeenCalledWith(font);
181
181
  });
182
182
 
183
183
  it('should call inactive when we are loading a metric incompatible font', function () {
@@ -189,13 +189,13 @@ describe('FontWatchRunner', function () {
189
189
  timesToGetTimeBeforeTimeout = 2;
190
190
 
191
191
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
192
- domHelper, fontFamily, fontDescription, fallbackBugBrowserInfo,
192
+ domHelper, font, fallbackBugBrowserInfo,
193
193
  0, { 'My Other Family': true });
194
194
 
195
195
  fontWatchRunner.start();
196
196
 
197
197
  jasmine.Clock.tick(1 * 25);
198
- expect(inactiveCallback).toHaveBeenCalledWith('My Family', 'n4');
198
+ expect(inactiveCallback).toHaveBeenCalledWith(font);
199
199
  });
200
200
 
201
201
  it('should call active when we are loading a metric compatible font', function () {
@@ -207,13 +207,13 @@ describe('FontWatchRunner', function () {
207
207
  timesToGetTimeBeforeTimeout = 2;
208
208
 
209
209
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
210
- domHelper, fontFamily, fontDescription, fallbackBugBrowserInfo,
210
+ domHelper, font, fallbackBugBrowserInfo,
211
211
  0, { 'My Family': true });
212
212
 
213
213
  fontWatchRunner.start();
214
214
 
215
215
  jasmine.Clock.tick(1 * 25);
216
- expect(activeCallback).toHaveBeenCalledWith('My Family', 'n4');
216
+ expect(activeCallback).toHaveBeenCalledWith(font);
217
217
  });
218
218
  });
219
219
 
@@ -229,7 +229,7 @@ describe('FontWatchRunner', function () {
229
229
  TARGET_SIZE, TARGET_SIZE
230
230
  ];
231
231
  fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
232
- domHelper, fontFamily, fontDescription, browserInfo);
232
+ domHelper, font, browserInfo);
233
233
 
234
234
  fontWatchRunner.start();
235
235
 
@@ -243,7 +243,7 @@ describe('FontWatchRunner', function () {
243
243
  ];
244
244
 
245
245
  fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
246
- domHelper, fontFamily, fontDescription, browserInfo, 0, {}, 'TestString');
246
+ domHelper, font, browserInfo, 0, {}, 'TestString');
247
247
 
248
248
  fontWatchRunner.start();
249
249
 
@@ -254,17 +254,26 @@ describe('FontWatchRunner', function () {
254
254
  });
255
255
 
256
256
  describe('real browser testing', function () {
257
- var userAgent = null;
257
+ var userAgent = null,
258
+ nullFont = null,
259
+ sourceSansA = null,
260
+ sourceSansB = null,
261
+ elena = null;
258
262
 
259
263
  beforeEach(function () {
260
264
  var userAgentParser = new UserAgentParser(window.navigator.userAgent, window.document);
261
265
 
266
+ nullFont = new Font('__webfontloader_test__');
267
+ sourceSansA = new Font('SourceSansA');
268
+ sourceSansB = new Font('SourceSansB');
269
+ elena = new Font('Elena');
270
+
262
271
  userAgent = userAgentParser.parse();
263
272
  });
264
273
 
265
274
  it('should fail to load a null font', function () {
266
275
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
267
- domHelper, '__webfontloader_test__', '', userAgent.getBrowserInfo(), 500);
276
+ domHelper, nullFont, userAgent.getBrowserInfo(), 500);
268
277
 
269
278
  runs(function () {
270
279
  fontWatchRunner.start();
@@ -275,23 +284,25 @@ describe('FontWatchRunner', function () {
275
284
  });
276
285
 
277
286
  runs(function () {
278
- expect(inactiveCallback).toHaveBeenCalledWith('__webfontloader_test__', '');
287
+ expect(inactiveCallback).toHaveBeenCalledWith(nullFont);
279
288
  });
280
289
  });
281
290
 
282
291
  it('should load font succesfully', function () {
283
292
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
284
- domHelper, 'SourceSansA', '', userAgent.getBrowserInfo(), 500),
293
+ domHelper, sourceSansA, userAgent.getBrowserInfo(), 500),
285
294
  ruler = new FontRuler(domHelper, 'abcdef'),
295
+ monospace = new Font('monospace'),
296
+ sourceSansAFallback = new Font("'SourceSansA', monospace"),
286
297
  activeWidth = null,
287
298
  originalWidth = null,
288
299
  finalCheck = false;
289
300
 
290
301
  runs(function () {
291
302
  ruler.insert();
292
- ruler.setFont('monospace');
303
+ ruler.setFont(monospace);
293
304
  originalWidth = ruler.getWidth();
294
- ruler.setFont("'SourceSansA', monospace");
305
+ ruler.setFont(sourceSansAFallback);
295
306
  fontWatchRunner.start();
296
307
  });
297
308
 
@@ -300,7 +311,7 @@ describe('FontWatchRunner', function () {
300
311
  });
301
312
 
302
313
  runs(function () {
303
- expect(activeCallback).toHaveBeenCalledWith('SourceSansA', '');
314
+ expect(activeCallback).toHaveBeenCalledWith(sourceSansA);
304
315
  activeWidth = ruler.getWidth();
305
316
  expect(activeWidth).not.toEqual(originalWidth);
306
317
 
@@ -321,7 +332,7 @@ describe('FontWatchRunner', function () {
321
332
 
322
333
  it('should attempt to load a non-existing font', function () {
323
334
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
324
- domHelper, 'Elena', '', userAgent.getBrowserInfo(), 500);
335
+ domHelper, elena, userAgent.getBrowserInfo(), 500);
325
336
 
326
337
  runs(function () {
327
338
  fontWatchRunner.start();
@@ -332,23 +343,25 @@ describe('FontWatchRunner', function () {
332
343
  });
333
344
 
334
345
  runs(function () {
335
- expect(inactiveCallback).toHaveBeenCalledWith('Elena', '');
346
+ expect(inactiveCallback).toHaveBeenCalledWith(elena);
336
347
  });
337
348
  });
338
349
 
339
350
  it('should load even if @font-face is inserted after watching has started', function () {
340
351
  var fontWatchRunner = new FontWatchRunner(activeCallback, inactiveCallback,
341
- domHelper, 'SourceSansB', '', userAgent.getBrowserInfo(), 500),
352
+ domHelper, sourceSansB, userAgent.getBrowserInfo(), 500),
342
353
  ruler = new FontRuler(domHelper, 'abcdef'),
354
+ monospace = new Font('monospace'),
355
+ sourceSansBFallback = new Font("'SourceSansB', monospace"),
343
356
  activeWidth = null,
344
357
  originalWidth = null,
345
358
  finalCheck = false;
346
359
 
347
360
  runs(function () {
348
361
  ruler.insert();
349
- ruler.setFont('monospace');
362
+ ruler.setFont(monospace);
350
363
  originalWidth = ruler.getWidth();
351
- ruler.setFont("'SourceSansB', monospace");
364
+ ruler.setFont(sourceSansBFallback);
352
365
  fontWatchRunner.start();
353
366
  var link = document.createElement('link');
354
367
 
@@ -363,7 +376,7 @@ describe('FontWatchRunner', function () {
363
376
  });
364
377
 
365
378
  runs(function () {
366
- expect(activeCallback).toHaveBeenCalledWith('SourceSansB', '');
379
+ expect(activeCallback).toHaveBeenCalledWith(sourceSansB);
367
380
  activeWidth = ruler.getWidth();
368
381
  expect(activeWidth).not.toEqual(originalWidth);
369
382
 
@@ -381,5 +394,44 @@ describe('FontWatchRunner', function () {
381
394
  expect(ruler.getWidth()).toEqual(activeWidth);
382
395
  });
383
396
  });
397
+
398
+ it('should load one weight after another', function () {
399
+ var fontWatchRunnerRegular = new FontWatchRunner(activeCallback, inactiveCallback,
400
+ domHelper, 'SourceSansC', 'n4', userAgent.getBrowserInfo(), 500),
401
+ fontWatchRunnerBold = new FontWatchRunner(activeCallback, inactiveCallback,
402
+ domHelper, 'SourceSansC', 'n7', userAgent.getBrowserInfo(), 500),
403
+ fontRulerA = new FontRuler(domHelper, 'abcdef'),
404
+ fontRulerB = new FontRuler(domHelper, 'abcdef');
405
+
406
+ runs(function () {
407
+ fontRulerA.insert();
408
+ fontRulerA.setFont('SourceSansC', 'n4');
409
+ fontWatchRunnerRegular.start();
410
+ });
411
+
412
+ waitsFor(function () {
413
+ return activeCallback.wasCalled || inactiveCallback.wasCalled;
414
+ });
415
+
416
+ runs(function () {
417
+ expect(activeCallback).toHaveBeenCalledWith('SourceSansC', 'n4');
418
+
419
+ activeCallback.reset();
420
+ inactiveCallback.reset();
421
+
422
+ fontRulerB.insert();
423
+ fontRulerB.setFont('SourceSansC', 'n7');
424
+ fontWatchRunnerBold.start();
425
+ });
426
+
427
+ waitsFor(function () {
428
+ return activeCallback.wasCalled || inactiveCallback.wasCalled;
429
+ });
430
+
431
+ runs(function () {
432
+ expect(activeCallback).toHaveBeenCalledWith('SourceSansC', 'n7');
433
+ expect(fontRulerA.getSize()).not.toEqual(fontRulerB.getSize());
434
+ });
435
+ });
384
436
  });
385
437
  });