| Index: chrome/views/window.cc
 | 
| ===================================================================
 | 
| --- chrome/views/window.cc	(revision 11284)
 | 
| +++ chrome/views/window.cc	(working copy)
 | 
| @@ -568,8 +568,40 @@
 | 
|    if (non_client_view_->UseNativeFrame())
 | 
|      return WidgetWin::OnNCCalcSize(mode, l_param);
 | 
|  
 | 
| -  // We need to repaint all when the window bounds change.
 | 
| -  return WVR_REDRAW;
 | 
| +  RECT* client_rect = mode ?
 | 
| +      &reinterpret_cast<NCCALCSIZE_PARAMS*>(l_param)->rgrc[0] :
 | 
| +      reinterpret_cast<RECT*>(l_param);
 | 
| +  if (IsMaximized()) {
 | 
| +    // Make the maximized mode client rect fit the screen exactly, by
 | 
| +    // subtracting the border Windows automatically adds for maximized mode.
 | 
| +    int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME);
 | 
| +    InflateRect(client_rect, -border_thickness, -border_thickness);
 | 
| +
 | 
| +    // Find all auto-hide taskbars along the screen edges and adjust in by the
 | 
| +    // thickness of the auto-hide taskbar on each such edge, so the window isn't
 | 
| +    // treated as a "fullscreen app", which would cause the taskbars to
 | 
| +    // disappear.
 | 
| +    HMONITOR monitor = MonitorFromWindow(GetHWND(), MONITOR_DEFAULTTONEAREST);
 | 
| +    if (win_util::EdgeHasAutoHideTaskbar(ABE_LEFT, monitor))
 | 
| +      client_rect->left += win_util::kAutoHideTaskbarThicknessPx;
 | 
| +    if (win_util::EdgeHasAutoHideTaskbar(ABE_TOP, monitor))
 | 
| +      client_rect->top += win_util::kAutoHideTaskbarThicknessPx;
 | 
| +    if (win_util::EdgeHasAutoHideTaskbar(ABE_RIGHT, monitor))
 | 
| +      client_rect->right -= win_util::kAutoHideTaskbarThicknessPx;
 | 
| +    if (win_util::EdgeHasAutoHideTaskbar(ABE_BOTTOM, monitor))
 | 
| +      client_rect->bottom -= win_util::kAutoHideTaskbarThicknessPx;
 | 
| +
 | 
| +    // We cannot return WVR_REDRAW when there is nonclient area, or Windows
 | 
| +    // exhibits bugs where client pixels and child HWNDs are mispositioned by
 | 
| +    // the width/height of the upper-left nonclient area.
 | 
| +    return 0;
 | 
| +  }
 | 
| +
 | 
| +  // If the window bounds change, we're going to relayout and repaint anyway.
 | 
| +  // Returning WVR_REDRAW avoids an extra paint before that of the old client
 | 
| +  // pixels in the (now wrong) location, and thus makes actions like resizing a
 | 
| +  // window from the left edge look slightly less broken.
 | 
| +  return mode ? WVR_REDRAW : 0;
 | 
|  }
 | 
|  
 | 
|  LRESULT Window::OnNCHitTest(const CPoint& point) {
 | 
| @@ -1098,21 +1130,10 @@
 | 
|    CRect window_rect;
 | 
|    GetWindowRect(&window_rect);
 | 
|    HRGN new_region;
 | 
| -  if (IsMaximized()) {
 | 
| -    HMONITOR monitor = MonitorFromWindow(GetHWND(), MONITOR_DEFAULTTONEAREST);
 | 
| -    MONITORINFO mi;
 | 
| -    mi.cbSize = sizeof mi;
 | 
| -    GetMonitorInfo(monitor, &mi);
 | 
| -    CRect work_rect = mi.rcWork;
 | 
| -    work_rect.OffsetRect(-window_rect.left, -window_rect.top);
 | 
| -    new_region = CreateRectRgnIndirect(&work_rect);
 | 
| -  } else {
 | 
| -    gfx::Path window_mask;
 | 
| -    non_client_view_->GetWindowMask(gfx::Size(window_rect.Width(),
 | 
| -                                              window_rect.Height()),
 | 
| -                                    &window_mask);
 | 
| -    new_region = window_mask.CreateHRGN();
 | 
| -  }
 | 
| +  gfx::Path window_mask;
 | 
| +  non_client_view_->GetWindowMask(
 | 
| +      gfx::Size(window_rect.Width(), window_rect.Height()), &window_mask);
 | 
| +  new_region = window_mask.CreateHRGN();
 | 
|  
 | 
|    if (current_rgn_result == ERROR || !EqualRgn(current_rgn, new_region)) {
 | 
|      // SetWindowRgn takes ownership of the HRGN created by CreateHRGN.
 | 
| 
 |