webfontloader 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
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
+ });