Index: third_party/WebKit/Source/core/loader/DocumentLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp |
index b8767260da3b54447598a4982e67326047400931..8ad381f8925769ab2b86e6e5c5b3030caf651936 100644 |
--- a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp |
@@ -669,6 +669,10 @@ void DocumentLoader::ensureWriter(const AtomicString& mimeType, |
if (!m_frame) |
return; |
+ SecurityOrigin* frameSecurityOrigin = nullptr; |
+ if (m_frame->document()) |
+ frameSecurityOrigin = m_frame->document()->getSecurityOrigin(); |
+ |
const AtomicString& encoding = response().textEncodingName(); |
// Prepare a DocumentInit before clearing the frame, because it may need to |
@@ -695,7 +699,7 @@ void DocumentLoader::ensureWriter(const AtomicString& mimeType, |
installNewDocument(init, mimeType, encoding, |
InstallNewDocumentReason::kNavigation, parsingPolicy, |
- overridingURL); |
+ overridingURL, frameSecurityOrigin); |
m_writer->setDocumentWasLoadedAsPartOfNavigation(); |
m_frame->document()->maybeHandleHttpRefresh( |
m_response.httpHeaderField(HTTPNames::Refresh), |
@@ -1030,13 +1034,29 @@ void setFeaturePolicy(Document* document, const String& featurePolicyHeader) { |
frame->client()->didSetFeaturePolicyHeader(parsedHeader); |
} |
+static inline bool shouldClearWindowName( |
jochen (gone - plz use gerrit)
2017/04/03 15:24:26
nit. don't add inline
andypaicu
2017/04/04 07:23:39
Done. Also moved function into the DocumentLoader
|
+ const LocalFrame& frame, |
+ SecurityOrigin* frameSecurityOrigin, |
+ const Document& newDocument) |
+{ |
+ if (!frameSecurityOrigin) |
+ return false; |
+ if (!frame.isMainFrame()) |
+ return false; |
+ if (frame.loader().opener()) |
+ return false; |
+ |
+ return !newDocument.getSecurityOrigin()->isSameSchemeHostPort(frameSecurityOrigin); |
+} |
+ |
void DocumentLoader::installNewDocument( |
const DocumentInit& init, |
const AtomicString& mimeType, |
const AtomicString& encoding, |
InstallNewDocumentReason reason, |
ParserSynchronizationPolicy parsingPolicy, |
- const KURL& overridingURL) { |
+ const KURL& overridingURL, |
+ SecurityOrigin* frameSecurityOrigin) { |
DCHECK_EQ(init.frame(), m_frame); |
DCHECK(!m_frame->document() || !m_frame->document()->isActive()); |
DCHECK_EQ(m_frame->tree().childCount(), 0u); |
@@ -1045,6 +1065,16 @@ void DocumentLoader::installNewDocument( |
m_frame->setDOMWindow(LocalDOMWindow::create(*m_frame)); |
Document* document = m_frame->domWindow()->installNewDocument(mimeType, init); |
+ |
+ if (shouldClearWindowName(*m_frame, frameSecurityOrigin, *document)) { |
+ // TODO(andypaicu): decide if we can do this without breaking functionality |
+ // after we get user data. experimentalSetNullName will just record the fact |
+ // that the name would be nulled and if the name is accessed after we will fire a UseCounter |
+ // This is what would be here if we decided to move forward with this: |
+ // m_frame->tree().setName(nullAtom); |
+ m_frame->tree().experimentalSetNulledName(); |
+ } |
+ |
m_frame->page()->chromeClient().installSupplements(*m_frame); |
if (!overridingURL.isEmpty()) |
document->setBaseURLOverride(overridingURL); |
@@ -1063,6 +1093,7 @@ void DocumentLoader::installNewDocument( |
// are sent in didCommitNavigation(). |
setFeaturePolicy(document, |
m_response.httpHeaderField(HTTPNames::Feature_Policy)); |
+ |
frameLoader().dispatchDidClearDocumentOfWindowObject(); |
} |
@@ -1076,11 +1107,12 @@ const AtomicString& DocumentLoader::mimeType() const { |
// FrameLoader::replaceDocumentWhileExecutingJavaScriptURL() |
void DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL( |
const DocumentInit& init, |
- const String& source) { |
+ const String& source, |
+ SecurityOrigin* frameSecurityOrigin) { |
installNewDocument(init, mimeType(), |
m_writer ? m_writer->encoding() : emptyAtom, |
InstallNewDocumentReason::kJavascriptURL, |
- ForceSynchronousParsing, KURL()); |
+ ForceSynchronousParsing, KURL(), frameSecurityOrigin); |
if (!source.isNull()) |
m_writer->appendReplacingData(source); |
endWriting(); |