Diff
Modified: trunk/LayoutTests/ChangeLog (134540 => 134541)
--- trunk/LayoutTests/ChangeLog 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/LayoutTests/ChangeLog 2012-11-14 05:51:12 UTC (rev 134541)
@@ -1,3 +1,13 @@
+2012-11-13 Shinya Kawanaka <shin...@chromium.org>
+
+ Collect necessary features for SelectRuleFeatureSet
+ https://bugs.webkit.org/show_bug.cgi?id=102160
+
+ Reviewed by Dimitri Glazkov.
+
+ * fast/dom/shadow/shadow-select-attribute-featureset-expected.txt:
+ * fast/dom/shadow/shadow-select-attribute-featureset.html:
+
2012-11-13 Kentaro Hara <hara...@chromium.org>
Unreviewed. Rebaselined test results.
Modified: trunk/LayoutTests/fast/dom/shadow/shadow-select-attribute-featureset-expected.txt (134540 => 134541)
--- trunk/LayoutTests/fast/dom/shadow/shadow-select-attribute-featureset-expected.txt 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/LayoutTests/fast/dom/shadow/shadow-select-attribute-featureset-expected.txt 2012-11-14 05:51:12 UTC (rev 134541)
@@ -69,6 +69,69 @@
PASS internals.hasSelectorForIdInShadow(host, "bar") is false
PASS internals.hasSelectorForIdInShadow(host, "baz") is true
+PseudoClass case: :checked
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is true
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is false
+
+PseudoClass case: :enabled
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is true
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is false
+
+PseudoClass case: :disabled
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is true
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is false
+
+PseudoClass case: :indeterminate
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is true
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is false
+
+PseudoClass case: :link
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is true
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is false
+
+PseudoClass case: :target
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is true
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is false
+
+PseudoClass case: :visited
+PASS internals.hasSelectorForPseudoClassInShadow(host, "checked") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "enabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "disabled") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "indeterminate") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "link") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "target") is false
+PASS internals.hasSelectorForPseudoClassInShadow(host, "visited") is true
+
PASS successfullyParsed is true
TEST COMPLETE
Modified: trunk/LayoutTests/fast/dom/shadow/shadow-select-attribute-featureset.html (134540 => 134541)
--- trunk/LayoutTests/fast/dom/shadow/shadow-select-attribute-featureset.html 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/LayoutTests/fast/dom/shadow/shadow-select-attribute-featureset.html 2012-11-14 05:51:12 UTC (rev 134541)
@@ -168,6 +168,104 @@
shouldBe('internals.hasSelectorForIdInShadow(host, "baz")', 'true');
});
+testCase(function()
+{
+ debug('PseudoClass case: :checked');
+ shadowRoot.innerHTML = '<content select="input:checked"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'true');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
+});
+
+testCase(function()
+{
+ debug('PseudoClass case: :enabled');
+ shadowRoot.innerHTML = '<content select="input:enabled"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'true');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
+});
+
+testCase(function()
+{
+ debug('PseudoClass case: :disabled');
+ shadowRoot.innerHTML = '<content select="input:disabled"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'true');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
+});
+
+testCase(function()
+{
+ debug('PseudoClass case: :indeterminate');
+ shadowRoot.innerHTML = '<content select="input:indeterminate"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'true');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
+});
+
+testCase(function()
+{
+ debug('PseudoClass case: :link');
+ shadowRoot.innerHTML = '<content select="input:link"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'true');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
+});
+
+testCase(function()
+{
+ debug('PseudoClass case: :target');
+ shadowRoot.innerHTML = '<content select="input:target"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'true');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'false');
+});
+
+testCase(function()
+{
+ debug('PseudoClass case: :visited');
+ shadowRoot.innerHTML = '<content select="input:visited"></content>';
+
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "checked")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "enabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "disabled")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "indeterminate")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "link")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "target")', 'false');
+ shouldBe('internals.hasSelectorForPseudoClassInShadow(host, "visited")', 'true');
+});
+
finishJSTest();
</script>
<script src=""
Modified: trunk/Source/WebCore/ChangeLog (134540 => 134541)
--- trunk/Source/WebCore/ChangeLog 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/Source/WebCore/ChangeLog 2012-11-14 05:51:12 UTC (rev 134541)
@@ -1,3 +1,41 @@
+2012-11-13 Shinya Kawanaka <shin...@chromium.org>
+
+ Collect necessary features for SelectRuleFeatureSet
+ https://bugs.webkit.org/show_bug.cgi?id=102160
+
+ Reviewed by Dimitri Glazkov.
+
+ When pseudo class is changed, we might have to invalidate distribution. To determine whether we should invalidate
+ distribution, we would like to collect RuleFeature from select attributes.
+
+ According to ShadowDOM spec, we have to collect the following pseudo classes: checked, enabled, disabled,
+ indeterminate, link, target, and visited. We collect them in this patch.
+
+ Test: fast/dom/shadow/shadow-select-attribute-featureset.html
+
+ * html/shadow/SelectRuleFeatureSet.cpp:
+ (WebCore::SelectRuleFeatureSet::SelectRuleFeatureSet): Uses int as bitset so that we can use bit operator.
+ (WebCore::SelectRuleFeatureSet::add):
+ (WebCore::SelectRuleFeatureSet::clear):
+ (WebCore::SelectRuleFeatureSet::collectFeaturesFromSelector): Collects necessary features from CSSSelector.
+ * html/shadow/SelectRuleFeatureSet.h:
+ (WebCore::SelectRuleFeatureSet::hasSelectorForChecked):
+ (WebCore::SelectRuleFeatureSet::hasSelectorForEnabled):
+ (WebCore::SelectRuleFeatureSet::hasSelectorForDisabled):
+ (WebCore::SelectRuleFeatureSet::hasSelectorForIndeterminate):
+ (WebCore::SelectRuleFeatureSet::hasSelectorForLink):
+ (WebCore::SelectRuleFeatureSet::hasSelectorForTarget):
+ (WebCore::SelectRuleFeatureSet::hasSelectorForVisited):
+ (SelectRuleFeatureSet):
+ (WebCore::SelectRuleFeatureSet::setSelectRuleFeature):
+ (WebCore::SelectRuleFeatureSet::hasSelectorFor):
+ * testing/Internals.cpp:
+ (WebCore::Internals::hasSelectorForPseudoClassInShadow):
+ (WebCore):
+ * testing/Internals.h:
+ (Internals):
+ * testing/Internals.idl:
+
2012-11-13 Andreas Kling <kl...@webkit.org>
Move inline style logic from ElementAttributeData to StyledElement.
Modified: trunk/Source/WebCore/html/shadow/SelectRuleFeatureSet.cpp (134540 => 134541)
--- trunk/Source/WebCore/html/shadow/SelectRuleFeatureSet.cpp 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/Source/WebCore/html/shadow/SelectRuleFeatureSet.cpp 2012-11-14 05:51:12 UTC (rev 134541)
@@ -36,22 +36,51 @@
namespace WebCore {
SelectRuleFeatureSet::SelectRuleFeatureSet()
+ : m_featureFlags(0)
{
}
void SelectRuleFeatureSet::add(const SelectRuleFeatureSet& featureSet)
{
m_cssRuleFeatureSet.add(featureSet.m_cssRuleFeatureSet);
+ m_featureFlags |= featureSet.m_featureFlags;
}
void SelectRuleFeatureSet::clear()
{
m_cssRuleFeatureSet.clear();
+ m_featureFlags = 0;
}
void SelectRuleFeatureSet::collectFeaturesFromSelector(const CSSSelector* selector)
{
m_cssRuleFeatureSet.collectFeaturesFromSelector(selector);
+
+ switch (selector->pseudoType()) {
+ case CSSSelector::PseudoChecked:
+ setSelectRuleFeature(RuleFeatureChecked);
+ break;
+ case CSSSelector::PseudoEnabled:
+ setSelectRuleFeature(RuleFeatureEnabled);
+ break;
+ case CSSSelector::PseudoDisabled:
+ setSelectRuleFeature(RuleFeatureDisabled);
+ break;
+ case CSSSelector::PseudoIndeterminate:
+ setSelectRuleFeature(RuleFeatureIndeterminate);
+ break;
+ case CSSSelector::PseudoLink:
+ setSelectRuleFeature(RuleFeatureLink);
+ break;
+ case CSSSelector::PseudoTarget:
+ setSelectRuleFeature(RuleFeatureTarget);
+ break;
+ case CSSSelector::PseudoVisited:
+ setSelectRuleFeature(RuleFeatureVisited);
+ break;
+ default:
+ break;
+ }
}
}
Modified: trunk/Source/WebCore/html/shadow/SelectRuleFeatureSet.h (134540 => 134541)
--- trunk/Source/WebCore/html/shadow/SelectRuleFeatureSet.h 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/Source/WebCore/html/shadow/SelectRuleFeatureSet.h 2012-11-14 05:51:12 UTC (rev 134541)
@@ -47,8 +47,30 @@
bool hasSelectorForClass(const AtomicString&) const;
bool hasSelectorForAttribute(const AtomicString&) const;
+ bool hasSelectorForChecked() const { return hasSelectorFor(RuleFeatureChecked); }
+ bool hasSelectorForEnabled() const { return hasSelectorFor(RuleFeatureEnabled); }
+ bool hasSelectorForDisabled() const { return hasSelectorFor(RuleFeatureDisabled); }
+ bool hasSelectorForIndeterminate() const { return hasSelectorFor(RuleFeatureIndeterminate); }
+ bool hasSelectorForLink() const { return hasSelectorFor(RuleFeatureLink); }
+ bool hasSelectorForTarget() const { return hasSelectorFor(RuleFeatureTarget); }
+ bool hasSelectorForVisited() const { return hasSelectorFor(RuleFeatureVisited); }
+
+ enum SelectRuleFeature {
+ RuleFeatureChecked = 1,
+ RuleFeatureEnabled = 1 << 1,
+ RuleFeatureDisabled = 1 << 2,
+ RuleFeatureIndeterminate = 1 << 3,
+ RuleFeatureLink = 1 << 4,
+ RuleFeatureTarget = 1 << 5,
+ RuleFeatureVisited = 1 << 6
+ };
+
private:
+ void setSelectRuleFeature(SelectRuleFeature feature) { m_featureFlags |= feature; }
+ bool hasSelectorFor(SelectRuleFeature feature) const { return m_featureFlags & feature; }
+
RuleFeatureSet m_cssRuleFeatureSet;
+ int m_featureFlags;
};
inline bool SelectRuleFeatureSet::hasSelectorForId(const AtomicString& idValue) const
Modified: trunk/Source/WebCore/testing/Internals.cpp (134540 => 134541)
--- trunk/Source/WebCore/testing/Internals.cpp 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/Source/WebCore/testing/Internals.cpp 2012-11-14 05:51:12 UTC (rev 134541)
@@ -340,6 +340,34 @@
return host->shadow()->selectRuleFeatureSet().hasSelectorForAttribute(attributeName);
}
+bool Internals::hasSelectorForPseudoClassInShadow(Element* host, const String& pseudoClass, ExceptionCode& ec)
+{
+ if (!host || !host->shadow()) {
+ ec = INVALID_ACCESS_ERR;
+ return 0;
+ }
+
+ host->shadow()->ensureSelectFeatureSetCollected();
+ const SelectRuleFeatureSet& featureSet = host->shadow()->selectRuleFeatureSet();
+ if (pseudoClass == "checked")
+ return featureSet.hasSelectorForChecked();
+ if (pseudoClass == "enabled")
+ return featureSet.hasSelectorForEnabled();
+ if (pseudoClass == "disabled")
+ return featureSet.hasSelectorForDisabled();
+ if (pseudoClass == "indeterminate")
+ return featureSet.hasSelectorForIndeterminate();
+ if (pseudoClass == "link")
+ return featureSet.hasSelectorForLink();
+ if (pseudoClass == "target")
+ return featureSet.hasSelectorForTarget();
+ if (pseudoClass == "visited")
+ return featureSet.hasSelectorForVisited();
+
+ ASSERT_NOT_REACHED();
+ return false;
+}
+
bool Internals::hasShadowInsertionPoint(const Node* root, ExceptionCode& ec) const
{
if (root && root->isShadowRoot())
Modified: trunk/Source/WebCore/testing/Internals.h (134540 => 134541)
--- trunk/Source/WebCore/testing/Internals.h 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/Source/WebCore/testing/Internals.h 2012-11-14 05:51:12 UTC (rev 134541)
@@ -99,6 +99,7 @@
bool hasSelectorForIdInShadow(Element* host, const String& idValue, ExceptionCode&);
bool hasSelectorForClassInShadow(Element* host, const String& className, ExceptionCode&);
bool hasSelectorForAttributeInShadow(Element* host, const String& attributeName, ExceptionCode&);
+ bool hasSelectorForPseudoClassInShadow(Element* host, const String& pseudoClass, ExceptionCode&);
bool attached(Node*, ExceptionCode&);
Modified: trunk/Source/WebCore/testing/Internals.idl (134540 => 134541)
--- trunk/Source/WebCore/testing/Internals.idl 2012-11-14 05:45:43 UTC (rev 134540)
+++ trunk/Source/WebCore/testing/Internals.idl 2012-11-14 05:51:12 UTC (rev 134541)
@@ -62,6 +62,7 @@
boolean hasSelectorForIdInShadow(in Element host, in DOMString id) raises (DOMException);
boolean hasSelectorForClassInShadow(in Element host, in DOMString className) raises (DOMException);
boolean hasSelectorForAttributeInShadow(in Element host, in DOMString attributeName) raises (DOMException);
+ boolean hasSelectorForPseudoClassInShadow(in Element host, in DOMString pseudoClass) raises (DOMException);
Node nextSiblingByWalker(in Node node) raises(DOMException);
Node firstChildByWalker(in Node node) raises(DOMException);