| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/frame_host/frame_tree.h" | 5 #include "content/browser/frame_host/frame_tree.h" |
| 6 | 6 |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "content/browser/frame_host/navigator.h" | 9 #include "content/browser/frame_host/navigator.h" |
| 10 #include "content/browser/frame_host/render_frame_host_factory.h" | 10 #include "content/browser/frame_host/render_frame_host_factory.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 result->append("]"); | 46 result->append("]"); |
| 47 } | 47 } |
| 48 }; | 48 }; |
| 49 | 49 |
| 50 // The root node never changes during navigation even though its | 50 // The root node never changes during navigation even though its |
| 51 // RenderFrameHost does. | 51 // RenderFrameHost does. |
| 52 // - Swapping main frame doesn't change root node. | 52 // - Swapping main frame doesn't change root node. |
| 53 // - Swapping back to NULL doesn't crash (easier tear-down for interstitials). | 53 // - Swapping back to NULL doesn't crash (easier tear-down for interstitials). |
| 54 // - Main frame does not own RenderFrameHost. | 54 // - Main frame does not own RenderFrameHost. |
| 55 TEST_F(FrameTreeTest, RootNode) { | 55 TEST_F(FrameTreeTest, RootNode) { |
| 56 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL); | 56 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL, NULL); |
| 57 | 57 |
| 58 // Initial state has empty node. | 58 // Initial state has empty node. |
| 59 FrameTreeNode* root = frame_tree.root(); | 59 FrameTreeNode* root = frame_tree.root(); |
| 60 ASSERT_TRUE(root); | 60 ASSERT_TRUE(root); |
| 61 EXPECT_FALSE(frame_tree.GetMainFrame()); | 61 EXPECT_FALSE(frame_tree.GetMainFrame()); |
| 62 | 62 |
| 63 // Swap in main frame. | 63 // Swap in main frame. |
| 64 RenderFrameHostImpl* dummy = reinterpret_cast<RenderFrameHostImpl*>(0x1); | 64 RenderFrameHostImpl* dummy = reinterpret_cast<RenderFrameHostImpl*>(0x1); |
| 65 frame_tree.SwapMainFrame(dummy); | 65 frame_tree.SwapMainFrame(dummy); |
| 66 EXPECT_EQ(root, frame_tree.root()); | 66 EXPECT_EQ(root, frame_tree.root()); |
| 67 EXPECT_EQ(dummy, frame_tree.GetMainFrame()); | 67 EXPECT_EQ(dummy, frame_tree.GetMainFrame()); |
| 68 | 68 |
| 69 // Move back to NULL. | 69 // Move back to NULL. |
| 70 frame_tree.SwapMainFrame(NULL); | 70 frame_tree.SwapMainFrame(NULL); |
| 71 EXPECT_EQ(root, frame_tree.root()); | 71 EXPECT_EQ(root, frame_tree.root()); |
| 72 EXPECT_FALSE(frame_tree.GetMainFrame()); | 72 EXPECT_FALSE(frame_tree.GetMainFrame()); |
| 73 | 73 |
| 74 // Move back to an invalid pointer, let the FrameTree go out of scope. Test | 74 // Move back to an invalid pointer, let the FrameTree go out of scope. Test |
| 75 // should not crash because the main frame isn't owned. | 75 // should not crash because the main frame isn't owned. |
| 76 frame_tree.SwapMainFrame(dummy); | 76 frame_tree.SwapMainFrame(dummy); |
| 77 } | 77 } |
| 78 | 78 |
| 79 // Test that swapping the main frame resets the renderer-assigned frame id. | 79 // Test that swapping the main frame resets the renderer-assigned frame id. |
| 80 // - On creation, frame id is unassigned. | 80 // - On creation, frame id is unassigned. |
| 81 // - After a swap, frame id is unassigned. | 81 // - After a swap, frame id is unassigned. |
| 82 TEST_F(FrameTreeTest, FirstNavigationAfterSwap) { | 82 TEST_F(FrameTreeTest, FirstNavigationAfterSwap) { |
| 83 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL); | 83 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL, NULL); |
| 84 | 84 |
| 85 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap()); | 85 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap()); |
| 86 EXPECT_EQ(FrameTreeNode::kInvalidFrameId, | 86 EXPECT_EQ(FrameTreeNode::kInvalidFrameId, |
| 87 frame_tree.root()->frame_id()); | 87 frame_tree.root()->frame_id()); |
| 88 frame_tree.OnFirstNavigationAfterSwap(1); | 88 frame_tree.OnFirstNavigationAfterSwap(1); |
| 89 EXPECT_FALSE(frame_tree.IsFirstNavigationAfterSwap()); | 89 EXPECT_FALSE(frame_tree.IsFirstNavigationAfterSwap()); |
| 90 EXPECT_EQ(1, frame_tree.root()->frame_id()); | 90 EXPECT_EQ(1, frame_tree.root()->frame_id()); |
| 91 | 91 |
| 92 frame_tree.SwapMainFrame(NULL); | 92 frame_tree.SwapMainFrame(NULL); |
| 93 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap()); | 93 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap()); |
| 94 EXPECT_EQ(FrameTreeNode::kInvalidFrameId, | 94 EXPECT_EQ(FrameTreeNode::kInvalidFrameId, |
| 95 frame_tree.root()->frame_id()); | 95 frame_tree.root()->frame_id()); |
| 96 } | 96 } |
| 97 | 97 |
| 98 // Exercise tree manipulation routines. | 98 // Exercise tree manipulation routines. |
| 99 // - Add a series of nodes and verify tree structure. | 99 // - Add a series of nodes and verify tree structure. |
| 100 // - Remove a series of nodes and verify tree structure. | 100 // - Remove a series of nodes and verify tree structure. |
| 101 TEST_F(FrameTreeTest, Shape) { | 101 TEST_F(FrameTreeTest, Shape) { |
| 102 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL); | 102 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL, NULL); |
| 103 | 103 |
| 104 std::string no_children_node("no children node"); | 104 std::string no_children_node("no children node"); |
| 105 std::string deep_subtree("node with deep subtree"); | 105 std::string deep_subtree("node with deep subtree"); |
| 106 | 106 |
| 107 // Ensure the top-level node of the FrameTree is initialized by simulating a | 107 // Ensure the top-level node of the FrameTree is initialized by simulating a |
| 108 // main frame swap here. | 108 // main frame swap here. |
| 109 scoped_ptr<RenderFrameHostImpl> render_frame_host = | 109 scoped_ptr<RenderFrameHostImpl> render_frame_host = |
| 110 RenderFrameHostFactory::Create(static_cast<RenderViewHostImpl*>(rvh()), | 110 RenderFrameHostFactory::Create(static_cast<RenderViewHostImpl*>(rvh()), |
| 111 NULL, |
| 111 &frame_tree, | 112 &frame_tree, |
| 112 process()->GetNextRoutingID(), | 113 process()->GetNextRoutingID(), |
| 113 false); | 114 false); |
| 114 frame_tree.SwapMainFrame(render_frame_host.get()); | 115 frame_tree.SwapMainFrame(render_frame_host.get()); |
| 115 frame_tree.OnFirstNavigationAfterSwap(5); | 116 frame_tree.OnFirstNavigationAfterSwap(5); |
| 116 | 117 |
| 117 ASSERT_EQ("5: []", GetTreeState(&frame_tree)); | 118 ASSERT_EQ("5: []", GetTreeState(&frame_tree)); |
| 118 | 119 |
| 119 // Simulate attaching a series of frames to build the frame tree. | 120 // Simulate attaching a series of frames to build the frame tree. |
| 120 frame_tree.AddFrame(process()->GetNextRoutingID(), 5, 14, std::string()); | 121 frame_tree.AddFrame(process()->GetNextRoutingID(), 5, 14, std::string()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 frame_tree.RemoveFrame(5, 15); | 170 frame_tree.RemoveFrame(5, 15); |
| 170 ASSERT_EQ("5: [14: [244: [], 245: []], " | 171 ASSERT_EQ("5: [14: [244: [], 245: []], " |
| 171 "16: [264: [], 266: [], " | 172 "16: [264: [], 266: [], " |
| 172 "267 'node with deep subtree': " | 173 "267 'node with deep subtree': " |
| 173 "[365: [455: [555: []]]], 268: []]]", | 174 "[365: [455: [555: []]]], 268: []]]", |
| 174 GetTreeState(&frame_tree)); | 175 GetTreeState(&frame_tree)); |
| 175 } | 176 } |
| 176 | 177 |
| 177 } // namespace | 178 } // namespace |
| 178 } // namespace content | 179 } // namespace content |
| OLD | NEW |