webfontloader 1.0.5

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 (71) hide show
  1. data/Gemfile +9 -0
  2. data/LICENSE +201 -0
  3. data/README.md +148 -0
  4. data/Rakefile +243 -0
  5. data/bin/webfontloader-demos +28 -0
  6. data/docs/EVENTS.md +115 -0
  7. data/docs/MODULES.md +49 -0
  8. data/docs/TRANSITIONS.md +107 -0
  9. data/lib/webfontloader.rb +10 -0
  10. data/lib/webfontloader/demo/public/ascender.html +99 -0
  11. data/lib/webfontloader/demo/public/basic.css +9 -0
  12. data/lib/webfontloader/demo/public/custom.html +88 -0
  13. data/lib/webfontloader/demo/public/event-css-active-multiple.html +44 -0
  14. data/lib/webfontloader/demo/public/event-css-active.html +38 -0
  15. data/lib/webfontloader/demo/public/event-css-inactive.html +38 -0
  16. data/lib/webfontloader/demo/public/event-css-loading.html +55 -0
  17. data/lib/webfontloader/demo/public/event-js-active.html +39 -0
  18. data/lib/webfontloader/demo/public/event-js-font-active.html +40 -0
  19. data/lib/webfontloader/demo/public/event-js-loading.html +60 -0
  20. data/lib/webfontloader/demo/public/events-variations.html +130 -0
  21. data/lib/webfontloader/demo/public/events.html +103 -0
  22. data/lib/webfontloader/demo/public/google-css.html +27 -0
  23. data/lib/webfontloader/demo/public/google.html +33 -0
  24. data/lib/webfontloader/demo/public/ie-fast-js.html +47 -0
  25. data/lib/webfontloader/demo/public/ie-slow-js.html +48 -0
  26. data/lib/webfontloader/demo/public/ie-slow-link.html +38 -0
  27. data/lib/webfontloader/demo/public/index.html +70 -0
  28. data/lib/webfontloader/demo/public/typekit-variations.html +50 -0
  29. data/lib/webfontloader/demo/public/typekit.html +41 -0
  30. data/lib/webfontloader/demo/server.rb +92 -0
  31. data/lib/webfontloader/modules.rb +44 -0
  32. data/src-test/ascender/ascender_script_test.js +48 -0
  33. data/src-test/core/cssclassnametest.js +42 -0
  34. data/src-test/core/cssfontfamilynametest.js +54 -0
  35. data/src-test/core/domhelpertest.js +81 -0
  36. data/src-test/core/eventdispatchertest.js +99 -0
  37. data/src-test/core/fontmoduleloadertest.js +30 -0
  38. data/src-test/core/fonttest.js +92 -0
  39. data/src-test/core/fontvariationdescriptiontest.js +76 -0
  40. data/src-test/core/fontwatchertest.js +510 -0
  41. data/src-test/core/useragenttest.js +395 -0
  42. data/src-test/custom/customcsstest.js +30 -0
  43. data/src-test/google/fontapiparsertest.js +92 -0
  44. data/src-test/google/fontapiurlbuildertest.js +28 -0
  45. data/src-test/google/googlefontapitest.js +173 -0
  46. data/src-test/typekit/typekit_script_test.js +171 -0
  47. data/src/ascender/ascender_script.js +84 -0
  48. data/src/async_load.js +3 -0
  49. data/src/closure.js +3 -0
  50. data/src/core/cssclassname.js +21 -0
  51. data/src/core/cssfontfamilyname.js +20 -0
  52. data/src/core/domhelper.js +103 -0
  53. data/src/core/eventdispatcher.js +78 -0
  54. data/src/core/font.js +84 -0
  55. data/src/core/fontmoduleloader.js +25 -0
  56. data/src/core/fontvariationdescription.js +112 -0
  57. data/src/core/fontwatcher.js +121 -0
  58. data/src/core/initialize.js +26 -0
  59. data/src/core/namespace.js +11 -0
  60. data/src/core/useragent.js +41 -0
  61. data/src/core/useragentparser.js +234 -0
  62. data/src/custom/customcss.js +37 -0
  63. data/src/google/fontapiparser.js +94 -0
  64. data/src/google/fontapiurlbuilder.js +39 -0
  65. data/src/google/googlefontapi.js +49 -0
  66. data/src/modules.yml +27 -0
  67. data/src/typekit/typekit_script.js +58 -0
  68. data/tools/compiler/compiler.jar +0 -0
  69. data/tools/jstestdriver/JsTestDriver-1.2.1.jar +0 -0
  70. data/webfontloader.gemspec +144 -0
  71. metadata +191 -0
