71760ec285cf1a5326afd7ca45ec434b3c83b71b: Bug 773296 - Part 20: Return variables from getComputedStyle().get{,CSS}Property(). r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:45 +1100 - rev 160115
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 20: Return variables from getComputedStyle().get{,CSS}Property(). r=dbaron
e89737efe95f59a06d247b8403dc92f1c01a3e94: Bug 773296 - Part 19: Compare style structs even for the same rule node when variables have changed. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:45 +1100 - rev 160114
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 19: Compare style structs even for the same rule node when variables have changed. r=dbaron This makes updates work correctly when variable values change. Rather than handling nsStyleVariables with a DO_STRUCT_DIFFERENCE, we explicitly compare the two nsStyleVariables objects in nsStyleContext::CalcStyleDifference before looking at the other style structs. This is because we need to force those other style structs to be compared if variable values are changing. nsStyleVariables::CalcDifference still returns 0, since the change in variable values themselves doesn't require any updates.
e44cc02cb44df41932d59c3d0c0a420e85089dbb: Bug 773296 - Part 18: Add error reporting for invalid variable references. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:44 +1100 - rev 160113
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 18: Add error reporting for invalid variable references. r=dbaron This adds CSS parser error reporting for parsing of custom properties and normal properties that have variable references. When re-parsing a normal property that had a variable reference, we report any parse error to be at the beginning of the property value. This is because it is difficult to keep track of where exactly each variable substitution came from to point to the particular value that would have caused the parse error. For example, with this: :root { var-a: 1px 2px; var-b: 3px var(a); } p { margin: var(a) var(b); } we would end up resolving the value of 'margin' to: " 1px 2px 3px 1px 2px" In this string, the parse error occurs when we encounter the final "2px", but by this point we don't know where that value came from. So instead we just point to the line on which 'margin' was declared. We extend ErrorReporter with an OutputError overload that takes the specific line and column number to use in the error report to get this right, and we store the line and column number for each token stream we parse on the nsCSSValueTokenStream object.
0aab83be781eca49e67e388b971ef6348a81e182: Bug 773296 - Part 17: Resolve property values that have variable references at computed value time. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:44 +1100 - rev 160112
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 17: Resolve property values that have variable references at computed value time. r=dbaron This re-parses property values at computed value time if they had a specified value that was a token stream. We add a function nsRuleNode::ResolveVariableReferences that looks at all the values in the nsRuleData and calls in to a new nsCSSParser::ParsePropertyWithVariableReferences function if they have a token stream value. We add a nsCSSExpandedDataBlock::MapRuleInfoInto function that will take the re-parsed property value and copy it back into the nsRuleData. nsRuleNode::ResolveVariableReferences returns whether any variables were attempted to be resolved, so that nsRuleNode::WalkRuleTree wil recompute the rule detail in case any became 'inherit'.
c576c10f4a172e56e5cb5048cc2cc14e5a93dad5: Bug 773296 - Part 16a: Followup to move to using nsCSSValueSharedList in OMTA code. r=roc
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:44 +1100 - rev 160111
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 16a: Followup to move to using nsCSSValueSharedList in OMTA code. r=roc
f5acf7d3cd8f8caaa3c17734d529ba78e5e5efc7: Bug 773296 - Part 16: Add a ref-counted list nsCSSValue unit and use it for tranform lists; hold a strong reference to one on nsStyleDisplay. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:44 +1100 - rev 160110
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 16: Add a ref-counted list nsCSSValue unit and use it for tranform lists; hold a strong reference to one on nsStyleDisplay. r=dbaron This adds a new eCSSUnit_SharedList type for nsCSSValue, which is a reference counted object that contains an nsCSSValueList. We need this so that nsStyleDisplay::mSpecifiedTransform can hold a strong reference to a specified transform list value. When 'transform' is specified using a variable reference, the resulting nsCSSValue does not stick around in the Declaration object, so we wouldn't be guaranteed that it lives long enough for nsStyleDisplay to keep referencing it.
ec31b9795a5df73092f822b5d315a0c56ad7460e: Bug 773296 - Part 15: Factor out mapping of a single property from an nsCSSCompressedDataBlock to an nsRuleData. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:43 +1100 - rev 160109
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 15: Factor out mapping of a single property from an nsCSSCompressedDataBlock to an nsRuleData. r=dbaron This factors out the part of nsCSSCompressedDataBlock::MapRuleInfoInto that starts image loading and maybe-copies an nsCSSValue into an nsRuleData. We will need this functionality for mapping re-parsed properties that had variable references into an nsRuleData, which will be done from an nsCSSExpandedDataBlock.
39833de60ed769bedb8bd05ae272059ebeb8488c: Bug 773296 - Part 14: Add an nsCSSProps::IsInherited function. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:43 +1100 - rev 160108
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 14: Add an nsCSSProps::IsInherited function. r=dbaron Add a helper function to nsCSSProps to look up whether a given nsCSSProperty lives in a style struct for inherited properties.
27256a46adbbec1f866c38502a426bd80bc40f1d: Bug 773296 - Part 13: Parse properties that use variable references and store them as eCSSUnit_TokenStream values. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:43 +1100 - rev 160107
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 13: Parse properties that use variable references and store them as eCSSUnit_TokenStream values. r=dbaron This adds functionality to nsCSSParser to recognise properties with variable references and store their recorded token stream as an eCSSUnit_TokenStream nsCSSValue.
88fd50578a763adeaefbf1214e3e4c5cf75598ac: Bug 773296 - Part 12: Record whether we are parsing an @supports condition. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:42 +1100 - rev 160106
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 12: Record whether we are parsing an @supports condition. r=dbaron This stores on the nsCSSParser whether we are somewhere in the middle of parsing an @supports condition. Because @supports condition parsing uses the scanner recording function (to save its conditionText), and variable reference containing values also need it, we can't do both at once. Luckily, if we're parsing an @supports condition, we don't really need to store the token stream text; we only need to know if it was valid, and we don't need its actual value later. So we use this flag later to see if we can skip turning on scanner recording while parsing variable reference containing values.
246d623b5259994d18d02abb5321182ea42ce514: Bug 773296 - Part 11: Give nsCSSParser and nsCSSScanner the ability to save/restore their current input state. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:42 +1100 - rev 160105
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 11: Give nsCSSParser and nsCSSScanner the ability to save/restore their current input state. r=dbaron This adds functions to nsCSSParser and nsCSSScanner that let us save the current input position (and corresponding information like line/column number) and parser pushback, and be able to restore it later. We'll use this when rewinding the scanner after we first encounter a property with a variable reference and go back to reparse it as a token stream.
adaae40774cbef330c4f181518ec8c4afc9e48ad: Bug 773296 - Part 10: Add a new eCSSUnit_TokenStream type for storing unparsed CSS values. p=ebassi,heycam r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:42 +1100 - rev 160104
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 10: Add a new eCSSUnit_TokenStream type for storing unparsed CSS values. p=ebassi,heycam r=dbaron Patch co-authored by Emmanuele Bassi <ebassi@gmail.com> This adds a new nsCSSValue unit type to represent an unparsed stream of CSS tokens as a specified value. This is what properties that have a variable reference get as their specified value. On the nsCSSValueTokenStream object that is used when mUnit == eCSSUnit_TokenStream, we store two property IDs: first, the property ID for the longhand that this token stream value is the value for. We pass this back in to nsCSSParser::ParseProperty at computed value time, when we need to re-parse the property. Second is the shorthand property ID, if we used a variable reference in a shorthand. In such a case, we store the token stream value for each of the corresponding longhand properties. This is because shorthands don't actually get any storage in an nsRuleData, and because any of the longhands might be overwritten by subsequent declarations, we need to keep the token stream somewhere. We also store other information on the nsCSSValueTokenStream required by the CSS parser (base URI, etc.).
6c381791e1a1d10cc488beb07c9ebd567ef7bde1: Bug 773296 - Part 9: Give nsCSSScanner the ability to remember when it encounters a "var(" token. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:42 +1100 - rev 160103
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 9: Give nsCSSScanner the ability to remember when it encounters a "var(" token. r=dbaron This is the first part of handling variable references in regular properties. We have the scanner set a flag whenever it returns a "var(" token, so that when we come to the end of parsing a property that failed, we know that it is because of a variable reference.
d08b6b8c6ecaa462871d1cb2e4522ea85ae10b01: Bug 773296 - Part 8: Resolve and compute CSS variables. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:41 +1100 - rev 160102
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 8: Resolve and compute CSS variables. r=dbaron We add a new class CSSVariableResolver whose job is to take the inherited computed variables and the specified variable declarations and to perform cycle removal and resolution of the variables, storing the result in the CSSVariableValues object on an nsStyleVariables. We use CSSVariableResolver in nsRuleNode::ComputeVariablesData. The variable resolver does this: 1. Asks the CSSVariableValues and CSSVariableDeclarations objects to add their variables to it. 2. Calls in to a new nsCSSParser function EnumerateVariableReferences that informs the resolver which other variables a given variable references, and by doing so, builds a graph of variable dependencies. 3. Removes variables involved in cyclic references using Tarjan's strongly connected component algorithm, setting those variables to have an invalid value. 4. Calls in to a new nsCSSParser function ResolveVariableValue to resolve the remaining valid variables by substituting variable references. We extend nsCSSParser::ParseValueWithVariables to take a callback function to be invoked when encountering a variable reference. This lets EnumerateVariableReferences re-use ParseValueWithVariables. CSSParserImpl::ResolveValueWithVariableReferences needs different error handling behaviour from ParseValueWithVariables, so we don't re-use it. CSSParserImpl::AppendImpliedEOFCharacters is used to take the value returned from nsCSSScanner::GetImpliedEOFCharacters while resolving variable references that were declared using custom properties that encountered EOF before being closed properly. The SeparatorRequiredBetweenTokens helper function in nsCSSParser.cpp implements the serialization rules in CSS Syntax Module Level 3: https://dvcs.w3.org/hg/csswg/raw-file/3479cdefc59a/css-syntax/Overview.html#serialization
407ca304dcdad27a18da76261dc82bd07b2bb1a5: Bug 773296 - Part 7: Add a field to nsStyleVariables to store computed variable values. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:41 +1100 - rev 160101
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 7: Add a field to nsStyleVariables to store computed variable values. r=dbaron This defines a class CSSVariableValues which is used to store computed variable values. We store them a bit differently from CSSVariableDeclarations -- here we have a hash table of variable names to integer IDs, and then an array of variables where the array index is the ID. This is because later on we'll want a stable order for the variables to return from DOM APIs. In addition to the string value of the variable, we store the type of the first and last token of the variable value. This information will be used when resolving entire variable reference containing values, to determine when to insert "/**/" before and after a resolved var(blah) token. We add a CSSVariableValues member to nsStyleVariables.
65d7e8f8497875b8618f6e1b6c9af03aa1550cba: Bug 773296 - Part 6: Add enum to represent types of CSS tokens involved in serialization. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:41 +1100 - rev 160100
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 6: Add enum to represent types of CSS tokens involved in serialization. r=dbaron This adds an enum to nsCSSScanner.h that represents the types of tokens we need to consider when pasting together two adjacent tokens during serialization or variable resolution. For example with: var-a:orange; var-b:red; color:var(a)var(b); we need to generate the string "orange/**/red" to parse for the value of 'color'.
8eae39ddcb7734f710ff2252a213f4d0dbe482aa: Bug 773296 - Part 5: Map variables on a Declaration to nsRuleData. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:41 +1100 - rev 160099
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 5: Map variables on a Declaration to nsRuleData. r=dbaron This adds a CSSVariableDeclarations object to nsRuleData and adds a MapRuleInfoInto function to CSSVariableDeclarations so the can copy variable declarations into a nsRuleData's object. We call that from Declaration::Map{Normal,Important}RuleInfoInto. We make HasImportantData return true if we have important variables but no important non-custom properties on a declaration, since that is used to determine whether we have a rule node for important declarations. This means MapImportantRuleInfoInto can no longer assume that mImportantData is non-null.
6d1b73fffa7708f5ba0289c3b878b5ce9ca75323: Bug 773296 - Part 4: Add style struct to store CSS variables. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:40 +1100 - rev 160098
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 4: Add style struct to store CSS variables. r=dbaron This adds an nsStyleVariables on which computed variable values will be stored. We don't actually have any properties assigned to nsStyleVariables; eCSSPropertyExtra_Variables which we added earlier isn't a real property. To avoid compiler errors for gVariableFlags being a zero length array, we stick a dummy entry in there. nsRuleNode::ComputeVariablesData does nothing for the moment. nsStyleVariable nsChangeHint calculations always return 0, as later we will compare the actual properties that reference variables to see what changes are required for them.
7069d52b1e601f6bc55b4609e055233b7f5f734d: Bug 773296 - Part 3: Allow more than 27 style structs. r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:40 +1100 - rev 160097
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 3: Allow more than 27 style structs. r=dbaron This bumps up nsStyleContext::mBits to a uint64_t so that it can fit another style struct. If we're going to need to keep at least 27 style structs, it might be better to split mBits up into two uint32_ts: one for the flags and one for the style struct bits.
e6e4e9b6cf6a1a84b4c56882a10dffb908884150: Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Cameron McCormack <cam@mcc.id.au> - Thu, 12 Dec 2013 13:09:40 +1100 - rev 160096
Push 3938 by cbook@mozilla.com at Thu, 12 Dec 2013 15:09:56 +0000
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron Patch co-authored by Emmanuele Bassi <ebassi@gmail.com> This defines a CSSVariableDeclarations class that holds a set of variable declarations. This is at the specified value stage, so values can either be 'initial', 'inherit' or a token stream (which is what you normally have). The variables are stored in a hash table. Although it's a bit of a hack, we store 'initial' and 'inherit' using special string values that can't be valid token streams (we use "!" and ";"). Declaration objects now can have two CSSVariableDeclarations objects on them, to store normal and !important variable declarations. So that we keep preserving the order of declarations on the object, we inflate mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards represent custom properties. mVariableOrder stores the names of the variables corresponding to those entries in mOrder. We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which is used to represent any custom property name. nsCSSProps::LookupProperty can return this value. The changes to nsCSSParser are straightforward. Custom properties are parsed and checked for syntactic validity (e.g. "var(a,)" being invalid) and stored on the Declaration. We use nsCSSScanner's recording ability to grab the unparsed CSS string corresponding to the variable's value.
(0) -100000 -30000 -10000 -3000 -1000 -300 -100 -50 -20 +20 +50 +100 +300 +1000 +3000 +10000 +30000 +100000 tip