Chromium Code Reviews| Index: ui/views/view.cc |
| diff --git a/ui/views/view.cc b/ui/views/view.cc |
| index 04c5f2fae25957c3ca3b706654e263fc8b3c6638..1a173b8760e1448c638325907cd0983f28aebee1 100644 |
| --- a/ui/views/view.cc |
| +++ b/ui/views/view.cc |
| @@ -196,8 +196,10 @@ void View::AddChildViewAt(View* view, int index) { |
| // If |view| has a parent, remove it from its parent. |
| View* parent = view->parent_; |
| ui::NativeTheme* old_theme = NULL; |
| + Widget* old_widget = NULL; |
| if (parent) { |
| old_theme = view->GetNativeTheme(); |
| + old_widget = view->GetWidget(); |
| if (parent == this) { |
| ReorderChildView(view, index); |
| return; |
| @@ -248,6 +250,9 @@ void View::AddChildViewAt(View* view, int index) { |
| if (widget) { |
| RegisterChildrenForVisibleBoundsNotification(view); |
| + if (widget != old_widget) |
| + view->PropagateAddedToWidget(); |
|
sky
2017/02/27 16:46:54
I would like to avoid more tree walking. Can't you
msimonides
2017/02/28 10:07:27
Ok.
I will merge PropagateAddedToWidget into Propa
sky
2017/02/28 17:35:33
That's fine. These are implementation details of V
msimonides
2017/03/01 10:31:52
Done.
|
| + |
| if (view->visible()) |
| view->SchedulePaint(); |
| } |
| @@ -1516,6 +1521,10 @@ void View::NativeViewHierarchyChanged() { |
| } |
| } |
| +void View::AddedToWidget() {} |
| + |
| +void View::RemovedFromWidget() {} |
| + |
| // Painting -------------------------------------------------------------------- |
| void View::PaintChildren(const ui::PaintContext& context) { |
| @@ -1934,8 +1943,10 @@ void View::DoRemoveChildView(View* view, |
| if (view->visible()) |
| view->SchedulePaint(); |
| - if (!new_parent || new_parent->GetWidget() != widget) |
| + if (!new_parent || new_parent->GetWidget() != widget) { |
| widget->NotifyWillRemoveView(view); |
| + view->PropagateRemovedFromWidget(); |
| + } |
| } |
| // Make sure the layers belonging to the subtree rooted at |view| get |
| @@ -2027,6 +2038,24 @@ void View::PropagateNativeThemeChanged(const ui::NativeTheme* theme) { |
| OnNativeThemeChanged(theme); |
| } |
| +void View::PropagateAddedToWidget() { |
| + { |
| + internal::ScopedChildrenLock lock(this); |
| + for (auto* child : children_) |
| + child->PropagateAddedToWidget(); |
| + } |
| + AddedToWidget(); |
| +} |
| + |
| +void View::PropagateRemovedFromWidget() { |
| + { |
| + internal::ScopedChildrenLock lock(this); |
| + for (auto* child : children_) |
| + child->PropagateRemovedFromWidget(); |
| + } |
| + RemovedFromWidget(); |
| +} |
| + |
| // Size and disposition -------------------------------------------------------- |
| void View::PropagateVisibilityNotifications(View* start, bool is_visible) { |