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 "base/files/file_path.h" | |
5 #include "base/strings/utf_string_conversions.h" | 6 #include "base/strings/utf_string_conversions.h" |
6 #include "content/browser/frame_host/cross_site_transferring_request.h" | 7 #include "content/browser/frame_host/cross_site_transferring_request.h" |
7 #include "content/browser/frame_host/navigation_controller_impl.h" | 8 #include "content/browser/frame_host/navigation_controller_impl.h" |
8 #include "content/browser/frame_host/navigation_entry_impl.h" | 9 #include "content/browser/frame_host/navigation_entry_impl.h" |
9 #include "content/browser/frame_host/navigator.h" | 10 #include "content/browser/frame_host/navigator.h" |
10 #include "content/browser/frame_host/render_frame_host_manager.h" | 11 #include "content/browser/frame_host/render_frame_host_manager.h" |
11 #include "content/browser/site_instance_impl.h" | 12 #include "content/browser/site_instance_impl.h" |
12 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 13 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
13 #include "content/common/frame_messages.h" | 14 #include "content/common/frame_messages.h" |
14 #include "content/common/view_messages.h" | 15 #include "content/common/view_messages.h" |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
241 dest_rvh2->OnSwappedOut(false); | 242 dest_rvh2->OnSwappedOut(false); |
242 static_cast<TestRenderViewHost*>(contents2->GetRenderManagerForTesting()-> | 243 static_cast<TestRenderViewHost*>(contents2->GetRenderManagerForTesting()-> |
243 pending_render_view_host())->SendNavigate(102, kChromeUrl); | 244 pending_render_view_host())->SendNavigate(102, kChromeUrl); |
244 | 245 |
245 EXPECT_NE(active_rvh()->GetSiteInstance(), | 246 EXPECT_NE(active_rvh()->GetSiteInstance(), |
246 contents2->GetRenderViewHost()->GetSiteInstance()); | 247 contents2->GetRenderViewHost()->GetSiteInstance()); |
247 EXPECT_EQ(active_rvh()->GetSiteInstance()->GetProcess(), | 248 EXPECT_EQ(active_rvh()->GetSiteInstance()->GetProcess(), |
248 contents2->GetRenderViewHost()->GetSiteInstance()->GetProcess()); | 249 contents2->GetRenderViewHost()->GetSiteInstance()->GetProcess()); |
249 } | 250 } |
250 | 251 |
252 // This observer is used to check whether IPC messages are being filtered for | |
253 // swapped out RenderFrameHost objects. It observes the plugin crash events, | |
254 // which the test which follows it simulates being sent. The test is succsesful | |
Charlie Reis
2014/03/19 20:40:57
nit: which the FilterMessagesWhileSwappedOut test
nasko
2014/03/21 20:32:56
Done.
| |
255 // if the event is not observed. See http://crbug.com/351815 | |
256 class PluginCrashObserver : public WebContentsObserver { | |
257 public: | |
258 PluginCrashObserver(WebContents* web_contents) | |
259 : WebContentsObserver(web_contents), | |
260 event_triggered_(false) {} | |
261 | |
262 virtual void PluginCrashed(const base::FilePath& plugin_path, | |
263 base::ProcessId plugin_pid) OVERRIDE { | |
264 event_triggered_ = true; | |
265 } | |
266 | |
267 bool event_triggered() { | |
268 return event_triggered_; | |
269 } | |
270 | |
271 private: | |
272 bool event_triggered_; | |
273 | |
274 DISALLOW_COPY_AND_ASSIGN(PluginCrashObserver); | |
275 }; | |
276 | |
251 // Ensure that the browser ignores most IPC messages that arrive from a | 277 // Ensure that the browser ignores most IPC messages that arrive from a |
252 // RenderViewHost that has been swapped out. We do not want to take | 278 // RenderViewHost that has been swapped out. We do not want to take |
253 // action on requests from a non-active renderer. The main exception is | 279 // action on requests from a non-active renderer. The main exception is |
254 // for synchronous messages, which cannot be ignored without leaving the | 280 // for synchronous messages, which cannot be ignored without leaving the |
255 // renderer in a stuck state. See http://crbug.com/93427. | 281 // renderer in a stuck state. See http://crbug.com/93427. |
256 TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) { | 282 TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) { |
257 const GURL kChromeURL("chrome://foo"); | 283 const GURL kChromeURL("chrome://foo"); |
258 const GURL kDestUrl("http://www.google.com/"); | 284 const GURL kDestUrl("http://www.google.com/"); |
259 | 285 |
260 // Navigate our first tab to a chrome url and then to the destination. | 286 // Navigate our first tab to a chrome url and then to the destination. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
297 direction))); | 323 direction))); |
298 EXPECT_EQ(dest_title, contents()->GetTitle()); | 324 EXPECT_EQ(dest_title, contents()->GetTitle()); |
299 | 325 |
300 // The old renderer, being slow, now updates the title. It should be filtered | 326 // The old renderer, being slow, now updates the title. It should be filtered |
301 // out and not take effect. | 327 // out and not take effect. |
302 EXPECT_EQ(RenderViewHostImpl::STATE_PENDING_SWAP_OUT, ntp_rvh->rvh_state()); | 328 EXPECT_EQ(RenderViewHostImpl::STATE_PENDING_SWAP_OUT, ntp_rvh->rvh_state()); |
303 EXPECT_TRUE(ntp_rvh->OnMessageReceived( | 329 EXPECT_TRUE(ntp_rvh->OnMessageReceived( |
304 ViewHostMsg_UpdateTitle(rvh()->GetRoutingID(), 0, ntp_title, direction))); | 330 ViewHostMsg_UpdateTitle(rvh()->GetRoutingID(), 0, ntp_title, direction))); |
305 EXPECT_EQ(dest_title, contents()->GetTitle()); | 331 EXPECT_EQ(dest_title, contents()->GetTitle()); |
306 | 332 |
333 // The same logic should apply to RenderFrameHosts as well and routing through | |
334 // swapped out RFH shouldn't be allowed. Use a PluginCrashObserver to check | |
335 // if the IPC message is allowed through or not. | |
336 PluginCrashObserver crash_observer(contents()); | |
337 // TODO(nasko): The following line shouldn't be needed when we are properly | |
338 // swapping out RFH objects or move to proxy objects. | |
339 ntp_rvh->main_render_frame_host()->set_swapped_out(true); | |
Charlie Reis
2014/03/19 20:40:57
Is this line actually needed? You're checking for
nasko
2014/03/21 20:32:56
Quite a bit has changed, so this is no longer appl
| |
340 EXPECT_TRUE(ntp_rvh->main_render_frame_host()->is_swapped_out()); | |
341 EXPECT_TRUE(ntp_rvh->main_render_frame_host()->OnMessageReceived( | |
342 FrameHostMsg_PluginCrashed( | |
343 main_rfh()->GetRoutingID(), base::FilePath(), 0))); | |
344 EXPECT_FALSE(crash_observer.event_triggered()); | |
345 | |
307 // We cannot filter out synchronous IPC messages, because the renderer would | 346 // We cannot filter out synchronous IPC messages, because the renderer would |
308 // be left waiting for a reply. We pick RunBeforeUnloadConfirm as an example | 347 // be left waiting for a reply. We pick RunBeforeUnloadConfirm as an example |
309 // that can run easily within a unit test, and that needs to receive a reply | 348 // that can run easily within a unit test, and that needs to receive a reply |
310 // without showing an actual dialog. | 349 // without showing an actual dialog. |
311 MockRenderProcessHost* ntp_process_host = | 350 MockRenderProcessHost* ntp_process_host = |
312 static_cast<MockRenderProcessHost*>(ntp_rvh->GetProcess()); | 351 static_cast<MockRenderProcessHost*>(ntp_rvh->GetProcess()); |
313 ntp_process_host->sink().ClearMessages(); | 352 ntp_process_host->sink().ClearMessages(); |
314 const base::string16 msg = base::ASCIIToUTF16("Message"); | 353 const base::string16 msg = base::ASCIIToUTF16("Message"); |
315 bool result = false; | 354 bool result = false; |
316 base::string16 unused; | 355 base::string16 unused; |
(...skipping 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1573 | 1612 |
1574 // Simulate the swap out ack. | 1613 // Simulate the swap out ack. |
1575 rvh1->OnSwappedOut(false); | 1614 rvh1->OnSwappedOut(false); |
1576 | 1615 |
1577 // rvh1 should be swapped out. | 1616 // rvh1 should be swapped out. |
1578 EXPECT_FALSE(destruction_observer.rvh_deleted()); | 1617 EXPECT_FALSE(destruction_observer.rvh_deleted()); |
1579 EXPECT_TRUE(rvh1->IsSwappedOut()); | 1618 EXPECT_TRUE(rvh1->IsSwappedOut()); |
1580 } | 1619 } |
1581 | 1620 |
1582 } // namespace content | 1621 } // namespace content |
OLD | NEW |