webfontloader 1.0.15 → 1.0.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @constructor
3
+ * @param {function(string, string)} activeCallback
4
+ * @param {function(string, string)} inactiveCallback
5
+ * @param {webfont.DomHelper} domHelper
6
+ * @param {Object.<string, function(Object): number>} fontSizer
7
+ * @param {function(function(), number=)} asyncCall
8
+ * @param {function(): number} getTime
9
+ * @param {string} fontFamily
10
+ * @param {string} fontDescription
11
+ * @param {string=} opt_fontTestString
12
+ */
13
+ webfont.FontWatchRunner = function(activeCallback, inactiveCallback, domHelper,
14
+ fontSizer, asyncCall, getTime, fontFamily, fontDescription, opt_fontTestString) {
15
+ this.activeCallback_ = activeCallback;
16
+ this.inactiveCallback_ = inactiveCallback;
17
+ this.domHelper_ = domHelper;
18
+ this.fontSizer_ = fontSizer;
19
+ this.asyncCall_ = asyncCall;
20
+ this.getTime_ = getTime;
21
+ this.nameHelper_ = new webfont.CssFontFamilyName();
22
+ this.fvd_ = new webfont.FontVariationDescription();
23
+ this.fontFamily_ = fontFamily;
24
+ this.fontDescription_ = fontDescription;
25
+ this.fontTestString_ = opt_fontTestString || webfont.FontWatchRunner.DEFAULT_TEST_STRING;
26
+ this.originalSizeA_ = this.getDefaultFontSize_(
27
+ webfont.FontWatchRunner.DEFAULT_FONTS_A);
28
+ this.originalSizeB_ = this.getDefaultFontSize_(
29
+ webfont.FontWatchRunner.DEFAULT_FONTS_B);
30
+ this.requestedFontA_ = this.createHiddenElementWithFont_(
31
+ webfont.FontWatchRunner.DEFAULT_FONTS_A);
32
+ this.requestedFontB_ = this.createHiddenElementWithFont_(
33
+ webfont.FontWatchRunner.DEFAULT_FONTS_B);
34
+ this.started_ = getTime();
35
+ this.check_();
36
+ };
37
+
38
+ /**
39
+ * A set of sans-serif fonts and a generic family that cover most platforms:
40
+ * Windows - arial - 99.71%
41
+ * Mac - arial - 97.67%
42
+ * Linux - 97.67%
43
+ * (Based on http://www.codestyle.org/css/font-family/sampler-CombinedResults.shtml)
44
+ * @type {string}
45
+ * @const
46
+ */
47
+ webfont.FontWatchRunner.DEFAULT_FONTS_A = "arial,'URW Gothic L',sans-serif";
48
+
49
+ /**
50
+ * A set of serif fonts and a generic family that cover most platforms. We
51
+ * want each of these fonts to have a different width when rendering the test
52
+ * string than each of the fonts in DEFAULT_FONTS_A:
53
+ * Windows - Georgia - 98.98%
54
+ * Mac - Georgia - 95.60%
55
+ * Linux - Century Schoolbook L - 97.97%
56
+ * (Based on http://www.codestyle.org/css/font-family/sampler-CombinedResults.shtml)
57
+ * @type {string}
58
+ * @const
59
+ */
60
+ webfont.FontWatchRunner.DEFAULT_FONTS_B = "Georgia,'Century Schoolbook L',serif";
61
+
62
+ /**
63
+ * Default test string. Characters are chosen so that their widths vary a lot
64
+ * between the fonts in the default stacks. We want each fallback stack
65
+ * to always start out at a different width than the other.
66
+ * @type {string}
67
+ * @const
68
+ */
69
+ webfont.FontWatchRunner.DEFAULT_TEST_STRING = 'BESs';
70
+
71
+ /**
72
+ * @private
73
+ */
74
+ webfont.FontWatchRunner.prototype.check_ = function() {
75
+ var sizeA = this.fontSizer_.getWidth(this.requestedFontA_);
76
+ var sizeB = this.fontSizer_.getWidth(this.requestedFontB_);
77
+
78
+ if (this.originalSizeA_ != sizeA || this.originalSizeB_ != sizeB) {
79
+ this.finish_(this.activeCallback_);
80
+ } else if (this.getTime_() - this.started_ < 5000) {
81
+ this.asyncCheck_();
82
+ } else {
83
+ this.finish_(this.inactiveCallback_);
84
+ }
85
+ };
86
+
87
+ /**
88
+ * @private
89
+ */
90
+ webfont.FontWatchRunner.prototype.asyncCheck_ = function() {
91
+ this.asyncCall_(function(context, func) {
92
+ return function() {
93
+ func.call(context);
94
+ }
95
+ }(this, this.check_), 50);
96
+ };
97
+
98
+ /**
99
+ * @private
100
+ * @param {function(string, string)} callback
101
+ */
102
+ webfont.FontWatchRunner.prototype.finish_ = function(callback) {
103
+ this.domHelper_.removeElement(this.requestedFontA_);
104
+ this.domHelper_.removeElement(this.requestedFontB_);
105
+ callback(this.fontFamily_, this.fontDescription_);
106
+ };
107
+
108
+ /**
109
+ * @private
110
+ * @param {string} defaultFonts
111
+ */
112
+ webfont.FontWatchRunner.prototype.getDefaultFontSize_ = function(defaultFonts) {
113
+ var defaultFont = this.createHiddenElementWithFont_(defaultFonts, true);
114
+ var size = this.fontSizer_.getWidth(defaultFont);
115
+
116
+ this.domHelper_.removeElement(defaultFont);
117
+ return size;
118
+ };
119
+
120
+ /**
121
+ * @private
122
+ * @param {string} defaultFonts
123
+ * @param {boolean=} opt_withoutFontFamily
124
+ */
125
+ webfont.FontWatchRunner.prototype.createHiddenElementWithFont_ = function(
126
+ defaultFonts, opt_withoutFontFamily) {
127
+ var variationCss = this.fvd_.expand(this.fontDescription_);
128
+ var styleString = "position:absolute;top:-999px;font-size:300px;font-family:" +
129
+ (opt_withoutFontFamily ? "" : this.nameHelper_.quote(this.fontFamily_) + ",") +
130
+ defaultFonts + ";" + variationCss;
131
+ var span = this.domHelper_.createElement('span', { 'style': styleString },
132
+ this.fontTestString_);
133
+
134
+ this.domHelper_.insertInto('body', span);
135
+ return span;
136
+ };
@@ -2,7 +2,7 @@ var webfont = {};
2
2
 
3
3
  /**
4
4
  * @param {Object} context
5
- * @param {function(...[*])} func
5
+ * @param {function(...)} func
6
6
  * @param {...*} opt_args
7
7
  */
8
8
  webfont.bind = function(context, func, opt_args) {
data/src/modules.yml CHANGED
@@ -6,6 +6,7 @@ core:
6
6
  - core/eventdispatcher.js
7
7
  - core/fontmoduleloader.js
8
8
  - core/fontwatcher.js
9
+ - core/fontwatchrunner.js
9
10
  - core/font.js
10
11
  - core/cssclassname.js
11
12
  - core/cssfontfamilyname.js