Index: Source/core/html/imports/HTMLImportsController.cpp |
diff --git a/Source/core/html/imports/HTMLImportsController.cpp b/Source/core/html/imports/HTMLImportsController.cpp |
index 42cd73986446a86f3ef96ead626ea902b9045353..9e75672fe8ae1b75af621e71487678765d03c347 100644 |
--- a/Source/core/html/imports/HTMLImportsController.cpp |
+++ b/Source/core/html/imports/HTMLImportsController.cpp |
@@ -79,11 +79,22 @@ void HTMLImportsController::clear() |
m_recalcTimer.stop(); |
} |
+static bool makesCyclce(HTMLImport* parent, const KURL& url) |
dominicc (has gone to gerrit)
2014/04/18 00:56:26
Spelling: cycle
Hajime Morrita
2014/04/18 01:48:33
Done.
|
+{ |
+ for (HTMLImport* ancestor = parent; ancestor; ancestor = ancestor->parent()) { |
+ if (!ancestor->isRoot() && equalIgnoringFragmentIdentifier(toHTMLImportChild(parent)->url(), url)) |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
HTMLImportChild* HTMLImportsController::createChild(const KURL& url, HTMLImport* parent, HTMLImportChildClient* client) |
{ |
- OwnPtr<HTMLImportChild> loader = adoptPtr(new HTMLImportChild(*m_master, url, client->isSync() ? HTMLImport::Sync : HTMLImport::Async)); |
+ HTMLImport::SyncMode mode = client->isSync() && !makesCyclce(parent, url) ? HTMLImport::Sync : HTMLImport::Async; |
+ OwnPtr<HTMLImportChild> loader = adoptPtr(new HTMLImportChild(*m_master, url, mode)); |
loader->setClient(client); |
- parent->appendChild(loader.get()); |
+ parent->appendImport(loader.get()); |
m_imports.append(loader.release()); |
return m_imports.last().get(); |
} |
@@ -123,7 +134,7 @@ HTMLImportChild* HTMLImportsController::findLinkFor(const KURL& url, HTMLImport* |
{ |
for (size_t i = 0; i < m_imports.size(); ++i) { |
HTMLImportChild* candidate = m_imports[i].get(); |
- if (candidate != excluding && equalIgnoringFragmentIdentifier(candidate->url(), url) && candidate->hasLoader()) |
+ if (candidate != excluding && equalIgnoringFragmentIdentifier(candidate->url(), url) && candidate->loader()) |
return candidate; |
} |
@@ -154,7 +165,7 @@ bool HTMLImportsController::shouldBlockScriptExecution(const Document& document) |
{ |
ASSERT(document.importsController() == this); |
if (HTMLImportLoader* loader = loaderFor(document)) |
- return loader->firstImport()->state().shouldBlockScriptExecution(); |
+ return loader->shouldBlockScriptExecution(); |
return state().shouldBlockScriptExecution(); |
} |
@@ -165,11 +176,6 @@ void HTMLImportsController::wasDetachedFrom(const Document& document) |
clear(); |
} |
-bool HTMLImportsController::hasLoader() const |
-{ |
- return true; |
-} |
- |
bool HTMLImportsController::isDone() const |
{ |
return !m_master->parsing() && m_master->styleEngine()->haveStylesheetsLoaded(); |