webfontloader 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +9 -0
- data/LICENSE +201 -0
- data/README.md +148 -0
- data/Rakefile +243 -0
- data/bin/webfontloader-demos +28 -0
- data/docs/EVENTS.md +115 -0
- data/docs/MODULES.md +49 -0
- data/docs/TRANSITIONS.md +107 -0
- data/lib/webfontloader.rb +10 -0
- data/lib/webfontloader/demo/public/ascender.html +99 -0
- data/lib/webfontloader/demo/public/basic.css +9 -0
- data/lib/webfontloader/demo/public/custom.html +88 -0
- data/lib/webfontloader/demo/public/event-css-active-multiple.html +44 -0
- data/lib/webfontloader/demo/public/event-css-active.html +38 -0
- data/lib/webfontloader/demo/public/event-css-inactive.html +38 -0
- data/lib/webfontloader/demo/public/event-css-loading.html +55 -0
- data/lib/webfontloader/demo/public/event-js-active.html +39 -0
- data/lib/webfontloader/demo/public/event-js-font-active.html +40 -0
- data/lib/webfontloader/demo/public/event-js-loading.html +60 -0
- data/lib/webfontloader/demo/public/events-variations.html +130 -0
- data/lib/webfontloader/demo/public/events.html +103 -0
- data/lib/webfontloader/demo/public/google-css.html +27 -0
- data/lib/webfontloader/demo/public/google.html +33 -0
- data/lib/webfontloader/demo/public/ie-fast-js.html +47 -0
- data/lib/webfontloader/demo/public/ie-slow-js.html +48 -0
- data/lib/webfontloader/demo/public/ie-slow-link.html +38 -0
- data/lib/webfontloader/demo/public/index.html +70 -0
- data/lib/webfontloader/demo/public/typekit-variations.html +50 -0
- data/lib/webfontloader/demo/public/typekit.html +41 -0
- data/lib/webfontloader/demo/server.rb +92 -0
- data/lib/webfontloader/modules.rb +44 -0
- data/src-test/ascender/ascender_script_test.js +48 -0
- data/src-test/core/cssclassnametest.js +42 -0
- data/src-test/core/cssfontfamilynametest.js +54 -0
- data/src-test/core/domhelpertest.js +81 -0
- data/src-test/core/eventdispatchertest.js +99 -0
- data/src-test/core/fontmoduleloadertest.js +30 -0
- data/src-test/core/fonttest.js +92 -0
- data/src-test/core/fontvariationdescriptiontest.js +76 -0
- data/src-test/core/fontwatchertest.js +510 -0
- data/src-test/core/useragenttest.js +395 -0
- data/src-test/custom/customcsstest.js +30 -0
- data/src-test/google/fontapiparsertest.js +92 -0
- data/src-test/google/fontapiurlbuildertest.js +28 -0
- data/src-test/google/googlefontapitest.js +173 -0
- data/src-test/typekit/typekit_script_test.js +171 -0
- data/src/ascender/ascender_script.js +84 -0
- data/src/async_load.js +3 -0
- data/src/closure.js +3 -0
- data/src/core/cssclassname.js +21 -0
- data/src/core/cssfontfamilyname.js +20 -0
- data/src/core/domhelper.js +103 -0
- data/src/core/eventdispatcher.js +78 -0
- data/src/core/font.js +84 -0
- data/src/core/fontmoduleloader.js +25 -0
- data/src/core/fontvariationdescription.js +112 -0
- data/src/core/fontwatcher.js +121 -0
- data/src/core/initialize.js +26 -0
- data/src/core/namespace.js +11 -0
- data/src/core/useragent.js +41 -0
- data/src/core/useragentparser.js +234 -0
- data/src/custom/customcss.js +37 -0
- data/src/google/fontapiparser.js +94 -0
- data/src/google/fontapiurlbuilder.js +39 -0
- data/src/google/googlefontapi.js +49 -0
- data/src/modules.yml +27 -0
- data/src/typekit/typekit_script.js +58 -0
- data/tools/compiler/compiler.jar +0 -0
- data/tools/jstestdriver/JsTestDriver-1.2.1.jar +0 -0
- data/webfontloader.gemspec +144 -0
- metadata +191 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
/**
|
2
|
+
* @constructor
|
3
|
+
*/
|
4
|
+
webfont.FontWatcher = function(domHelper, eventDispatcher, fontSizer,
|
5
|
+
asyncCall, getTime) {
|
6
|
+
this.domHelper_ = domHelper;
|
7
|
+
this.eventDispatcher_ = eventDispatcher;
|
8
|
+
this.fontSizer_ = fontSizer;
|
9
|
+
this.asyncCall_ = asyncCall;
|
10
|
+
this.getTime_ = getTime;
|
11
|
+
this.currentlyWatched_ = 0;
|
12
|
+
this.last_ = false;
|
13
|
+
this.success_ = false;
|
14
|
+
this.nameHelper_ = new webfont.CssFontFamilyName();
|
15
|
+
this.fvd_ = new webfont.FontVariationDescription();
|
16
|
+
};
|
17
|
+
|
18
|
+
webfont.FontWatcher.DEFAULT_FONT = '_,arial,helvetica';
|
19
|
+
webfont.FontWatcher.DEFAULT_VARIATION = 'n4';
|
20
|
+
|
21
|
+
webfont.FontWatcher.prototype.watch = function(fontFamilies, fontDescriptions, last) {
|
22
|
+
var length = fontFamilies.length;
|
23
|
+
|
24
|
+
for (var i = 0; i < length; i++) {
|
25
|
+
var fontFamily = fontFamilies[i];
|
26
|
+
if (!fontDescriptions[fontFamily]) {
|
27
|
+
fontDescriptions[fontFamily] = [webfont.FontWatcher.DEFAULT_VARIATION];
|
28
|
+
}
|
29
|
+
this.currentlyWatched_ += fontDescriptions[fontFamily].length;
|
30
|
+
}
|
31
|
+
|
32
|
+
if (last) {
|
33
|
+
this.last_ = last;
|
34
|
+
}
|
35
|
+
|
36
|
+
for (var i = 0; i < length; i++) {
|
37
|
+
var fontFamily = fontFamilies[i];
|
38
|
+
var descriptions = fontDescriptions[fontFamily];
|
39
|
+
|
40
|
+
for (var j = 0, len = descriptions.length; j < len; j++) {
|
41
|
+
var fontDescription = descriptions[j];
|
42
|
+
var originalSize = this.getDefaultFontSize_(fontDescription);
|
43
|
+
|
44
|
+
this.watch_(fontFamily, fontDescription, originalSize);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
};
|
48
|
+
|
49
|
+
webfont.FontWatcher.prototype.watch_ = function(fontFamily, fontDescription, originalSize) {
|
50
|
+
this.eventDispatcher_.dispatchFontLoading(fontFamily, fontDescription);
|
51
|
+
var requestedFont = this.createHiddenElementWithFont_(this.nameHelper_.quote(fontFamily),
|
52
|
+
fontDescription);
|
53
|
+
var size = this.fontSizer_.getWidth(requestedFont);
|
54
|
+
|
55
|
+
if (originalSize != size) {
|
56
|
+
this.domHelper_.removeElement(requestedFont);
|
57
|
+
this.eventDispatcher_.dispatchFontActive(fontFamily, fontDescription);
|
58
|
+
this.success_ = true;
|
59
|
+
this.decreaseCurrentlyWatched_();
|
60
|
+
} else {
|
61
|
+
this.asyncCheck_(this.getTime_(), originalSize, requestedFont,
|
62
|
+
fontFamily, fontDescription);
|
63
|
+
}
|
64
|
+
};
|
65
|
+
|
66
|
+
webfont.FontWatcher.prototype.decreaseCurrentlyWatched_ = function() {
|
67
|
+
if (--this.currentlyWatched_ == 0 && this.last_) {
|
68
|
+
if (this.success_) {
|
69
|
+
this.eventDispatcher_.dispatchActive();
|
70
|
+
} else {
|
71
|
+
this.eventDispatcher_.dispatchInactive();
|
72
|
+
}
|
73
|
+
}
|
74
|
+
};
|
75
|
+
|
76
|
+
webfont.FontWatcher.prototype.check_ = function(started, originalSize,
|
77
|
+
requestedFont, fontFamily, fontDescription) {
|
78
|
+
var size = this.fontSizer_.getWidth(requestedFont);
|
79
|
+
|
80
|
+
if (originalSize != size) {
|
81
|
+
this.domHelper_.removeElement(requestedFont);
|
82
|
+
this.eventDispatcher_.dispatchFontActive(fontFamily, fontDescription);
|
83
|
+
this.success_ = true;
|
84
|
+
this.decreaseCurrentlyWatched_();
|
85
|
+
} else if ((this.getTime_() - started) < 5000) {
|
86
|
+
this.asyncCheck_(started, originalSize, requestedFont, fontFamily, fontDescription);
|
87
|
+
} else {
|
88
|
+
this.domHelper_.removeElement(requestedFont);
|
89
|
+
this.eventDispatcher_.dispatchFontInactive(fontFamily, fontDescription);
|
90
|
+
this.decreaseCurrentlyWatched_();
|
91
|
+
}
|
92
|
+
};
|
93
|
+
|
94
|
+
webfont.FontWatcher.prototype.asyncCheck_ = function(started, originalSize,
|
95
|
+
requestedFont, fontFamily, fontDescription) {
|
96
|
+
this.asyncCall_(function(context, func) {
|
97
|
+
return function() {
|
98
|
+
func.call(context, started, originalSize, requestedFont, fontFamily, fontDescription);
|
99
|
+
}
|
100
|
+
}(this, this.check_), 50);
|
101
|
+
};
|
102
|
+
|
103
|
+
webfont.FontWatcher.prototype.getDefaultFontSize_ = function(fontDescription) {
|
104
|
+
var defaultFont = this.createHiddenElementWithFont_(
|
105
|
+
webfont.FontWatcher.DEFAULT_FONT, fontDescription);
|
106
|
+
var size = this.fontSizer_.getWidth(defaultFont);
|
107
|
+
|
108
|
+
this.domHelper_.removeElement(defaultFont);
|
109
|
+
return size;
|
110
|
+
};
|
111
|
+
|
112
|
+
webfont.FontWatcher.prototype.createHiddenElementWithFont_ = function(
|
113
|
+
fontFamily, fontDescription) {
|
114
|
+
var variationCss = this.fvd_.expand(fontDescription);
|
115
|
+
var styleString = "position:absolute;top:-999px;font-size:300px;font-family:" +
|
116
|
+
fontFamily + "," + webfont.FontWatcher.DEFAULT_FONT + ";" + variationCss;
|
117
|
+
var span = this.domHelper_.createElement('span', { 'style': styleString }, 'Mm');
|
118
|
+
|
119
|
+
this.domHelper_.insertInto('body', span);
|
120
|
+
return span;
|
121
|
+
};
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Name of the global object.
|
2
|
+
var globalName = 'WebFont';
|
3
|
+
|
4
|
+
// Provide an instance of WebFont in the global namespace.
|
5
|
+
window[globalName] = (function() {
|
6
|
+
var userAgentParser = new webfont.UserAgentParser(navigator.userAgent);
|
7
|
+
var userAgent = userAgentParser.parse();
|
8
|
+
var domHelper = new webfont.DomHelper(document, userAgent);
|
9
|
+
var asyncCall = function(func, timeout) { setTimeout(func, timeout); };
|
10
|
+
|
11
|
+
return new webfont.WebFont(domHelper, new webfont.FontModuleLoader(),
|
12
|
+
document.documentElement, asyncCall, userAgent);
|
13
|
+
})();
|
14
|
+
|
15
|
+
// Export the public API.
|
16
|
+
window[globalName]['load'] = window[globalName].load;
|
17
|
+
window[globalName]['addModule'] = window[globalName].addModule;
|
18
|
+
|
19
|
+
// Export the UserAgent API because we pass this object to external modules.
|
20
|
+
webfont.UserAgent.prototype['getName'] = webfont.UserAgent.prototype.getName;
|
21
|
+
webfont.UserAgent.prototype['getVersion'] = webfont.UserAgent.prototype.getVersion;
|
22
|
+
webfont.UserAgent.prototype['getEngine'] = webfont.UserAgent.prototype.getEngine;
|
23
|
+
webfont.UserAgent.prototype['getEngineVersion'] = webfont.UserAgent.prototype.getEngineVersion;
|
24
|
+
webfont.UserAgent.prototype['getPlatform'] = webfont.UserAgent.prototype.getPlatform;
|
25
|
+
webfont.UserAgent.prototype['getPlatformVersion'] = webfont.UserAgent.prototype.getPlatformVersion;
|
26
|
+
webfont.UserAgent.prototype['isSupportingWebFont'] = webfont.UserAgent.prototype.isSupportingWebFont;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
var webfont = {};
|
2
|
+
|
3
|
+
webfont.bind = function(context, func, opt_args) {
|
4
|
+
var args = arguments.length > 2 ?
|
5
|
+
Array.prototype.slice.call(arguments, 2) : [];
|
6
|
+
|
7
|
+
return function() {
|
8
|
+
args.push.apply(args, arguments);
|
9
|
+
return func.apply(context, args);
|
10
|
+
};
|
11
|
+
};
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/**
|
2
|
+
* @constructor
|
3
|
+
*/
|
4
|
+
webfont.UserAgent = function(name, version, engine, engineVersion, platform,
|
5
|
+
platformVersion, webFontSupport) {
|
6
|
+
this.name_ = name;
|
7
|
+
this.version_ = version;
|
8
|
+
this.engine_ = engine;
|
9
|
+
this.engineVersion_ = engineVersion;
|
10
|
+
this.platform_ = platform;
|
11
|
+
this.platformVersion_ = platformVersion;
|
12
|
+
this.webFontSupport_ = webFontSupport;
|
13
|
+
};
|
14
|
+
|
15
|
+
webfont.UserAgent.prototype.getName = function() {
|
16
|
+
return this.name_;
|
17
|
+
};
|
18
|
+
|
19
|
+
webfont.UserAgent.prototype.getVersion = function() {
|
20
|
+
return this.version_;
|
21
|
+
};
|
22
|
+
|
23
|
+
webfont.UserAgent.prototype.getEngine = function() {
|
24
|
+
return this.engine_;
|
25
|
+
};
|
26
|
+
|
27
|
+
webfont.UserAgent.prototype.getEngineVersion = function() {
|
28
|
+
return this.engineVersion_;
|
29
|
+
};
|
30
|
+
|
31
|
+
webfont.UserAgent.prototype.getPlatform = function() {
|
32
|
+
return this.platform_;
|
33
|
+
};
|
34
|
+
|
35
|
+
webfont.UserAgent.prototype.getPlatformVersion = function() {
|
36
|
+
return this.platformVersion_;
|
37
|
+
};
|
38
|
+
|
39
|
+
webfont.UserAgent.prototype.isSupportingWebFont = function() {
|
40
|
+
return this.webFontSupport_;
|
41
|
+
};
|
@@ -0,0 +1,234 @@
|
|
1
|
+
/**
|
2
|
+
* @constructor
|
3
|
+
*/
|
4
|
+
webfont.UserAgentParser = function(userAgent) {
|
5
|
+
this.userAgent_ = userAgent;
|
6
|
+
};
|
7
|
+
|
8
|
+
webfont.UserAgentParser.UNKNOWN = "Unknown";
|
9
|
+
|
10
|
+
webfont.UserAgentParser.UNKNOWN_USER_AGENT = new webfont.UserAgent(webfont.UserAgentParser.UNKNOWN,
|
11
|
+
webfont.UserAgentParser.UNKNOWN, webfont.UserAgentParser.UNKNOWN, webfont.UserAgentParser.UNKNOWN, false);
|
12
|
+
|
13
|
+
webfont.UserAgentParser.prototype.parse = function() {
|
14
|
+
if (this.isIe_()) {
|
15
|
+
return this.parseIeUserAgentString_();
|
16
|
+
} else if (this.isOpera_()) {
|
17
|
+
return this.parseOperaUserAgentString_();
|
18
|
+
} else if (this.isWebKit_()) {
|
19
|
+
return this.parseWebKitUserAgentString_();
|
20
|
+
} else if (this.isGecko_()) {
|
21
|
+
return this.parseGeckoUserAgentString_();
|
22
|
+
} else {
|
23
|
+
return webfont.UserAgentParser.UNKNOWN_USER_AGENT;
|
24
|
+
}
|
25
|
+
};
|
26
|
+
|
27
|
+
webfont.UserAgentParser.prototype.getPlatform_ = function() {
|
28
|
+
var mobileOs = this.getMatchingGroup_(this.userAgent_,
|
29
|
+
/(iPod|iPad|iPhone|Android)/, 1);
|
30
|
+
|
31
|
+
if (mobileOs != "") {
|
32
|
+
return mobileOs;
|
33
|
+
}
|
34
|
+
var os = this.getMatchingGroup_(this.userAgent_,
|
35
|
+
/(Linux|Mac_PowerPC|Macintosh|Windows)/, 1);
|
36
|
+
|
37
|
+
if (os != "") {
|
38
|
+
if (os == "Mac_PowerPC") {
|
39
|
+
os = "Macintosh";
|
40
|
+
}
|
41
|
+
return os;
|
42
|
+
}
|
43
|
+
return webfont.UserAgentParser.UNKNOWN;
|
44
|
+
};
|
45
|
+
|
46
|
+
webfont.UserAgentParser.prototype.getPlatformVersion_ = function() {
|
47
|
+
var macVersion = this.getMatchingGroup_(this.userAgent_,
|
48
|
+
/(OS X|Windows NT|Android) ([^;]+)/, 2);
|
49
|
+
if (macVersion) {
|
50
|
+
return macVersion;
|
51
|
+
}
|
52
|
+
var iVersion = this.getMatchingGroup_(this.userAgent_,
|
53
|
+
/(iPhone )?OS ([\d_]+)/, 2);
|
54
|
+
if (iVersion) {
|
55
|
+
return iVersion;
|
56
|
+
}
|
57
|
+
var linuxVersion = this.getMatchingGroup_(this.userAgent_,
|
58
|
+
/Linux ([i\d]+)/, 1);
|
59
|
+
if (linuxVersion) {
|
60
|
+
return linuxVersion;
|
61
|
+
}
|
62
|
+
|
63
|
+
return webfont.UserAgentParser.UNKNOWN;
|
64
|
+
};
|
65
|
+
|
66
|
+
webfont.UserAgentParser.prototype.isIe_ = function() {
|
67
|
+
return this.userAgent_.indexOf("MSIE") != -1;
|
68
|
+
};
|
69
|
+
|
70
|
+
webfont.UserAgentParser.prototype.parseIeUserAgentString_ = function() {
|
71
|
+
var browser = this.getMatchingGroup_(this.userAgent_, /(MSIE [\d\w\.]+)/, 1);
|
72
|
+
var engineName = webfont.UserAgentParser.UNKNOWN;
|
73
|
+
var engineVersion = webfont.UserAgentParser.UNKNOWN;
|
74
|
+
|
75
|
+
if (browser != "") {
|
76
|
+
var pair = browser.split(' ');
|
77
|
+
var name = pair[0];
|
78
|
+
var version = pair[1];
|
79
|
+
|
80
|
+
// For IE we give MSIE as the engine name and the version of IE
|
81
|
+
// instead of the specific Trident engine name and version
|
82
|
+
return new webfont.UserAgent(name, version, name, version,
|
83
|
+
this.getPlatform_(), this.getPlatformVersion_(), this.getMajorVersion_(version) >= 6);
|
84
|
+
}
|
85
|
+
return new webfont.UserAgent("MSIE", webfont.UserAgentParser.UNKNOWN,
|
86
|
+
"MSIE", webfont.UserAgentParser.UNKNOWN,
|
87
|
+
this.getPlatform_(), this.getPlatformVersion_(), false);
|
88
|
+
};
|
89
|
+
|
90
|
+
webfont.UserAgentParser.prototype.isOpera_ = function() {
|
91
|
+
return this.userAgent_.indexOf("Opera") != -1;
|
92
|
+
};
|
93
|
+
|
94
|
+
webfont.UserAgentParser.prototype.parseOperaUserAgentString_ = function() {
|
95
|
+
var engineName = webfont.UserAgentParser.UNKNOWN;
|
96
|
+
var engineVersion = webfont.UserAgentParser.UNKNOWN;
|
97
|
+
var enginePair = this.getMatchingGroup_(this.userAgent_,
|
98
|
+
/(Presto\/[\d\w\.]+)/, 1);
|
99
|
+
|
100
|
+
if (enginePair != "") {
|
101
|
+
var splittedEnginePair = enginePair.split('/');
|
102
|
+
|
103
|
+
engineName = splittedEnginePair[0];
|
104
|
+
engineVersion = splittedEnginePair[1];
|
105
|
+
} else {
|
106
|
+
if (this.userAgent_.indexOf("Gecko") != -1) {
|
107
|
+
engineName = "Gecko";
|
108
|
+
}
|
109
|
+
var geckoVersion = this.getMatchingGroup_(this.userAgent_, /rv:([^\)]+)/, 1);
|
110
|
+
|
111
|
+
if (geckoVersion != "") {
|
112
|
+
engineVersion = geckoVersion;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
if (this.userAgent_.indexOf("Version/") != -1) {
|
116
|
+
var version = this.getMatchingGroup_(this.userAgent_, /Version\/([\d\.]+)/, 1);
|
117
|
+
|
118
|
+
if (version != "") {
|
119
|
+
return new webfont.UserAgent("Opera", version, engineName, engineVersion,
|
120
|
+
this.getPlatform_(), this.getPlatformVersion_(),
|
121
|
+
this.getMajorVersion_(version) >= 10);
|
122
|
+
}
|
123
|
+
}
|
124
|
+
var version = this.getMatchingGroup_(this.userAgent_, /Opera[\/ ]([\d\.]+)/, 1);
|
125
|
+
|
126
|
+
if (version != "") {
|
127
|
+
return new webfont.UserAgent("Opera", version, engineName, engineVersion,
|
128
|
+
this.getPlatform_(), this.getPlatformVersion_(),
|
129
|
+
this.getMajorVersion_(version) >= 10);
|
130
|
+
}
|
131
|
+
return new webfont.UserAgent("Opera", webfont.UserAgentParser.UNKNOWN,
|
132
|
+
engineName, engineVersion,
|
133
|
+
this.getPlatform_(), this.getPlatformVersion_(), false);
|
134
|
+
};
|
135
|
+
|
136
|
+
webfont.UserAgentParser.prototype.isWebKit_ = function() {
|
137
|
+
return this.userAgent_.indexOf("AppleWebKit") != -1;
|
138
|
+
};
|
139
|
+
|
140
|
+
webfont.UserAgentParser.prototype.parseWebKitUserAgentString_ = function() {
|
141
|
+
var platform = this.getPlatform_();
|
142
|
+
var platformVersion = this.getPlatformVersion_();
|
143
|
+
var webKitVersion = this.getMatchingGroup_(this.userAgent_,
|
144
|
+
/AppleWebKit\/([\d\.\+]+)/, 1);
|
145
|
+
|
146
|
+
if (webKitVersion == "") {
|
147
|
+
webKitVersion = webfont.UserAgentParser.UNKNOWN;
|
148
|
+
}
|
149
|
+
var name = webfont.UserAgentParser.UNKNOWN;
|
150
|
+
|
151
|
+
if (this.userAgent_.indexOf("Chrome") != -1) {
|
152
|
+
name = "Chrome";
|
153
|
+
} else if (this.userAgent_.indexOf("Safari") != -1) {
|
154
|
+
name = "Safari";
|
155
|
+
}
|
156
|
+
var version = webfont.UserAgentParser.UNKNOWN;
|
157
|
+
|
158
|
+
if (this.userAgent_.indexOf("Version/") != -1) {
|
159
|
+
version = this.getMatchingGroup_(this.userAgent_,
|
160
|
+
/Version\/([\d\.\w]+)/, 1);
|
161
|
+
} else if (name == "Chrome") {
|
162
|
+
version = this.getMatchingGroup_(this.userAgent_,
|
163
|
+
/Chrome\/([\d\.]+)/, 1);
|
164
|
+
}
|
165
|
+
var minor = this.getMatchingGroup_(webKitVersion, /\d+\.(\d+)/, 1);
|
166
|
+
|
167
|
+
return new webfont.UserAgent(name, version, "AppleWebKit", webKitVersion,
|
168
|
+
platform, platformVersion, this.getMajorVersion_(webKitVersion) >= 526 ||
|
169
|
+
this.getMajorVersion_(webKitVersion) >= 525 && parseInt(minor) >= 13);
|
170
|
+
};
|
171
|
+
|
172
|
+
webfont.UserAgentParser.prototype.isGecko_ = function() {
|
173
|
+
return this.userAgent_.indexOf("Gecko") != -1;
|
174
|
+
};
|
175
|
+
|
176
|
+
webfont.UserAgentParser.prototype.parseGeckoUserAgentString_ = function() {
|
177
|
+
var name = webfont.UserAgentParser.UNKNOWN;
|
178
|
+
var version = webfont.UserAgentParser.UNKNOWN;
|
179
|
+
var supportWebFont = false;
|
180
|
+
|
181
|
+
if (this.userAgent_.indexOf("Firefox") != -1) {
|
182
|
+
name = "Firefox";
|
183
|
+
var versionNum = this.getMatchingGroup_(this.userAgent_,
|
184
|
+
/Firefox\/([\d\w\.]+)/, 1);
|
185
|
+
|
186
|
+
if (versionNum != "") {
|
187
|
+
var minor = this.getMatchingGroup_(versionNum, /\d+\.(\d+)/, 1);
|
188
|
+
|
189
|
+
version = versionNum;
|
190
|
+
supportWebFont = versionNum != "" && this.getMajorVersion_(versionNum) >= 3 &&
|
191
|
+
parseInt(minor) >= 5;
|
192
|
+
}
|
193
|
+
} else if (this.userAgent_.indexOf("Mozilla") != -1) {
|
194
|
+
name = "Mozilla";
|
195
|
+
}
|
196
|
+
var geckoVersion = this.getMatchingGroup_(this.userAgent_, /rv:([^\)]+)/, 1);
|
197
|
+
|
198
|
+
if (geckoVersion == "") {
|
199
|
+
geckoVersion = webfont.UserAgentParser.UNKNOWN;
|
200
|
+
} else {
|
201
|
+
if (!supportWebFont) {
|
202
|
+
var majorVersion = this.getMajorVersion_(geckoVersion);
|
203
|
+
var intMinorVersion = parseInt(this.getMatchingGroup_(geckoVersion, /\d+\.(\d+)/, 1));
|
204
|
+
var subVersion = parseInt(this.getMatchingGroup_(geckoVersion, /\d+\.\d+\.(\d+)/, 1));
|
205
|
+
|
206
|
+
supportWebFont = majorVersion > 1 ||
|
207
|
+
majorVersion == 1 && intMinorVersion > 9 ||
|
208
|
+
majorVersion == 1 && intMinorVersion == 9 && subVersion >= 2 ||
|
209
|
+
geckoVersion.match(/1\.9\.1b[123]/) != null ||
|
210
|
+
geckoVersion.match(/1\.9\.1\.[\d\.]+/) != null;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
return new webfont.UserAgent(name, version, "Gecko", geckoVersion,
|
214
|
+
this.getPlatform_(), this.getPlatformVersion_(), supportWebFont);
|
215
|
+
};
|
216
|
+
|
217
|
+
webfont.UserAgentParser.prototype.getMajorVersion_ = function(version) {
|
218
|
+
var majorVersion = this.getMatchingGroup_(version, /(\d+)/, 1);
|
219
|
+
|
220
|
+
if (majorVersion != "") {
|
221
|
+
return parseInt(majorVersion);
|
222
|
+
}
|
223
|
+
return -1;
|
224
|
+
};
|
225
|
+
|
226
|
+
webfont.UserAgentParser.prototype.getMatchingGroup_ = function(str,
|
227
|
+
regexp, index) {
|
228
|
+
var groups = str.match(regexp);
|
229
|
+
|
230
|
+
if (groups && groups[index]) {
|
231
|
+
return groups[index];
|
232
|
+
}
|
233
|
+
return "";
|
234
|
+
};
|
@@ -0,0 +1,37 @@
|
|
1
|
+
/**
|
2
|
+
*
|
3
|
+
* WebFont.load({
|
4
|
+
* custom: {
|
5
|
+
* families: ['Font1', 'Font2'],
|
6
|
+
* urls: [ 'http://moo', 'http://meuh' ] }
|
7
|
+
* });
|
8
|
+
*
|
9
|
+
* @constructor
|
10
|
+
*/
|
11
|
+
webfont.CustomCss = function(domHelper, configuration) {
|
12
|
+
this.domHelper_ = domHelper;
|
13
|
+
this.configuration_ = configuration;
|
14
|
+
};
|
15
|
+
|
16
|
+
webfont.CustomCss.NAME = 'custom';
|
17
|
+
|
18
|
+
webfont.CustomCss.prototype.load = function(onReady) {
|
19
|
+
var urls = this.configuration_['urls'] || [];
|
20
|
+
var families = this.configuration_['families'] || [];
|
21
|
+
|
22
|
+
for (var i = 0, len = urls.length; i < len; i++) {
|
23
|
+
var url = urls[i];
|
24
|
+
|
25
|
+
this.domHelper_.insertInto('head', this.domHelper_.createCssLink(url));
|
26
|
+
}
|
27
|
+
onReady(families);
|
28
|
+
};
|
29
|
+
|
30
|
+
webfont.CustomCss.prototype.supportUserAgent = function(userAgent, support) {
|
31
|
+
return support(userAgent.isSupportingWebFont());
|
32
|
+
};
|
33
|
+
|
34
|
+
WebFont.addModule(webfont.CustomCss.NAME, function(configuration) {
|
35
|
+
return new webfont.CustomCss(new webfont.DomHelper(document),
|
36
|
+
configuration);
|
37
|
+
});
|