Index: services/ui/public/cpp/window.cc |
diff --git a/services/ui/public/cpp/window.cc b/services/ui/public/cpp/window.cc |
index 4257c0c4ec169f689b64e879cce47d65b1c6e554..5cdb3c387a07a73a0c5bee47221f8edd5843a1d4 100644 |
--- a/services/ui/public/cpp/window.cc |
+++ b/services/ui/public/cpp/window.cc |
@@ -732,9 +732,14 @@ void Window::LocalSetVisible(bool visible) { |
return; |
FOR_EACH_OBSERVER(WindowObserver, observers_, |
- OnWindowVisibilityChanging(this)); |
+ OnWindowVisibilityChanging(this, visible)); |
visible_ = visible; |
- NotifyWindowVisibilityChanged(this); |
+ if (parent_) { |
+ FOR_EACH_OBSERVER(WindowObserver, parent_->observers_, |
+ OnChildWindowVisibilityChanged(this, visible)); |
+ } |
+ |
+ NotifyWindowVisibilityChanged(this, visible); |
} |
void Window::LocalSetOpacity(float opacity) { |
@@ -797,26 +802,27 @@ void Window::NotifyWindowStackingChanged() { |
&ReorderWithoutNotification); |
} |
-void Window::NotifyWindowVisibilityChanged(Window* target) { |
- if (!NotifyWindowVisibilityChangedDown(target)) { |
+void Window::NotifyWindowVisibilityChanged(Window* target, bool visible) { |
+ if (!NotifyWindowVisibilityChangedDown(target, visible)) |
return; // |this| has been deleted. |
- } |
- NotifyWindowVisibilityChangedUp(target); |
+ |
+ NotifyWindowVisibilityChangedUp(target, visible); |
} |
-bool Window::NotifyWindowVisibilityChangedAtReceiver(Window* target) { |
+bool Window::NotifyWindowVisibilityChangedAtReceiver(Window* target, |
+ bool visible) { |
// |this| may be deleted during a call to OnWindowVisibilityChanged() on one |
// of the observers. We create an local observer for that. In that case we |
// exit without further access to any members. |
WindowTracker tracker; |
tracker.Add(this); |
FOR_EACH_OBSERVER(WindowObserver, observers_, |
- OnWindowVisibilityChanged(target)); |
+ OnWindowVisibilityChanged(target, visible)); |
return tracker.Contains(this); |
} |
-bool Window::NotifyWindowVisibilityChangedDown(Window* target) { |
- if (!NotifyWindowVisibilityChangedAtReceiver(target)) |
+bool Window::NotifyWindowVisibilityChangedDown(Window* target, bool visible) { |
+ if (!NotifyWindowVisibilityChangedAtReceiver(target, visible)) |
return false; // |this| was deleted. |
std::set<const Window*> child_already_processed; |
bool child_destroyed = false; |
@@ -826,7 +832,7 @@ bool Window::NotifyWindowVisibilityChangedDown(Window* target) { |
it != children_.end(); ++it) { |
if (!child_already_processed.insert(*it).second) |
continue; |
- if (!(*it)->NotifyWindowVisibilityChangedDown(target)) { |
+ if (!(*it)->NotifyWindowVisibilityChangedDown(target, visible)) { |
// |*it| was deleted, |it| is invalid and |children_| has changed. We |
// exit the current for-loop and enter a new one. |
child_destroyed = true; |
@@ -837,11 +843,11 @@ bool Window::NotifyWindowVisibilityChangedDown(Window* target) { |
return true; |
} |
-void Window::NotifyWindowVisibilityChangedUp(Window* target) { |
+void Window::NotifyWindowVisibilityChangedUp(Window* target, bool visible) { |
// Start with the parent as we already notified |this| |
// in NotifyWindowVisibilityChangedDown. |
for (Window* window = parent(); window; window = window->parent()) { |
- bool ret = window->NotifyWindowVisibilityChangedAtReceiver(target); |
+ bool ret = window->NotifyWindowVisibilityChangedAtReceiver(target, visible); |
DCHECK(ret); |
} |
} |