summaryrefslogtreecommitdiffstats
path: root/WebCore/dom/StyleElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/dom/StyleElement.cpp')
-rw-r--r--WebCore/dom/StyleElement.cpp69
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;
+}
+
}