OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/views/tabs/tab_strip.h" | 5 #include "chrome/browser/views/tabs/tab_strip.h" |
6 | 6 |
7 #include "app/animation_container.h" | 7 #include "app/animation_container.h" |
8 #include "app/drag_drop_types.h" | 8 #include "app/drag_drop_types.h" |
9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
10 #include "app/os_exchange_data.h" | 10 #include "app/os_exchange_data.h" |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 // the mouse is currently over to show the "hot" state of the close button. | 202 // the mouse is currently over to show the "hot" state of the close button. |
203 void HighlightCloseButton() { | 203 void HighlightCloseButton() { |
204 if (tabstrip_->available_width_for_tabs_ == -1 || | 204 if (tabstrip_->available_width_for_tabs_ == -1 || |
205 tabstrip_->IsDragSessionActive()) { | 205 tabstrip_->IsDragSessionActive()) { |
206 // This function is not required (and indeed may crash!) for removes | 206 // This function is not required (and indeed may crash!) for removes |
207 // spawned by non-mouse closes and drag-detaches. | 207 // spawned by non-mouse closes and drag-detaches. |
208 return; | 208 return; |
209 } | 209 } |
210 | 210 |
211 #if defined(OS_WIN) | 211 #if defined(OS_WIN) |
| 212 views::Widget* widget = tabstrip_->GetWidget(); |
| 213 // This can be null during shutdown. See http://crbug.com/42737. |
| 214 if (!widget) |
| 215 return; |
212 // Force the close button (that slides under the mouse) to highlight by | 216 // Force the close button (that slides under the mouse) to highlight by |
213 // saying the mouse just moved, but sending the same coordinates. | 217 // saying the mouse just moved, but sending the same coordinates. |
214 DWORD pos = GetMessagePos(); | 218 DWORD pos = GetMessagePos(); |
215 POINT cursor_point = {GET_X_LPARAM(pos), GET_Y_LPARAM(pos)}; | 219 POINT cursor_point = {GET_X_LPARAM(pos), GET_Y_LPARAM(pos)}; |
216 views::Widget* widget = tabstrip_->GetWidget(); | |
217 MapWindowPoints(NULL, widget->GetNativeView(), &cursor_point, 1); | 220 MapWindowPoints(NULL, widget->GetNativeView(), &cursor_point, 1); |
218 | 221 |
219 static_cast<views::WidgetWin*>(widget)->ResetLastMouseMoveFlag(); | 222 static_cast<views::WidgetWin*>(widget)->ResetLastMouseMoveFlag(); |
220 // Return to message loop - otherwise we may disrupt some operation that's | 223 // Return to message loop - otherwise we may disrupt some operation that's |
221 // in progress. | 224 // in progress. |
222 SendMessage(widget->GetNativeView(), WM_MOUSEMOVE, 0, | 225 SendMessage(widget->GetNativeView(), WM_MOUSEMOVE, 0, |
223 MAKELPARAM(cursor_point.x, cursor_point.y)); | 226 MAKELPARAM(cursor_point.x, cursor_point.y)); |
224 #else | 227 #else |
225 NOTIMPLEMENTED(); | 228 NOTIMPLEMENTED(); |
226 #endif | 229 #endif |
(...skipping 1556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1783 return tab_data_.size(); | 1786 return tab_data_.size(); |
1784 } | 1787 } |
1785 | 1788 |
1786 int TabStrip::TabDataIndexOfTab(Tab* tab) const { | 1789 int TabStrip::TabDataIndexOfTab(Tab* tab) const { |
1787 for (size_t i = 0; i < tab_data_.size(); ++i) { | 1790 for (size_t i = 0; i < tab_data_.size(); ++i) { |
1788 if (tab_data_[i].tab == tab) | 1791 if (tab_data_[i].tab == tab) |
1789 return i; | 1792 return i; |
1790 } | 1793 } |
1791 return -1; | 1794 return -1; |
1792 } | 1795 } |
OLD | NEW |