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

Side by Side Diff: content/browser/frame_host/frame_tree_unittest.cc

Issue 72233002: Move RenderViewHostManager from WebContents to FrameTreeNode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Initial patch Created 7 years, 1 month 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 // 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_impl.h" 10 #include "content/browser/frame_host/render_frame_host_impl.h"
11 #include "content/browser/renderer_host/render_view_host_impl.h" 11 #include "content/browser/renderer_host/render_view_host_impl.h"
12 #include "content/public/test/mock_render_process_host.h" 12 #include "content/public/test/mock_render_process_host.h"
13 #include "content/public/test/test_browser_context.h" 13 #include "content/public/test/test_browser_context.h"
14 #include "content/public/test/test_browser_thread_bundle.h" 14 #include "content/public/test/test_browser_thread_bundle.h"
15 #include "content/public/test/test_renderer_host.h" 15 #include "content/public/test/test_renderer_host.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 namespace content { 18 namespace content {
19 namespace { 19 namespace {
20 20
21 class FrameTreeTest : public RenderViewHostTestHarness { 21 class FrameTreeTest : public RenderViewHostTestHarness {
22 protected: 22 protected:
23 // Prints a FrameTree, for easy assertions of the tree hierarchy. 23 // Prints a FrameTree, for easy assertions of the tree hierarchy.
24 std::string GetTreeState(FrameTree* frame_tree) { 24 std::string GetTreeState(FrameTree* frame_tree) {
25 std::string result; 25 std::string result;
26 AppendTreeNodeState(frame_tree->GetRootForTesting(), &result); 26 AppendTreeNodeState(frame_tree->root(), &result);
27 return result; 27 return result;
28 } 28 }
29 29
30 private: 30 private:
31 void AppendTreeNodeState(FrameTreeNode* node, std::string* result) { 31 void AppendTreeNodeState(FrameTreeNode* node, std::string* result) {
32 result->append(base::Int64ToString(node->frame_id())); 32 result->append(base::Int64ToString(node->frame_id()));
33 if (!node->frame_name().empty()) { 33 if (!node->frame_name().empty()) {
34 result->append(" '"); 34 result->append(" '");
35 result->append(node->frame_name()); 35 result->append(node->frame_name());
36 result->append("'"); 36 result->append("'");
37 } 37 }
38 result->append(": ["); 38 result->append(": [");
39 const char* separator = ""; 39 const char* separator = "";
40 for (size_t i = 0; i < node->child_count(); i++) { 40 for (size_t i = 0; i < node->child_count(); i++) {
41 result->append(separator); 41 result->append(separator);
42 AppendTreeNodeState(node->child_at(i), result); 42 AppendTreeNodeState(node->child_at(i), result);
43 separator = ", "; 43 separator = ", ";
44 } 44 }
45 result->append("]"); 45 result->append("]");
46 } 46 }
47 }; 47 };
48 48
49 // The root node never changes during navigation even though its 49 // The root node never changes during navigation even though its
50 // RenderFrameHost does. 50 // RenderFrameHost does.
51 // - Swapping main frame doesn't change root node. 51 // - Swapping main frame doesn't change root node.
52 // - Swapping back to NULL doesn't crash (easier tear-down for interstitials). 52 // - Swapping back to NULL doesn't crash (easier tear-down for interstitials).
53 // - Main frame does not own RenderFrameHost. 53 // - Main frame does not own RenderFrameHost.
54 TEST_F(FrameTreeTest, RootNode) { 54 TEST_F(FrameTreeTest, RootNode) {
55 FrameTree frame_tree(new Navigator(NULL, NULL)); 55 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL);
56 56
57 // Initial state has empty node. 57 // Initial state has empty node.
58 FrameTreeNode* root = frame_tree.GetRootForTesting(); 58 FrameTreeNode* root = frame_tree.root();
59 ASSERT_TRUE(root); 59 ASSERT_TRUE(root);
60 EXPECT_FALSE(frame_tree.GetMainFrame()); 60 EXPECT_FALSE(frame_tree.GetMainFrame());
61 61
62 // Swap in main frame. 62 // Swap in main frame.
63 RenderFrameHostImpl* dummy = reinterpret_cast<RenderFrameHostImpl*>(0x1); 63 RenderFrameHostImpl* dummy = reinterpret_cast<RenderFrameHostImpl*>(0x1);
64 frame_tree.SwapMainFrame(dummy); 64 frame_tree.SwapMainFrame(dummy);
65 EXPECT_EQ(root, frame_tree.GetRootForTesting()); 65 EXPECT_EQ(root, frame_tree.root());
66 EXPECT_EQ(dummy, frame_tree.GetMainFrame()); 66 EXPECT_EQ(dummy, frame_tree.GetMainFrame());
67 67
68 // Move back to NULL. 68 // Move back to NULL.
69 frame_tree.SwapMainFrame(NULL); 69 frame_tree.SwapMainFrame(NULL);
70 EXPECT_EQ(root, frame_tree.GetRootForTesting()); 70 EXPECT_EQ(root, frame_tree.root());
71 EXPECT_FALSE(frame_tree.GetMainFrame()); 71 EXPECT_FALSE(frame_tree.GetMainFrame());
72 72
73 // Move back to an invalid pointer, let the FrameTree go out of scope. Test 73 // Move back to an invalid pointer, let the FrameTree go out of scope. Test
74 // should not crash because the main frame isn't owned. 74 // should not crash because the main frame isn't owned.
75 frame_tree.SwapMainFrame(dummy); 75 frame_tree.SwapMainFrame(dummy);
76 } 76 }
77 77
78 // Test that swapping the main frame resets the renderer-assigned frame id. 78 // Test that swapping the main frame resets the renderer-assigned frame id.
79 // - On creation, frame id is unassigned. 79 // - On creation, frame id is unassigned.
80 // - After a swap, frame id is unassigned. 80 // - After a swap, frame id is unassigned.
81 TEST_F(FrameTreeTest, FirstNavigationAfterSwap) { 81 TEST_F(FrameTreeTest, FirstNavigationAfterSwap) {
82 FrameTree frame_tree(new Navigator(NULL, NULL)); 82 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL);
83 83
84 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap()); 84 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap());
85 EXPECT_EQ(FrameTreeNode::kInvalidFrameId, 85 EXPECT_EQ(FrameTreeNode::kInvalidFrameId,
86 frame_tree.GetRootForTesting()->frame_id()); 86 frame_tree.root()->frame_id());
87 frame_tree.OnFirstNavigationAfterSwap(1); 87 frame_tree.OnFirstNavigationAfterSwap(1);
88 EXPECT_FALSE(frame_tree.IsFirstNavigationAfterSwap()); 88 EXPECT_FALSE(frame_tree.IsFirstNavigationAfterSwap());
89 EXPECT_EQ(1, frame_tree.GetRootForTesting()->frame_id()); 89 EXPECT_EQ(1, frame_tree.root()->frame_id());
90 90
91 frame_tree.SwapMainFrame(NULL); 91 frame_tree.SwapMainFrame(NULL);
92 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap()); 92 EXPECT_TRUE(frame_tree.IsFirstNavigationAfterSwap());
93 EXPECT_EQ(FrameTreeNode::kInvalidFrameId, 93 EXPECT_EQ(FrameTreeNode::kInvalidFrameId,
94 frame_tree.GetRootForTesting()->frame_id()); 94 frame_tree.root()->frame_id());
95 } 95 }
96 96
97 // Exercise tree manipulation routines. 97 // Exercise tree manipulation routines.
98 // - Add a series of nodes and verify tree structure. 98 // - Add a series of nodes and verify tree structure.
99 // - Remove a series of nodes and verify tree structure. 99 // - Remove a series of nodes and verify tree structure.
100 TEST_F(FrameTreeTest, Shape) { 100 TEST_F(FrameTreeTest, Shape) {
101 FrameTree frame_tree(new Navigator(NULL, NULL)); 101 FrameTree frame_tree(new Navigator(NULL, NULL), NULL, NULL, NULL);
102 102
103 std::string no_children_node("no children node"); 103 std::string no_children_node("no children node");
104 std::string deep_subtree("node with deep subtree"); 104 std::string deep_subtree("node with deep subtree");
105 105
106 // Ensure the top-level node of the FrameTree is initialized by simulating a 106 // Ensure the top-level node of the FrameTree is initialized by simulating a
107 // main frame swap here. 107 // main frame swap here.
108 RenderFrameHostImpl render_frame_host(static_cast<RenderViewHostImpl*>(rvh()), 108 RenderFrameHostImpl render_frame_host(static_cast<RenderViewHostImpl*>(rvh()),
109 &frame_tree, 109 &frame_tree,
110 process()->GetNextRoutingID(), false); 110 process()->GetNextRoutingID(), false);
111 frame_tree.SwapMainFrame(&render_frame_host); 111 frame_tree.SwapMainFrame(&render_frame_host);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 frame_tree.RemoveFrame(5, 15); 166 frame_tree.RemoveFrame(5, 15);
167 ASSERT_EQ("5: [14: [244: [], 245: []], " 167 ASSERT_EQ("5: [14: [244: [], 245: []], "
168 "16: [264: [], 266: [], " 168 "16: [264: [], 266: [], "
169 "267 'node with deep subtree': " 169 "267 'node with deep subtree': "
170 "[365: [455: [555: []]]], 268: []]]", 170 "[365: [455: [555: []]]], 268: []]]",
171 GetTreeState(&frame_tree)); 171 GetTreeState(&frame_tree));
172 } 172 }
173 173
174 } // namespace 174 } // namespace
175 } // namespace content 175 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698