Index: ash/wm/workspace/workspace_window_resizer.cc |
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc |
index e5449d6c892b491705215b891d0a6d03f6560cc6..b16d87243692a03747f5fa816de2a85a306d86e8 100644 |
--- a/ash/wm/workspace/workspace_window_resizer.cc |
+++ b/ash/wm/workspace/workspace_window_resizer.cc |
@@ -72,6 +72,14 @@ WorkspaceWindowResizer::~WorkspaceWindowResizer() { |
Shell* shell = Shell::GetInstance(); |
shell->display_controller()->set_dont_warp_mouse(false); |
shell->cursor_manager()->UnlockCursor(); |
+ |
+ // Delete phantom controllers first so that they will never see the deleted |
+ // |layer_|. |
+ snap_phantom_window_controller_.reset(); |
+ drag_phantom_window_controller_.reset(); |
+ |
+ if (layer_) |
+ wm::DeepDeleteLayers(layer_); |
} |
// static |
@@ -224,7 +232,8 @@ WorkspaceWindowResizer::WorkspaceWindowResizer( |
total_min_(0), |
total_initial_size_(0), |
snap_type_(SNAP_NONE), |
- num_mouse_moves_since_bounds_change_(0) { |
+ num_mouse_moves_since_bounds_change_(0), |
+ layer_(NULL) { |
DCHECK(details_.is_resizable); |
Shell* shell = Shell::GetInstance(); |
@@ -473,10 +482,13 @@ void WorkspaceWindowResizer::UpdateDragPhantomWindow(const gfx::Rect& bounds, |
drag_phantom_window_controller_.reset( |
new PhantomWindowController(window())); |
drag_phantom_window_controller_->set_style( |
- PhantomWindowController::STYLE_WINDOW); |
+ PhantomWindowController::STYLE_NONE); |
// Always show the drag phantom on the |another_root| window. |
drag_phantom_window_controller_->SetDestinationDisplay( |
gfx::Screen::GetDisplayMatching(another_root->GetBoundsInScreen())); |
+ if (!layer_) |
+ RecreateWindowLayers(); |
+ drag_phantom_window_controller_->set_layer(layer_); |
drag_phantom_window_controller_->Show(bounds_in_screen); |
} else { |
// No animation. |
@@ -569,5 +581,18 @@ bool WorkspaceWindowResizer::ShouldAllowMouseWarp() const { |
(window()->type() == aura::client::WINDOW_TYPE_NORMAL); |
} |
+void WorkspaceWindowResizer::RecreateWindowLayers() { |
+ DCHECK(!layer_); |
+ layer_ = wm::RecreateWindowLayers(window()); |
+ layer_->set_delegate(window()->layer()->delegate()); |
+ // Place the layer at (0, 0) of the PhantomWindowController's window. |
+ gfx::Rect layer_bounds = layer_->bounds(); |
+ layer_bounds.set_origin(gfx::Point(0, 0)); |
+ layer_->SetBounds(layer_bounds); |
+ layer_->SetVisible(false); |
+ // Detach it from the current container. |
+ layer_->parent()->Remove(layer_); |
+} |
+ |
} // namespace internal |
} // namespace ash |