| Index: chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm b/chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm
|
| deleted file mode 100644
|
| index 5872ab08e58e864dcd0b45e183d158d0785059ee..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm
|
| +++ /dev/null
|
| @@ -1,655 +0,0 @@
|
| -// Copyright 2014 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/website_settings/permission_bubble_controller.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/mac/bind_objc_block.h"
|
| -#include "base/macros.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/permissions/permission_request.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_finder.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#import "chrome/browser/ui/cocoa/browser_window_controller.h"
|
| -#import "chrome/browser/ui/cocoa/browser_window_utils.h"
|
| -#import "chrome/browser/ui/cocoa/chrome_style.h"
|
| -#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h"
|
| -#import "chrome/browser/ui/cocoa/hover_close_button.h"
|
| -#import "chrome/browser/ui/cocoa/info_bubble_view.h"
|
| -#import "chrome/browser/ui/cocoa/info_bubble_window.h"
|
| -#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
|
| -#include "chrome/browser/ui/cocoa/page_info/permission_selector_button.h"
|
| -#include "chrome/browser/ui/cocoa/page_info/split_block_button.h"
|
| -#include "chrome/browser/ui/cocoa/page_info/website_settings_utils_cocoa.h"
|
| -#include "chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h"
|
| -#include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
|
| -#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
|
| -#include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
|
| -#include "chrome/browser/ui/page_info/permission_menu_model.h"
|
| -#include "chrome/browser/ui/website_settings/permission_prompt.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/grit/generated_resources.h"
|
| -#include "components/prefs/pref_service.h"
|
| -#include "components/strings/grit/components_strings.h"
|
| -#include "components/url_formatter/elide_url.h"
|
| -#include "content/public/browser/native_web_keyboard_event.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "skia/ext/skia_utils_mac.h"
|
| -#include "ui/base/cocoa/cocoa_base_utils.h"
|
| -#import "ui/base/cocoa/controls/hyperlink_text_view.h"
|
| -#import "ui/base/cocoa/menu_controller.h"
|
| -#include "ui/base/cocoa/window_size_constants.h"
|
| -#include "ui/base/l10n/l10n_util_mac.h"
|
| -#include "ui/base/models/simple_menu_model.h"
|
| -#include "ui/gfx/color_palette.h"
|
| -#include "ui/gfx/image/image_skia_util_mac.h"
|
| -#include "ui/gfx/paint_vector_icon.h"
|
| -#include "url/gurl.h"
|
| -
|
| -using base::UserMetricsAction;
|
| -
|
| -namespace {
|
| -
|
| -// Distance between permission icon and permission label.
|
| -const CGFloat kHorizontalIconPadding = 8.0f;
|
| -
|
| -// Distance between two permission labels.
|
| -const CGFloat kVerticalPermissionPadding = 2.0f;
|
| -
|
| -const CGFloat kHorizontalPadding = 13.0f;
|
| -const CGFloat kVerticalPadding = 15.0f;
|
| -const CGFloat kBetweenButtonsPadding = 10.0f;
|
| -const CGFloat kButtonRightEdgePadding = 17.0f;
|
| -const CGFloat kTitlePaddingX = 50.0f;
|
| -const CGFloat kBubbleMinWidth = 315.0f;
|
| -const NSSize kPermissionIconSize = {18, 18};
|
| -
|
| -const NSInteger kFullscreenLeftOffset = 40;
|
| -
|
| -} // namespace
|
| -
|
| -// NSPopUpButton with a menu containing two items: allow and block.
|
| -// One AllowBlockMenuButton is used for each requested permission when there are
|
| -// multiple permissions in the bubble.
|
| -@interface AllowBlockMenuButton : NSPopUpButton {
|
| - @private
|
| - std::unique_ptr<PermissionMenuModel> menuModel_;
|
| - base::scoped_nsobject<MenuController> menuController_;
|
| -}
|
| -
|
| -- (id)initForURL:(const GURL&)url
|
| - allowed:(BOOL)allow
|
| - index:(int)index
|
| - delegate:(PermissionPrompt::Delegate*)delegate
|
| - profile:(Profile*)profile;
|
| -
|
| -// Returns the maximum width of its possible titles.
|
| -- (CGFloat)maximumTitleWidth;
|
| -@end
|
| -
|
| -@implementation AllowBlockMenuButton
|
| -
|
| -- (id)initForURL:(const GURL&)url
|
| - allowed:(BOOL)allow
|
| - index:(int)index
|
| - delegate:(PermissionPrompt::Delegate*)delegate
|
| - profile:(Profile*)profile {
|
| - if (self = [super initWithFrame:NSZeroRect pullsDown:NO]) {
|
| - ContentSetting setting =
|
| - allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK;
|
| - [self setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
|
| - [self setBordered:NO];
|
| -
|
| - __block PermissionPrompt::Delegate* blockDelegate = delegate;
|
| - __block AllowBlockMenuButton* blockSelf = self;
|
| - PermissionMenuModel::ChangeCallback changeCallback =
|
| - base::BindBlock(^(const WebsiteSettingsUI::PermissionInfo& permission) {
|
| - blockDelegate->ToggleAccept(
|
| - index, permission.setting == CONTENT_SETTING_ALLOW);
|
| - [blockSelf setFrameSize:
|
| - SizeForWebsiteSettingsButtonTitle(blockSelf,
|
| - [blockSelf title])];
|
| - });
|
| -
|
| - menuModel_.reset(
|
| - new PermissionMenuModel(profile, url, setting, changeCallback));
|
| - menuController_.reset([[MenuController alloc] initWithModel:menuModel_.get()
|
| - useWithPopUpButtonCell:NO]);
|
| - [self setMenu:[menuController_ menu]];
|
| - [self selectItemAtIndex:menuModel_->GetIndexOfCommandId(setting)];
|
| - // Although the frame is reset, below, this sizes the cell properly.
|
| - [self sizeToFit];
|
| - // Adjust the size to fit the current title. Using only -sizeToFit leaves
|
| - // an ugly amount of whitespace between the title and the arrows because it
|
| - // will fit to the largest element in the menu, not just the selected item.
|
| - [self setFrameSize:SizeForWebsiteSettingsButtonTitle(self, [self title])];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (CGFloat)maximumTitleWidth {
|
| - CGFloat maxTitleWidth = 0;
|
| - for (NSMenuItem* item in [self itemArray]) {
|
| - NSSize size = SizeForWebsiteSettingsButtonTitle(self, [item title]);
|
| - maxTitleWidth = std::max(maxTitleWidth, size.width);
|
| - }
|
| - return maxTitleWidth;
|
| -}
|
| -
|
| -@end
|
| -
|
| -@interface PermissionBubbleController ()
|
| -
|
| -// Determines if the bubble has an anchor in a corner or no anchor at all.
|
| -- (info_bubble::BubbleArrowLocation)getExpectedArrowLocation;
|
| -
|
| -// Returns the expected parent for this bubble.
|
| -- (NSWindow*)getExpectedParentWindow;
|
| -
|
| -// Returns an autoreleased NSView displaying the icon and label for |request|.
|
| -- (NSView*)labelForRequest:(PermissionRequest*)request;
|
| -
|
| -// Returns an autoreleased NSView displaying the title for the bubble
|
| -// requesting settings for |host|.
|
| -- (NSView*)titleWithOrigin:(const GURL&)origin;
|
| -
|
| -// Returns an autoreleased NSView displaying a menu for |request|. The
|
| -// menu will be initialized as 'allow' if |allow| is YES.
|
| -- (NSView*)menuForRequest:(PermissionRequest*)request
|
| - atIndex:(int)index
|
| - allow:(BOOL)allow;
|
| -
|
| -// Returns an autoreleased NSView of a button with |title| and |action|.
|
| -- (NSView*)buttonWithTitle:(NSString*)title
|
| - action:(SEL)action;
|
| -
|
| -// Returns an autoreleased NSView displaying a block button.
|
| -- (NSView*)blockButton;
|
| -
|
| -// Returns an autoreleased NSView displaying the close 'x' button.
|
| -- (NSView*)closeButton;
|
| -
|
| -// Called when the 'ok' button is pressed.
|
| -- (void)ok:(id)sender;
|
| -
|
| -// Called when the 'allow' button is pressed.
|
| -- (void)onAllow:(id)sender;
|
| -
|
| -// Called when the 'block' button is pressed.
|
| -- (void)onBlock:(id)sender;
|
| -
|
| -// Called when the 'close' button is pressed.
|
| -- (void)onClose:(id)sender;
|
| -
|
| -// Returns the constant offset from the left to use for fullscreen permission
|
| -// bubbles. Only used in tests.
|
| -+ (NSInteger)getFullscreenLeftOffset;
|
| -
|
| -// Sets the width of both |viewA| and |viewB| to be the larger of the
|
| -// two views' widths. Does not change either view's origin or height.
|
| -+ (CGFloat)matchWidthsOf:(NSView*)viewA andOf:(NSView*)viewB;
|
| -
|
| -// Sets the offset of |viewA| so that its vertical center is aligned with the
|
| -// vertical center of |viewB|.
|
| -+ (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB;
|
| -
|
| -// BaseBubbleController override.
|
| -- (IBAction)cancel:(id)sender;
|
| -
|
| -@end
|
| -
|
| -@implementation PermissionBubbleController
|
| -
|
| -- (id)initWithBrowser:(Browser*)browser bridge:(PermissionBubbleCocoa*)bridge {
|
| - DCHECK(browser);
|
| - DCHECK(bridge);
|
| - browser_ = browser;
|
| - base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc]
|
| - initWithContentRect:ui::kWindowSizeDeterminedLater
|
| - styleMask:NSBorderlessWindowMask
|
| - backing:NSBackingStoreBuffered
|
| - defer:NO]);
|
| -
|
| - [window setAllowedAnimations:info_bubble::kAnimateNone];
|
| - [window setReleasedWhenClosed:NO];
|
| - if ((self = [super initWithWindow:window
|
| - parentWindow:[self getExpectedParentWindow]
|
| - anchoredAt:NSZeroPoint])) {
|
| - [self setShouldCloseOnResignKey:NO];
|
| - [self setShouldOpenAsKeyWindow:YES];
|
| - [[self bubble] setArrowLocation:[self getExpectedArrowLocation]];
|
| - bridge_ = bridge;
|
| - NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
|
| - [center addObserver:self
|
| - selector:@selector(parentWindowDidMove:)
|
| - name:NSWindowDidMoveNotification
|
| - object:[self getExpectedParentWindow]];
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (LocationBarDecoration*)decorationForBubble {
|
| - if (![self hasVisibleLocationBar])
|
| - return nullptr;
|
| -
|
| - LocationBarViewMac* location_bar =
|
| - [[self.parentWindow windowController] locationBarBridge];
|
| - return location_bar->GetPageInfoDecoration();
|
| -}
|
| -
|
| -+ (NSPoint)getAnchorPointForBrowser:(Browser*)browser {
|
| - NSPoint anchor;
|
| - NSWindow* parentWindow = browser->window()->GetNativeWindow();
|
| - if ([PermissionBubbleController hasVisibleLocationBarForBrowser:browser]) {
|
| - LocationBarViewMac* location_bar =
|
| - [[parentWindow windowController] locationBarBridge];
|
| - anchor = location_bar->GetPageInfoBubblePoint();
|
| - } else {
|
| - // Position the bubble on the left of the screen if there is no page info
|
| - // button to point at.
|
| - NSRect contentFrame = [[parentWindow contentView] frame];
|
| - anchor = NSMakePoint(NSMinX(contentFrame) + kFullscreenLeftOffset,
|
| - NSMaxY(contentFrame));
|
| - }
|
| -
|
| - return ui::ConvertPointFromWindowToScreen(parentWindow, anchor);
|
| -}
|
| -
|
| -+ (bool)hasVisibleLocationBarForBrowser:(Browser*)browser {
|
| - if (!browser->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR))
|
| - return false;
|
| -
|
| - if (!browser->exclusive_access_manager()->context()->IsFullscreen())
|
| - return true;
|
| -
|
| - // If the browser is in browser-initiated full screen, a preference can cause
|
| - // the toolbar to be hidden.
|
| - if (browser->exclusive_access_manager()
|
| - ->fullscreen_controller()
|
| - ->IsFullscreenForBrowser()) {
|
| - PrefService* prefs = browser->profile()->GetPrefs();
|
| - bool show_toolbar = prefs->GetBoolean(prefs::kShowFullscreenToolbar);
|
| - return show_toolbar;
|
| - }
|
| -
|
| - // Otherwise this is fullscreen without a toolbar, so there is no visible
|
| - // location bar.
|
| - return false;
|
| -}
|
| -
|
| -- (void)windowWillClose:(NSNotification*)notification {
|
| - [[NSNotificationCenter defaultCenter]
|
| - removeObserver:self
|
| - name:NSWindowDidMoveNotification
|
| - object:nil];
|
| - bridge_->OnBubbleClosing();
|
| - [super windowWillClose:notification];
|
| -}
|
| -
|
| -- (void)parentWindowWillToggleFullScreen:(NSNotification*)notification {
|
| - // Override the base class implementation, which would have closed the bubble.
|
| -}
|
| -
|
| -- (void)parentWindowDidResize:(NSNotification*)notification {
|
| - // Override the base class implementation, which sets the anchor point. But
|
| - // it's not necessary since BrowserWindowController will notify the
|
| - // PermissionRequestManager to update the anchor position on a resize.
|
| -}
|
| -
|
| -- (void)parentWindowDidMove:(NSNotification*)notification {
|
| - DCHECK(bridge_);
|
| - [self setAnchorPoint:[self getExpectedAnchorPoint]];
|
| -}
|
| -
|
| -- (void)showWithDelegate:(PermissionPrompt::Delegate*)delegate
|
| - forRequests:(const std::vector<PermissionRequest*>&)requests
|
| - acceptStates:(const std::vector<bool>&)acceptStates {
|
| - DCHECK(!requests.empty());
|
| - DCHECK(delegate);
|
| - delegate_ = delegate;
|
| -
|
| - NSView* contentView = [[self window] contentView];
|
| - [contentView setSubviews:@[]];
|
| -
|
| - BOOL singlePermission = requests.size() == 1;
|
| -
|
| - // Create one button to use as a guide for the permissions' y-offsets.
|
| - base::scoped_nsobject<NSView> allowOrOkButton;
|
| - if (singlePermission) {
|
| - NSString* allowTitle = l10n_util::GetNSString(IDS_PERMISSION_ALLOW);
|
| - allowOrOkButton.reset([[self buttonWithTitle:allowTitle
|
| - action:@selector(onAllow:)] retain]);
|
| - } else {
|
| - NSString* okTitle = l10n_util::GetNSString(IDS_OK);
|
| - allowOrOkButton.reset([[self buttonWithTitle:okTitle
|
| - action:@selector(ok:)] retain]);
|
| - }
|
| - CGFloat yOffset = 2 * kVerticalPadding + NSMaxY([allowOrOkButton frame]);
|
| -
|
| - base::scoped_nsobject<NSMutableArray> permissionMenus;
|
| - if (!singlePermission)
|
| - permissionMenus.reset([[NSMutableArray alloc] init]);
|
| -
|
| - CGFloat maxPermissionLineWidth = 0;
|
| - CGFloat verticalPadding = 0.0f;
|
| - for (auto it = requests.begin(); it != requests.end(); it++) {
|
| - base::scoped_nsobject<NSView> permissionView(
|
| - [[self labelForRequest:(*it)] retain]);
|
| - NSPoint origin = [permissionView frame].origin;
|
| - origin.x += kHorizontalPadding;
|
| - origin.y += yOffset + verticalPadding;
|
| - [permissionView setFrameOrigin:origin];
|
| - [contentView addSubview:permissionView];
|
| -
|
| - if (!singlePermission) {
|
| - int index = it - requests.begin();
|
| - base::scoped_nsobject<NSView> menu(
|
| - [[self menuForRequest:(*it)
|
| - atIndex:index
|
| - allow:acceptStates[index] ? YES : NO] retain]);
|
| - // Align vertically. Horizontal alignment will be adjusted once the
|
| - // widest permission is know.
|
| - [PermissionBubbleController alignCenterOf:menu
|
| - verticallyToCenterOf:permissionView];
|
| - [permissionMenus addObject:menu];
|
| - [contentView addSubview:menu];
|
| - }
|
| - maxPermissionLineWidth = std::max(
|
| - maxPermissionLineWidth, NSMaxX([permissionView frame]));
|
| - yOffset += NSHeight([permissionView frame]);
|
| -
|
| - // Add extra padding for all but first permission.
|
| - verticalPadding = kVerticalPermissionPadding;
|
| - }
|
| -
|
| - base::scoped_nsobject<NSView> titleView(
|
| - [[self titleWithOrigin:requests[0]->GetOrigin()] retain]);
|
| - [contentView addSubview:titleView];
|
| - [titleView setFrameOrigin:NSMakePoint(kHorizontalPadding,
|
| - kVerticalPadding + yOffset)];
|
| -
|
| - // 'x' button in the upper-right-hand corner.
|
| - base::scoped_nsobject<NSView> closeButton([[self closeButton] retain]);
|
| -
|
| - // Determine the dimensions of the bubble.
|
| - // Once the height and width are set, the buttons and permission menus can
|
| - // be laid out correctly.
|
| - NSRect bubbleFrame = NSMakeRect(0, 0, kBubbleMinWidth, 0);
|
| -
|
| - // Fix the height of the bubble relative to the title.
|
| - bubbleFrame.size.height = NSMaxY([titleView frame]) + kVerticalPadding +
|
| - info_bubble::kBubbleArrowHeight;
|
| -
|
| - if (!singlePermission) {
|
| - // Add the maximum menu width to the bubble width.
|
| - CGFloat maxMenuWidth = 0;
|
| - for (AllowBlockMenuButton* button in permissionMenus.get()) {
|
| - maxMenuWidth = std::max(maxMenuWidth, [button maximumTitleWidth]);
|
| - }
|
| - maxPermissionLineWidth += maxMenuWidth;
|
| - }
|
| -
|
| - // The title and 'x' button row must fit within the bubble.
|
| - CGFloat titleRowWidth = NSMaxX([titleView frame]) +
|
| - NSWidth([closeButton frame]) +
|
| - chrome_style::kCloseButtonPadding;
|
| -
|
| - bubbleFrame.size.width = std::max(
|
| - NSWidth(bubbleFrame), std::max(titleRowWidth, maxPermissionLineWidth));
|
| -
|
| - // Now that the bubble's dimensions have been set, lay out the buttons and
|
| - // menus.
|
| -
|
| - // Place the close button at the upper-right-hand corner of the bubble.
|
| - NSPoint closeButtonOrigin =
|
| - NSMakePoint(NSWidth(bubbleFrame) - NSWidth([closeButton frame]) -
|
| - chrome_style::kCloseButtonPadding,
|
| - NSHeight(bubbleFrame) - NSWidth([closeButton frame]) -
|
| - chrome_style::kCloseButtonPadding);
|
| - // Account for the bubble's arrow.
|
| - closeButtonOrigin.y -= info_bubble::kBubbleArrowHeight;
|
| -
|
| - [closeButton setFrameOrigin:closeButtonOrigin];
|
| - [contentView addSubview:closeButton];
|
| -
|
| - // Position the allow/ok button.
|
| - CGFloat xOrigin = NSWidth(bubbleFrame) - NSWidth([allowOrOkButton frame]) -
|
| - kButtonRightEdgePadding;
|
| - [allowOrOkButton setFrameOrigin:NSMakePoint(xOrigin, kVerticalPadding)];
|
| - [contentView addSubview:allowOrOkButton];
|
| -
|
| - if (singlePermission) {
|
| - base::scoped_nsobject<NSView> blockButton;
|
| - blockButton.reset([[self blockButton] retain]);
|
| - CGFloat width = [PermissionBubbleController matchWidthsOf:blockButton
|
| - andOf:allowOrOkButton];
|
| - // Ensure the allow/ok button is still in the correct position.
|
| - xOrigin = NSWidth(bubbleFrame) - width - kHorizontalPadding;
|
| - [allowOrOkButton setFrameOrigin:NSMakePoint(xOrigin, kVerticalPadding)];
|
| - // Line up the block button.
|
| - xOrigin = NSMinX([allowOrOkButton frame]) - width - kBetweenButtonsPadding;
|
| - [blockButton setFrameOrigin:NSMakePoint(xOrigin, kVerticalPadding)];
|
| - [contentView addSubview:blockButton];
|
| - } else {
|
| - // Adjust the horizontal origin for each menu so that its right edge
|
| - // lines up with the right edge of the ok button.
|
| - CGFloat rightEdge = NSMaxX([allowOrOkButton frame]);
|
| - for (NSView* view in permissionMenus.get()) {
|
| - [view setFrameOrigin:NSMakePoint(rightEdge - NSWidth([view frame]),
|
| - NSMinY([view frame]))];
|
| - }
|
| - }
|
| -
|
| - bubbleFrame = [[self window] frameRectForContentRect:bubbleFrame];
|
| - if ([[self window] isVisible]) {
|
| - // Unfortunately, calling -setFrame followed by -setFrameOrigin (called
|
| - // within -setAnchorPoint) causes flickering. Avoid the flickering by
|
| - // manually adjusting the new frame's origin so that the top left stays the
|
| - // same, and only calling -setFrame.
|
| - NSRect currentWindowFrame = [[self window] frame];
|
| - bubbleFrame.origin = currentWindowFrame.origin;
|
| - bubbleFrame.origin.y = bubbleFrame.origin.y +
|
| - currentWindowFrame.size.height - bubbleFrame.size.height;
|
| - [[self window] setFrame:bubbleFrame display:YES];
|
| - } else {
|
| - [[self window] setFrame:bubbleFrame display:NO];
|
| - [self setAnchorPoint:[self getExpectedAnchorPoint]];
|
| - [self showWindow:nil];
|
| - [[self window] makeFirstResponder:nil];
|
| - [[self window] setInitialFirstResponder:allowOrOkButton.get()];
|
| - }
|
| -}
|
| -
|
| -- (void)updateAnchorPosition {
|
| - [self setParentWindow:[self getExpectedParentWindow]];
|
| - [self setAnchorPoint:[self getExpectedAnchorPoint]];
|
| - [[self bubble] setArrowLocation:[self getExpectedArrowLocation]];
|
| -}
|
| -
|
| -- (NSPoint)getExpectedAnchorPoint {
|
| - return [PermissionBubbleController getAnchorPointForBrowser:browser_];
|
| -}
|
| -
|
| -- (bool)hasVisibleLocationBar {
|
| - return [PermissionBubbleController hasVisibleLocationBarForBrowser:browser_];
|
| -}
|
| -
|
| -- (info_bubble::BubbleArrowLocation)getExpectedArrowLocation {
|
| - return info_bubble::kTopLeading;
|
| -}
|
| -
|
| -- (NSWindow*)getExpectedParentWindow {
|
| - DCHECK(browser_->window());
|
| - return browser_->window()->GetNativeWindow();
|
| -}
|
| -
|
| -- (NSView*)labelForRequest:(PermissionRequest*)request {
|
| - DCHECK(request);
|
| - base::scoped_nsobject<NSView> permissionView(
|
| - [[NSView alloc] initWithFrame:NSZeroRect]);
|
| - base::scoped_nsobject<NSImageView> permissionIcon(
|
| - [[NSImageView alloc] initWithFrame:NSZeroRect]);
|
| - [permissionIcon
|
| - setImage:NSImageFromImageSkia(gfx::CreateVectorIcon(
|
| - request->GetIconId(), 18, gfx::kChromeIconGrey))];
|
| - [permissionIcon setFrameSize:kPermissionIconSize];
|
| - [permissionView addSubview:permissionIcon];
|
| -
|
| - base::scoped_nsobject<NSTextField> permissionLabel(
|
| - [[NSTextField alloc] initWithFrame:NSZeroRect]);
|
| - base::string16 label = request->GetMessageTextFragment();
|
| - [permissionLabel setDrawsBackground:NO];
|
| - [permissionLabel setBezeled:NO];
|
| - [permissionLabel setEditable:NO];
|
| - [permissionLabel setSelectable:NO];
|
| - [permissionLabel
|
| - setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
|
| - [permissionLabel setStringValue:base::SysUTF16ToNSString(label)];
|
| - [permissionLabel sizeToFit];
|
| - [permissionLabel setFrameOrigin:
|
| - NSMakePoint(NSWidth([permissionIcon frame]) + kHorizontalIconPadding, 0)];
|
| - [permissionView addSubview:permissionLabel];
|
| -
|
| - // Match the horizontal centers of the two subviews. Note that the label's
|
| - // center is rounded down, and the icon's center, up. It looks better that
|
| - // way - with the text's center slightly lower than the icon's center - if the
|
| - // height delta is not evenly split.
|
| - NSRect iconFrame = [permissionIcon frame];
|
| - NSRect labelFrame = [permissionLabel frame];
|
| - NSRect unionFrame = NSUnionRect(iconFrame, labelFrame);
|
| -
|
| - iconFrame.origin.y =
|
| - std::ceil((NSHeight(unionFrame) - NSHeight(iconFrame)) / 2);
|
| - labelFrame.origin.y =
|
| - std::floor((NSHeight(unionFrame) - NSHeight(labelFrame)) / 2);
|
| -
|
| - [permissionLabel setFrame:labelFrame];
|
| - [permissionIcon setFrame:iconFrame];
|
| - [permissionView setFrame:unionFrame];
|
| -
|
| - return permissionView.autorelease();
|
| -}
|
| -
|
| -- (NSView*)titleWithOrigin:(const GURL&)origin {
|
| - base::scoped_nsobject<NSTextField> titleView(
|
| - [[NSTextField alloc] initWithFrame:NSZeroRect]);
|
| - [titleView setDrawsBackground:NO];
|
| - [titleView setBezeled:NO];
|
| - [titleView setEditable:NO];
|
| - [titleView setSelectable:NO];
|
| - [titleView setStringValue:l10n_util::GetNSStringF(
|
| - IDS_PERMISSIONS_BUBBLE_PROMPT,
|
| - url_formatter::FormatUrlForSecurityDisplay(
|
| - origin, url_formatter::SchemeDisplay::
|
| - OMIT_CRYPTOGRAPHIC))];
|
| - [titleView setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
|
| - [titleView sizeToFit];
|
| - NSRect titleFrame = [titleView frame];
|
| - [titleView setFrameSize:NSMakeSize(NSWidth(titleFrame) + kTitlePaddingX,
|
| - NSHeight(titleFrame))];
|
| - return titleView.autorelease();
|
| -}
|
| -
|
| -- (NSView*)menuForRequest:(PermissionRequest*)request
|
| - atIndex:(int)index
|
| - allow:(BOOL)allow {
|
| - DCHECK(request);
|
| - DCHECK(delegate_);
|
| - base::scoped_nsobject<AllowBlockMenuButton> button(
|
| - [[AllowBlockMenuButton alloc] initForURL:request->GetOrigin()
|
| - allowed:allow
|
| - index:index
|
| - delegate:delegate_
|
| - profile:browser_->profile()]);
|
| - return button.autorelease();
|
| -}
|
| -
|
| -- (NSView*)buttonWithTitle:(NSString*)title
|
| - action:(SEL)action {
|
| - base::scoped_nsobject<NSButton> button(
|
| - [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]);
|
| - [button setButtonType:NSMomentaryPushInButton];
|
| - [button setTitle:title];
|
| - [button setTarget:self];
|
| - [button setAction:action];
|
| - [button sizeToFit];
|
| - return button.autorelease();
|
| -}
|
| -
|
| -- (NSView*)blockButton {
|
| - NSString* blockTitle = l10n_util::GetNSString(IDS_PERMISSION_DENY);
|
| - return [self buttonWithTitle:blockTitle
|
| - action:@selector(onBlock:)];
|
| -}
|
| -
|
| -- (NSView*)closeButton {
|
| - int dimension = chrome_style::GetCloseButtonSize();
|
| - NSRect frame = NSMakeRect(0, 0, dimension, dimension);
|
| - base::scoped_nsobject<NSButton> button(
|
| - [[WebUIHoverCloseButton alloc] initWithFrame:frame]);
|
| - [button setAction:@selector(onClose:)];
|
| - [button setTarget:self];
|
| - return button.autorelease();
|
| -}
|
| -
|
| -- (void)ok:(id)sender {
|
| - if (delegate_)
|
| - delegate_->Accept();
|
| -}
|
| -
|
| -- (void)onAllow:(id)sender {
|
| - if (delegate_)
|
| - delegate_->Accept();
|
| -}
|
| -
|
| -- (void)onBlock:(id)sender {
|
| - if (delegate_)
|
| - delegate_->Deny();
|
| -}
|
| -
|
| -- (void)onClose:(id)sender {
|
| - if (delegate_)
|
| - delegate_->Closing();
|
| -}
|
| -
|
| -+ (NSInteger)getFullscreenLeftOffset {
|
| - return kFullscreenLeftOffset;
|
| -}
|
| -
|
| -- (void)activateTabWithContents:(content::WebContents*)newContents
|
| - previousContents:(content::WebContents*)oldContents
|
| - atIndex:(NSInteger)index
|
| - reason:(int)reason {
|
| - // The show/hide of this bubble is handled by the PermissionRequestManager.
|
| - // So bypass the base class, which would close the bubble here.
|
| -}
|
| -
|
| -+ (CGFloat)matchWidthsOf:(NSView*)viewA andOf:(NSView*)viewB {
|
| - NSRect frameA = [viewA frame];
|
| - NSRect frameB = [viewB frame];
|
| - CGFloat width = std::max(NSWidth(frameA), NSWidth(frameB));
|
| - [viewA setFrameSize:NSMakeSize(width, NSHeight(frameA))];
|
| - [viewB setFrameSize:NSMakeSize(width, NSHeight(frameB))];
|
| - return width;
|
| -}
|
| -
|
| -+ (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB {
|
| - NSRect frameA = [viewA frame];
|
| - NSRect frameB = [viewB frame];
|
| - frameA.origin.y =
|
| - NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2);
|
| - [viewA setFrameOrigin:frameA.origin];
|
| -}
|
| -
|
| -- (IBAction)cancel:(id)sender {
|
| - // This is triggered by ESC when the bubble has focus.
|
| - if (delegate_)
|
| - delegate_->Closing();
|
| - [super cancel:sender];
|
| -}
|
| -
|
| -@end // implementation PermissionBubbleController
|
|
|