PassRefPtrWillBeRawPtr<CSSStyleSheet> StyleEngine::createSheet(Element* e, const String& text, TextPosition startPosition, bool createdByParser) { RefPtrWillBeRawPtr<CSSStyleSheet> styleSheet = nullptr; e->document().styleEngine()->addPendingSheet(); if (!e->document().inQuirksMode()) { AtomicString textContent(text); WillBeHeapHashMap<AtomicString, RawPtrWillBeMember<StyleSheetContents> >::AddResult result = m_textToSheetCache.add(textContent, nullptr); if (result.isNewEntry || !result.storedValue->value) { styleSheet = StyleEngine::parseSheet(e, text, startPosition, createdByParser); if (result.isNewEntry && isCacheableForStyleElement(*styleSheet->contents())) { result.storedValue->value = styleSheet->contents(); m_sheetToTextCache.add(styleSheet->contents(), textContent); } } else { StyleSheetContents* contents = result.storedValue->value; ASSERT(contents); ASSERT(isCacheableForStyleElement(*contents)); ASSERT(contents->singleOwnerDocument() == e->document()); styleSheet = CSSStyleSheet::createInline(contents, e, startPosition); } } else { // FIXME: currently we don't cache StyleSheetContents inQuirksMode. styleSheet = StyleEngine::parseSheet(e, text, startPosition, createdByParser); } ASSERT(styleSheet); styleSheet->setTitle(e->title()); return styleSheet; }
PassRefPtrWillBeRawPtr<CSSStyleSheet> StyleEngine::parseSheet(Element* e, const String& text, TextPosition startPosition, bool createdByParser) { RefPtrWillBeRawPtr<CSSStyleSheet> styleSheet = nullptr; styleSheet = CSSStyleSheet::createInline(e, KURL(), startPosition, e->document().inputEncoding()); styleSheet->contents()->parseStringAtPosition(text, startPosition, createdByParser); return styleSheet; }
PassRefPtrWillBeRawPtr<CSSStyleSheet> StyleEngine::parseSheet(Element* e, const String& text, TextPosition startPosition) { RefPtrWillBeRawPtr<CSSStyleSheet> styleSheet = nullptr; styleSheet = CSSStyleSheet::createInline(e, KURL(), startPosition, e->document().characterSet()); styleSheet->contents()->parseStringAtPosition(text, startPosition); return styleSheet; }
void StyleEngine::updateInjectedStyleSheetCache() const { if (m_injectedStyleSheetCacheValid) return; m_injectedStyleSheetCacheValid = true; m_injectedAuthorStyleSheets.clear(); Page* owningPage = document().page(); if (!owningPage) return; const InjectedStyleSheetEntryVector& entries = InjectedStyleSheets::instance().entries(); for (unsigned i = 0; i < entries.size(); ++i) { const InjectedStyleSheetEntry* entry = entries[i].get(); if (entry->injectedFrames() == InjectStyleInTopFrameOnly && document().ownerElement()) continue; if (!URLPatternMatcher::matchesPatterns(document().url(), entry->whitelist())) continue; RefPtrWillBeRawPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInline(m_document, KURL()); m_injectedAuthorStyleSheets.append(groupSheet); groupSheet->contents()->parseString(entry->source()); } }