Commit 95df00d8 authored by Peter Kasting's avatar Peter Kasting Committed by Commit Bot

Replace AppMenuDestroyed() notification with weak pointer usage.

This is simpler and less error-prone, and will allow moving the app menu
observer access point to the app menu button (in a future CL).

Bug: none
Change-Id: I17eaf8d3374ae3d8bf1b078631f93c8a6c2e88f7
Reviewed-on: https://chromium-review.googlesource.com/c/1447323
Commit-Queue: Peter Kasting <pkasting@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Auto-Submit: Peter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#628541}
parent a27dc0dc
...@@ -295,20 +295,12 @@ class InMenuButton : public LabelButton { ...@@ -295,20 +295,12 @@ class InMenuButton : public LabelButton {
}; };
// AppMenuView is a view that can contain label buttons. // AppMenuView is a view that can contain label buttons.
class AppMenuView : public views::View, class AppMenuView : public views::View, public views::ButtonListener {
public views::ButtonListener,
public AppMenuObserver {
public: public:
AppMenuView(AppMenu* menu, ButtonMenuItemModel* menu_model) AppMenuView(AppMenu* menu, ButtonMenuItemModel* menu_model)
: menu_(menu), : menu_(menu->AsWeakPtr()), menu_model_(menu_model) {}
menu_model_(menu_model) {
menu_->AddObserver(this);
}
~AppMenuView() override { ~AppMenuView() override = default;
if (menu_)
menu_->RemoveObserver(this);
}
// Overridden from views::View. // Overridden from views::View.
void GetAccessibleNodeData(ui::AXNodeData* node_data) override { void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
...@@ -356,25 +348,21 @@ class AppMenuView : public views::View, ...@@ -356,25 +348,21 @@ class AppMenuView : public views::View,
return button; return button;
} }
// Overridden from AppMenuObserver:
void AppMenuDestroyed() override {
menu_->RemoveObserver(this);
menu_ = nullptr;
menu_model_ = nullptr;
}
protected: protected:
AppMenu* menu() { return menu_; } base::WeakPtr<AppMenu> menu() { return menu_; }
const AppMenu* menu() const { return menu_; } base::WeakPtr<const AppMenu> menu() const { return menu_; }
ButtonMenuItemModel* menu_model() { return menu_model_; } ButtonMenuItemModel* menu_model() {
// The menu and the items in the menu model have similar lifetimes; it's
// only safe to access model items if the menu is still alive.
DCHECK(menu_);
return menu_model_;
}
private: private:
// Hosting AppMenu. // Hosting AppMenu.
// WARNING: this may be nullptr during shutdown. base::WeakPtr<AppMenu> menu_;
AppMenu* menu_;
// The menu model containing the increment/decrement/reset items. // The menu model containing the increment/decrement/reset items.
// WARNING: this may be nullptr during shutdown.
ButtonMenuItemModel* menu_model_; ButtonMenuItemModel* menu_model_;
DISALLOW_COPY_AND_ASSIGN(AppMenuView); DISALLOW_COPY_AND_ASSIGN(AppMenuView);
...@@ -800,8 +788,6 @@ AppMenu::~AppMenu() { ...@@ -800,8 +788,6 @@ AppMenu::~AppMenu() {
if (model) if (model)
model->RemoveObserver(this); model->RemoveObserver(this);
} }
for (AppMenuObserver& observer : observer_list_)
observer.AppMenuDestroyed();
} }
void AppMenu::Init(ui::MenuModel* model) { void AppMenu::Init(ui::MenuModel* model) {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <utility> #include <utility>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "base/timer/elapsed_timer.h" #include "base/timer/elapsed_timer.h"
...@@ -33,7 +34,8 @@ class MenuRunner; ...@@ -33,7 +34,8 @@ class MenuRunner;
// AppMenu adapts the AppMenuModel to view's menu related classes. // AppMenu adapts the AppMenuModel to view's menu related classes.
class AppMenu : public views::MenuDelegate, class AppMenu : public views::MenuDelegate,
public bookmarks::BaseBookmarkModelObserver, public bookmarks::BaseBookmarkModelObserver,
public content::NotificationObserver { public content::NotificationObserver,
public base::SupportsWeakPtr<AppMenu> {
public: public:
enum RunFlags { enum RunFlags {
NO_FLAGS = 0, NO_FLAGS = 0,
......
...@@ -7,9 +7,6 @@ ...@@ -7,9 +7,6 @@
class AppMenuObserver { class AppMenuObserver {
public: public:
// Invoked when the AppMenu is about to be destroyed (from its destructor).
virtual void AppMenuDestroyed() {}
virtual void AppMenuClosed() {} virtual void AppMenuClosed() {}
// Called after AppMenu::RunMenu(). // Called after AppMenu::RunMenu().
......
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