Commit c5a06dd4 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

views: make sure MenuPreTargetHandlerAura removes observer from Env

If root_ was destroyed while MenuPreTargetHandlerAura exists, then
MenuPreTargetHandlerAura would set root_ to null. This would result
in the pre-target-handler being removed from the wrong env.

I don't think this is the result of the bug referenced, but I came across
this in looking for bad pre-target handlers.

BUG=867035
TEST=none

Change-Id: Ic549cf306441e31dcd750665992e41f06416f295
Reviewed-on: https://chromium-review.googlesource.com/c/1279147Reviewed-by: default avatarJun Mukai <mukai@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#599351}
parent 820d766b
...@@ -25,7 +25,7 @@ MenuPreTargetHandlerAura::MenuPreTargetHandlerAura(MenuController* controller, ...@@ -25,7 +25,7 @@ MenuPreTargetHandlerAura::MenuPreTargetHandlerAura(MenuController* controller,
Widget* owner) Widget* owner)
: controller_(controller), root_(GetOwnerRootWindow(owner)) { : controller_(controller), root_(GetOwnerRootWindow(owner)) {
if (root_) { if (root_) {
root_->env()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem); aura_env_ = root_->env();
wm::GetActivationClient(root_)->AddObserver(this); wm::GetActivationClient(root_)->AddObserver(this);
root_->AddObserver(this); root_->AddObserver(this);
} else { } else {
...@@ -35,16 +35,13 @@ MenuPreTargetHandlerAura::MenuPreTargetHandlerAura(MenuController* controller, ...@@ -35,16 +35,13 @@ MenuPreTargetHandlerAura::MenuPreTargetHandlerAura(MenuController* controller,
LOG(WARNING) << "MenuPreTargetHandlerAura is created without owner " LOG(WARNING) << "MenuPreTargetHandlerAura is created without owner "
<< "widget. This may not work well in SingleProcessMash."; << "widget. This may not work well in SingleProcessMash.";
} }
aura::Env::GetInstance()->AddPreTargetHandler( aura_env_ = aura::Env::GetInstance();
this, ui::EventTarget::Priority::kSystem);
} }
aura_env_->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem);
} }
MenuPreTargetHandlerAura::~MenuPreTargetHandlerAura() { MenuPreTargetHandlerAura::~MenuPreTargetHandlerAura() {
if (root_) aura_env_->RemovePreTargetHandler(this);
root_->env()->RemovePreTargetHandler(this);
else
aura::Env::GetInstance()->RemovePreTargetHandler(this);
Cleanup(); Cleanup();
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "ui/wm/public/activation_change_observer.h" #include "ui/wm/public/activation_change_observer.h"
namespace aura { namespace aura {
class Env;
class Window; class Window;
} // namespace aura } // namespace aura
...@@ -48,6 +49,7 @@ class VIEWS_EXPORT MenuPreTargetHandlerAura ...@@ -48,6 +49,7 @@ class VIEWS_EXPORT MenuPreTargetHandlerAura
private: private:
void Cleanup(); void Cleanup();
aura::Env* aura_env_ = nullptr;
MenuController* controller_; MenuController* controller_;
aura::Window* root_; aura::Window* root_;
......
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