1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h" 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browsertest.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_test_message_listener.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/render_view_context_menu.h" 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/mock_host_resolver.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/models/menu_model.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/context_menu.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ui::MenuModel; 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebContextMenuData; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test class helps us sidestep platform-specific issues with popping up a 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// real context menu, while still running through the actual code in 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RenderViewContextMenu where extension items get added and executed. 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestRenderViewContextMenu : public RenderViewContextMenu { 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestRenderViewContextMenu(TabContents* tab_contents, 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ContextMenuParams& params) 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : RenderViewContextMenu(tab_contents, params) {} 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~TestRenderViewContextMenu() {} 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool HasExtensionItemWithLabel(const std::string& label) { 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 label16 = UTF8ToUTF16(label); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::map<int, ExtensionMenuItem::Id>::iterator i; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (i = extension_item_map_.begin(); i != extension_item_map_.end(); ++i) { 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ExtensionMenuItem::Id& id = i->second; 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 tmp_label; 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(GetItemLabel(id, &tmp_label)); 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (tmp_label == label16) 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Looks in the menu for an extension item with |id|, and if it is found and 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // has a label, that is put in |result| and we return true. Otherwise returns 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // false. 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool GetItemLabel(const ExtensionMenuItem::Id& id, string16* result) { 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int command_id = 0; 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!FindCommandId(id, &command_id)) 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MenuModel* model = NULL; 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int index = -1; 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!GetMenuModelAndItemIndex(command_id, &model, &index)) { 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *result = model->GetLabelAt(index); 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Searches for an menu item with |command_id|. If it's found, the return 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // value is true and the model and index where it appears in that model are 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // returned in |found_model| and |found_index|. Otherwise returns false. 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool GetMenuModelAndItemIndex(int command_id, 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MenuModel** found_model, 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int *found_index) { 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<MenuModel*> models_to_search; 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick models_to_search.push_back(&menu_model_); 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick while (!models_to_search.empty()) { 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MenuModel* model = models_to_search.back(); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick models_to_search.pop_back(); 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (int i = 0; i < model->GetItemCount(); i++) { 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (model->GetCommandIdAt(i) == command_id) { 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *found_model = model; 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *found_index = i; 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) { 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick models_to_search.push_back(model->GetSubmenuModelAt(i)); 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // These two functions implement pure virtual methods of 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // RenderViewContextMenu. 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool GetAcceleratorForCommandId(int command_id, 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::Accelerator* accelerator) { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // None of our commands have accelerators, so always return false. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void PlatformInit() {} 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Given an extension menu item id, tries to find the corresponding command id 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // in the menu. 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool FindCommandId(const ExtensionMenuItem::Id& id, int* command_id) { 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::map<int, ExtensionMenuItem::Id>::const_iterator i; 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (i = extension_item_map_.begin(); i != extension_item_map_.end(); ++i) { 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (i->second == id) { 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *command_id = i->first; 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionContextMenuBrowserTest : public ExtensionBrowserTest { 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to load an extension from context_menus/|subdirectory| in the 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // extensions test data dir. 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool LoadContextMenuExtension(std::string subdirectory) { 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath extension_dir = 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_data_dir_.AppendASCII("context_menus").AppendASCII(subdirectory); 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return LoadExtension(extension_dir); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool LoadContextMenuExtensionIncognito(std::string subdirectory) { 127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch FilePath extension_dir = 128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch test_data_dir_.AppendASCII("context_menus").AppendASCII(subdirectory); 129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return LoadExtensionIncognito(extension_dir); 130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TestRenderViewContextMenu* CreateMenu(Browser* browser, 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& page_url, 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& link_url, 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& frame_url) { 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContents* tab_contents = browser->GetSelectedTabContents(); 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebContextMenuData data; 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ContextMenuParams params(data); 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick params.page_url = page_url; 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick params.link_url = link_url; 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.frame_url = frame_url; 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestRenderViewContextMenu* menu = 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new TestRenderViewContextMenu(tab_contents, params); 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu->Init(); 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return menu; 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Shortcut to return the current ExtensionMenuManager. 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtensionMenuManager* menu_manager() { 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return browser()->profile()->GetExtensionService()->menu_manager(); 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns a pointer to the currently loaded extension with |name|, or null 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // if not found. 155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* GetExtensionNamed(std::string name) { 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ExtensionList* extensions = 15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen browser()->profile()->GetExtensionService()->extensions(); 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtensionList::const_iterator i; 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (i = extensions->begin(); i != extensions->end(); ++i) { 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if ((*i)->name() == name) { 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return *i; 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return NULL; 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // This gets all the items that any extension has registered for possible 1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // inclusion in context menus. 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtensionMenuItem::List GetItems() { 1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtensionMenuItem::List result; 1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::set<std::string> extension_ids = menu_manager()->ExtensionIds(); 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::set<std::string>::iterator i; 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (i = extension_ids.begin(); i != extension_ids.end(); ++i) { 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const ExtensionMenuItem::List* list = menu_manager()->MenuItems(*i); 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick result.insert(result.end(), list->begin(), list->end()); 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return result; 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // This creates a test menu for a page with |page_url| and |link_url|, looks 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // for an extension item with the given |label|, and returns true if the item 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // was found. 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool MenuHasItemWithLabel(const GURL& page_url, 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& link_url, 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL& frame_url, 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& label) { 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TestRenderViewContextMenu> menu( 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateMenu(browser(), page_url, link_url, frame_url)); 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return menu->HasExtensionItemWithLabel(label); 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests adding a simple context menu item. 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, Simple) { 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener1("created item", false); 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener2("onclick fired", false); 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(LoadContextMenuExtension("simple")); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Wait for the extension to tell us it's created an item. 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(listener1.WaitUntilSatisfied()); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL page_url("http://www.google.com"); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create and build our test context menu. 205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TestRenderViewContextMenu> menu( 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateMenu(browser(), page_url, GURL(), GURL())); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Look for the extension item in the menu, and execute it. 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int command_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST; 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(menu->IsCommandIdEnabled(command_id)); 2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu->ExecuteCommand(command_id); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Wait for the extension's script to tell us its onclick fired. 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(listener2.WaitUntilSatisfied()); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that setting "documentUrlPatterns" for an item properly restricts 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// those items to matching pages. 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, Patterns) { 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener("created items", false); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(LoadContextMenuExtension("patterns")); 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Wait for the js test code to create its two items with patterns. 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(listener.WaitUntilSatisfied()); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check that a document url that should match the items' patterns appears. 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL google_url("http://www.google.com"); 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(MenuHasItemWithLabel(google_url, 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(), 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(), 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string("test_item1"))); 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(MenuHasItemWithLabel(google_url, 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(), 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(), 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string("test_item2"))); 2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Now check with a non-matching url. 2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL test_url("http://www.test.com"); 2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(MenuHasItemWithLabel(test_url, 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(), 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(), 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string("test_item1"))); 2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(MenuHasItemWithLabel(test_url, 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(), 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(), 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string("test_item2"))); 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests registering an item with a very long title that should get truncated in 2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the actual menu displayed. 2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, LongTitle) { 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener("created", false); 2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load the extension and wait until it's created a menu item. 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(LoadContextMenuExtension("long_title")); 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(listener.WaitUntilSatisfied()); 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Make sure we have an item registered with a long title. 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick size_t limit = RenderViewContextMenu::kMaxExtensionItemTitleLength; 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtensionMenuItem::List items = GetItems(); 2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(1u, items.size()); 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtensionMenuItem* item = items.at(0); 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_GT(item->title().size(), limit); 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Create a context menu, then find the item's label. It should be properly 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // truncated. 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url("http://foo.com/"); 269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TestRenderViewContextMenu> menu( 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateMenu(browser(), url, GURL(), GURL())); 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 label; 2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(menu->GetItemLabel(item->id(), &label)); 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(label.size() <= limit); 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Checks that in |menu|, the item at |index| has type |expected_type| and a 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// label of |expected_label|. 2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic void ExpectLabelAndType(const char* expected_label, 2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MenuModel::ItemType expected_type, 2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const MenuModel& menu, 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int index) { 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(expected_type, menu.GetTypeAt(index)); 2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(UTF8ToUTF16(expected_label), menu.GetLabelAt(index)); 2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// In the separators test we build a submenu with items and separators in two 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// different ways - this is used to verify the results in both cases. 2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic void VerifyMenuForSeparatorsTest(const MenuModel& menu) { 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We expect to see the following items in the menu: 2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // radio1 2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // radio2 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // --separator-- (automatically added) 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // normal1 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // --separator-- 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // normal2 2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // --separator-- 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // radio3 2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // radio4 3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // --separator-- 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // normal3 3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int index = 0; 3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(11, menu.GetItemCount()); 3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("radio1", MenuModel::TYPE_RADIO, menu, index++); 3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("radio2", MenuModel::TYPE_RADIO, menu, index++); 3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++)); 3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("normal1", MenuModel::TYPE_COMMAND, menu, index++); 3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++)); 3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("normal2", MenuModel::TYPE_COMMAND, menu, index++); 3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++)); 3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("radio3", MenuModel::TYPE_RADIO, menu, index++); 3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("radio4", MenuModel::TYPE_RADIO, menu, index++); 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(MenuModel::TYPE_SEPARATOR, menu.GetTypeAt(index++)); 3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExpectLabelAndType("normal3", MenuModel::TYPE_COMMAND, menu, index++); 3163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests a number of cases for auto-generated and explicitly added separators. 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, Separators) { 3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Load the extension. 3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(LoadContextMenuExtension("separators")); 322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetExtensionNamed("Separators Test"); 3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(extension != NULL); 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Navigate to test1.html inside the extension, which should create a bunch 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // of items at the top-level (but they'll get pushed into an auto-generated 3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // parent). 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener1("test1 create finished", false); 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::NavigateToURL(browser(), 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(extension->GetResourceURL("test1.html"))); 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick listener1.WaitUntilSatisfied(); 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url("http://www.google.com/"); 334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TestRenderViewContextMenu> menu( 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateMenu(browser(), url, GURL(), GURL())); 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The top-level item should be an "automagic parent" with the extension's 3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // name. 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MenuModel* model = NULL; 3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int index = 0; 3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 label; 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(menu->GetMenuModelAndItemIndex( 3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST, &model, &index)); 3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(UTF8ToUTF16(extension->name()), model->GetLabelAt(index)); 3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(MenuModel::TYPE_SUBMENU, model->GetTypeAt(index)); 3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Get the submenu and verify the items there. 3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MenuModel* submenu = model->GetSubmenuModelAt(index); 3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(submenu != NULL); 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyMenuForSeparatorsTest(*submenu); 3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Now run our second test - navigate to test2.html which creates an explicit 3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // parent node and populates that with the same items as in test1. 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener2("test2 create finished", false); 3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::NavigateToURL(browser(), 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL(extension->GetResourceURL("test2.html"))); 3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick listener2.WaitUntilSatisfied(); 358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen menu.reset(CreateMenu(browser(), url, GURL(), GURL())); 3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(menu->GetMenuModelAndItemIndex( 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST, &model, &index)); 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(UTF8ToUTF16("parent"), model->GetLabelAt(index)); 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick submenu = model->GetSubmenuModelAt(index); 3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(submenu != NULL); 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick VerifyMenuForSeparatorsTest(*submenu); 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that targetUrlPattern keeps items from appearing when there is no 3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// target url. 3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, TargetURLs) { 370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTestMessageListener listener("created items", false); 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(LoadContextMenuExtension("target_urls")); 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(listener.WaitUntilSatisfied()); 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL google_url("http://www.google.com"); 3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL non_google_url("http://www.foo.com"); 3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // No target url - the item should not appear. 378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_FALSE(MenuHasItemWithLabel( 379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen google_url, GURL(), GURL(), std::string("item1"))); 3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // A matching target url - the item should appear. 3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(MenuHasItemWithLabel(google_url, 3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick google_url, 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(), 3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string("item1"))); 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // A non-matching target url - the item should not appear. 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_FALSE(MenuHasItemWithLabel(google_url, 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick non_google_url, 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL(), 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string("item1"))); 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 393513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests adding of context menus in incognito mode. 395513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, IncognitoSplit) { 396513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTestMessageListener created("created item regular", false); 397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTestMessageListener created_incognito("created item incognito", 398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 400513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTestMessageListener onclick("onclick fired regular", false); 401513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTestMessageListener onclick_incognito("onclick fired incognito", 402513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch false); 403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Open an incognito window. 405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ui_test_utils::OpenURLOffTheRecord(browser()->profile(), GURL("about:blank")); 406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(LoadContextMenuExtensionIncognito("incognito")); 408513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Wait for the extension's processes to tell us they've created an item. 410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(created.WaitUntilSatisfied()); 411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(created_incognito.WaitUntilSatisfied()); 412513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 413513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL page_url("http://www.google.com"); 414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Create and build our test context menu. 416513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Browser* browser_incognito = BrowserList::FindBrowserWithType( 417513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch browser()->profile()->GetOffTheRecordProfile(), 418513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Browser::TYPE_NORMAL, false); 419513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(browser_incognito); 420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TestRenderViewContextMenu> menu( 421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateMenu(browser(), page_url, GURL(), GURL())); 422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<TestRenderViewContextMenu> menu_incognito( 423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateMenu(browser_incognito, page_url, GURL(), GURL())); 424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Look for the extension item in the menu, and execute it. 426513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int command_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST; 427513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(menu->IsCommandIdEnabled(command_id)); 428513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch menu->ExecuteCommand(command_id); 429513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 430513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Wait for the extension's script to tell us its onclick fired. Ensure 431513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // that the incognito version doesn't fire until we explicitly click the 432513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // incognito menu item. 433513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(onclick.WaitUntilSatisfied()); 434513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_FALSE(onclick_incognito.was_satisfied()); 435513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 436513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(menu_incognito->IsCommandIdEnabled(command_id)); 437513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch menu_incognito->ExecuteCommand(command_id); 438513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(onclick_incognito.WaitUntilSatisfied()); 439513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests that items with a context of frames only appear when the menu is 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// invoked in a frame. 443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionContextMenuBrowserTest, Frames) { 444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionTestMessageListener listener("created items", false); 445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(LoadContextMenuExtension("frames")); 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(listener.WaitUntilSatisfied()); 447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL page_url("http://www.google.com"); 449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL no_frame_url; 450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL frame_url("http://www.google.com"); 451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(MenuHasItemWithLabel( 453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen page_url, GURL(), no_frame_url, std::string("Page item"))); 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_FALSE(MenuHasItemWithLabel( 455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen page_url, GURL(), no_frame_url, std::string("Frame item"))); 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(MenuHasItemWithLabel( 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen page_url, GURL(), frame_url, std::string("Page item"))); 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(MenuHasItemWithLabel( 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen page_url, GURL(), frame_url, std::string("Frame item"))); 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 462