Index: third_party/WebKit/Source/core/page/FrameTree.cpp |
diff --git a/third_party/WebKit/Source/core/page/FrameTree.cpp b/third_party/WebKit/Source/core/page/FrameTree.cpp |
index 5742191df101fb60dd771901f535fb76bb6c1d27..e5b70f736e45c19dd7c395c724e3aa29e60fc621 100644 |
--- a/third_party/WebKit/Source/core/page/FrameTree.cpp |
+++ b/third_party/WebKit/Source/core/page/FrameTree.cpp |
@@ -62,7 +62,7 @@ void FrameTree::setName(const AtomicString& name) |
// This assert helps ensure that early return (a few lines below) won't |
// result in an uninitialized m_uniqueName. |
DCHECK(!m_uniqueName.isNull() |
- || (m_uniqueName.isNull() && m_name.isNull() && !parent())); |
+ || (m_uniqueName.isNull() && !parent())); |
// Do not recalculate m_uniqueName if there is no real change of m_name. |
// This is not just a performance optimization - other code relies on the |
@@ -73,6 +73,11 @@ void FrameTree::setName(const AtomicString& name) |
m_name = name; |
+ // https://crbug.com/607205: Make sure m_uniqueName doesn't change after |
+ // initial navigation - session history depends on this. |
+ if (toLocalFrame(m_thisFrame)->loader().stateMachine()->committedFirstRealDocumentLoad()) |
+ return; |
+ |
// Remove our old frame name so it's not considered in calculateUniqueNameForChildFrame |
// and appendUniqueSuffix calls below. |
m_uniqueName = AtomicString(); |
@@ -92,14 +97,11 @@ void FrameTree::setName(const AtomicString& name) |
void FrameTree::setPrecalculatedName(const AtomicString& name, const AtomicString& uniqueName) |
{ |
- if (!parent()) { |
- DCHECK(uniqueName == name); |
- } else { |
- DCHECK(!uniqueName.isEmpty()); |
- } |
- |
m_name = name; |
+ // Non-main frames should have a non-empty unique name. |
+ DCHECK(!parent() || !uniqueName.isEmpty()); |
+ |
// TODO(lukasza): We would like to assert uniqueness below (i.e. by calling |
// setUniqueName), but |
// 1) uniqueness is currently violated by provisional/old frame pairs. |
@@ -317,7 +319,8 @@ AtomicString FrameTree::calculateUniqueNameForChildFrame( |
// 2) assignedName is empty for a non-main frame) |
// |
// assignedName ::= value of iframe's name attribute |
- // or value assigned to window.name |
+ // or value assigned to window.name (*before* the first |
+ // real commit - afterwards unique name stays immutable). |
// |
// generatedName ::= oldGeneratedName newUniqueSuffix? |
// (newUniqueSuffix is only present if oldGeneratedName was |