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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/render_view_context_menu.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/render_view_context_menu_browsertest_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/tab_contents/render_view_context_menu_test_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebContextMenuData.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContextMenuBrowserTest : public InProcessBrowserTest {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextMenuBrowserTest() { }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRenderViewContextMenu* CreateContextMenu(GURL unfiltered_url, GURL url) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ContextMenuParams params;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.media_type = WebKit::WebContextMenuData::MediaTypeNone;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.unfiltered_link_url = unfiltered_url;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.link_url = url;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* web_contents =
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.page_url = web_contents->GetController().GetActiveEntry()->GetURL();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.writing_direction_default = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.writing_direction_left_to_right = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.writing_direction_right_to_left = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_MACOSX
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestRenderViewContextMenu* menu = new TestRenderViewContextMenu(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(), params);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu->Init();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return menu;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       OpenEntryPresentForNormalURLs) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestRenderViewContextMenu> menu(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateContextMenu(GURL("http://www.google.com/"),
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GURL("http://www.google.com/")));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_COPYLINKLOCATION));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       OpenEntryAbsentForFilteredURLs) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestRenderViewContextMenu> menu(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateContextMenu(GURL("chrome://history"),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GURL()));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_COPYLINKLOCATION));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GTK requires a X11-level mouse event to open a context menu correctly.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_RealMenu DISABLED_RealMenu
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_RealMenu RealMenu
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens a link in a new tab via a "real" context menu.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_RealMenu) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextMenuNotificationObserver menu_observer(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::WindowedTabAddedNotificationObserver tab_observer(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go to a page with a link
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), GURL("data:text/html,<a href='about:blank'>link</a>"));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a context menu.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonRight;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 15;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 15;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect offset;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* tab =
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetView()->GetContainerBounds(&offset);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.globalX = 15 + offset.x();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.globalY = 15 + offset.y();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The menu_observer will select "Open in new tab", wait for the new tab to
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be added.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab_observer.Wait();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = tab_observer.GetTab();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that it's the correct tab.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("about:blank"), tab->GetURL());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that "Open Link in New Tab" doesn't send URL fragment as referrer.
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, OpenInNewTabReferrer) {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::WindowedTabAddedNotificationObserver tab_observer(
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NotificationService::AllSources());
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL echoheader(test_server()->GetURL("echoheader?Referer"));
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Go to a |page| with a link to echoheader URL.
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL page("data:text/html,<a href='" + echoheader.spec() + "'>link</a>");
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), page);
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set up referrer URL with fragment.
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL kReferrerWithFragment("http://foo.com/test#fragment");
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kCorrectReferrer("http://foo.com/test");
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set up menu with link URL.
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::ContextMenuParams context_menu_params;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  context_menu_params.page_url = kReferrerWithFragment;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  context_menu_params.link_url = echoheader;
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Select "Open Link in New Tab" and wait for the new tab to be added.
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestRenderViewContextMenu menu(
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context_menu_params);
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  menu.Init();
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  menu.ExecuteCommand(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB, 0);
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tab_observer.Wait();
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WebContents* tab = tab_observer.GetTab();
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WaitForLoadStop(tab);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that it's the correct tab.
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(echoheader, tab->GetURL());
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the text on the page matches |kCorrectReferrer|.
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string actual_referrer;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab,
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "window.domAutomationController.send(window.document.body.textContent);",
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &actual_referrer));
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(kCorrectReferrer, actual_referrer);
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the referrer on the page matches |kCorrectReferrer|.
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string page_referrer;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "window.domAutomationController.send(window.document.referrer);",
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &page_referrer));
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(kCorrectReferrer, page_referrer);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify that "Open Link in Incognito Window " doesn't send referrer URL.
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, OpenIncognitoNoneReferrer) {
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::WindowedTabAddedNotificationObserver tab_observer(
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NotificationService::AllSources());
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL echoheader(test_server()->GetURL("echoheader?Referer"));
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Go to a |page| with a link to echoheader URL.
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL page("data:text/html,<a href='" + echoheader.spec() + "'>link</a>");
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), page);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set up referrer URL with fragment.
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL kReferrerWithFragment("http://foo.com/test#fragment");
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kNoneReferrer("None");
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kEmptyReferrer("");
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set up menu with link URL.
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::ContextMenuParams context_menu_params;
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  context_menu_params.page_url = kReferrerWithFragment;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  context_menu_params.link_url = echoheader;
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Select "Open Link in Incognito Window" and wait for window to be added.
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestRenderViewContextMenu menu(
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      context_menu_params);
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  menu.Init();
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  menu.ExecuteCommand(IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD, 0);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tab_observer.Wait();
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WebContents* tab = tab_observer.GetTab();
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WaitForLoadStop(tab);
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that it's the correct tab.
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(echoheader, tab->GetURL());
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the text on the page matches |kNoneReferrer|.
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string actual_referrer;
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab,
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "window.domAutomationController.send(window.document.body.textContent);",
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &actual_referrer));
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(kNoneReferrer, actual_referrer);
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the referrer on the page matches |kEmptyReferrer|.
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string page_referrer;
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      tab,
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "window.domAutomationController.send(window.document.referrer);",
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &page_referrer));
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(kEmptyReferrer, page_referrer);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
228