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

Side by Side Diff: chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.mm

Issue 186643005: Adds close button to cocoa permissions bubble. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: edits Created 6 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/permission_bubble_controller.h " 5 #import "chrome/browser/ui/cocoa/website_settings/permission_bubble_controller.h "
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/mac/foundation_util.h" 9 #include "base/mac/foundation_util.h"
10 #include "base/mac/mac_util.h" 10 #include "base/mac/mac_util.h"
11 #include "base/strings/sys_string_conversions.h" 11 #include "base/strings/sys_string_conversions.h"
12 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_finder.h" 13 #include "chrome/browser/ui/browser_finder.h"
14 #import "chrome/browser/ui/chrome_style.h" 14 #import "chrome/browser/ui/chrome_style.h"
15 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 15 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
16 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h" 16 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h"
17 #import "chrome/browser/ui/cocoa/hover_close_button.h"
17 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h" 18 #import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
18 #import "chrome/browser/ui/cocoa/info_bubble_view.h" 19 #import "chrome/browser/ui/cocoa/info_bubble_view.h"
19 #import "chrome/browser/ui/cocoa/info_bubble_window.h" 20 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
20 #include "chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h" 21 #include "chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h"
21 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" 22 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
22 #include "chrome/browser/ui/website_settings/permission_bubble_view.h" 23 #include "chrome/browser/ui/website_settings/permission_bubble_view.h"
23 #include "content/public/browser/user_metrics.h" 24 #include "content/public/browser/user_metrics.h"
24 #include "grit/generated_resources.h" 25 #include "grit/generated_resources.h"
25 #include "skia/ext/skia_utils_mac.h" 26 #include "skia/ext/skia_utils_mac.h"
26 #include "ui/base/cocoa/window_size_constants.h" 27 #include "ui/base/cocoa/window_size_constants.h"
27 #include "ui/base/l10n/l10n_util_mac.h" 28 #include "ui/base/l10n/l10n_util_mac.h"
28 29
29 using base::UserMetricsAction; 30 using base::UserMetricsAction;
30 31
31 namespace { 32 namespace {
32 const CGFloat kHorizontalPadding = 20.0f; 33 const CGFloat kHorizontalPadding = 20.0f;
33 const CGFloat kVerticalPadding = 20.0f; 34 const CGFloat kVerticalPadding = 20.0f;
34 const CGFloat kButtonPadding = 10.0f; 35 const CGFloat kButtonPadding = 10.0f;
35 const CGFloat kCheckboxYAdjustment = 2.0f; 36 const CGFloat kCheckboxYAdjustment = 2.0f;
36 37
37 const CGFloat kFontSize = 15.0f; 38 const CGFloat kFontSize = 15.0f;
38 const base::char16 kBulletPoint = 0x2022; 39 const base::char16 kBulletPoint = 0x2022;
39 40
40 } // namespace 41 } // namespace
41 42
42 @interface PermissionBubbleController () 43 @interface PermissionBubbleController ()
43 44
45 // Returns an autoreleased NSView displaying the label for |request|.
46 - (NSView*)labelForRequest:(PermissionBubbleRequest*)request
47 isSingleRequest:(BOOL)singleRequest;
48
49 // Returns an autoreleased NSView displaying the title for the bubble if
50 // there are multiple requests.
51 - (NSView*)titleForMultipleRequests;
52
53 // Returns an autoreleased NSView displaying a checkbox for |request|. The
54 // checkbox will be initialized as checked if |checked| is YES.
55 - (NSView*)checkboxForRequest:(PermissionBubbleRequest*)request
56 checked:(BOOL)checked;
57
58 // Returns an autoreleased NSView displaying the customize button.
59 - (NSView*)customizationButton;
60
61 // Returns an autoreleased NSView of a button with |title| and |action|.
62 // If |pairedButton| is non-nil, the size of both buttons will be set to be
63 // equal to the size of the larger of the two.
64 - (NSView*)buttonWithTitle:(NSString*)title
65 action:(SEL)action
66 pairedWith:(NSView*)pairedButton;
67
68 // Returns an autoreleased NSView displaying the close 'x' button.
69 - (NSView*)closeButton;
70
44 // Called when the 'ok' button is pressed. 71 // Called when the 'ok' button is pressed.
45 - (void)ok:(id)sender; 72 - (void)ok:(id)sender;
46 73
47 // Called when the 'allow' button is pressed. 74 // Called when the 'allow' button is pressed.
48 - (void)onAllow:(id)sender; 75 - (void)onAllow:(id)sender;
49 76
50 // Called when the 'block' button is pressed. 77 // Called when the 'block' button is pressed.
51 - (void)onBlock:(id)sender; 78 - (void)onBlock:(id)sender;
52 79
80 // Called when the 'close' button is pressed.
81 - (void)onClose:(id)sender;
82
53 // Called when the 'customize' button is pressed. 83 // Called when the 'customize' button is pressed.
54 - (void)onCustomize:(id)sender; 84 - (void)onCustomize:(id)sender;
55 85
56 // Called when a checkbox changes from checked to unchecked, or vice versa. 86 // Called when a checkbox changes from checked to unchecked, or vice versa.
57 - (void)onCheckboxChanged:(id)sender; 87 - (void)onCheckboxChanged:(id)sender;
58 88
89
59 @end 90 @end
60 91
61 @implementation PermissionBubbleController 92 @implementation PermissionBubbleController
62 93
63 - (id)initWithParentWindow:(NSWindow*)parentWindow 94 - (id)initWithParentWindow:(NSWindow*)parentWindow
64 bridge:(PermissionBubbleCocoa*)bridge { 95 bridge:(PermissionBubbleCocoa*)bridge {
65 DCHECK(parentWindow); 96 DCHECK(parentWindow);
66 DCHECK(bridge); 97 DCHECK(bridge);
67 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] 98 base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc]
68 initWithContentRect:ui::kWindowSizeDeterminedLater 99 initWithContentRect:ui::kWindowSizeDeterminedLater
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 167
137 // The maximum width of the above permissions will dictate the width of the 168 // The maximum width of the above permissions will dictate the width of the
138 // bubble. It is calculated here so that it can be used for the positioning 169 // bubble. It is calculated here so that it can be used for the positioning
139 // of the buttons. 170 // of the buttons.
140 NSRect bubbleFrame = NSZeroRect; 171 NSRect bubbleFrame = NSZeroRect;
141 for (NSView* view in [contentView subviews]) { 172 for (NSView* view in [contentView subviews]) {
142 bubbleFrame = NSUnionRect( 173 bubbleFrame = NSUnionRect(
143 bubbleFrame, NSInsetRect([view frame], -kHorizontalPadding, 0)); 174 bubbleFrame, NSInsetRect([view frame], -kHorizontalPadding, 0));
144 } 175 }
145 176
177 // 'x' button in the upper-right-hand corner.
178 base::scoped_nsobject<NSView> closeButton([[self closeButton] retain]);
179 // Place the close button at the rightmost edge of the bubble.
180 [closeButton setFrameOrigin:NSMakePoint(
181 NSMaxX(bubbleFrame), yOffset - chrome_style::kCloseButtonPadding)];
182 // Increase the size of the bubble by the width of the close button and its
183 // padding.
184 bubbleFrame.size.width +=
185 NSWidth([closeButton frame]) + chrome_style::kCloseButtonPadding;
186 [contentView addSubview:closeButton];
187
146 // Position the allow/ok button. 188 // Position the allow/ok button.
147 CGFloat xOrigin = NSWidth(bubbleFrame) - NSWidth([allowOrOkButton frame]) - 189 CGFloat xOrigin = NSWidth(bubbleFrame) - NSWidth([allowOrOkButton frame]) -
148 kHorizontalPadding; 190 kHorizontalPadding;
149 [allowOrOkButton setFrameOrigin:NSMakePoint(xOrigin, kVerticalPadding)]; 191 [allowOrOkButton setFrameOrigin:NSMakePoint(xOrigin, kVerticalPadding)];
150 [contentView addSubview:allowOrOkButton]; 192 [contentView addSubview:allowOrOkButton];
151 193
152 if (!customizationMode) { 194 if (!customizationMode) {
153 base::scoped_nsobject<NSView> blockButton( 195 base::scoped_nsobject<NSView> blockButton(
154 [[self buttonWithTitle:@"Block" 196 [[self buttonWithTitle:@"Block"
155 action:@selector(onBlock:) 197 action:@selector(onBlock:)
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 if (pairedButton) { 315 if (pairedButton) {
274 NSRect buttonFrame = [button frame]; 316 NSRect buttonFrame = [button frame];
275 NSRect pairedFrame = [pairedButton frame]; 317 NSRect pairedFrame = [pairedButton frame];
276 CGFloat width = std::max(NSWidth(buttonFrame), NSWidth(pairedFrame)); 318 CGFloat width = std::max(NSWidth(buttonFrame), NSWidth(pairedFrame));
277 [button setFrameSize:NSMakeSize(width, buttonFrame.size.height)]; 319 [button setFrameSize:NSMakeSize(width, buttonFrame.size.height)];
278 [pairedButton setFrameSize:NSMakeSize(width, pairedFrame.size.height)]; 320 [pairedButton setFrameSize:NSMakeSize(width, pairedFrame.size.height)];
279 } 321 }
280 return button.autorelease(); 322 return button.autorelease();
281 } 323 }
282 324
325 - (NSView*)closeButton {
326 int dimension = chrome_style::GetCloseButtonSize();
327 NSRect frame = NSMakeRect(0, 0, dimension, dimension);
328 base::scoped_nsobject<NSButton> button(
329 [[WebUIHoverCloseButton alloc] initWithFrame:frame]);
330 [button setAction:@selector(onClose:)];
331 [button setTarget:self];
332 return button.autorelease();
333 }
334
283 - (void)ok:(id)sender { 335 - (void)ok:(id)sender {
284 DCHECK(delegate_); 336 DCHECK(delegate_);
285 delegate_->Closing(); 337 delegate_->Closing();
286 } 338 }
287 339
288 - (void)onAllow:(id)sender { 340 - (void)onAllow:(id)sender {
289 DCHECK(delegate_); 341 DCHECK(delegate_);
290 delegate_->Accept(); 342 delegate_->Accept();
291 } 343 }
292 344
293 - (void)onBlock:(id)sender { 345 - (void)onBlock:(id)sender {
294 DCHECK(delegate_); 346 DCHECK(delegate_);
295 delegate_->Deny(); 347 delegate_->Deny();
296 } 348 }
297 349
350 - (void)onClose:(id)sender {
351 DCHECK(delegate_);
352 delegate_->Closing();
353 }
354
298 - (void)onCustomize:(id)sender { 355 - (void)onCustomize:(id)sender {
299 DCHECK(delegate_); 356 DCHECK(delegate_);
300 delegate_->SetCustomizationMode(); 357 delegate_->SetCustomizationMode();
301 } 358 }
302 359
303 - (void)onCheckboxChanged:(id)sender { 360 - (void)onCheckboxChanged:(id)sender {
304 DCHECK(delegate_); 361 DCHECK(delegate_);
305 NSButton* checkbox = base::mac::ObjCCastStrict<NSButton>(sender); 362 NSButton* checkbox = base::mac::ObjCCastStrict<NSButton>(sender);
306 delegate_->ToggleAccept([checkbox tag], [checkbox state] == NSOnState); 363 delegate_->ToggleAccept([checkbox tag], [checkbox state] == NSOnState);
307 } 364 }
308 365
309 @end // implementation PermissionBubbleController 366 @end // implementation PermissionBubbleController
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698