Chromium Code Reviews| Index: services/ui/ws/window_tree.cc |
| diff --git a/services/ui/ws/window_tree.cc b/services/ui/ws/window_tree.cc |
| index 4af13d6344f88bff5fe8d9d25d18bb83540519eb..cfc7e45b82dfb0cb62d3bb5292cc7a97c4205084 100644 |
| --- a/services/ui/ws/window_tree.cc |
| +++ b/services/ui/ws/window_tree.cc |
| @@ -202,7 +202,7 @@ void WindowTree::OnWindowDestroyingTreeImpl(WindowTree* tree) { |
| if (event_source_wms_ && event_source_wms_->window_tree() == tree) |
| event_source_wms_ = nullptr; |
| - // Notify our client if |tree| was embedded in any of our views. |
| + // Notify our client if |tree| was embedded in any of our windows. |
| for (const auto* tree_root : tree->roots_) { |
| const bool owns_tree_root = tree_root->id().client_id == id_; |
| if (owns_tree_root) { |
| @@ -605,7 +605,7 @@ void WindowTree::ProcessWindowReorder(const ServerWindow* window, |
| window_server_->OnTreeMessagedClient(id_); |
| } |
| -void WindowTree::ProcessWindowDeleted(const ServerWindow* window, |
| +void WindowTree::ProcessWindowDeleted(ServerWindow* window, |
| bool originated_change) { |
| if (window->id().client_id == id_) |
| created_window_map_.erase(window->id()); |
| @@ -887,8 +887,7 @@ void WindowTree::RemoveFromKnown(const ServerWindow* window, |
| RemoveFromKnown(child, local_windows); |
| } |
| -void WindowTree::RemoveRoot(const ServerWindow* window, |
| - RemoveRootReason reason) { |
| +void WindowTree::RemoveRoot(ServerWindow* window, RemoveRootReason reason) { |
| DCHECK(roots_.count(window) > 0); |
| roots_.erase(window); |
| @@ -910,6 +909,18 @@ void WindowTree::RemoveRoot(const ServerWindow* window, |
| RemoveFromKnown(window, &local_windows); |
| for (size_t i = 0; i < local_windows.size(); ++i) |
| local_windows[i]->parent()->Remove(local_windows[i]); |
| + |
| + if (reason == RemoveRootReason::UNEMBED) { |
| + window->OnEmbeddedAppDisconnected(); |
| + |
| + // Notify the owner of the window it no longer has an a client embedded in |
|
sadrul
2016/09/16 23:49:17
s/an//
sky
2016/09/18 15:40:07
Done.
|
| + // it. |
| + WindowTree* owning_tree = |
| + window_server_->GetTreeWithId(window->id().client_id); |
| + DCHECK(owning_tree && owning_tree != this); |
| + owning_tree->client()->OnEmbeddedAppDisconnected( |
| + owning_tree->ClientWindowIdForWindow(window).id); |
| + } |
| } |
| Array<mojom::WindowDataPtr> WindowTree::WindowsToWindowDatas( |
| @@ -1113,12 +1124,17 @@ void WindowTree::DeleteWindow(uint32_t change_id, Id transport_window_id) { |
| ServerWindow* window = |
| GetWindowByClientId(ClientWindowId(transport_window_id)); |
| bool success = false; |
| - bool should_close = window && (access_policy_->CanDeleteWindow(window) || |
| - ShouldRouteToWindowManager(window)); |
| - if (should_close) { |
| - WindowTree* tree = |
| - window_server_->GetTreeWithId(window->id().client_id); |
| - success = tree && tree->DeleteWindowImpl(this, window); |
| + if (window && roots_.count(window) > 0) { |
| + success = true; |
| + window_server_->OnTreeMessagedClient(id_); |
| + RemoveRoot(window, RemoveRootReason::UNEMBED); |
| + } else { |
| + bool should_close = window && (access_policy_->CanDeleteWindow(window) || |
| + ShouldRouteToWindowManager(window)); |
| + if (should_close) { |
| + WindowTree* tree = window_server_->GetTreeWithId(window->id().client_id); |
| + success = tree && tree->DeleteWindowImpl(this, window); |
| + } |
| } |
| client()->OnChangeCompleted(change_id, success); |
| } |