diff options
Diffstat (limited to 'WebCore/dom/StyleElement.cpp')
-rw-r--r-- | WebCore/dom/StyleElement.cpp | 69 |
1 files changed, 60 insertions, 9 deletions
diff --git a/WebCore/dom/StyleElement.cpp b/WebCore/dom/StyleElement.cpp index 580f318..4c0e56f 100644 --- a/WebCore/dom/StyleElement.cpp +++ b/WebCore/dom/StyleElement.cpp @@ -26,11 +26,17 @@ #include "Element.h" #include "MediaList.h" #include "MediaQueryEvaluator.h" +#include "ScriptableDocumentParser.h" namespace WebCore { -StyleElement::StyleElement() +StyleElement::StyleElement(Document* document, bool createdByParser) + : m_createdByParser(createdByParser) + , m_loading(false) + , m_startLineNumber(0) { + if (createdByParser && document && document->scriptableDocumentParser()) + m_startLineNumber = document->scriptableDocumentParser()->lineNumber(); } StyleSheet* StyleElement::sheet(Element* e) @@ -40,13 +46,23 @@ StyleSheet* StyleElement::sheet(Element* e) return m_sheet.get(); } -void StyleElement::insertedIntoDocument(Document*, Element* element) +void StyleElement::insertedIntoDocument(Document* document, Element* element) { - process(element, 0); + ASSERT(document); + ASSERT(element); + document->addStyleSheetCandidateNode(element, m_createdByParser); + if (m_createdByParser) + return; + + process(element); } -void StyleElement::removedFromDocument(Document* document) +void StyleElement::removedFromDocument(Document* document, Element* element) { + ASSERT(document); + ASSERT(element); + document->removeStyleSheetCandidateNode(element); + // If we're in document teardown, then we don't need to do any notification of our sheet's removal. if (!document->renderer()) return; @@ -56,7 +72,24 @@ void StyleElement::removedFromDocument(Document* document) document->updateStyleSelector(); } -void StyleElement::process(Element* e, int startLineNumber) +void StyleElement::childrenChanged(Element* element) +{ + ASSERT(element); + if (m_createdByParser) + return; + + process(element); +} + +void StyleElement::finishParsingChildren(Element* element) +{ + ASSERT(element); + process(element); + sheet(element); + m_createdByParser = false; +} + +void StyleElement::process(Element* e) { if (!e || !e->inDocument()) return; @@ -82,14 +115,15 @@ void StyleElement::process(Element* e, int startLineNumber) } ASSERT(p == text + resultLength); - createSheet(e, startLineNumber, sheetText); + createSheet(e, m_startLineNumber, sheetText); } void StyleElement::createSheet(Element* e, int startLineNumber, const String& text) { + ASSERT(e); Document* document = e->document(); if (m_sheet) { - if (static_cast<CSSStyleSheet*>(m_sheet.get())->isLoading()) + if (m_sheet->isLoading()) document->removePendingSheet(); m_sheet = 0; } @@ -102,12 +136,12 @@ void StyleElement::createSheet(Element* e, int startLineNumber, const String& te MediaQueryEvaluator printEval("print", true); if (screenEval.eval(mediaList.get()) || printEval.eval(mediaList.get())) { document->addPendingSheet(); - setLoading(true); + m_loading = true; m_sheet = CSSStyleSheet::create(e, String(), KURL(), document->inputEncoding()); m_sheet->parseStringAtLine(text, !document->inCompatMode(), startLineNumber); m_sheet->setMedia(mediaList.get()); m_sheet->setTitle(e->title()); - setLoading(false); + m_loading = false; } } @@ -115,4 +149,21 @@ void StyleElement::createSheet(Element* e, int startLineNumber, const String& te m_sheet->checkLoaded(); } +bool StyleElement::isLoading() const +{ + if (m_loading) + return true; + return m_sheet ? m_sheet->isLoading() : false; +} + +bool StyleElement::sheetLoaded(Document* document) +{ + ASSERT(document); + if (isLoading()) + return false; + + document->removePendingSheet(); + return true; +} + } |