bool matchesReservedStringPreventingAutocomplete(AtomicString& string) { if (string.contains("email", false /* caseSensitive */) || string.contains("user", false /* caseSensitive */) || string.contains("name", false /* caseSensitive */) || string.contains("login", false /* caseSensitive */)) return true; return false; }
static inline QualifiedName constructQualifiedName(const SVGElement* svgElement, const AtomicString& attributeName) { ASSERT(svgElement); if (attributeName.isEmpty()) return anyQName(); if (!attributeName.contains(':')) return QualifiedName(nullAtom, attributeName, nullAtom); AtomicString prefix; AtomicString localName; if (!Document::parseQualifiedName(attributeName, prefix, localName, IGNORE_EXCEPTION)) return anyQName(); const AtomicString& namespaceURI = svgElement->lookupNamespaceURI(prefix); if (namespaceURI.isEmpty()) return anyQName(); QualifiedName resolvedAttrName(nullAtom, localName, namespaceURI); // "Animation elements treat attributeName='xlink:href' as being an alias // for targetting the 'href' attribute." // https://svgwg.org/svg2-draft/types.html#__svg__SVGURIReference__href if (resolvedAttrName == XLinkNames::hrefAttr) return SVGNames::hrefAttr; return resolvedAttrName; }
void ShadowTreeStyleSheetCollection::collectStyleSheets(StyleEngine* collections, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets) { if (document()->settings() && !document()->settings()->authorAndUserStylesEnabled()) return; DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); for (DocumentOrderedList::iterator it = begin; it != end; ++it) { Node* node = *it; StyleSheet* sheet = 0; CSSStyleSheet* activeSheet = 0; if (!node->isHTMLElement() || !node->hasTagName(styleTag)) continue; Element* element = toElement(node); AtomicString title = element->getAttribute(titleAttr); bool enabledViaScript = false; sheet = toHTMLStyleElement(node)->sheet(); if (sheet && !sheet->disabled() && sheet->isCSSStyleSheet()) activeSheet = static_cast<CSSStyleSheet*>(sheet); // FIXME: clarify how PREFERRED or ALTERNATE works in shadow trees. // Should we set preferred/selected stylesheets name in shadow trees and // use the name in document? AtomicString rel = element->getAttribute(relAttr); if (!enabledViaScript && sheet && !title.isEmpty()) { if (collections->preferredStylesheetSetName().isEmpty()) { if (element->hasLocalName(styleTag) || !rel.contains("alternate")) { collections->setPreferredStylesheetSetName(title); collections->setSelectedStylesheetSetName(title); } } if (title != collections->preferredStylesheetSetName()) activeSheet = 0; } if (rel.contains("alternate") && title.isEmpty()) activeSheet = 0; if (sheet) styleSheets.append(sheet); if (activeSheet) activeSheets.append(activeSheet); } }
static inline QualifiedName constructQualifiedName(const SVGElement* svgElement, const AtomicString& attributeName) { ASSERT(svgElement); if (attributeName.isEmpty()) return anyQName(); if (!attributeName.contains(':')) return QualifiedName(nullAtom, attributeName, nullAtom); AtomicString prefix; AtomicString localName; if (!Document::parseQualifiedName(attributeName, prefix, localName, IGNORE_EXCEPTION)) return anyQName(); const AtomicString& namespaceURI = svgElement->lookupNamespaceURI(prefix); if (namespaceURI.isEmpty()) return anyQName(); return QualifiedName(nullAtom, localName, namespaceURI); }
void TrackBase::setLanguage(const AtomicString& language) { if (!language.isEmpty() && !isValidBCP47LanguageTag(language)) { String message; if (language.contains((UChar)'\0')) message = WTF::ASCIILiteral("The language contains a null character and is not a valid BCP 47 language tag."); else { StringBuilder stringBuilder; stringBuilder.appendLiteral("The language '"); stringBuilder.append(language); stringBuilder.appendLiteral("' is not a valid BCP 47 language tag."); message = stringBuilder.toString(); } if (auto element = this->element()) element->document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Warning, message); } else m_validBCP47Language = language; m_language = language; }
void DocumentStyleSheetCollection::collectActiveStyleSheets(Vector<RefPtr<StyleSheet> >& sheets) { if (m_document->settings() && !m_document->settings()->authorAndUserStylesEnabled()) return; StyleSheetCandidateListHashSet::iterator begin = m_styleSheetCandidateNodes.begin(); StyleSheetCandidateListHashSet::iterator end = m_styleSheetCandidateNodes.end(); for (StyleSheetCandidateListHashSet::iterator it = begin; it != end; ++it) { Node* n = *it; StyleSheet* sheet = 0; if (n->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { // Processing instruction (XML documents only). // We don't support linking to embedded CSS stylesheets, see <https://bugs.webkit.org/show_bug.cgi?id=49281> for discussion. ProcessingInstruction* pi = static_cast<ProcessingInstruction*>(n); sheet = pi->sheet(); #if ENABLE(XSLT) // Don't apply XSL transforms to already transformed documents -- <rdar://problem/4132806> if (pi->isXSL() && !m_document->transformSourceDocument()) { // Don't apply XSL transforms until loading is finished. if (!m_document->parsing()) m_document->applyXSLTransform(pi); return; } #endif } else if ((n->isHTMLElement() && (n->hasTagName(linkTag) || n->hasTagName(styleTag))) #if ENABLE(SVG) || (n->isSVGElement() && n->hasTagName(SVGNames::styleTag)) #endif ) { Element* e = toElement(n); AtomicString title = e->getAttribute(titleAttr); bool enabledViaScript = false; if (e->hasTagName(linkTag)) { // <LINK> element HTMLLinkElement* linkElement = static_cast<HTMLLinkElement*>(n); if (linkElement->isDisabled()) continue; enabledViaScript = linkElement->isEnabledViaScript(); if (linkElement->styleSheetIsLoading()) { // it is loading but we should still decide which style sheet set to use if (!enabledViaScript && !title.isEmpty() && m_preferredStylesheetSetName.isEmpty()) { const AtomicString& rel = e->getAttribute(relAttr); if (!rel.contains("alternate")) { m_preferredStylesheetSetName = title; m_selectedStylesheetSetName = title; } } continue; } if (!linkElement->sheet()) title = nullAtom; } // Get the current preferred styleset. This is the // set of sheets that will be enabled. #if ENABLE(SVG) if (e->hasTagName(SVGNames::styleTag)) sheet = static_cast<SVGStyleElement*>(n)->sheet(); else #endif { if (e->hasTagName(linkTag)) sheet = static_cast<HTMLLinkElement*>(n)->sheet(); else // <STYLE> element sheet = toHTMLStyleElement(e)->sheet(); } // Check to see if this sheet belongs to a styleset // (thus making it PREFERRED or ALTERNATE rather than // PERSISTENT). AtomicString rel = e->getAttribute(relAttr); if (!enabledViaScript && !title.isEmpty()) { // Yes, we have a title. if (m_preferredStylesheetSetName.isEmpty()) { // No preferred set has been established. If // we are NOT an alternate sheet, then establish // us as the preferred set. Otherwise, just ignore // this sheet. if (e->hasTagName(styleTag) || !rel.contains("alternate")) m_preferredStylesheetSetName = m_selectedStylesheetSetName = title; } if (title != m_preferredStylesheetSetName) sheet = 0; } if (rel.contains("alternate") && title.isEmpty()) sheet = 0; } if (sheet) sheets.append(sheet); } }
static bool matchesReservedStringEmail(const AtomicString& string) { return string.contains("email", false /* caseSensitive */); }
static bool attributeValueMatches(const Attribute* attributeItem, CSSSelector::Match match, const AtomicString& selectorValue, bool caseSensitive) { const AtomicString& value = attributeItem->value(); if (value.isNull()) return false; switch (match) { case CSSSelector::Exact: if (caseSensitive ? selectorValue != value : !equalIgnoringCase(selectorValue, value)) return false; break; case CSSSelector::List: { // Ignore empty selectors or selectors containing spaces if (selectorValue.contains(' ') || selectorValue.isEmpty()) return false; unsigned startSearchAt = 0; while (true) { size_t foundPos = value.find(selectorValue, startSearchAt, caseSensitive); if (foundPos == notFound) return false; if (!foundPos || value[foundPos - 1] == ' ') { unsigned endStr = foundPos + selectorValue.length(); if (endStr == value.length() || value[endStr] == ' ') break; // We found a match. } // No match. Keep looking. startSearchAt = foundPos + 1; } break; } case CSSSelector::Contain: if (!value.contains(selectorValue, caseSensitive) || selectorValue.isEmpty()) return false; break; case CSSSelector::Begin: if (!value.startsWith(selectorValue, caseSensitive) || selectorValue.isEmpty()) return false; break; case CSSSelector::End: if (!value.endsWith(selectorValue, caseSensitive) || selectorValue.isEmpty()) return false; break; case CSSSelector::Hyphen: if (value.length() < selectorValue.length()) return false; if (!value.startsWith(selectorValue, caseSensitive)) return false; // It they start the same, check for exact match or following '-': if (value.length() != selectorValue.length() && value[selectorValue.length()] != '-') return false; break; case CSSSelector::PseudoClass: case CSSSelector::PseudoElement: default: break; } return true; }