OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) | 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) |
3 * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved. | 3 * Copyright (C) 2006, 2008, 2009 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 PassRefPtrWillBeRawPtr<ProcessingInstruction> ProcessingInstruction::create(Docu
ment& document, const String& target, const String& data) | 51 PassRefPtrWillBeRawPtr<ProcessingInstruction> ProcessingInstruction::create(Docu
ment& document, const String& target, const String& data) |
52 { | 52 { |
53 return adoptRefWillBeNoop(new ProcessingInstruction(document, target, data))
; | 53 return adoptRefWillBeNoop(new ProcessingInstruction(document, target, data))
; |
54 } | 54 } |
55 | 55 |
56 ProcessingInstruction::~ProcessingInstruction() | 56 ProcessingInstruction::~ProcessingInstruction() |
57 { | 57 { |
58 #if !ENABLE(OILPAN) | 58 #if !ENABLE(OILPAN) |
59 if (m_sheet) | 59 if (m_sheet) |
60 m_sheet->clearOwnerNode(); | 60 clearSheet(); |
61 | 61 |
62 // FIXME: ProcessingInstruction should not be in document here. | 62 // FIXME: ProcessingInstruction should not be in document here. |
63 // However, if we add ASSERT(!inDocument()), fast/xsl/xslt-entity.xml | 63 // However, if we add ASSERT(!inDocument()), fast/xsl/xslt-entity.xml |
64 // crashes. We need to investigate ProcessingInstruction lifetime. | 64 // crashes. We need to investigate ProcessingInstruction lifetime. |
65 if (inDocument()) { | 65 if (inDocument()) { |
66 if (m_isCSS) | 66 if (m_isCSS) |
67 document().styleEngine()->removeStyleSheetCandidateNode(this); | 67 document().styleEngine()->removeStyleSheetCandidateNode(this); |
68 else if (m_isXSL) | 68 else if (m_isXSL) |
69 document().styleEngine()->removeXSLStyleSheet(this); | 69 document().styleEngine()->removeXSLStyleSheet(this); |
70 } | 70 } |
(...skipping 12 matching lines...) Expand all Loading... |
83 | 83 |
84 PassRefPtrWillBeRawPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/) | 84 PassRefPtrWillBeRawPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/) |
85 { | 85 { |
86 // FIXME: Is it a problem that this does not copy m_localHref? | 86 // FIXME: Is it a problem that this does not copy m_localHref? |
87 // What about other data members? | 87 // What about other data members? |
88 return create(document(), m_target, m_data); | 88 return create(document(), m_target, m_data); |
89 } | 89 } |
90 | 90 |
91 void ProcessingInstruction::didAttributeChanged() | 91 void ProcessingInstruction::didAttributeChanged() |
92 { | 92 { |
93 ASSERT(!m_sheet); | 93 if (m_sheet) |
94 ASSERT(!isLoading()); | 94 clearSheet(); |
| 95 |
95 String href; | 96 String href; |
96 String charset; | 97 String charset; |
97 if (!checkStyleSheet(href, charset)) | 98 if (!checkStyleSheet(href, charset)) |
98 return; | 99 return; |
99 process(href, charset); | 100 process(href, charset); |
100 } | 101 } |
101 | 102 |
102 bool ProcessingInstruction::checkStyleSheet(String& href, String& charset) | 103 bool ProcessingInstruction::checkStyleSheet(String& href, String& charset) |
103 { | 104 { |
104 if (m_target != "xml-stylesheet" || !document().frame() || parentNode() != d
ocument()) | 105 if (m_target != "xml-stylesheet" || !document().frame() || parentNode() != d
ocument()) |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 m_sheet = cssSheet.release(); | 205 m_sheet = cssSheet.release(); |
205 | 206 |
206 // We don't need the cross-origin security check here because we are | 207 // We don't need the cross-origin security check here because we are |
207 // getting the sheet text in "strict" mode. This enforces a valid CSS MIME | 208 // getting the sheet text in "strict" mode. This enforces a valid CSS MIME |
208 // type. | 209 // type. |
209 parseStyleSheet(sheet->sheetText(true)); | 210 parseStyleSheet(sheet->sheetText(true)); |
210 } | 211 } |
211 | 212 |
212 void ProcessingInstruction::setXSLStyleSheet(const String& href, const KURL& bas
eURL, const String& sheet) | 213 void ProcessingInstruction::setXSLStyleSheet(const String& href, const KURL& bas
eURL, const String& sheet) |
213 { | 214 { |
| 215 if (!inDocument()) { |
| 216 ASSERT(!m_sheet); |
| 217 return; |
| 218 } |
| 219 |
214 ASSERT(m_isXSL); | 220 ASSERT(m_isXSL); |
215 m_sheet = XSLStyleSheet::create(this, href, baseURL); | 221 m_sheet = XSLStyleSheet::create(this, href, baseURL); |
216 parseStyleSheet(sheet); | 222 parseStyleSheet(sheet); |
217 } | 223 } |
218 | 224 |
219 void ProcessingInstruction::parseStyleSheet(const String& sheet) | 225 void ProcessingInstruction::parseStyleSheet(const String& sheet) |
220 { | 226 { |
221 if (m_isCSS) | 227 if (m_isCSS) |
222 toCSSStyleSheet(m_sheet.get())->contents()->parseString(sheet); | 228 toCSSStyleSheet(m_sheet.get())->contents()->parseString(sheet); |
223 else if (m_isXSL) | 229 else if (m_isXSL) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 | 273 |
268 if (m_isCSS) | 274 if (m_isCSS) |
269 document().styleEngine()->removeStyleSheetCandidateNode(this); | 275 document().styleEngine()->removeStyleSheetCandidateNode(this); |
270 else if (m_isXSL) | 276 else if (m_isXSL) |
271 document().styleEngine()->removeXSLStyleSheet(this); | 277 document().styleEngine()->removeXSLStyleSheet(this); |
272 | 278 |
273 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet; | 279 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet; |
274 | 280 |
275 if (m_sheet) { | 281 if (m_sheet) { |
276 ASSERT(m_sheet->ownerNode() == this); | 282 ASSERT(m_sheet->ownerNode() == this); |
277 m_sheet->clearOwnerNode(); | 283 clearSheet(); |
278 m_sheet = nullptr; | |
279 } | 284 } |
280 | 285 |
281 // If we're in document teardown, then we don't need to do any notification
of our sheet's removal. | 286 // If we're in document teardown, then we don't need to do any notification
of our sheet's removal. |
282 if (document().isActive()) | 287 if (document().isActive()) |
283 document().removedStyleSheet(removedSheet.get()); | 288 document().removedStyleSheet(removedSheet.get()); |
284 } | 289 } |
285 | 290 |
| 291 void ProcessingInstruction::clearSheet() |
| 292 { |
| 293 ASSERT(m_sheet); |
| 294 if (m_sheet->isLoading()) |
| 295 document().styleEngine()->removePendingSheet(this); |
| 296 m_sheet.release()->clearOwnerNode(); |
| 297 } |
| 298 |
286 void ProcessingInstruction::trace(Visitor* visitor) | 299 void ProcessingInstruction::trace(Visitor* visitor) |
287 { | 300 { |
288 visitor->trace(m_sheet); | 301 visitor->trace(m_sheet); |
289 CharacterData::trace(visitor); | 302 CharacterData::trace(visitor); |
290 } | 303 } |
291 | 304 |
292 } // namespace | 305 } // namespace |
OLD | NEW |