| Index: ui/views/view.cc
|
| diff --git a/ui/views/view.cc b/ui/views/view.cc
|
| index 04c5f2fae25957c3ca3b706654e263fc8b3c6638..897dacd1b3f7228e410a521a018f4c70d9758491 100644
|
| --- a/ui/views/view.cc
|
| +++ b/ui/views/view.cc
|
| @@ -195,9 +195,11 @@ 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;
|
| + ui::NativeTheme* old_theme = nullptr;
|
| + Widget* old_widget = nullptr;
|
| if (parent) {
|
| old_theme = view->GetNativeTheme();
|
| + old_widget = view->GetWidget();
|
| if (parent == this) {
|
| ReorderChildView(view, index);
|
| return;
|
| @@ -241,7 +243,7 @@ void View::AddChildViewAt(View* view, int index) {
|
| for (View* v = this; v; v = v->parent_)
|
| v->ViewHierarchyChangedImpl(false, details);
|
|
|
| - view->PropagateAddNotifications(details);
|
| + view->PropagateAddNotifications(details, widget && widget != old_widget);
|
|
|
| UpdateTooltip();
|
|
|
| @@ -1516,6 +1518,10 @@ void View::NativeViewHierarchyChanged() {
|
| }
|
| }
|
|
|
| +void View::AddedToWidget() {}
|
| +
|
| +void View::RemovedFromWidget() {}
|
| +
|
| // Painting --------------------------------------------------------------------
|
|
|
| void View::PaintChildren(const ui::PaintContext& context) {
|
| @@ -1929,12 +1935,14 @@ void View::DoRemoveChildView(View* view,
|
| }
|
|
|
| Widget* widget = GetWidget();
|
| + bool is_removed_from_widget = false;
|
| if (widget) {
|
| UnregisterChildrenForVisibleBoundsNotification(view);
|
| if (view->visible())
|
| view->SchedulePaint();
|
|
|
| - if (!new_parent || new_parent->GetWidget() != widget)
|
| + is_removed_from_widget = !new_parent || new_parent->GetWidget() != widget;
|
| + if (is_removed_from_widget)
|
| widget->NotifyWillRemoveView(view);
|
| }
|
|
|
| @@ -1944,7 +1952,7 @@ void View::DoRemoveChildView(View* view,
|
| if (widget)
|
| widget->LayerTreeChanged();
|
|
|
| - view->PropagateRemoveNotifications(this, new_parent);
|
| + view->PropagateRemoveNotifications(this, new_parent, is_removed_from_widget);
|
| view->parent_ = nullptr;
|
|
|
| if (delete_removed_view && !view->owned_by_client_)
|
| @@ -1965,26 +1973,35 @@ void View::DoRemoveChildView(View* view,
|
| observer.OnChildViewRemoved(view, this);
|
| }
|
|
|
| -void View::PropagateRemoveNotifications(View* old_parent, View* new_parent) {
|
| +void View::PropagateRemoveNotifications(View* old_parent,
|
| + View* new_parent,
|
| + bool is_removed_from_widget) {
|
| {
|
| internal::ScopedChildrenLock lock(this);
|
| - for (auto* child : children_)
|
| - child->PropagateRemoveNotifications(old_parent, new_parent);
|
| + for (auto* child : children_) {
|
| + child->PropagateRemoveNotifications(old_parent, new_parent,
|
| + is_removed_from_widget);
|
| + }
|
| }
|
|
|
| ViewHierarchyChangedDetails details(false, old_parent, this, new_parent);
|
| for (View* v = this; v; v = v->parent_)
|
| v->ViewHierarchyChangedImpl(true, details);
|
| +
|
| + if (is_removed_from_widget)
|
| + RemovedFromWidget();
|
| }
|
|
|
| -void View::PropagateAddNotifications(
|
| - const ViewHierarchyChangedDetails& details) {
|
| +void View::PropagateAddNotifications(const ViewHierarchyChangedDetails& details,
|
| + bool is_added_to_widget) {
|
| {
|
| internal::ScopedChildrenLock lock(this);
|
| for (auto* child : children_)
|
| - child->PropagateAddNotifications(details);
|
| + child->PropagateAddNotifications(details, is_added_to_widget);
|
| }
|
| ViewHierarchyChangedImpl(true, details);
|
| + if (is_added_to_widget)
|
| + AddedToWidget();
|
| }
|
|
|
| void View::PropagateNativeViewHierarchyChanged() {
|
|
|