Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: chrome/browser/ui/cocoa/website_settings_bubble_controller.mm

Issue 10831280: [Mac] Website settings: Add cookie info & permission icons, plus other visual fixes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit tests. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_bubble_controller.h" 5 #import "chrome/browser/ui/cocoa/website_settings_bubble_controller.h"
6 6
7 #include "base/string_number_conversions.h"
7 #include "base/sys_string_conversions.h" 8 #include "base/sys_string_conversions.h"
8 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 9 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
9 #import "chrome/browser/ui/cocoa/info_bubble_view.h" 10 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
10 #import "chrome/browser/ui/cocoa/info_bubble_window.h" 11 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
11 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" 12 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
12 #include "chrome/browser/ui/tab_contents/tab_contents.h" 13 #include "chrome/browser/ui/tab_contents/tab_contents.h"
13 #include "content/public/browser/cert_store.h" 14 #include "content/public/browser/cert_store.h"
14 #include "grit/generated_resources.h" 15 #include "grit/generated_resources.h"
15 #include "grit/theme_resources.h" 16 #include "grit/theme_resources.h"
16 #include "grit/ui_resources.h" 17 #include "grit/ui_resources.h"
17 #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" 18 #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
18 #include "ui/base/l10n/l10n_util.h" 19 #include "ui/base/l10n/l10n_util.h"
19 #include "ui/base/resource/resource_bundle.h" 20 #include "ui/base/resource/resource_bundle.h"
20 21
21 namespace { 22 namespace {
22 23
23 // The width of the window, in view coordinates. The height will be determined 24 // The width of the window, in view coordinates. The height will be determined
24 // by the content. 25 // by the content.
25 const CGFloat kWindowWidth = 380; 26 const CGFloat kWindowWidth = 380;
26 27
27 // Spacing in between sections. 28 // Spacing in between sections.
28 const CGFloat kVerticalSpacing = 10; 29 const CGFloat kVerticalSpacing = 10;
29 30
30 // Padding between the window frame and content. 31 // Padding between the window frame and content.
31 const CGFloat kFramePadding = 10; 32 const CGFloat kFramePadding = 10;
32 33
33 // Spacing between the optional headline and description text views. 34 // Spacing between the optional headline and description text views.
34 const CGFloat kHeadlineSpacing = 2; 35 const CGFloat kHeadlineSpacing = 2;
35 36
36 // Spacing between the image and the text. 37 // Spacing between images on the Connection tab and the text.
37 const CGFloat kImageSpacing = 10; 38 const CGFloat kConnectionImageSpacing = 10;
38 39
39 // Square size of the image. 40 // Square size of the images on the Connections tab.
40 const CGFloat kImageSize = 30; 41 const CGFloat kConnectionImageSize = 30;
41 42
42 // The X position of the text fields. Variants for with and without an image. 43 // Square size of the permission images.
43 const CGFloat kTextXPositionNoImage = kFramePadding; 44 const CGFloat kPermissionImageSize = 19;
44 const CGFloat kTextXPosition = kTextXPositionNoImage + kImageSize +
45 kImageSpacing;
46 45
47 // Width of the text fields. 46 // Vertical adjustment for the permission images.
48 const CGFloat kTextWidth = kWindowWidth - (kImageSize + kImageSpacing + 47 // They have an extra pixel of padding on the bottom edge.
49 kFramePadding * 2); 48 const CGFloat kPermissionImageYAdjust = 1;
49
50 // Spacing between a permission image and the text.
51 const CGFloat kPermissionImageSpacing = 3;
50 52
51 // The amount of padding given to tab view contents. 53 // The amount of padding given to tab view contents.
52 const CGFloat kTabViewContentsPadding = kFramePadding; 54 const CGFloat kTabViewContentsPadding = kFramePadding;
53 55
54 // The spacing between individual items in the Permissions tab. 56 // The spacing between individual items in the Permissions tab.
55 const CGFloat kPermissionsTabSpacing = 8; 57 const CGFloat kPermissionsTabSpacing = 8;
56 58
57 // The extra space to the left of the first tab in the tab strip. 59 // The extra space to the left of the first tab in the tab strip.
58 const CGFloat kTabStripXPadding = 19; 60 const CGFloat kTabStripXPadding = 19;
59 61
(...skipping 16 matching lines...) Expand all
76 const CGFloat kTabLabelXPadding = 12; 78 const CGFloat kTabLabelXPadding = 12;
77 79
78 // In the permission changing menu, the order of the menu items (which 80 // In the permission changing menu, the order of the menu items (which
79 // correspond to different content settings). 81 // correspond to different content settings).
80 const ContentSetting kPermissionsMenuSettings[] = { 82 const ContentSetting kPermissionsMenuSettings[] = {
81 CONTENT_SETTING_ALLOW, 83 CONTENT_SETTING_ALLOW,
82 CONTENT_SETTING_BLOCK, 84 CONTENT_SETTING_BLOCK,
83 CONTENT_SETTING_DEFAULT 85 CONTENT_SETTING_DEFAULT
84 }; 86 };
85 87
88 // Return the text color to use for the indentity status when the site's
89 // identity has been verified.
90 NSColor* IdentityVerifiedTextColor() {
91 // RGB components are specified using integer RGB [0-255] values for easy
92 // comparison to other platforms.
93 return [NSColor colorWithCalibratedRed:0x07/255.0
94 green:0x95/255.0
95 blue:0
96 alpha:1.0];
97 }
98
86 } // namespace 99 } // namespace
87 100
88 // A simple container to hold all the contents of the website settings bubble. 101 // A simple container to hold all the contents of the website settings bubble.
89 // It uses a flipped coordinate system to make text layout easier. 102 // It uses a flipped coordinate system to make text layout easier.
90 @interface WebsiteSettingsContentView : NSView 103 @interface WebsiteSettingsContentView : NSView
91 @end 104 @end
92 @implementation WebsiteSettingsContentView 105 @implementation WebsiteSettingsContentView
93 - (BOOL)isFlipped { 106 - (BOOL)isFlipped {
94 return YES; 107 return YES;
95 } 108 }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 } 255 }
243 256
244 - (void)setPresenter:(WebsiteSettings*)presenter { 257 - (void)setPresenter:(WebsiteSettings*)presenter {
245 presenter_.reset(presenter); 258 presenter_.reset(presenter);
246 } 259 }
247 260
248 // Create the subviews for the website settings bubble. 261 // Create the subviews for the website settings bubble.
249 - (void)initializeContents { 262 - (void)initializeContents {
250 // Keeps track of the position that the next control should be drawn at. 263 // Keeps track of the position that the next control should be drawn at.
251 NSPoint controlOrigin = NSMakePoint( 264 NSPoint controlOrigin = NSMakePoint(
252 kTextXPositionNoImage, 265 kFramePadding,
253 kFramePadding + info_bubble::kBubbleArrowHeight); 266 kFramePadding + info_bubble::kBubbleArrowHeight);
254 267
255 // Create the container view that uses flipped coordinates. 268 // Create the container view that uses flipped coordinates.
256 NSRect contentFrame = NSMakeRect(0, 0, kWindowWidth, 300); 269 NSRect contentFrame = NSMakeRect(0, 0, kWindowWidth, 300);
257 contentView_.reset( 270 contentView_.reset(
258 [[WebsiteSettingsContentView alloc] initWithFrame:contentFrame]); 271 [[WebsiteSettingsContentView alloc] initWithFrame:contentFrame]);
259 272
260 // Create a text field (empty for now) to show the site identity. 273 // Create a text field (empty for now) to show the site identity.
261 identityField_ = [self addText:string16() 274 identityField_ = [self addText:string16()
262 withSize:[NSFont systemFontSize] 275 withSize:[NSFont systemFontSize]
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 [segmentedControl_ setSelectedSegment:0]; 327 [segmentedControl_ setSelectedSegment:0];
315 [contentView_ addSubview:segmentedControl_]; 328 [contentView_ addSubview:segmentedControl_];
316 329
317 NSRect tabFrame = NSMakeRect(0, 0, kWindowWidth, 300); 330 NSRect tabFrame = NSMakeRect(0, 0, kWindowWidth, 300);
318 tabView_.reset([[NSTabView alloc] initWithFrame:tabFrame]); 331 tabView_.reset([[NSTabView alloc] initWithFrame:tabFrame]);
319 [tabView_ setTabViewType:NSNoTabsNoBorder]; 332 [tabView_ setTabViewType:NSNoTabsNoBorder];
320 [tabView_ setDrawsBackground:NO]; 333 [tabView_ setDrawsBackground:NO];
321 [tabView_ setControlSize:NSSmallControlSize]; 334 [tabView_ setControlSize:NSSmallControlSize];
322 [contentView_ addSubview:tabView_.get()]; 335 [contentView_ addSubview:tabView_.get()];
323 336
324 permissionsContentView_ = [self addPermissionsTabToTabView:tabView_]; 337 permissionsTabContentView_ = [self addPermissionsTabToTabView:tabView_];
325 [self addConnectionTabToTabView:tabView_]; 338 [self addConnectionTabToTabView:tabView_];
326 339
327 // Replace the window's content. 340 // Replace the window's content.
328 [[[self window] contentView] setSubviews: 341 [[[self window] contentView] setSubviews:
329 [NSArray arrayWithObject:contentView_.get()]]; 342 [NSArray arrayWithObject:contentView_.get()]];
330 343
331 [self performLayout]; 344 [self performLayout];
332 } 345 }
333 346
334 // Create the contents of the Permissions tab and add it to the given tab view. 347 // Create the contents of the Permissions tab and add it to the given tab view.
335 // Returns a weak reference to the tab view item's view. 348 // Returns a weak reference to the tab view item's view.
336 - (NSView*)addPermissionsTabToTabView:(NSTabView*)tabView { 349 - (NSView*)addPermissionsTabToTabView:(NSTabView*)tabView {
337 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]); 350 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]);
338 [tabView_ addTabViewItem:item.get()]; 351 [tabView_ addTabViewItem:item.get()];
339 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc] 352 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc]
340 initWithFrame:[tabView_ contentRect]]); 353 initWithFrame:[tabView_ contentRect]]);
341 [item setView:contentView.get()]; 354 [item setView:contentView.get()];
355
356 // Initialize the two containers that hold the controls. The initial frames
357 // are arbitrary, and will be adjusted after the controls are laid out.
358 cookiesView_ = [[WebsiteSettingsContentView alloc]
Robert Sesek 2012/08/13 17:44:57 These are leaked.
359 initWithFrame:[tabView_ contentRect]];
360 permissionsView_ = [[WebsiteSettingsContentView alloc]
361 initWithFrame:[tabView_ contentRect]];
362
363 [contentView addSubview:cookiesView_];
364 [contentView addSubview:permissionsView_];
365
342 return contentView.get(); 366 return contentView.get();
343 } 367 }
344 368
345 // Create the contents of the Connection tab and add it to the given tab view. 369 // Create the contents of the Connection tab and add it to the given tab view.
346 // Returns a weak reference to the tab view item's view. 370 // Returns a weak reference to the tab view item's view.
347 - (NSView*)addConnectionTabToTabView:(NSTabView*)tabView { 371 - (NSView*)addConnectionTabToTabView:(NSTabView*)tabView {
348 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]); 372 scoped_nsobject<NSTabViewItem> item([[NSTabViewItem alloc] init]);
349 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc] 373 scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc]
350 initWithFrame:[tabView_ contentRect]]); 374 initWithFrame:[tabView_ contentRect]]);
351 375
352 // Place all the text at the same position. It will be adjusted in 376 // Place all the text at the same position. It will be adjusted in
353 // performLayout. 377 // performLayout.
354 NSPoint textPosition = NSMakePoint( 378 NSPoint textPosition = NSMakePoint(
355 kTabViewContentsPadding + kImageSize + kImageSpacing, 379 kTabViewContentsPadding + kConnectionImageSize + kConnectionImageSpacing,
356 kTabViewContentsPadding); 380 kTabViewContentsPadding);
381 NSSize imageSize = NSMakeSize(kConnectionImageSize, kConnectionImageSize);
357 382
358 identityStatusIcon_ = 383 identityStatusIcon_ = [self addImageWithSize:imageSize
359 [self addImageToView:contentView atOffset:kTabViewContentsPadding]; 384 toView:contentView
385 atOffset:kTabViewContentsPadding];
360 identityStatusDescriptionField_ = 386 identityStatusDescriptionField_ =
361 [self addText:string16() 387 [self addText:string16()
362 withSize:[NSFont smallSystemFontSize] 388 withSize:[NSFont smallSystemFontSize]
363 bold:NO 389 bold:NO
364 toView:contentView.get() 390 toView:contentView.get()
365 atPoint:textPosition]; 391 atPoint:textPosition];
366 separatorAfterIdentity_ = [self addSeparatorToView:contentView]; 392 separatorAfterIdentity_ = [self addSeparatorToView:contentView];
367 393
368 connectionStatusIcon_ = 394 connectionStatusIcon_ = [self addImageWithSize:imageSize
369 [self addImageToView:contentView atOffset:kTabViewContentsPadding]; 395 toView:contentView
396 atOffset:kTabViewContentsPadding];
370 connectionStatusDescriptionField_ = 397 connectionStatusDescriptionField_ =
371 [self addText:string16() 398 [self addText:string16()
372 withSize:[NSFont smallSystemFontSize] 399 withSize:[NSFont smallSystemFontSize]
373 bold:NO 400 bold:NO
374 toView:contentView.get() 401 toView:contentView.get()
375 atPoint:textPosition]; 402 atPoint:textPosition];
376 separatorAfterConnection_ = [self addSeparatorToView:contentView]; 403 separatorAfterConnection_ = [self addSeparatorToView:contentView];
377 404
378 firstVisitIcon_ = 405 firstVisitIcon_ = [self addImageWithSize:imageSize
379 [self addImageToView:contentView atOffset:kTabViewContentsPadding]; 406 toView:contentView
407 atOffset:kTabViewContentsPadding];
380 firstVisitHeaderField_ = 408 firstVisitHeaderField_ =
381 [self addText:l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE) 409 [self addText:l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE)
382 withSize:[NSFont smallSystemFontSize] 410 withSize:[NSFont smallSystemFontSize]
383 bold:YES 411 bold:YES
384 toView:contentView.get() 412 toView:contentView.get()
385 atPoint:textPosition]; 413 atPoint:textPosition];
386 firstVisitDescriptionField_ = 414 firstVisitDescriptionField_ =
387 [self addText:string16() 415 [self addText:string16()
388 withSize:[NSFont smallSystemFontSize] 416 withSize:[NSFont smallSystemFontSize]
389 bold:NO 417 bold:NO
(...skipping 17 matching lines...) Expand all
407 435
408 // Layout all of the controls in the window. This should be called whenever 436 // Layout all of the controls in the window. This should be called whenever
409 // the content has changed. 437 // the content has changed.
410 - (void)performLayout { 438 - (void)performLayout {
411 // Place the identity status immediately below the identity. 439 // Place the identity status immediately below the identity.
412 [self sizeTextFieldHeightToFit:identityField_]; 440 [self sizeTextFieldHeightToFit:identityField_];
413 [self sizeTextFieldHeightToFit:identityStatusField_]; 441 [self sizeTextFieldHeightToFit:identityStatusField_];
414 CGFloat yPos = NSMaxY([identityField_ frame]) + kHeadlineSpacing; 442 CGFloat yPos = NSMaxY([identityField_ frame]) + kHeadlineSpacing;
415 yPos = [self setYPositionOfView:identityStatusField_ to:yPos]; 443 yPos = [self setYPositionOfView:identityStatusField_ to:yPos];
416 444
417 // Lay out the connection tab. 445 // Lay out the Permissions tab.
446 NSRect permissionsViewFrame = [permissionsView_ frame];
447 permissionsViewFrame.origin.y = NSMaxY([cookiesView_ frame]);
448 [permissionsView_ setFrame:permissionsViewFrame];
449
450 // Lay out the Connection tab.
418 451
419 // Lay out the identity status section. 452 // Lay out the identity status section.
420 [self sizeTextFieldHeightToFit:identityStatusDescriptionField_]; 453 [self sizeTextFieldHeightToFit:identityStatusDescriptionField_];
421 yPos = std::max(NSMaxY([identityStatusDescriptionField_ frame]), 454 yPos = std::max(NSMaxY([identityStatusDescriptionField_ frame]),
422 NSMaxY([identityStatusIcon_ frame])); 455 NSMaxY([identityStatusIcon_ frame]));
423 yPos = [self setYPositionOfView:separatorAfterIdentity_ 456 yPos = [self setYPositionOfView:separatorAfterIdentity_
424 to:yPos + kVerticalSpacing]; 457 to:yPos + kVerticalSpacing];
425 yPos += kVerticalSpacing; 458 yPos += kVerticalSpacing;
426 459
427 // Lay out the connection status section. 460 // Lay out the connection status section.
(...skipping 17 matching lines...) Expand all
445 // Adjust the tab view size and place it below the identity status. 478 // Adjust the tab view size and place it below the identity status.
446 479
447 NSRect segmentedControlFrame = [segmentedControl_ frame]; 480 NSRect segmentedControlFrame = [segmentedControl_ frame];
448 segmentedControlFrame.origin.y = 481 segmentedControlFrame.origin.y =
449 NSMaxY([identityStatusField_ frame]); 482 NSMaxY([identityStatusField_ frame]);
450 [segmentedControl_ setFrame:segmentedControlFrame]; 483 [segmentedControl_ setFrame:segmentedControlFrame];
451 484
452 NSRect tabViewFrame = [tabView_ frame]; 485 NSRect tabViewFrame = [tabView_ frame];
453 tabViewFrame.origin.y = NSMaxY(segmentedControlFrame); 486 tabViewFrame.origin.y = NSMaxY(segmentedControlFrame);
454 487
488 // Determine the height of the tab contents.
489
455 CGFloat connectionTabHeight = std::max( 490 CGFloat connectionTabHeight = std::max(
456 NSMaxY([firstVisitDescriptionField_ frame]), 491 NSMaxY([firstVisitDescriptionField_ frame]),
457 NSMaxY([firstVisitIcon_ frame ])); 492 NSMaxY([firstVisitIcon_ frame ]));
458 connectionTabHeight += kVerticalSpacing; 493 connectionTabHeight += kVerticalSpacing;
459 494
495 CGFloat permissionsTabHeight =
496 NSHeight([cookiesView_ frame]) + NSHeight([permissionsView_ frame]);
497
460 CGFloat tabContentHeight = std::max(connectionTabHeight, 498 CGFloat tabContentHeight = std::max(connectionTabHeight,
461 permissionsTabHeight_); 499 permissionsTabHeight);
462 tabViewFrame.size.height = tabContentHeight + 500 tabViewFrame.size.height = tabContentHeight +
463 NSHeight(tabViewFrame) - NSHeight([tabView_ contentRect]); 501 NSHeight(tabViewFrame) - NSHeight([tabView_ contentRect]);
464 [tabView_ setFrame:tabViewFrame]; 502 [tabView_ setFrame:tabViewFrame];
465 503
466 // Adjust the contentView to fit everything. 504 // Adjust the contentView to fit everything.
467 [contentView_ setFrame:NSMakeRect( 505 [contentView_ setFrame:NSMakeRect(
468 0, 0, kWindowWidth, NSMaxY([tabView_ frame]))]; 506 0, 0, kWindowWidth, NSMaxY([tabView_ frame]))];
469 507
470 // Now adjust and position the window. 508 // Now adjust and position the window.
471 509
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 // Create a new text field and add it to the given array of subviews. 567 // Create a new text field and add it to the given array of subviews.
530 // The array will retain a reference to the object. 568 // The array will retain a reference to the object.
531 - (NSTextField*)addText:(const string16&)text 569 - (NSTextField*)addText:(const string16&)text
532 withSize:(CGFloat)fontSize 570 withSize:(CGFloat)fontSize
533 bold:(BOOL)bold 571 bold:(BOOL)bold
534 toView:(NSView*)view 572 toView:(NSView*)view
535 atPoint:(NSPoint)point { 573 atPoint:(NSPoint)point {
536 // Size the text to take up the full available width, with some padding. 574 // Size the text to take up the full available width, with some padding.
537 // The height is arbitrary as it will be adjusted later. 575 // The height is arbitrary as it will be adjusted later.
538 CGFloat width = NSWidth([view frame]) - point.x - kFramePadding; 576 CGFloat width = NSWidth([view frame]) - point.x - kFramePadding;
539 NSRect frame = NSMakeRect(point.x, point.y, width, kImageSize); 577 NSRect frame = NSMakeRect(point.x, point.y, width, 100);
540 scoped_nsobject<NSTextField> textField( 578 scoped_nsobject<NSTextField> textField(
541 [[NSTextField alloc] initWithFrame:frame]); 579 [[NSTextField alloc] initWithFrame:frame]);
542 [self configureTextFieldAsLabel:textField.get()]; 580 [self configureTextFieldAsLabel:textField.get()];
543 [textField setStringValue:base::SysUTF16ToNSString(text)]; 581 [textField setStringValue:base::SysUTF16ToNSString(text)];
544 NSFont* font = bold ? [NSFont boldSystemFontOfSize:fontSize] 582 NSFont* font = bold ? [NSFont boldSystemFontOfSize:fontSize]
545 : [NSFont systemFontOfSize:fontSize]; 583 : [NSFont systemFontOfSize:fontSize];
546 [textField setFont:font]; 584 [textField setFont:font];
547 [self sizeTextFieldHeightToFit:textField]; 585 [self sizeTextFieldHeightToFit:textField];
548 [view addSubview:textField.get()]; 586 [view addSubview:textField.get()];
549 return textField.get(); 587 return textField.get();
550 } 588 }
551 589
552 // Add an image as a subview of the given view, placed at a pre-determined x 590 // Add an image as a subview of the given view, placed at a pre-determined x
553 // position and the given y position. Return the new NSImageView. 591 // position and the given y position. Return the new NSImageView.
554 - (NSImageView*)addImageToView:(NSView*)view 592 - (NSImageView*)addImageWithSize:(NSSize)size
555 atOffset:(CGFloat)offset { 593 toView:(NSView*)view
556 NSRect frame = NSMakeRect(kFramePadding, offset, kImageSize, kImageSize); 594 atOffset:(CGFloat)offset {
595 NSRect frame = NSMakeRect(kFramePadding, offset, size.width, size.height);
557 scoped_nsobject<NSImageView> imageView( 596 scoped_nsobject<NSImageView> imageView(
558 [[NSImageView alloc] initWithFrame:frame]); 597 [[NSImageView alloc] initWithFrame:frame]);
559 [imageView setImageFrameStyle:NSImageFrameNone]; 598 [imageView setImageFrameStyle:NSImageFrameNone];
560 [view addSubview:imageView.get()]; 599 [view addSubview:imageView.get()];
561 return imageView.get(); 600 return imageView.get();
562 } 601 }
563 602
564 // Add a separator as a subview of the given view. Return the new view. 603 // Add a separator as a subview of the given view. Return the new view.
565 - (NSView*)addSeparatorToView:(NSView*)view { 604 - (NSView*)addSeparatorToView:(NSView*)view {
566 // Take up almost the full width of the container's frame. 605 // Take up almost the full width of the container's frame.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 if (presenter_.get()) 704 if (presenter_.get())
666 presenter_->OnSitePermissionChanged(type, newSetting); 705 presenter_->OnSitePermissionChanged(type, newSetting);
667 } 706 }
668 707
669 // Adds a new row to the UI listing the permissions. Returns the amount of 708 // Adds a new row to the UI listing the permissions. Returns the amount of
670 // vertical space that was taken up by the row. 709 // vertical space that was taken up by the row.
671 - (CGFloat)addPermission: 710 - (CGFloat)addPermission:
672 (const WebsiteSettingsUI::PermissionInfo&)permissionInfo 711 (const WebsiteSettingsUI::PermissionInfo&)permissionInfo
673 toView:(NSView*)view 712 toView:(NSView*)view
674 atPoint:(NSPoint)point { 713 atPoint:(NSPoint)point {
714 // TODO(dubroy): Remove this check by refactoring GetPermissionIcon to take
715 // the PermissionInfo object as its argument.
716 ContentSetting setting = permissionInfo.setting == CONTENT_SETTING_DEFAULT ?
717 permissionInfo.default_setting : permissionInfo.setting;
718 NSImage* image = WebsiteSettingsUI::GetPermissionIcon(
719 permissionInfo.type, setting).ToNSImage();
720 NSImageView* imageView = [self addImageWithSize:[image size]
721 toView:view
722 atOffset:point.y];
723 [imageView setImage:image];
724 point.x += kPermissionImageSize + kPermissionImageSpacing;
725
675 string16 labelText = 726 string16 labelText =
676 WebsiteSettingsUI::PermissionTypeToUIString(permissionInfo.type) + 727 WebsiteSettingsUI::PermissionTypeToUIString(permissionInfo.type) +
677 ASCIIToUTF16(":"); 728 ASCIIToUTF16(":");
678 729
679 NSTextField* label = [self addText:labelText 730 NSTextField* label = [self addText:labelText
680 withSize:[NSFont smallSystemFontSize] 731 withSize:[NSFont smallSystemFontSize]
681 bold:NO 732 bold:NO
682 toView:view 733 toView:view
683 atPoint:point]; 734 atPoint:point];
684 735
685 // Shrink the label to fit the text width. 736 // Shrink the label to fit the text width.
686 NSSize requiredSize = [[label cell] cellSizeForBounds:[label frame]]; 737 NSSize requiredSize = [[label cell] cellSizeForBounds:[label frame]];
687 [label setFrameSize:requiredSize]; 738 [label setFrameSize:requiredSize];
688 739
689 NSPoint popUpPosition = NSMakePoint(NSMaxX([label frame]), point.y); 740 NSPoint popUpPosition = NSMakePoint(NSMaxX([label frame]), point.y);
690 NSPopUpButton* button = [self addPopUpButtonForPermission:permissionInfo 741 NSPopUpButton* button = [self addPopUpButtonForPermission:permissionInfo
691 toView:view 742 toView:view
692 atPoint:popUpPosition]; 743 atPoint:popUpPosition];
693 744
694 // Adjust the vertical position of the button so that its title text is 745 // Adjust the vertical position of the button so that its title text is
695 // aligned with the label. Assumes that the text is the same size in both. 746 // aligned with the label. Assumes that the text is the same size in both.
696 NSRect titleRect = [[button cell] titleRectForBounds:[button bounds]]; 747 NSRect titleRect = [[button cell] titleRectForBounds:[button bounds]];
697 popUpPosition.y -= titleRect.origin.y; 748 popUpPosition.y -= titleRect.origin.y;
698 [button setFrameOrigin:popUpPosition]; 749 [button setFrameOrigin:popUpPosition];
699 750
751 // Align the icon with the text.
752 [self alignPermissionIcon:imageView withTextField:label];
753
700 return std::max(NSHeight([label frame]), NSHeight([button frame])); 754 return std::max(NSHeight([label frame]), NSHeight([button frame]));
701 } 755 }
702 756
757 // Align an image with a text field by vertically centering the image on
758 // the cap height of the first line of text.
759 - (void)alignPermissionIcon:(NSImageView*)imageView
760 withTextField:(NSTextField*)textField {
761 NSFont* font = [textField font];
762
763 // Calculate the offset from the top of the text field.
764 CGFloat capHeight = [font capHeight];
765 CGFloat offset = (kPermissionImageSize - capHeight) / 2 -
766 ([font ascender] - capHeight) - kPermissionImageYAdjust;
767
768 NSRect frame = [imageView frame];
769 frame.origin.y -= offset;
770 [imageView setFrame:frame];
771 }
772
773 - (CGFloat)addCookieInfo:
774 (const WebsiteSettingsUI::CookieInfo&)cookieInfo
775 toView:(NSView*)view
776 atPoint:(NSPoint)point {
777 NSImage* image = WebsiteSettingsUI::GetPermissionIcon(
778 CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_ALLOW).ToNSImage();
779 NSImageView* imageView = [self addImageWithSize:[image size]
780 toView:view
781 atOffset:point.y];
782 [imageView setImage:image];
783 point.x += kPermissionImageSize + kPermissionImageSpacing;
784
785 string16 labelText = l10n_util::GetStringFUTF16(
786 IDS_WEBSITE_SETTINGS_SITE_DATA_STATS_LINE,
787 UTF8ToUTF16(cookieInfo.cookie_source),
788 base::IntToString16(cookieInfo.allowed),
789 base::IntToString16(cookieInfo.blocked));
790
791 NSTextField* label = [self addText:labelText
792 withSize:[NSFont smallSystemFontSize]
793 bold:NO
794 toView:view
795 atPoint:point];
796
797 // Shrink the label to fit the text width.
798 NSSize requiredSize = [[label cell] cellSizeForBounds:[label frame]];
799 [label setFrameSize:requiredSize];
800
801 // Align the icon with the text.
802 [self alignPermissionIcon:imageView withTextField:label];
803
804 return NSHeight([label frame]);
805 }
806
703 // Set the content of the identity and identity status fields. 807 // Set the content of the identity and identity status fields.
704 - (void)setIdentityInfo:(const WebsiteSettingsUI::IdentityInfo&)identityInfo { 808 - (void)setIdentityInfo:(const WebsiteSettingsUI::IdentityInfo&)identityInfo {
705 [identityField_ setStringValue: 809 [identityField_ setStringValue:
706 base::SysUTF8ToNSString(identityInfo.site_identity)]; 810 base::SysUTF8ToNSString(identityInfo.site_identity)];
707 [identityStatusField_ setStringValue: 811 [identityStatusField_ setStringValue:
708 base::SysUTF16ToNSString(identityInfo.GetIdentityStatusText())]; 812 base::SysUTF16ToNSString(identityInfo.GetIdentityStatusText())];
709 813
814 WebsiteSettings::SiteIdentityStatus status = identityInfo.identity_status;
815 if (status == WebsiteSettings::SITE_IDENTITY_STATUS_CERT ||
816 status == WebsiteSettings::SITE_IDENTITY_STATUS_DNSSEC_CERT ||
817 status == WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT) {
818 [identityStatusField_ setTextColor:IdentityVerifiedTextColor()];
819 }
820
710 [identityStatusIcon_ setImage:WebsiteSettingsUI::GetIdentityIcon( 821 [identityStatusIcon_ setImage:WebsiteSettingsUI::GetIdentityIcon(
711 identityInfo.identity_status).ToNSImage()]; 822 identityInfo.identity_status).ToNSImage()];
712 [identityStatusDescriptionField_ setStringValue: 823 [identityStatusDescriptionField_ setStringValue:
713 base::SysUTF8ToNSString(identityInfo.identity_status_description)]; 824 base::SysUTF8ToNSString(identityInfo.identity_status_description)];
714 825
715 [connectionStatusIcon_ setImage:WebsiteSettingsUI::GetConnectionIcon( 826 [connectionStatusIcon_ setImage:WebsiteSettingsUI::GetConnectionIcon(
716 identityInfo.connection_status).ToNSImage()]; 827 identityInfo.connection_status).ToNSImage()];
717 [connectionStatusDescriptionField_ setStringValue: 828 [connectionStatusDescriptionField_ setStringValue:
718 base::SysUTF8ToNSString(identityInfo.connection_status_description)]; 829 base::SysUTF8ToNSString(identityInfo.connection_status_description)];
719 830
720 [self performLayout]; 831 [self performLayout];
721 } 832 }
722 833
834 - (void)setCookieInfo:(const CookieInfoList&)cookieInfoList {
835 [cookiesView_ setSubviews:[NSArray array]];
836 NSPoint controlOrigin = NSMakePoint(kFramePadding, kFramePadding);
837
838 NSTextField* header = [self addText:ASCIIToUTF16("Cookies")
839 withSize:[NSFont smallSystemFontSize]
840 bold:YES
841 toView:cookiesView_
842 atPoint:controlOrigin];
843 [self sizeTextFieldHeightToFit:header];
844 controlOrigin.y += NSHeight([header frame]) + kPermissionsTabSpacing;
845
846 for (CookieInfoList::const_iterator it = cookieInfoList.begin();
847 it != cookieInfoList.end();
848 ++it) {
849 CGFloat rowHeight = [self addCookieInfo:*it
850 toView:cookiesView_
851 atPoint:controlOrigin];
852 controlOrigin.y += rowHeight + kPermissionsTabSpacing;
853 }
854 [cookiesView_ setFrameSize:NSMakeSize(kWindowWidth, controlOrigin.y)];
855 }
856
857 - (void)setPermissionInfo:(const PermissionInfoList&)permissionInfoList {
858 [permissionsView_ setSubviews:[NSArray array]];
859 NSPoint controlOrigin = NSMakePoint(kFramePadding, kFramePadding);
860
861 NSTextField* header = [self addText:ASCIIToUTF16("Permissions")
862 withSize:[NSFont smallSystemFontSize]
863 bold:YES
864 toView:permissionsView_
865 atPoint:controlOrigin];
866 [self sizeTextFieldHeightToFit:header];
867 controlOrigin.y += NSHeight([header frame]) + kPermissionsTabSpacing;
868
869 for (PermissionInfoList::const_iterator permission =
870 permissionInfoList.begin();
871 permission != permissionInfoList.end();
872 ++permission) {
873 CGFloat rowHeight = [self addPermission:*permission
874 toView:permissionsView_
875 atPoint:controlOrigin];
876 controlOrigin.y += rowHeight + kPermissionsTabSpacing;
877 }
878 [permissionsView_ setFrameSize:NSMakeSize(kWindowWidth, controlOrigin.y)];
879 }
880
723 - (void)setFirstVisit:(const string16&)firstVisit { 881 - (void)setFirstVisit:(const string16&)firstVisit {
724 [firstVisitIcon_ setImage: 882 [firstVisitIcon_ setImage:
725 WebsiteSettingsUI::GetFirstVisitIcon(firstVisit).ToNSImage()]; 883 WebsiteSettingsUI::GetFirstVisitIcon(firstVisit).ToNSImage()];
726 [firstVisitDescriptionField_ setStringValue: 884 [firstVisitDescriptionField_ setStringValue:
727 base::SysUTF16ToNSString(firstVisit)]; 885 base::SysUTF16ToNSString(firstVisit)];
728 [self performLayout]; 886 [self performLayout];
729 } 887 }
730 888
731 - (void)setPermissionInfo:(const PermissionInfoList&)permissionInfoList {
732 [permissionsContentView_ setSubviews:[NSArray array]];
733 NSPoint controlOrigin = NSMakePoint(kFramePadding, kFramePadding);
734
735 for (PermissionInfoList::const_iterator permission =
736 permissionInfoList.begin();
737 permission != permissionInfoList.end();
738 ++permission) {
739 CGFloat rowHeight = [self addPermission:*permission
740 toView:permissionsContentView_
741 atPoint:controlOrigin];
742 controlOrigin.y += rowHeight + kPermissionsTabSpacing;
743 }
744 permissionsTabHeight_ = controlOrigin.y;
745 }
746
747 @end 889 @end
748 890
749 WebsiteSettingsUIBridge::WebsiteSettingsUIBridge() 891 WebsiteSettingsUIBridge::WebsiteSettingsUIBridge()
750 : bubble_controller_(nil) { 892 : bubble_controller_(nil) {
751 } 893 }
752 894
753 WebsiteSettingsUIBridge::~WebsiteSettingsUIBridge() { 895 WebsiteSettingsUIBridge::~WebsiteSettingsUIBridge() {
754 } 896 }
755 897
756 void WebsiteSettingsUIBridge::set_bubble_controller( 898 void WebsiteSettingsUIBridge::set_bubble_controller(
(...skipping 22 matching lines...) Expand all
779 tab_contents->content_settings(), 921 tab_contents->content_settings(),
780 tab_contents->infobar_tab_helper(), 922 tab_contents->infobar_tab_helper(),
781 url, 923 url,
782 ssl, 924 ssl,
783 content::CertStore::GetInstance()); 925 content::CertStore::GetInstance());
784 [bubble_controller setPresenter:presenter]; 926 [bubble_controller setPresenter:presenter];
785 927
786 [bubble_controller showWindow:nil]; 928 [bubble_controller showWindow:nil];
787 } 929 }
788 930
931 void WebsiteSettingsUIBridge::SetIdentityInfo(
932 const WebsiteSettingsUI::IdentityInfo& identity_info) {
933 [bubble_controller_ setIdentityInfo:identity_info];
934 }
935
789 void WebsiteSettingsUIBridge::SetCookieInfo( 936 void WebsiteSettingsUIBridge::SetCookieInfo(
790 const CookieInfoList& cookie_info_list) { 937 const CookieInfoList& cookie_info_list) {
938 [bubble_controller_ setCookieInfo:cookie_info_list];
791 } 939 }
792 940
793 void WebsiteSettingsUIBridge::SetPermissionInfo( 941 void WebsiteSettingsUIBridge::SetPermissionInfo(
794 const PermissionInfoList& permission_info_list) { 942 const PermissionInfoList& permission_info_list) {
795 [bubble_controller_ setPermissionInfo:permission_info_list]; 943 [bubble_controller_ setPermissionInfo:permission_info_list];
796 } 944 }
797 945
798 void WebsiteSettingsUIBridge::SetIdentityInfo(
799 const WebsiteSettingsUI::IdentityInfo& identity_info) {
800 [bubble_controller_ setIdentityInfo:identity_info];
801 }
802
803 void WebsiteSettingsUIBridge::SetFirstVisit(const string16& first_visit) { 946 void WebsiteSettingsUIBridge::SetFirstVisit(const string16& first_visit) {
804 [bubble_controller_ setFirstVisit:first_visit]; 947 [bubble_controller_ setFirstVisit:first_visit];
805 } 948 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698