OLD | NEW |
| (Empty) |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/renderer_host/test/test_render_view_host.h" | |
6 #include "chrome/browser/tab_contents/navigation_controller.h" | |
7 #include "chrome/browser/tab_contents/navigation_entry.h" | |
8 #include "chrome/browser/tab_contents/test_tab_contents.h" | |
9 #include "chrome/common/page_transition_types.h" | |
10 #include "chrome/common/render_messages.h" | |
11 | |
12 class RenderViewHostTest : public RenderViewHostTestHarness { | |
13 }; | |
14 | |
15 // All about URLs reported by the renderer should get rewritten to about:blank. | |
16 // See RenderViewHost::OnMsgNavigate for a discussion. | |
17 TEST_F(RenderViewHostTest, FilterAbout) { | |
18 rvh()->SendNavigate(1, GURL("about:cache")); | |
19 ASSERT_TRUE(controller().GetActiveEntry()); | |
20 EXPECT_EQ(GURL("about:blank"), controller().GetActiveEntry()->url()); | |
21 } | |
22 | |
23 // Create a full screen popup RenderWidgetHost and View. | |
24 TEST_F(RenderViewHostTest, CreateFullscreenWidget) { | |
25 int routing_id = process()->GetNextRoutingID(); | |
26 rvh()->CreateNewFullscreenWidget(routing_id); | |
27 } | |
28 | |
29 // Makes sure that RenderViewHost::is_waiting_for_unload_ack_ is false when | |
30 // reloading a page. If is_waiting_for_unload_ack_ is not false when reloading | |
31 // the tab may get closed out even though the user pressed the reload button. | |
32 TEST_F(RenderViewHostTest, ResetUnloadOnReload) { | |
33 const GURL url1("http://foo1"); | |
34 const GURL url2("http://foo2"); | |
35 | |
36 // This test is for a subtle timing bug. Here's the sequence that triggered | |
37 // the bug: | |
38 // . go to a page. | |
39 // . go to a new page, preferably one that takes a while to resolve, such | |
40 // as one on a site that doesn't exist. | |
41 // . After this step is_waiting_for_unload_ack_ has been set to true on | |
42 // the first RVH. | |
43 // . click stop before the page has been commited. | |
44 // . click reload. | |
45 // . is_waiting_for_unload_ack_ is still true, and the if the hang monitor | |
46 // fires the tab gets closed. | |
47 | |
48 NavigateAndCommit(url1); | |
49 controller().LoadURL(url2, GURL(), PageTransition::LINK); | |
50 // Simulate the ClosePage call which is normally sent by the net::URLRequest. | |
51 rvh()->ClosePage(true, 0, 0); | |
52 // Needed so that navigations are not suspended on the RVH. Normally handled | |
53 // by way of ViewHostMsg_ShouldClose_ACK. | |
54 contents()->render_manager()->ShouldClosePage(true, true); | |
55 contents()->Stop(); | |
56 controller().Reload(false); | |
57 EXPECT_FALSE(rvh()->is_waiting_for_unload_ack()); | |
58 } | |
59 | |
60 // The test that follow trigger DCHECKS in debug build. | |
61 #if defined(NDEBUG) | |
62 | |
63 // Test that when we fail to de-serialize a message, RenderViewHost calls the | |
64 // ReceivedBadMessage() handler. | |
65 TEST_F(RenderViewHostTest, BadMessageHandlerRenderViewHost) { | |
66 EXPECT_EQ(0, process()->bad_msg_count()); | |
67 // craft an incorrect ViewHostMsg_UpdateTargetURL message. The real one has | |
68 // two payload items but the one we construct has none. | |
69 IPC::Message message(0, ViewHostMsg_UpdateTargetURL::ID, | |
70 IPC::Message::PRIORITY_NORMAL); | |
71 rvh()->TestOnMessageReceived(message); | |
72 EXPECT_EQ(1, process()->bad_msg_count()); | |
73 } | |
74 | |
75 // Test that when we fail to de-serialize a message, RenderWidgetHost calls the | |
76 // ReceivedBadMessage() handler. | |
77 TEST_F(RenderViewHostTest, BadMessageHandlerRenderWidgetHost) { | |
78 EXPECT_EQ(0, process()->bad_msg_count()); | |
79 // craft an incorrect ViewHostMsg_UpdateRect message. The real one has | |
80 // one payload item but the one we construct has none. | |
81 IPC::Message message(0, ViewHostMsg_UpdateRect::ID, | |
82 IPC::Message::PRIORITY_NORMAL); | |
83 rvh()->TestOnMessageReceived(message); | |
84 EXPECT_EQ(1, process()->bad_msg_count()); | |
85 } | |
86 | |
87 // Test that OnMsgInputEventAck() detects bad messages. | |
88 TEST_F(RenderViewHostTest, BadMessageHandlerInputEventAck) { | |
89 EXPECT_EQ(0, process()->bad_msg_count()); | |
90 // ViewHostMsg_HandleInputEvent_ACK is defined taking 0 params but | |
91 // the code actually expects it to have at least one int para, this this | |
92 // bogus message will not fail at de-serialization but should fail in | |
93 // OnMsgInputEventAck() processing. | |
94 IPC::Message message(0, ViewHostMsg_HandleInputEvent_ACK::ID, | |
95 IPC::Message::PRIORITY_NORMAL); | |
96 rvh()->TestOnMessageReceived(message); | |
97 EXPECT_EQ(1, process()->bad_msg_count()); | |
98 } | |
99 | |
100 #endif // NDEBUG | |
OLD | NEW |