OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/website_settings/website_settings_bubble_contro
ller.h" | 5 #import "chrome/browser/ui/cocoa/website_settings/website_settings_bubble_contro
ller.h" |
6 | 6 |
7 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
8 | 8 |
9 #include <cmath> | 9 #include <cmath> |
10 | 10 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 51 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
52 #include "ui/resources/grit/ui_resources.h" | 52 #include "ui/resources/grit/ui_resources.h" |
53 | 53 |
54 using ChosenObjectInfoPtr = | 54 using ChosenObjectInfoPtr = |
55 std::unique_ptr<WebsiteSettingsUI::ChosenObjectInfo>; | 55 std::unique_ptr<WebsiteSettingsUI::ChosenObjectInfo>; |
56 using ChosenObjectDeleteCallback = | 56 using ChosenObjectDeleteCallback = |
57 base::Callback<void(const WebsiteSettingsUI::ChosenObjectInfo&)>; | 57 base::Callback<void(const WebsiteSettingsUI::ChosenObjectInfo&)>; |
58 | 58 |
59 namespace { | 59 namespace { |
60 | 60 |
| 61 /**************** General ****************/ |
| 62 |
61 // The default width of the window, in view coordinates. It may be larger to | 63 // The default width of the window, in view coordinates. It may be larger to |
62 // fit the content. | 64 // fit the content. |
63 const CGFloat kDefaultWindowWidth = 310; | 65 const CGFloat kDefaultWindowWidth = 320; |
64 | 66 |
65 // Padding between the window frame and content. | 67 // Padding around each section |
66 const CGFloat kFramePadding = 20; | 68 const CGFloat kSectionVerticalPadding = 20; |
67 | 69 const CGFloat kSectionHorizontalPadding = 16; |
68 // Padding between the window frame and content. | |
69 const CGFloat kVerticalSectionMargin = 16; | |
70 | |
71 // Padding between the window frame and content for the internal page bubble. | |
72 const CGFloat kInternalPageFramePadding = 10; | |
73 | 70 |
74 // Spacing between the identity field and the security summary. | 71 // Spacing between the identity field and the security summary. |
75 const CGFloat kSpacingBeforeSecuritySummary = 2; | 72 const CGFloat kSpacingBeforeSecuritySummary = 2; |
76 | 73 |
| 74 /**************** Security Section ****************/ |
| 75 |
77 // Spacing between the security summary and the reset decisions button. | 76 // Spacing between the security summary and the reset decisions button. |
78 const CGFloat kSpacingBeforeResetDecisionsButton = 8; | 77 const CGFloat kSpacingBeforeResetDecisionsButton = 8; |
79 | 78 |
| 79 /**************** Site Settings Section ****************/ |
| 80 |
80 // Spacing between parts of the site settings section. | 81 // Spacing between parts of the site settings section. |
81 const CGFloat kSiteSettingsSectionSpacing = 2; | 82 const CGFloat kSiteSettingsSectionSpacing = 2; |
82 | 83 |
83 // Spacing between the image and text for internal pages. | |
84 const CGFloat kInternalPageImageSpacing = 10; | |
85 | |
86 // Square size of the permission images. | 84 // Square size of the permission images. |
87 const CGFloat kPermissionImageSize = 19; | 85 const CGFloat kPermissionImageSize = 19; |
88 | 86 |
89 // Square size of the permission delete button image. | 87 // Square size of the permission delete button image. |
90 const CGFloat kPermissionDeleteImageSize = 16; | 88 const CGFloat kPermissionDeleteImageSize = 16; |
91 | 89 |
92 // Vertical adjustment for the permission images. They have an extra pixel of | 90 // Vertical adjustment for the permission images. They have an extra pixel of |
93 // padding on the bottom edge. | 91 // padding on the bottom edge. |
94 const CGFloat kPermissionImageYAdjust = 1; | 92 const CGFloat kPermissionImageYAdjust = 1; |
95 | 93 |
96 // Spacing between a permission image and the text. | 94 // Spacing between a permission image and the text. |
97 const CGFloat kPermissionImageSpacing = 3; | 95 const CGFloat kPermissionImageSpacing = 3; |
98 | 96 |
99 // The spacing between individual items in the Permissions tab. | 97 // The spacing between individual items in the Permissions tab. |
100 const CGFloat kPermissionsTabSpacing = 12; | 98 const CGFloat kPermissionsTabSpacing = 12; |
101 | 99 |
102 // Extra spacing after a headline on the Permissions tab. | 100 // Extra spacing after a headline on the Permissions tab. |
103 const CGFloat kPermissionsHeadlineSpacing = 2; | 101 const CGFloat kPermissionsHeadlineSpacing = 2; |
104 | 102 |
105 // The amount of horizontal space between a permission label and the popup. | 103 // The amount of horizontal space between a permission label and the popup. |
106 const CGFloat kPermissionPopUpXSpacing = 3; | 104 const CGFloat kPermissionPopUpXSpacing = 3; |
107 | 105 |
108 // The amount of padding to *remove* when placing | 106 // The amount of padding to *remove* when placing |
109 // |IDS_WEBSITE_SETTINGS_{FIRST,THIRD}_PARTY_SITE_DATA| next to each other. | 107 // |IDS_WEBSITE_SETTINGS_{FIRST,THIRD}_PARTY_SITE_DATA| next to each other. |
110 const CGFloat kTextLabelXPadding = 5; | 108 const CGFloat kTextLabelXPadding = 5; |
111 | 109 |
| 110 /**************** Internal Page Bubble ****************/ |
| 111 |
| 112 // Padding between the window frame and content for the internal page bubble. |
| 113 const CGFloat kInternalPageFramePadding = 10; |
| 114 |
| 115 // Spacing between the image and text for internal pages. |
| 116 const CGFloat kInternalPageImageSpacing = 10; |
| 117 |
| 118 /********************************/ |
| 119 |
112 // NOTE: This assumes that there will never be more than one website settings | 120 // NOTE: This assumes that there will never be more than one website settings |
113 // popup shown, and that the one that is shown is associated with the current | 121 // popup shown, and that the one that is shown is associated with the current |
114 // window. This matches the behaviour in views: see WebsiteSettingsPopupView. | 122 // window. This matches the behaviour in views: see WebsiteSettingsPopupView. |
115 bool g_is_popup_showing = false; | 123 bool g_is_popup_showing = false; |
116 | 124 |
117 // Takes in the parent window, which should be a BrowserWindow, and gets the | 125 // Takes in the parent window, which should be a BrowserWindow, and gets the |
118 // proper anchor point for the bubble. The returned point is in screen | 126 // proper anchor point for the bubble. The returned point is in screen |
119 // coordinates. | 127 // coordinates. |
120 NSPoint AnchorPointForWindow(NSWindow* parent) { | 128 NSPoint AnchorPointForWindow(NSWindow* parent) { |
121 BrowserWindowController* controller = [parent windowController]; | 129 BrowserWindowController* controller = [parent windowController]; |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 | 317 |
310 // Create and return a subview for the security section and add it to the given | 318 // Create and return a subview for the security section and add it to the given |
311 // |superview|. |superview| retains the new view. | 319 // |superview|. |superview| retains the new view. |
312 - (NSView*)addSecuritySectionToView:(NSView*)superview { | 320 - (NSView*)addSecuritySectionToView:(NSView*)superview { |
313 base::scoped_nsobject<NSView> securitySectionView( | 321 base::scoped_nsobject<NSView> securitySectionView( |
314 [[FlippedView alloc] initWithFrame:[superview frame]]); | 322 [[FlippedView alloc] initWithFrame:[superview frame]]); |
315 [superview addSubview:securitySectionView]; | 323 [superview addSubview:securitySectionView]; |
316 | 324 |
317 // Create a controlOrigin to place the text fields. The y value doesn't | 325 // Create a controlOrigin to place the text fields. The y value doesn't |
318 // matter, because the correct value is calculated in -performLayout. | 326 // matter, because the correct value is calculated in -performLayout. |
319 NSPoint controlOrigin = NSMakePoint(kFramePadding, 0); | 327 NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
320 | 328 |
321 // Create a text field (empty for now) to show the site identity. | 329 // Create a text field (empty for now) to show the site identity. |
322 identityField_ = [self addText:base::string16() | 330 identityField_ = [self addText:base::string16() |
323 withSize:[NSFont systemFontSize] | 331 withSize:[NSFont systemFontSize] |
324 bold:YES | 332 bold:YES |
325 toView:securitySectionView | 333 toView:securitySectionView |
326 atPoint:controlOrigin]; | 334 atPoint:controlOrigin]; |
327 | 335 |
328 // Create a text field for the security summary (private/not private/etc.). | 336 // Create a text field for the security summary (private/not private/etc.). |
329 securitySummaryField_ = [self addText:base::string16() | 337 securitySummaryField_ = [self addText:base::string16() |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 // Make the content at least as wide as the permissions view. | 460 // Make the content at least as wide as the permissions view. |
453 CGFloat contentWidth = std::max([self defaultWindowWidth], | 461 CGFloat contentWidth = std::max([self defaultWindowWidth], |
454 NSWidth([permissionsView_ frame])); | 462 NSWidth([permissionsView_ frame])); |
455 | 463 |
456 // Set the width of the content view now, so that all the text fields will | 464 // Set the width of the content view now, so that all the text fields will |
457 // be sized to fit before their heights and vertical positions are adjusted. | 465 // be sized to fit before their heights and vertical positions are adjusted. |
458 [self setWidthOfView:contentView_ to:contentWidth]; | 466 [self setWidthOfView:contentView_ to:contentWidth]; |
459 [self setWidthOfView:securitySectionView_ to:contentWidth]; | 467 [self setWidthOfView:securitySectionView_ to:contentWidth]; |
460 [self setWidthOfView:siteSettingsSectionView_ to:contentWidth]; | 468 [self setWidthOfView:siteSettingsSectionView_ to:contentWidth]; |
461 | 469 |
462 CGFloat yPos = info_bubble::kBubbleArrowHeight; | 470 CGFloat yPos = 0; |
463 | 471 |
464 [self layoutSecuritySection]; | 472 [self layoutSecuritySection]; |
465 yPos = [self setYPositionOfView:securitySectionView_ to:yPos + kFramePadding]; | 473 yPos = [self setYPositionOfView:securitySectionView_ to:yPos]; |
466 | 474 |
467 yPos = [self setYPositionOfView:separatorAfterSecuritySection_ | 475 yPos = [self setYPositionOfView:separatorAfterSecuritySection_ to:yPos]; |
468 to:yPos + kVerticalSectionMargin]; | |
469 | 476 |
470 [self layoutSiteSettingsSection]; | 477 [self layoutSiteSettingsSection]; |
471 yPos = [self setYPositionOfView:siteSettingsSectionView_ | 478 yPos = [self setYPositionOfView:siteSettingsSectionView_ to:yPos]; |
472 to:yPos + kVerticalSectionMargin]; | |
473 | 479 |
474 [contentView_ setFrame:NSMakeRect(0, 0, NSWidth([contentView_ frame]), | 480 [contentView_ setFrame:NSMakeRect(0, 0, NSWidth([contentView_ frame]), yPos)]; |
475 yPos + kFramePadding)]; | |
476 | 481 |
477 [self sizeAndPositionWindow]; | 482 [self sizeAndPositionWindow]; |
478 } | 483 } |
479 | 484 |
480 - (void)layoutSecuritySection { | 485 - (void)layoutSecuritySection { |
481 // Start the layout with the first element. Margins are handled by the caller. | 486 // Start the layout with the first element. Margins are handled by the caller. |
482 CGFloat yPos = 0; | 487 CGFloat yPos = 0; |
483 | 488 |
484 [self sizeTextFieldHeightToFit:identityField_]; | 489 [self sizeTextFieldHeightToFit:identityField_]; |
485 yPos = [self setYPositionOfView:identityField_ to:yPos]; | 490 yPos = [self setYPositionOfView:identityField_ |
| 491 to:yPos + kSectionVerticalPadding]; |
486 | 492 |
487 [self sizeTextFieldHeightToFit:securitySummaryField_]; | 493 [self sizeTextFieldHeightToFit:securitySummaryField_]; |
488 yPos = [self setYPositionOfView:securitySummaryField_ | 494 yPos = [self setYPositionOfView:securitySummaryField_ |
489 to:yPos + kSpacingBeforeSecuritySummary]; | 495 to:yPos + kSpacingBeforeSecuritySummary]; |
490 | 496 |
491 if (isDevToolsDisabled_ && certificateId_ == 0) { | 497 if (isDevToolsDisabled_ && certificateId_ == 0) { |
492 // -removeFromSuperview is idempotent. | 498 // -removeFromSuperview is idempotent. |
493 [securityDetailsButton_ removeFromSuperview]; | 499 [securityDetailsButton_ removeFromSuperview]; |
494 } else { | 500 } else { |
495 // -addSubview is idempotent. | 501 // -addSubview is idempotent. |
496 [securitySectionView_ addSubview:securityDetailsButton_]; | 502 [securitySectionView_ addSubview:securityDetailsButton_]; |
497 yPos = [self setYPositionOfView:securityDetailsButton_ to:yPos]; | 503 yPos = [self setYPositionOfView:securityDetailsButton_ to:yPos]; |
498 } | 504 } |
499 | 505 |
500 if (resetDecisionsButton_) { | 506 if (resetDecisionsButton_) { |
501 yPos = [self setYPositionOfView:resetDecisionsButton_ | 507 yPos = [self setYPositionOfView:resetDecisionsButton_ |
502 to:yPos + kSpacingBeforeResetDecisionsButton]; | 508 to:yPos + kSpacingBeforeResetDecisionsButton]; |
503 } | 509 } |
504 | 510 |
505 // Resize the height based on contents. | 511 // Resize the height based on contents. |
506 [self setHeightOfView:securitySectionView_ to:yPos]; | 512 [self setHeightOfView:securitySectionView_ to:yPos + kSectionVerticalPadding]; |
507 } | 513 } |
508 | 514 |
509 - (void)layoutSiteSettingsSection { | 515 - (void)layoutSiteSettingsSection { |
510 // Start the layout with the first element. Margins are handled by the caller. | 516 // Start the layout with the first element. Margins are handled by the caller. |
511 CGFloat yPos = 0; | 517 CGFloat yPos = 0; |
512 | 518 |
513 yPos = [self setYPositionOfView:cookiesView_ to:yPos]; | 519 yPos = |
| 520 [self setYPositionOfView:cookiesView_ to:yPos + kSectionVerticalPadding]; |
514 | 521 |
515 if (permissionsPresent_) { | 522 if (permissionsPresent_) { |
516 // Put the permission info just below the link button. | 523 // Put the permission info just below the link button. |
517 yPos = [self setYPositionOfView:permissionsView_ | 524 yPos = [self setYPositionOfView:permissionsView_ |
518 to:yPos + kSiteSettingsSectionSpacing]; | 525 to:yPos + kSiteSettingsSectionSpacing]; |
519 } | 526 } |
520 | 527 |
521 // Put the link button for site settings just below the permissions. | 528 // Put the link button for site settings just below the permissions. |
522 // TODO(lgarron): set the position of this based on RTL/LTR. | 529 // TODO(lgarron): set the position of this based on RTL/LTR. |
523 // http://code.google.com/p/chromium/issues/detail?id=525304 | 530 // http://code.google.com/p/chromium/issues/detail?id=525304 |
524 yPos += kSiteSettingsSectionSpacing; | 531 yPos += kSiteSettingsSectionSpacing; |
525 [siteSettingsButton_ setFrameOrigin:NSMakePoint(kFramePadding, yPos)]; | 532 [siteSettingsButton_ |
| 533 setFrameOrigin:NSMakePoint(kSectionHorizontalPadding, yPos)]; |
526 yPos = NSMaxY([siteSettingsButton_ frame]); | 534 yPos = NSMaxY([siteSettingsButton_ frame]); |
527 | 535 |
528 // Resize the height based on contents. | 536 // Resize the height based on contents. |
529 [self setHeightOfView:siteSettingsSectionView_ to:yPos]; | 537 [self setHeightOfView:siteSettingsSectionView_ |
| 538 to:yPos + kSectionVerticalPadding]; |
530 } | 539 } |
531 | 540 |
532 // Adjust the size of the window to match the size of the content, and position | 541 // Adjust the size of the window to match the size of the content, and position |
533 // the bubble anchor appropriately. | 542 // the bubble anchor appropriately. |
534 - (void)sizeAndPositionWindow { | 543 - (void)sizeAndPositionWindow { |
535 NSRect windowFrame = [contentView_ frame]; | 544 NSRect windowFrame = [contentView_ frame]; |
536 windowFrame.size = [[[self window] contentView] convertSize:windowFrame.size | 545 windowFrame.size = [[[self window] contentView] convertSize:windowFrame.size |
537 toView:nil]; | 546 toView:nil]; |
538 // Adjust the origin by the difference in height. | 547 // Adjust the origin by the difference in height. |
539 windowFrame.origin = [[self window] frame].origin; | 548 windowFrame.origin = [[self window] frame].origin; |
(...skipping 30 matching lines...) Expand all Loading... |
570 | 579 |
571 // Create a new text field and add it to the given array of subviews. | 580 // Create a new text field and add it to the given array of subviews. |
572 // The array will retain a reference to the object. | 581 // The array will retain a reference to the object. |
573 - (NSTextField*)addText:(const base::string16&)text | 582 - (NSTextField*)addText:(const base::string16&)text |
574 withSize:(CGFloat)fontSize | 583 withSize:(CGFloat)fontSize |
575 bold:(BOOL)bold | 584 bold:(BOOL)bold |
576 toView:(NSView*)view | 585 toView:(NSView*)view |
577 atPoint:(NSPoint)point { | 586 atPoint:(NSPoint)point { |
578 // Size the text to take up the full available width, with some padding. | 587 // Size the text to take up the full available width, with some padding. |
579 // The height is arbitrary as it will be adjusted later. | 588 // The height is arbitrary as it will be adjusted later. |
580 CGFloat width = NSWidth([view frame]) - point.x - kFramePadding; | 589 CGFloat width = NSWidth([view frame]) - point.x - kSectionHorizontalPadding; |
581 NSRect frame = NSMakeRect(point.x, point.y, width, 100); | 590 NSRect frame = NSMakeRect(point.x, point.y, width, 100); |
582 base::scoped_nsobject<NSTextField> textField( | 591 base::scoped_nsobject<NSTextField> textField( |
583 [[NSTextField alloc] initWithFrame:frame]); | 592 [[NSTextField alloc] initWithFrame:frame]); |
584 [self configureTextFieldAsLabel:textField.get()]; | 593 [self configureTextFieldAsLabel:textField.get()]; |
585 [textField setStringValue:base::SysUTF16ToNSString(text)]; | 594 [textField setStringValue:base::SysUTF16ToNSString(text)]; |
586 NSFont* font = bold ? [NSFont boldSystemFontOfSize:fontSize] | 595 NSFont* font = bold ? [NSFont boldSystemFontOfSize:fontSize] |
587 : [NSFont systemFontOfSize:fontSize]; | 596 : [NSFont systemFontOfSize:fontSize]; |
588 [textField setFont:font]; | 597 [textField setFont:font]; |
589 [self sizeTextFieldHeightToFit:textField]; | 598 [self sizeTextFieldHeightToFit:textField]; |
590 [textField setAutoresizingMask:NSViewWidthSizable]; | 599 [textField setAutoresizingMask:NSViewWidthSizable]; |
(...skipping 19 matching lines...) Expand all Loading... |
610 // Use an arbitrary position; it will be adjusted in performLayout. | 619 // Use an arbitrary position; it will be adjusted in performLayout. |
611 NSBox* spacer = [self | 620 NSBox* spacer = [self |
612 horizontalSeparatorWithFrame:NSMakeRect(0, 0, NSWidth([view frame]), 0)]; | 621 horizontalSeparatorWithFrame:NSMakeRect(0, 0, NSWidth([view frame]), 0)]; |
613 [view addSubview:spacer]; | 622 [view addSubview:spacer]; |
614 return spacer; | 623 return spacer; |
615 } | 624 } |
616 | 625 |
617 // Add a link button with the given text to |view|. | 626 // Add a link button with the given text to |view|. |
618 - (NSButton*)addLinkButtonWithText:(NSString*)text toView:(NSView*)view { | 627 - (NSButton*)addLinkButtonWithText:(NSString*)text toView:(NSView*)view { |
619 // Frame size is arbitrary; it will be adjusted by the layout tweaker. | 628 // Frame size is arbitrary; it will be adjusted by the layout tweaker. |
620 NSRect frame = NSMakeRect(kFramePadding, 0, 100, 10); | 629 NSRect frame = NSMakeRect(kSectionHorizontalPadding, 0, 100, 10); |
621 base::scoped_nsobject<NSButton> button( | 630 base::scoped_nsobject<NSButton> button( |
622 [[NSButton alloc] initWithFrame:frame]); | 631 [[NSButton alloc] initWithFrame:frame]); |
623 base::scoped_nsobject<HyperlinkButtonCell> cell( | 632 base::scoped_nsobject<HyperlinkButtonCell> cell( |
624 [[HyperlinkButtonCell alloc] initTextCell:text]); | 633 [[HyperlinkButtonCell alloc] initTextCell:text]); |
625 [cell setControlSize:NSSmallControlSize]; | 634 [cell setControlSize:NSSmallControlSize]; |
626 [button setCell:cell.get()]; | 635 [button setCell:cell.get()]; |
627 [button setButtonType:NSMomentaryPushInButton]; | 636 [button setButtonType:NSMomentaryPushInButton]; |
628 [button setBezelStyle:NSRegularSquareBezelStyle]; | 637 [button setBezelStyle:NSRegularSquareBezelStyle]; |
629 [view addSubview:button.get()]; | 638 [view addSubview:button.get()]; |
630 | 639 |
631 [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; | 640 [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; |
632 return button.get(); | 641 return button.get(); |
633 } | 642 } |
634 | 643 |
635 // Create and return a button with the specified text and add it to the given | 644 // Create and return a button with the specified text and add it to the given |
636 // |view|. |view| retains the new button. | 645 // |view|. |view| retains the new button. |
637 - (NSButton*)addButtonWithText:(NSString*)text toView:(NSView*)view { | 646 - (NSButton*)addButtonWithText:(NSString*)text toView:(NSView*)view { |
638 NSRect containerFrame = [view frame]; | 647 NSRect containerFrame = [view frame]; |
639 // Frame size is arbitrary; it will be adjusted by the layout tweaker. | 648 // Frame size is arbitrary; it will be adjusted by the layout tweaker. |
640 NSRect frame = NSMakeRect(kFramePadding, 0, 100, 10); | 649 NSRect frame = NSMakeRect(kSectionHorizontalPadding, 0, 100, 10); |
641 base::scoped_nsobject<NSButton> button( | 650 base::scoped_nsobject<NSButton> button( |
642 [[NSButton alloc] initWithFrame:frame]); | 651 [[NSButton alloc] initWithFrame:frame]); |
643 | 652 |
644 // Determine the largest possible size for this button. The size is the width | 653 // Determine the largest possible size for this button. The size is the width |
645 // of the connection section minus the padding on both sides minus the | 654 // of the connection section minus the padding on both sides minus the |
646 // connection image size and spacing. | 655 // connection image size and spacing. |
647 // TODO(lgarron): handle this sizing in -performLayout. | 656 // TODO(lgarron): handle this sizing in -performLayout. |
648 CGFloat maxTitleWidth = containerFrame.size.width - kFramePadding * 2; | 657 CGFloat maxTitleWidth = |
| 658 containerFrame.size.width - kSectionHorizontalPadding * 2; |
649 | 659 |
650 base::scoped_nsobject<NSButtonCell> cell( | 660 base::scoped_nsobject<NSButtonCell> cell( |
651 [[NSButtonCell alloc] initTextCell:text]); | 661 [[NSButtonCell alloc] initTextCell:text]); |
652 [button setCell:cell.get()]; | 662 [button setCell:cell.get()]; |
653 [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; | 663 [GTMUILocalizerAndLayoutTweaker sizeToFitView:button.get()]; |
654 | 664 |
655 // Ensure the containing view is large enough to contain the button with its | 665 // Ensure the containing view is large enough to contain the button with its |
656 // widest possible title. | 666 // widest possible title. |
657 NSRect buttonFrame = [button frame]; | 667 NSRect buttonFrame = [button frame]; |
658 buttonFrame.size.width = maxTitleWidth; | 668 buttonFrame.size.width = maxTitleWidth; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 forURL:url | 713 forURL:url |
704 withCallback:callback]); | 714 withCallback:callback]); |
705 // Determine the largest possible size for this button. | 715 // Determine the largest possible size for this button. |
706 CGFloat maxTitleWidth = [button | 716 CGFloat maxTitleWidth = [button |
707 maxTitleWidthForContentSettingsType:permissionInfo.type | 717 maxTitleWidthForContentSettingsType:permissionInfo.type |
708 withDefaultSetting:permissionInfo.default_setting]; | 718 withDefaultSetting:permissionInfo.default_setting]; |
709 | 719 |
710 // Ensure the containing view is large enough to contain the button with its | 720 // Ensure the containing view is large enough to contain the button with its |
711 // widest possible title. | 721 // widest possible title. |
712 NSRect containerFrame = [view frame]; | 722 NSRect containerFrame = [view frame]; |
713 containerFrame.size.width = std::max( | 723 containerFrame.size.width = |
714 NSWidth(containerFrame), point.x + maxTitleWidth + kFramePadding); | 724 std::max(NSWidth(containerFrame), |
| 725 point.x + maxTitleWidth + kSectionHorizontalPadding); |
715 [view setFrame:containerFrame]; | 726 [view setFrame:containerFrame]; |
716 [view addSubview:button.get()]; | 727 [view addSubview:button.get()]; |
717 return button.get(); | 728 return button.get(); |
718 } | 729 } |
719 | 730 |
720 // Add a delete button for |objectInfo| to the given view. | 731 // Add a delete button for |objectInfo| to the given view. |
721 - (NSButton*)addDeleteButtonForChosenObject:(ChosenObjectInfoPtr)objectInfo | 732 - (NSButton*)addDeleteButtonForChosenObject:(ChosenObjectInfoPtr)objectInfo |
722 toView:(NSView*)view | 733 toView:(NSView*)view |
723 atPoint:(NSPoint)point { | 734 atPoint:(NSPoint)point { |
724 __block WebsiteSettingsBubbleController* weakSelf = self; | 735 __block WebsiteSettingsBubbleController* weakSelf = self; |
725 auto callback = | 736 auto callback = |
726 base::BindBlock(^(const WebsiteSettingsUI::ChosenObjectInfo& objectInfo) { | 737 base::BindBlock(^(const WebsiteSettingsUI::ChosenObjectInfo& objectInfo) { |
727 [weakSelf onChosenObjectDeleted:objectInfo]; | 738 [weakSelf onChosenObjectDeleted:objectInfo]; |
728 }); | 739 }); |
729 base::scoped_nsobject<ChosenObjectDeleteButton> button( | 740 base::scoped_nsobject<ChosenObjectDeleteButton> button( |
730 [[ChosenObjectDeleteButton alloc] | 741 [[ChosenObjectDeleteButton alloc] |
731 initWithChosenObject:std::move(objectInfo) | 742 initWithChosenObject:std::move(objectInfo) |
732 atPoint:point | 743 atPoint:point |
733 withCallback:callback]); | 744 withCallback:callback]); |
734 | 745 |
735 // Ensure the containing view is large enough to contain the button. | 746 // Ensure the containing view is large enough to contain the button. |
736 NSRect containerFrame = [view frame]; | 747 NSRect containerFrame = [view frame]; |
737 containerFrame.size.width = | 748 containerFrame.size.width = |
738 std::max(NSWidth(containerFrame), | 749 std::max(NSWidth(containerFrame), point.x + kPermissionDeleteImageSize + |
739 point.x + kPermissionDeleteImageSize + kFramePadding); | 750 kSectionHorizontalPadding); |
740 [view setFrame:containerFrame]; | 751 [view setFrame:containerFrame]; |
741 [view addSubview:button.get()]; | 752 [view addSubview:button.get()]; |
742 return button.get(); | 753 return button.get(); |
743 } | 754 } |
744 | 755 |
745 // Called when the user changes the setting of a permission. | 756 // Called when the user changes the setting of a permission. |
746 - (void)onPermissionChanged:(ContentSettingsType)permissionType | 757 - (void)onPermissionChanged:(ContentSettingsType)permissionType |
747 to:(ContentSetting)newSetting { | 758 to:(ContentSetting)newSetting { |
748 if (presenter_) | 759 if (presenter_) |
749 presenter_->OnSitePermissionChanged(permissionType, newSetting); | 760 presenter_->OnSitePermissionChanged(permissionType, newSetting); |
(...skipping 23 matching lines...) Expand all Loading... |
773 | 784 |
774 NSPoint position; | 785 NSPoint position; |
775 NSImageView* imageView; | 786 NSImageView* imageView; |
776 NSPopUpButton* button; | 787 NSPopUpButton* button; |
777 NSTextField* label; | 788 NSTextField* label; |
778 | 789 |
779 CGFloat viewWidth = NSWidth([view frame]); | 790 CGFloat viewWidth = NSWidth([view frame]); |
780 | 791 |
781 if (isRTL) { | 792 if (isRTL) { |
782 point.x = NSWidth([view frame]) - kPermissionImageSize - | 793 point.x = NSWidth([view frame]) - kPermissionImageSize - |
783 kPermissionImageSpacing - kFramePadding; | 794 kPermissionImageSpacing - kSectionHorizontalPadding; |
784 imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; | 795 imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; |
785 [imageView setImage:image]; | 796 [imageView setImage:image]; |
786 point.x -= kPermissionImageSpacing; | 797 point.x -= kPermissionImageSpacing; |
787 | 798 |
788 label = [self addText:labelText | 799 label = [self addText:labelText |
789 withSize:[NSFont smallSystemFontSize] | 800 withSize:[NSFont smallSystemFontSize] |
790 bold:NO | 801 bold:NO |
791 toView:view | 802 toView:view |
792 atPoint:point]; | 803 atPoint:point]; |
793 [label sizeToFit]; | 804 [label sizeToFit]; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 | 874 |
864 NSPoint position; | 875 NSPoint position; |
865 NSImageView* imageView; | 876 NSImageView* imageView; |
866 NSButton* button; | 877 NSButton* button; |
867 NSTextField* label; | 878 NSTextField* label; |
868 | 879 |
869 CGFloat viewWidth = NSWidth([view frame]); | 880 CGFloat viewWidth = NSWidth([view frame]); |
870 | 881 |
871 if (isRTL) { | 882 if (isRTL) { |
872 point.x = NSWidth([view frame]) - kPermissionImageSize - | 883 point.x = NSWidth([view frame]) - kPermissionImageSize - |
873 kPermissionImageSpacing - kFramePadding; | 884 kPermissionImageSpacing - kSectionHorizontalPadding; |
874 imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; | 885 imageView = [self addImageWithSize:[image size] toView:view atPoint:point]; |
875 [imageView setImage:image]; | 886 [imageView setImage:image]; |
876 point.x -= kPermissionImageSpacing; | 887 point.x -= kPermissionImageSpacing; |
877 | 888 |
878 label = [self addText:labelText | 889 label = [self addText:labelText |
879 withSize:[NSFont smallSystemFontSize] | 890 withSize:[NSFont smallSystemFontSize] |
880 bold:NO | 891 bold:NO |
881 toView:view | 892 toView:view |
882 atPoint:point]; | 893 atPoint:point]; |
883 [label sizeToFit]; | 894 [label sizeToFit]; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 IDS_WEBSITE_SETTINGS_THIRD_PARTY_SITE_DATA, i.allowed); | 976 IDS_WEBSITE_SETTINGS_THIRD_PARTY_SITE_DATA, i.allowed); |
966 } | 977 } |
967 } | 978 } |
968 | 979 |
969 base::string16 sectionTitle = | 980 base::string16 sectionTitle = |
970 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA); | 981 l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA); |
971 bool isRTL = base::i18n::RIGHT_TO_LEFT == | 982 bool isRTL = base::i18n::RIGHT_TO_LEFT == |
972 base::i18n::GetStringDirection(firstPartyLabelText); | 983 base::i18n::GetStringDirection(firstPartyLabelText); |
973 | 984 |
974 [cookiesView_ setSubviews:[NSArray array]]; | 985 [cookiesView_ setSubviews:[NSArray array]]; |
975 NSPoint controlOrigin = NSMakePoint(kFramePadding, 0); | 986 NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
976 | 987 |
977 NSTextField* label; | 988 NSTextField* label; |
978 | 989 |
979 CGFloat viewWidth = NSWidth([cookiesView_ frame]); | 990 CGFloat viewWidth = NSWidth([cookiesView_ frame]); |
980 | 991 |
981 NSTextField* header = [self addText:sectionTitle | 992 NSTextField* header = [self addText:sectionTitle |
982 withSize:[NSFont smallSystemFontSize] | 993 withSize:[NSFont smallSystemFontSize] |
983 bold:YES | 994 bold:YES |
984 toView:cookiesView_ | 995 toView:cookiesView_ |
985 atPoint:controlOrigin]; | 996 atPoint:controlOrigin]; |
986 [header sizeToFit]; | 997 [header sizeToFit]; |
987 | 998 |
988 if (isRTL) { | 999 if (isRTL) { |
989 controlOrigin.x = viewWidth - kFramePadding - NSWidth([header frame]); | 1000 controlOrigin.x = |
| 1001 viewWidth - kSectionHorizontalPadding - NSWidth([header frame]); |
990 [header setFrameOrigin:controlOrigin]; | 1002 [header setFrameOrigin:controlOrigin]; |
991 } | 1003 } |
992 controlOrigin.y += NSHeight([header frame]) + kPermissionsHeadlineSpacing; | 1004 controlOrigin.y += NSHeight([header frame]) + kPermissionsHeadlineSpacing; |
993 controlOrigin.y += kPermissionsTabSpacing; | 1005 controlOrigin.y += kPermissionsTabSpacing; |
994 | 1006 |
995 // Reset X for the cookie image. | 1007 // Reset X for the cookie image. |
996 if (isRTL) { | 1008 if (isRTL) { |
997 controlOrigin.x = viewWidth - kPermissionImageSize - | 1009 controlOrigin.x = viewWidth - kPermissionImageSize - |
998 kPermissionImageSpacing - kFramePadding; | 1010 kPermissionImageSpacing - kSectionHorizontalPadding; |
999 } | 1011 } |
1000 | 1012 |
1001 WebsiteSettingsUI::PermissionInfo info; | 1013 WebsiteSettingsUI::PermissionInfo info; |
1002 info.type = CONTENT_SETTINGS_TYPE_COOKIES; | 1014 info.type = CONTENT_SETTINGS_TYPE_COOKIES; |
1003 info.setting = CONTENT_SETTING_ALLOW; | 1015 info.setting = CONTENT_SETTING_ALLOW; |
1004 // info.default_setting, info.source, and info.is_incognito have not been set, | 1016 // info.default_setting, info.source, and info.is_incognito have not been set, |
1005 // but GetPermissionIcon doesn't use any of those. | 1017 // but GetPermissionIcon doesn't use any of those. |
1006 NSImage* image = WebsiteSettingsUI::GetPermissionIcon(info).ToNSImage(); | 1018 NSImage* image = WebsiteSettingsUI::GetPermissionIcon(info).ToNSImage(); |
1007 NSImageView* imageView = [self addImageWithSize:[image size] | 1019 NSImageView* imageView = [self addImageWithSize:[image size] |
1008 toView:cookiesView_ | 1020 toView:cookiesView_ |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 | 1066 |
1055 [cookiesView_ setFrameSize: | 1067 [cookiesView_ setFrameSize: |
1056 NSMakeSize(NSWidth([cookiesView_ frame]), controlOrigin.y)]; | 1068 NSMakeSize(NSWidth([cookiesView_ frame]), controlOrigin.y)]; |
1057 | 1069 |
1058 [self performLayout]; | 1070 [self performLayout]; |
1059 } | 1071 } |
1060 | 1072 |
1061 - (void)setPermissionInfo:(const PermissionInfoList&)permissionInfoList | 1073 - (void)setPermissionInfo:(const PermissionInfoList&)permissionInfoList |
1062 andChosenObjects:(const ChosenObjectInfoList&)chosenObjectInfoList { | 1074 andChosenObjects:(const ChosenObjectInfoList&)chosenObjectInfoList { |
1063 [permissionsView_ setSubviews:[NSArray array]]; | 1075 [permissionsView_ setSubviews:[NSArray array]]; |
1064 NSPoint controlOrigin = NSMakePoint(kFramePadding, 0); | 1076 NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
1065 | 1077 |
1066 permissionsPresent_ = YES; | 1078 permissionsPresent_ = YES; |
1067 | 1079 |
1068 if (permissionInfoList.size() > 0 || chosenObjectInfoList.size() > 0) { | 1080 if (permissionInfoList.size() > 0 || chosenObjectInfoList.size() > 0) { |
1069 base::string16 sectionTitle = l10n_util::GetStringUTF16( | 1081 base::string16 sectionTitle = l10n_util::GetStringUTF16( |
1070 IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS); | 1082 IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS); |
1071 bool isRTL = base::i18n::RIGHT_TO_LEFT == | 1083 bool isRTL = base::i18n::RIGHT_TO_LEFT == |
1072 base::i18n::GetStringDirection(sectionTitle); | 1084 base::i18n::GetStringDirection(sectionTitle); |
1073 NSTextField* header = [self addText:sectionTitle | 1085 NSTextField* header = [self addText:sectionTitle |
1074 withSize:[NSFont smallSystemFontSize] | 1086 withSize:[NSFont smallSystemFontSize] |
1075 bold:YES | 1087 bold:YES |
1076 toView:permissionsView_ | 1088 toView:permissionsView_ |
1077 atPoint:controlOrigin]; | 1089 atPoint:controlOrigin]; |
1078 [header sizeToFit]; | 1090 [header sizeToFit]; |
1079 if (isRTL) { | 1091 if (isRTL) { |
1080 controlOrigin.x = NSWidth([permissionsView_ frame]) - kFramePadding - | 1092 controlOrigin.x = NSWidth([permissionsView_ frame]) - |
1081 NSWidth([header frame]); | 1093 kSectionHorizontalPadding - NSWidth([header frame]); |
1082 [header setFrameOrigin:controlOrigin]; | 1094 [header setFrameOrigin:controlOrigin]; |
1083 } | 1095 } |
1084 controlOrigin.y += NSHeight([header frame]) + kPermissionsHeadlineSpacing; | 1096 controlOrigin.y += NSHeight([header frame]) + kPermissionsHeadlineSpacing; |
1085 | 1097 |
1086 for (const auto& permission : permissionInfoList) { | 1098 for (const auto& permission : permissionInfoList) { |
1087 controlOrigin.y += kPermissionsTabSpacing; | 1099 controlOrigin.y += kPermissionsTabSpacing; |
1088 NSPoint rowBottomRight = [self addPermission:permission | 1100 NSPoint rowBottomRight = [self addPermission:permission |
1089 toView:permissionsView_ | 1101 toView:permissionsView_ |
1090 atPoint:controlOrigin]; | 1102 atPoint:controlOrigin]; |
1091 controlOrigin.y = rowBottomRight.y; | 1103 controlOrigin.y = rowBottomRight.y; |
1092 } | 1104 } |
1093 | 1105 |
1094 for (auto* object : chosenObjectInfoList) { | 1106 for (auto* object : chosenObjectInfoList) { |
1095 controlOrigin.y += kPermissionsTabSpacing; | 1107 controlOrigin.y += kPermissionsTabSpacing; |
1096 NSPoint rowBottomRight = [self addChosenObject:base::WrapUnique(object) | 1108 NSPoint rowBottomRight = [self addChosenObject:base::WrapUnique(object) |
1097 toView:permissionsView_ | 1109 toView:permissionsView_ |
1098 atPoint:controlOrigin]; | 1110 atPoint:controlOrigin]; |
1099 controlOrigin.y = rowBottomRight.y; | 1111 controlOrigin.y = rowBottomRight.y; |
1100 } | 1112 } |
1101 | 1113 |
1102 controlOrigin.y += kFramePadding; | 1114 controlOrigin.y += kPermissionsTabSpacing; |
1103 } | 1115 } |
1104 | 1116 |
1105 [permissionsView_ setFrameSize: | 1117 [permissionsView_ setFrameSize: |
1106 NSMakeSize(NSWidth([permissionsView_ frame]), controlOrigin.y)]; | 1118 NSMakeSize(NSWidth([permissionsView_ frame]), controlOrigin.y)]; |
1107 [self performLayout]; | 1119 [self performLayout]; |
1108 } | 1120 } |
1109 | 1121 |
1110 @end | 1122 @end |
1111 | 1123 |
1112 WebsiteSettingsUIBridge::WebsiteSettingsUIBridge( | 1124 WebsiteSettingsUIBridge::WebsiteSettingsUIBridge( |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1196 void WebsiteSettingsUIBridge::SetPermissionInfo( | 1208 void WebsiteSettingsUIBridge::SetPermissionInfo( |
1197 const PermissionInfoList& permission_info_list, | 1209 const PermissionInfoList& permission_info_list, |
1198 const ChosenObjectInfoList& chosen_object_info_list) { | 1210 const ChosenObjectInfoList& chosen_object_info_list) { |
1199 [bubble_controller_ setPermissionInfo:permission_info_list | 1211 [bubble_controller_ setPermissionInfo:permission_info_list |
1200 andChosenObjects:chosen_object_info_list]; | 1212 andChosenObjects:chosen_object_info_list]; |
1201 } | 1213 } |
1202 | 1214 |
1203 void WebsiteSettingsUIBridge::SetSelectedTab(TabId tab_id) { | 1215 void WebsiteSettingsUIBridge::SetSelectedTab(TabId tab_id) { |
1204 // TODO(lgarron): Remove this from the interface. (crbug.com/571533) | 1216 // TODO(lgarron): Remove this from the interface. (crbug.com/571533) |
1205 } | 1217 } |
OLD | NEW |