Index: chrome/browser/ui/views/tabs/tab_drag_controller.cc |
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc |
index 05749e580125d9d39504a9fb207ffcd672748f43..f121d922d6da6b084cda35e73a94375f75ec97e7 100644 |
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc |
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc |
@@ -162,6 +162,7 @@ TabDragController::TabDragController() |
attached_tabstrip_(NULL), |
screen_(NULL), |
host_desktop_type_(chrome::HOST_DESKTOP_TYPE_NATIVE), |
+ use_aura_capture_policy_(false), |
offset_to_width_ratio_(0), |
old_focused_view_id_( |
views::ViewStorage::GetInstance()->CreateStorageID()), |
@@ -236,6 +237,12 @@ void TabDragController::Init( |
source_tabstrip->GetWidget()->GetNativeView()); |
host_desktop_type_ = chrome::GetHostDesktopTypeForNativeView( |
source_tabstrip->GetWidget()->GetNativeView()); |
+#if defined(OS_LINUX) |
+ use_aura_capture_policy_ = true; |
+#else |
+ use_aura_capture_policy_ = |
+ (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH); |
+#endif |
start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y()); |
views::View::ConvertPointToScreen(source_tab, &start_point_in_screen_); |
event_source_ = event_source; |
@@ -659,7 +666,7 @@ TabDragController::DragBrowserToNewTabStrip( |
// ReleaseCapture() is going to result in calling back to us (because it |
// results in a move). That'll cause all sorts of problems. Reset the |
// observer so we don't get notified and process the event. |
- if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { |
+ if (use_aura_capture_policy_) { |
move_loop_widget_->RemoveObserver(this); |
move_loop_widget_ = NULL; |
} |
@@ -672,7 +679,7 @@ TabDragController::DragBrowserToNewTabStrip( |
browser_widget->SetVisibilityChangedAnimationsEnabled(false); |
// For aura we can't release capture, otherwise it'll cancel a gesture. |
// Instead we have to directly change capture. |
- if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) |
+ if (use_aura_capture_policy_) |
target_tabstrip->GetWidget()->SetCapture(attached_tabstrip_); |
else |
browser_widget->ReleaseCapture(); |
@@ -692,9 +699,12 @@ TabDragController::DragBrowserToNewTabStrip( |
// that to effect the position of any windows. |
SetWindowPositionManaged(browser_widget->GetNativeView(), false); |
+#if !defined(OS_LINUX) || defined(OS_CHROMEOS) |
// EndMoveLoop is going to snap the window back to its original location. |
- // Hide it so users don't see this. |
+ // Hide it so users don't see this. Hiding a window in Linux aura causes |
+ // it to lose capture so skip it. |
browser_widget->Hide(); |
+#endif |
browser_widget->EndMoveLoop(); |
// Ideally we would always swap the tabs now, but on non-ash it seems that |
@@ -702,7 +712,7 @@ TabDragController::DragBrowserToNewTabStrip( |
// to all sorts of flicker. So, on non-ash, instead we process the move |
// after the loop completes. But on chromeos, we can do tab swapping now to |
// avoid the tab flashing issue(crbug.com/116329). |
- if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { |
+ if (use_aura_capture_policy_) { |
is_dragging_window_ = false; |
Detach(DONT_RELEASE_CAPTURE); |
Attach(target_tabstrip, point_in_screen); |
@@ -1127,8 +1137,7 @@ void TabDragController::DetachIntoNewBrowserAndRunMoveLoop( |
gfx::NativeView attached_native_view = |
attached_tabstrip_->GetWidget()->GetNativeView(); |
#endif |
- Detach(host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH ? |
- DONT_RELEASE_CAPTURE : RELEASE_CAPTURE); |
+ Detach(use_aura_capture_policy_ ? DONT_RELEASE_CAPTURE : RELEASE_CAPTURE); |
BrowserView* dragged_browser_view = |
BrowserView::GetBrowserViewForBrowser(browser); |
views::Widget* dragged_widget = dragged_browser_view->GetWidget(); |