| OLD | NEW |
| 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/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 8 #include "chrome/browser/ui/cocoa/cocoa_test_helper.h" | 8 #include "chrome/browser/ui/cocoa/cocoa_test_helper.h" |
| 9 #include "testing/gtest_mac.h" | 9 #include "testing/gtest_mac.h" |
| 10 | 10 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 | 54 |
| 55 - (NSTextField*)firstVisitDescriptionField { | 55 - (NSTextField*)firstVisitDescriptionField { |
| 56 return firstVisitDescriptionField_; | 56 return firstVisitDescriptionField_; |
| 57 } | 57 } |
| 58 | 58 |
| 59 - (NSButton*)helpButton { | 59 - (NSButton*)helpButton { |
| 60 return helpButton_; | 60 return helpButton_; |
| 61 } | 61 } |
| 62 @end | 62 @end |
| 63 | 63 |
| 64 @interface WebsiteSettingsBubbleControllerForTesting | |
| 65 : WebsiteSettingsBubbleController { | |
| 66 @private | |
| 67 CGFloat defaultWindowWidth_; | |
| 68 } | |
| 69 @end | |
| 70 | |
| 71 @implementation WebsiteSettingsBubbleControllerForTesting | |
| 72 - (void)setDefaultWindowWidth:(CGFloat)width { | |
| 73 defaultWindowWidth_ = width; | |
| 74 } | |
| 75 - (CGFloat)defaultWindowWidth { | |
| 76 // If |defaultWindowWidth_| is 0, use the superclass implementation. | |
| 77 return defaultWindowWidth_ ? | |
| 78 defaultWindowWidth_ : [super defaultWindowWidth]; | |
| 79 } | |
| 80 @end | |
| 81 | |
| 82 namespace { | 64 namespace { |
| 83 | 65 |
| 84 // Indices of the menu items in the permission menu. | 66 // Indices of the menu items in the permission menu. |
| 85 enum PermissionMenuIndices { | 67 enum PermissionMenuIndices { |
| 86 kMenuIndexContentSettingAllow = 0, | 68 kMenuIndexContentSettingAllow = 0, |
| 87 kMenuIndexContentSettingBlock, | 69 kMenuIndexContentSettingBlock, |
| 88 kMenuIndexContentSettingDefault | 70 kMenuIndexContentSettingDefault |
| 89 }; | 71 }; |
| 90 | 72 |
| 91 const ContentSettingsType kTestPermissionTypes[] = { | |
| 92 // NOTE: FULLSCREEN does not support "Always block", so it must appear as | |
| 93 // one of the first three permissions. | |
| 94 CONTENT_SETTINGS_TYPE_FULLSCREEN, | |
| 95 CONTENT_SETTINGS_TYPE_IMAGES, | |
| 96 CONTENT_SETTINGS_TYPE_JAVASCRIPT, | |
| 97 CONTENT_SETTINGS_TYPE_PLUGINS, | |
| 98 CONTENT_SETTINGS_TYPE_POPUPS, | |
| 99 CONTENT_SETTINGS_TYPE_GEOLOCATION, | |
| 100 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 101 CONTENT_SETTINGS_TYPE_MOUSELOCK, | |
| 102 CONTENT_SETTINGS_TYPE_MEDIASTREAM, | |
| 103 }; | |
| 104 | |
| 105 const ContentSetting kTestSettings[] = { | |
| 106 CONTENT_SETTING_DEFAULT, | |
| 107 CONTENT_SETTING_DEFAULT, | |
| 108 CONTENT_SETTING_DEFAULT, | |
| 109 CONTENT_SETTING_ALLOW, | |
| 110 CONTENT_SETTING_BLOCK, | |
| 111 CONTENT_SETTING_ALLOW, | |
| 112 CONTENT_SETTING_BLOCK, | |
| 113 CONTENT_SETTING_ALLOW, | |
| 114 CONTENT_SETTING_BLOCK, | |
| 115 }; | |
| 116 | |
| 117 const ContentSetting kTestDefaultSettings[] = { | |
| 118 CONTENT_SETTING_ALLOW, | |
| 119 CONTENT_SETTING_BLOCK, | |
| 120 CONTENT_SETTING_ASK | |
| 121 }; | |
| 122 | |
| 123 const content_settings::SettingSource kTestSettingSources[] = { | |
| 124 content_settings::SETTING_SOURCE_USER, | |
| 125 content_settings::SETTING_SOURCE_USER, | |
| 126 content_settings::SETTING_SOURCE_USER, | |
| 127 content_settings::SETTING_SOURCE_USER, | |
| 128 content_settings::SETTING_SOURCE_USER, | |
| 129 content_settings::SETTING_SOURCE_POLICY, | |
| 130 content_settings::SETTING_SOURCE_POLICY, | |
| 131 content_settings::SETTING_SOURCE_EXTENSION, | |
| 132 content_settings::SETTING_SOURCE_EXTENSION, | |
| 133 }; | |
| 134 | |
| 135 class WebsiteSettingsBubbleControllerTest : public CocoaTest { | 73 class WebsiteSettingsBubbleControllerTest : public CocoaTest { |
| 136 public: | 74 public: |
| 137 WebsiteSettingsBubbleControllerTest() { | 75 WebsiteSettingsBubbleControllerTest() { |
| 138 controller_ = nil; | 76 controller_ = nil; |
| 139 } | 77 } |
| 140 | 78 |
| 141 virtual void TearDown() { | 79 virtual void TearDown() { |
| 142 [controller_ close]; | 80 [controller_ close]; |
| 143 CocoaTest::TearDown(); | 81 CocoaTest::TearDown(); |
| 144 } | 82 } |
| 145 | 83 |
| 146 protected: | 84 protected: |
| 147 WebsiteSettingsUIBridge* bridge_; // Weak, owned by controller. | 85 WebsiteSettingsUIBridge* bridge_; // Weak, owned by controller. |
| 148 | 86 |
| 149 enum MatchType { | 87 enum MatchType { |
| 150 TEXT_EQUAL = 0, | 88 TEXT_EQUAL = 0, |
| 151 TEXT_NOT_EQUAL | 89 TEXT_NOT_EQUAL |
| 152 }; | 90 }; |
| 153 | 91 |
| 154 // Creates a new website settings bubble, with the given default width. | 92 void CreateBubble() { |
| 155 // If |default_width| is 0, the *default* default width will be used. | |
| 156 void CreateBubbleWithWidth(CGFloat default_width) { | |
| 157 bridge_ = new WebsiteSettingsUIBridge(); | 93 bridge_ = new WebsiteSettingsUIBridge(); |
| 158 | 94 |
| 159 // The controller cleans up after itself when the window closes. | 95 // The controller cleans up after itself when the window closes. |
| 160 controller_ = [WebsiteSettingsBubbleControllerForTesting alloc]; | 96 controller_ = |
| 161 [controller_ setDefaultWindowWidth:default_width]; | 97 [[WebsiteSettingsBubbleController alloc] |
| 162 [controller_ initWithParentWindow:test_window() | 98 initWithParentWindow:test_window() |
| 163 websiteSettingsUIBridge:bridge_ | 99 websiteSettingsUIBridge:bridge_ |
| 164 tabContents:nil | 100 tabContents:nil |
| 165 isInternalPage:NO]; | 101 isInternalPage:NO]; |
| 166 window_ = [controller_ window]; | 102 window_ = [controller_ window]; |
| 167 [controller_ showWindow:nil]; | 103 [controller_ showWindow:nil]; |
| 168 } | 104 } |
| 169 | 105 |
| 170 void CreateBubble() { | |
| 171 CreateBubbleWithWidth(0.0); | |
| 172 } | |
| 173 | |
| 174 // Return a pointer to the first NSTextField found that either matches, or | 106 // Return a pointer to the first NSTextField found that either matches, or |
| 175 // doesn't match, the given text. | 107 // doesn't match, the given text. |
| 176 NSTextField* FindTextField(MatchType match_type, NSString* text) { | 108 NSTextField* FindTextField(MatchType match_type, NSString* text) { |
| 177 // The window's only immediate child is an invisible view that has a flipped | 109 // The window's only immediate child is an invisible view that has a flipped |
| 178 // coordinate origin. It is into this that all views get placed. | 110 // coordinate origin. It is into this that all views get placed. |
| 179 NSArray* window_subviews = [[window_ contentView] subviews]; | 111 NSArray* window_subviews = [[window_ contentView] subviews]; |
| 180 EXPECT_EQ(1U, [window_subviews count]); | 112 EXPECT_EQ(1U, [window_subviews count]); |
| 181 NSArray* subviews = [[window_subviews lastObject] subviews]; | 113 NSArray* subviews = [[window_subviews lastObject] subviews]; |
| 182 | 114 |
| 183 // Expect 4 views: the identity, identity status, the segmented control | 115 // Expect 4 views: the identity, identity status, the segmented control |
| (...skipping 14 matching lines...) Expand all Loading... |
| 198 | 130 |
| 199 NSMutableArray* FindAllSubviewsOfClass(NSView* parent_view, Class a_class) { | 131 NSMutableArray* FindAllSubviewsOfClass(NSView* parent_view, Class a_class) { |
| 200 NSMutableArray* views = [NSMutableArray array]; | 132 NSMutableArray* views = [NSMutableArray array]; |
| 201 for (NSView* view in [parent_view subviews]) { | 133 for (NSView* view in [parent_view subviews]) { |
| 202 if ([view isKindOfClass:a_class]) | 134 if ([view isKindOfClass:a_class]) |
| 203 [views addObject:view]; | 135 [views addObject:view]; |
| 204 } | 136 } |
| 205 return views; | 137 return views; |
| 206 } | 138 } |
| 207 | 139 |
| 208 // Sets up the dialog with some test permission settings. | 140 WebsiteSettingsBubbleController* controller_; // Weak, owns self. |
| 209 void SetTestPermissions() { | |
| 210 // Create a list of 5 different permissions, corresponding to all the | |
| 211 // possible settings: | |
| 212 // - [allow, block, ask] by default | |
| 213 // - [block, allow] * [by user, by policy, by extension] | |
| 214 PermissionInfoList list; | |
| 215 WebsiteSettingsUI::PermissionInfo info; | |
| 216 for (size_t i = 0; i < arraysize(kTestPermissionTypes); ++i) { | |
| 217 info.type = kTestPermissionTypes[i]; | |
| 218 info.setting = kTestSettings[i]; | |
| 219 if (info.setting == CONTENT_SETTING_DEFAULT) | |
| 220 info.default_setting = kTestDefaultSettings[i]; | |
| 221 info.source = kTestSettingSources[i]; | |
| 222 list.push_back(info); | |
| 223 } | |
| 224 bridge_->SetPermissionInfo(list); | |
| 225 } | |
| 226 | |
| 227 WebsiteSettingsBubbleControllerForTesting* controller_; // Weak, owns self. | |
| 228 NSWindow* window_; // Weak, owned by controller. | 141 NSWindow* window_; // Weak, owned by controller. |
| 229 }; | 142 }; |
| 230 | 143 |
| 231 TEST_F(WebsiteSettingsBubbleControllerTest, BasicIdentity) { | 144 TEST_F(WebsiteSettingsBubbleControllerTest, BasicIdentity) { |
| 232 WebsiteSettingsUI::IdentityInfo info; | 145 WebsiteSettingsUI::IdentityInfo info; |
| 233 info.site_identity = std::string("nhl.com"); | 146 info.site_identity = std::string("nhl.com"); |
| 234 info.identity_status = WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN; | 147 info.identity_status = WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN; |
| 235 | 148 |
| 236 CreateBubble(); | 149 CreateBubble(); |
| 237 | 150 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 | 231 |
| 319 TEST_F(WebsiteSettingsBubbleControllerTest, SetFirstVisit) { | 232 TEST_F(WebsiteSettingsBubbleControllerTest, SetFirstVisit) { |
| 320 CreateBubble(); | 233 CreateBubble(); |
| 321 bridge_->SetFirstVisit(ASCIIToUTF16("Yesterday")); | 234 bridge_->SetFirstVisit(ASCIIToUTF16("Yesterday")); |
| 322 EXPECT_NSEQ(@"Yesterday", | 235 EXPECT_NSEQ(@"Yesterday", |
| 323 [[controller_ firstVisitDescriptionField] stringValue]); | 236 [[controller_ firstVisitDescriptionField] stringValue]); |
| 324 } | 237 } |
| 325 | 238 |
| 326 TEST_F(WebsiteSettingsBubbleControllerTest, SetPermissionInfo) { | 239 TEST_F(WebsiteSettingsBubbleControllerTest, SetPermissionInfo) { |
| 327 CreateBubble(); | 240 CreateBubble(); |
| 328 SetTestPermissions(); | 241 |
| 242 const ContentSettingsType kTestPermissionTypes[] = { |
| 243 // NOTE: FULLSCREEN does not support "Always block", so it must appear as |
| 244 // one of the first three permissions. |
| 245 CONTENT_SETTINGS_TYPE_FULLSCREEN, |
| 246 CONTENT_SETTINGS_TYPE_IMAGES, |
| 247 CONTENT_SETTINGS_TYPE_JAVASCRIPT, |
| 248 CONTENT_SETTINGS_TYPE_PLUGINS, |
| 249 CONTENT_SETTINGS_TYPE_POPUPS, |
| 250 CONTENT_SETTINGS_TYPE_GEOLOCATION, |
| 251 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
| 252 CONTENT_SETTINGS_TYPE_MOUSELOCK, |
| 253 CONTENT_SETTINGS_TYPE_MEDIASTREAM, |
| 254 }; |
| 255 |
| 256 const ContentSetting kTestSettings[] = { |
| 257 CONTENT_SETTING_DEFAULT, |
| 258 CONTENT_SETTING_DEFAULT, |
| 259 CONTENT_SETTING_DEFAULT, |
| 260 CONTENT_SETTING_ALLOW, |
| 261 CONTENT_SETTING_BLOCK, |
| 262 CONTENT_SETTING_ALLOW, |
| 263 CONTENT_SETTING_BLOCK, |
| 264 CONTENT_SETTING_ALLOW, |
| 265 CONTENT_SETTING_BLOCK, |
| 266 }; |
| 267 |
| 268 const ContentSetting kTestDefaultSettings[] = { |
| 269 CONTENT_SETTING_ALLOW, |
| 270 CONTENT_SETTING_BLOCK, |
| 271 CONTENT_SETTING_ASK |
| 272 }; |
| 273 |
| 274 const content_settings::SettingSource kTestSettingSources[] = { |
| 275 content_settings::SETTING_SOURCE_USER, |
| 276 content_settings::SETTING_SOURCE_USER, |
| 277 content_settings::SETTING_SOURCE_USER, |
| 278 content_settings::SETTING_SOURCE_USER, |
| 279 content_settings::SETTING_SOURCE_USER, |
| 280 content_settings::SETTING_SOURCE_POLICY, |
| 281 content_settings::SETTING_SOURCE_POLICY, |
| 282 content_settings::SETTING_SOURCE_EXTENSION, |
| 283 content_settings::SETTING_SOURCE_EXTENSION, |
| 284 }; |
| 285 |
| 286 // Create a list of 5 different permissions, corresponding to all the |
| 287 // possible settings: |
| 288 // - [allow, block, ask] by default |
| 289 // - [block, allow] * [by user, by policy, by extension] |
| 290 PermissionInfoList list; |
| 291 WebsiteSettingsUI::PermissionInfo info; |
| 292 for (size_t i = 0; i < arraysize(kTestPermissionTypes); ++i) { |
| 293 info.type = kTestPermissionTypes[i]; |
| 294 info.setting = kTestSettings[i]; |
| 295 if (info.setting == CONTENT_SETTING_DEFAULT) |
| 296 info.default_setting = kTestDefaultSettings[i]; |
| 297 info.source = kTestSettingSources[i]; |
| 298 list.push_back(info); |
| 299 } |
| 300 bridge_->SetPermissionInfo(list); |
| 329 | 301 |
| 330 // There should be three subviews per permission (an icon, a label and a | 302 // There should be three subviews per permission (an icon, a label and a |
| 331 // select box), plus a text label for the Permission section. | 303 // select box), plus a text label for the Permission section. |
| 332 NSArray* subviews = [[controller_ permissionsView] subviews]; | 304 NSArray* subviews = [[controller_ permissionsView] subviews]; |
| 333 EXPECT_EQ(arraysize(kTestPermissionTypes) * 3 + 1, [subviews count]); | 305 EXPECT_EQ(arraysize(kTestPermissionTypes) * 3 + 1, [subviews count]); |
| 334 | 306 |
| 335 // Ensure that there is a distinct label for each permission. | 307 // Ensure that there is a distinct label for each permission. |
| 336 NSMutableSet* labels = [NSMutableSet set]; | 308 NSMutableSet* labels = [NSMutableSet set]; |
| 337 for (NSView* view in subviews) { | 309 for (NSView* view in subviews) { |
| 338 if ([view isKindOfClass:[NSTextField class]]) | 310 if ([view isKindOfClass:[NSTextField class]]) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 // (which implements the tabs) as well as the visible tab contents. | 342 // (which implements the tabs) as well as the visible tab contents. |
| 371 // NOTE: This implicitly (and deliberately) tests that the tabs appear in a | 343 // NOTE: This implicitly (and deliberately) tests that the tabs appear in a |
| 372 // specific order: Permissions, Connection. | 344 // specific order: Permissions, Connection. |
| 373 EXPECT_EQ(0, [segmentedControl selectedSegment]); | 345 EXPECT_EQ(0, [segmentedControl selectedSegment]); |
| 374 EXPECT_EQ(0, [tabView indexOfTabViewItem:[tabView selectedTabViewItem]]); | 346 EXPECT_EQ(0, [tabView indexOfTabViewItem:[tabView selectedTabViewItem]]); |
| 375 bridge_->SetSelectedTab(WebsiteSettingsUI::TAB_ID_CONNECTION); | 347 bridge_->SetSelectedTab(WebsiteSettingsUI::TAB_ID_CONNECTION); |
| 376 EXPECT_EQ(1, [segmentedControl selectedSegment]); | 348 EXPECT_EQ(1, [segmentedControl selectedSegment]); |
| 377 EXPECT_EQ(1, [tabView indexOfTabViewItem:[tabView selectedTabViewItem]]); | 349 EXPECT_EQ(1, [tabView indexOfTabViewItem:[tabView selectedTabViewItem]]); |
| 378 } | 350 } |
| 379 | 351 |
| 380 TEST_F(WebsiteSettingsBubbleControllerTest, WindowWidth) { | |
| 381 // Try creating a window that is obviously too small. | |
| 382 CreateBubbleWithWidth(30.0); | |
| 383 SetTestPermissions(); | |
| 384 | |
| 385 CGFloat window_width = NSWidth([[controller_ window] frame]); | |
| 386 | |
| 387 // Check the window was made bigger to fit the content. | |
| 388 EXPECT_LT(30.0, window_width); | |
| 389 | |
| 390 // Check that the window is wider than the right edge of all the permission | |
| 391 // popup buttons. | |
| 392 for (NSView* view in [[controller_ permissionsView] subviews]) { | |
| 393 if ([view isKindOfClass:[NSPopUpButton class]]) { | |
| 394 NSPopUpButton* button = static_cast<NSPopUpButton*>(view); | |
| 395 EXPECT_LT(NSMaxX([button frame]), window_width); | |
| 396 } | |
| 397 } | |
| 398 } | |
| 399 | |
| 400 } // namespace | 352 } // namespace |
| OLD | NEW |