| Index: ash/wm/maximize_mode/maximize_mode_window_state.cc | 
| diff --git a/ash/wm/maximize_mode/maximize_mode_window_state.cc b/ash/wm/maximize_mode/maximize_mode_window_state.cc | 
| index 989fff71822c8b40e44aafde767fd93ab2670b50..8befd20fc28e0da4d7b7e1910a184983bc7c25c7 100644 | 
| --- a/ash/wm/maximize_mode/maximize_mode_window_state.cc | 
| +++ b/ash/wm/maximize_mode/maximize_mode_window_state.cc | 
| @@ -11,6 +11,7 @@ | 
| #include "ash/shell.h" | 
| #include "ash/wm/maximize_mode/maximize_mode_window_manager.h" | 
| #include "ash/wm/screen_pinning_controller.h" | 
| +#include "ash/wm/splitview/split_view_controller.h" | 
| #include "ash/wm/window_animation_types.h" | 
| #include "ash/wm/window_properties.h" | 
| #include "ash/wm/window_state_util.h" | 
| @@ -67,11 +68,36 @@ gfx::Rect GetCenteredBounds(const gfx::Rect& bounds_in_parent, | 
| return work_area_in_parent; | 
| } | 
|  | 
| +// Returns true if the window can snap in maximized mode. | 
| +bool CanSnap(wm::WindowState* window_state) { | 
| +  // If split view mode is not allowed in maximized mode, do not allow snap | 
| +  // window. | 
| +  if (!SplitViewController::ShouldAllowSplitView()) | 
| +    return false; | 
| +  return window_state->CanSnap(); | 
| +} | 
| + | 
| // Returns the maximized/full screen and/or centered bounds of a window. | 
| gfx::Rect GetBoundsInMaximizedMode(wm::WindowState* state_object) { | 
| if (state_object->IsFullscreen() || state_object->IsPinned()) | 
| return ScreenUtil::GetDisplayBoundsInParent(state_object->window()); | 
|  | 
| +  if (state_object->GetStateType() == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED) { | 
| +    DCHECK(CanSnap(state_object)); | 
| +    return Shell::Get() | 
| +        ->split_view_controller() | 
| +        ->GetSnappedWindowBoundsInParent(state_object->window(), | 
| +                                         SplitViewController::LEFT_SNAPPED); | 
| +  } | 
| + | 
| +  if (state_object->GetStateType() == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED) { | 
| +    DCHECK(CanSnap(state_object)); | 
| +    return Shell::Get() | 
| +        ->split_view_controller() | 
| +        ->GetSnappedWindowBoundsInParent(state_object->window(), | 
| +                                         SplitViewController::RIGHT_SNAPPED); | 
| +  } | 
| + | 
| gfx::Rect bounds_in_parent; | 
| // Make the window as big as possible. | 
| if (state_object->CanMaximize() || state_object->CanResize()) { | 
| @@ -169,13 +195,23 @@ void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, | 
| case wm::WM_EVENT_CYCLE_SNAP_LEFT: | 
| case wm::WM_EVENT_CYCLE_SNAP_RIGHT: | 
| case wm::WM_EVENT_CENTER: | 
| -    case wm::WM_EVENT_SNAP_LEFT: | 
| -    case wm::WM_EVENT_SNAP_RIGHT: | 
| case wm::WM_EVENT_NORMAL: | 
| case wm::WM_EVENT_MAXIMIZE: | 
| UpdateWindow(window_state, GetMaximizedOrCenteredWindowType(window_state), | 
| true); | 
| return; | 
| +    case wm::WM_EVENT_SNAP_LEFT: | 
| +      UpdateWindow(window_state, | 
| +                   GetSnappedWindowStateType( | 
| +                       window_state, wm::WINDOW_STATE_TYPE_LEFT_SNAPPED), | 
| +                   true); | 
| +      return; | 
| +    case wm::WM_EVENT_SNAP_RIGHT: | 
| +      UpdateWindow(window_state, | 
| +                   GetSnappedWindowStateType( | 
| +                       window_state, wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED), | 
| +                   true); | 
| +      return; | 
| case wm::WM_EVENT_MINIMIZE: | 
| UpdateWindow(window_state, wm::WINDOW_STATE_TYPE_MINIMIZED, true); | 
| return; | 
| @@ -274,7 +310,9 @@ void MaximizeModeWindowState::UpdateWindow(wm::WindowState* window_state, | 
| target_state == wm::WINDOW_STATE_TYPE_TRUSTED_PINNED || | 
| (target_state == wm::WINDOW_STATE_TYPE_NORMAL && | 
| !window_state->CanMaximize()) || | 
| -         target_state == wm::WINDOW_STATE_TYPE_FULLSCREEN); | 
| +         target_state == wm::WINDOW_STATE_TYPE_FULLSCREEN || | 
| +         target_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED || | 
| +         target_state == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED); | 
|  | 
| if (current_state_type_ == target_state) { | 
| if (target_state == wm::WINDOW_STATE_TYPE_MINIMIZED) | 
| @@ -295,6 +333,14 @@ void MaximizeModeWindowState::UpdateWindow(wm::WindowState* window_state, | 
| window_state->window()->Hide(); | 
| if (window_state->IsActive()) | 
| window_state->Deactivate(); | 
| +  } else if (target_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED) { | 
| +    window_state->SetBoundsDirectAnimated( | 
| +        Shell::Get()->split_view_controller()->GetSnappedWindowBoundsInParent( | 
| +            window_state->window(), SplitViewController::LEFT_SNAPPED)); | 
| +  } else if (target_state == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED) { | 
| +    window_state->SetBoundsDirectAnimated( | 
| +        Shell::Get()->split_view_controller()->GetSnappedWindowBoundsInParent( | 
| +            window_state->window(), SplitViewController::RIGHT_SNAPPED)); | 
| } else { | 
| UpdateBounds(window_state, animated); | 
| } | 
| @@ -324,6 +370,15 @@ wm::WindowStateType MaximizeModeWindowState::GetMaximizedOrCenteredWindowType( | 
| : wm::WINDOW_STATE_TYPE_NORMAL; | 
| } | 
|  | 
| +wm::WindowStateType MaximizeModeWindowState::GetSnappedWindowStateType( | 
| +    wm::WindowState* window_state, | 
| +    wm::WindowStateType target_state) { | 
| +  DCHECK(target_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED || | 
| +         target_state == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED); | 
| +  return CanSnap(window_state) ? target_state | 
| +                               : GetMaximizedOrCenteredWindowType(window_state); | 
| +} | 
| + | 
| void MaximizeModeWindowState::UpdateBounds(wm::WindowState* window_state, | 
| bool animated) { | 
| if (defer_bounds_updates_) | 
|  |