render_view_host_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/path_service.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/test_render_view_host.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/navigation_controller_impl.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_view_host_delegate_view.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/common/url_constants.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/test/test_content_browser_client.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/test_web_contents.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webdropdata.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class RenderViewHostTestBrowserClient : public TestContentBrowserClient {
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostTestBrowserClient() {}
29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~RenderViewHostTestBrowserClient() {}
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual bool IsHandledURL(const GURL& url) OVERRIDE {
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return url.scheme() == chrome::kFileScheme;
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderViewHostTestBrowserClient);
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHostTest : public RenderViewHostImplTestHarness {
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostTest() : old_browser_client_(NULL) {}
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~RenderViewHostTest() {}
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    RenderViewHostImplTestHarness::SetUp();
46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    old_browser_client_ = SetBrowserClientForTesting(&test_browser_client_);
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    SetBrowserClientForTesting(old_browser_client_);
51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    RenderViewHostImplTestHarness::TearDown();
52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostTestBrowserClient test_browser_client_;
56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ContentBrowserClient* old_browser_client_;
57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderViewHostTest);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All about URLs reported by the renderer should get rewritten to about:blank.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See RenderViewHost::OnNavigate for a discussion.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, FilterAbout) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->SendNavigate(1, GURL("about:cache"));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(controller().GetActiveEntry());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("about:blank"), controller().GetActiveEntry()->GetURL());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a full screen popup RenderWidgetHost and View.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, CreateFullscreenWidget) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int routing_id = process()->GetNextRoutingID();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->CreateNewFullscreenWidget(routing_id);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure that RenderViewHost::is_waiting_for_unload_ack_ is false when
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reloading a page. If is_waiting_for_unload_ack_ is not false when reloading
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the contents may get closed out even though the user pressed the reload
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// button.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, ResetUnloadOnReload) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url1("http://foo1");
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url2("http://foo2");
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This test is for a subtle timing bug. Here's the sequence that triggered
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the bug:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . go to a page.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . go to a new page, preferably one that takes a while to resolve, such
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   as one on a site that doesn't exist.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   . After this step is_waiting_for_unload_ack_ has been set to true on
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     the first RVH.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . click stop before the page has been commited.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . click reload.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   . is_waiting_for_unload_ack_ is still true, and the if the hang monitor
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     fires the contents gets closed.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(url1);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller().LoadURL(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url2, Referrer(), PAGE_TRANSITION_LINK, std::string());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the ClosePage call which is normally sent by the net::URLRequest.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh()->ClosePage();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed so that navigations are not suspended on the RVH.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->SendShouldCloseACK(true);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contents()->Stop();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller().Reload(false);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_rvh()->is_waiting_for_unload_ack_for_testing());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure we do not grant bindings to a process shared with unprivileged views.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, DontGrantBindingsToSharedProcess) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another view in the same process.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestWebContents> new_web_contents(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestWebContents::Create(browser_context(), rvh()->GetSiteInstance()));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh()->AllowBindings(BINDINGS_POLICY_WEB_UI);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rvh()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDraggingRenderViewHostDelegateView
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public RenderViewHostDelegateView {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDraggingRenderViewHostDelegateView() {}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ShowContextMenu(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ContextMenuParams& params,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContextMenuSourceType type) OVERRIDE {}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ShowPopupMenu(const gfx::Rect& bounds,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int item_height,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             double item_font_size,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int selected_item,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::vector<WebMenuItem>& items,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool right_aligned,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool allow_multiple_selection) OVERRIDE {}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartDragging(const WebDropData& drop_data,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             WebKit::WebDragOperationsMask allowed_ops,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::ImageSkia& image,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::Vector2d& image_offset,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const DragEventSourceInfo& event_info) OVERRIDE {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_url_ = drop_data.url;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    html_base_url_ = drop_data.html_base_url;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateDragCursor(WebKit::WebDragOperation operation) OVERRIDE {}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GotFocus() OVERRIDE {}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TakeFocus(bool reverse) OVERRIDE {}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdatePreferredSize(const gfx::Size& pref_size) {}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL drag_url() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return drag_url_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return html_base_url_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL drag_url_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, StartDragging) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWebContents* web_contents = contents();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDraggingRenderViewHostDelegateView delegate_view;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->set_delegate_view(&delegate_view);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDropData drop_data;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL file_url = GURL("file:///home/user/secrets.txt");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = file_url;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = file_url;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("about:blank"), delegate_view.drag_url());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("about:blank"), delegate_view.html_base_url());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = GURL("http://www.domain.com/index.html");
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = http_url;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = http_url;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_url, delegate_view.drag_url());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_url, delegate_view.html_base_url());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url = GURL("https://www.domain.com/index.html");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = https_url;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = https_url;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url, delegate_view.drag_url());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url, delegate_view.html_base_url());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL javascript_url = GURL("javascript:alert('I am a bookmarklet')");
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = javascript_url;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = http_url;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(javascript_url, delegate_view.drag_url());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_url, delegate_view.html_base_url());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, DragEnteredFileURLsStillBlocked) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDropData dropped_data;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point client_point;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_point;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use "//foo/bar" path (rather than "/foo/bar") since dragged paths are
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expected to be absolute on any platforms.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath highlighted_file_path(FILE_PATH_LITERAL("//tmp/foo.html"));
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dragged_file_path(FILE_PATH_LITERAL("//tmp/image.jpg"));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath sensitive_file_path(FILE_PATH_LITERAL("//etc/passwd"));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL highlighted_file_url = net::FilePathToFileURL(highlighted_file_path);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL dragged_file_url = net::FilePathToFileURL(dragged_file_path);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL sensitive_file_url = net::FilePathToFileURL(sensitive_file_path);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dropped_data.url = highlighted_file_url;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dropped_data.filenames.push_back(WebDropData::FileInfo(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UTF8ToUTF16(dragged_file_path.AsUTF8Unsafe()), string16()));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh()->DragTargetDragEnter(dropped_data, client_point, screen_point,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              WebKit::WebDragOperationNone, 0);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = process()->GetID();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanRequestURL(id, highlighted_file_url));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanReadFile(id, highlighted_file_path));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy->CanRequestURL(id, dragged_file_url));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy->CanReadFile(id, dragged_file_path));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanRequestURL(id, sensitive_file_url));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanReadFile(id, sensitive_file_path));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test that follow trigger DCHECKS in debug build.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when we fail to de-serialize a message, RenderViewHost calls the
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ReceivedBadMessage() handler.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, BadMessageHandlerRenderViewHost) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // craft an incorrect ViewHostMsg_UpdateTargetURL message. The real one has
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // two payload items but the one we construct has none.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message message(0, ViewHostMsg_UpdateTargetURL::ID,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       IPC::Message::PRIORITY_NORMAL);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->OnMessageReceived(message);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when we fail to de-serialize a message, RenderWidgetHost calls the
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ReceivedBadMessage() handler.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, BadMessageHandlerRenderWidgetHost) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // craft an incorrect ViewHostMsg_UpdateRect message. The real one has
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one payload item but the one we construct has none.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message message(0, ViewHostMsg_UpdateRect::ID,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       IPC::Message::PRIORITY_NORMAL);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->OnMessageReceived(message);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that OnInputEventAck() detects bad messages.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, BadMessageHandlerInputEventAck) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // InputHostMsg_HandleInputEvent_ACK is defined taking 0 params but
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the code actually expects it to have at least one int para, this this
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bogus message will not fail at de-serialization but should fail in
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnInputEventAck() processing.
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IPC::Message message(0, InputHostMsg_HandleInputEvent_ACK::ID,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       IPC::Message::PRIORITY_NORMAL);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->OnMessageReceived(message);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(RenderViewHostTest, MessageWithBadHistoryItemFiles) {
266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath file_path;
267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &file_path));
268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  file_path = file_path.AppendASCII("foo");
269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  test_rvh()->TestOnUpdateStateWithFile(process()->GetID(), file_path);
271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ChildProcessSecurityPolicyImpl::GetInstance()->GrantPermissionsForFile(
274b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      process()->GetID(), file_path,
275b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_OPEN |
276b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_READ |
277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_EXCLUSIVE_READ |
278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_ASYNC);
279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  test_rvh()->TestOnUpdateStateWithFile(process()->GetID(), file_path);
280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
283b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(RenderViewHostTest, NavigationWithBadHistoryItemFiles) {
284b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GURL url("http://www.google.com");
285b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath file_path;
286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &file_path));
287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  file_path = file_path.AppendASCII("bar");
288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  test_rvh()->SendNavigateWithFile(1, url, file_path);
290b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ChildProcessSecurityPolicyImpl::GetInstance()->GrantPermissionsForFile(
293b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      process()->GetID(), file_path,
294b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_OPEN |
295b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_READ |
296b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_EXCLUSIVE_READ |
297b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::PLATFORM_FILE_ASYNC);
298b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  test_rvh()->SendNavigateWithFile(process()->GetID(), url, file_path);
299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
303