summaryrefslogtreecommitdiff
path: root/src/css.hh
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2014-03-05 21:48:42 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2014-03-05 21:48:42 +0100
commit4ef5572a6256155b6213987f71f4d836cb891ffe (patch)
treed44acbc088d4d97421a5798b5184b0d2f144baf4 /src/css.hh
parent0b04276e8e917bad961e1178a959483a7aeb5620 (diff)
use a singe matchCache per CssContext
This fixes a crash with the following HTML: <head> <style type="text/css"> .first .second .third{ border-top-color:#aaa !important; } #n .a, .b{ color: #aaa !important; border:#bbb; } </style> </head> <body> <div id="submit" value="Submit" class="a"> jhu </div> </body> The problem is that CssSelectors can be shared between normal and !important rules. The matchCacheOffset was overwritten in that case causing the crash on access. noticed-by and test-case-by: corvid
Diffstat (limited to 'src/css.hh')
-rw-r--r--src/css.hh20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/css.hh b/src/css.hh
index 8bf33545..22e7e700 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -402,16 +402,20 @@ class CssSelector {
void addSimpleSelector (Combinator c);
inline CssSimpleSelector *top () {
return selectorList.getRef (selectorList.size () - 1)->selector;
- };
+ }
inline int size () { return selectorList.size (); };
inline bool match (Doctree *dt, const DoctreeNode *node,
MatchCache *matchCache) {
return match (dt, node, selectorList.size () - 1, COMB_NONE,
matchCache);
- };
+ }
inline void setMatchCacheOffset (int mo) {
- matchCacheOffset = mo;
- };
+ if (matchCacheOffset == -1)
+ matchCacheOffset = mo;
+ }
+ inline int getRequiredMatchCache () {
+ return matchCacheOffset + size ();
+ }
int specificity ();
bool checksPseudoClass ();
void print ();
@@ -484,14 +488,14 @@ class CssStyleSheet {
RuleList elementTable[ntags], anyTable;
RuleMap idTable, classTable;
+ int requiredMatchCache;
public:
- int matchCacheOffset;
-
- CssStyleSheet () { matchCacheOffset = 0; }
+ CssStyleSheet () { requiredMatchCache = 0; }
void addRule (CssRule *rule);
void apply (CssPropertyList *props, Doctree *docTree,
const DoctreeNode *node, MatchCache *matchCache) const;
+ int getRequiredMatchCache () { return requiredMatchCache; }
};
/**
@@ -501,7 +505,7 @@ class CssContext {
private:
static CssStyleSheet userAgentSheet;
CssStyleSheet sheet[CSS_PRIMARY_USER_IMPORTANT + 1];
- MatchCache matchCache[CSS_PRIMARY_USER_IMPORTANT + 1];
+ MatchCache matchCache;
int pos;
public: