Commit fa4b8ba2 authored by Andrey Lushnikov's avatar Andrey Lushnikov Committed by Commit Bot

mac: close context menu when destroying RenderViewContextMenuMacCocoa

Consider the following situation:
- We're running Chromium on Mac
- There's an open context menu for the browser's page

If at this moment we try to close browser programmatically via
DevTools protocol, the browser will not close - it'll hang.

This happens because:
- context menus on mac spawn nested event loops
- `RenderViewContextMenuMacCocoa` is destroyed and doesn't exit the run loop

This patch cleans up context menu when `RenderViewContextMenuMacCocoa` is
destroyed.


Change-Id: Ic2f89806954cb5386d530c6e726386ac7f5d513d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2285520
Commit-Queue: Andrey Lushnikov <lushnikov@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#786119}
parent 76bd8f54
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "chrome/browser/policy/developer_tools_policy_handler.h" #include "chrome/browser/policy/developer_tools_policy_handler.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list.h"
...@@ -2436,6 +2437,23 @@ IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, BrowserCloseWithBeforeUnload) { ...@@ -2436,6 +2437,23 @@ IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, BrowserCloseWithBeforeUnload) {
ui_test_utils::WaitForBrowserToClose(browser()); ui_test_utils::WaitForBrowserToClose(browser());
} }
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest,
BrowserCloseWithContextMenuOpened) {
EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
KeepAliveOrigin::REMOTE_DEBUGGING));
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
auto callback = [](RenderViewContextMenu* context_menu) {
BrowserHandler handler(nullptr, std::string());
handler.Close();
};
WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
RenderViewContextMenu::RegisterMenuShownCallbackForTesting(
base::BindOnce(callback));
content::SimulateMouseClickAt(tab, 0, blink::WebMouseEvent::Button::kRight,
gfx::Point(15, 15));
ui_test_utils::WaitForBrowserToClose(browser());
}
class KeepAliveDevToolsTest : public InProcessBrowserTest { class KeepAliveDevToolsTest : public InProcessBrowserTest {
protected: protected:
void SetUpCommandLine(base::CommandLine* command_line) override { void SetUpCommandLine(base::CommandLine* command_line) override {
......
...@@ -192,7 +192,10 @@ RenderViewContextMenuMacCocoa::RenderViewContextMenuMacCocoa( ...@@ -192,7 +192,10 @@ RenderViewContextMenuMacCocoa::RenderViewContextMenuMacCocoa(
set_toolkit_delegate(std::move(delegate)); set_toolkit_delegate(std::move(delegate));
} }
RenderViewContextMenuMacCocoa::~RenderViewContextMenuMacCocoa() {} RenderViewContextMenuMacCocoa::~RenderViewContextMenuMacCocoa() {
if (menu_controller_)
[menu_controller_ cancel];
}
void RenderViewContextMenuMacCocoa::Show() { void RenderViewContextMenuMacCocoa::Show() {
menu_controller_.reset([[MenuControllerCocoa alloc] initWithModel:&menu_model_ menu_controller_.reset([[MenuControllerCocoa alloc] initWithModel:&menu_model_
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment