From c5868066097abf083b18127ea1414ead6caf353c Mon Sep 17 00:00:00 2001 From: Heilig Benedek Date: Mon, 27 Nov 2017 00:24:25 +0100 Subject: [PATCH] fix flash menu being unresponsive to commands --- atom/browser/api/atom_api_menu.cc | 5 +++++ atom/browser/api/atom_api_menu.h | 2 ++ atom/browser/api/atom_api_web_contents.cc | 6 ++++-- lib/browser/api/menu.js | 3 +++ lib/browser/api/web-contents.js | 6 +++++- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/atom/browser/api/atom_api_menu.cc b/atom/browser/api/atom_api_menu.cc index da208b365911..202947092a8b 100644 --- a/atom/browser/api/atom_api_menu.cc +++ b/atom/browser/api/atom_api_menu.cc @@ -40,6 +40,7 @@ void Menu::AfterInit(v8::Isolate* isolate) { delegate.Get("getAcceleratorForCommandId", &get_accelerator_); delegate.Get("executeCommand", &execute_command_); delegate.Get("menuWillShow", &menu_will_show_); + delegate.Get("menuClosed", &menu_closed_); } bool Menu::IsCommandIdChecked(int command_id) const { @@ -75,6 +76,10 @@ void Menu::MenuWillShow(ui::SimpleMenuModel* source) { menu_will_show_.Run(); } +void Menu::MenuClosed(ui::SimpleMenuModel* source) { + menu_closed_.Run(); +} + void Menu::InsertItemAt( int index, int command_id, const base::string16& label) { model_->InsertItemAt(index, command_id, label); diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index f2316fa1893a..c1f0c600101b 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -52,6 +52,7 @@ class Menu : public mate::TrackableObject, ui::Accelerator* accelerator) const override; void ExecuteCommand(int command_id, int event_flags) override; void MenuWillShow(ui::SimpleMenuModel* source) override; + void MenuClosed(ui::SimpleMenuModel* source) override; virtual void PopupAt(Window* window, int x, int y, int positioning_item) = 0; virtual void ClosePopupAt(int32_t window_id) = 0; @@ -93,6 +94,7 @@ class Menu : public mate::TrackableObject, base::Callback(int, bool)> get_accelerator_; base::Callback, int)> execute_command_; base::Callback menu_will_show_; + base::Callback menu_closed_; DISALLOW_COPY_AND_ASSIGN(Menu); }; diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index aa9f539bd93a..2a9650160a57 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -653,8 +653,10 @@ void WebContents::RendererResponsive(content::WebContents* source) { bool WebContents::HandleContextMenu(const content::ContextMenuParams& params) { if (params.custom_context.is_pepper_menu) { - Emit("pepper-context-menu", std::make_pair(params, web_contents())); - web_contents()->NotifyContextMenuClosed(params.custom_context); + Emit("pepper-context-menu", + std::make_pair(params, web_contents()), + base::Bind(&content::WebContents::NotifyContextMenuClosed, + base::Unretained(web_contents()), params.custom_context)); } else { Emit("context-menu", std::make_pair(params, web_contents())); } diff --git a/lib/browser/api/menu.js b/lib/browser/api/menu.js index 78f1a4466a84..bd3427bcd6a4 100644 --- a/lib/browser/api/menu.js +++ b/lib/browser/api/menu.js @@ -39,6 +39,9 @@ Menu.prototype._init = function () { const found = this.groupsMap[id].find(item => item.checked) || null if (!found) v8Util.setHiddenValue(this.groupsMap[id][0], 'checked', true) } + }, + menuClosed: () => { + this.emit('closed') } } } diff --git a/lib/browser/api/web-contents.js b/lib/browser/api/web-contents.js index f770dbb31b3c..8d73bbe26211 100644 --- a/lib/browser/api/web-contents.js +++ b/lib/browser/api/web-contents.js @@ -277,10 +277,14 @@ WebContents.prototype._init = function () { }) // Handle context menu action request from pepper plugin. - this.on('pepper-context-menu', function (event, params) { + this.on('pepper-context-menu', function (event, params, callback) { // Access Menu via electron.Menu to prevent circular require const menu = electron.Menu.buildFromTemplate(params.menu) menu.popup(event.sender.getOwnerBrowserWindow(), params.x, params.y) + + menu.on('closed', () => { + callback() + }) }) // The devtools requests the webContents to reload.