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

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

Issue 1032033002: Fire error events for a variety of script and style failures. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixed test failures Created 5 years, 9 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
« no previous file with comments | « Source/core/dom/StyleElement.h ('k') | Source/core/html/HTMLLinkElement.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 } 55 }
56 56
57 StyleElement::~StyleElement() 57 StyleElement::~StyleElement()
58 { 58 {
59 #if !ENABLE(OILPAN) 59 #if !ENABLE(OILPAN)
60 if (m_sheet) 60 if (m_sheet)
61 clearSheet(); 61 clearSheet();
62 #endif 62 #endif
63 } 63 }
64 64
65 void StyleElement::processStyleSheet(Document& document, Element* element) 65 StyleElement::ProcessingResult StyleElement::processStyleSheet(Document& documen t, Element* element)
66 { 66 {
67 TRACE_EVENT0("blink", "StyleElement::processStyleSheet"); 67 TRACE_EVENT0("blink", "StyleElement::processStyleSheet");
68 ASSERT(element); 68 ASSERT(element);
69 ASSERT(element->inDocument()); 69 ASSERT(element->inDocument());
70 70
71 m_registeredAsCandidate = true; 71 m_registeredAsCandidate = true;
72 document.styleEngine().addStyleSheetCandidateNode(element, m_createdByParser ); 72 document.styleEngine().addStyleSheetCandidateNode(element, m_createdByParser );
73 if (m_createdByParser) 73 if (m_createdByParser)
74 return; 74 return ProcessingSuccessful;
75 75
76 process(element); 76 return process(element);
77 } 77 }
78 78
79 void StyleElement::insertedInto(Element* element, ContainerNode* insertionPoint) 79 void StyleElement::insertedInto(Element* element, ContainerNode* insertionPoint)
80 { 80 {
81 if (!insertionPoint->inDocument() || !element->isInShadowTree()) 81 if (!insertionPoint->inDocument() || !element->isInShadowTree())
82 return; 82 return;
83 if (ShadowRoot* scope = element->containingShadowRoot()) 83 if (ShadowRoot* scope = element->containingShadowRoot())
84 scope->registerScopedHTMLStyleChild(); 84 scope->registerScopedHTMLStyleChild();
85 } 85 }
86 86
(...skipping 27 matching lines...) Expand all
114 { 114 {
115 if (m_sheet) 115 if (m_sheet)
116 m_sheet->clearOwnerNode(); 116 m_sheet->clearOwnerNode();
117 117
118 if (m_registeredAsCandidate) { 118 if (m_registeredAsCandidate) {
119 ASSERT(element->inDocument()); 119 ASSERT(element->inDocument());
120 document.styleEngine().removeStyleSheetCandidateNode(element, element->t reeScope()); 120 document.styleEngine().removeStyleSheetCandidateNode(element, element->t reeScope());
121 } 121 }
122 } 122 }
123 123
124 void StyleElement::childrenChanged(Element* element) 124 StyleElement::ProcessingResult StyleElement::childrenChanged(Element* element)
125 { 125 {
126 ASSERT(element); 126 ASSERT(element);
127 if (m_createdByParser) 127 if (m_createdByParser)
128 return; 128 return ProcessingSuccessful;
129 129
130 process(element); 130 return process(element);
131 } 131 }
132 132
133 void StyleElement::finishParsingChildren(Element* element) 133 StyleElement::ProcessingResult StyleElement::finishParsingChildren(Element* elem ent)
134 { 134 {
135 ASSERT(element); 135 ASSERT(element);
136 process(element); 136 ProcessingResult result = process(element);
137 m_createdByParser = false; 137 m_createdByParser = false;
138 return result;
138 } 139 }
139 140
140 void StyleElement::process(Element* element) 141 StyleElement::ProcessingResult StyleElement::process(Element* element)
141 { 142 {
142 if (!element || !element->inDocument()) 143 if (!element || !element->inDocument())
143 return; 144 return ProcessingSuccessful;
144 createSheet(element, element->textFromChildren()); 145 return createSheet(element, element->textFromChildren());
145 } 146 }
146 147
147 void StyleElement::clearSheet(Element* ownerElement) 148 void StyleElement::clearSheet(Element* ownerElement)
148 { 149 {
149 ASSERT(m_sheet); 150 ASSERT(m_sheet);
150 151
151 if (ownerElement && m_sheet->isLoading()) 152 if (ownerElement && m_sheet->isLoading())
152 ownerElement->document().styleEngine().removePendingSheet(ownerElement); 153 ownerElement->document().styleEngine().removePendingSheet(ownerElement);
153 154
154 m_sheet.release()->clearOwnerNode(); 155 m_sheet.release()->clearOwnerNode();
155 } 156 }
156 157
157 static bool shouldBypassMainWorldCSP(Element* element) 158 static bool shouldBypassMainWorldCSP(Element* element)
158 { 159 {
159 // Main world CSP is bypassed within an isolated world. 160 // Main world CSP is bypassed within an isolated world.
160 LocalFrame* frame = element->document().frame(); 161 LocalFrame* frame = element->document().frame();
161 if (frame && frame->script().shouldBypassMainWorldCSP()) 162 if (frame && frame->script().shouldBypassMainWorldCSP())
162 return true; 163 return true;
163 164
164 // Main world CSP is bypassed for style elements in user agent shadow DOM. 165 // Main world CSP is bypassed for style elements in user agent shadow DOM.
165 ShadowRoot* root = element->containingShadowRoot(); 166 ShadowRoot* root = element->containingShadowRoot();
166 if (root && root->type() == ShadowRoot::ClosedShadowRoot) 167 if (root && root->type() == ShadowRoot::ClosedShadowRoot)
167 return true; 168 return true;
168 169
169 return false; 170 return false;
170 } 171 }
171 172
172 void StyleElement::createSheet(Element* e, const String& text) 173 StyleElement::ProcessingResult StyleElement::createSheet(Element* e, const Strin g& text)
173 { 174 {
174 ASSERT(e); 175 ASSERT(e);
175 ASSERT(e->inDocument()); 176 ASSERT(e->inDocument());
176 Document& document = e->document(); 177 Document& document = e->document();
177 if (m_sheet) 178 if (m_sheet)
178 clearSheet(e); 179 clearSheet(e);
179 180
180 const ContentSecurityPolicy* csp = document.contentSecurityPolicy(); 181 const ContentSecurityPolicy* csp = document.contentSecurityPolicy();
181 bool passesContentSecurityPolicyChecks = shouldBypassMainWorldCSP(e) 182 bool passesContentSecurityPolicyChecks = shouldBypassMainWorldCSP(e)
182 || csp->allowStyleWithHash(text) 183 || csp->allowStyleWithHash(text)
(...skipping 11 matching lines...) Expand all
194 m_loading = true; 195 m_loading = true;
195 TextPosition startPosition = m_startPosition == TextPosition::belowR angePosition() ? TextPosition::minimumPosition() : m_startPosition; 196 TextPosition startPosition = m_startPosition == TextPosition::belowR angePosition() ? TextPosition::minimumPosition() : m_startPosition;
196 m_sheet = document.styleEngine().createSheet(e, text, startPosition, m_createdByParser); 197 m_sheet = document.styleEngine().createSheet(e, text, startPosition, m_createdByParser);
197 m_sheet->setMediaQueries(mediaQueries.release()); 198 m_sheet->setMediaQueries(mediaQueries.release());
198 m_loading = false; 199 m_loading = false;
199 } 200 }
200 } 201 }
201 202
202 if (m_sheet) 203 if (m_sheet)
203 m_sheet->contents()->checkLoaded(); 204 m_sheet->contents()->checkLoaded();
205
206 return passesContentSecurityPolicyChecks ? ProcessingSuccessful : Processing FatalError;
204 } 207 }
205 208
206 bool StyleElement::isLoading() const 209 bool StyleElement::isLoading() const
207 { 210 {
208 if (m_loading) 211 if (m_loading)
209 return true; 212 return true;
210 return m_sheet ? m_sheet->isLoading() : false; 213 return m_sheet ? m_sheet->isLoading() : false;
211 } 214 }
212 215
213 bool StyleElement::sheetLoaded(Document& document) 216 bool StyleElement::sheetLoaded(Document& document)
214 { 217 {
215 if (isLoading()) 218 if (isLoading())
216 return false; 219 return false;
217 220
218 document.styleEngine().removePendingSheet(m_sheet->ownerNode()); 221 document.styleEngine().removePendingSheet(m_sheet->ownerNode());
219 return true; 222 return true;
220 } 223 }
221 224
222 void StyleElement::startLoadingDynamicSheet(Document& document) 225 void StyleElement::startLoadingDynamicSheet(Document& document)
223 { 226 {
224 document.styleEngine().addPendingSheet(); 227 document.styleEngine().addPendingSheet();
225 } 228 }
226 229
227 DEFINE_TRACE(StyleElement) 230 DEFINE_TRACE(StyleElement)
228 { 231 {
229 visitor->trace(m_sheet); 232 visitor->trace(m_sheet);
230 } 233 }
231 234
232 } 235 }
OLDNEW
« no previous file with comments | « Source/core/dom/StyleElement.h ('k') | Source/core/html/HTMLLinkElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698