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"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/render_message_filter.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_delegate_view.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/render_widget_helper.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_context.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/bindings_policy.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h"
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/common/url_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/test/test_content_browser_client.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/test/test_render_view_host.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/test_web_contents.h"
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDragOperation.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class RenderViewHostTestBrowserClient : public TestContentBrowserClient {
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostTestBrowserClient() {}
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~RenderViewHostTestBrowserClient() {}
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual bool IsHandledURL(const GURL& url) OVERRIDE {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return url.scheme() == url::kFileScheme;
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderViewHostTestBrowserClient);
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHostTest : public RenderViewHostImplTestHarness {
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostTest() : old_browser_client_(NULL) {}
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~RenderViewHostTest() {}
46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    RenderViewHostImplTestHarness::SetUp();
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    old_browser_client_ = SetBrowserClientForTesting(&test_browser_client_);
50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    SetBrowserClientForTesting(old_browser_client_);
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    RenderViewHostImplTestHarness::TearDown();
55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  RenderViewHostTestBrowserClient test_browser_client_;
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ContentBrowserClient* old_browser_client_;
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderViewHostTest);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All about URLs reported by the renderer should get rewritten to about:blank.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See RenderViewHost::OnNavigate for a discussion.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, FilterAbout) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->SendNavigate(1, GURL("about:cache"));
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(controller().GetVisibleEntry());
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GURL(url::kAboutBlankURL),
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            controller().GetVisibleEntry()->GetURL());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a full screen popup RenderWidgetHost and View.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, CreateFullscreenWidget) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int routing_id = process()->GetNextRoutingID();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_rvh()->CreateNewFullscreenWidget(routing_id);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes sure that the RenderViewHost is not waiting for an unload ack when
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// reloading a page. If this is not the case, when reloading, the contents may
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// get closed out even though the user pressed the reload button.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, ResetUnloadOnReload) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url1("http://foo1");
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url2("http://foo2");
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This test is for a subtle timing bug. Here's the sequence that triggered
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the bug:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . go to a page.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . go to a new page, preferably one that takes a while to resolve, such
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   as one on a site that doesn't exist.
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //   . After this step IsWaitingForUnloadACK returns true on the first RVH.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . click stop before the page has been commited.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . click reload.
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //   . IsWaitingForUnloadACK still returns true, and if the hang monitor fires
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //     the contents gets closed.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(url1);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller().LoadURL(
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      url2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the ClosePage call which is normally sent by the net::URLRequest.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh()->ClosePage();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed so that navigations are not suspended on the RVH.
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  test_rvh()->SendBeforeUnloadACK(true);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contents()->Stop();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller().Reload(false);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(test_rvh()->IsWaitingForUnloadACK());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure we do not grant bindings to a process shared with unprivileged views.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, DontGrantBindingsToSharedProcess) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another view in the same process.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestWebContents> new_web_contents(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestWebContents::Create(browser_context(), rvh()->GetSiteInstance()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh()->AllowBindings(BINDINGS_POLICY_WEB_UI);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rvh()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDraggingRenderViewHostDelegateView
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public RenderViewHostDelegateView {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDraggingRenderViewHostDelegateView() {}
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void StartDragging(const DropData& drop_data,
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             blink::WebDragOperationsMask allowed_ops,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::ImageSkia& image,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::Vector2d& image_offset,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const DragEventSourceInfo& event_info) OVERRIDE {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_url_ = drop_data.url;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    html_base_url_ = drop_data.html_base_url;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void UpdateDragCursor(blink::WebDragOperation operation) OVERRIDE {}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GotFocus() OVERRIDE {}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TakeFocus(bool reverse) OVERRIDE {}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdatePreferredSize(const gfx::Size& pref_size) {}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL drag_url() {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return drag_url_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url() {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return html_base_url_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL drag_url_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, StartDragging) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestWebContents* web_contents = contents();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDraggingRenderViewHostDelegateView delegate_view;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->set_delegate_view(&delegate_view);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DropData drop_data;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL file_url = GURL("file:///home/user/secrets.txt");
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = file_url;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = file_url;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GURL(url::kAboutBlankURL), delegate_view.drag_url());
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GURL(url::kAboutBlankURL), delegate_view.html_base_url());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url = GURL("http://www.domain.com/index.html");
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = http_url;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = http_url;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_url, delegate_view.drag_url());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_url, delegate_view.html_base_url());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url = GURL("https://www.domain.com/index.html");
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = https_url;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = https_url;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url, delegate_view.drag_url());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url, delegate_view.html_base_url());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL javascript_url = GURL("javascript:alert('I am a bookmarklet')");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.url = javascript_url;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drop_data.html_base_url = http_url;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_rvh()->TestOnStartDragging(drop_data);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(javascript_url, delegate_view.drag_url());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_url, delegate_view.html_base_url());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderViewHostTest, DragEnteredFileURLsStillBlocked) {
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DropData dropped_data;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point client_point;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_point;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use "//foo/bar" path (rather than "/foo/bar") since dragged paths are
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expected to be absolute on any platforms.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath highlighted_file_path(FILE_PATH_LITERAL("//tmp/foo.html"));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dragged_file_path(FILE_PATH_LITERAL("//tmp/image.jpg"));
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath sensitive_file_path(FILE_PATH_LITERAL("//etc/passwd"));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL highlighted_file_url = net::FilePathToFileURL(highlighted_file_path);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL dragged_file_url = net::FilePathToFileURL(dragged_file_path);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL sensitive_file_url = net::FilePathToFileURL(sensitive_file_path);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dropped_data.url = highlighted_file_url;
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  dropped_data.filenames.push_back(
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ui::FileInfo(dragged_file_path, base::FilePath()));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh()->DragTargetDragEnter(dropped_data, client_point, screen_point,
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              blink::WebDragOperationNone, 0);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = process()->GetID();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanRequestURL(id, highlighted_file_url));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanReadFile(id, highlighted_file_path));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy->CanRequestURL(id, dragged_file_url));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy->CanReadFile(id, dragged_file_path));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanRequestURL(id, sensitive_file_url));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy->CanReadFile(id, sensitive_file_path));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(RenderViewHostTest, MessageWithBadHistoryItemFiles) {
216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath file_path;
217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &file_path));
218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  file_path = file_path.AppendASCII("foo");
219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_rvh()->TestOnUpdateStateWithFile(-1, file_path);
221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      process()->GetID(), file_path);
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_rvh()->TestOnUpdateStateWithFile(-1, file_path);
226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(RenderViewHostTest, NavigationWithBadHistoryItemFiles) {
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GURL url("http://www.google.com");
231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath file_path;
232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &file_path));
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  file_path = file_path.AppendASCII("bar");
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, process()->bad_msg_count());
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  test_rvh()->SendNavigateWithFile(1, url, file_path);
236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      process()->GetID(), file_path);
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  test_rvh()->SendNavigateWithFile(process()->GetID(), url, file_path);
241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, process()->bad_msg_count());
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(RenderViewHostTest, RoutingIdSane) {
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderFrameHostImpl* root_rfh =
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      contents()->GetFrameTree()->root()->current_frame_host();
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(test_rvh()->GetProcess(), root_rfh->GetProcess());
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(test_rvh()->GetRoutingID(), root_rfh->routing_id());
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestSaveImageFromDataURL : public RenderMessageFilter {
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestSaveImageFromDataURL(
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserContext* context)
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : RenderMessageFilter(
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            0,
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            nullptr,
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            context,
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            context->GetRequestContext(),
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            nullptr,
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            nullptr,
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            nullptr,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            nullptr) {
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Reset();
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Reset() {
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    url_string_ = std::string();
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    is_downloaded_ = false;
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string& UrlString() const {
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return url_string_;
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsDownloaded() const {
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return is_downloaded_;
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Test(const std::string& url) {
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OnMessageReceived(ViewHostMsg_SaveImageFromDataURL(0, url));
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TestSaveImageFromDataURL() { }
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void DownloadUrl(int render_view_id,
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           const GURL& url,
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           const Referrer& referrer,
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           const base::string16& suggested_name,
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           const bool use_prompt) const OVERRIDE {
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    url_string_ = url.spec();
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    is_downloaded_ = true;
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  mutable std::string url_string_;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  mutable bool is_downloaded_;
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(RenderViewHostTest, SaveImageFromDataURL) {
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<TestSaveImageFromDataURL> tester(
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new TestSaveImageFromDataURL(browser_context()));
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tester->Reset();
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tester->Test("http://non-data-url.com");
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(tester->UrlString(), "");
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(tester->IsDownloaded());
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string data_url = "data:image/gif;base64,"
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=";
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tester->Reset();
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tester->Test(data_url);
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(tester->UrlString(), data_url);
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(tester->IsDownloaded());
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
319