Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1155)

Unified Diff: chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm

Issue 199663004: Mac: Fix crash when dragging tabs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: A better fix Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm
index 175ad0fbe675ac7b3c6103a8c13f47c8b0034df9..4bab57e2f0530961ff3f988e73868622816ae08d 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm
@@ -9,6 +9,7 @@
#import "base/mac/sdk_forward_declarations.h"
#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
+#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
#import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h"
#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
@@ -16,6 +17,15 @@
const CGFloat kTearDistance = 36.0;
const NSTimeInterval kTearDuration = 0.333;
+// Returns whether |screenPoint| is inside the bounds of |view|.
+static BOOL PointIsInsideView(NSPoint screenPoint, NSView* view) {
+ if ([view window] == nil)
+ return NO;
+ NSPoint windowPoint = [[view window] convertScreenToBase:screenPoint];
+ NSPoint viewPoint = [view convertPoint:windowPoint fromView:nil];
+ return [view mouse:viewPoint inRect:[view bounds]];
+}
+
@interface TabStripDragController (Private)
- (void)resetDragControllers;
- (NSArray*)dropTargetsForController:(TabWindowController*)dragController;
@@ -187,8 +197,6 @@ const NSTimeInterval kTearDuration = 0.333;
}
}
- // Do not start dragging until the user has "torn" the tab off by
- // moving more than 3 pixels.
Andre 2014/03/26 01:29:31 I think this comment is outdated. The distance is
NSPoint thisPoint = [NSEvent mouseLocation];
// Iterate over possible targets checking for the one the mouse is in.
@@ -202,10 +210,7 @@ const NSTimeInterval kTearDuration = 0.333;
NSRect windowFrame = [[target window] frame];
if (NSPointInRect(thisPoint, windowFrame)) {
[[target window] orderFront:self];
- NSRect tabStripFrame = [[target tabStripView] frame];
- tabStripFrame.origin = [[target window]
- convertBaseToScreen:tabStripFrame.origin];
- if (NSPointInRect(thisPoint, tabStripFrame)) {
+ if (PointIsInsideView(thisPoint, [target tabStripView])) {
newTarget = target;
}
break;
@@ -225,13 +230,6 @@ const NSTimeInterval kTearDuration = 0.333;
// Create or identify the dragged controller.
if (!draggedController_) {
- // We don't want to remove the source window's placeholder here because the
- // new tab button may briefly flash in and out if we remove and add back the
- // placeholder.
- // Instead, we will remove the placeholder later when the target window
- // actually changes.
- targetController_ = sourceController_;
-
// Detach from the current window and put it in a new window. If there are
// no more tabs remaining after detaching, the source window is about to
// go away (it's been autoreleased) so we need to ensure we don't reference
@@ -245,7 +243,19 @@ const NSTimeInterval kTearDuration = 0.333;
dragWindow_ = [draggedController_ window];
[dragWindow_ setAlphaValue:0.0];
- if (![sourceController_ hasLiveTabs]) {
+ if ([sourceController_ hasLiveTabs]) {
+ if (PointIsInsideView(thisPoint, [sourceController_ tabStripView])) {
+ // We don't want to remove the source window's placeholder here because
+ // the new tab button may briefly flash in and out if we remove and add
+ // back the placeholder.
+ // Instead, we will remove the placeholder later when the target window
+ // actually changes.
+ targetController_ = sourceController_;
+ } else {
+ [sourceController_ removePlaceholder];
+ }
+ } else {
+ [sourceController_ removePlaceholder];
sourceController_ = draggedController_;
sourceWindow_ = dragWindow_;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698