<!--  As an open source project with a dedicated but small maintainer team, it can sometimes take a long time for issues to be addressed so please be patient and we will get back to you as soon as we can.
-->

### Preflight Checklist
<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->

* [x] I have read the [Contributing Guidelines](https://github.com/electron/electron/blob/master/CONTRIBUTING.md) for this project.
* [x] I agree to follow the [Code of Conduct](https://github.com/electron/electron/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
* [x] I have searched the issue tracker for an issue that matches the one I want to file, without success.

### Issue Details

* **Electron Version:** 8.0.0-beta.4, 9.0.0-nightly.20191225
* **Operating System:** Linux (tested on: Manjaro XFCE, Ubuntu 19.04/19.10 Gnome Shell, Kubuntu 19.10)
* **Last Known Working Electron version:** 7.1.3

### Expected Behavior
- `tray.setContextMenu(Menu.buildFromTemplate([...]))` call updates the tray menu.
- Clicking on the tray menu item doesn't lead to the app segfault crash.
- After the 3 seconds delay clicking on the tray menu item prints `clicked { label: '3000ms' }` to console.

### Actual Behavior
- `tray.setContextMenu(Menu.buildFromTemplate([...]))` call does not update the tray menu items.
- Clicking on the tray menu item leads to the app segfault crash.
- After the 3 seconds delay clicking on the tray menu item prints `clicked { label: 'initial' }` to console.

### To Reproduce
https://github.com/vladimiry-playground/electron-quick-start-tray-issue-menu-dynamics
- `npm ci`
- `ELECTRON_ENABLE_LOGGIN=true ./node_modules/electron/dist/electron main.js`
- Wait for 3 seconds (`3000 ms` gets printed in the console).
- Open the tray menu. There should be one item with `3000 ms` label but in fact, the menu item has `initial` label, so the tray menu didn't get updated.
- Start clicking on that tray menu item until the app segfaults (normally 2-4 clicks, rarely up to 10 clicks).

Console output:
```
(electron) The default value of app.allowRendererProcessReuse is deprecated, it is currently "false".  It will change to be "true" in Electron 9.  For more information please check https://github.com/electron/electron/issues/18397
[3962:1213/042903.974947:ERROR:buffer_manager.cc(488)] [.DisplayCompositor]GL ERROR :GL_INVALID_OPERATION : glBufferData: <- error from previous GL command
3000 ms
clicked { label: 'initial' }
clicked { label: 'initial' }
clicked { label: 'initial' }
clicked { label: 'initial' }
Segmentation fault (core dumped)
```
Number of `clicked { label: 'initial' }` lines count here represents how many times tray menu item was clicked before the app got crashed (normally 2-4 clicks, rarely up to 10 clicks). The click does nothing but printing to console https://github.com/vladimiry-playground/electron-quick-start-tray-issue-menu-dynamics/blob/785866857eec555404e1f3c5e0c0cfd0b1d73e8e/main.js#L51

<!--
For bugs that can be encapsulated in a small experiment, you can use Electron Fiddle (https://github.com/electron/fiddle) to publish your example to a GitHub Gist and link it your bug report.
-->

<!--
If Fiddle is insufficient to produce an example, please provide an example REPOSITORY that can be cloned and run. You can fork electron-quick-start (https://github.com/electron/electron-quick-start) and include a link to the branch with your changes.
-->

### Additional Information

#21445 is a possibly related issue.
shell/browser/ui/tray_icon_gtk.cc
#include "shell/browser/ui/tray_icon_gtk.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h"
#include "shell/browser/browser.h"
#include "shell/common/application_info.h"
#include "ui/gfx/image/image.h"
namespace electron {
TrayIconGtk::TrayIconGtk() = default;
TrayIconGtk::~TrayIconGtk() = default;
void TrayIconGtk::SetImage(const gfx::Image& image) {
  image_ = image.AsImageSkia();
  if (icon_) {
    icon_->SetIcon(image_);
    return;
  }
  tool_tip_ = base::UTF8ToUTF16(GetApplicationName());
  icon_ = base::MakeRefCounted<StatusIconLinuxDbus>();
  icon_->SetIcon(image_);
  icon_->SetToolTip(tool_tip_);
  icon_->SetDelegate(this);
}
void TrayIconGtk::SetToolTip(const std::string& tool_tip) {