// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "base/utf_string_conversions.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/tab_contents/render_view_context_menu.h" #include "chrome/browser/tab_contents/render_view_context_menu_browsertest_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_view.h" #include "content/public/test/browser_test_utils.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" using content::WebContents; namespace { class TestRenderViewContextMenu : public RenderViewContextMenu { public: TestRenderViewContextMenu(WebContents* web_contents, content::ContextMenuParams params) : RenderViewContextMenu(web_contents, params) { } virtual void PlatformInit() { } virtual void PlatformCancel() { } virtual bool GetAcceleratorForCommandId( int command_id, ui::Accelerator* accelerator) { return false; } bool IsItemPresent(int command_id) { return menu_model_.GetIndexOfCommandId(command_id) != -1; } }; class ContextMenuBrowserTest : public InProcessBrowserTest { public: ContextMenuBrowserTest() { } TestRenderViewContextMenu* CreateContextMenu(GURL unfiltered_url, GURL url) { content::ContextMenuParams params; params.media_type = WebKit::WebContextMenuData::MediaTypeNone; params.unfiltered_link_url = unfiltered_url; params.link_url = url; WebContents* web_contents = chrome::GetActiveWebContents(browser()); params.page_url = web_contents->GetController().GetActiveEntry()->GetURL(); #if defined(OS_MACOSX) params.writing_direction_default = 0; params.writing_direction_left_to_right = 0; params.writing_direction_right_to_left = 0; #endif // OS_MACOSX TestRenderViewContextMenu* menu = new TestRenderViewContextMenu( chrome::GetActiveWebContents(browser()), params); menu->Init(); return menu; } }; IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, OpenEntryPresentForNormalURLs) { scoped_ptr menu( CreateContextMenu(GURL("http://www.google.com/"), GURL("http://www.google.com/"))); ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB)); ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW)); ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_COPYLINKLOCATION)); } IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, OpenEntryAbsentForFilteredURLs) { scoped_ptr menu( CreateContextMenu(GURL("chrome://history"), GURL())); ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB)); ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW)); ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_COPYLINKLOCATION)); } // GTK requires a X11-level mouse event to open a context menu correctly. #if defined(TOOLKIT_GTK) #define MAYBE_RealMenu DISABLED_RealMenu #else #define MAYBE_RealMenu RealMenu #endif // Opens a link in a new tab via a "real" context menu. IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, MAYBE_RealMenu) { ContextMenuNotificationObserver menu_observer( IDC_CONTENT_CONTEXT_OPENLINKNEWTAB); ui_test_utils::WindowedTabAddedNotificationObserver tab_observer( content::NotificationService::AllSources()); // Go to a page with a link ui_test_utils::NavigateToURL( browser(), GURL("data:text/html,link")); // Open a context menu. WebKit::WebMouseEvent mouse_event; mouse_event.type = WebKit::WebInputEvent::MouseDown; mouse_event.button = WebKit::WebMouseEvent::ButtonRight; mouse_event.x = 15; mouse_event.y = 15; gfx::Rect offset; content::WebContents* tab = chrome::GetActiveWebContents(browser()); tab->GetView()->GetContainerBounds(&offset); mouse_event.globalX = 15 + offset.x(); mouse_event.globalY = 15 + offset.y(); mouse_event.clickCount = 1; tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); mouse_event.type = WebKit::WebInputEvent::MouseUp; tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); // The menu_observer will select "Open in new tab", wait for the new tab to // be added. tab_observer.Wait(); tab = tab_observer.GetTab(); content::WaitForLoadStop(tab); // Verify that it's the correct tab. EXPECT_EQ(GURL("about:blank"), tab->GetURL()); } } // namespace