| Index: ui/views/win/hwnd_message_handler.cc
 | 
| diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
 | 
| index e98ba078a14388ae916e5f800cea879623fcc698..14b30dae08a6784ad376598d40f2ee6d8e387da7 100644
 | 
| --- a/ui/views/win/hwnd_message_handler.cc
 | 
| +++ b/ui/views/win/hwnd_message_handler.cc
 | 
| @@ -300,6 +300,10 @@ class HWNDMessageHandler::ScopedRedrawLock {
 | 
|    DISALLOW_COPY_AND_ASSIGN(ScopedRedrawLock);
 | 
|  };
 | 
|  
 | 
| +// static HWNDMessageHandler member initialization.
 | 
| +base::LazyInstance<HWNDMessageHandler::FullscreenWindowMonitorMap>
 | 
| +    HWNDMessageHandler::fullscreen_monitor_map_ = LAZY_INSTANCE_INITIALIZER;
 | 
| +
 | 
|  ////////////////////////////////////////////////////////////////////////////////
 | 
|  // HWNDMessageHandler, public:
 | 
|  
 | 
| @@ -813,6 +817,18 @@ void HWNDMessageHandler::SetFullscreen(bool fullscreen) {
 | 
|    // window, then go ahead and do it now.
 | 
|    if (!fullscreen && dwm_transition_desired_)
 | 
|      PerformDwmTransition();
 | 
| +
 | 
| +  // Add the fullscreen window to the fullscreen window map which is used to
 | 
| +  // handle window activations.
 | 
| +  HMONITOR monitor = MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY);
 | 
