Commit 7bc2e6a2 authored by Abhijeet Singh's avatar Abhijeet Singh Committed by Commit Bot

Fix invalid references to QuickAnswersPreTargetHandler

QuickAnswersPreTargetHandler is added as a ViewObserver to the
QuickAnswersView. Since the view owns an instance of the handler, it
must stop observing the view when it is deleted to prevent invalid
references to it from ~QuickAnswersView() later.

The issue was observed when a failing trybot reverted a related change
in chromium/2212238.

is_debug set to true.

Bug: b:157182213
Test: Tested on Chrome OS VM and running ash:ash_unittests with
Change-Id: If59e512a45faab65a99ed4e76a1e00c5e60550aa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2216816Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Abhijeet Singh <siabhijeet@google.com>
Cr-Commit-Position: refs/heads/master@{#772430}
parent 42cfbdc3
...@@ -35,11 +35,11 @@ void QuickAnswersPreTargetHandler::Init() { ...@@ -35,11 +35,11 @@ void QuickAnswersPreTargetHandler::Init() {
// mouse capture as well as a pre-target handler, so we need to register one // mouse capture as well as a pre-target handler, so we need to register one
// here as well to intercept events for QuickAnswersView. // here as well to intercept events for QuickAnswersView.
Shell::Get()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem); Shell::Get()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem);
view_->AddObserver(this); view_observer_.Add(view_);
} }
void QuickAnswersPreTargetHandler::OnEvent(ui::Event* event) { void QuickAnswersPreTargetHandler::OnEvent(ui::Event* event) {
if (!event->IsLocatedEvent()) if (!view_observer_.IsObservingSources() || !event->IsLocatedEvent())
return; return;
// Clone event to forward down the view-hierarchy. // Clone event to forward down the view-hierarchy.
...@@ -94,7 +94,7 @@ void QuickAnswersPreTargetHandler::OnViewIsDeleting( ...@@ -94,7 +94,7 @@ void QuickAnswersPreTargetHandler::OnViewIsDeleting(
if (active_menu_instance) if (active_menu_instance)
active_menu_instance->Cancel(views::MenuController::ExitType::kAll); active_menu_instance->Cancel(views::MenuController::ExitType::kAll);
} }
view_->RemoveObserver(this); view_observer_.Remove(view_);
} }
// TODO(siabhijeet): Investigate using SendEventsToSink() for dispatching. // TODO(siabhijeet): Investigate using SendEventsToSink() for dispatching.
......
...@@ -5,17 +5,15 @@ ...@@ -5,17 +5,15 @@
#ifndef ASH_QUICK_ANSWERS_UI_QUICK_ANSWERS_PRE_TARGET_HANDLER_H_ #ifndef ASH_QUICK_ANSWERS_UI_QUICK_ANSWERS_PRE_TARGET_HANDLER_H_
#define ASH_QUICK_ANSWERS_UI_QUICK_ANSWERS_PRE_TARGET_HANDLER_H_ #define ASH_QUICK_ANSWERS_UI_QUICK_ANSWERS_PRE_TARGET_HANDLER_H_
#include "base/scoped_observer.h"
#include "ui/events/event_handler.h" #include "ui/events/event_handler.h"
#include "ui/views/view.h"
#include "ui/views/view_observer.h" #include "ui/views/view_observer.h"
namespace ui { namespace ui {
class LocatedEvent; class LocatedEvent;
} // namespace ui } // namespace ui
namespace views {
class View;
} // namespace views
namespace ash { namespace ash {
class QuickAnswersView; class QuickAnswersView;
...@@ -58,6 +56,7 @@ class QuickAnswersPreTargetHandler : public ui::EventHandler, ...@@ -58,6 +56,7 @@ class QuickAnswersPreTargetHandler : public ui::EventHandler,
// Associated view handled by this class. // Associated view handled by this class.
views::View* const view_; views::View* const view_;
ScopedObserver<views::View, views::ViewObserver> view_observer_{this};
// Whether any active menus, |view_| is a companion Quick-Answers related view // Whether any active menus, |view_| is a companion Quick-Answers related view
// of which, should be dismissed when it is deleted. // of which, should be dismissed when it is deleted.
......
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