Index: chrome/browser/ui/cocoa/page_info/website_settings_bubble_controller.mm |
diff --git a/chrome/browser/ui/cocoa/page_info/website_settings_bubble_controller.mm b/chrome/browser/ui/cocoa/page_info/website_settings_bubble_controller.mm |
deleted file mode 100644 |
index d16b1e47574bd36123817ea93160cbfa9e28c06c..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/page_info/website_settings_bubble_controller.mm |
+++ /dev/null |
@@ -1,1214 +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/page_info/website_settings_bubble_controller.h" |
- |
-#import <AppKit/AppKit.h> |
- |
-#include <cmath> |
- |
-#include "base/i18n/rtl.h" |
-#include "base/mac/bind_objc_block.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/strings/sys_string_conversions.h" |
-#import "chrome/browser/certificate_viewer.h" |
-#include "chrome/browser/infobars/infobar_service.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/browser_dialogs.h" |
-#import "chrome/browser/ui/cocoa/browser_window_controller.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" |
-#import "chrome/browser/ui/cocoa/page_info/permission_selector_button.h" |
-#include "chrome/browser/ui/page_info/permission_menu_model.h" |
-#import "chrome/browser/ui/tab_dialogs.h" |
-#include "chrome/common/url_constants.h" |
-#include "chrome/grit/chromium_strings.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "chrome/grit/theme_resources.h" |
-#include "components/strings/grit/components_chromium_strings.h" |
-#include "components/strings/grit/components_strings.h" |
-#include "content/public/browser/page_navigator.h" |
-#include "content/public/browser/ssl_host_state_delegate.h" |
-#include "content/public/browser/user_metrics.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/common/url_constants.h" |
-#include "extensions/common/constants.h" |
-#include "skia/ext/skia_utils_mac.h" |
-#import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTweaker.h" |
-#import "ui/base/cocoa/a11y_util.h" |
-#include "ui/base/cocoa/cocoa_base_utils.h" |
-#import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
-#import "ui/base/cocoa/flipped_view.h" |
-#import "ui/base/cocoa/hover_image_button.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/material_design/material_design_controller.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#import "ui/gfx/mac/coordinate_conversion.h" |
-#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
-#include "ui/resources/grit/ui_resources.h" |
- |
-using ChosenObjectInfoPtr = |
- std::unique_ptr<WebsiteSettingsUI::ChosenObjectInfo>; |
-using ChosenObjectDeleteCallback = |
- base::Callback<void(const WebsiteSettingsUI::ChosenObjectInfo&)>; |
- |
-namespace { |
- |
-// General --------------------------------------------------------------------- |
- |
-// The default width of the window, in view coordinates. It may be larger to |
-// fit the content. |
-const CGFloat kDefaultWindowWidth = 320; |
- |
-// Padding around each section |
-const CGFloat kSectionVerticalPadding = 20; |
-const CGFloat kSectionHorizontalPadding = 16; |
- |
-// Links are buttons with invisible padding, so we need to move them back to |
-// align with other text. |
-const CGFloat kLinkButtonXAdjustment = 1; |
- |
-// Built-in margin for NSButton to take into account. |
-const CGFloat kNSButtonBuiltinMargin = 4; |
- |
-// Security Section ------------------------------------------------------------ |
- |
-// Spacing between security summary, security details, and cert decisions text. |
-const CGFloat kSecurityParagraphSpacing = 12; |
- |
-// Site Settings Section ------------------------------------------------------- |
- |
-// Square size of the permission images. |
-const CGFloat kPermissionImageSize = 16; |
- |
-// Spacing between a permission image and the text. |
-const CGFloat kPermissionImageSpacing = 6; |
- |
-// Minimum distance between the label and its corresponding menu. |
-const CGFloat kMinSeparationBetweenLabelAndMenu = 16; |
- |
-// Square size of the permission delete button image. |
-const CGFloat kPermissionDeleteImageSize = 16; |
- |
-// The spacing between individual permissions. |
-const CGFloat kPermissionsVerticalSpacing = 16; |
- |
-// Amount to lower each permission icon to align the icon baseline with the |
-// label text. |
-const CGFloat kPermissionIconYAdjustment = 1; |
- |
-// Amount to lower each permission popup button to make its text align with the |
-// permission label. |
-const CGFloat kPermissionPopupButtonYAdjustment = 3; |
- |
-// Internal Page Bubble -------------------------------------------------------- |
- |
-// Padding between the window frame and content for the internal page bubble. |
-const CGFloat kInternalPageFramePadding = 10; |
- |
-// Spacing between the image and text for internal pages. |
-const CGFloat kInternalPageImageSpacing = 10; |
- |
-// ----------------------------------------------------------------------------- |
- |
-// NOTE: This assumes that there will never be more than one website settings |
-// popup shown, and that the one that is shown is associated with the current |
-// window. This matches the behaviour in views: see WebsiteSettingsPopupView. |
-bool g_is_popup_showing = false; |
- |
-// Takes in the parent window, which should be a BrowserWindow, and gets the |
-// proper anchor point for the bubble. The returned point is in screen |
-// coordinates. |
-NSPoint AnchorPointForWindow(NSWindow* parent) { |
- BrowserWindowController* controller = [parent windowController]; |
- NSPoint origin = NSZeroPoint; |
- if ([controller isKindOfClass:[BrowserWindowController class]]) { |
- LocationBarViewMac* location_bar = [controller locationBarBridge]; |
- if (location_bar) { |
- NSPoint bubble_point = location_bar->GetPageInfoBubblePoint(); |
- origin = ui::ConvertPointFromWindowToScreen(parent, bubble_point); |
- } |
- } |
- return origin; |
-} |
- |
-} // namespace |
- |
-@interface ChosenObjectDeleteButton : HoverImageButton { |
- @private |
- ChosenObjectInfoPtr objectInfo_; |
- ChosenObjectDeleteCallback callback_; |
-} |
- |
-// Designated initializer. Takes ownership of |objectInfo|. |
-- (instancetype)initWithChosenObject:(ChosenObjectInfoPtr)objectInfo |
- atPoint:(NSPoint)point |
- withCallback:(ChosenObjectDeleteCallback)callback; |
- |
-// Action when the button is clicked. |
-- (void)deleteClicked:(id)sender; |
- |
-@end |
- |
-@implementation ChosenObjectDeleteButton |
- |
-- (instancetype)initWithChosenObject:(ChosenObjectInfoPtr)objectInfo |
- atPoint:(NSPoint)point |
- withCallback:(ChosenObjectDeleteCallback)callback { |
- NSRect frame = NSMakeRect(point.x, point.y, kPermissionDeleteImageSize, |
- kPermissionDeleteImageSize); |
- if (self = [super initWithFrame:frame]) { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- [self setDefaultImage:rb.GetNativeImageNamed(IDR_CLOSE_2).ToNSImage()]; |
- [self setHoverImage:rb.GetNativeImageNamed(IDR_CLOSE_2_H).ToNSImage()]; |
- [self setPressedImage:rb.GetNativeImageNamed(IDR_CLOSE_2_P).ToNSImage()]; |
- [self setBordered:NO]; |
- [self setToolTip:l10n_util::GetNSString( |
- objectInfo->ui_info.delete_tooltip_string_id)]; |
- [self setTarget:self]; |
- [self setAction:@selector(deleteClicked:)]; |
- objectInfo_ = std::move(objectInfo); |
- callback_ = callback; |
- } |
- return self; |
-} |
- |
-- (void)deleteClicked:(id)sender { |
- callback_.Run(*objectInfo_); |
-} |
- |
-@end |
- |
-@implementation WebsiteSettingsBubbleController |
- |
-- (CGFloat)defaultWindowWidth { |
- return kDefaultWindowWidth; |
-} |
- |
-bool IsInternalURL(const GURL& url) { |
- return url.SchemeIs(content::kChromeUIScheme) || |
- url.SchemeIs(content::kChromeDevToolsScheme) || |
- url.SchemeIs(extensions::kExtensionScheme) || |
- url.SchemeIs(content::kViewSourceScheme); |
-} |
- |
-- (id)initWithParentWindow:(NSWindow*)parentWindow |
- websiteSettingsUIBridge:(WebsiteSettingsUIBridge*)bridge |
- webContents:(content::WebContents*)webContents |
- url:(const GURL&)url { |
- DCHECK(parentWindow); |
- |
- webContents_ = webContents; |
- permissionsPresent_ = NO; |
- url_ = url; |
- |
- // Use an arbitrary height; it will be changed in performLayout. |
- NSRect contentRect = NSMakeRect(0, 0, [self defaultWindowWidth], 1); |
- // Create an empty window into which content is placed. |
- base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] |
- initWithContentRect:contentRect |
- styleMask:NSBorderlessWindowMask |
- backing:NSBackingStoreBuffered |
- defer:NO]); |
- |
- if ((self = [super initWithWindow:window.get() |
- parentWindow:parentWindow |
- anchoredAt:NSZeroPoint])) { |
- [[self bubble] setArrowLocation:info_bubble::kTopLeading]; |
- |
- // Create the container view that uses flipped coordinates. |
- NSRect contentFrame = NSMakeRect(0, 0, [self defaultWindowWidth], 300); |
- contentView_.reset([[FlippedView alloc] initWithFrame:contentFrame]); |
- |
- // Replace the window's content. |
- [[[self window] contentView] |
- setSubviews:[NSArray arrayWithObject:contentView_.get()]]; |
- |
- if (IsInternalURL(url_)) { |
- [self initializeContentsForInternalPage:url_]; |
- } else { |
- [self initializeContents]; |
- } |
- |
- bridge_.reset(bridge); |
- bridge_->set_bubble_controller(self); |
- } |
- return self; |
-} |
- |
-- (LocationBarDecoration*)decorationForBubble { |
- BrowserWindowController* controller = [[self parentWindow] windowController]; |
- LocationBarViewMac* location_bar = [controller locationBarBridge]; |
- return location_bar ? location_bar->GetPageInfoDecoration() : nullptr; |
-} |
- |
-- (Profile*)profile { |
- return Profile::FromBrowserContext(webContents_->GetBrowserContext()); |
-} |
- |
-- (void)windowWillClose:(NSNotification*)notification { |
- if (presenter_.get()) |
- presenter_->OnUIClosing(); |
- presenter_.reset(); |
- [super windowWillClose:notification]; |
-} |
- |
-- (void)setPresenter:(WebsiteSettings*)presenter { |
- presenter_.reset(presenter); |
-} |
- |
-// Create the subviews for the bubble for internal Chrome pages. |
-- (void)initializeContentsForInternalPage:(const GURL&)url { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- |
- int text = IDS_PAGE_INFO_INTERNAL_PAGE; |
- int icon = IDR_PRODUCT_LOGO_16; |
- if (url.SchemeIs(extensions::kExtensionScheme)) { |
- text = IDS_PAGE_INFO_EXTENSION_PAGE; |
- icon = IDR_PLUGINS_FAVICON; |
- } else if (url.SchemeIs(content::kViewSourceScheme)) { |
- text = IDS_PAGE_INFO_VIEW_SOURCE_PAGE; |
- // view-source scheme uses the same icon as chrome:// pages. |
- icon = IDR_PRODUCT_LOGO_16; |
- } else if (!url.SchemeIs(content::kChromeUIScheme) && |
- !url.SchemeIs(content::kChromeDevToolsScheme)) { |
- NOTREACHED(); |
- } |
- |
- NSPoint controlOrigin = |
- NSMakePoint(kInternalPageFramePadding, |
- kInternalPageFramePadding + info_bubble::kBubbleArrowHeight); |
- NSImage* productLogoImage = rb.GetNativeImageNamed(icon).ToNSImage(); |
- NSImageView* imageView = [self addImageWithSize:[productLogoImage size] |
- toView:contentView_ |
- atPoint:controlOrigin]; |
- [imageView setImage:productLogoImage]; |
- |
- NSRect imageFrame = [imageView frame]; |
- controlOrigin.x += NSWidth(imageFrame) + kInternalPageImageSpacing; |
- NSTextField* textField = [self addText:l10n_util::GetStringUTF16(text) |
- withSize:[NSFont smallSystemFontSize] |
- bold:NO |
- toView:contentView_ |
- atPoint:controlOrigin]; |
- // Center the image vertically with the text. Previously this code centered |
- // the text vertically while holding the image in place. That produced correct |
- // results when the image, at 26x26, was taller than (or just slightly |
- // shorter) than the text, but produced incorrect results once the icon |
- // shrank to 16x16. The icon should now always be shorter than the text. |
- // See crbug.com/572044 . |
- NSRect textFrame = [textField frame]; |
- imageFrame.origin.y += (NSHeight(textFrame) - NSHeight(imageFrame)) / 2; |
- [imageView setFrame:imageFrame]; |
- |
- // Adjust the contentView to fit everything. |
- CGFloat maxY = std::max(NSMaxY(imageFrame), NSMaxY(textFrame)); |
- [contentView_ setFrame:NSMakeRect(0, 0, [self defaultWindowWidth], |
- maxY + kInternalPageFramePadding)]; |
- |
- [self sizeAndPositionWindow]; |
-} |
- |
-// Create the subviews for the website settings bubble. |
-- (void)initializeContents { |
- securitySectionView_ = [self addSecuritySectionToView:contentView_]; |
- separatorAfterSecuritySection_ = [self addSeparatorToView:contentView_]; |
- siteSettingsSectionView_ = [self addSiteSettingsSectionToView:contentView_]; |
- |
- [self performLayout]; |
-} |
- |
-// Create and return a subview for the security section and add it to the given |
-// |superview|. |superview| retains the new view. |
-- (NSView*)addSecuritySectionToView:(NSView*)superview { |
- base::scoped_nsobject<NSView> securitySectionView( |
- [[FlippedView alloc] initWithFrame:[superview frame]]); |
- [superview addSubview:securitySectionView]; |
- |
- // Create a controlOrigin to place the text fields. The y value doesn't |
- // matter, because the correct value is calculated in -performLayout. |
- NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
- |
- // Create a text field for the security summary (private/not private/etc.). |
- securitySummaryField_ = [self addText:base::string16() |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:securitySectionView |
- atPoint:controlOrigin]; |
- |
- securityDetailsField_ = [self addText:base::string16() |
- withSize:[NSFont smallSystemFontSize] |
- bold:NO |
- toView:securitySectionView |
- atPoint:controlOrigin]; |
- |
- // These will be created only if necessary. |
- resetDecisionsField_ = nil; |
- resetDecisionsButton_ = nil; |
- |
- NSString* connectionHelpButtonText = l10n_util::GetNSString(IDS_LEARN_MORE); |
- connectionHelpButton_ = [self addLinkButtonWithText:connectionHelpButtonText |
- toView:securitySectionView]; |
- [connectionHelpButton_ setTarget:self]; |
- [connectionHelpButton_ setAction:@selector(openConnectionHelp:)]; |
- |
- return securitySectionView.get(); |
-} |
- |
-// Create and return a subview for the site settings and add it to the given |
-// |superview|. |superview| retains the new view. |
-- (NSView*)addSiteSettingsSectionToView:(NSView*)superview { |
- base::scoped_nsobject<NSView> siteSettingsSectionView( |
- [[FlippedView alloc] initWithFrame:[superview frame]]); |
- [superview addSubview:siteSettingsSectionView]; |
- |
- // Initialize the two containers that hold the controls. The initial frames |
- // are arbitrary, and will be adjusted after the controls are laid out. |
- cookiesView_ = |
- [[[FlippedView alloc] initWithFrame:[superview frame]] autorelease]; |
- [cookiesView_ setAutoresizingMask:NSViewWidthSizable]; |
- [siteSettingsSectionView addSubview:cookiesView_]; |
- |
- permissionsView_ = |
- [[[FlippedView alloc] initWithFrame:[superview frame]] autorelease]; |
- [siteSettingsSectionView addSubview:permissionsView_]; |
- |
- // Create the link button to view site settings. Its position will be set in |
- // performLayout. |
- NSString* siteSettingsButtonText = |
- l10n_util::GetNSString(IDS_PAGE_INFO_SITE_SETTINGS_LINK); |
- siteSettingsButton_ = [self addButtonWithText:siteSettingsButtonText |
- toView:siteSettingsSectionView]; |
- [GTMUILocalizerAndLayoutTweaker sizeToFitView:siteSettingsButton_]; |
- |
- [siteSettingsButton_ setTarget:self]; |
- [siteSettingsButton_ setAction:@selector(showSiteSettingsData:)]; |
- |
- return siteSettingsSectionView.get(); |
-} |
- |
-// Handler for the link button below the list of cookies. |
-- (void)showCookiesAndSiteData:(id)sender { |
- DCHECK(webContents_); |
- DCHECK(presenter_); |
- presenter_->RecordWebsiteSettingsAction( |
- WebsiteSettings::WEBSITE_SETTINGS_COOKIES_DIALOG_OPENED); |
- TabDialogs::FromWebContents(webContents_)->ShowCollectedCookies(); |
-} |
- |
-// Handler for the site settings button below the list of permissions. |
-- (void)showSiteSettingsData:(id)sender { |
- DCHECK(webContents_); |
- DCHECK(presenter_); |
- presenter_->RecordWebsiteSettingsAction( |
- WebsiteSettings::WEBSITE_SETTINGS_SITE_SETTINGS_OPENED); |
- webContents_->OpenURL(content::OpenURLParams( |
- GURL(chrome::kChromeUIContentSettingsURL), content::Referrer(), |
- WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, |
- false)); |
-} |
- |
-// TODO(lgarron): Move some of this to the presenter for separation of concerns |
-// and platform unification. (https://crbug.com/571533) |
-- (void)openConnectionHelp:(id)sender { |
- DCHECK(webContents_); |
- DCHECK(presenter_); |
- presenter_->RecordWebsiteSettingsAction( |
- WebsiteSettings::WEBSITE_SETTINGS_CONNECTION_HELP_OPENED); |
- webContents_->OpenURL(content::OpenURLParams( |
- GURL(chrome::kPageInfoHelpCenterURL), content::Referrer(), |
- WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, |
- false)); |
-} |
- |
-// Handler for the link button to show certificate information. |
-- (void)showCertificateInfo:(id)sender { |
- DCHECK(certificate_.get()); |
- DCHECK(presenter_); |
- presenter_->RecordWebsiteSettingsAction( |
- WebsiteSettings::WEBSITE_SETTINGS_CERTIFICATE_DIALOG_OPENED); |
- ShowCertificateViewer(webContents_, [self parentWindow], certificate_.get()); |
-} |
- |
-// Handler for the link button to revoke user certificate decisions. |
-- (void)resetCertificateDecisions:(id)sender { |
- DCHECK(resetDecisionsButton_); |
- presenter_->OnRevokeSSLErrorBypassButtonPressed(); |
- [self close]; |
-} |
- |
-- (CGFloat)layoutViewAtRTLStart:(NSView*)view withYPosition:(CGFloat)yPos { |
- CGFloat xPos; |
- if (base::i18n::IsRTL()) { |
- xPos = kDefaultWindowWidth - kSectionHorizontalPadding - |
- NSWidth([view frame]) + kNSButtonBuiltinMargin; |
- } else { |
- xPos = kSectionHorizontalPadding - kNSButtonBuiltinMargin; |
- } |
- [view setFrameOrigin:NSMakePoint(xPos, yPos - kNSButtonBuiltinMargin)]; |
- return yPos + NSHeight([view frame]) - kNSButtonBuiltinMargin; |
-} |
- |
-// Set the Y position of |view| to the given position, and return the position |
-// of its bottom edge. |
-- (CGFloat)setYPositionOfView:(NSView*)view to:(CGFloat)position { |
- NSRect frame = [view frame]; |
- frame.origin.y = position; |
- [view setFrame:frame]; |
- return position + NSHeight(frame); |
-} |
- |
-- (void)setWidthOfView:(NSView*)view to:(CGFloat)width { |
- [view setFrameSize:NSMakeSize(width, NSHeight([view frame]))]; |
-} |
- |
-- (void)setHeightOfView:(NSView*)view to:(CGFloat)height { |
- [view setFrameSize:NSMakeSize(NSWidth([view frame]), height)]; |
-} |
- |
-// Layout all of the controls in the window. This should be called whenever |
-// the content has changed. |
-- (void)performLayout { |
- // Make the content at least as wide as the permissions view. |
- CGFloat contentWidth = |
- std::max([self defaultWindowWidth], NSWidth([permissionsView_ frame])); |
- |
- // Set the width of the content view now, so that all the text fields will |
- // be sized to fit before their heights and vertical positions are adjusted. |
- [self setWidthOfView:contentView_ to:contentWidth]; |
- [self setWidthOfView:securitySectionView_ to:contentWidth]; |
- [self setWidthOfView:siteSettingsSectionView_ to:contentWidth]; |
- |
- CGFloat yPos = 0; |
- |
- [self layoutSecuritySection]; |
- yPos = [self setYPositionOfView:securitySectionView_ to:yPos]; |
- |
- yPos = [self setYPositionOfView:separatorAfterSecuritySection_ to:yPos]; |
- |
- [self layoutSiteSettingsSection]; |
- yPos = [self setYPositionOfView:siteSettingsSectionView_ to:yPos]; |
- |
- [contentView_ setFrame:NSMakeRect(0, 0, NSWidth([contentView_ frame]), yPos)]; |
- |
- [self sizeAndPositionWindow]; |
-} |
- |
-- (void)layoutSecuritySection { |
- // Start the layout with the first element. Margins are handled by the caller. |
- CGFloat yPos = 0; |
- |
- [self sizeTextFieldHeightToFit:securitySummaryField_]; |
- yPos = [self setYPositionOfView:securitySummaryField_ |
- to:yPos + kSectionVerticalPadding]; |
- |
- [self sizeTextFieldHeightToFit:securityDetailsField_]; |
- yPos = [self setYPositionOfView:securityDetailsField_ |
- to:yPos + kSecurityParagraphSpacing]; |
- |
- [connectionHelpButton_ setFrameOrigin:NSMakePoint(kSectionHorizontalPadding - |
- kLinkButtonXAdjustment, |
- yPos)]; |
- yPos = NSMaxY([connectionHelpButton_ frame]); |
- |
- if (resetDecisionsButton_) { |
- DCHECK(resetDecisionsField_); |
- yPos = [self setYPositionOfView:resetDecisionsField_ |
- to:yPos + kSecurityParagraphSpacing]; |
- [resetDecisionsButton_ |
- setFrameOrigin:NSMakePoint(NSMinX([resetDecisionsButton_ frame]) - |
- kLinkButtonXAdjustment, |
- yPos)]; |
- yPos = NSMaxY([resetDecisionsButton_ frame]); |
- } |
- |
- // Resize the height based on contents. |
- [self setHeightOfView:securitySectionView_ to:yPos + kSectionVerticalPadding]; |
-} |
- |
-- (void)layoutSiteSettingsSection { |
- // Start the layout with the first element. Margins are handled by the caller. |
- CGFloat yPos = 0; |
- |
- yPos = |
- [self setYPositionOfView:cookiesView_ to:yPos + kSectionVerticalPadding]; |
- |
- if (permissionsPresent_) { |
- // Put the permission info just below the link button. |
- yPos = [self setYPositionOfView:permissionsView_ to:yPos]; |
- } |
- |
- yPos = [self layoutViewAtRTLStart:siteSettingsButton_ withYPosition:yPos]; |
- |
- // Resize the height based on contents. |
- [self setHeightOfView:siteSettingsSectionView_ |
- to:yPos + kSectionVerticalPadding]; |
-} |
- |
-// Adjust the size of the window to match the size of the content, and position |
-// the bubble anchor appropriately. |
-- (void)sizeAndPositionWindow { |
- NSRect windowFrame = [contentView_ frame]; |
- windowFrame.size = |
- [[[self window] contentView] convertSize:windowFrame.size toView:nil]; |
- // Adjust the origin by the difference in height. |
- windowFrame.origin = [[self window] frame].origin; |
- windowFrame.origin.y -= |
- NSHeight(windowFrame) - NSHeight([[self window] frame]); |
- |
- // Resize the window. Only animate if the window is visible, otherwise it |
- // could be "growing" while it's opening, looking awkward. |
- [[self window] setFrame:windowFrame |
- display:YES |
- animate:[[self window] isVisible]]; |
- |
- // Adjust the anchor for the bubble. |
- [self setAnchorPoint:AnchorPointForWindow([self parentWindow])]; |
-} |
- |
-// Sets properties on the given |field| to act as the title or description |
-// labels in the bubble. |
-- (void)configureTextFieldAsLabel:(NSTextField*)textField { |
- [textField setEditable:NO]; |
- [textField setSelectable:YES]; |
- [textField setDrawsBackground:NO]; |
- [textField setBezeled:NO]; |
-} |
- |
-// Adjust the height of the given text field to match its text. |
-- (void)sizeTextFieldHeightToFit:(NSTextField*)textField { |
- NSRect frame = [textField frame]; |
- frame.size.height += |
- [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:textField]; |
- [textField setFrame:frame]; |
-} |
- |
-// Create a new text field and add it to the given array of subviews. |
-// The array will retain a reference to the object. |
-- (NSTextField*)addText:(const base::string16&)text |
- withSize:(CGFloat)fontSize |
- bold:(BOOL)bold |
- toView:(NSView*)view |
- atPoint:(NSPoint)point { |
- // Size the text to take up the full available width, with some padding. |
- // The height is arbitrary as it will be adjusted later. |
- CGFloat width = NSWidth([view frame]) - point.x - kSectionHorizontalPadding; |
- NSRect frame = NSMakeRect(point.x, point.y, width, 100); |
- base::scoped_nsobject<NSTextField> textField( |
- [[NSTextField alloc] initWithFrame:frame]); |
- [self configureTextFieldAsLabel:textField.get()]; |
- [textField setStringValue:base::SysUTF16ToNSString(text)]; |
- NSFont* font = bold ? [NSFont boldSystemFontOfSize:fontSize] |
- : [NSFont systemFontOfSize:fontSize]; |
- [textField setFont:font]; |
- [self sizeTextFieldHeightToFit:textField]; |
- [textField setAutoresizingMask:NSViewWidthSizable]; |
- [view addSubview:textField.get()]; |
- return textField.get(); |
-} |
- |
-// Add an image as a subview of the given view, placed at a pre-determined x |
-// position and the given y position. The image is not in the accessibility |
-// order, since the image is always accompanied by text in this bubble. Return |
-// the new NSImageView. |
-- (NSImageView*)addImageWithSize:(NSSize)size |
- toView:(NSView*)view |
- atPoint:(NSPoint)point { |
- NSRect frame = NSMakeRect(point.x, point.y, size.width, size.height); |
- base::scoped_nsobject<NSImageView> imageView( |
- [[NSImageView alloc] initWithFrame:frame]); |
- ui::a11y_util::HideImageFromAccessibilityOrder(imageView); |
- [imageView setImageFrameStyle:NSImageFrameNone]; |
- [view addSubview:imageView.get()]; |
- return imageView.get(); |
-} |
- |
-// Add a separator as a subview of the given view. Return the new view. |
-- (NSView*)addSeparatorToView:(NSView*)view { |
- // Use an arbitrary position; it will be adjusted in performLayout. |
- NSBox* spacer = [self |
- horizontalSeparatorWithFrame:NSMakeRect(0, 0, NSWidth([view frame]), 0)]; |
- [view addSubview:spacer]; |
- return spacer; |
-} |
- |
-// Add a link button with the given text to |view|. |
-- (NSButton*)addLinkButtonWithText:(NSString*)text toView:(NSView*)view { |
- // Frame size is arbitrary; it will be adjusted by the layout tweaker. |
- NSRect frame = NSMakeRect(kSectionHorizontalPadding, 0, 100, 10); |
- base::scoped_nsobject<NSButton> button( |
- [[NSButton alloc] initWithFrame:frame]); |
- base::scoped_nsobject<HyperlinkButtonCell> cell( |
- [[HyperlinkButtonCell alloc] initTextCell:text]); |
- [cell setControlSize:NSSmallControlSize]; |
- [button setCell:cell.get()]; |
- [button setButtonType:NSMomentaryPushInButton]; |
- [button setBezelStyle:NSRegularSquareBezelStyle]; |
- [view addSubview:button.get()]; |
- |
- [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; |
- return button.get(); |
-} |
- |
-// Create and return a button with the specified text and add it to the given |
-// |view|. |view| retains the new button. |
-- (NSButton*)addButtonWithText:(NSString*)text toView:(NSView*)view { |
- NSRect containerFrame = [view frame]; |
- // Frame size is arbitrary; it will be adjusted by the layout tweaker. |
- NSRect frame = NSMakeRect(kSectionHorizontalPadding, 0, 100, 10); |
- base::scoped_nsobject<NSButton> button( |
- [[NSButton alloc] initWithFrame:frame]); |
- |
- // Determine the largest possible size for this button. The size is the width |
- // of the connection section minus the padding on both sides minus the |
- // connection image size and spacing. |
- // TODO(lgarron): handle this sizing in -performLayout. |
- CGFloat maxTitleWidth = |
- containerFrame.size.width - kSectionHorizontalPadding * 2; |
- |
- base::scoped_nsobject<NSButtonCell> cell( |
- [[NSButtonCell alloc] initTextCell:text]); |
- [button setCell:cell.get()]; |
- [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; |
- |
- // Ensure the containing view is large enough to contain the button with its |
- // widest possible title. |
- NSRect buttonFrame = [button frame]; |
- buttonFrame.size.width = maxTitleWidth; |
- |
- [button setFrame:buttonFrame]; |
- [button setButtonType:NSMomentaryPushInButton]; |
- [button setBezelStyle:NSRegularSquareBezelStyle]; |
- [view addSubview:button.get()]; |
- |
- return button.get(); |
-} |
- |
-// Set the content of the identity and identity status fields. |
-- (void)setIdentityInfo:(const WebsiteSettingsUI::IdentityInfo&)identityInfo { |
- std::unique_ptr<WebsiteSettingsUI::SecurityDescription> security_description = |
- identityInfo.GetSecurityDescription(); |
- [securitySummaryField_ |
- setStringValue:base::SysUTF16ToNSString(security_description->summary)]; |
- |
- [securityDetailsField_ |
- setStringValue:SysUTF16ToNSString(security_description->details)]; |
- |
- certificate_ = identityInfo.certificate; |
- |
- if (certificate_ && identityInfo.show_ssl_decision_revoke_button) { |
- resetDecisionsField_ = |
- [self addText:base::string16() |
- withSize:[NSFont smallSystemFontSize] |
- bold:NO |
- toView:securitySectionView_ |
- atPoint:NSMakePoint(kSectionHorizontalPadding, 0)]; |
- [resetDecisionsField_ |
- setStringValue:l10n_util::GetNSString( |
- IDS_PAGEINFO_INVALID_CERTIFICATE_DESCRIPTION)]; |
- [self sizeTextFieldHeightToFit:resetDecisionsField_]; |
- |
- resetDecisionsButton_ = |
- [self addLinkButtonWithText: |
- l10n_util::GetNSString( |
- IDS_PAGEINFO_RESET_INVALID_CERTIFICATE_DECISIONS_BUTTON) |
- toView:securitySectionView_]; |
- [resetDecisionsButton_ setTarget:self]; |
- [resetDecisionsButton_ setAction:@selector(resetCertificateDecisions:)]; |
- } |
- |
- [self performLayout]; |
-} |
- |
-// Add a pop-up button for |permissionInfo| to the given view. |
-- (NSPopUpButton*)addPopUpButtonForPermission: |
- (const WebsiteSettingsUI::PermissionInfo&)permissionInfo |
- toView:(NSView*)view |
- atPoint:(NSPoint)point { |
- GURL url = webContents_ ? webContents_->GetURL() : GURL(); |
- __block WebsiteSettingsBubbleController* weakSelf = self; |
- PermissionMenuModel::ChangeCallback callback = |
- base::BindBlock(^(const WebsiteSettingsUI::PermissionInfo& permission) { |
- [weakSelf onPermissionChanged:permission.type to:permission.setting]; |
- }); |
- base::scoped_nsobject<PermissionSelectorButton> button( |
- [[PermissionSelectorButton alloc] initWithPermissionInfo:permissionInfo |
- forURL:url |
- withCallback:callback |
- profile:[self profile]]); |
- |
- // Determine the largest possible size for this button. |
- CGFloat maxTitleWidth = |
- [button maxTitleWidthForContentSettingsType:permissionInfo.type |
- withDefaultSetting:permissionInfo.default_setting |
- profile:[self profile]]; |
- |
- // Ensure the containing view is large enough to contain the button with its |
- // widest possible title. |
- NSRect containerFrame = [view frame]; |
- containerFrame.size.width = |
- std::max(NSWidth(containerFrame), |
- point.x + maxTitleWidth + kSectionHorizontalPadding); |
- [view setFrame:containerFrame]; |
- [view addSubview:button.get()]; |
- return button.get(); |
-} |
- |
-// Add a delete button for |objectInfo| to the given view. |
-- (NSButton*)addDeleteButtonForChosenObject:(ChosenObjectInfoPtr)objectInfo |
- toView:(NSView*)view |
- atPoint:(NSPoint)point { |
- __block WebsiteSettingsBubbleController* weakSelf = self; |
- auto callback = |
- base::BindBlock(^(const WebsiteSettingsUI::ChosenObjectInfo& objectInfo) { |
- [weakSelf onChosenObjectDeleted:objectInfo]; |
- }); |
- base::scoped_nsobject<ChosenObjectDeleteButton> button( |
- [[ChosenObjectDeleteButton alloc] |
- initWithChosenObject:std::move(objectInfo) |
- atPoint:point |
- withCallback:callback]); |
- |
- // Ensure the containing view is large enough to contain the button. |
- NSRect containerFrame = [view frame]; |
- containerFrame.size.width = |
- std::max(NSWidth(containerFrame), point.x + kPermissionDeleteImageSize + |
- kSectionHorizontalPadding); |
- [view setFrame:containerFrame]; |
- [view addSubview:button.get()]; |
- return button.get(); |
-} |
- |
-// Called when the user changes the setting of a permission. |
-- (void)onPermissionChanged:(ContentSettingsType)permissionType |
- to:(ContentSetting)newSetting { |
- if (presenter_) |
- presenter_->OnSitePermissionChanged(permissionType, newSetting); |
-} |
- |
-// Called when the user revokes permission for a previously chosen object. |
-- (void)onChosenObjectDeleted:(const WebsiteSettingsUI::ChosenObjectInfo&)info { |
- if (presenter_) |
- presenter_->OnSiteChosenObjectDeleted(info.ui_info, *info.object); |
-} |
- |
-// Adds a new row to the UI listing the permissions. Returns the NSPoint of the |
-// last UI element added (either the permission button, in LTR, or the text |
-// label, in RTL). |
-- (NSPoint)addPermission: |
- (const WebsiteSettingsUI::PermissionInfo&)permissionInfo |
- toView:(NSView*)view |
- atPoint:(NSPoint)point { |
- base::string16 labelText = |
- WebsiteSettingsUI::PermissionTypeToUIString(permissionInfo.type); |
- bool isRTL = base::i18n::IsRTL(); |
- base::scoped_nsobject<NSImage> image( |
- [WebsiteSettingsUI::GetPermissionIcon(permissionInfo) |
- .ToNSImage() retain]); |
- |
- NSPoint position; |
- NSImageView* imageView; |
- NSPopUpButton* button; |
- NSTextField* label; |
- |
- CGFloat viewWidth = NSWidth([view frame]); |
- |
- if (isRTL) { |
- point.x = NSWidth([view frame]) - kPermissionImageSize - |
- kSectionHorizontalPadding; |
- imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; |
- [imageView setImage:image]; |
- point.x -= kPermissionImageSpacing; |
- |
- label = [self addText:labelText |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:view |
- atPoint:point]; |
- [label sizeToFit]; |
- point.x -= NSWidth([label frame]); |
- [label setFrameOrigin:point]; |
- |
- position = |
- NSMakePoint(point.x, point.y + kPermissionPopupButtonYAdjustment); |
- button = [self addPopUpButtonForPermission:permissionInfo |
- toView:view |
- atPoint:position]; |
- position.x -= NSWidth([button frame]); |
- [button setFrameOrigin:position]; |
- } else { |
- imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; |
- [imageView setImage:image]; |
- point.x += kPermissionImageSize + kPermissionImageSpacing; |
- |
- label = [self addText:labelText |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:view |
- atPoint:point]; |
- [label sizeToFit]; |
- |
- position = NSMakePoint(NSMaxX([label frame]), |
- point.y + kPermissionPopupButtonYAdjustment); |
- |
- button = [self addPopUpButtonForPermission:permissionInfo |
- toView:view |
- atPoint:position]; |
- } |
- [label setToolTip:base::SysUTF16ToNSString(labelText)]; |
- |
- [view setFrameSize:NSMakeSize(viewWidth, NSHeight([view frame]))]; |
- |
- // Adjust the vertical position of the button so that its title text is |
- // aligned with the label. Assumes that the text is the same size in both. |
- // Also adjust the horizontal position to remove excess space due to the |
- // invisible bezel. |
- NSRect titleRect = [[button cell] titleRectForBounds:[button bounds]]; |
- if (isRTL) { |
- position.x = kSectionHorizontalPadding; |
- } else { |
- position.x = kDefaultWindowWidth - kSectionHorizontalPadding - |
- [button frame].size.width; |
- } |
- position.y -= titleRect.origin.y; |
- [button setFrameOrigin:position]; |
- |
- // Truncate the label if it's too wide. |
- // This is a workaround for https://crbug.com/654268 until MacViews ships. |
- NSRect labelFrame = [label frame]; |
- if (isRTL) { |
- CGFloat maxLabelWidth = NSMaxX(labelFrame) - NSMaxX([button frame]) - |
- kMinSeparationBetweenLabelAndMenu; |
- if (NSWidth(labelFrame) > maxLabelWidth) { |
- labelFrame.origin.x = NSMaxX(labelFrame) - maxLabelWidth; |
- labelFrame.size.width = maxLabelWidth; |
- [label setFrame:labelFrame]; |
- [[label cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
- } |
- } else { |
- CGFloat maxLabelWidth = NSMinX([button frame]) - NSMinX(labelFrame) - |
- kMinSeparationBetweenLabelAndMenu; |
- if (NSWidth(labelFrame) > maxLabelWidth) { |
- labelFrame.size.width = maxLabelWidth; |
- [label setFrame:labelFrame]; |
- [[label cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
- } |
- } |
- |
- // Align the icon with the text. |
- [self alignPermissionIcon:imageView withTextField:label]; |
- |
- // Permissions specified by policy or an extension cannot be changed. |
- if (permissionInfo.source == content_settings::SETTING_SOURCE_EXTENSION || |
- permissionInfo.source == content_settings::SETTING_SOURCE_POLICY) { |
- [button setEnabled:NO]; |
- } |
- |
- NSRect buttonFrame = [button frame]; |
- return NSMakePoint(NSMaxX(buttonFrame), NSMaxY(buttonFrame)); |
-} |
- |
-// Adds a new row to the UI listing the permissions. Returns the NSPoint of the |
-// last UI element added (either the permission button, in LTR, or the text |
-// label, in RTL). |
-- (NSPoint)addChosenObject:(ChosenObjectInfoPtr)objectInfo |
- toView:(NSView*)view |
- atPoint:(NSPoint)point { |
- base::string16 labelText = l10n_util::GetStringFUTF16( |
- objectInfo->ui_info.label_string_id, |
- WebsiteSettingsUI::ChosenObjectToUIString(*objectInfo)); |
- bool isRTL = base::i18n::IsRTL(); |
- base::scoped_nsobject<NSImage> image( |
- [WebsiteSettingsUI::GetChosenObjectIcon(*objectInfo, false) |
- .ToNSImage() retain]); |
- |
- NSPoint position; |
- NSImageView* imageView; |
- NSButton* button; |
- NSTextField* label; |
- |
- CGFloat viewWidth = NSWidth([view frame]); |
- |
- if (isRTL) { |
- point.x = NSWidth([view frame]) - kPermissionImageSize - |
- kPermissionImageSpacing - kSectionHorizontalPadding; |
- imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; |
- [imageView setImage:image]; |
- point.x -= kPermissionImageSpacing; |
- |
- label = [self addText:labelText |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:view |
- atPoint:point]; |
- [label sizeToFit]; |
- point.x -= NSWidth([label frame]); |
- [label setFrameOrigin:point]; |
- |
- position = NSMakePoint(point.x, point.y); |
- button = [self addDeleteButtonForChosenObject:std::move(objectInfo) |
- toView:view |
- atPoint:position]; |
- position.x -= NSWidth([button frame]); |
- [button setFrameOrigin:position]; |
- } else { |
- imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; |
- [imageView setImage:image]; |
- point.x += kPermissionImageSize + kPermissionImageSpacing; |
- |
- label = [self addText:labelText |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:view |
- atPoint:point]; |
- [label sizeToFit]; |
- |
- position = NSMakePoint(NSMaxX([label frame]), point.y); |
- button = [self addDeleteButtonForChosenObject:std::move(objectInfo) |
- toView:view |
- atPoint:position]; |
- } |
- |
- [view setFrameSize:NSMakeSize(viewWidth, NSHeight([view frame]))]; |
- |
- // Adjust the vertical position of the button so that its title text is |
- // aligned with the label. Assumes that the text is the same size in both. |
- // Also adjust the horizontal position to remove excess space due to the |
- // invisible bezel. |
- NSRect titleRect = [[button cell] titleRectForBounds:[button bounds]]; |
- position.y -= titleRect.origin.y; |
- [button setFrameOrigin:position]; |
- |
- // Align the icon with the text. |
- [self alignPermissionIcon:imageView withTextField:label]; |
- |
- NSRect buttonFrame = [button frame]; |
- return NSMakePoint(NSMaxX(buttonFrame), NSMaxY(buttonFrame)); |
-} |
- |
-// Align an image with a text field by vertically centering the image on |
-// the cap height of the first line of text. |
-- (void)alignPermissionIcon:(NSImageView*)imageView |
- withTextField:(NSTextField*)textField { |
- NSRect frame = [imageView frame]; |
- frame.origin.y += kPermissionIconYAdjustment; |
- [imageView setFrame:frame]; |
-} |
- |
-- (void)setCookieInfo:(const CookieInfoList&)cookieInfoList { |
- // A result of re-ordering of the permissions (crbug.com/444244) is |
- // that sometimes permissions may not be displayed at all, so it's |
- // incorrect to check they are set before the cookie info. |
- |
- // |cookieInfoList| should only ever have 2 items: first- and third-party |
- // cookies. |
- DCHECK_EQ(cookieInfoList.size(), 2u); |
- |
- int totalAllowed = 0; |
- for (const auto& i : cookieInfoList) { |
- totalAllowed += i.allowed; |
- } |
- base::string16 label_text = l10n_util::GetPluralStringFUTF16( |
- IDS_WEBSITE_SETTINGS_NUM_COOKIES, totalAllowed); |
- |
- base::string16 sectionTitle = |
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA); |
- bool isRTL = base::i18n::IsRTL(); |
- |
- [cookiesView_ setSubviews:[NSArray array]]; |
- NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
- |
- CGFloat viewWidth = NSWidth([cookiesView_ frame]); |
- |
- // Reset X for the cookie image. |
- if (isRTL) { |
- controlOrigin.x = viewWidth - kPermissionImageSize - |
- kPermissionImageSpacing - kSectionHorizontalPadding; |
- } |
- |
- WebsiteSettingsUI::PermissionInfo info; |
- info.type = CONTENT_SETTINGS_TYPE_COOKIES; |
- info.setting = CONTENT_SETTING_ALLOW; |
- // info.default_setting, info.source, and info.is_incognito have not been set, |
- // but GetPermissionIcon doesn't use any of those. |
- NSImage* image = WebsiteSettingsUI::GetPermissionIcon(info).ToNSImage(); |
- NSImageView* imageView = [self addImageWithSize:[image size] |
- toView:cookiesView_ |
- atPoint:controlOrigin]; |
- [imageView setImage:image]; |
- |
- NSButton* cookiesButton = |
- [self addLinkButtonWithText:base::SysUTF16ToNSString(label_text) |
- toView:cookiesView_]; |
- [cookiesButton setTarget:self]; |
- [cookiesButton setAction:@selector(showCookiesAndSiteData:)]; |
- |
- if (isRTL) { |
- controlOrigin.x -= kPermissionImageSpacing; |
- NSTextField* cookiesLabel = |
- [self addText:l10n_util::GetStringUTF16(IDS_PAGE_INFO_COOKIES) |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:cookiesView_ |
- atPoint:controlOrigin]; |
- [cookiesLabel sizeToFit]; |
- |
- NSPoint cookiesLabelOrigin = [cookiesLabel frame].origin; |
- cookiesLabelOrigin.x -= NSWidth([cookiesLabel frame]); |
- [cookiesLabel setFrameOrigin:cookiesLabelOrigin]; |
- |
- // Align the icon with the text. |
- [self alignPermissionIcon:imageView withTextField:cookiesLabel]; |
- |
- controlOrigin.y += NSHeight([cookiesLabel frame]); |
- controlOrigin.x -= NSWidth([cookiesButton frame]) - kLinkButtonXAdjustment; |
- [cookiesButton setFrameOrigin:controlOrigin]; |
- } else { |
- controlOrigin.x += kPermissionImageSize + kPermissionImageSpacing; |
- NSTextField* cookiesLabel = |
- [self addText:l10n_util::GetStringUTF16(IDS_PAGE_INFO_COOKIES) |
- withSize:[NSFont systemFontSize] |
- bold:NO |
- toView:cookiesView_ |
- atPoint:controlOrigin]; |
- [cookiesLabel sizeToFit]; |
- |
- controlOrigin.y += NSHeight([cookiesLabel frame]); |
- controlOrigin.x -= kLinkButtonXAdjustment; |
- [cookiesButton setFrameOrigin:controlOrigin]; |
- |
- // Align the icon with the text. |
- [self alignPermissionIcon:imageView withTextField:cookiesLabel]; |
- } |
- |
- controlOrigin.y += NSHeight([cookiesButton frame]); |
- [cookiesView_ |
- setFrameSize:NSMakeSize(NSWidth([cookiesView_ frame]), controlOrigin.y)]; |
- |
- [self performLayout]; |
-} |
- |
-- (void)setPermissionInfo:(const PermissionInfoList&)permissionInfoList |
- andChosenObjects:(ChosenObjectInfoList)chosenObjectInfoList { |
- [permissionsView_ setSubviews:[NSArray array]]; |
- NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
- |
- permissionsPresent_ = YES; |
- |
- if (permissionInfoList.size() > 0 || chosenObjectInfoList.size() > 0) { |
- base::string16 sectionTitle = |
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS); |
- |
- for (const auto& permission : permissionInfoList) { |
- controlOrigin.y += kPermissionsVerticalSpacing; |
- NSPoint rowBottomRight = [self addPermission:permission |
- toView:permissionsView_ |
- atPoint:controlOrigin]; |
- controlOrigin.y = rowBottomRight.y; |
- } |
- |
- for (auto& object : chosenObjectInfoList) { |
- controlOrigin.y += kPermissionsVerticalSpacing; |
- NSPoint rowBottomRight = [self addChosenObject:std::move(object) |
- toView:permissionsView_ |
- atPoint:controlOrigin]; |
- controlOrigin.y = rowBottomRight.y; |
- } |
- |
- controlOrigin.y += kPermissionsVerticalSpacing; |
- } |
- |
- [permissionsView_ setFrameSize:NSMakeSize(NSWidth([permissionsView_ frame]), |
- controlOrigin.y)]; |
- [self performLayout]; |
-} |
- |
-@end |
- |
-WebsiteSettingsUIBridge::WebsiteSettingsUIBridge( |
- content::WebContents* web_contents) |
- : content::WebContentsObserver(web_contents), |
- web_contents_(web_contents), |
- bubble_controller_(nil) { |
- DCHECK(!g_is_popup_showing); |
- g_is_popup_showing = true; |
-} |
- |
-WebsiteSettingsUIBridge::~WebsiteSettingsUIBridge() { |
- DCHECK(g_is_popup_showing); |
- g_is_popup_showing = false; |
-} |
- |
-void WebsiteSettingsUIBridge::set_bubble_controller( |
- WebsiteSettingsBubbleController* controller) { |
- bubble_controller_ = controller; |
-} |
- |
-void WebsiteSettingsUIBridge::Show( |
- gfx::NativeWindow parent, |
- Profile* profile, |
- content::WebContents* web_contents, |
- const GURL& virtual_url, |
- const security_state::SecurityInfo& security_info) { |
- if (ui::MaterialDesignController::IsSecondaryUiMaterial()) { |
- chrome::ShowWebsiteSettingsBubbleViewsAtPoint( |
- gfx::ScreenPointFromNSPoint(AnchorPointForWindow(parent)), profile, |
- web_contents, virtual_url, security_info); |
- return; |
- } |
- |
- // Don't show the popup if it's already being shown. Since this method is |
- // called each time the location icon is clicked, each click toggles the popup |
- // in and out. |
- if (g_is_popup_showing) |
- return; |
- |
- // Create the bridge. This will be owned by the bubble controller. |
- WebsiteSettingsUIBridge* bridge = new WebsiteSettingsUIBridge(web_contents); |
- |
- // Create the bubble controller. It will dealloc itself when it closes, |
- // resetting |g_is_popup_showing|. |
- WebsiteSettingsBubbleController* bubble_controller = [ |
- [WebsiteSettingsBubbleController alloc] initWithParentWindow:parent |
- websiteSettingsUIBridge:bridge |
- webContents:web_contents |
- url:virtual_url]; |
- |
- if (!IsInternalURL(virtual_url)) { |
- // Initialize the presenter, which holds the model and controls the UI. |
- // This is also owned by the bubble controller. |
- WebsiteSettings* presenter = new WebsiteSettings( |
- bridge, profile, |
- TabSpecificContentSettings::FromWebContents(web_contents), web_contents, |
- virtual_url, security_info); |
- [bubble_controller setPresenter:presenter]; |
- } |
- |
- [bubble_controller showWindow:nil]; |
-} |
- |
-void WebsiteSettingsUIBridge::SetIdentityInfo( |
- const WebsiteSettingsUI::IdentityInfo& identity_info) { |
- [bubble_controller_ setIdentityInfo:identity_info]; |
-} |
- |
-void WebsiteSettingsUIBridge::RenderFrameDeleted( |
- content::RenderFrameHost* render_frame_host) { |
- if (render_frame_host == web_contents_->GetMainFrame()) { |
- [bubble_controller_ close]; |
- } |
-} |
- |
-void WebsiteSettingsUIBridge::SetCookieInfo( |
- const CookieInfoList& cookie_info_list) { |
- [bubble_controller_ setCookieInfo:cookie_info_list]; |
-} |
- |
-void WebsiteSettingsUIBridge::SetPermissionInfo( |
- const PermissionInfoList& permission_info_list, |
- ChosenObjectInfoList chosen_object_info_list) { |
- [bubble_controller_ setPermissionInfo:permission_info_list |
- andChosenObjects:std::move(chosen_object_info_list)]; |
-} |