compressed style class map can yield corrupted css file
-------------------------------------------------------
Key: TRINIDAD-1561
URL: https://issues.apache.org/jira/browse/TRINIDAD-1561
Project: MyFaces Trinidad
Issue Type: Bug
Components: Skinning
Reporter: Jeanne Waldman
Assignee: Jeanne Waldman
Overview:
The compressed styleclass map stored in FileSystemStyleCache gets created once
based on the current StyleContext.
If the StyleContext changes, it's possible that the css will get corrupted.
You'll see something like
. .AFFoo {color: black}
instead of
.x10 .AFFoo {color: black}
This can lead to really strange skinning errors, and it has been hard to track
down in the past, but now I know what is going on.
Steps to Reproduce:
1. Set skin-family in trinidad-config.xml to purple
2. In demo's purpleSkin.css add
@agent ie
{
af|panelLabelAndMessage .Foo {
-tr-rule-ref: selector(".AFPanelFormLayoutHorizontalPadding:alias");
-tr-rule-ref: selector(".AFStartTextAlign:alias");
vertical-align: top;
padding-top: 3px;
padding-bottom: 0px;
-tr-rule-ref: selector(".AFDefaultFontFamily:alias");
color: purple;
background-color: red;
}
af|panelLabelAndMessage af|inputText::content {
background-color: yellow;
}
}
af|panelLabelAndMessage {}
3. Run in gecko
4. Then run in IE
5. In IE, view the generated css file
6. At the end you will see something like:
. .AFFoo{color: purple; background-color: red; etc.}
7. You should see a compressed style instead of a blank '.'
.xd0 .AFFoo {color: purple; background-color: red; etc}
Details:
All this happens in FileSystemStyleCache:
1. We get the styleSheetDocument - ALL selectors in the skinning file
2. We get the shortenedStyleMap using the styleSheetDocument pared down for
the specific StyleContext (gecko, for example)
3. There is an optimization to use "" as the shortened key if the style
selector has no properties
e.g., af|bar{} as opposed to af|bar{color:black}
4. Now when we switch to another context (internet explorer from gecko, or a
different locale), we are using the original shortenedStyleMap
which had "" for af|barsince for gecko there was no styling
5. BUT for the new context, af|bar has styling.
6. We do not render af|bar on the dom element (bug)
7. We render '.' in the css, so you see something like . .AFFoo
{blah blah blah} (bug)
Fix:
The fix is to simply create the compressed styleclass map using all styles, not
just the styles that match the StyleContext. Then even if we switch the
context, the styleclass will be in the map.
This is a one line fix.
In _getShortStyleClassMap change
document.getStyleSheets(context); to
document.getStyleSheets()
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.