Index: Source/core/html/HTMLImportsController.cpp |
diff --git a/Source/core/html/HTMLImportsController.cpp b/Source/core/html/HTMLImportsController.cpp |
index 91c93204cf1b067164bd2738eb38709b88723eb2..7fedf820f79542afa42f729906f5f7505134592b 100644 |
--- a/Source/core/html/HTMLImportsController.cpp |
+++ b/Source/core/html/HTMLImportsController.cpp |
@@ -38,6 +38,7 @@ |
#include "core/loader/DocumentWriter.h" |
#include "core/loader/cache/CachedScript.h" |
#include "core/loader/cache/ResourceFetcher.h" |
+#include "core/page/ContentSecurityPolicy.h" |
#include "weborigin/SecurityOrigin.h" |
namespace WebCore { |
@@ -82,7 +83,8 @@ void LinkImport::process() |
HTMLImportsController::provideTo(m_owner->document()); |
} |
- HTMLImportsController* controller = m_owner->document()->import()->controller(); |
+ HTMLImport* parent = m_owner->document()->import(); |
+ HTMLImportsController* controller = parent->controller(); |
if (RefPtr<HTMLImportLoader> found = controller->findLinkFor(builder.url())) { |
m_loader = found; |
return; |
@@ -90,11 +92,11 @@ void LinkImport::process() |
FetchRequest request = builder.build(true); |
request.setPotentiallyCrossOriginEnabled(controller->securityOrigin(), DoNotAllowStoredCredentials); |
- CachedResourceHandle<CachedRawResource> resource = controller->fetcher()->requestRawResource(request); |
+ CachedResourceHandle<CachedRawResource> resource = m_owner->document()->fetcher()->requestImport(request); |
if (!resource) |
return; |
- m_loader = HTMLImportLoader::create(controller, builder.url(), resource); |
+ m_loader = HTMLImportLoader::create(parent, builder.url(), resource); |
} |
void LinkImport::ownerRemoved() |
@@ -131,7 +133,7 @@ HTMLImportLoader::~HTMLImportLoader() |
void HTMLImportLoader::responseReceived(CachedResource*, const ResourceResponse& response) |
{ |
- setState(startParsing(response)); |
+ setState(startWritingAndParsing(response)); |
} |
void HTMLImportLoader::dataReceived(CachedResource*, const char* data, int length) |
@@ -142,7 +144,7 @@ void HTMLImportLoader::dataReceived(CachedResource*, const char* data, int lengt |
void HTMLImportLoader::notifyFinished(CachedResource*) |
{ |
- setState(finish()); |
+ setState(finishWriting()); |
} |
void HTMLImportLoader::setState(State state) |
@@ -152,40 +154,40 @@ void HTMLImportLoader::setState(State state) |
m_state = state; |
+ if (m_state == StateReady || m_state == StateError || m_state == StateWritten) { |
+ if (RefPtr<DocumentWriter> writer = m_writer.release()) |
+ writer->end(); |
+ } |
+ |
if (m_state == StateReady || m_state == StateError) |
dispose(); |
} |
void HTMLImportLoader::dispose() |
{ |
- if (m_writer) { |
- m_writer->end(); |
- m_writer.clear(); |
- } |
- |
if (m_resource) { |
m_resource->removeClient(this); |
m_resource = 0; |
} |
- |
if (HTMLImportsController* controller = this->controller()) |
controller->didLoad(this); |
} |
-HTMLImportLoader::State HTMLImportLoader::startParsing(const ResourceResponse& response) |
+HTMLImportLoader::State HTMLImportLoader::startWritingAndParsing(const ResourceResponse& response) |
{ |
// Current canAccess() implementation isn't sufficient for catching cross-domain redirects: http://crbug.com/256976 |
- if (!controller()->fetcher()->canAccess(m_resource.get())) |
+ if (!m_parent->document()->fetcher()->canAccess(m_resource.get())) |
return StateError; |
m_importedDocument = HTMLDocument::create(DocumentInit(response.url(), 0, this)); |
+ m_importedDocument->initContentSecurityPolicy(ContentSecurityPolicyResponseHeaders(response)); |
m_writer = DocumentWriter::create(m_importedDocument.get(), response.mimeType(), response.textEncodingName()); |
return StateLoading; |
} |
-HTMLImportLoader::State HTMLImportLoader::finish() |
+HTMLImportLoader::State HTMLImportLoader::finishWriting() |
{ |
if (!m_parent) |
return StateError; |
@@ -193,6 +195,14 @@ HTMLImportLoader::State HTMLImportLoader::finish() |
// We don't take such a case as an error because the partially-loaded document has been visible from script at this point. |
if (m_resource->loadFailedOrCanceled() && !m_writer) |
return StateError; |
+ |
+ return StateWritten; |
+} |
+ |
+HTMLImportLoader::State HTMLImportLoader::finishParsing() |
+{ |
+ if (!m_parent) |
+ return StateError; |
return StateReady; |
} |
@@ -232,6 +242,12 @@ void HTMLImportLoader::wasDetachedFromDocument() |
ASSERT_NOT_REACHED(); |
} |
+void HTMLImportLoader::didFinishParsing() |
+{ |
+ setState(finishParsing()); |
+} |
+ |
+ |
void HTMLImportsController::provideTo(Document* master) |
{ |
DEFINE_STATIC_LOCAL(const char*, name, ("HTMLImportsController")); |
@@ -301,8 +317,12 @@ ResourceFetcher* HTMLImportsController::fetcher() const |
bool HTMLImportsController::haveChildrenLoaded(HTMLImport* parent) const |
{ |
for (size_t i = 0; i < m_imports.size(); ++i) { |
- if (!m_imports[i]->isDone() && m_imports[i]->parent() == parent) |
- return false; |
+ if (!m_imports[i]->isDone()) { |
+ for (HTMLImport* ancestor = m_imports[i]->parent(); ancestor; ancestor = ancestor->parent()) { |
+ if (ancestor == parent) |
+ return false; |
+ } |
+ } |
} |
return true; |
@@ -328,4 +348,8 @@ void HTMLImportsController::wasDetachedFromDocument() |
clear(); |
} |
+void HTMLImportsController::didFinishParsing() |
+{ |
+} |
+ |
} // namespace WebCore |