| Index: chrome/browser/ui/cocoa/browser/password_generation_bubble_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/browser/password_generation_bubble_controller.mm b/chrome/browser/ui/cocoa/browser/password_generation_bubble_controller.mm
|
| deleted file mode 100644
|
| index 354f210170fd721abe671fbaaff3dce5a2558fb1..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/browser/password_generation_bubble_controller.mm
|
| +++ /dev/null
|
| @@ -1,407 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#import "chrome/browser/ui/cocoa/browser/password_generation_bubble_controller.h"
|
| -
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#import "chrome/browser/ui/cocoa/info_bubble_view.h"
|
| -#import "chrome/browser/ui/cocoa/info_bubble_window.h"
|
| -#include "chrome/browser/ui/cocoa/key_equivalent_constants.h"
|
| -#import "chrome/browser/ui/cocoa/styled_text_field_cell.h"
|
| -#include "chrome/grit/generated_resources.h"
|
| -#include "components/autofill/content/common/autofill_messages.h"
|
| -#include "components/autofill/core/browser/password_generator.h"
|
| -#include "components/autofill/core/common/password_form.h"
|
| -#include "components/autofill/core/common/password_generation_util.h"
|
| -#include "components/password_manager/core/browser/password_manager.h"
|
| -#include "content/public/browser/render_view_host.h"
|
| -#include "grit/theme_resources.h"
|
| -#import "ui/base/cocoa/tracking_area.h"
|
| -#include "ui/base/l10n/l10n_util_mac.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/font_list.h"
|
| -
|
| -namespace {
|
| -
|
| -// Size of the border in the bubble.
|
| -const CGFloat kBorderSize = 9.0;
|
| -
|
| -// Visible size of the textfield.
|
| -const CGFloat kTextFieldHeight = 20.0;
|
| -const CGFloat kTextFieldWidth = 172.0;
|
| -
|
| -// Frame padding necessary to make the textfield the correct visible size.
|
| -const CGFloat kTextFieldTopPadding = 3.0;
|
| -
|
| -// Visible size of the button
|
| -const CGFloat kButtonWidth = 63.0;
|
| -const CGFloat kButtonHeight = 20.0;
|
| -
|
| -// Padding that is added to the frame around the button to make it the
|
| -// correct visible size. Determined via visual inspection.
|
| -const CGFloat kButtonHorizontalPadding = 6.0;
|
| -const CGFloat kButtonVerticalPadding = 3.0;
|
| -
|
| -// Visible size of the title.
|
| -const CGFloat kTitleWidth = 170.0;
|
| -const CGFloat kTitleHeight = 15.0;
|
| -
|
| -// Space between the title and the textfield.
|
| -const CGFloat kVerticalSpacing = 13.0;
|
| -
|
| -// Space between the textfield and the button.
|
| -const CGFloat kHorizontalSpacing = 7.0;
|
| -
|
| -// We don't actually want the border to be kBorderSize on top as there is
|
| -// whitespace in the title text that makes it looks substantially bigger.
|
| -const CGFloat kTopBorderOffset = 3.0;
|
| -
|
| -const CGFloat kIconSize = 26.0;
|
| -
|
| -} // namespace
|
| -
|
| -// Customized StyledTextFieldCell to display one button decoration that changes
|
| -// on hover.
|
| -@interface PasswordGenerationTextFieldCell : StyledTextFieldCell {
|
| - @private
|
| - PasswordGenerationBubbleController* controller_;
|
| - BOOL hovering_;
|
| - base::scoped_nsobject<NSImage> normalImage_;
|
| - base::scoped_nsobject<NSImage> hoverImage_;
|
| -}
|
| -
|
| -- (void)setUpWithController:(PasswordGenerationBubbleController*)controller
|
| - normalImage:(NSImage*)normalImage
|
| - hoverImage:(NSImage*)hoverImage;
|
| -- (void)mouseEntered:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView;
|
| -- (void)mouseExited:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView;
|
| -- (BOOL)mouseDown:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView;
|
| -- (void)setUpTrackingAreaInRect:(NSRect)frame
|
| - ofView:(PasswordGenerationTextField*)controlView;
|
| -// Exposed for testing.
|
| -- (void)iconClicked;
|
| -@end
|
| -
|
| -@implementation PasswordGenerationTextField
|
| -
|
| -+ (Class)cellClass {
|
| - return [PasswordGenerationTextFieldCell class];
|
| -}
|
| -
|
| -- (PasswordGenerationTextFieldCell*)cell {
|
| - return base::mac::ObjCCastStrict<PasswordGenerationTextFieldCell>(
|
| - [super cell]);
|
| -}
|
| -
|
| -- (id)initWithFrame:(NSRect)frame
|
| - withController:(PasswordGenerationBubbleController*)controller
|
| - normalImage:(NSImage*)normalImage
|
| - hoverImage:(NSImage*)hoverImage {
|
| - self = [super initWithFrame:frame];
|
| - if (self) {
|
| - PasswordGenerationTextFieldCell* cell = [self cell];
|
| - [cell setUpWithController:controller
|
| - normalImage:normalImage
|
| - hoverImage:hoverImage];
|
| - [cell setUpTrackingAreaInRect:[self bounds] ofView:self];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)mouseEntered:(NSEvent*)theEvent {
|
| - [[self cell] mouseEntered:theEvent inView:self];
|
| -}
|
| -
|
| -- (void)mouseExited:(NSEvent*)theEvent {
|
| - [[self cell] mouseExited:theEvent inView:self];
|
| -}
|
| -
|
| -- (void)mouseDown:(NSEvent*)theEvent {
|
| - // Let the cell handle the click if it's in the decoration.
|
| - if (![[self cell] mouseDown:theEvent inView:self]) {
|
| - if ([self currentEditor]) {
|
| - [[self currentEditor] mouseDown:theEvent];
|
| - } else {
|
| - // We somehow lost focus.
|
| - [super mouseDown:theEvent];
|
| - }
|
| - }
|
| -}
|
| -
|
| -- (void)simulateIconClick {
|
| - [[self cell] iconClicked];
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation PasswordGenerationTextFieldCell
|
| -
|
| -- (void)setUpWithController:(PasswordGenerationBubbleController*)controller
|
| - normalImage:(NSImage*)normalImage
|
| - hoverImage:(NSImage*)hoverImage {
|
| - controller_ = controller;
|
| - hovering_ = NO;
|
| - normalImage_.reset([normalImage retain]);
|
| - hoverImage_.reset([hoverImage retain]);
|
| - [self setLineBreakMode:NSLineBreakByTruncatingTail];
|
| - [self setTruncatesLastVisibleLine:YES];
|
| -}
|
| -
|
| -- (void)splitFrame:(NSRect*)cellFrame toIconFrame:(NSRect*)iconFrame {
|
| - NSDivideRect(*cellFrame, iconFrame, cellFrame,
|
| - kIconSize, NSMaxXEdge);
|
| -}
|
| -
|
| -- (NSRect)getIconFrame:(NSRect)cellFrame {
|
| - NSRect iconFrame;
|
| - [self splitFrame:&cellFrame toIconFrame:&iconFrame];
|
| - return iconFrame;
|
| -}
|
| -
|
| -- (NSRect)getTextFrame:(NSRect)cellFrame {
|
| - NSRect iconFrame;
|
| - [self splitFrame:&cellFrame toIconFrame:&iconFrame];
|
| - return cellFrame;
|
| -}
|
| -
|
| -- (BOOL)eventIsInDecoration:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView {
|
| - NSPoint mouseLocation = [controlView convertPoint:[theEvent locationInWindow]
|
| - fromView:nil];
|
| - NSRect cellFrame = [controlView bounds];
|
| - return NSMouseInRect(mouseLocation,
|
| - [self getIconFrame:cellFrame],
|
| - [controlView isFlipped]);
|
| -}
|
| -
|
| -- (void)mouseEntered:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView {
|
| - hovering_ = YES;
|
| - [controlView setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (void)mouseExited:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView {
|
| - hovering_ = NO;
|
| - [controlView setNeedsDisplay:YES];
|
| -}
|
| -
|
| -- (BOOL)mouseDown:(NSEvent*)theEvent
|
| - inView:(PasswordGenerationTextField*)controlView {
|
| - if ([self eventIsInDecoration:theEvent inView:controlView]) {
|
| - [self iconClicked];
|
| - return YES;
|
| - }
|
| - return NO;
|
| -}
|
| -
|
| -- (void)iconClicked {
|
| - [controller_ regeneratePassword];
|
| -}
|
| -
|
| -- (NSImage*)getImage {
|
| - if (hovering_)
|
| - return hoverImage_;
|
| - return normalImage_;
|
| -}
|
| -
|
| -- (NSRect)adjustFrameForFrame:(NSRect)frame {
|
| - // By default, there appears to be a 2 pixel gap between what is considered
|
| - // part of the textFrame and what is considered part of the icon.
|
| - // TODO(gcasto): This really should be fixed in StyledTextFieldCell, as it
|
| - // looks like the location bar also suffers from this issue.
|
| - frame.size.width += 2;
|
| - return frame;
|
| -}
|
| -
|
| -- (NSRect)textFrameForFrame:(NSRect)cellFrame {
|
| - // Baseclass insets the rect by top and bottom offsets.
|
| - NSRect textFrame = [super textFrameForFrame:cellFrame];
|
| - textFrame = [self getTextFrame:textFrame];
|
| - return [self adjustFrameForFrame:textFrame];
|
| -}
|
| -
|
| -- (NSRect)textCursorFrameForFrame:(NSRect)cellFrame {
|
| - NSRect textFrame = [self getTextFrame:cellFrame];
|
| - return [self adjustFrameForFrame:textFrame];
|
| -}
|
| -
|
| -- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
|
| - NSImage* image = [self getImage];
|
| - NSRect iconFrame = [self getIconFrame:cellFrame];
|
| - // Center the image in the available space. At the moment the image is
|
| - // slightly larger than the frame so we crop it.
|
| - // Offset the full difference on the left hand side since the border on the
|
| - // right takes up some space. Offset half the vertical difference on the
|
| - // bottom so that the image stays vertically centered.
|
| - const CGFloat xOffset = [image size].width - NSWidth(iconFrame);
|
| - const CGFloat yOffset = ([image size].height - (NSHeight(iconFrame))) / 2.0;
|
| - NSRect croppedRect = NSMakeRect(xOffset,
|
| - yOffset,
|
| - NSWidth(iconFrame),
|
| - NSHeight(iconFrame));
|
| -
|
| - [image drawInRect:iconFrame
|
| - fromRect:croppedRect
|
| - operation:NSCompositeSourceOver
|
| - fraction:1.0
|
| - respectFlipped:YES
|
| - hints:nil];
|
| -
|
| - [super drawInteriorWithFrame:cellFrame inView:controlView];
|
| -}
|
| -
|
| -- (void)setUpTrackingAreaInRect:(NSRect)frame
|
| - ofView:(PasswordGenerationTextField*)view {
|
| - NSRect iconFrame = [self getIconFrame:frame];
|
| - base::scoped_nsobject<CrTrackingArea> area(
|
| - [[CrTrackingArea alloc] initWithRect:iconFrame
|
| - options:NSTrackingMouseEnteredAndExited |
|
| - NSTrackingActiveAlways owner:view userInfo:nil]);
|
| - [view addTrackingArea:area];
|
| -}
|
| -
|
| -- (CGFloat)topTextFrameOffset {
|
| - return 1.0;
|
| -}
|
| -
|
| -- (CGFloat)bottomTextFrameOffset {
|
| - return 1.0;
|
| -}
|
| -
|
| -- (CGFloat)cornerRadius {
|
| - return 4.0;
|
| -}
|
| -
|
| -- (BOOL)shouldDrawBezel {
|
| - return YES;
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation PasswordGenerationBubbleController
|
| -
|
| -@synthesize textField = textField_;
|
| -
|
| -- (id)initWithWindow:(NSWindow*)parentWindow
|
| - anchoredAt:(NSPoint)point
|
| - renderViewHost:(content::RenderViewHost*)renderViewHost
|
| - passwordManager:(password_manager::PasswordManager*)passwordManager
|
| - usingGenerator:(autofill::PasswordGenerator*)passwordGenerator
|
| - forForm:(const autofill::PasswordForm&)form {
|
| - CGFloat width = (kBorderSize*2 +
|
| - kTextFieldWidth +
|
| - kHorizontalSpacing +
|
| - kButtonWidth);
|
| - CGFloat height = (kBorderSize*2 +
|
| - kTextFieldHeight +
|
| - kVerticalSpacing +
|
| - kTitleHeight -
|
| - kTopBorderOffset +
|
| - info_bubble::kBubbleArrowHeight);
|
| - NSRect contentRect = NSMakeRect(0, 0, width, height);
|
| - base::scoped_nsobject<InfoBubbleWindow> window(
|
| - [[InfoBubbleWindow alloc] initWithContentRect:contentRect
|
| - styleMask:NSBorderlessWindowMask
|
| - backing:NSBackingStoreBuffered
|
| - defer:NO]);
|
| - if (self = [super initWithWindow:window
|
| - parentWindow:parentWindow
|
| - anchoredAt:point]) {
|
| - passwordGenerator_ = passwordGenerator;
|
| - renderViewHost_ = renderViewHost;
|
| - passwordManager_ = passwordManager;
|
| - form_ = form;
|
| - [[self bubble] setArrowLocation:info_bubble::kTopLeft];
|
| - [self performLayout];
|
| - }
|
| -
|
| - return self;
|
| -}
|
| -
|
| -- (void)performLayout {
|
| - NSView* contentView = [[self window] contentView];
|
| - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
|
| -
|
| - textField_ = [[[PasswordGenerationTextField alloc]
|
| - initWithFrame:NSMakeRect(kBorderSize,
|
| - kBorderSize,
|
| - kTextFieldWidth,
|
| - kTextFieldHeight + kTextFieldTopPadding)
|
| - withController:self
|
| - normalImage:rb.GetNativeImageNamed(IDR_RELOAD_DIMMED).ToNSImage()
|
| - hoverImage:rb.GetNativeImageNamed(IDR_RELOAD)
|
| - .ToNSImage()] autorelease];
|
| - const gfx::FontList& smallBoldFont =
|
| - rb.GetFontList(ui::ResourceBundle::SmallBoldFont);
|
| - [textField_ setFont:smallBoldFont.GetPrimaryFont().GetNativeFont()];
|
| - [textField_
|
| - setStringValue:base::SysUTF8ToNSString(passwordGenerator_->Generate())];
|
| - [textField_ setDelegate:self];
|
| - [contentView addSubview:textField_];
|
| -
|
| - CGFloat buttonX = (NSMaxX([textField_ frame]) +
|
| - kHorizontalSpacing -
|
| - kButtonHorizontalPadding);
|
| - CGFloat buttonY = kBorderSize - kButtonVerticalPadding;
|
| - NSButton* button =
|
| - [[NSButton alloc] initWithFrame:NSMakeRect(
|
| - buttonX,
|
| - buttonY,
|
| - kButtonWidth + 2 * kButtonHorizontalPadding,
|
| - kButtonHeight + 2 * kButtonVerticalPadding)];
|
| - [button setBezelStyle:NSRoundedBezelStyle];
|
| - [button setTitle:l10n_util::GetNSString(IDS_PASSWORD_GENERATION_BUTTON_TEXT)];
|
| - [button setTarget:self];
|
| - [button setAction:@selector(fillPassword:)];
|
| - [contentView addSubview:button];
|
| -
|
| - base::scoped_nsobject<NSTextField> title([[NSTextField alloc] initWithFrame:
|
| - NSMakeRect(kBorderSize,
|
| - kBorderSize + kTextFieldHeight + kVerticalSpacing,
|
| - kTitleWidth,
|
| - kTitleHeight)]);
|
| - [title setEditable:NO];
|
| - [title setBordered:NO];
|
| - [title setStringValue:l10n_util::GetNSString(
|
| - IDS_PASSWORD_GENERATION_BUBBLE_TITLE)];
|
| - [contentView addSubview:title];
|
| -}
|
| -
|
| -- (IBAction)fillPassword:(id)sender {
|
| - if (renderViewHost_) {
|
| - renderViewHost_->Send(
|
| - new AutofillMsg_GeneratedPasswordAccepted(
|
| - renderViewHost_->GetRoutingID(),
|
| - base::SysNSStringToUTF16([textField_ stringValue])));
|
| - }
|
| - if (passwordManager_)
|
| - passwordManager_->SetFormHasGeneratedPassword(form_);
|
| -
|
| - actions_.password_accepted = true;
|
| - [self close];
|
| -}
|
| -
|
| -- (void)regeneratePassword {
|
| - [textField_
|
| - setStringValue:base::SysUTF8ToNSString(passwordGenerator_->Generate())];
|
| - actions_.password_regenerated = true;
|
| -}
|
| -
|
| -- (void)controlTextDidChange:(NSNotification*)notification {
|
| - actions_.password_edited = true;
|
| -}
|
| -
|
| -- (void)windowWillClose:(NSNotification*)notification {
|
| - autofill::password_generation::LogUserActions(actions_);
|
| - [super windowWillClose:notification];
|
| -}
|
| -
|
| -@end
|
|
|