Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: third_party/WebKit/Source/core/page/FrameTree.cpp

Issue 2317203002: Avoid mutating frame unique name after first real commit. (Closed)
Patch Set: Tweaking tests to match changed unique name behavior. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..5e60c1cff2a7b2a8ba3c595be631b473ad4cd364 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()));
Łukasz Anforowicz 2016/09/09 16:21:38 m_name and m_uniqueName are no longer in-sync now
// 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,33 +73,31 @@ void FrameTree::setName(const AtomicString& name)
m_name = name;
- // Remove our old frame name so it's not considered in calculateUniqueNameForChildFrame
- // and appendUniqueSuffix calls below.
+ // 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;
+
+ // Leave main frame's unique name set to a null string.
+ if (!parent())
+ return;
Łukasz Anforowicz 2016/09/09 16:21:38 I was wondering whether it might be a good idea to
dcheng 2016/09/09 22:00:13 I think this is fine (and if they're using it, tha
+
+ // Remove our old frame name so it's not considered in
+ // calculateUniqueNameForChildFrame call below.
m_uniqueName = AtomicString();
// Calculate a new unique name based on inputs.
- if (parent()) {
- setUniqueName(
- parent()->tree().calculateUniqueNameForChildFrame(m_thisFrame, name, nullAtom));
- } else if (name.isEmpty() || !uniqueNameExists(name)) {
- // Only main frame can have an empty unique name, so for main frames
- // emptiness guarantees uniquness.
- setUniqueName(name);
- } else {
- setUniqueName(appendUniqueSuffix(name, "<!--framePosition"));
- }
+ setUniqueName(
+ parent()->tree().calculateUniqueNameForChildFrame(m_thisFrame, name, nullAtom));
}
void FrameTree::setPrecalculatedName(const AtomicString& name, const AtomicString& uniqueName)
{
- if (!parent()) {
- DCHECK(uniqueName == name);
Łukasz Anforowicz 2016/09/09 16:21:38 We can no longer have the DCHECK above, because af
- } 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.

Powered by Google App Engine
This is Rietveld 408576698