Home | History | Annotate | Download | only in tab_contents
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_H_
      6 #define CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_H_
      7 #pragma once
      8 
      9 #include <map>
     10 #include <string>
     11 #include <vector>
     12 
     13 #include "base/memory/scoped_vector.h"
     14 #include "base/string16.h"
     15 #include "chrome/browser/extensions/extension_menu_manager.h"
     16 #include "content/common/page_transition_types.h"
     17 #include "ui/base/models/simple_menu_model.h"
     18 #include "webkit/glue/context_menu.h"
     19 #include "webkit/glue/window_open_disposition.h"
     20 
     21 class ExtensionMenuItem;
     22 class Profile;
     23 class TabContents;
     24 
     25 namespace gfx {
     26 class Point;
     27 }
     28 
     29 namespace WebKit {
     30 struct WebMediaPlayerAction;
     31 }
     32 
     33 class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate {
     34  public:
     35   static const size_t kMaxExtensionItemTitleLength;
     36   static const size_t kMaxSelectionTextLength;
     37 
     38   RenderViewContextMenu(TabContents* tab_contents,
     39                         const ContextMenuParams& params);
     40 
     41   virtual ~RenderViewContextMenu();
     42 
     43   // Initializes the context menu.
     44   void Init();
     45 
     46   // SimpleMenuModel::Delegate implementation.
     47   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
     48   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
     49   virtual void ExecuteCommand(int command_id) OVERRIDE;
     50   virtual void MenuWillShow() OVERRIDE;
     51   virtual void MenuClosed() OVERRIDE;
     52 
     53  protected:
     54   void InitMenu();
     55 
     56   // Platform specific functions.
     57   virtual void PlatformInit() = 0;
     58   virtual bool GetAcceleratorForCommandId(
     59       int command_id,
     60       ui::Accelerator* accelerator) = 0;
     61   virtual void LookUpInDictionary();
     62 
     63   // Attempts to get an ExtensionMenuItem given the id of a context menu item.
     64   ExtensionMenuItem* GetExtensionMenuItem(int id) const;
     65 
     66   ContextMenuParams params_;
     67   TabContents* source_tab_contents_;
     68   Profile* profile_;
     69 
     70   ui::SimpleMenuModel menu_model_;
     71 
     72   // True if we are showing for an external tab contents. The default is false.
     73   bool external_;
     74 
     75 
     76   // Maps the id from a context menu item to the ExtensionMenuItem's internal
     77   // id.
     78   std::map<int, ExtensionMenuItem::Id> extension_item_map_;
     79 
     80  private:
     81   static bool IsDevToolsURL(const GURL& url);
     82   static bool IsInternalResourcesURL(const GURL& url);
     83   bool AppendCustomItems();
     84   void AppendDeveloperItems();
     85   void AppendLinkItems();
     86   void AppendImageItems();
     87   void AppendAudioItems();
     88   void AppendVideoItems();
     89   void AppendMediaItems();
     90   void AppendPluginItems();
     91   void AppendPageItems();
     92   void AppendFrameItems();
     93   void AppendCopyItem();
     94   void AppendEditableItems();
     95   void AppendSearchProvider();
     96   void AppendAllExtensionItems();
     97   void AppendSpellcheckOptionsSubMenu();
     98   // Add writing direction sub menu (only used on Mac).
     99   void AppendBidiSubMenu();
    100 
    101   // This is a helper function to append items for one particular extension.
    102   // The |index| parameter is used for assigning id's, and is incremented for
    103   // each item actually added.
    104   void AppendExtensionItems(const std::string& extension_id, int* index);
    105 
    106   // Used for recursively adding submenus of extension items.
    107   void RecursivelyAppendExtensionItems(
    108       const std::vector<ExtensionMenuItem*>& items,
    109       bool can_cross_incognito,
    110       ui::SimpleMenuModel* menu_model,
    111       int *index);
    112   // This will set the icon on the most recently-added item in the menu_model_.
    113   void SetExtensionIcon(const std::string& extension_id);
    114 
    115   // Opens the specified URL string in a new tab.  If |in_current_window| is
    116   // false, a new window is created to hold the new tab.
    117   void OpenURL(const GURL& url,
    118                WindowOpenDisposition disposition,
    119                PageTransition::Type transition);
    120 
    121   // Copy to the clipboard an image located at a point in the RenderView
    122   void CopyImageAt(int x, int y);
    123 
    124   // Launch the inspector targeting a point in the RenderView
    125   void Inspect(int x, int y);
    126 
    127   // Writes the specified text/url to the system clipboard
    128   void WriteURLToClipboard(const GURL& url);
    129 
    130   void MediaPlayerActionAt(const gfx::Point& location,
    131                            const WebKit::WebMediaPlayerAction& action);
    132 
    133   bool IsDevCommandEnabled(int id) const;
    134 
    135   // Returns a (possibly truncated) version of the current selection text
    136   // suitable or putting in the title of a menu item.
    137   string16 PrintableSelectionText();
    138 
    139   // The destination URL to use if the user tries to search for or navigate to
    140   // a text selection.
    141   GURL selection_navigation_url_;
    142 
    143   ui::SimpleMenuModel spellcheck_submenu_model_;
    144   ui::SimpleMenuModel bidi_submenu_model_;
    145   ScopedVector<ui::SimpleMenuModel> extension_menu_models_;
    146 
    147   DISALLOW_COPY_AND_ASSIGN(RenderViewContextMenu);
    148 };
    149 
    150 #endif  // CHROME_BROWSER_TAB_CONTENTS_RENDER_VIEW_CONTEXT_MENU_H_
    151