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