Commit b41187d1 authored by James Cook's avatar James Cook Committed by Commit Bot

Convert aura::WindowObserver to use CheckedObserver

It had some logic for counting window under observation, but
CheckedObserver is a better way of catching use-after-free errors.

Bug: none
Test: bots
Change-Id: I21020c194a848c21e434ad0e8583684053b1f663
Reviewed-on: https://chromium-review.googlesource.com/c/1315991
Commit-Queue: James Cook <jamescook@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605092}
parent 90cb72b6
...@@ -550,12 +550,10 @@ bool Window::ShouldRestackTransientChildren() { ...@@ -550,12 +550,10 @@ bool Window::ShouldRestackTransientChildren() {
} }
void Window::AddObserver(WindowObserver* observer) { void Window::AddObserver(WindowObserver* observer) {
observer->OnObservingWindow(this);
observers_.AddObserver(observer); observers_.AddObserver(observer);
} }
void Window::RemoveObserver(WindowObserver* observer) { void Window::RemoveObserver(WindowObserver* observer) {
observer->OnUnobservingWindow(this);
observers_.RemoveObserver(observer); observers_.RemoveObserver(observer);
} }
......
...@@ -659,7 +659,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate, ...@@ -659,7 +659,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// Makes the window pass all events through to any windows behind it. // Makes the window pass all events through to any windows behind it.
ws::mojom::EventTargetingPolicy event_targeting_policy_; ws::mojom::EventTargetingPolicy event_targeting_policy_;
base::ObserverList<WindowObserver, true>::Unchecked observers_; base::ObserverList<WindowObserver, true> observers_;
DISALLOW_COPY_AND_ASSIGN(Window); DISALLOW_COPY_AND_ASSIGN(Window);
}; };
......
...@@ -5,27 +5,13 @@ ...@@ -5,27 +5,13 @@
#include "ui/aura/window_observer.h" #include "ui/aura/window_observer.h"
#include "base/logging.h" #include "base/logging.h"
#include "ui/aura/window.h"
namespace aura { namespace aura {
WindowObserver::WindowObserver() : observing_(0) { WindowObserver::WindowObserver() = default;
}
WindowObserver::~WindowObserver() { WindowObserver::~WindowObserver() {
CHECK_EQ(0, observing_); CHECK(!IsInObserverList());
}
void WindowObserver::OnObservingWindow(aura::Window* window) {
if (!window->HasObserver(this))
observing_++;
} }
void WindowObserver::OnUnobservingWindow(aura::Window* window) {
if (window->HasObserver(this))
observing_--;
}
void WindowObserver::OnEmbeddedAppDisconnected(Window* window) {}
} // namespace aura } // namespace aura
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#ifndef UI_AURA_WINDOW_OBSERVER_H_ #ifndef UI_AURA_WINDOW_OBSERVER_H_
#define UI_AURA_WINDOW_OBSERVER_H_ #define UI_AURA_WINDOW_OBSERVER_H_
#include "base/macros.h" #include "base/observer_list_types.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "ui/aura/aura_export.h" #include "ui/aura/aura_export.h"
#include "ui/compositor/property_change_reason.h" #include "ui/compositor/property_change_reason.h"
...@@ -19,7 +19,7 @@ namespace aura { ...@@ -19,7 +19,7 @@ namespace aura {
class Window; class Window;
class AURA_EXPORT WindowObserver { class AURA_EXPORT WindowObserver : public base::CheckedObserver {
public: public:
struct HierarchyChangeParams { struct HierarchyChangeParams {
enum HierarchyChangePhase { enum HierarchyChangePhase {
...@@ -172,25 +172,10 @@ class AURA_EXPORT WindowObserver { ...@@ -172,25 +172,10 @@ class AURA_EXPORT WindowObserver {
// Called when the app embedded in |window| disconnects (is no longer // Called when the app embedded in |window| disconnects (is no longer
// embedded). // embedded).
virtual void OnEmbeddedAppDisconnected(Window* window); virtual void OnEmbeddedAppDisconnected(Window* window) {}
protected: protected:
virtual ~WindowObserver(); ~WindowObserver() override;
private:
friend class Window;
// Called when this is added as an observer on |window|.
void OnObservingWindow(Window* window);
// Called when this is removed from the observers on |window|.
void OnUnobservingWindow(Window* window);
// Tracks the number of windows being observed to track down
// http://crbug.com/365364.
int observing_;
DISALLOW_COPY_AND_ASSIGN(WindowObserver);
}; };
} // namespace aura } // namespace aura
......
...@@ -16,7 +16,7 @@ WindowPort* WindowPort::Get(Window* window) { ...@@ -16,7 +16,7 @@ WindowPort* WindowPort::Get(Window* window) {
} }
// static // static
base::ObserverList<WindowObserver, true>::Unchecked* WindowPort::GetObservers( base::ObserverList<WindowObserver, true>* WindowPort::GetObservers(
Window* window) { Window* window) {
return &(window->observers_); return &(window->observers_);
} }
......
...@@ -146,8 +146,7 @@ class AURA_EXPORT WindowPort { ...@@ -146,8 +146,7 @@ class AURA_EXPORT WindowPort {
static WindowPort* Get(Window* window); static WindowPort* Get(Window* window);
// Returns the ObserverList of a Window. // Returns the ObserverList of a Window.
static base::ObserverList<WindowObserver, true>::Unchecked* GetObservers( static base::ObserverList<WindowObserver, true>* GetObservers(Window* window);
Window* window);
private: private:
const Type type_; const Type type_;
......
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