Index: Source/core/html/HTMLImportsController.cpp |
diff --git a/Source/core/html/HTMLImportsController.cpp b/Source/core/html/HTMLImportsController.cpp |
index ee1e137fa4962df03d52bdf602ab0bfbf926e3de..9fca9f241231597b861ecbae9918d0a41385daf9 100644 |
--- a/Source/core/html/HTMLImportsController.cpp |
+++ b/Source/core/html/HTMLImportsController.cpp |
@@ -110,6 +110,7 @@ PassRefPtr<HTMLImportLoader> HTMLImportLoader::create(HTMLImport* parent, const |
{ |
RefPtr<HTMLImportLoader> loader = adoptRef(new HTMLImportLoader(parent, url, resource)); |
loader->controller()->addImport(loader); |
+ parent->appendChild(loader.get()); |
return loader.release(); |
} |
@@ -170,8 +171,8 @@ void HTMLImportLoader::dispose() |
m_resource = 0; |
} |
- if (HTMLImportsController* controller = this->controller()) |
- controller->didLoad(this); |
+ ASSERT(!document() || !document()->parsing()); |
+ controller()->scheduleUnblock(); |
} |
HTMLImportLoader::State HTMLImportLoader::startWritingAndParsing(const ResourceResponse& response) |
@@ -225,12 +226,12 @@ HTMLImportsController* HTMLImportLoader::controller() |
return m_parent ? m_parent->controller() : 0; |
} |
-HTMLImport* HTMLImportLoader::parent() |
+HTMLImport* HTMLImportLoader::parent() const |
{ |
return m_parent; |
} |
-Document* HTMLImportLoader::document() |
+Document* HTMLImportLoader::document() const |
{ |
return m_importedDocument.get(); |
} |
@@ -247,6 +248,12 @@ void HTMLImportLoader::didFinishParsing() |
setState(finishParsing()); |
} |
+bool HTMLImportLoader::isProcessing() const |
+{ |
+ if (!m_importedDocument) |
+ return !isDone(); |
+ return m_importedDocument->parsing(); |
+} |
void HTMLImportsController::provideTo(Document* master) |
{ |
@@ -258,6 +265,7 @@ void HTMLImportsController::provideTo(Document* master) |
HTMLImportsController::HTMLImportsController(Document* master) |
: m_master(master) |
+ , m_unblockTimer(this, &HTMLImportsController::unblockTimerFired) |
{ |
} |
@@ -286,14 +294,6 @@ void HTMLImportsController::showSecurityErrorMessage(const String& message) |
m_master->addConsoleMessage(JSMessageSource, ErrorMessageLevel, message); |
} |
-void HTMLImportsController::didLoad(HTMLImportLoader* loadedImport) |
-{ |
- for (HTMLImport* ancestorToNotify = loadedImport->parent(); ancestorToNotify; ancestorToNotify = ancestorToNotify->parent()) { |
- if (haveChildrenLoaded(ancestorToNotify)) |
- ancestorToNotify->document()->didLoadAllImports(); |
- } |
-} |
- |
PassRefPtr<HTMLImportLoader> HTMLImportsController::findLinkFor(const KURL& url) const |
{ |
for (size_t i = 0; i < m_imports.size(); ++i) { |
@@ -314,31 +314,17 @@ ResourceFetcher* HTMLImportsController::fetcher() const |
return m_master->fetcher(); |
} |
-bool HTMLImportsController::haveChildrenLoaded(HTMLImport* parent) const |
-{ |
- for (size_t i = 0; i < m_imports.size(); ++i) { |
- if (!m_imports[i]->isDone()) { |
- for (HTMLImport* ancestor = m_imports[i]->parent(); ancestor; ancestor = ancestor->parent()) { |
- if (ancestor == parent) |
- return false; |
- } |
- } |
- } |
- |
- return true; |
-} |
- |
HTMLImportsController* HTMLImportsController::controller() |
{ |
return this; |
} |
-HTMLImport* HTMLImportsController::parent() |
+HTMLImport* HTMLImportsController::parent() const |
{ |
return 0; |
} |
-Document* HTMLImportsController::document() |
+Document* HTMLImportsController::document() const |
{ |
return m_master; |
} |
@@ -352,4 +338,24 @@ void HTMLImportsController::didFinishParsing() |
{ |
} |
+bool HTMLImportsController::isProcessing() const |
+{ |
+ return m_master->parsing(); |
+} |
+ |
+void HTMLImportsController::scheduleUnblock() |
+{ |
+ if (m_unblockTimer.isActive()) |
+ return; |
+ m_unblockTimer.startOneShot(0); |
+} |
+ |
+void HTMLImportsController::unblockTimerFired(Timer<HTMLImportsController>*) |
+{ |
+ do { |
+ m_unblockTimer.stop(); |
+ HTMLImport::unblock(this); |
+ } while (m_unblockTimer.isActive()); |
+} |
+ |
} // namespace WebCore |