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

Side by Side Diff: Source/web/tests/WebFrameTest.cpp

Issue 544443002: Detach all subframes before swapping a frame. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Remove ASSERT in detachChildren, since FrameLoader::commitProvisionalLoad can hit it with ref count… Created 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 6051 matching lines...) Expand 10 before | Expand all | Expand 10 after
6062 FrameTestHelpers::loadFrame(localFrame, m_baseURL + "subframe-hello.html"); 6062 FrameTestHelpers::loadFrame(localFrame, m_baseURL + "subframe-hello.html");
6063 std::string content = localFrame->contentAsText(1024).utf8(); 6063 std::string content = localFrame->contentAsText(1024).utf8();
6064 EXPECT_EQ("hello", content); 6064 EXPECT_EQ("hello", content);
6065 6065
6066 // Manually reset to break WebViewHelper's dependency on the stack allocated 6066 // Manually reset to break WebViewHelper's dependency on the stack allocated
6067 // TestWebFrameClient. 6067 // TestWebFrameClient.
6068 reset(); 6068 reset();
6069 remoteFrame->close(); 6069 remoteFrame->close();
6070 } 6070 }
6071 6071
6072 void swapAndVerifySubframeConsistency(const char* const message, WebFrame* oldFr ame, WebFrame* newFrame)
6073 {
6074 SCOPED_TRACE(message);
6075
6076 EXPECT_TRUE(oldFrame->firstChild());
6077 oldFrame->swap(newFrame);
6078
6079 EXPECT_FALSE(newFrame->firstChild());
6080 EXPECT_FALSE(newFrame->lastChild());
6081 }
6082
6083 TEST_F(WebFrameSwapTest, SwapParentShouldDetachChildren)
6084 {
6085 WebRemoteFrame* remoteFrame = WebRemoteFrame::create(0);
6086 WebFrame* targetFrame = mainFrame()->firstChild()->nextSibling();
6087 EXPECT_TRUE(targetFrame);
6088 swapAndVerifySubframeConsistency("local->remote", targetFrame, remoteFrame);
6089
6090 targetFrame = mainFrame()->firstChild()->nextSibling();
6091 EXPECT_TRUE(targetFrame);
6092
6093 // Create child frames in the target frame before testing the swap.
6094 FrameTestHelpers::TestWebFrameClient remoteFrameClient;
6095 remoteFrame->createRemoteChild("", &remoteFrameClient);
6096
6097 FrameTestHelpers::TestWebFrameClient client;
6098 WebFrame* localFrame = WebLocalFrame::create(&client);
6099 swapAndVerifySubframeConsistency("remote->local", targetFrame, localFrame);
6100
6101 // FIXME: This almost certainly fires more load events on the iframe element
6102 // than it should.
6103 // Finally, make sure an embedder triggered load in the local frame swapped
6104 // back in works.
6105 FrameTestHelpers::loadFrame(localFrame, m_baseURL + "subframe-hello.html");
6106 std::string content = localFrame->contentAsText(1024).utf8();
6107 EXPECT_EQ("hello", content);
6108
6109 // Manually reset to break WebViewHelper's dependency on the stack allocated
6110 // TestWebFrameClient.
6111 reset();
6112 remoteFrame->close();
6113 }
6114
6072 class MockDocumentThreadableLoaderClient : public DocumentThreadableLoaderClient { 6115 class MockDocumentThreadableLoaderClient : public DocumentThreadableLoaderClient {
6073 public: 6116 public:
6074 MockDocumentThreadableLoaderClient() : m_failed(false) { } 6117 MockDocumentThreadableLoaderClient() : m_failed(false) { }
6075 virtual void didFail(const ResourceError&) OVERRIDE { m_failed = true;} 6118 virtual void didFail(const ResourceError&) OVERRIDE { m_failed = true;}
6076 6119
6077 void reset() { m_failed = false; } 6120 void reset() { m_failed = false; }
6078 bool failed() { return m_failed; } 6121 bool failed() { return m_failed; }
6079 6122
6080 bool m_failed; 6123 bool m_failed;
6081 }; 6124 };
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
6173 EXPECT_EQ(1u, frameClient.navigationalDataReceivedCount()); 6216 EXPECT_EQ(1u, frameClient.navigationalDataReceivedCount());
6174 6217
6175 // Neither should a page reload. 6218 // Neither should a page reload.
6176 localFrame->reload(); 6219 localFrame->reload();
6177 EXPECT_EQ(4u, frameClient.provisionalLoadCount()); 6220 EXPECT_EQ(4u, frameClient.provisionalLoadCount());
6178 EXPECT_FALSE(frameClient.wasLastProvisionalLoadATransition()); 6221 EXPECT_FALSE(frameClient.wasLastProvisionalLoadATransition());
6179 EXPECT_EQ(1u, frameClient.navigationalDataReceivedCount()); 6222 EXPECT_EQ(1u, frameClient.navigationalDataReceivedCount());
6180 } 6223 }
6181 6224
6182 } // namespace 6225 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698