Index: chrome/browser/autocomplete/autocomplete_popup_view_mac.mm |
=================================================================== |
--- chrome/browser/autocomplete/autocomplete_popup_view_mac.mm (revision 46538) |
+++ chrome/browser/autocomplete/autocomplete_popup_view_mac.mm (working copy) |
@@ -44,8 +44,11 @@ |
const CGFloat kTextXOffset = 29.0; |
// Animation duration when animating the popup window smaller. |
-const CGFloat kShrinkAnimationDuration = 0.1; |
+const NSTimeInterval kShrinkAnimationDuration = 0.1; |
+// A very short animation duration used to cancel running animations. |
+const NSTimeInterval kCancelAnimationDuration = 0.00001; |
+ |
// Maximum fraction of the popup width that can be used to display match |
// contents. |
const float kMaxContentsFraction = 0.7; |
@@ -296,6 +299,29 @@ |
} |
} |
+void AutocompletePopupViewMac::SetPopupFrame(const NSRect frame) { |
+ // Do nothing if the popup is already animating to the given |frame|. |
+ if (NSEqualRects(frame, targetPopupFrame_)) |
+ return; |
+ |
+ NSRect currentPopupFrame = [popup_ frame]; |
+ targetPopupFrame_ = frame; |
+ |
+ // Animate the frame change if the only change is that the height got smaller. |
+ // Otherwise, resize immediately. |
+ bool animate = (NSHeight(frame) < NSHeight(currentPopupFrame) && |
+ NSWidth(frame) == NSWidth(currentPopupFrame)); |
+ NSTimeInterval duration = |
+ (animate ? kShrinkAnimationDuration: kCancelAnimationDuration); |
+ |
+ [NSAnimationContext beginGrouping]; |
+ // Don't use the GTM additon for the "Steve" slowdown because this can happen |
+ // async from user actions and the effects could be a surprise. |
+ [[NSAnimationContext currentContext] setDuration:duration]; |
+ [[popup_ animator] setFrame:frame display:YES]; |
+ [NSAnimationContext endGrouping]; |
+} |
+ |
void AutocompletePopupViewMac::UpdatePopupAppearance() { |
DCHECK([NSThread isMainThread]); |
const AutocompleteResult& result = model_->result(); |
@@ -354,6 +380,9 @@ |
[matrix setCellSize:NSMakeSize(r.size.width, |
cellSize.height + kCellHeightAdjust)]; |
+ // Save the old matrix frame in order to later restore it. |
+ NSRect savedMatrixFrame = [matrix frame]; |
+ |
// Make the matrix big enough to hold all the cells. |
[matrix sizeToCells]; |
@@ -361,24 +390,14 @@ |
r.size.height = [matrix frame].size.height; |
r.origin.y -= r.size.height + kPopupFieldGap; |
+ // Resize the matrix back to its original size, since we aren't resizing the |
+ // window immediately. |
+ [matrix setFrame:savedMatrixFrame]; |
+ |
// Update the selection. |
PaintUpdatesNow(); |
- // Animate the frame change if the only change is that the height got smaller. |
- // Otherwise, resize immediately. |
- NSRect oldFrame = [popup_ frame]; |
- if (r.size.height < oldFrame.size.height && |
- r.origin.x == oldFrame.origin.x && |
- r.size.width == oldFrame.size.width) { |
- [NSAnimationContext beginGrouping]; |
- // Don't use the GTM additon for the "Steve" slowdown because this can |
- // happen async from user actions and the effects could be a surprise. |
- [[NSAnimationContext currentContext] setDuration:kShrinkAnimationDuration]; |
- [[popup_ animator] setFrame:r display:YES]; |
- [NSAnimationContext endGrouping]; |
- } else { |
- [popup_ setFrame:r display:YES]; |
- } |
+ SetPopupFrame(r); |
if (!IsOpen()) { |
[[field_ window] addChildWindow:popup_ ordered:NSWindowAbove]; |
@@ -484,6 +503,8 @@ |
@implementation AutocompleteMatrix |
+ |
+ |
// Remove all tracking areas and initialize the one we want. Removing |
// all might be overkill, but it's unclear why there would be others |
// for the popup window. |