mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			215 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git chrome/browser/renderer_context_menu/render_view_context_menu.cc chrome/browser/renderer_context_menu/render_view_context_menu.cc
 | |
| index 7db1991010ce7..97811eec264bb 100644
 | |
| --- chrome/browser/renderer_context_menu/render_view_context_menu.cc
 | |
| +++ chrome/browser/renderer_context_menu/render_view_context_menu.cc
 | |
| @@ -305,6 +305,13 @@ base::OnceCallback<void(RenderViewContextMenu*)>* GetMenuShownCallback() {
 | |
|    return callback.get();
 | |
|  }
 | |
|  
 | |
| +
 | |
| +RenderViewContextMenu::MenuCreatedCallback* GetMenuCreatedCallback() {
 | |
| +  static base::NoDestructor<RenderViewContextMenu::MenuCreatedCallback>
 | |
| +      callback;
 | |
| +  return callback.get();
 | |
| +}
 | |
| +
 | |
|  enum class UmaEnumIdLookupType {
 | |
|    GeneralEnumId,
 | |
|    ContextSpecificEnumId,
 | |
| @@ -543,6 +550,10 @@ int FindUMAEnumValueForCommand(int id, UmaEnumIdLookupType type) {
 | |
|    if (ContextMenuMatcher::IsExtensionsCustomCommandId(id))
 | |
|      return 1;
 | |
|  
 | |
| +  // Match the MENU_ID_USER_FIRST to MENU_ID_USER_LAST range from cef_types.h.
 | |
| +  if (id >= 26500 && id <= 28500)
 | |
| +    return 1;
 | |
| +
 | |
|    id = CollapseCommandsForUMA(id);
 | |
|    const auto& map = GetIdcToUmaMap(type);
 | |
|    auto it = map.find(id);
 | |
| @@ -737,6 +748,14 @@ RenderViewContextMenu::RenderViewContextMenu(
 | |
|                      ? GetBrowser()->app_controller()->system_app()
 | |
|                      : nullptr;
 | |
|  #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 | |
| +
 | |
| +  auto* cb = GetMenuCreatedCallback();
 | |
| +  if (!cb->is_null()) {
 | |
| +    first_observer_ = cb->Run(this);
 | |
| +    if (first_observer_) {
 | |
| +      observers_.AddObserver(first_observer_.get());
 | |
| +    }
 | |
| +  }
 | |
|  }
 | |
|  
 | |
|  RenderViewContextMenu::~RenderViewContextMenu() = default;
 | |
| @@ -1143,6 +1162,12 @@ void RenderViewContextMenu::InitMenu() {
 | |
|    // menu, meaning that each menu item added/removed in this function will cause
 | |
|    // it to visibly jump on the screen (see b/173569669).
 | |
|    AppendQuickAnswersItems();
 | |
| +
 | |
| +  if (first_observer_) {
 | |
| +    // Do this last so that the observer can optionally modify previously
 | |
| +    // created items.
 | |
| +    first_observer_->InitMenu(params_);
 | |
| +  }
 | |
|  }
 | |
|  
 | |
|  Profile* RenderViewContextMenu::GetProfile() const {
 | |
| @@ -2979,6 +3004,12 @@ void RenderViewContextMenu::RegisterExecutePluginActionCallbackForTesting(
 | |
|    execute_plugin_action_callback_ = std::move(cb);
 | |
|  }
 | |
|  
 | |
| +// static
 | |
| +void RenderViewContextMenu::RegisterMenuCreatedCallback(
 | |
| +    MenuCreatedCallback cb) {
 | |
| +  *GetMenuCreatedCallback() = cb;
 | |
| +}
 | |
| +
 | |
|  custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList
 | |
|  RenderViewContextMenu::GetHandlersForLinkUrl() {
 | |
|    custom_handlers::ProtocolHandlerRegistry::ProtocolHandlerList handlers =
 | |
| diff --git chrome/browser/renderer_context_menu/render_view_context_menu.h chrome/browser/renderer_context_menu/render_view_context_menu.h
 | |
| index 51695cd6d98a8..dfaddfb337baa 100644
 | |
| --- chrome/browser/renderer_context_menu/render_view_context_menu.h
 | |
| +++ chrome/browser/renderer_context_menu/render_view_context_menu.h
 | |
| @@ -124,6 +124,12 @@ class RenderViewContextMenu
 | |
|        base::OnceCallback<void(content::RenderFrameHost*,
 | |
|                                blink::mojom::PluginActionType)> cb);
 | |
|  
 | |
| +  // Registers a callback that will be called each time a context menu is
 | |
| +  // created.
 | |
| +  using MenuCreatedCallback = base::RepeatingCallback<
 | |
| +      std::unique_ptr<RenderViewContextMenuObserver>(RenderViewContextMenu*)>;
 | |
| +  static void RegisterMenuCreatedCallback(MenuCreatedCallback cb);
 | |
| +
 | |
|   protected:
 | |
|    Profile* GetProfile() const;
 | |
|  
 | |
| @@ -349,6 +355,9 @@ class RenderViewContextMenu
 | |
|    //   built.
 | |
|    bool is_protocol_submenu_valid_ = false;
 | |
|  
 | |
| +  // An observer returned via MenuCreatedCallback that will be called first.
 | |
| +  std::unique_ptr<RenderViewContextMenuObserver> first_observer_;
 | |
| +
 | |
|    // An observer that handles spelling suggestions, "Add to dictionary", and
 | |
|    // "Use enhanced spell check" items.
 | |
|    std::unique_ptr<SpellingMenuObserver> spelling_suggestions_menu_observer_;
 | |
| diff --git chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc
 | |
| index 13b73503a6a73..6e840062ff825 100644
 | |
| --- chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc
 | |
| +++ chrome/browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc
 | |
| @@ -146,6 +146,9 @@ void RenderViewContextMenuViews::RunMenuAt(views::Widget* parent,
 | |
|  bool RenderViewContextMenuViews::GetAcceleratorForCommandId(
 | |
|      int command_id,
 | |
|      ui::Accelerator* accel) const {
 | |
| +  if (RenderViewContextMenu::GetAcceleratorForCommandId(command_id, accel))
 | |
| +    return true;
 | |
| +
 | |
|    // There are no formally defined accelerators we can query so we assume
 | |
|    // that Ctrl+C, Ctrl+V, Ctrl+X, Ctrl-A, etc do what they normally do.
 | |
|    switch (command_id) {
 | |
| diff --git components/renderer_context_menu/render_view_context_menu_base.cc components/renderer_context_menu/render_view_context_menu_base.cc
 | |
| index 9600ae2f331f9..67096fd0671a7 100644
 | |
| --- components/renderer_context_menu/render_view_context_menu_base.cc
 | |
| +++ components/renderer_context_menu/render_view_context_menu_base.cc
 | |
| @@ -378,6 +378,17 @@ bool RenderViewContextMenuBase::IsCommandIdChecked(int id) const {
 | |
|    return false;
 | |
|  }
 | |
|  
 | |
| +bool RenderViewContextMenuBase::GetAcceleratorForCommandId(
 | |
| +    int id,
 | |
| +    ui::Accelerator* accelerator) const {
 | |
| +  for (auto& observer : observers_) {
 | |
| +    if (observer.IsCommandIdSupported(id))
 | |
| +      return observer.GetAccelerator(id, accelerator);
 | |
| +  }
 | |
| +
 | |
| +  return false;
 | |
| +}
 | |
| +
 | |
|  void RenderViewContextMenuBase::ExecuteCommand(int id, int event_flags) {
 | |
|    command_executed_ = true;
 | |
|    RecordUsedItem(id);
 | |
| diff --git components/renderer_context_menu/render_view_context_menu_base.h components/renderer_context_menu/render_view_context_menu_base.h
 | |
| index 3da0bab3d7bde..f1d5d7f09d6dc 100644
 | |
| --- components/renderer_context_menu/render_view_context_menu_base.h
 | |
| +++ components/renderer_context_menu/render_view_context_menu_base.h
 | |
| @@ -86,6 +86,9 @@ class RenderViewContextMenuBase : public ui::SimpleMenuModel::Delegate,
 | |
|  
 | |
|    const ui::SimpleMenuModel& menu_model() const { return menu_model_; }
 | |
|    const content::ContextMenuParams& params() const { return params_; }
 | |
| +  content::WebContents* source_web_contents() const {
 | |
| +    return source_web_contents_;
 | |
| +  }
 | |
|  
 | |
|    // Returns true if the specified command id is known and valid for
 | |
|    // this menu. If the command is known |enabled| is set to indicate
 | |
| @@ -94,6 +97,9 @@ class RenderViewContextMenuBase : public ui::SimpleMenuModel::Delegate,
 | |
|  
 | |
|    // SimpleMenuModel::Delegate implementation.
 | |
|    bool IsCommandIdChecked(int command_id) const override;
 | |
| +  bool GetAcceleratorForCommandId(
 | |
| +      int command_id,
 | |
| +      ui::Accelerator* accelerator) const override;
 | |
|    void ExecuteCommand(int command_id, int event_flags) override;
 | |
|    void OnMenuWillShow(ui::SimpleMenuModel* source) override;
 | |
|    void MenuClosed(ui::SimpleMenuModel* source) override;
 | |
| @@ -124,6 +130,9 @@ class RenderViewContextMenuBase : public ui::SimpleMenuModel::Delegate,
 | |
|    content::WebContents* GetWebContents() const override;
 | |
|    content::BrowserContext* GetBrowserContext() const override;
 | |
|  
 | |
| +  // May return nullptr if the frame was deleted while the menu was open.
 | |
| +  content::RenderFrameHost* GetRenderFrameHost() const;
 | |
| +
 | |
|   protected:
 | |
|    friend class RenderViewContextMenuTest;
 | |
|    friend class RenderViewContextMenuPrefsTest;
 | |
| @@ -162,9 +171,6 @@ class RenderViewContextMenuBase : public ui::SimpleMenuModel::Delegate,
 | |
|    virtual void AppendPlatformEditableItems() {}
 | |
|    virtual void ExecOpenInReadAnything() = 0;
 | |
|  
 | |
| -  // May return nullptr if the frame was deleted while the menu was open.
 | |
| -  content::RenderFrameHost* GetRenderFrameHost() const;
 | |
| -
 | |
|    bool IsCustomItemChecked(int id) const;
 | |
|    bool IsCustomItemEnabled(int id) const;
 | |
|  
 | |
| diff --git components/renderer_context_menu/render_view_context_menu_observer.cc components/renderer_context_menu/render_view_context_menu_observer.cc
 | |
| index 2e2d05f91c646..85b256b2be9bd 100644
 | |
| --- components/renderer_context_menu/render_view_context_menu_observer.cc
 | |
| +++ components/renderer_context_menu/render_view_context_menu_observer.cc
 | |
| @@ -15,3 +15,8 @@ bool RenderViewContextMenuObserver::IsCommandIdChecked(int command_id) {
 | |
|  bool RenderViewContextMenuObserver::IsCommandIdEnabled(int command_id) {
 | |
|    return false;
 | |
|  }
 | |
| +
 | |
| +bool RenderViewContextMenuObserver::GetAccelerator(int command_id,
 | |
| +                                                   ui::Accelerator* accel) {
 | |
| +  return false;
 | |
| +}
 | |
| diff --git components/renderer_context_menu/render_view_context_menu_observer.h components/renderer_context_menu/render_view_context_menu_observer.h
 | |
| index b360a8eb4e820..6f9023a629046 100644
 | |
| --- components/renderer_context_menu/render_view_context_menu_observer.h
 | |
| +++ components/renderer_context_menu/render_view_context_menu_observer.h
 | |
| @@ -11,6 +11,10 @@ namespace content {
 | |
|  struct ContextMenuParams;
 | |
|  }
 | |
|  
 | |
| +namespace ui {
 | |
| +class Accelerator;
 | |
| +}
 | |
| +
 | |
|  // The interface used for implementing context-menu items. The following
 | |
|  // instruction describe how to implement a context-menu item with this
 | |
|  // interface.
 | |
| @@ -100,6 +104,8 @@ class RenderViewContextMenuObserver {
 | |
|    virtual bool IsCommandIdChecked(int command_id);
 | |
|    virtual bool IsCommandIdEnabled(int command_id);
 | |
|  
 | |
| +  virtual bool GetAccelerator(int command_id, ui::Accelerator* accel);
 | |
| +
 | |
|    // Called when a user selects the specified context-menu item. This is
 | |
|    // only called when the observer returns true for IsCommandIdSupported()
 | |
|    // for that |command_id|.
 |