Work in progress on a test for value storage and serialization.
authordbaron@dbaron.org
Mon, 16 Apr 2007 21:45:49 -0700
changeset 578 865dec66fdd53685d4a49c9c9cd5d4603d961bf7
parent 577 f87bb57d953ebeda31d40284dbcea4339a942ed0
child 579 1d7f10ad11483eac5a70244ed18aeeef32361080
push id1
push userbsmedberg@mozilla.com
push dateThu, 20 Mar 2008 16:49:24 +0000
treeherdermozilla-central@61007906a1f8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone1.9a4pre
Work in progress on a test for value storage and serialization.
layout/style/test/property_database.js
layout/style/test/test_inherit_storage.html
layout/style/test/test_initial_storage.html
layout/style/test/test_value_storage.html
--- a/layout/style/test/property_database.js
+++ b/layout/style/test/property_database.js
@@ -45,379 +45,339 @@ const CSS_TYPE_TRUE_SHORTHAND = 1;
 // Properties that we handle as shorthands but were longhands either in
 // the current spec or earlier versions of the spec.
 const CSS_TYPE_SHORTHAND_AND_LONGHAND = 2;
 
 var gCSSProperties = {
 	"-moz-appearance": {
 		domProp: "MozAppearance",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "radio", "menulist" ],
 		invalid_values: []
 	},
 	"-moz-background-clip": {
 		domProp: "MozBackgroundClip",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "border" ],
 		other_values: [ "padding" ],
 		invalid_values: [ "content", "margin" ]
 	},
 	"-moz-background-inline-policy": {
 		domProp: "MozBackgroundInlinePolicy",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "continuous" ],
 		other_values: ["bounding-box", "each-box" ],
 		invalid_values: []
 	},
 	"-moz-background-origin": {
 		domProp: "MozBackgroundOrigin",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "padding" ],
 		other_values: [ "border", "content" ],
 		invalid_values: [ "margin" ]
 	},
 	"-moz-binding": {
 		domProp: "MozBinding",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(foo.xml)" ],
 		invalid_values: []
 	},
 	"-moz-border-bottom-colors": {
 		domProp: "MozBorderBottomColors",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "red, green", "red, #fc3", "#ff00cc" ],
 		invalid_values: [ "red, none", "red, inherit" ]
 	},
 	"-moz-border-left-colors": {
 		domProp: "MozBorderLeftColors",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "red, green", "red, #fc3", "#ff00cc" ],
 		invalid_values: [ "red, none", "red, inherit" ]
 	},
 	"-moz-border-radius": {
 		domProp: "MozBorderRadius",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "-moz-border-radius-bottomleft", "-moz-border-radius-bottomright", "-moz-border-radius-topleft", "-moz-border-radius-topright" ],
 		initial_values: [ "0", "0px", "0px 0 0 0px" ], /* 0% ? */
 		other_values: [ "3%", "1px", "2em", "3em 2px", "2pt 3% 4em", "2px 2px 2px 2px" ],
 		invalid_values: []
 	},
 	"-moz-border-radius-bottomleft": {
 		domProp: "MozBorderRadiusBottomleft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px" ], /* 0% ? */
 		other_values: [ "3%", "1px", "2em" ],
 		invalid_values: []
 	},
 	"-moz-border-radius-bottomright": {
 		domProp: "MozBorderRadiusBottomright",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px" ], /* 0% ? */
 		other_values: [ "3%", "1px", "2em" ],
 		invalid_values: []
 	},
 	"-moz-border-radius-topleft": {
 		domProp: "MozBorderRadiusTopleft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px" ], /* 0% ? */
 		other_values: [ "3%", "1px", "2em" ],
 		invalid_values: []
 	},
 	"-moz-border-radius-topright": {
 		domProp: "MozBorderRadiusTopright",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px" ], /* 0% ? */
 		other_values: [ "3%", "1px", "2em" ],
 		invalid_values: []
 	},
 	"-moz-border-right-colors": {
 		domProp: "MozBorderRightColors",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "red, green", "red, #fc3", "#ff00cc" ],
 		invalid_values: [ "red, none", "red, inherit" ]
 	},
 	"-moz-border-top-colors": {
 		domProp: "MozBorderTopColors",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "red, green", "red, #fc3", "#ff00cc" ],
 		invalid_values: [ "red, none", "red, inherit" ]
 	},
 	"-moz-box-align": {
 		domProp: "MozBoxAlign",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "stretch" ],
 		other_values: [ "start", "center", "baseline", "end" ],
 		invalid_values: []
 	},
 	"-moz-box-direction": {
 		domProp: "MozBoxDirection",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "reverse" ],
 		invalid_values: []
 	},
 	"-moz-box-flex": {
 		domProp: "MozBoxFlex",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0.0", "-0.0" ],
 		other_values: [ "1", "100", "0.1" ],
 		invalid_values: [ "10px", "-1" ]
 	},
 	"-moz-box-ordinal-group": {
 		domProp: "MozBoxOrdinalGroup",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1" ],
 		other_values: [ "0", "-1", "100", "-1000" ],
 		invalid_values: [ "1.0" ]
 	},
 	"-moz-box-orient": {
 		domProp: "MozBoxOrient",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "horizontal", "inline-axis" ],
 		other_values: [ "vertical", "block-axis" ],
 		invalid_values: []
 	},
 	"-moz-box-pack": {
 		domProp: "MozBoxPack",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "start" ],
 		other_values: [ "center", "end", "justify" ],
 		invalid_values: []
 	},
 	"-moz-box-sizing": {
 		domProp: "MozBoxSizing",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "content" ],
 		other_values: [ "border", "padding" ],
 		invalid_values: [ "margin" ]
 	},
 	"-moz-column-count": {
 		domProp: "MozColumnCount",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "1", "0", "17" ],
 		invalid_values: [
 			// "-1", unclear: see http://lists.w3.org/Archives/Public/www-style/2007Apr/0030
 			"3px"
 		]
 	},
 	"-moz-column-gap": {
 		domProp: "MozColumnGap",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal", "1em" ],
 		other_values: [ "2px", "4em", "3%" ],
 		invalid_values: []
 	},
 	"-moz-column-width": {
 		domProp: "MozColumnWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "50%", "15px" ],
 		invalid_values: [ "20" ]
 	},
 	"-moz-float-edge": {
 		domProp: "MozFloatEdge",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "content" ],
 		other_values: [ "border", "padding", "margin" ],
 		invalid_values: []
 	},
 	"-moz-force-broken-image-icon": {
 		domProp: "MozForceBrokenImageIcon",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0" ],
 		other_values: [ "1" ],
 		invalid_values: []
 	},
 	"-moz-image-region": {
 		domProp: "MozImageRegion",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "rect(3px 20px 15px 4px)", "rect(17px, 21px, 33px, 2px)" ],
 		invalid_values: []
 	},
 	"-moz-margin-end": {
 		domProp: "MozMarginEnd",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		/* auto may or may not be initial */
 		initial_values: [ "0", "0px", "0%", "0em", "0ex" ],
 		other_values: [ "1px", "3em" ],
 		invalid_values: []
 	},
 	"-moz-margin-start": {
 		domProp: "MozMarginStart",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		/* auto may or may not be initial */
 		initial_values: [ "0", "0px", "0%", "0em", "0ex" ],
 		other_values: [ "1px", "3em" ],
 		invalid_values: []
 	},
 	"-moz-outline-radius": {
 		domProp: "MozOutlineRadius",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "-moz-outline-radius-bottomleft", "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", "-moz-outline-radius-topright" ],
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "2px", "0.3em", "2%" ],
 		invalid_values: []
 	},
 	"-moz-outline-radius-bottomleft": {
 		domProp: "MozOutlineRadiusBottomleft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "2px", "0.3em", "2%" ],
 		invalid_values: []
 	},
 	"-moz-outline-radius-bottomright": {
 		domProp: "MozOutlineRadiusBottomright",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "2px", "0.3em", "2%" ],
 		invalid_values: []
 	},
 	"-moz-outline-radius-topleft": {
 		domProp: "MozOutlineRadiusTopleft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "2px", "0.3em", "2%" ],
 		invalid_values: []
 	},
 	"-moz-outline-radius-topright": {
 		domProp: "MozOutlineRadiusTopright",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "2px", "0.3em", "2%" ],
 		invalid_values: []
 	},
 	"-moz-padding-end": {
 		domProp: "MozPaddingEnd",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		initial_values: [ "0", "0px", "0%", "0em", "0ex" ],
 		other_values: [ "1px", "3em" ],
 		invalid_values: []
 	},
 	"-moz-padding-start": {
 		domProp: "MozPaddingStart",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		initial_values: [ "0", "0px", "0%", "0em", "0ex" ],
 		other_values: [ "1px", "3em" ],
 		invalid_values: []
 	},
 	"-moz-user-focus": {
 		domProp: "MozUserFocus",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "normal", "ignore", "select-all", "select-before", "select-after", "select-same", "select-menu" ],
 		invalid_values: []
 	},
 	"-moz-user-input": {
 		domProp: "MozUserInput",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "none", "enabled", "disabled" ],
 		invalid_values: []
 	},
 	"-moz-user-modify": {
 		domProp: "MozUserModify",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "read-only" ],
 		other_values: [ "read-write", "write-only" ],
 		invalid_values: []
 	},
 	"-moz-user-select": {
 		domProp: "MozUserSelect",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "none", "text", "element", "elements", "all", "toggle", "tri-state", "-moz-all", "-moz-none" ],
 		invalid_values: []
 	},
 	"azimuth": {
 		domProp: "azimuth",
 		inherited: true,
@@ -425,359 +385,323 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "center", "0deg" ],
 		other_values: [ "center behind", "behind far-right", "left-side", "73deg", "90.1deg", "0.1deg" ],
 		invalid_values: [ "0deg behind", "behind 0deg", "90deg behind", "behind 90deg" ]
 	},
 	"background": {
 		domProp: "background",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "background-attachment", "background-color", "background-image", "background-position", "background-repeat", "-moz-background-clip", "-moz-background-inline-policy", "-moz-background-origin" ],
 		initial_values: [ "transparent", "none", "repeat", "scroll", "0% 0%", "top left", "left top", "transparent none", "top left none", "left top none", "none left top", "none top left", "none 0% 0%", "transparent none repeat scroll top left", "left top repeat none scroll transparent"],
 		other_values: [ "green", "none green repeat scroll left top", "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') transparent left top scroll", "repeat-x", "repeat-y", "no-repeat", "none repeat-y transparent scroll 0% 0%", "fixed", "0% top transparent fixed repeat none", "top", "left", "50% 50%", "center", "bottom right scroll none transparent repeat", "50% transparent", "transparent 50%", "50%" ],
  		invalid_values: [
  			/* mixes with keywords have to be in correct order */
  			"50% left", "top 50%",
  			/* bug 258080: don't accept background-position separated */
  			"left url(404.png) top", "top url(404.png) left"
  		]
 	},
 	"background-attachment": {
 		domProp: "backgroundAttachment",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "scroll" ],
 		other_values: [ "fixed" ],
 		invalid_values: []
 	},
 	"background-color": {
 		domProp: "backgroundColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "transparent", "rgba(255, 127, 15, 0)", "hsla(240, 97%, 50%, 0.0)", "rgba(0, 0, 0, 0)", "rgba(255,255,255,-3.7)" ],
 		other_values: [ "green", "rgb(255, 0, 128)", "rgb(255.0,0.387,3489)", "#fc2", "#96ed2a", "black", "rgba(255,255,0,3)" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"background-image": {
 		domProp: "backgroundImage",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', ],
 		invalid_values: []
 	},
 	"background-position": {
 		domProp: "backgroundPosition",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "top left", "left top", "0% 0%", "0% top", "left 0%" ],
 		other_values: [ "top", "left", "right", "bottom", "center", "center bottom", "bottom center", "center right", "right center", "center top", "top center", "center left", "left center", "right bottom", "bottom right", "50%" ],
 		invalid_values: [ "50% left", "top 50%" ]
 	},
 	"background-repeat": {
 		domProp: "backgroundRepeat",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "repeat" ],
 		other_values: [ "repeat-x", "repeat-y", "no-repeat" ],
 		invalid_values: []
 	},
 	"border": {
 		domProp: "border",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-bottom-color", "border-bottom-style", "border-bottom-width", "border-left-color", "border-left-style", "border-left-width", "border-right-color", "border-right-style", "border-right-width", "border-top-color", "border-top-style", "border-top-width" ],
 		initial_values: [ "none", "medium", "currentColor", "none medium currentcolor" ],
 		other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-bottom": {
 		domProp: "borderBottom",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-bottom-color", "border-bottom-style", "border-bottom-width" ],
 		initial_values: [ "none", "medium", "currentColor", "none medium currentcolor" ],
 		other_values: [ "solid", "thin", "green", "medium solid", "green solid", "10px solid", "thick solid" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-bottom-color": {
 		domProp: "borderBottomColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "currentColor" ],
 		other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"border-bottom-style": {
 		domProp: "borderBottomStyle",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX hidden is sometimes the same as initial */
 		initial_values: [ "none" ],
 		other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
 		invalid_values: []
 	},
 	"border-bottom-width": {
 		domProp: "borderBottomWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX a value differing from initial requires border-style to be set */
 		initial_values: [ "medium", "3px" ],
 		other_values: [ "thin", "thick", "1px", "2em" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-collapse": {
 		domProp: "borderCollapse",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "separate" ],
 		other_values: [ "collapse" ],
 		invalid_values: []
 	},
 	"border-color": {
 		domProp: "borderColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-top-color", "border-right-color", "border-bottom-color", "border-left-color" ],
 		initial_values: [ "currentColor", "currentColor currentColor", "currentColor currentColor currentColor", "currentColor currentColor currentcolor CURRENTcolor" ],
 		other_values: [ "green", "currentColor green", "currentColor currentColor green", "currentColor currentColor currentColor green", "rgba(255,128,0,0.5)", "transparent" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"border-left": {
 		domProp: "borderLeft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-left-color", "border-left-style", "border-left-width" ],
 		initial_values: [ "none", "medium", "currentColor", "none medium currentcolor" ],
 		other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-left-color": {
 		domProp: "borderLeftColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "currentColor" ],
 		other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"border-left-style": {
 		domProp: "borderLeftStyle",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX hidden is sometimes the same as initial */
 		initial_values: [ "none" ],
 		other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
 		invalid_values: []
 	},
 	"border-left-width": {
 		domProp: "borderLeftWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX a value differing from initial requires border-style to be set */
 		initial_values: [ "medium", "3px" ],
 		other_values: [ "thin", "thick", "1px", "2em" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-right": {
 		domProp: "borderRight",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-right-color", "border-right-style", "border-right-width" ],
 		initial_values: [ "none", "medium", "currentColor", "none medium currentcolor" ],
 		other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-right-color": {
 		domProp: "borderRightColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "currentColor" ],
 		other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"border-right-style": {
 		domProp: "borderRightStyle",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX hidden is sometimes the same as initial */
 		initial_values: [ "none" ],
 		other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
 		invalid_values: []
 	},
 	"border-right-width": {
 		domProp: "borderRightWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX a value differing from initial requires border-style to be set */
 		initial_values: [ "medium", "3px" ],
 		other_values: [ "thin", "thick", "1px", "2em" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-spacing": {
 		domProp: "borderSpacing",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0 0", "0px", "0 0px" ],
 		other_values: [ "3px", "4em 2px", "4em 0", "0px 2px" ],
 		invalid_values: [ "0%", "0 0%" ]
 	},
 	"border-style": {
 		domProp: "borderStyle",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-top-style", "border-right-style", "border-bottom-style", "border-left-style" ],
 		/* XXX hidden is sometimes the same as initial */
 		initial_values: [ "none", "none none", "none none none", "none none none none" ],
 		other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge", "none solid", "none none solid", "none none none solid", "groove none none none", "none ridge none none", "none none double none", "none none none dotted" ],
 		invalid_values: []
 	},
 	"border-top": {
 		domProp: "borderTop",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-top-color", "border-top-style", "border-top-width" ],
 		initial_values: [ "none", "medium", "currentColor", "none medium currentcolor" ],
 		other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-top-color": {
 		domProp: "borderTopColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "currentColor" ],
 		other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"border-top-style": {
 		domProp: "borderTopStyle",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX hidden is sometimes the same as initial */
 		initial_values: [ "none" ],
 		other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
 		invalid_values: []
 	},
 	"border-top-width": {
 		domProp: "borderTopWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX a value differing from initial requires border-style to be set */
 		initial_values: [ "medium", "3px" ],
 		other_values: [ "thin", "thick", "1px", "2em" ],
 		invalid_values: [ "5%" ]
 	},
 	"border-width": {
 		domProp: "borderWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "border-top-width", "border-right-width", "border-bottom-width", "border-left-width" ],
 		/* XXX a value differing from initial requires border-style to be set */
 		initial_values: [ "medium", "3px", "medium medium", "3px medium medium", "medium 3px medium medium" ],
 		other_values: [ "thin", "thick", "1px", "2em", "2px 0 0px 1em" ],
 		invalid_values: [ "5%" ]
 	},
 	"bottom": {
 		domProp: "bottom",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX requires position to be set */
 		/* XXX 0 may or may not be equal to auto */
 		initial_values: [ "auto" ],
 		other_values: [ "32px", "-3em", "12%" ],
 		invalid_values: []
 	},
 	"caption-side": {
 		domProp: "captionSide",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "top" ],
 		other_values: [ "right", "left", "bottom" ],
 		invalid_values: []
 	},
 	"clear": {
 		domProp: "clear",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "left", "right", "both" ],
 		invalid_values: []
 	},
 	"clip": {
 		domProp: "clip",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "rect(auto,auto,auto,auto)", "rect(3px, 4px, 4em, 0)", "rect(auto, 3em, 4pt, 2px)", "rect(2px 3px 4px 5px)" ],
 		invalid_values: [ "rect(auto, 3em, 2%, 5px)" ]
 	},
 	"color": {
 		domProp: "color",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "currentcolor" ],
 		other_values: [ "green", "#f3c", "#fed292", "rgba(45,300,12,2)", "transparent" ],
 		invalid_values: [ "fff", "ffffff", "#f", "#ff", "#ffff", "#fffff", "#fffffff", "#ffffffff", "#fffffffff" ]
 	},
 	"content": {
 		domProp: "content",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX needs to be on pseudo-elements */
 		initial_values: [ "normal", "none" ],
 		other_values: [ '""', "''", '"hello"', "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', ],
 		invalid_values: []
 	},
 	"counter-increment": {
 		domProp: "counterIncrement",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "foo 1", "bar", "foo 3 bar baz 2" ],
 		invalid_values: []
 	},
 	"counter-reset": {
 		domProp: "counterReset",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "bar 0", "foo", "foo 3 bar baz 2" ],
 		invalid_values: []
 	},
 	"cue": {
 		domProp: "cue",
 		inherited: false,
@@ -804,35 +728,32 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(404.wav)" ],
 		invalid_values: []
 	},
 	"cursor": {
 		domProp: "cursor",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "crosshair", "default", "pointer", "move", "e-resize", "ne-resize", "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "text", "wait", "help", "progress" ],
 		invalid_values: []
 	},
 	"direction": {
 		domProp: "direction",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "ltr" ],
 		other_values: [ "rtl" ],
 		invalid_values: []
 	},
 	"display": {
 		domProp: "display",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "inline" ],
 		/* XXX none will really mess with other properties */
 		other_values: [ "block", "list-item", "inline-block", "table", "inline-table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption", "none" ],
 		invalid_values: []
 	},
 	"elevation": {
 		domProp: "elevation",
@@ -841,64 +762,58 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "level", "0deg" ],
 		other_values: [ "below", "above", "60deg", "higher", "lower", "-79deg", "0.33deg" ],
 		invalid_values: []
 	},
 	"empty-cells": {
 		domProp: "emptyCells",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "show" ],
 		other_values: [ "hide" ],
 		invalid_values: []
 	},
 	"float": {
 		domProp: "cssFloat",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "left", "right" ],
 		invalid_values: []
 	},
 	"font": {
 		domProp: "font",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "font-style", "font-variant", "font-weight", "font-size", "line-height", "font-family", "font-stretch", "font-size-adjust" ],
 		/* XXX could be sans-serif */
 		initial_values: [ "medium serif" ],
 		other_values: [ "large serif", "9px fantasy", "bold italic small-caps 24px/1.4 Times New Roman, serif", "caption", "icon", "menu", "message-box", "small-caption", "status-bar" ],
 		invalid_values: []
 	},
 	"font-family": {
 		domProp: "fontFamily",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "serif" ],
 		other_values: [ "sans-serif", "Times New Roman, serif", "'Times New Roman', serif", "cursive", "fantasy" ],
 		invalid_values: []
 	},
 	"font-size": {
 		domProp: "fontSize",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "medium" ],
 		other_values: [ "2em", "50%", "large", "xx-small", "36pt", "8px" ],
 		invalid_values: []
 	},
 	"font-size-adjust": {
 		domProp: "fontSizeAdjust",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "0.3", "0.5", "0.7" ],
 		invalid_values: []
 	},
 	"font-stretch": {
 		domProp: "fontStretch",
 		inherited: true,
@@ -906,172 +821,155 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "wider", "narrower", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded" ],
 		invalid_values: []
 	},
 	"font-style": {
 		domProp: "fontStyle",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "italic", "oblique" ],
 		invalid_values: []
 	},
 	"font-variant": {
 		domProp: "fontVariant",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "small-caps" ],
 		invalid_values: []
 	},
 	"font-weight": {
 		domProp: "fontWeight",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900" ],
 		invalid_values: [ "107", "399", "401", "699", "710" ]
 	},
 	"height": {
 		domProp: "height",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ " auto" ],
 		/* XXX these have prerequisites */
 		other_values: [ "15px", "3em", "15%" ],
 		invalid_values: []
 	},
 	"left": {
 		domProp: "left",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX requires position to be set */
 		/* XXX 0 may or may not be equal to auto */
 		initial_values: [ "auto" ],
 		other_values: [ "32px", "-3em", "12%" ],
 		invalid_values: []
 	},
 	"letter-spacing": {
 		domProp: "letterSpacing",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "0", "0px", "1em", "2px", "-3px" ],
 		invalid_values: []
 	},
 	"line-height": {
 		domProp: "lineHeight",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "1.0", "1", "1em", "27px" ],
 		invalid_values: []
 	},
 	"list-style": {
 		domProp: "listStyle",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "list-style-type", "list-style-position", "list-style-image" ],
 		initial_values: [ "none", "outside", "disc", "none disc outside" ],
 		other_values: [ "inside none", "none inside", "none none inside", "none outside none", "square", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")' ],
 		invalid_values: []
 	},
 	"list-style-image": {
 		domProp: "listStyleImage",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")' ],
 		invalid_values: []
 	},
 	"list-style-position": {
 		domProp: "listStylePosition",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "outside" ],
 		other_values: [ "inside" ],
 		invalid_values: []
 	},
 	"list-style-type": {
 		domProp: "listStyleType",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "disc" ],
 		other_values: [ "circle", "decimal-leading-zero", "upper-alpha" ],
 		invalid_values: []
 	},
 	"margin": {
 		domProp: "margin",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "margin-top", "margin-right", "margin-bottom", "margin-left" ],
 		initial_values: [ "0", "0px 0 0em", "0% 0px 0em 0pt" ],
 		other_values: [ "3px 0", "2em 4px 2pt", "1em 2em 3px 4px" ],
 		invalid_values: []
 	},
 	"margin-bottom": {
 		domProp: "marginBottom",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX testing auto has prerequisites */
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"margin-left": {
 		domProp: "marginLeft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		/* XXX testing auto has prerequisites */
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: []
 	},
 	"margin-right": {
 		domProp: "marginRight",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		/* XXX testing auto has prerequisites */
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"margin-top": {
 		domProp: "marginTop",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX testing auto has prerequisites */
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"marker-offset": {
 		domProp: "markerOffset",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "6em", "-1px" ],
 		invalid_values: []
 	},
 	"marks": {
 		/* XXX not a real property; applies only to page context */
 		domProp: "marks",
@@ -1080,53 +978,48 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "crop", "cross", "crop cross", "cross crop" ],
 		invalid_values: [ "none none", "crop none", "none crop", "cross none", "none cross" ]
 	},
 	"max-height": {
 		domProp: "maxHeight",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "30px", "50%", "0" ],
 		invalid_values: [ "auto" ]
 	},
 	"max-width": {
 		domProp: "maxWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "30px", "50%", "0" ],
 		invalid_values: [ "auto" ]
 	},
 	"min-height": {
 		domProp: "minHeight",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0" ],
 		other_values: [ "30px", "50%" ],
 		invalid_values: [ "auto", "none" ]
 	},
 	"min-width": {
 		domProp: "minWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0" ],
 		other_values: [ "30px", "50%" ],
 		invalid_values: [ "auto", "none" ]
 	},
 	"opacity": {
 		domProp: "opacity",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1", "17", "397.376" ],
 		other_values: [ "0", "0.4", "0.0000", "-3" ],
 		invalid_values: [ "0px", "1px" ]
 	},
 	"orphans": {
 		domProp: "orphans",
 		inherited: true,
@@ -1139,140 +1032,127 @@ var gCSSProperties = {
 			// "0", // not clear whether it's valid or not.
 			// "-1", // not clear whether it's valid or not.
 			"0px", "3px"
 		]
 	},
 	"outline": {
 		domProp: "outline",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "outline-color", "outline-style", "outline-width" ],
 		initial_values: [
 			"none", "medium",
 			// XXX Should be invert, but currently currentcolor.
 			//"invert", "none medium invert"
 			"currentColor", "none medium currentcolor"
 		],
 		other_values: [ "solid", "medium solid", "green solid", "10px solid", "thick solid" ],
 		invalid_values: [ "5%" ]
 	},
 	"outline-color": {
 		domProp: "outlineColor",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "currentColor" ], // XXX should be invert
 		other_values: [ "green", "rgba(255,128,0,0.5)", "transparent" ],
 		invalid_values: [ "#0", "#00", "#0000", "#00000", "#0000000", "#00000000", "#000000000" ]
 	},
 	"outline-offset": {
 		domProp: "outlineOffset",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0" ],
 		other_values: [ "-3px", "1em" ],
 		invalid_values: [ "5%" ]
 	},
 	"outline-style": {
 		domProp: "outlineStyle",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		// XXX Should 'hidden' be the same as initial?
 		initial_values: [ "none" ],
 		other_values: [ "solid", "dashed", "dotted", "double", "outset", "inset", "groove", "ridge" ],
 		invalid_values: []
 	},
 	"outline-width": {
 		domProp: "outlineWidth",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX a value differing from initial requires border-style to be set */
 		initial_values: [ "medium", "3px" ],
 		other_values: [ "thin", "thick", "1px", "2em" ],
 		invalid_values: [ "5%" ]
 	},
 	"overflow": {
 		domProp: "overflow",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		// XXX requires display:block
 		subproperties: [ "overflow-x", "overflow-y" ],
 		initial_values: [ "visible" ],
 		other_values: [ "auto", "scroll", "hidden" ],
 		invalid_values: []
 	},
 	"overflow-x": {
 		domProp: "overflowX",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		// XXX requires display:block
 		initial_values: [ "visible" ],
 		other_values: [ "auto", "scroll", "hidden" ],
 		invalid_values: []
 	},
 	"overflow-y": {
 		domProp: "overflowY",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		// XXX requires display:block
 		initial_values: [ "visible" ],
 		other_values: [ "auto", "scroll", "hidden" ],
 		invalid_values: []
 	},
 	"padding": {
 		domProp: "padding",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "padding-top", "padding-right", "padding-bottom", "padding-left" ],
 		initial_values: [ "0", "0px 0 0em", "0% 0px 0em 0pt" ],
 		other_values: [ "3px 0", "2em 4px 2pt", "1em 2em 3px 4px" ],
 		invalid_values: []
 	},
 	"padding-bottom": {
 		domProp: "paddingBottom",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"padding-left": {
 		domProp: "paddingLeft",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"padding-right": {
 		domProp: "paddingRight",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
 		/* no subproperties */
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"padding-top": {
 		domProp: "paddingTop",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "0px", "0%" ],
 		other_values: [ "1px", "2em", "5%" ],
 		invalid_values: [ ]
 	},
 	"page": {
 		domProp: "page",
 		inherited: true,
@@ -1280,26 +1160,24 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "foo", "bar" ],
 		invalid_values: [ "3px" ]
 	},
 	"page-break-after": {
 		domProp: "pageBreakAfter",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "always", "avoid", "left", "right" ],
 		invalid_values: []
 	},
 	"page-break-before": {
 		domProp: "pageBreakBefore",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "always", "avoid", "left", "right" ],
 		invalid_values: []
 	},
 	"page-break-inside": {
 		domProp: "pageBreakInside",
 		inherited: true,
@@ -1353,26 +1231,24 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "50", "50.0" ],
 		other_values: [ "0", "100.0", "99.7", "47", "3.2" ],
 		invalid_values: [" -0.01", "100.2", "108", "-3" ]
 	},
 	"position": {
 		domProp: "position",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "static" ],
 		other_values: [ "relative", "absolute", "fixed" ],
 		invalid_values: []
 	},
 	"quotes": {
 		domProp: "quotes",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ '"\\201C" "\\201D" "\\2018" "\\2019"' ],
 		other_values: [ "none", "'\"' '\"'" ],
 		invalid_values: []
 	},
 	"richness": {
 		domProp: "richness",
 		inherited: true,
@@ -1380,17 +1256,16 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "50", "50.0" ],
 		other_values: [ "0", "100.0", "99.7", "47", "3.2" ],
 		invalid_values: [" -0.01", "100.2", "108", "-3" ]
 	},
 	"right": {
 		domProp: "right",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX requires position to be set */
 		/* XXX 0 may or may not be equal to auto */
 		initial_values: [ "auto" ],
 		other_values: [ "32px", "-3em", "12%" ],
 		invalid_values: []
 	},
 	"size": {
@@ -1460,45 +1335,41 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "50", "50.0" ],
 		other_values: [ "0", "100.0", "99.7", "47", "3.2" ],
 		invalid_values: [" -0.01", "100.2", "108", "-3" ]
 	},
 	"table-layout": {
 		domProp: "tableLayout",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "fixed" ],
 		invalid_values: []
 	},
 	"text-align": {
 		domProp: "textAlign",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		// don't know whether left and right are same as start
 		initial_values: [ "start" ],
 		other_values: [ "center", "justify" ],
 		invalid_values: []
 	},
 	"text-decoration": {
 		domProp: "textDecoration",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "underline", "overline", "line-through", "blink line-through underline", "underline overline line-through blink" ],
 		invalid_values: [ "underline none", "none underline", "line-through blink line-through" ]
 	},
 	"text-indent": {
 		domProp: "textIndent",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0" ],
 		other_values: [ "2em", "5%", "-10px" ],
 		invalid_values: []
 	},
 	"text-shadow": {
 		domProp: "textShadow",
 		inherited: false,
@@ -1506,55 +1377,50 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "2px 2px", "2px 2px 1px", "2px 2px green", "2px 2px 1px green", "green 2px 2px", "green 2px 2px 1px", "green 2px 2px, blue 1px 3px 4px" ],
 		invalid_values: [ "3% 3%", "2px 2px 2px 2px", "2px 2px, none" ]
 	},
 	"text-transform": {
 		domProp: "textTransform",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "capitalize", "uppercase", "lowercase" ],
 		invalid_values: []
 	},
 	"top": {
 		domProp: "top",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX requires position to be set */
 		/* XXX 0 may or may not be equal to auto */
 		initial_values: [ "auto" ],
 		other_values: [ "32px", "-3em", "12%" ],
 		invalid_values: []
 	},
 	"unicode-bidi": {
 		domProp: "unicodeBidi",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "embed", "bidi-override" ],
 		invalid_values: [ "auto", "none" ]
 	},
 	"vertical-align": {
 		domProp: "verticalAlign",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "baseline" ],
 		other_values: [ "sub", "super", "top", "text-top", "middle", "bottom", "text-bottom", "15%", "3px", "0.2em", "-5px", "-3%" ],
 		invalid_values: []
 	},
 	"visibility": {
 		domProp: "visibility",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "visible" ],
 		other_values: [ "hidden", "collapse" ],
 		invalid_values: []
 	},
 	"voice-family": {
 		domProp: "voiceFamily",
 		inherited: true,
@@ -1571,17 +1437,16 @@ var gCSSProperties = {
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "50", "50.0", "medium" ],
 		other_values: [ "0", "100.0", "99.7", "47", "3.2", "silent", "x-soft", "soft", "loud", "x-loud" ],
 		invalid_values: [" -0.01", "100.2", "108", "-3" ]
 	},
 	"white-space": {
 		domProp: "whiteSpace",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal" ],
 		other_values: [ "pre", "nowrap" ],
 		invalid_values: []
 	},
 	"widows": {
 		domProp: "widows",
 		inherited: true,
@@ -1594,307 +1459,274 @@ var gCSSProperties = {
 			// "0", // not clear whether it's valid or not.
 			// "-1", // not clear whether it's valid or not.
 			"0px", "3px"
 		]
 	},
 	"width": {
 		domProp: "width",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ " auto" ],
 		/* XXX these have prerequisites */
 		other_values: [ "15px", "3em", "15%" ],
 		invalid_values: []
 	},
 	"word-spacing": {
 		domProp: "wordSpacing",
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "normal", "0", "0px", "-0em" ],
 		other_values: [ "1em", "2px", "-3px" ],
 		invalid_values: []
 	},
 	"z-index": {
 		domProp: "zIndex",
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		/* XXX requires position */
 		initial_values: [ "auto" ],
 		other_values: [ "0", "3", "-7000", "12000" ],
 		invalid_values: [ "3.0", "17.5" ]
 	}
 	,
 	"clip-path": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(#mypath)", "url('404.svg#mypath')" ],
 		invalid_values: []
 	},
 	"clip-rule": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "nonzero" ],
 		other_values: [ "evenodd" ],
 		invalid_values: []
 	},
 	"color-interpolation": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "sRGB" ],
 		other_values: [ "auto", "linearRGB" ],
 		invalid_values: []
 	},
 	"color-interpolation-filters": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "linearRGB" ],
 		other_values: [ "sRGB", "auto" ],
 		invalid_values: []
 	},
 	"dominant-baseline": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "use-script", "no-change", "reset-size", "ideographic", "alphabetic", "hanging", "mathematical", "central", "middle", "text-after-edge", "text-before-edge" ],
 		invalid_values: []
 	},
 	"fill": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)" ],
 		other_values: [ "green", "#fc3", "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green', "none" ],
 		invalid_values: []
 	},
 	"fill-opacity": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1", "2.8", "1.000" ],
 		other_values: [ "0", "0.3", "-7.3" ],
 		invalid_values: []
 	},
 	"fill-rule": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "nonzero" ],
 		other_values: [ "evenodd" ],
 		invalid_values: []
 	},
 	"filter": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(#myfilt)" ],
 		invalid_values: [ "url(#myfilt) none" ]
 	},
 	"flood-color": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)" ],
 		other_values: [ "green", "#fc3" ],
 		invalid_values: [ "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green' ]
 	},
 	"flood-opacity": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1", "2.8", "1.000" ],
 		other_values: [ "0", "0.3", "-7.3" ],
 		invalid_values: []
 	},
 	"marker": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_TRUE_SHORTHAND,
 		subproperties: [ "marker-start", "marker-mid", "marker-end" ],
 		initial_values: [ "none" ],
 		other_values: [ "url(#mysym)" ],
 		invalid_values: [ "none none", "url(#mysym) url(#mysym)", "none url(#mysym)", "url(#mysym) none" ]
 	},
 	"marker-end": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(#mysym)" ],
 		invalid_values: []
 	},
 	"marker-mid": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(#mysym)" ],
 		invalid_values: []
 	},
 	"marker-start": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(#mysym)" ],
 		invalid_values: []
 	},
 	"mask": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "url(#mymask)" ],
 		invalid_values: []
 	},
 	"pointer-events": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "visiblepainted" ],
 		other_values: [ "visibleFill", "visiblestroke", "Visible", "painted", "fill", "stroke", "all", "none" ],
 		invalid_values: []
 	},
 	"shape-rendering": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "optimizeSpeed", "crispEdges", "geometricPrecision" ],
 		invalid_values: []
 	},
 	"stop-color": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)" ],
 		other_values: [ "green", "#fc3" ],
 		invalid_values: [ "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green' ]
 	},
 	"stop-opacity": {
 		domProp: null,
 		inherited: false,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1", "2.8", "1.000" ],
 		other_values: [ "0", "0.3", "-7.3" ],
 		invalid_values: []
 	},
 	"stroke": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)", "green", "#fc3", "url('#myserver')", "url(foo.svg#myserver)", 'url("#myserver") green' ],
 		invalid_values: []
 	},
 	"stroke-dasharray": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "none" ],
 		other_values: [ "5px,3px,2px", "  5px ,3px  , 2px ", "1px", "5%", "3em" ],
 		invalid_values: []
 	},
 	"stroke-dashoffset": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "0", "-0px", "0em" ],
 		other_values: [ "3px", "3%", "1em" ],
 		invalid_values: []
 	},
 	"stroke-linecap": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "butt" ],
 		other_values: [ "round", "square" ],
 		invalid_values: []
 	},
 	"stroke-linejoin": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "miter" ],
 		other_values: [ "round", "bevel" ],
 		invalid_values: []
 	},
 	"stroke-miterlimit": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "4" ],
 		other_values: [ "1", "7", "5000" ],
 		invalid_values: [ "0.9", "0", "-1", "3px" ]
 	},
 	"stroke-opacity": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1", "2.8", "1.000" ],
 		other_values: [ "0", "0.3", "-7.3" ],
 		invalid_values: []
 	},
 	"stroke-width": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "1px" ],
 		other_values: [ "0", "0px", "-0em", "17px", "0.2em" ],
 		invalid_values: [ "-0.1px", "-3px" ]
 	},
 	"text-anchor": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "start" ],
 		other_values: [ "middle", "end" ],
 		invalid_values: []
 	},
 	"text-rendering": {
 		domProp: null,
 		inherited: true,
-		backend_only: false,
 		type: CSS_TYPE_LONGHAND,
 		initial_values: [ "auto" ],
 		other_values: [ "optimizeSpeed", "optimizeLegibility", "geometricPrecision" ],
 		invalid_values: []
 	}
 }
