String CSSStyleRule::selectorText() const { String str; for (CSSSelector* s = selectorList().first(); s; s = CSSSelectorList::next(s)) { if (s != selectorList().first()) str += ", "; str += s->selectorText(); } return str; }
String CSSStyleRule::generateSelectorText() const { StringBuilder builder; for (CSSSelector* s = m_styleRule->selectorList().first(); s; s = CSSSelectorList::next(s)) { if (s != m_styleRule->selectorList().first()) builder.append(", "); builder.append(s->selectorText()); } return builder.toString(); }
String CSSPageRule::pageSelectorText() const { String text = "@page"; CSSSelector* selector = selectorList().first(); if (selector) { String pageSpecification = selector->selectorText(); if (!pageSpecification.isEmpty() && pageSpecification != starAtom) text += " " + pageSpecification; } return text; }
String CSSSelectorList::selectorsText() const { StringBuilder result; for (CSSSelector* s = first(); s; s = next(s)) { if (s != first()) result.append(", "); result.append(s->selectorText()); } return result.toString(); }
String CSSStyleRule::selectorText() const { if (m_selector) { String str; for (CSSSelector* s = m_selector; s; s = s->next()) { if (s != m_selector) str += ", "; str += s->selectorText(); } return str; } return String(); }
String CSSSelector::selectorText() const { StringBuilder str; const AtomicString& prefix = m_tag.prefix(); const AtomicString& localName = m_tag.localName(); if (m_match == CSSSelector::None || !prefix.isNull() || localName != starAtom) { if (prefix.isNull()) str.append(localName); else { str.append(prefix.string()); str.append('|'); str.append(localName); } } const CSSSelector* cs = this; while (true) { if (cs->m_match == CSSSelector::Id) { str.append('#'); serializeIdentifier(cs->value(), str); } else if (cs->m_match == CSSSelector::Class) { str.append('.'); serializeIdentifier(cs->value(), str); } else if (cs->m_match == CSSSelector::PseudoClass || cs->m_match == CSSSelector::PagePseudoClass) { str.append(':'); str.append(cs->value()); switch (cs->pseudoType()) { case PseudoNot: if (CSSSelectorList* selectorList = cs->selectorList()) str.append(selectorList->first()->selectorText()); str.append(')'); break; case PseudoLang: case PseudoNthChild: case PseudoNthLastChild: case PseudoNthOfType: case PseudoNthLastOfType: str.append(cs->argument()); str.append(')'); break; case PseudoAny: { CSSSelector* firstSubSelector = cs->selectorList()->first(); for (CSSSelector* subSelector = firstSubSelector; subSelector; subSelector = CSSSelectorList::next(subSelector)) { if (subSelector != firstSubSelector) str.append(','); str.append(subSelector->selectorText()); } str.append(')'); break; } default: break; } } else if (cs->m_match == CSSSelector::PseudoElement) { str.appendLiteral("::"); str.append(cs->value()); } else if (cs->isAttributeSelector()) { str.append('['); const AtomicString& prefix = cs->attribute().prefix(); if (!prefix.isNull()) { str.append(prefix); str.append("|"); } str.append(cs->attribute().localName()); switch (cs->m_match) { case CSSSelector::Exact: str.append('='); break; case CSSSelector::Set: // set has no operator or value, just the attrName str.append(']'); break; case CSSSelector::List: str.appendLiteral("~="); break; case CSSSelector::Hyphen: str.appendLiteral("|="); break; case CSSSelector::Begin: str.appendLiteral("^="); break; case CSSSelector::End: str.appendLiteral("$="); break; case CSSSelector::Contain: str.appendLiteral("*="); break; default: break; } if (cs->m_match != CSSSelector::Set) { serializeString(cs->value(), str); str.append(']'); } } if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory()) break; cs = cs->tagHistory(); } if (CSSSelector* tagHistory = cs->tagHistory()) { String tagHistoryText = tagHistory->selectorText(); switch (cs->relation()) { case CSSSelector::Descendant: return tagHistoryText + " " + str.toString(); case CSSSelector::Child: return tagHistoryText + " > " + str.toString(); case CSSSelector::DirectAdjacent: return tagHistoryText + " + " + str.toString(); case CSSSelector::IndirectAdjacent: return tagHistoryText + " ~ " + str.toString(); case CSSSelector::SubSelector: ASSERT_NOT_REACHED(); case CSSSelector::ShadowDescendant: return tagHistoryText + str.toString(); } } return str.toString(); }