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.
- data/CHANGELOG +4 -0
- data/lib/webfontloader.rb +1 -1
- data/spec/ascender/ascenderscript_spec.js +24 -1
- data/spec/core/eventdispatcher_spec.js +15 -11
- data/spec/core/font_spec.js +83 -192
- data/spec/core/fontruler_spec.js +7 -4
- data/spec/core/fontwatcher_spec.js +78 -61
- data/spec/core/fontwatchrunner_spec.js +85 -33
- data/spec/core/webfont_spec.js +224 -0
- data/spec/custom/customcss_spec.js +5 -2
- data/spec/deps.js +13 -13
- data/spec/fontdeck/fontdeckscript_spec.js +4 -6
- data/spec/fonts/sourcesansc.css +1 -0
- data/spec/fonts/sourcesanscbold.css +1 -0
- data/spec/fonts/sourcesanscbold.otf +0 -0
- data/spec/google/fontapiparser_spec.js +58 -178
- data/spec/google/googlefontapi_spec.js +14 -42
- data/spec/google/lastresortwebkitfontwatchrunner_spec.js +12 -10
- data/spec/index.html +5 -3
- data/spec/monotype/monotypescript_spec.js +3 -2
- data/spec/typekit/typekitscript_spec.js +9 -4
- data/src/ascender/ascender_script.js +43 -26
- data/src/core/eventdispatcher.js +23 -23
- data/src/core/font.js +80 -99
- data/src/core/fontmoduleloader.js +1 -1
- data/src/core/fontruler.js +10 -20
- data/src/core/fontwatcher.js +24 -46
- data/src/core/fontwatchrunner.js +13 -13
- data/src/core/initialize.js +0 -10
- data/src/core/webfont.js +134 -0
- data/src/custom/customcss.js +14 -10
- data/src/fontdeck/fontdeck_script.js +7 -9
- data/src/google/fontapiparser.js +11 -15
- data/src/google/googlefontapi.js +1 -2
- data/src/google/lastresortwebkitfontwatchrunner.js +15 -13
- data/src/modules.yml +2 -3
- data/src/monotype/monotype_script.js +9 -8
- data/src/typekit/typekit_script.js +17 -7
- data/webfontloader.gemspec +7 -6
- metadata +9 -8
- data/spec/core/cssfontfamilyname_spec.js +0 -38
- data/spec/core/fontvariationdescription_spec.js +0 -67
- data/src/core/cssfontfamilyname.js +0 -33
- data/src/core/fontvariationdescription.js +0 -140
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
v1.4.1 (April 8, 2013)
|
2
|
+
* Internal rewrite of font and variations
|
3
|
+
* Fix for the configurable timeout on the Google module
|
4
|
+
|
1
5
|
v1.4.0 (March 28, 2013)
|
2
6
|
* Stop exporting the `addModule` API to dynamically add modules (it didn't work anyway.)
|
3
7
|
* Stop checking the height when monitoring for font load. This turned out to be inconsistent across platforms.
|
data/lib/webfontloader.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
describe('AscenderScript', function () {
|
2
|
-
var AscenderScript = webfont.AscenderScript
|
2
|
+
var AscenderScript = webfont.AscenderScript,
|
3
|
+
Font = webfont.Font;
|
3
4
|
|
4
5
|
var configuration = {
|
5
6
|
key: 'ec2de397-11ae-4c10-937f-bf94283a70c1',
|
@@ -29,6 +30,14 @@ describe('AscenderScript', function () {
|
|
29
30
|
expect(fakeDomHelper.insertInto.calls[0].args[0]).toEqual('head');
|
30
31
|
});
|
31
32
|
|
33
|
+
it('should pass the fonts correctly', function () {
|
34
|
+
expect(fakeOnReady).toHaveBeenCalledWith([
|
35
|
+
new Font('AndyBold', 'n4'),
|
36
|
+
new Font('Arial', 'n7'),
|
37
|
+
new Font('Arial', 'n4')
|
38
|
+
]);
|
39
|
+
});
|
40
|
+
|
32
41
|
it('should parse variations correctly', function () {
|
33
42
|
expect(ascenderScript.parseVariations('regular')).toEqual(['n4']);
|
34
43
|
expect(ascenderScript.parseVariations('bold')).toEqual(['n7']);
|
@@ -39,5 +48,19 @@ describe('AscenderScript', function () {
|
|
39
48
|
expect(ascenderScript.parseVariations('regular,,bold')).toEqual(['n4', 'n7']);
|
40
49
|
expect(ascenderScript.parseVariations('n4,n7')).toEqual(['n4', 'n7']);
|
41
50
|
});
|
51
|
+
|
52
|
+
it('should parse font families correctly', function () {
|
53
|
+
expect(ascenderScript.parseFamilyAndVariations('Arial')).toEqual([new Font('Arial')]);
|
54
|
+
expect(ascenderScript.parseFamilyAndVariations('Arial:bold,regular')).toEqual([new Font('Arial', 'n7'), new Font('Arial', 'n4')]);
|
55
|
+
expect(ascenderScript.parseFamilyAndVariations('Arial:n4,n7')).toEqual([new Font('Arial', 'n4'), new Font('Arial', 'n7')]);
|
56
|
+
});
|
57
|
+
|
58
|
+
it('should parse multiple font families correctly', function () {
|
59
|
+
expect(ascenderScript.parseFamiliesAndVariations(['Arial', 'Sans:n4,n7'])).toEqual([
|
60
|
+
new Font('Arial', 'n4'),
|
61
|
+
new Font('Sans', 'n4'),
|
62
|
+
new Font('Sans', 'n7')
|
63
|
+
]);
|
64
|
+
});
|
42
65
|
})
|
43
66
|
});
|
@@ -1,10 +1,12 @@
|
|
1
1
|
describe('EventDispatcher', function () {
|
2
2
|
var EventDispatcher = webfont.EventDispatcher,
|
3
3
|
DomHelper = webfont.DomHelper,
|
4
|
+
Font = webfont.Font,
|
4
5
|
domHelper = new DomHelper(window),
|
5
6
|
element = null
|
6
7
|
eventDispatcher = null,
|
7
8
|
namespace = 'ns',
|
9
|
+
font = null,
|
8
10
|
nullFn = function () {},
|
9
11
|
callbacks = {
|
10
12
|
loading: nullFn,
|
@@ -19,6 +21,8 @@ describe('EventDispatcher', function () {
|
|
19
21
|
element = domHelper.createElement();
|
20
22
|
eventDispatcher = new EventDispatcher(domHelper, element, callbacks, namespace);
|
21
23
|
|
24
|
+
font = new Font('My Family', 'n4');
|
25
|
+
|
22
26
|
spyOn(callbacks, 'loading');
|
23
27
|
spyOn(callbacks, 'active');
|
24
28
|
spyOn(callbacks, 'inactive');
|
@@ -43,7 +47,7 @@ describe('EventDispatcher', function () {
|
|
43
47
|
|
44
48
|
describe('#dispatchFontLoading', function () {
|
45
49
|
beforeEach(function () {
|
46
|
-
eventDispatcher.dispatchFontLoading(
|
50
|
+
eventDispatcher.dispatchFontLoading(font);
|
47
51
|
});
|
48
52
|
|
49
53
|
it('should call the correct callback', function () {
|
@@ -57,7 +61,7 @@ describe('EventDispatcher', function () {
|
|
57
61
|
|
58
62
|
describe('#dispatchFontInactive', function () {
|
59
63
|
beforeEach(function () {
|
60
|
-
eventDispatcher.dispatchFontInactive(
|
64
|
+
eventDispatcher.dispatchFontInactive(font);
|
61
65
|
});
|
62
66
|
|
63
67
|
it('should call the correct callback', function () {
|
@@ -71,8 +75,8 @@ describe('EventDispatcher', function () {
|
|
71
75
|
|
72
76
|
describe('#dispatchFontInactive - with loading class', function () {
|
73
77
|
beforeEach(function () {
|
74
|
-
eventDispatcher.dispatchFontLoading(
|
75
|
-
eventDispatcher.dispatchFontInactive(
|
78
|
+
eventDispatcher.dispatchFontLoading(font);
|
79
|
+
eventDispatcher.dispatchFontInactive(font);
|
76
80
|
});
|
77
81
|
|
78
82
|
it('should set the correct class name', function () {
|
@@ -82,8 +86,8 @@ describe('EventDispatcher', function () {
|
|
82
86
|
|
83
87
|
describe('#dispatchFontInactive - with active class', function () {
|
84
88
|
beforeEach(function () {
|
85
|
-
eventDispatcher.dispatchFontActive(
|
86
|
-
eventDispatcher.dispatchFontInactive(
|
89
|
+
eventDispatcher.dispatchFontActive(font);
|
90
|
+
eventDispatcher.dispatchFontInactive(font);
|
87
91
|
});
|
88
92
|
|
89
93
|
it('should not append the inactive class name', function () {
|
@@ -97,7 +101,7 @@ describe('EventDispatcher', function () {
|
|
97
101
|
|
98
102
|
describe('#dispatchFontActive', function () {
|
99
103
|
beforeEach(function () {
|
100
|
-
eventDispatcher.dispatchFontActive(
|
104
|
+
eventDispatcher.dispatchFontActive(font);
|
101
105
|
});
|
102
106
|
|
103
107
|
it('should call the correct callback', function () {
|
@@ -111,8 +115,8 @@ describe('EventDispatcher', function () {
|
|
111
115
|
|
112
116
|
describe('#dispatchFontActive - with loading class', function () {
|
113
117
|
beforeEach(function () {
|
114
|
-
eventDispatcher.dispatchFontLoading(
|
115
|
-
eventDispatcher.dispatchFontActive(
|
118
|
+
eventDispatcher.dispatchFontLoading(font);
|
119
|
+
eventDispatcher.dispatchFontActive(font);
|
116
120
|
});
|
117
121
|
|
118
122
|
it('should set the correct class name', function () {
|
@@ -122,8 +126,8 @@ describe('EventDispatcher', function () {
|
|
122
126
|
|
123
127
|
describe('#dispatchFontActive - with inactive class', function () {
|
124
128
|
beforeEach(function () {
|
125
|
-
eventDispatcher.dispatchFontInactive(
|
126
|
-
eventDispatcher.dispatchFontActive(
|
129
|
+
eventDispatcher.dispatchFontInactive(font);
|
130
|
+
eventDispatcher.dispatchFontActive(font);
|
127
131
|
});
|
128
132
|
|
129
133
|
it('should set the correct class', function () {
|
data/spec/core/font_spec.js
CHANGED
@@ -1,223 +1,114 @@
|
|
1
|
-
describe('
|
2
|
-
var
|
3
|
-
UserAgent = webfont.UserAgent,
|
4
|
-
BrowserInfo = webfont.BrowserInfo,
|
5
|
-
FontModuleLoader = webfont.FontModuleLoader,
|
6
|
-
fontModuleLoader = null,
|
7
|
-
userAgent = null;
|
8
|
-
|
9
|
-
beforeEach(function () {
|
10
|
-
userAgent = new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false, false));
|
11
|
-
fontModuleLoader = new FontModuleLoader();
|
12
|
-
});
|
1
|
+
describe('Font', function () {
|
2
|
+
var Font = webfont.Font;
|
13
3
|
|
14
|
-
describe('
|
15
|
-
var
|
16
|
-
|
4
|
+
describe('#quote', function () {
|
5
|
+
var quote = function (font) {
|
6
|
+
return new Font(font).getCssName();
|
7
|
+
};
|
17
8
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
testModule = new function () {
|
22
|
-
this.conf = conf;
|
23
|
-
this.domHelper = domHelper;
|
24
|
-
this.loadCalled = true;
|
25
|
-
this.supportUserAgentCalled = false;
|
26
|
-
};
|
9
|
+
it('should quote names with spaces', function () {
|
10
|
+
expect(quote('My Family')).toEqual("'My Family'");
|
11
|
+
});
|
27
12
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
};
|
13
|
+
it('should quote names with spaces and double quotes', function () {
|
14
|
+
expect(quote('"My Family"')).toEqual("'My Family'");
|
15
|
+
});
|
32
16
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
};
|
17
|
+
it('should quote names with spaces and single quotes', function () {
|
18
|
+
expect(quote("'My Family'")).toEqual("'My Family'");
|
19
|
+
});
|
37
20
|
|
38
|
-
|
39
|
-
|
21
|
+
it('should quote multiple single quoted names separated with a comma', function () {
|
22
|
+
expect(quote("'family 1','family 2'")).toEqual("'family 1','family 2'");
|
40
23
|
});
|
41
24
|
|
42
|
-
it('should
|
43
|
-
expect(
|
44
|
-
expect(font.moduleLoading_).toEqual(0);
|
25
|
+
it('should quote multiple single quoted names separated with a comma and space', function () {
|
26
|
+
expect(quote("'family 1', 'family 2'")).toEqual("'family 1','family 2'");
|
45
27
|
});
|
46
28
|
|
47
|
-
it('should
|
48
|
-
|
29
|
+
it('should not quote when there is no space', function () {
|
30
|
+
expect(quote('MyFamily')).toEqual('MyFamily');
|
31
|
+
});
|
49
32
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
},
|
54
|
-
loading: loading
|
55
|
-
});
|
33
|
+
it('should remove quotes when they are unnecesssary', function () {
|
34
|
+
expect(quote('"MyFamily"')).toEqual('MyFamily');
|
35
|
+
});
|
56
36
|
|
57
|
-
|
58
|
-
expect(
|
59
|
-
|
37
|
+
it('should not quote multiple names when there is no space', function () {
|
38
|
+
expect(quote("'family-1', 'family-2'")).toEqual('family-1,family-2');
|
39
|
+
});
|
40
|
+
});
|
60
41
|
|
61
|
-
|
62
|
-
|
42
|
+
describe('#getCssVariation', function () {
|
43
|
+
function toCss(fvd) {
|
44
|
+
return new Font('My Family', fvd).getCssVariation();
|
45
|
+
}
|
63
46
|
|
64
|
-
|
65
|
-
expect(
|
47
|
+
it('should expand font-style', function () {
|
48
|
+
expect(toCss('n4')).toEqual('font-style:normal;font-weight:400;');
|
49
|
+
expect(toCss('i4')).toEqual('font-style:italic;font-weight:400;');
|
50
|
+
expect(toCss('o4')).toEqual('font-style:oblique;font-weight:400;');
|
51
|
+
});
|
66
52
|
|
67
|
-
|
68
|
-
|
53
|
+
it('should expand weights correctly', function () {
|
54
|
+
for (var i = 1; i < 10; i += 1) {
|
55
|
+
expect(toCss('n' + i)).toEqual('font-style:normal;font-weight:' + (i * 100) + ';');
|
56
|
+
}
|
57
|
+
});
|
69
58
|
|
70
|
-
|
71
|
-
expect(
|
72
|
-
expect(
|
73
|
-
expect(
|
59
|
+
it('should not expand incorrect input', function () {
|
60
|
+
expect(toCss('')).toEqual('font-style:normal;font-weight:400;');
|
61
|
+
expect(toCss('n')).toEqual('font-style:normal;font-weight:400;');
|
62
|
+
expect(toCss('1')).toEqual('font-style:normal;font-weight:400;');
|
63
|
+
expect(toCss('n1x')).toEqual('font-style:normal;font-weight:400;');
|
74
64
|
});
|
75
65
|
});
|
76
66
|
|
77
|
-
describe('
|
78
|
-
|
79
|
-
|
80
|
-
|
67
|
+
describe('parseCssVariation', function () {
|
68
|
+
function toFvd(css) {
|
69
|
+
return Font.parseCssVariation(css);
|
70
|
+
}
|
81
71
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
};
|
88
|
-
testModule.load = function () {};
|
89
|
-
testModule.supportUserAgent = function (ua, support) {
|
90
|
-
support(true);
|
91
|
-
};
|
72
|
+
it('should default to n4 when there is no description', function () {
|
73
|
+
expect(toFvd('')).toEqual('n4');
|
74
|
+
expect(toFvd(null)).toEqual('n4');
|
75
|
+
expect(toFvd(undefined)).toEqual('n4');
|
76
|
+
});
|
92
77
|
|
93
|
-
|
94
|
-
|
78
|
+
it('should compact font style', function () {
|
79
|
+
expect(toFvd('font-style: normal;')).toEqual('n4');
|
80
|
+
expect(toFvd('font-style: italic;')).toEqual('i4');
|
81
|
+
expect(toFvd('font-style: oblique;')).toEqual('o4');
|
95
82
|
});
|
96
83
|
|
97
|
-
it('should
|
98
|
-
font.
|
99
|
-
|
100
|
-
somedata: 'in french a cow says meuh'
|
101
|
-
},
|
102
|
-
context: window
|
103
|
-
});
|
84
|
+
it('should return the default value when font-style is incorrect', function () {
|
85
|
+
expect(toFvd('font-style: other;')).toEqual('n4');
|
86
|
+
});
|
104
87
|
|
105
|
-
|
106
|
-
expect(
|
88
|
+
it('should compact font weight', function () {
|
89
|
+
expect(toFvd('font-weight: normal;')).toEqual('n4');
|
90
|
+
expect(toFvd('font-weight: bold;')).toEqual('n7');
|
91
|
+
for (var i = 1; i < 10; i += 1) {
|
92
|
+
expect(toFvd('font-weight: ' + (i * 100) + ';')).toEqual('n' + i);
|
93
|
+
}
|
94
|
+
});
|
107
95
|
|
108
|
-
|
109
|
-
expect(
|
96
|
+
it('should return the default value when font-weight is incorrect', function () {
|
97
|
+
expect(toFvd('font-weight: 140;')).toEqual('n4');
|
98
|
+
expect(toFvd('font-weight: other;')).toEqual('n4');
|
110
99
|
});
|
111
|
-
});
|
112
100
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
beforeEach(function () {
|
120
|
-
jasmine.Clock.useMock();
|
121
|
-
font = new WebFont(window, fontModuleLoader, new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(true, false)));
|
122
|
-
font.addModule('test', function (conf, domHelper) {
|
123
|
-
testModule = new function () {
|
124
|
-
this.conf = conf;
|
125
|
-
this.families = [];
|
126
|
-
this.descriptions = {};
|
127
|
-
};
|
128
|
-
|
129
|
-
testModule.getFontWatchRunnerCtor = function () {
|
130
|
-
function FakeFontWatchRunner(activeCallback, inactiveCallback) {
|
131
|
-
this.inactive = inactiveCallback;
|
132
|
-
this.active = activeCallback;
|
133
|
-
};
|
134
|
-
|
135
|
-
FakeFontWatchRunner.prototype.start = function () {
|
136
|
-
if (conf.id) {
|
137
|
-
this.active('Font1', 'n4');
|
138
|
-
} else {
|
139
|
-
this.inactive('Font1', 'n4');
|
140
|
-
}
|
141
|
-
};
|
142
|
-
|
143
|
-
return FakeFontWatchRunner;
|
144
|
-
};
|
145
|
-
|
146
|
-
testModule.supportUserAgent = function (userAgent, support) {
|
147
|
-
if (conf.id) {
|
148
|
-
// The monotype module only initializes font
|
149
|
-
// and description if there is a kit id.
|
150
|
-
this.families = ['Font1'];
|
151
|
-
this.description = { 'Font1': ['n4'] };
|
152
|
-
}
|
153
|
-
support(true);
|
154
|
-
};
|
155
|
-
testModule.load = function (onReady) {
|
156
|
-
onReady(this.families, this.description);
|
157
|
-
};
|
158
|
-
|
159
|
-
return testModule;
|
160
|
-
});
|
161
|
-
});
|
162
|
-
|
163
|
-
it('should load with a project id', function () {
|
164
|
-
font.load({
|
165
|
-
test: {
|
166
|
-
id: 'hello world'
|
167
|
-
},
|
168
|
-
inactive: inactive,
|
169
|
-
active: active
|
170
|
-
});
|
171
|
-
|
172
|
-
jasmine.Clock.tick(1);
|
173
|
-
|
174
|
-
expect(testModule).not.toBeNull();
|
175
|
-
expect(active).toHaveBeenCalled();
|
176
|
-
});
|
177
|
-
|
178
|
-
it('should not load without a project id', function () {
|
179
|
-
font.load({
|
180
|
-
test: {
|
181
|
-
},
|
182
|
-
inactive: inactive,
|
183
|
-
active: active
|
184
|
-
});
|
185
|
-
|
186
|
-
jasmine.Clock.tick(1);
|
187
|
-
|
188
|
-
expect(testModule).not.toBeNull();
|
189
|
-
expect(inactive).toHaveBeenCalled();
|
101
|
+
it('should compact multiple properties', function () {
|
102
|
+
expect(toFvd('font-weight: bold; font-style: italic;')).toEqual('i7');
|
103
|
+
expect(toFvd('; font-weight: bold; font-style: italic;')).toEqual('i7');
|
104
|
+
expect(toFvd('font-style:italic;font-weight:bold;')).toEqual('i7');
|
105
|
+
expect(toFvd(' font-style: italic ;\n\nfont-weight: bold; ')).toEqual('i7');
|
190
106
|
});
|
191
|
-
});
|
192
107
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
beforeEach(function () {
|
198
|
-
font = new WebFont(window, fontModuleLoader, new UserAgent('Firefox', '3.6', 'Gecko', '1.9.2', 'Macintosh', '10.6', undefined, new BrowserInfo(false, false, false)));
|
199
|
-
font.addModule('test', function (conf, domHelper) {
|
200
|
-
testModule = new function () {
|
201
|
-
this.conf = conf;
|
202
|
-
this.loadCalled = false;
|
203
|
-
};
|
204
|
-
testModule.load = function () {};
|
205
|
-
return testModule;
|
206
|
-
});
|
207
|
-
});
|
208
|
-
|
209
|
-
it('should load with the correct context', function () {
|
210
|
-
var inactive = jasmine.createSpy('inactive');
|
211
|
-
|
212
|
-
font.load({
|
213
|
-
test: {
|
214
|
-
somedata: 'in french a cow says meuh'
|
215
|
-
},
|
216
|
-
inactive: inactive
|
217
|
-
});
|
218
|
-
|
219
|
-
expect(testModule).toBeNull()
|
220
|
-
expect(inactive).toHaveBeenCalled();
|
108
|
+
it('should return default values for incorrect individual properties', function () {
|
109
|
+
expect(toFvd('src: url(/font.otf)')).toEqual('n4');
|
110
|
+
expect(toFvd('font-weight: 900; src: url(/font.otf);')).toEqual('n9');
|
111
|
+
expect(toFvd('font-weight: 800; font-stretch:condensed;')).toEqual('n8');
|
221
112
|
});
|
222
113
|
});
|
223
114
|
});
|