summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/text/qcssparser.cpp21
-rw-r--r--src/gui/text/qcssparser_p.h6
-rw-r--r--src/gui/text/qcssscanner.cpp734
-rw-r--r--tests/auto/gui/text/qcssparser/tst_qcssparser.cpp50
-rw-r--r--util/lexgen/css3-simplified.lexgen (renamed from util/lexgen/css2-simplified.lexgen)1
5 files changed, 433 insertions, 379 deletions
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp
index 5138f7e94c..72c5d5ff33 100644
--- a/src/gui/text/qcssparser.cpp
+++ b/src/gui/text/qcssparser.cpp
@@ -1867,12 +1867,15 @@ bool StyleSelector::selectorMatches(const Selector &selector, NodePtr node)
do {
match = basicSelectorMatches(sel, node);
if (!match) {
- if (sel.relationToNext == BasicSelector::MatchNextSelectorIfParent
- || i == selector.basicSelectors.count() - 1) // first element must always match!
+ if (i == selector.basicSelectors.count() - 1) // first element must always match!
+ break;
+ if (sel.relationToNext != BasicSelector::MatchNextSelectorIfAncestor &&
+ sel.relationToNext != BasicSelector::MatchNextSelectorIfIndirectAdjecent)
break;
}
- if (match || sel.relationToNext != BasicSelector::MatchNextSelectorIfAncestor)
+ if (match || (sel.relationToNext != BasicSelector::MatchNextSelectorIfAncestor &&
+ sel.relationToNext != BasicSelector::MatchNextSelectorIfIndirectAdjecent))
--i;
if (i < 0)
@@ -1885,16 +1888,18 @@ bool StyleSelector::selectorMatches(const Selector &selector, NodePtr node)
NodePtr nextParent = parentNode(node);
freeNode(node);
node = nextParent;
- } else if (sel.relationToNext == BasicSelector::MatchNextSelectorIfPreceeds) {
+ } else if (sel.relationToNext == BasicSelector::MatchNextSelectorIfDirectAdjecent
+ || sel.relationToNext == BasicSelector::MatchNextSelectorIfIndirectAdjecent) {
NodePtr previousSibling = previousSiblingNode(node);
freeNode(node);
node = previousSibling;
- }
+ }
if (isNullNode(node)) {
match = false;
break;
}
- } while (i >= 0 && (match || sel.relationToNext == BasicSelector::MatchNextSelectorIfAncestor));
+ } while (i >= 0 && (match || sel.relationToNext == BasicSelector::MatchNextSelectorIfAncestor
+ || sel.relationToNext == BasicSelector::MatchNextSelectorIfIndirectAdjecent));
freeNode(node);
@@ -2356,9 +2361,11 @@ bool Parser::parseCombinator(BasicSelector::Relation *relation)
prev();
}
if (test(PLUS)) {
- *relation = BasicSelector::MatchNextSelectorIfPreceeds;
+ *relation = BasicSelector::MatchNextSelectorIfDirectAdjecent;
} else if (test(GREATER)) {
*relation = BasicSelector::MatchNextSelectorIfParent;
+ } else if (test(TILDE)) {
+ *relation = BasicSelector::MatchNextSelectorIfIndirectAdjecent;
}
skipSpace();
return true;
diff --git a/src/gui/text/qcssparser_p.h b/src/gui/text/qcssparser_p.h
index c40cb508fa..f5cd5395b2 100644
--- a/src/gui/text/qcssparser_p.h
+++ b/src/gui/text/qcssparser_p.h
@@ -561,7 +561,8 @@ struct BasicSelector
NoRelation,
MatchNextSelectorIfAncestor,
MatchNextSelectorIfParent,
- MatchNextSelectorIfPreceeds
+ MatchNextSelectorIfDirectAdjecent,
+ MatchNextSelectorIfIndirectAdjecent,
};
QString elementName;
@@ -690,6 +691,7 @@ enum TokenType {
PLUS,
GREATER,
COMMA,
+ TILDE,
STRING,
INVALID,
@@ -789,7 +791,7 @@ public:
inline bool testImport() { return testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("import")); }
inline bool testMedia() { return testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("media")); }
inline bool testPage() { return testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("page")); }
- inline bool testCombinator() { return test(PLUS) || test(GREATER) || test(S); }
+ inline bool testCombinator() { return test(PLUS) || test(GREATER) || test(TILDE) || test(S); }
inline bool testProperty() { return test(IDENT); }
bool testTerm();
inline bool testExpr() { return testTerm(); }
diff --git a/src/gui/text/qcssscanner.cpp b/src/gui/text/qcssscanner.cpp
index 9ee075e492..33dc01c8bc 100644
--- a/src/gui/text/qcssscanner.cpp
+++ b/src/gui/text/qcssscanner.cpp
@@ -177,42 +177,44 @@ int QCssScanner_Generated::lex()
goto state_20;
if (ch.unicode() == 123)
goto state_27;
+ if (ch.unicode() == 126)
+ goto state_32;
goto out;
state_3:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
state_4:
ch = next();
if (ch.unicode() == 45)
- goto state_35;
+ goto state_36;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_35;
- if (ch.unicode() == 92)
goto state_36;
+ if (ch.unicode() == 92)
+ goto state_37;
if (ch.unicode() == 95)
- goto state_35;
+ goto state_36;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_35;
+ goto state_36;
goto out;
state_5:
ch = next();
@@ -226,23 +228,23 @@ int QCssScanner_Generated::lex()
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
state_9:
lastAcceptingPos = pos;
@@ -266,7 +268,7 @@ int QCssScanner_Generated::lex()
token = QCss::MINUS;
ch = next();
if (ch.unicode() == 45)
- goto state_42;
+ goto state_43;
if (ch.unicode() == 92)
goto state_23;
if (ch.unicode() == 95)
@@ -279,7 +281,7 @@ int QCssScanner_Generated::lex()
token = QCss::DOT;
ch = next();
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_43;
+ goto state_44;
goto out;
state_14:
lastAcceptingPos = pos;
@@ -295,24 +297,24 @@ int QCssScanner_Generated::lex()
token = QCss::NUMBER;
ch = next();
if (ch.unicode() == 37)
- goto state_45;
- if (ch.unicode() == 45)
goto state_46;
- if (ch.unicode() == 46)
+ if (ch.unicode() == 45)
goto state_47;
- if (ch.unicode() >= 48 && ch.unicode() <= 57)
+ if (ch.unicode() == 46)
goto state_48;
- if (ch.unicode() == 92)
+ if (ch.unicode() >= 48 && ch.unicode() <= 57)
goto state_49;
- if (ch.unicode() == 95)
+ if (ch.unicode() == 92)
goto state_50;
+ if (ch.unicode() == 95)
+ goto state_51;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_50;
+ goto state_51;
goto out;
state_18:
ch = next();
if (ch.unicode() == 33)
- goto state_51;
+ goto state_52;
goto out;
state_20:
lastAcceptingPos = pos;
@@ -321,26 +323,26 @@ int QCssScanner_Generated::lex()
state_21:
ch = next();
if (ch.unicode() == 45)
- goto state_52;
- if (ch.unicode() == 92)
goto state_53;
- if (ch.unicode() == 95)
+ if (ch.unicode() == 92)
goto state_54;
+ if (ch.unicode() == 95)
+ goto state_55;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_54;
+ goto state_55;
goto out;
state_23:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_55;
+ goto state_56;
if (ch.unicode() == 11)
- goto state_55;
+ goto state_56;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_55;
+ goto state_56;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_55;
+ goto state_56;
if (ch.unicode() >= 103)
- goto state_55;
+ goto state_56;
goto out;
state_25:
ch = next();
@@ -354,17 +356,17 @@ int QCssScanner_Generated::lex()
token = QCss::IDENT;
ch = next();
if (ch.unicode() == 40)
- goto state_57;
- if (ch.unicode() == 45)
goto state_58;
+ if (ch.unicode() == 45)
+ goto state_59;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_58;
- if (ch.unicode() == 92)
goto state_59;
+ if (ch.unicode() == 92)
+ goto state_60;
if (ch.unicode() == 95)
- goto state_58;
+ goto state_59;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_58;
+ goto state_59;
goto out;
state_27:
lastAcceptingPos = pos;
@@ -380,6 +382,8 @@ int QCssScanner_Generated::lex()
}
goto out;
state_30:
+ lastAcceptingPos = pos;
+ token = QCss::TILDE;
ch = next();
if (ch.unicode() == 61) {
token = QCss::INCLUDES;
@@ -404,757 +408,763 @@ int QCssScanner_Generated::lex()
goto state_20;
if (ch.unicode() == 123)
goto state_27;
+ if (ch.unicode() == 126)
+ goto state_32;
goto out;
state_32:
lastAcceptingPos = pos;
+ token = QCss::TILDE;
+ goto out;
+ state_33:
+ lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
- state_33:
+ state_34:
lastAcceptingPos = pos;
token = QCss::STRING;
goto out;
- state_34:
+ state_35:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_62;
- if (ch.unicode() == 10)
goto state_63;
+ if (ch.unicode() == 10)
+ goto state_64;
if (ch.unicode() == 11)
- goto state_62;
+ goto state_63;
if (ch.unicode() == 12)
- goto state_64;
- if (ch.unicode() == 13)
goto state_65;
+ if (ch.unicode() == 13)
+ goto state_66;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_62;
+ goto state_63;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_62;
+ goto state_63;
if (ch.unicode() >= 103)
- goto state_62;
+ goto state_63;
goto out;
- state_35:
+ state_36:
lastAcceptingPos = pos;
token = QCss::HASH;
ch = next();
if (ch.unicode() == 45)
- goto state_66;
+ goto state_67;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_66;
- if (ch.unicode() == 92)
goto state_67;
+ if (ch.unicode() == 92)
+ goto state_68;
if (ch.unicode() == 95)
- goto state_66;
+ goto state_67;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_66;
+ goto state_67;
goto out;
- state_36:
+ state_37:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_68;
+ goto state_69;
if (ch.unicode() == 11)
- goto state_68;
+ goto state_69;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_68;
+ goto state_69;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_68;
+ goto state_69;
if (ch.unicode() >= 103)
- goto state_68;
+ goto state_69;
goto out;
- state_38:
+ state_39:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
- state_39:
+ state_40:
lastAcceptingPos = pos;
token = QCss::STRING;
goto out;
- state_40:
+ state_41:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_69;
- if (ch.unicode() == 10)
goto state_70;
+ if (ch.unicode() == 10)
+ goto state_71;
if (ch.unicode() == 11)
- goto state_69;
+ goto state_70;
if (ch.unicode() == 12)
- goto state_71;
- if (ch.unicode() == 13)
goto state_72;
+ if (ch.unicode() == 13)
+ goto state_73;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_69;
+ goto state_70;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_69;
+ goto state_70;
if (ch.unicode() >= 103)
- goto state_69;
+ goto state_70;
goto out;
- state_42:
+ state_43:
ch = next();
if (ch.unicode() == 62) {
token = QCss::CDC;
goto found;
}
goto out;
- state_43:
+ state_44:
lastAcceptingPos = pos;
token = QCss::NUMBER;
ch = next();
if (ch.unicode() == 37)
- goto state_45;
- if (ch.unicode() == 45)
goto state_46;
+ if (ch.unicode() == 45)
+ goto state_47;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_74;
+ goto state_75;
if (ch.unicode() == 92)
- goto state_49;
- if (ch.unicode() == 95)
goto state_50;
+ if (ch.unicode() == 95)
+ goto state_51;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_50;
+ goto state_51;
goto out;
- state_45:
+ state_46:
lastAcceptingPos = pos;
token = QCss::PERCENTAGE;
goto out;
- state_46:
+ state_47:
ch = next();
if (ch.unicode() == 92)
- goto state_49;
- if (ch.unicode() == 95)
goto state_50;
+ if (ch.unicode() == 95)
+ goto state_51;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_50;
+ goto state_51;
goto out;
- state_47:
+ state_48:
ch = next();
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_43;
+ goto state_44;
goto out;
- state_48:
+ state_49:
lastAcceptingPos = pos;
token = QCss::NUMBER;
ch = next();
if (ch.unicode() == 37)
- goto state_45;
- if (ch.unicode() == 45)
goto state_46;
- if (ch.unicode() == 46)
+ if (ch.unicode() == 45)
goto state_47;
- if (ch.unicode() >= 48 && ch.unicode() <= 57)
+ if (ch.unicode() == 46)
goto state_48;
- if (ch.unicode() == 92)
+ if (ch.unicode() >= 48 && ch.unicode() <= 57)
goto state_49;
- if (ch.unicode() == 95)
+ if (ch.unicode() == 92)
goto state_50;
+ if (ch.unicode() == 95)
+ goto state_51;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_50;
+ goto state_51;
goto out;
- state_49:
+ state_50:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_75;
+ goto state_76;
if (ch.unicode() == 11)
- goto state_75;
+ goto state_76;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_75;
+ goto state_76;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_75;
+ goto state_76;
if (ch.unicode() >= 103)
- goto state_75;
+ goto state_76;
goto out;
- state_50:
+ state_51:
lastAcceptingPos = pos;
token = QCss::LENGTH;
ch = next();
if (ch.unicode() == 45)
- goto state_76;
+ goto state_77;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_76;
- if (ch.unicode() == 92)
goto state_77;
+ if (ch.unicode() == 92)
+ goto state_78;
if (ch.unicode() == 95)
- goto state_76;
+ goto state_77;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_76;
+ goto state_77;
goto out;
- state_51:
+ state_52:
ch = next();
if (ch.unicode() == 45)
- goto state_78;
+ goto state_79;
goto out;
- state_52:
+ state_53:
ch = next();
if (ch.unicode() == 92)
- goto state_53;
- if (ch.unicode() == 95)
goto state_54;
+ if (ch.unicode() == 95)
+ goto state_55;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_54;
+ goto state_55;
goto out;
- state_53:
+ state_54:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_79;
+ goto state_80;
if (ch.unicode() == 11)
- goto state_79;
+ goto state_80;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_79;
+ goto state_80;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_79;
+ goto state_80;
if (ch.unicode() >= 103)
- goto state_79;
+ goto state_80;
goto out;
- state_54:
+ state_55:
lastAcceptingPos = pos;
token = QCss::ATKEYWORD_SYM;
ch = next();
if (ch.unicode() == 45)
- goto state_80;
+ goto state_81;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_80;
- if (ch.unicode() == 92)
goto state_81;
+ if (ch.unicode() == 92)
+ goto state_82;
if (ch.unicode() == 95)
- goto state_80;
+ goto state_81;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_80;
+ goto state_81;
goto out;
- state_55:
+ state_56:
lastAcceptingPos = pos;
token = QCss::IDENT;
ch = next();
if (ch.unicode() == 40)
- goto state_57;
- if (ch.unicode() == 45)
goto state_58;
+ if (ch.unicode() == 45)
+ goto state_59;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_58;
- if (ch.unicode() == 92)
goto state_59;
+ if (ch.unicode() == 92)
+ goto state_60;
if (ch.unicode() == 95)
- goto state_58;
+ goto state_59;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_58;
+ goto state_59;
goto out;
- state_57:
+ state_58:
lastAcceptingPos = pos;
token = QCss::FUNCTION;
goto out;
- state_58:
+ state_59:
lastAcceptingPos = pos;
token = QCss::IDENT;
ch = next();
if (ch.unicode() == 40)
- goto state_57;
- if (ch.unicode() == 45)
goto state_58;
+ if (ch.unicode() == 45)
+ goto state_59;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_58;
- if (ch.unicode() == 92)
goto state_59;
+ if (ch.unicode() == 92)
+ goto state_60;
if (ch.unicode() == 95)
- goto state_58;
+ goto state_59;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_58;
+ goto state_59;
goto out;
- state_59:
+ state_60:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_82;
+ goto state_83;
if (ch.unicode() == 11)
- goto state_82;
+ goto state_83;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_82;
+ goto state_83;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_82;
+ goto state_83;
if (ch.unicode() >= 103)
- goto state_82;
+ goto state_83;
goto out;
- state_62:
+ state_63:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
- state_63:
+ state_64:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
- state_64:
+ state_65:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
- state_65:
+ state_66:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 10)
- goto state_83;
+ goto state_84;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
- state_66:
+ state_67:
lastAcceptingPos = pos;
token = QCss::HASH;
ch = next();
if (ch.unicode() == 45)
- goto state_66;
+ goto state_67;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_66;
- if (ch.unicode() == 92)
goto state_67;
+ if (ch.unicode() == 92)
+ goto state_68;
if (ch.unicode() == 95)
- goto state_66;
+ goto state_67;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_66;
+ goto state_67;
goto out;
- state_67:
+ state_68:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_84;
+ goto state_85;
if (ch.unicode() == 11)
- goto state_84;
+ goto state_85;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_84;
+ goto state_85;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_84;
+ goto state_85;
if (ch.unicode() >= 103)
- goto state_84;
+ goto state_85;
goto out;
- state_68:
+ state_69:
lastAcceptingPos = pos;
token = QCss::HASH;
ch = next();
if (ch.unicode() == 45)
- goto state_66;
+ goto state_67;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_66;
- if (ch.unicode() == 92)
goto state_67;
+ if (ch.unicode() == 92)
+ goto state_68;
if (ch.unicode() == 95)
- goto state_66;
+ goto state_67;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_66;
+ goto state_67;
goto out;
- state_69:
+ state_70:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
- state_70:
+ state_71:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
- state_71:
+ state_72:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
- state_72:
+ state_73:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 10)
- goto state_85;
+ goto state_86;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
- state_74:
+ state_75:
lastAcceptingPos = pos;
token = QCss::NUMBER;
ch = next();
if (ch.unicode() == 37)
- goto state_45;
- if (ch.unicode() == 45)
goto state_46;
+ if (ch.unicode() == 45)
+ goto state_47;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_74;
+ goto state_75;
if (ch.unicode() == 92)
- goto state_49;
- if (ch.unicode() == 95)
goto state_50;
+ if (ch.unicode() == 95)
+ goto state_51;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_50;
+ goto state_51;
goto out;
- state_75:
+ state_76:
lastAcceptingPos = pos;
token = QCss::LENGTH;
ch = next();
if (ch.unicode() == 45)
- goto state_76;
+ goto state_77;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_76;
- if (ch.unicode() == 92)
goto state_77;
+ if (ch.unicode() == 92)
+ goto state_78;
if (ch.unicode() == 95)
- goto state_76;
+ goto state_77;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_76;
+ goto state_77;
goto out;
- state_76:
+ state_77:
lastAcceptingPos = pos;
token = QCss::LENGTH;
ch = next();
if (ch.unicode() == 45)
- goto state_76;
+ goto state_77;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_76;
- if (ch.unicode() == 92)
goto state_77;
+ if (ch.unicode() == 92)
+ goto state_78;
if (ch.unicode() == 95)
- goto state_76;
+ goto state_77;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_76;
+ goto state_77;
goto out;
- state_77:
+ state_78:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_86;
+ goto state_87;
if (ch.unicode() == 11)
- goto state_86;
+ goto state_87;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_86;
+ goto state_87;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_86;
+ goto state_87;
if (ch.unicode() >= 103)
- goto state_86;
+ goto state_87;
goto out;
- state_78:
+ state_79:
ch = next();
if (ch.unicode() == 45) {
token = QCss::CDO;
goto found;
}
goto out;
- state_79:
+ state_80:
lastAcceptingPos = pos;
token = QCss::ATKEYWORD_SYM;
ch = next();
if (ch.unicode() == 45)
- goto state_80;
+ goto state_81;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_80;
- if (ch.unicode() == 92)
goto state_81;
+ if (ch.unicode() == 92)
+ goto state_82;
if (ch.unicode() == 95)
- goto state_80;
+ goto state_81;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_80;
+ goto state_81;
goto out;
- state_80:
+ state_81:
lastAcceptingPos = pos;
token = QCss::ATKEYWORD_SYM;
ch = next();
if (ch.unicode() == 45)
- goto state_80;
+ goto state_81;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_80;
- if (ch.unicode() == 92)
goto state_81;
+ if (ch.unicode() == 92)
+ goto state_82;
if (ch.unicode() == 95)
- goto state_80;
+ goto state_81;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_80;
+ goto state_81;
goto out;
- state_81:
+ state_82:
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_88;
+ goto state_89;
if (ch.unicode() == 11)
- goto state_88;
+ goto state_89;
if (ch.unicode() >= 14 && ch.unicode() <= 47)
- goto state_88;
+ goto state_89;
if (ch.unicode() >= 58 && ch.unicode() <= 96)
- goto state_88;
+ goto state_89;
if (ch.unicode() >= 103)
- goto state_88;
+ goto state_89;
goto out;
- state_82:
+ state_83:
lastAcceptingPos = pos;
token = QCss::IDENT;
ch = next();
if (ch.unicode() == 40)
- goto state_57;
- if (ch.unicode() == 45)
goto state_58;
+ if (ch.unicode() == 45)
+ goto state_59;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_58;
- if (ch.unicode() == 92)
goto state_59;
+ if (ch.unicode() == 92)
+ goto state_60;
if (ch.unicode() == 95)
- goto state_58;
+ goto state_59;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_58;
+ goto state_59;
goto out;
- state_83:
+ state_84:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 11)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 14 && ch.unicode() <= 33)
- goto state_32;
- if (ch.unicode() == 34)
goto state_33;
+ if (ch.unicode() == 34)
+ goto state_34;
if (ch.unicode() >= 35 && ch.unicode() <= 91)
- goto state_32;
+ goto state_33;
if (ch.unicode() == 92)
- goto state_34;
+ goto state_35;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_32;
+ goto state_33;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_32;
+ goto state_33;
if (ch.unicode() >= 123)
- goto state_32;
+ goto state_33;
goto out;
- state_84:
+ state_85:
lastAcceptingPos = pos;
token = QCss::HASH;
ch = next();
if (ch.unicode() == 45)
- goto state_66;
+ goto state_67;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_66;
- if (ch.unicode() == 92)
goto state_67;
+ if (ch.unicode() == 92)
+ goto state_68;
if (ch.unicode() == 95)
- goto state_66;
+ goto state_67;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_66;
+ goto state_67;
goto out;
- state_85:
+ state_86:
lastAcceptingPos = pos;
token = QCss::INVALID;
ch = next();
if (ch.unicode() >= 1 && ch.unicode() <= 9)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 11)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 14 && ch.unicode() <= 38)
- goto state_38;
- if (ch.unicode() == 39)
goto state_39;
+ if (ch.unicode() == 39)
+ goto state_40;
if (ch.unicode() >= 40 && ch.unicode() <= 91)
- goto state_38;
+ goto state_39;
if (ch.unicode() == 92)
- goto state_40;
+ goto state_41;
if (ch.unicode() >= 93 && ch.unicode() <= 96)
- goto state_38;
+ goto state_39;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_38;
+ goto state_39;
if (ch.unicode() >= 123)
- goto state_38;
+ goto state_39;
goto out;
- state_86:
+ state_87:
lastAcceptingPos = pos;
token = QCss::LENGTH;
ch = next();
if (ch.unicode() == 45)
- goto state_76;
+ goto state_77;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_76;
- if (ch.unicode() == 92)
goto state_77;
+ if (ch.unicode() == 92)
+ goto state_78;
if (ch.unicode() == 95)
- goto state_76;
+ goto state_77;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_76;
+ goto state_77;
goto out;
- state_88:
+ state_89:
lastAcceptingPos = pos;
token = QCss::ATKEYWORD_SYM;
ch = next();
if (ch.unicode() == 45)
- goto state_80;
+ goto state_81;
if (ch.unicode() >= 48 && ch.unicode() <= 57)
- goto state_80;
- if (ch.unicode() == 92)
goto state_81;
+ if (ch.unicode() == 92)
+ goto state_82;
if (ch.unicode() == 95)
- goto state_80;
+ goto state_81;
if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
- goto state_80;
+ goto state_81;
goto out;
found:
lastAcceptingPos = pos;
diff --git a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
index 95d1557300..2301655909 100644
--- a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
+++ b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
@@ -120,6 +120,7 @@ static const char *tokenName(QCss::TokenType t)
case QCss::PLUS: return "PLUS";
case QCss::GREATER: return "GREATER";
case QCss::COMMA: return "COMMA";
+ case QCss::TILDE: return "TILDE";
case QCss::STRING: return "STRING";
case QCss::INVALID: return "INVALID";
case QCss::IDENT: return "IDENT";
@@ -480,7 +481,7 @@ void tst_QCssParser::selector_data()
QCss::BasicSelector basic;
basic.elementName = "p";
- basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfPreceeds;
+ basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfDirectAdjecent;
sel.basicSelectors << basic;
basic = QCss::BasicSelector();
@@ -572,14 +573,29 @@ void tst_QCssParser::selector_data()
QCss::BasicSelector basic;
basic.elementName = "e";
- basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfPreceeds;
+ basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfDirectAdjecent;
sel.basicSelectors << basic;
basic.elementName = "f";
basic.relationToNext = QCss::BasicSelector::NoRelation;
sel.basicSelectors << basic;
- QTest::newRow("precede") << QString("e + f") << sel;
+ QTest::newRow("lastsibling") << QString("e + f") << sel;
+ }
+
+ {
+ QCss::Selector sel;
+ QCss::BasicSelector basic;
+
+ basic.elementName = "e";
+ basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfIndirectAdjecent;
+ sel.basicSelectors << basic;
+
+ basic.elementName = "f";
+ basic.relationToNext = QCss::BasicSelector::NoRelation;
+ sel.basicSelectors << basic;
+
+ QTest::newRow("previoussibling") << QString("e ~ f") << sel;
}
{
@@ -985,11 +1001,20 @@ void tst_QCssParser::styleSelector_data()
QTest::newRow("attrmatch") << true << QString("[foo=bar]") << QString("<p foo=\"bar\" />") << QString();
QTest::newRow("noattrmatch") << false << QString("[foo=bar]") << QString("<p foo=\"xyz\" />") << QString();
- QTest::newRow("contains") << true << QString("[foo~=bar]") << QString("<p foo=\"baz bleh bar\" />") << QString();
- QTest::newRow("notcontains") << false << QString("[foo~=bar]") << QString("<p foo=\"test\" />") << QString();
+ QTest::newRow("includes") << true << QString("[foo~=bar]") << QString("<p foo=\"baz bleh bar\" />") << QString();
+ QTest::newRow("notincludes") << false << QString("[foo~=bar]") << QString("<p foo=\"bazblehbar\" />") << QString();
+
+ QTest::newRow("dashmatch") << true << QString("[foo|=bar]") << QString("<p foo=\"bar-bleh\" />") << QString();
+ QTest::newRow("nodashmatch") << false << QString("[foo|=bar]") << QString("<p foo=\"barbleh\" />") << QString();
+
+ QTest::newRow("beginswith") << true << QString("[foo^=bar]") << QString("<p foo=\"barbleh\" />") << QString();
+ QTest::newRow("nobeginswith") << false << QString("[foo^=bar]") << QString("<p foo=\"blehbleh\" />") << QString();
- QTest::newRow("beingswith") << true << QString("[foo|=bar]") << QString("<p foo=\"bar-bleh\" />") << QString();
- QTest::newRow("notbeingswith") << false << QString("[foo|=bar]") << QString("<p foo=\"bleh-bar\" />") << QString();
+ QTest::newRow("endswith") << true << QString("[foo$=bar]") << QString("<p foo=\"barbar\" />") << QString();
+ QTest::newRow("noendswith") << false << QString("[foo$=bar]") << QString("<p foo=\"blehbleh\" />") << QString();
+
+ QTest::newRow("contains") << true << QString("[foo*=bar]") << QString("<p foo=\"blehbarbleh\" />") << QString();
+ QTest::newRow("nocontains") << false << QString("[foo*=bar]") << QString("<p foo=\"blehbleh\" />") << QString();
QTest::newRow("attr2") << true << QString("[bar=foo]") << QString("<p bleh=\"bar\" bar=\"foo\" />") << QString();
@@ -1070,10 +1095,19 @@ void tst_QCssParser::styleSelector_data()
<< QString("<p1 /><p2 />")
<< QString("p2");
- QTest::newRow("noprevioussibling") << false << QString("p2 + p1")
+ QTest::newRow("notprevioussibling") << false << QString("p2 + p1")
<< QString("<p1 /><p2 />")
<< QString("p2");
+ QTest::newRow("anyprevioussibling") << true << QString("p1 ~ p3")
+ << QString("<p1 /><p2 /><p3 />")
+ << QString("p3");
+
+ QTest::newRow("noprevioussibling") << false << QString("p3 ~ p2")
+ << QString("<p1 /><p2 /><p3 />")
+ << QString("p3");
+
+
QTest::newRow("ancestry_firstmismatch") << false << QString("parent child[foo=bar]")
<< QString("<parent><child /></parent>")
<< QString("parent/child");
diff --git a/util/lexgen/css2-simplified.lexgen b/util/lexgen/css3-simplified.lexgen
index 01052a1615..99463d524e 100644
--- a/util/lexgen/css2-simplified.lexgen
+++ b/util/lexgen/css3-simplified.lexgen
@@ -44,6 +44,7 @@ LBRACE = {w}"{"
PLUS = {w}"+"
GREATER = {w}">"
COMMA = {w}","
+TILDE= {w}"~"
STRING = {string}
INVALID = {invalid}