| Index: ui/views/corewm/window_animations.cc
|
| diff --git a/ui/views/corewm/window_animations.cc b/ui/views/corewm/window_animations.cc
|
| index ef9f9bd08e2061c5c6d5cc595cf97eb002a118bf..4eb2caeceaf1ad2054890b00bd36f4a765c35840 100644
|
| --- a/ui/views/corewm/window_animations.cc
|
| +++ b/ui/views/corewm/window_animations.cc
|
| @@ -7,12 +7,10 @@
|
| #include <math.h>
|
|
|
| #include <algorithm>
|
| -#include <set>
|
| #include <vector>
|
|
|
| #include "base/command_line.h"
|
| #include "base/compiler_specific.h"
|
| -#include "base/debug/crash_logging.h"
|
| #include "base/logging.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/stl_util.h"
|
| @@ -127,85 +125,41 @@ class HidingWindowAnimationObserver : public ui::ImplicitAnimationObserver,
|
| public aura::WindowObserver {
|
| public:
|
| explicit HidingWindowAnimationObserver(aura::Window* window)
|
| - : topmost_window_(window) {
|
| - topmost_window_->AddObserver(this);
|
| - observed_.insert(topmost_window_);
|
| + : window_(window) {
|
| + window_->AddObserver(this);
|
| }
|
| virtual ~HidingWindowAnimationObserver() {
|
| STLDeleteElements(&layers_);
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| - // |topmost_window_| should either be not destroyed or |topmost_window_|
|
| - // and all of its children should be destroyed.
|
| - // TODO(pkotwicz): Remove CHECK once it has been determined whether a child
|
| - // window outliving the end of |topmost_window_|'s animation is the source
|
| - // of the crash in crbug.com/338788
|
| - if (!topmost_window_ && !observed_.empty()) {
|
| - aura::Window* first_observed = *observed_.begin();
|
| - std::string name = first_observed->name();
|
| - base::debug::SetCrashKeyValue("window_destroyed_layer", name);
|
| - CHECK(false);
|
| - }
|
| -#endif // defined(OS_CHROMEOS)
|
| -
|
| - for (std::set<aura::Window*>::const_iterator it = observed_.begin();
|
| - it != observed_.end();
|
| - ++it) {
|
| - (*it)->RemoveObserver(this);
|
| - }
|
| }
|
|
|
| private:
|
| // Overridden from ui::ImplicitAnimationObserver:
|
| virtual void OnImplicitAnimationsCompleted() OVERRIDE {
|
| // Window may have been destroyed by this point.
|
| - if (topmost_window_) {
|
| + if (window_) {
|
| aura::client::AnimationHost* animation_host =
|
| - aura::client::GetAnimationHost(topmost_window_);
|
| + aura::client::GetAnimationHost(window_);
|
| if (animation_host)
|
| animation_host->OnWindowHidingAnimationCompleted();
|
| + window_->RemoveObserver(this);
|
| }
|
| delete this;
|
| }
|
|
|
| // Overridden from aura::WindowObserver:
|
| virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {
|
| - window->RemoveObserver(this);
|
| - observed_.erase(window);
|
| -
|
| - if (window != topmost_window_)
|
| - return;
|
| -
|
| - // We acquire the layers of all of |topmost_window_|'s children with the
|
| - // assumption that they will be destroyed by the time that the animation
|
| - // terminates. Observe |topmost_window_|'s children to verify the
|
| - // assumption.
|
| - ObserveAllChildren(topmost_window_);
|
| -
|
| + DCHECK_EQ(window, window_);
|
| DCHECK(layers_.empty());
|
| - AcquireAllLayers(topmost_window_);
|
| + AcquireAllLayers(window_);
|
|
|
| // If the Widget has views with layers, then it is necessary to take
|
| // ownership of those layers too.
|
| - views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
|
| - topmost_window_);
|
| + views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window_);
|
| const views::Widget* const_widget = widget;
|
| if (widget && const_widget->GetRootView() && widget->GetContentsView())
|
| AcquireAllViewLayers(widget->GetContentsView());
|
| - topmost_window_ = NULL;
|
| - }
|
| -
|
| - // Starts observing all of the windows in a subtree rooted at |window|
|
| - // excluding |window|.
|
| - void ObserveAllChildren(aura::Window* window) {
|
| - for (aura::Window::Windows::const_iterator it = window->children().begin();
|
| - it != window->children().end();
|
| - ++it) {
|
| - aura::Window* child = *it;
|
| - child->AddObserver(this);
|
| - observed_.insert(child);
|
| - ObserveAllChildren(child);
|
| - }
|
| + window_->RemoveObserver(this);
|
| + window_ = NULL;
|
| }
|
|
|
| void AcquireAllLayers(aura::Window* window) {
|
| @@ -230,11 +184,7 @@ class HidingWindowAnimationObserver : public ui::ImplicitAnimationObserver,
|
| }
|
| }
|
|
|
| - aura::Window* topmost_window_;
|
| -
|
| - // The set of windows observed by this class.
|
| - std::set<aura::Window*> observed_;
|
| -
|
| + aura::Window* window_;
|
| std::vector<ui::Layer*> layers_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(HidingWindowAnimationObserver);
|
|
|