| 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
|
| index 65c00a71c5ef99c003814153880cd027517cba86..601ed2e19de95c6c24573a232135a3e7095bf731 100644
|
| --- a/chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm
|
| +++ b/chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm
|
| @@ -11,6 +11,7 @@
|
| #include "base/strings/utf_string_conversions.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/chrome_style.h"
|
| #import "chrome/browser/ui/cocoa/browser_window_controller.h"
|
| #import "chrome/browser/ui/cocoa/browser_window_utils.h"
|
| @@ -18,12 +19,13 @@
|
| #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/website_settings/permission_bubble_cocoa.h"
|
| #include "chrome/browser/ui/cocoa/website_settings/permission_selector_button.h"
|
| #include "chrome/browser/ui/cocoa/website_settings/split_block_button.h"
|
| #include "chrome/browser/ui/cocoa/website_settings/website_settings_utils_cocoa.h"
|
| +#include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
|
| #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
|
| -#include "chrome/browser/ui/website_settings/permission_bubble_view.h"
|
| #include "chrome/browser/ui/website_settings/permission_menu_model.h"
|
| #include "chrome/grit/generated_resources.h"
|
| #include "content/public/browser/native_web_keyboard_event.h"
|
| @@ -82,7 +84,7 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
| - (id)initForURL:(const GURL&)url
|
| allowed:(BOOL)allow
|
| index:(int)index
|
| - delegate:(PermissionBubbleView::Delegate*)delegate;
|
| + manager:(PermissionBubbleManager*)manager;
|
|
|
| // Returns the maximum width of its possible titles.
|
| - (CGFloat)maximumTitleWidth;
|
| @@ -93,22 +95,21 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
| - (id)initForURL:(const GURL&)url
|
| allowed:(BOOL)allow
|
| index:(int)index
|
| - delegate:(PermissionBubbleView::Delegate*)delegate {
|
| + manager:(PermissionBubbleManager*)manager {
|
| 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 PermissionBubbleView::Delegate* blockDelegate = delegate;
|
| + __block PermissionBubbleManager* blockManager = manager;
|
| __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])];
|
| + blockManager->ToggleAccept(
|
| + index, permission.setting == CONTENT_SETTING_ALLOW);
|
| + [blockSelf setFrameSize:SizeForWebsiteSettingsButtonTitle(
|
| + blockSelf, [blockSelf title])];
|
| });
|
|
|
| menuModel_.reset(new PermissionMenuModel(url, setting, changeCallback));
|
| @@ -217,10 +218,10 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
|
|
| @implementation PermissionBubbleController
|
|
|
| -- (id)initWithParentWindow:(NSWindow*)parentWindow
|
| - bridge:(PermissionBubbleCocoa*)bridge {
|
| - DCHECK(parentWindow);
|
| +- (id)initWithBrowser:(Browser*)browser bridge:(PermissionBubbleCocoa*)bridge {
|
| + DCHECK(browser);
|
| DCHECK(bridge);
|
| + browser_ = browser;
|
| base::scoped_nsobject<PermissionBubbleWindow> window(
|
| [[PermissionBubbleWindow alloc]
|
| initWithContentRect:ui::kWindowSizeDeterminedLater
|
| @@ -230,17 +231,17 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
| [window setAllowedAnimations:info_bubble::kAnimateNone];
|
| [window setReleasedWhenClosed:NO];
|
| if ((self = [super initWithWindow:window
|
| - parentWindow:parentWindow
|
| + parentWindow:[self getExpectedParentWindow]
|
| anchoredAt:NSZeroPoint])) {
|
| [self setShouldCloseOnResignKey:NO];
|
| [self setShouldOpenAsKeyWindow:YES];
|
| - [[self bubble] setArrowLocation:bridge->GetArrowLocation()];
|
| + [[self bubble] setArrowLocation:[self getExpectedArrowLocation]];
|
| bridge_ = bridge;
|
| NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
|
| [center addObserver:self
|
| selector:@selector(parentWindowDidMove:)
|
| name:NSWindowDidMoveNotification
|
| - object:parentWindow];
|
| + object:[self getExpectedParentWindow]];
|
| }
|
| return self;
|
| }
|
| @@ -256,21 +257,20 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
|
|
| - (void)parentWindowDidResize:(NSNotification*)notification {
|
| DCHECK(bridge_);
|
| - [self setAnchorPoint:bridge_->GetAnchorPoint()];
|
| + [self setAnchorPoint:[self getExpectedAnchorPoint]];
|
| }
|
|
|
| - (void)parentWindowDidMove:(NSNotification*)notification {
|
| DCHECK(bridge_);
|
| - [self setAnchorPoint:bridge_->GetAnchorPoint()];
|
| + [self setAnchorPoint:[self getExpectedAnchorPoint]];
|
| }
|
|
|
| -- (void)showAtAnchor:(NSPoint)anchorPoint
|
| - withDelegate:(PermissionBubbleView::Delegate*)delegate
|
| - forRequests:(const std::vector<PermissionBubbleRequest*>&)requests
|
| - acceptStates:(const std::vector<bool>&)acceptStates {
|
| +- (void)showWithManager:(PermissionBubbleManager*)manager
|
| + forRequests:(const std::vector<PermissionBubbleRequest*>&)requests
|
| + acceptStates:(const std::vector<bool>&)acceptStates {
|
| DCHECK(!requests.empty());
|
| - DCHECK(delegate);
|
| - delegate_ = delegate;
|
| + DCHECK(manager);
|
| + manager_ = manager;
|
|
|
| NSView* contentView = [[self window] contentView];
|
| [contentView setSubviews:@[]];
|
| @@ -418,13 +418,46 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
| [[self window] setFrame:bubbleFrame display:YES];
|
| } else {
|
| [[self window] setFrame:bubbleFrame display:NO];
|
| - [self setAnchorPoint:anchorPoint];
|
| + [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]];
|
| +}
|
| +
|
| +- (NSPoint)getExpectedAnchorPoint {
|
| + NSPoint anchor;
|
| + if ([self hasLocationBar]) {
|
| + LocationBarViewMac* location_bar =
|
| + [[[self getExpectedParentWindow] windowController] locationBarBridge];
|
| + anchor = location_bar->GetPageInfoBubblePoint();
|
| + } else {
|
| + // Center the bubble if there's no location bar.
|
| + NSView* content_view = [[self getExpectedParentWindow] contentView];
|
| + anchor.y = NSMaxY(content_view.frame);
|
| + anchor.x = NSMidX(content_view.frame);
|
| + }
|
| +
|
| + return [[self getExpectedParentWindow] convertBaseToScreen:anchor];
|
| +}
|
| +
|
| +- (BOOL)hasLocationBar {
|
| + return browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR);
|
| +}
|
| +
|
| +- (info_bubble::BubbleArrowLocation)getExpectedArrowLocation {
|
| + return [self hasLocationBar] ? info_bubble::kTopLeft : info_bubble::kNoArrow;
|
| +}
|
| +
|
| +- (NSWindow*)getExpectedParentWindow {
|
| + return browser_->window()->GetNativeWindow();
|
| +}
|
| +
|
| - (NSView*)labelForRequest:(PermissionBubbleRequest*)request {
|
| DCHECK(request);
|
| base::scoped_nsobject<NSView> permissionView(
|
| @@ -493,12 +526,12 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
| atIndex:(int)index
|
| allow:(BOOL)allow {
|
| DCHECK(request);
|
| - DCHECK(delegate_);
|
| + DCHECK(manager_);
|
| base::scoped_nsobject<AllowBlockMenuButton> button(
|
| [[AllowBlockMenuButton alloc] initForURL:request->GetRequestingHostname()
|
| allowed:allow
|
| index:index
|
| - delegate:delegate_]);
|
| + manager:manager_]);
|
| return button.autorelease();
|
| }
|
|
|
| @@ -531,23 +564,23 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
|
| }
|
|
|
| - (void)ok:(id)sender {
|
| - DCHECK(delegate_);
|
| - delegate_->Accept();
|
| + DCHECK(manager_);
|
| + manager_->Accept();
|
| }
|
|
|
| - (void)onAllow:(id)sender {
|
| - DCHECK(delegate_);
|
| - delegate_->Accept();
|
| + DCHECK(manager_);
|
| + manager_->Accept();
|
| }
|
|
|
| - (void)onBlock:(id)sender {
|
| - DCHECK(delegate_);
|
| - delegate_->Deny();
|
| + DCHECK(manager_);
|
| + manager_->Deny();
|
| }
|
|
|
| - (void)onClose:(id)sender {
|
| - DCHECK(delegate_);
|
| - delegate_->Closing();
|
| + DCHECK(manager_);
|
| + manager_->Closing();
|
| }
|
|
|
| - (void)activateTabWithContents:(content::WebContents*)newContents
|
|
|