void StyleElement::createSheet(Element* e, const String& text) { ASSERT(e); ASSERT(e->inDocument()); Document& document = e->document(); if (m_sheet) clearSheet(e); // If type is empty or CSS, this is a CSS style sheet. const AtomicString& type = this->type(); if (isCSS(e, type)) { RefPtr<MediaQuerySet> mediaQueries = MediaQuerySet::create(media()); MediaQueryEvaluator screenEval("screen", true); MediaQueryEvaluator printEval("print", true); if (screenEval.eval(mediaQueries.get()) || printEval.eval(mediaQueries.get())) { m_loading = true; TextPosition startPosition = m_startPosition == TextPosition::belowRangePosition() ? TextPosition::minimumPosition() : m_startPosition; m_sheet = document.styleEngine()->createSheet(e, text, startPosition, m_createdByParser); m_sheet->setMediaQueries(mediaQueries.release()); m_loading = false; } } document.styleResolverMayHaveChanged(); }
StyleElement::ProcessingResult StyleElement::createSheet(Element& element, const String& text) { DCHECK(element.isConnected()); Document& document = element.document(); const ContentSecurityPolicy* csp = document.contentSecurityPolicy(); bool passesContentSecurityPolicyChecks = shouldBypassMainWorldCSP(element) || csp->allowStyleWithHash(text, ContentSecurityPolicy::InlineType::Block) || csp->allowInlineStyle(&element, document.url(), element.fastGetAttribute(HTMLNames::nonceAttr), m_startPosition.m_line, text); // Clearing the current sheet may remove the cache entry so create the new // sheet first CSSStyleSheet* newSheet = nullptr; // If type is empty or CSS, this is a CSS style sheet. const AtomicString& type = this->type(); if (isCSS(element, type) && passesContentSecurityPolicyChecks) { MediaQuerySet* mediaQueries = MediaQuerySet::create(media()); MediaQueryEvaluator screenEval("screen"); MediaQueryEvaluator printEval("print"); if (screenEval.eval(mediaQueries) || printEval.eval(mediaQueries)) { m_loading = true; TextPosition startPosition = m_startPosition == TextPosition::belowRangePosition() ? TextPosition::minimumPosition() : m_startPosition; newSheet = document.styleEngine().createSheet( element, text, startPosition, m_styleEngineContext); newSheet->setMediaQueries(mediaQueries); m_loading = false; } } if (m_sheet) clearSheet(element); m_sheet = newSheet; if (m_sheet) m_sheet->contents()->checkLoaded(); return passesContentSecurityPolicyChecks ? ProcessingSuccessful : ProcessingFatalError; }
void StyleElement::createSheet(Element* e, const String& text) { ASSERT(e); ASSERT(e->inDocument()); Document& document = e->document(); if (m_sheet) { if (m_sheet->isLoading()) document.styleEngine()->removePendingSheet(e); clearSheet(); } // If type is empty or CSS, this is a CSS style sheet. const AtomicString& type = this->type(); bool passesContentSecurityPolicyChecks = document.contentSecurityPolicy()->allowStyleNonce(e->fastGetAttribute(HTMLNames::nonceAttr)) || document.contentSecurityPolicy()->allowInlineStyle(e->document().url(), m_startPosition.m_line); if (isCSS(e, type) && passesContentSecurityPolicyChecks) { RefPtr<MediaQuerySet> mediaQueries = MediaQuerySet::create(media()); MediaQueryEvaluator screenEval("screen", true); MediaQueryEvaluator printEval("print", true); if (screenEval.eval(mediaQueries.get()) || printEval.eval(mediaQueries.get())) { document.styleEngine()->addPendingSheet(); m_loading = true; TextPosition startPosition = m_startPosition == TextPosition::belowRangePosition() ? TextPosition::minimumPosition() : m_startPosition; m_sheet = CSSStyleSheet::createInline(e, KURL(), startPosition, document.inputEncoding()); m_sheet->setMediaQueries(mediaQueries.release()); m_sheet->setTitle(e->title()); m_sheet->contents()->parseStringAtPosition(text, startPosition, m_createdByParser); m_loading = false; } } if (m_sheet) m_sheet->contents()->checkLoaded(); }
void StyleElement::createSheet(Element* e, int startLineNumber, const String& text) { ASSERT(e); ASSERT(e->inDocument()); Document* document = e->document(); if (m_sheet) { if (m_sheet->isLoading()) document->removePendingSheet(); m_sheet = 0; } // If type is empty or CSS, this is a CSS style sheet. const AtomicString& type = this->type(); if (document->contentSecurityPolicy()->allowInlineStyle() && isCSS(e, type)) { RefPtr<MediaList> mediaList = MediaList::create(media(), e->isHTMLElement()); MediaQueryEvaluator screenEval("screen", true); MediaQueryEvaluator printEval("print", true); if (screenEval.eval(mediaList.get()) || printEval.eval(mediaList.get())) { document->addPendingSheet(); m_loading = true; m_sheet = CSSStyleSheet::create(e, String(), KURL(), document->inputEncoding()); m_sheet->parseStringAtLine(text, !document->inQuirksMode(), startLineNumber); m_sheet->setMedia(mediaList.get()); m_sheet->setTitle(e->title()); m_loading = false; } } if (m_sheet) m_sheet->checkLoaded(); }