--- a/layout/style/test/test_inherit_storage.html
+++ b/layout/style/test/test_inherit_storage.html
@@ -60,18 +60,16 @@ var gKnownFails2 = {
   "font": true,
   "list-style": true,
   "outline": true,
   "pause": true
 };
 
 function test_property(property)
 {
-  var pass = true;
-
   var info = gCSSProperties[property];
 
   function check_initial(sproperty) {
     var sinfo = gCSSProperties[sproperty];
     var val = gDeclaration.getPropertyValue(sproperty);
     is(val, "", "value of '" + sproperty + "' before we do anything");
     if (sinfo.domProp) {
       is(val, gDeclaration[sinfo.domProp],
--- a/layout/style/test/test_initial_storage.html
+++ b/layout/style/test/test_initial_storage.html
@@ -60,18 +60,16 @@ var gKnownFails2 = {
   "font": true,
   "list-style": true,
   "outline": true,
   "pause": true
 };
 
 function test_property(property)
 {
-  var pass = true;
-
   var info = gCSSProperties[property];
 
   function check_initial(sproperty) {
     var sinfo = gCSSProperties[sproperty];
     var val = gDeclaration.getPropertyValue(sproperty);
     is(val, "", "value of '" + sproperty + "' before we do anything");
     if (sinfo.domProp) {
       is(val, gDeclaration[sinfo.domProp],
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_value_storage.html
@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+-->
+<head>
+  <title>Test for parsing, storage, and serialization of CSS values</title>
+  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="property_database.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+<div id="testnode"></div>
+  
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for parsing, storage, and serialization of CSS values **/
+
+var gElement = document.getElementById("testnode");
+var gDeclaration = gElement.style;
+var gComputedStyle = window.getComputedStyle(gElement, "");
+
+function test_property(property)
+{
+  var info = gCSSProperties[property];
+
+  var test_computed = !("backend_only" in info);
+
+  function test_value(value) {
+    gDeclaration.setProperty(property, value, "");
+
+    var idx;
+    var step1val = gDeclaration.getPropertyValue(property);
+    var step1vals = [];
+    var step1ser = gDeclaration.cssText;
+    if ("subproperties" in info)
+      for (idx in info.subproperties)
+        step1vals.push(gDeclaration.getPropertyValue(info.subproperties[idx]));
+    var step1comp;
+    var step1comps = [];
+    if (test_computed && info.type != CSS_TYPE_TRUE_SHORTHAND)
+      step1comp = gComputedStyle.getPropertyValue(property);
+    if (test_computed && "subproperties" in info)
+      for (idx in info.subproperties)
+        step1comps.push(gComputedStyle.getPropertyValue(info.subproperties[idx]));
+
+    // We don't care particularly about the whitespace or the placement of
+    // semicolons, but for simplicity we'll test the current behavior.
+    is(step1ser, property + ": " + step1val + ";",
+       "serialization should match property value");
+
+    isnot(step1val, "", "setting '" + value + "' on '" + property);
+    if ("subproperties" in info)
+      for (idx in info.subproperties)
+        isnot(gDeclaration.getPropertyValue(info.subproperties[idx]), "",
+              "setting '" + value + "' on '" + property);
+
+    gDeclaration.removeProperty(property);
+    gDeclaration.setProperty(property, step1val, "");
+
+    is(gDeclaration.getPropertyValue(property), step1val,
+       "parse+serialize should be idempotent for '" +
+       property + ": " + value + "'");
+    if (test_computed && info.type != CSS_TYPE_TRUE_SHORTHAND) {
+      is(gComputedStyle.getPropertyValue(property), step1comp,
+         "parse+compute+serialize(computed) should be idempotent for '" +
+         property + ": " + value + "'");
+    }
+
+    if ("subproperties" in info) {
+      gDeclaration.removeProperty(property);
+      for (idx in info.subproperties) {
+        gDeclaration.setProperty(info.subproperties[idx], step1vals[idx], "");
+      }
+      is(gDeclaration.getPropertyValue(property), step1val,
+         "parse+split+serialize should be idempotent for '" +
+         property + ": " + value + "'");
+      if (test_computed) {
+        is(gComputedStyle.getPropertyValue(property), step1comp,
+           "parse+compute+split+serialize(computed) should be idempotent for '" +
+           property + ": " + value + "'");
+      }
+    }
+
+    if (test_computed && info.type != CSS_TYPE_TRUE_SHORTHAND) {
+      gDeclaration.removeProperty(property);
+      gDeclaration.setProperty(property, step1comp, "");
+      is(gComputedStyle.getPropertyValue(property), step1comp,
+         "parse+compute+serialize should be idempotent for '" +
+         property + ": " + value + "'");
+    }
+    if (test_computed && "subproperties" in info) {
+      gDeclaration.removeProperty(property);
+      for (idx in info.subproperties) {
+        gDeclaration.setProperty(info.subproperties[idx], step1comps[idx], "");
+      }
+      is(gComputedStyle.getPropertyValue(property), step1comp,
+         "parse+compute+split+serialize should be idempotent for '" +
+         property + ": " + value + "'");
+    }
+
+    gDeclaration.removeProperty(property);
+  }
+
+  var idx;
+  for (idx in info.initial_values)
+    test_value(info.initial_values[idx]);
+  for (idx in info.other_values)
+    test_value(info.other_values[idx]);
+}
+
+for (var prop in gCSSProperties)
+  test_property(prop);
+
+</script>
+</pre>
+</body>
+</html>