@@ -0,0 +1,28 @@
1
+ var FontApiUrlBuilderTest = TestCase('FontApiUrlBuilderTest');
2
+
3
+ FontApiUrlBuilderTest.prototype.testThrowsExceptionIfNoFontFamilies =
4
+ function() {
5
+ var fontApiUrlBuilder = new webfont.FontApiUrlBuilder("http://moo");
6
+
7
+ try {
8
+ fontApiUrlBuilder.build();
9
+ fail('build should have thrown an exception.');
10
+ } catch (e) {
11
+ // success
12
+ }
13
+ };
14
+
15
+ FontApiUrlBuilderTest.prototype.testBuildProperUrl = function() {
16
+ var fontApiUrlBuilder = new webfont.FontApiUrlBuilder("http://moo");
17
+
18
+ fontApiUrlBuilder.setFontFamilies([ 'Font1', 'Font2' ]);
19
+ assertEquals('http://moo?family=Font1%7CFont2', fontApiUrlBuilder.build());
20
+ };
21
+
22
+ FontApiUrlBuilderTest.prototype.testBuildProperDefaultUrl = function() {
23
+ var fontApiUrlBuilder = new webfont.FontApiUrlBuilder();
24
+
25
+ fontApiUrlBuilder.setFontFamilies([ 'Font1', 'Font2' ]);
26
+ assertEquals("http:" + webfont.FontApiUrlBuilder.DEFAULT_API_URL +
27
+ '?family=Font1%7CFont2', fontApiUrlBuilder.build());
28
+ };
@@ -0,0 +1,173 @@
1
+ var GoogleFontApiTest = TestCase('GoogleFontApiTest');
2
+
3
+ GoogleFontApiTest.prototype.testCallOnReadyWithFontFamilyLoading = function() {
4
+ var insert = '';
5
+ var link = '';
6
+ var fakeDomHelper = {
7
+ insertInto: function(tag, e) {
8
+ insert = tag;
9
+ },
10
+ createCssLink: function(csslink) {
11
+ link = csslink;
12
+ }
13
+ };
14
+ var userAgent = new webfont.UserAgent("Test", "1.0", true);
15
+ var googleFontApi = new webfont.GoogleFontApi(userAgent, fakeDomHelper,
16
+ { families: [ 'Font1', 'Font2' ] });
17
+
18
+ var families = null;
19
+ var descriptions = null;
20
+
21
+ googleFontApi.load(function(fontFamilies, fontDescriptions) {
22
+ families = fontFamilies;
23
+ descriptions = fontDescriptions;
24
+ });
25
+
26
+ assertEquals('head', insert);
27
+ assertEquals('http://fonts.googleapis.com/css?family=' +
28
+ 'Font1%7CFont2', link);
29
+
30
+ assertNotNull(families);
31
+ assertEquals(2, families.length);
32
+ assertEquals('Font1', families[0]);
33
+ assertEquals('Font2', families[1]);
34
+
35
+ var font1Descriptions = descriptions['Font1'];
36
+ assertNotNull(font1Descriptions);
37
+ assertEquals(1, font1Descriptions.length);
38
+ assertEquals('n4', font1Descriptions[0]);
39
+
40
+ var font2Descriptions = descriptions['Font2'];
41
+ assertNotNull(font2Descriptions);
42
+ assertEquals(1, font2Descriptions.length);
43
+ assertEquals('n4', font2Descriptions[0]);
44
+ };
45
+
46
+ GoogleFontApiTest.prototype.testCallOnReadyWithFontFamilyLoadingApiUrlChanged =
47
+ function() {
48
+ var insert = '';
49
+ var link = '';
50
+ var fakeDomHelper = {
51
+ insertInto: function(tag, e) {
52
+ insert = tag;
53
+ },
54
+ createCssLink: function(csslink) {
55
+ link = csslink;
56
+ }
57
+ };
58
+ var userAgent = new webfont.UserAgent("Test", "1.0", true);
59
+ var googleFontApi = new webfont.GoogleFontApi(userAgent, fakeDomHelper,
60
+ { api: 'http://moo', families: [ 'Font1', 'Font2' ] });
61
+
62
+ var families = null;
63
+ var descriptions = null;
64
+
65
+ googleFontApi.load(function(fontFamilies, fontDescriptions) {
66
+ families = fontFamilies;
67
+ descriptions = fontDescriptions;
68
+ });
69
+
70
+ assertEquals('head', insert);
71
+ assertEquals('http://moo?family=Font1%7CFont2', link);
72
+
73
+ assertNotNull(families);
74
+ assertEquals(2, families.length);
75
+ assertEquals('Font1', families[0]);
76
+ assertEquals('Font2', families[1]);
77
+
78
+ var font1Descriptions = descriptions['Font1'];
79
+ assertNotNull(font1Descriptions);
80
+ assertEquals(1, font1Descriptions.length);
81
+ assertEquals('n4', font1Descriptions[0]);
82
+
83
+ var font2Descriptions = descriptions['Font2'];
84
+ assertNotNull(font2Descriptions);
85
+ assertEquals(1, font2Descriptions.length);
86
+ assertEquals('n4', font2Descriptions[0]);
87
+ };
88
+
89
+ GoogleFontApiTest.prototype.testSpacesReplacedByPlus = function() {
90
+ var insert = '';
91
+ var link = '';
92
+ var fakeDomHelper = {
93
+ insertInto: function(tag, e) {
94
+ insert = tag;
95
+ },
96
+ createCssLink: function(csslink) {
97
+ link = csslink;
98
+ }
99
+ };
100
+ var userAgent = new webfont.UserAgent("Test", "1.0", true);
101
+ var googleFontApi = new webfont.GoogleFontApi(userAgent, fakeDomHelper,
102
+ { families: [ 'Font1 WithSpace', 'Font2 WithSpaceToo' ] });
103
+
104
+ var families = null;
105
+ var descriptions = null;
106
+
107
+ googleFontApi.load(function(fontFamilies, fontDescriptions) {
108
+ families = fontFamilies;
109
+ descriptions = fontDescriptions;
110
+ });
111
+
112
+ assertEquals('head', insert);
113
+ assertEquals('http://fonts.googleapis.com/css?family=Font1+WithSpace%7CFont2+WithSpaceToo', link);
114
+
115
+ assertNotNull(families);
116
+ assertEquals(2, families.length);
117
+ assertEquals('Font1 WithSpace', families[0]);
118
+ assertEquals('Font2 WithSpaceToo', families[1]);
119
+
120
+ var font1Descriptions = descriptions['Font1 WithSpace'];
121
+ assertNotNull(font1Descriptions);
122
+ assertEquals(1, font1Descriptions.length);
123
+ assertEquals('n4', font1Descriptions[0]);
124
+
125
+ var font2Descriptions = descriptions['Font2 WithSpaceToo'];
126
+ assertNotNull(font2Descriptions);
127
+ assertEquals(1, font2Descriptions.length);
128
+ assertEquals('n4', font2Descriptions[0]);
129
+ };
130
+
131
+ GoogleFontApiTest.prototype.testLoadWithVariations = function() {
132
+ var insert = '';
133
+ var link = '';
134
+ var fakeDomHelper = {
135
+ insertInto: function(tag, e) {
136
+ insert = tag;
137
+ },
138
+ createCssLink: function(csslink) {
139
+ link = csslink;
140
+ }
141
+ };
142
+ var userAgent = new webfont.UserAgent("Test", "1.0", true);
143
+ var googleFontApi = new webfont.GoogleFontApi(userAgent, fakeDomHelper,
144
+ { families: [ 'Font1 WithSpace:bi', 'Font2 WithSpaceToo:b,r' ] });
145
+
146
+ var families = null;
147
+ var descriptions = null;
148
+
149
+ googleFontApi.load(function(fontFamilies, fontDescriptions) {
150
+ families = fontFamilies;
151
+ descriptions = fontDescriptions;
152
+ });
153
+
154
+ assertEquals('head', insert);
155
+ assertEquals('http://fonts.googleapis.com/css?family=Font1+WithSpace:bi%7CFont2+WithSpaceToo:b,r', link);
156
+
157
+ assertNotNull(families);
158
+ assertEquals(2, families.length);
159
+ assertEquals('Font1 WithSpace', families[0]);
160
+ assertEquals('Font2 WithSpaceToo', families[1]);
161
+ assertNotNull(descriptions);
162
+
163
+ var font1Descriptions = descriptions['Font1 WithSpace'];
164
+ assertNotNull(font1Descriptions);
165
+ assertEquals(1, font1Descriptions.length);
166
+ assertEquals('i7', font1Descriptions[0]);
167
+
168
+ var font2Descriptions = descriptions['Font2 WithSpaceToo'];
169
+ assertNotNull(font2Descriptions);
170
+ assertEquals(2, font2Descriptions.length);
171
+ assertEquals('n7', font2Descriptions[0]);
172
+ assertEquals('n4', font2Descriptions[1]);
173
+ };
@@ -0,0 +1,171 @@
1
+ var TypekitScriptTest = TestCase('TypeKitScriptTest');
2
+
3
+ TypekitScriptTest.prototype.testSupportAndLoadLifecycle = function() {
4
+ var configuration = {
5
+ 'id': 'abc'
6
+ };
7
+ var insert = '';
8
+ var src = '';
9
+ var fakeDomHelper = {
10
+ insertInto: function(tag, e) {
11
+ insert = tag;
12
+ },
13
+ createScriptSrc: function(srcLink) {
14
+ src = srcLink;
15
+ }
16
+ };
17
+ var global = {};
18
+ var typeKit = new webfont.TypekitScript(global, fakeDomHelper, configuration);
19
+
20
+ // supportUserAgent
21
+ var userAgent = 'user agent';
22
+ var isSupport = null;
23
+
24
+ typeKit.supportUserAgent(userAgent, function(support) { isSupport = support; });
25
+ assertEquals('head', insert);
26
+ assertEquals('http://use.typekit.com/abc.js', src);
27
+ assertEquals(null, isSupport);
28
+
29
+ assertNotNull(global.__webfonttypekitmodule__);
30
+ assertNotNull(global.__webfonttypekitmodule__['abc']);
31
+
32
+ // Typekit script calls initializer.
33
+ global.__webfonttypekitmodule__['abc'](function(ua, config, init) {
34
+ assertEquals('user agent', ua);
35
+ assertEquals(config, configuration);
36
+ assertNotNull(init);
37
+ init(true, ['Font1', 'Font2'], {});
38
+ });
39
+ assertEquals(true, isSupport);
40
+
41
+ // load
42
+ var families = null;
43
+ var descriptions = null;
44
+
45
+ typeKit.load(function(fontFamilies, fontDescriptions) {
46
+ families = fontFamilies;
47
+ descriptions = fontDescriptions;
48
+ });
49
+
50
+ assertNotNull(families);
51
+ assertEquals(2, families.length);
52
+ assertEquals('Font1', families[0]);
53
+ assertEquals('Font2', families[1]);
54
+
55
+ var font1Descriptions = descriptions['Font1'];
56
+ assertUndefined(font1Descriptions);
57
+
58
+ var font2Descriptions = descriptions['Font2'];
59
+ assertUndefined(font2Descriptions);
60
+ };
61
+
62
+ TypekitScriptTest.prototype.testLoadWithVariations = function() {
63
+ var configuration = {
64
+ 'id': 'abc'
65
+ };
66
+ var insert = '';
67
+ var src = '';
68
+ var fakeDomHelper = {
69
+ insertInto: function(tag, e) {
70
+ insert = tag;
71
+ },
72
+ createScriptSrc: function(srcLink) {
73
+ src = srcLink;
74
+ }
75
+ };
76
+ var global = {};
77
+ var typeKit = new webfont.TypekitScript(global, fakeDomHelper, configuration);
78
+
79
+ // supportUserAgent
80
+ var userAgent = 'user agent';
81
+ var isSupport = null;
82
+
83
+ typeKit.supportUserAgent(userAgent, function(support) { isSupport = support; });
84
+ assertEquals(null, isSupport);
85
+
86
+ assertNotNull(global.__webfonttypekitmodule__);
87
+ assertNotNull(global.__webfonttypekitmodule__['abc']);
88
+
89
+ // Typekit script calls initializer.
90
+ global.__webfonttypekitmodule__['abc'](function(ua, config, init) {
91
+ init(true, ['Font1', 'Font2'], {
92
+ 'Font1': ['n7', 'i7']
93
+ });
94
+ });
95
+
96
+ // load
97
+ var families = null;
98
+ var descriptions = null;
99
+
100
+ typeKit.load(function(fontFamilies, fontDescriptions) {
101
+ families = fontFamilies;
102
+ descriptions = fontDescriptions;
103
+ });
104
+
105
+ assertNotNull(families);
106
+ assertEquals(2, families.length);
107
+ assertEquals('Font1', families[0]);
108
+ assertEquals('Font2', families[1]);
109
+
110
+ var font1Descriptions = descriptions['Font1'];
111
+ assertEquals(2, font1Descriptions.length);
112
+ assertEquals('n7', font1Descriptions[0]);
113
+ assertEquals('i7', font1Descriptions[1]);
114
+
115
+ var font2Descriptions = descriptions['Font2'];
116
+ assertUndefined(font2Descriptions);
117
+ };
118
+
119
+ TypekitScriptTest.prototype.testAlternateApi = function() {
120
+ var configuration = {
121
+ 'id': 'abc',
122
+ 'api': '/test'
123
+ };
124
+ var insert = '';
125
+ var src = '';
126
+ var fakeDomHelper = {
127
+ insertInto: function(tag, e) {
128
+ insert = tag;
129
+ },
130
+ createScriptSrc: function(srcLink) {
131
+ src = srcLink;
132
+ }
133
+ };
134
+ var typeKit = new webfont.TypekitScript({}, fakeDomHelper, configuration);
135
+ var userAgent = 'user agent';
136
+ var isSupport = null;
137
+
138
+ typeKit.supportUserAgent(userAgent, function(support) { isSupport = support; });
139
+ assertEquals('head', insert);
140
+ assertEquals('/test/abc.js', src);
141
+ };
142
+
143
+ TypekitScriptTest.prototype.testNoKitId = function() {
144
+ var configuration = {
145
+ 'id': null,
146
+ };
147
+ var insert = null;
148
+ var src = null;
149
+ var fakeDomHelper = {
150
+ insertInto: function(tag, e) {
151
+ insert = tag;
152
+ },
153
+ createScriptSrc: function(srcLink) {
154
+ src = srcLink;
155
+ }
156
+ };
157
+ var typeKit = new webfont.TypekitScript({}, fakeDomHelper, configuration);
158
+ var userAgent = 'user agent';
159
+ var isSupport = null;
160
+
161
+ // supportUserAgent
162
+ typeKit.supportUserAgent(userAgent, function(support) { isSupport = support; });
163
+ assertNull(insert);
164
+ assertNull(src);
165
+ assertEquals(true, isSupport);
166
+
167
+ // load
168
+ typeKit.load(function(fontFamilies) { families = fontFamilies; });
169
+
170
+ assertEquals([], families);
171
+ };
@@ -0,0 +1,84 @@
1
+ /**
2
+ *
3
+ * WebFont.load({
4
+ * ascender: {
5
+ * key:'ec2de397-11ae-4c10-937f-bf94283a70c1',
6
+ * families:['AyitaPro:regular,bold,bolditalic,italic']
7
+ * }
8
+ * });
9
+ *
10
+ * @constructor
11
+ */
12
+ webfont.AscenderScript = function(domHelper, configuration) {
13
+ this.domHelper_ = domHelper;
14
+ this.configuration_ = configuration;
15
+ };
16
+
17
+ webfont.AscenderScript.NAME = 'ascender';
18
+
19
+ webfont.AscenderScript.VARIATIONS = {
20
+ 'regular': 'n4',
21
+ 'bold': 'n7',
22
+ 'italic': 'i4',
23
+ 'bolditalic': 'i7',
24
+ 'r': 'n4',
25
+ 'b': 'n7',
26
+ 'i': 'i4',
27
+ 'bi': 'i7'
28
+ };
29
+
30
+ webfont.AscenderScript.prototype.supportUserAgent = function(userAgent, support) {
31
+ return support(userAgent.isSupportingWebFont());
32
+ };
33
+
34
+ webfont.AscenderScript.prototype.load = function(onReady) {
35
+ var key = this.configuration_['key'];
36
+ var protocol = (('https:' == document.location.protocol) ? 'https:' : 'http:');
37
+ var url = protocol + '//webfonts.fontslive.com/css/' + key + '.css';
38
+ this.domHelper_.insertInto('head', this.domHelper_.createCssLink(url));
39
+ var fv = this.parseFamiliesAndVariations(this.configuration_['families']);
40
+ onReady(fv.families, fv.variations);
41
+ };
42
+
43
+ webfont.AscenderScript.prototype.parseFamiliesAndVariations = function(providedFamilies){
44
+ var families, variations, fv;
45
+ families = [];
46
+ variations = {};
47
+ for(var i = 0, len = providedFamilies.length; i < len; i++){
48
+ fv = this.parseFamilyAndVariations(providedFamilies[i]);
49
+ families.push(fv.family);
50
+ variations[fv.family] = fv.variations;
51
+ }
52
+ return { families:families, variations:variations };
53
+ };
54
+
55
+ webfont.AscenderScript.prototype.parseFamilyAndVariations = function(providedFamily){
56
+ var family, variations, parts;
57
+ parts = providedFamily.split(':');
58
+ family = parts[0];
59
+ variations = [];
60
+ if(parts[1]){
61
+ variations = this.parseVariations(parts[1]);
62
+ }else{
63
+ variations = ['n4'];
64
+ }
65
+ return { family:family, variations:variations };
66
+ };
67
+
68
+ webfont.AscenderScript.prototype.parseVariations = function(source){
69
+ var providedVariations = source.split(',');
70
+ var variations = [];
71
+ for(var i = 0, len = providedVariations.length; i < len; i++){
72
+ var pv = providedVariations[i];
73
+ if(pv){
74
+ var v = webfont.AscenderScript.VARIATIONS[pv];
75
+ variations.push(v ? v : pv);
76
+ }
77
+ }
78
+ return variations;
79
+ };
80
+
81
+ WebFont.addModule(webfont.AscenderScript.NAME, function(configuration) {
82
+ return new webfont.AscenderScript(new webfont.DomHelper(document),
83
+ configuration);
84
+ });