Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Side by Side Diff: third_party/WebKit/Source/core/dom/StyleElement.cpp

Issue 1903803002: Do not block painting for in-body CSS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed premature script execution Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007 Rob Buis 2 * Copyright (C) 2006, 2007 Rob Buis
3 * Copyright (C) 2008 Apple, Inc. All rights reserved. 3 * Copyright (C) 2008 Apple, Inc. All rights reserved.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 29 matching lines...) Expand all
40 40
41 static bool isCSS(Element* element, const AtomicString& type) 41 static bool isCSS(Element* element, const AtomicString& type)
42 { 42 {
43 return type.isEmpty() || (element->isHTMLElement() ? equalIgnoringCase(type, "text/css") : (type == "text/css")); 43 return type.isEmpty() || (element->isHTMLElement() ? equalIgnoringCase(type, "text/css") : (type == "text/css"));
44 } 44 }
45 45
46 StyleElement::StyleElement(Document* document, bool createdByParser) 46 StyleElement::StyleElement(Document* document, bool createdByParser)
47 : m_createdByParser(createdByParser) 47 : m_createdByParser(createdByParser)
48 , m_loading(false) 48 , m_loading(false)
49 , m_registeredAsCandidate(false) 49 , m_registeredAsCandidate(false)
50 , m_beforeBody(false)
50 , m_startPosition(TextPosition::belowRangePosition()) 51 , m_startPosition(TextPosition::belowRangePosition())
51 { 52 {
52 if (createdByParser && document && document->scriptableDocumentParser() && ! document->isInDocumentWrite()) 53 if (createdByParser && document && document->scriptableDocumentParser() && ! document->isInDocumentWrite())
53 m_startPosition = document->scriptableDocumentParser()->textPosition(); 54 m_startPosition = document->scriptableDocumentParser()->textPosition();
54 } 55 }
55 56
56 StyleElement::~StyleElement() 57 StyleElement::~StyleElement()
57 { 58 {
58 } 59 }
59 60
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 if (!element || !element->inShadowIncludingDocument()) 140 if (!element || !element->inShadowIncludingDocument())
140 return ProcessingSuccessful; 141 return ProcessingSuccessful;
141 return createSheet(element, element->textFromChildren()); 142 return createSheet(element, element->textFromChildren());
142 } 143 }
143 144
144 void StyleElement::clearSheet(Element* ownerElement) 145 void StyleElement::clearSheet(Element* ownerElement)
145 { 146 {
146 DCHECK(m_sheet); 147 DCHECK(m_sheet);
147 148
148 if (ownerElement && m_sheet->isLoading()) 149 if (ownerElement && m_sheet->isLoading())
149 ownerElement->document().styleEngine().removePendingSheet(ownerElement); 150 ownerElement->document().styleEngine().removePendingSheet(ownerElement, m_beforeBody);
150 151
151 m_sheet.release()->clearOwnerNode(); 152 m_sheet.release()->clearOwnerNode();
152 } 153 }
153 154
154 static bool shouldBypassMainWorldCSP(Element* element) 155 static bool shouldBypassMainWorldCSP(Element* element)
155 { 156 {
156 // Main world CSP is bypassed within an isolated world. 157 // Main world CSP is bypassed within an isolated world.
157 LocalFrame* frame = element->document().frame(); 158 LocalFrame* frame = element->document().frame();
158 if (frame && frame->script().shouldBypassMainWorldCSP()) 159 if (frame && frame->script().shouldBypassMainWorldCSP())
159 return true; 160 return true;
(...skipping 24 matching lines...) Expand all
184 // If type is empty or CSS, this is a CSS style sheet. 185 // If type is empty or CSS, this is a CSS style sheet.
185 const AtomicString& type = this->type(); 186 const AtomicString& type = this->type();
186 if (isCSS(e, type) && passesContentSecurityPolicyChecks) { 187 if (isCSS(e, type) && passesContentSecurityPolicyChecks) {
187 MediaQuerySet* mediaQueries = MediaQuerySet::create(media()); 188 MediaQuerySet* mediaQueries = MediaQuerySet::create(media());
188 189
189 MediaQueryEvaluator screenEval("screen", true); 190 MediaQueryEvaluator screenEval("screen", true);
190 MediaQueryEvaluator printEval("print", true); 191 MediaQueryEvaluator printEval("print", true);
191 if (screenEval.eval(mediaQueries) || printEval.eval(mediaQueries)) { 192 if (screenEval.eval(mediaQueries) || printEval.eval(mediaQueries)) {
192 m_loading = true; 193 m_loading = true;
193 TextPosition startPosition = m_startPosition == TextPosition::belowR angePosition() ? TextPosition::minimumPosition() : m_startPosition; 194 TextPosition startPosition = m_startPosition == TextPosition::belowR angePosition() ? TextPosition::minimumPosition() : m_startPosition;
194 newSheet = document.styleEngine().createSheet(e, text, startPosition ); 195 m_beforeBody = m_beforeBody || !document.body();
esprehn 2016/05/06 21:50:15 Can we move this into the StyleEngine instead?
Pat Meenan 2016/05/09 18:51:05 The main issue is that we need to keep track of if
196 newSheet = document.styleEngine().createSheet(e, text, startPosition , m_beforeBody);
195 newSheet->setMediaQueries(mediaQueries); 197 newSheet->setMediaQueries(mediaQueries);
196 m_loading = false; 198 m_loading = false;
197 } 199 }
198 } 200 }
199 201
200 if (m_sheet) 202 if (m_sheet)
201 clearSheet(e); 203 clearSheet(e);
202 204
203 m_sheet = newSheet; 205 m_sheet = newSheet;
204 if (m_sheet) 206 if (m_sheet)
205 m_sheet->contents()->checkLoaded(); 207 m_sheet->contents()->checkLoaded();
206 208
207 return passesContentSecurityPolicyChecks ? ProcessingSuccessful : Processing FatalError; 209 return passesContentSecurityPolicyChecks ? ProcessingSuccessful : Processing FatalError;
208 } 210 }
209 211
210 bool StyleElement::isLoading() const 212 bool StyleElement::isLoading() const
211 { 213 {
212 if (m_loading) 214 if (m_loading)
213 return true; 215 return true;
214 return m_sheet ? m_sheet->isLoading() : false; 216 return m_sheet ? m_sheet->isLoading() : false;
215 } 217 }
216 218
217 bool StyleElement::sheetLoaded(Document& document) 219 bool StyleElement::sheetLoaded(Document& document)
218 { 220 {
219 if (isLoading()) 221 if (isLoading())
220 return false; 222 return false;
221 223
222 document.styleEngine().removePendingSheet(m_sheet->ownerNode()); 224 document.styleEngine().removePendingSheet(m_sheet->ownerNode(), m_beforeBody );
223 return true; 225 return true;
224 } 226 }
225 227
226 void StyleElement::startLoadingDynamicSheet(Document& document) 228 void StyleElement::startLoadingDynamicSheet(Document& document)
227 { 229 {
228 document.styleEngine().addPendingSheet(); 230 m_beforeBody = m_beforeBody || !document.body();
231 document.styleEngine().addPendingSheet(m_beforeBody);
229 } 232 }
230 233
231 DEFINE_TRACE(StyleElement) 234 DEFINE_TRACE(StyleElement)
232 { 235 {
233 visitor->trace(m_sheet); 236 visitor->trace(m_sheet);
234 } 237 }
235 238
236 } // namespace blink 239 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/StyleElement.h ('k') | third_party/WebKit/Source/core/dom/StyleEngine.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698