| +  if (fullscreen) {
 | 
| +    (fullscreen_monitor_map_.Get())[monitor] = this;
 | 
| +  } else {
 | 
| +    FullscreenWindowMonitorMap::iterator iter =
 | 
| +        fullscreen_monitor_map_.Get().find(monitor);
 | 
| +    if (iter != fullscreen_monitor_map_.Get().end())
 | 
| +      fullscreen_monitor_map_.Get().erase(iter);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void HWNDMessageHandler::SizeConstraintsChanged() {
 | 
| @@ -1021,18 +1037,18 @@ void HWNDMessageHandler::PostProcessActivateMessage(
 | 
|    // By reducing the size of the fullscreen window by 1px, we ensure that the
 | 
|    // taskbar no longer treats the window and in turn the thread as a fullscreen
 | 
|    // thread. This in turn ensures that maximized windows on the same thread
 | 
| -  /// don't obscure the taskbar, etc.
 | 
| +  // don't obscure the taskbar, etc.
 | 
| +  // Please note that this taskbar behavior only occurs if the window becoming
 | 
| +  // active is on the same monitor as the fullscreen window.
 | 
|    if (!active) {
 | 
|      if (IsFullscreen() && ::IsWindow(window_gaining_or_losing_activation)) {
 | 
| -      // Reduce the bounds of the window by 1px to ensure that Windows does
 | 
| -      // not treat this like a fullscreen window.
 | 
| -      MONITORINFO monitor_info = {sizeof(monitor_info)};
 | 
| -      GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY),
 | 
| -                      &monitor_info);
 | 
| -      gfx::Rect shrunk_rect(monitor_info.rcMonitor);
 | 
| -      shrunk_rect.set_height(shrunk_rect.height() - 1);
 | 
| -      background_fullscreen_hack_ = true;
 | 
| -      SetBoundsInternal(shrunk_rect, false);
 | 
| +      HMONITOR active_window_monitor = MonitorFromWindow(
 | 
| +          window_gaining_or_losing_activation, MONITOR_DEFAULTTOPRIMARY);
 | 
| +      HMONITOR fullscreen_window_monitor =
 | 
| +          MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY);
 | 
| +
 | 
| +      if (active_window_monitor == fullscreen_window_monitor)
 | 
| +        OnBackgroundFullscreen();
 | 
|      }
 | 
|    } else if (background_fullscreen_hack_) {
 | 
|      // Restore the bounds of the window to fullscreen.
 | 
| @@ -1042,6 +1058,13 @@ void HWNDMessageHandler::PostProcessActivateMessage(
 | 
|                     &monitor_info);
 | 
|      SetBoundsInternal(gfx::Rect(monitor_info.rcMonitor), false);
 | 
|      background_fullscreen_hack_ = false;
 | 
| +  } else {
 | 
| +    // If the window becoming active has a fullscreen window on the same
 | 
| +    // monitor then we need to reduce the size of the fullscreen window by
 | 
| +    // 1 px. Please refer to the comments above for the reasoning behind
 | 
| +    // this.
 | 
| +    CheckAndHandleBackgroundFullscreenOnMonitor(
 | 
| +        window_gaining_or_losing_activation);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1337,6 +1360,16 @@ LRESULT HWNDMessageHandler::OnCreate(CREATESTRUCT* create_struct) {
 | 
|  void HWNDMessageHandler::OnDestroy() {
 | 
|    windows_session_change_observer_.reset(nullptr);
 | 
|    delegate_->HandleDestroying();
 | 
| +  // If the window going away is a fullscreen window then remove its references
 | 
| +  // from the full screen window map.
 | 
| +  for (auto iter = fullscreen_monitor_map_.Get().begin();
 | 
| +       iter != fullscreen_monitor_map_.Get().end();
 | 
| +       iter++) {
 | 
| +    if (iter->second == this) {
 | 
| +      fullscreen_monitor_map_.Get().erase(iter);
 | 
| +      break;
 | 
| +    }
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void HWNDMessageHandler::OnDisplayChange(UINT bits_per_pixel,
 | 
| @@ -1397,6 +1430,9 @@ void HWNDMessageHandler::OnExitSizeMove() {
 | 
|    // trackpoint drivers.
 | 
|    if (in_size_loop_ && needs_scroll_styles_)
 | 
|      AddScrollStylesToWindow(hwnd());
 | 
| +  // If the window was moved to a monitor which has a fullscreen window active,
 | 
| +  // we need to reduce the size of the fullscreen window by 1px.
 | 
| +  CheckAndHandleBackgroundFullscreenOnMonitor(hwnd());
 | 
|  }
 | 
|  
 | 
|  void HWNDMessageHandler::OnGetMinMaxInfo(MINMAXINFO* minmax_info) {
 | 
| @@ -2683,5 +2719,29 @@ void HWNDMessageHandler::SetBoundsInternal(const gfx::Rect& bounds_in_pixels,
 | 
|      direct_manipulation_helper_->SetBounds(bounds_in_pixels);
 | 
|  }
 | 
|  
 | 
| +void HWNDMessageHandler::CheckAndHandleBackgroundFullscreenOnMonitor(
 | 
| +    HWND window) {
 | 
| +  HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTOPRIMARY);
 | 
| +
 | 
| +  FullscreenWindowMonitorMap::iterator iter =
 | 
| +      fullscreen_monitor_map_.Get().find(monitor);
 | 
| +  if (iter != fullscreen_monitor_map_.Get().end()) {
 | 
| +    DCHECK(iter->second);
 | 
| +    if (window != iter->second->hwnd())
 | 
| +      iter->second->OnBackgroundFullscreen();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void HWNDMessageHandler::OnBackgroundFullscreen() {
 | 
| +  // Reduce the bounds of the window by 1px to ensure that Windows does
 | 
| +  // not treat this like a fullscreen window.
 | 
| +  MONITORINFO monitor_info = {sizeof(monitor_info)};
 | 
| +  GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY),
 | 
| +                 &monitor_info);
 | 
| +  gfx::Rect shrunk_rect(monitor_info.rcMonitor);
 | 
| +  shrunk_rect.set_height(shrunk_rect.height() - 1);
 | 
| +  background_fullscreen_hack_ = true;
 | 
| +  SetBoundsInternal(shrunk_rect, false);
 | 
| +}
 | 
|  
 | 
|  }  // namespace views
 | 
| 
 |