in Canvas/CanvasSimple/lib/winjs-4.0.1/js/base.js [21674:21855]
oneTimeTextBindingAnalyze: function (binding) {
var element = binding.elementCapture.element;
var elementType = element.tagName;
var targetProperty = binding.destination[0];
// Properties which can only be optimized for a given element types
//
switch (elementType) {
case "A":
switch (targetProperty) {
case "href":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
}
break;
case "IMG":
switch (targetProperty) {
case "alt":
case "src":
case "width":
case "height":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
}
break;
case "SELECT":
switch (targetProperty) {
case "disabled":
case "multiple":
case "required":
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
case "size":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
}
break;
case "OPTION":
switch (targetProperty) {
case "label":
case "value":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
case "disabled":
case "selected":
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
}
break;
case "INPUT":
switch (targetProperty) {
case "checked":
switch (element.type) {
case "checkbox":
case "radio":
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
}
break;
case "disabled":
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
case "max":
case "maxLength":
case "min":
case "step":
case "value":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
case "size":
switch (element.type) {
case "text":
case "search":
case "tel":
case "url":
case "email":
case "password":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
}
break;
case "readOnly":
switch (element.type) {
case "hidden":
case "range":
case "color":
case "checkbox":
case "radio":
case "file":
case "button":
// not supported:
break;
default:
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
}
break;
}
break;
case "BUTTON":
switch (targetProperty) {
case "disabled":
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
case "value":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
}
break;
case "TEXTAREA":
switch (targetProperty) {
case "disabled":
case "readOnly":
case "required":
return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
case "cols":
case "maxLength":
case "placeholder":
case "rows":
case "wrap":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
}
break;
}
// Properties which can be optimized for all element types
//
switch (targetProperty) {
case "className":
return { kind: TextBindingKind.attribute, attribute: "class" };
case "dir":
case "lang":
case "name":
case "title":
case "tabIndex":
return { kind: TextBindingKind.attribute, attribute: targetProperty };
case "style":
if (binding.destination.length > 1) {
var targetCssProperty = binding.destination[1];
if (targetCssProperty === "cssText") {
// We don't support optimizing the cssText property on styles
//
return;
}
// If this is a supported css property we will get a string (frequently empty)
// from the style object.
//
var supported = typeof element.style[targetCssProperty] === "string";
if (supported) {
// The mapping from css property name to JS property name is regular:
// Chrome uses webkit as the JS property name prefix.
// IE uses ms as the JS property name prefix.
// Firefox uses Moz as the JS property name prefix.
//
// To calculate the css property name we replace capital letters with
// a dash followed by the lowercase version of that letter.
//
// For Chrome and IE we have to add the leading dash manually since
// the JS property name prefix is lowercase. For Firefox the replace
// call will take care of this for us since their JS property name
// prefix begins with a capital letter.
if (targetCssProperty[0] === "m" && targetCssProperty[1] === "s" ||
targetCssProperty.substring(0, 6) === "webkit") {
targetCssProperty = "-" + targetCssProperty;
}
targetCssProperty = targetCssProperty.replace(capitalRegEx, function (l) {
return "-" + l.toLowerCase();
});
return { kind: TextBindingKind.inlineStyle, property: targetCssProperty, attribute: "style" };
}
}
break;
case "innerText":
case "textContent":
return { kind: TextBindingKind.textContent, attribute: "textContent" };
}
},