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() {
}
void Window::AddObserver(WindowObserver* observer) {
observer->OnObservingWindow(this);
observers_.AddObserver(observer);
}
void Window::RemoveObserver(WindowObserver* observer) {
observer->OnUnobservingWindow(this);
observers_.RemoveObserver(observer);
}
......
......@@ -659,7 +659,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// Makes the window pass all events through to any windows behind it.
ws::mojom::EventTargetingPolicy event_targeting_policy_;
base::ObserverList<WindowObserver, true>::Unchecked observers_;
base::ObserverList<WindowObserver, true> observers_;
DISALLOW_COPY_AND_ASSIGN(Window);
};
......
......@@ -5,27 +5,13 @@
#include "ui/aura/window_observer.h"
#include "base/logging.h"
#include "ui/aura/window.h"
namespace aura {
WindowObserver::WindowObserver() : observing_(0) {
}
WindowObserver::WindowObserver() = default;
WindowObserver::~WindowObserver() {
CHECK_EQ(0, observing_);
}
void WindowObserver::OnObservingWindow(aura::Window* window) {
if (!window->HasObserver(this))
observing_++;
CHECK(!IsInObserverList());
}
void WindowObserver::OnUnobservingWindow(aura::Window* window) {
if (window->HasObserver(this))
observing_--;
}
void WindowObserver::OnEmbeddedAppDisconnected(Window* window) {}
} // namespace aura
......@@ -5,7 +5,7 @@
#ifndef 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 "ui/aura/aura_export.h"
#include "ui/compositor/property_change_reason.h"
......@@ -19,7 +19,7 @@ namespace aura {
class Window;
class AURA_EXPORT WindowObserver {
class AURA_EXPORT WindowObserver : public base::CheckedObserver {
public:
struct HierarchyChangeParams {
enum HierarchyChangePhase {
......@@ -172,25 +172,10 @@ class AURA_EXPORT WindowObserver {
// Called when the app embedded in |window| disconnects (is no longer
// embedded).
virtual void OnEmbeddedAppDisconnected(Window* window);
virtual void OnEmbeddedAppDisconnected(Window* window) {}
protected:
virtual ~WindowObserver();
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);
~WindowObserver() override;
};
} // namespace aura
......
......@@ -16,7 +16,7 @@ WindowPort* WindowPort::Get(Window* window) {
}
// static
base::ObserverList<WindowObserver, true>::Unchecked* WindowPort::GetObservers(
base::ObserverList<WindowObserver, true>* WindowPort::GetObservers(
Window* window) {
return &(window->observers_);
}
......
......@@ -146,8 +146,7 @@ class AURA_EXPORT WindowPort {
static WindowPort* Get(Window* window);
// Returns the ObserverList of a Window.
static base::ObserverList<WindowObserver, true>::Unchecked* GetObservers(
Window* window);
static base::ObserverList<WindowObserver, true>* GetObservers(Window* window);
private:
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