| 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 <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
| 6 | 6 |
| 7 #import "base/mac/scoped_nsobject.h" | 7 #import "base/mac/scoped_nsobject.h" |
| 8 #include "base/strings/sys_string_conversions.h" | 8 #include "base/strings/sys_string_conversions.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #import "chrome/browser/extensions/extension_install_prompt.h" | 10 #import "chrome/browser/extensions/extension_install_prompt.h" |
| 11 #include "chrome/browser/ui/browser.h" | 11 #include "chrome/browser/ui/browser.h" |
| 12 #include "chrome/browser/ui/cocoa/cocoa_profile_test.h" | 12 #include "chrome/browser/ui/cocoa/cocoa_profile_test.h" |
| 13 #import "chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.
h" | 13 #import "chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.
h" |
| 14 #import "chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h" | 14 #import "chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h" |
| 15 #include "extensions/common/extension.h" | 15 #include "extensions/common/extension.h" |
| 16 #include "extensions/common/permissions/permission_message_provider.h" | 16 #include "extensions/common/permissions/permission_message_provider.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #import "testing/gtest_mac.h" | 18 #import "testing/gtest_mac.h" |
| 19 | 19 |
| 20 using extensions::Extension; | 20 using extensions::Extension; |
| 21 using extensions::PermissionIDSet; | 21 using extensions::PermissionIDSet; |
| 22 using extensions::PermissionMessage; | 22 using extensions::PermissionMessage; |
| 23 using extensions::PermissionMessages; | 23 using extensions::PermissionMessages; |
| 24 | 24 |
| 25 namespace { |
| 26 |
| 27 class MockExtensionInstallViewDelegate : public ExtensionInstallViewDelegate { |
| 28 public: |
| 29 enum class Action { |
| 30 UNDEFINED, |
| 31 OKAY, |
| 32 CANCEL, |
| 33 LINK, |
| 34 }; |
| 35 |
| 36 MockExtensionInstallViewDelegate() : action_(Action::UNDEFINED) {} |
| 37 ~MockExtensionInstallViewDelegate() override {} |
| 38 |
| 39 void OnOkButtonClicked() override { SetAction(Action::OKAY); } |
| 40 void OnCancelButtonClicked() override { SetAction(Action::CANCEL); } |
| 41 void OnStoreLinkClicked() override { SetAction(Action::LINK); } |
| 42 |
| 43 Action action() const { return action_; } |
| 44 |
| 45 private: |
| 46 void SetAction(Action action) { |
| 47 if (action_ != Action::UNDEFINED) |
| 48 ADD_FAILURE() << "SetAction() called twice!"; |
| 49 action_ = action; |
| 50 } |
| 51 |
| 52 Action action_; |
| 53 |
| 54 DISALLOW_COPY_AND_ASSIGN(MockExtensionInstallViewDelegate); |
| 55 }; |
| 56 |
| 25 // Base class for our tests. | 57 // Base class for our tests. |
| 26 class ExtensionInstallViewControllerTest : public CocoaProfileTest { | 58 class ExtensionInstallViewControllerTest : public CocoaProfileTest { |
| 27 public: | 59 public: |
| 28 ExtensionInstallViewControllerTest() { | 60 ExtensionInstallViewControllerTest() { |
| 29 extension_ = chrome::LoadInstallPromptExtension(); | 61 extension_ = chrome::LoadInstallPromptExtension(); |
| 30 } | 62 } |
| 31 | 63 |
| 32 protected: | 64 protected: |
| 33 scoped_refptr<extensions::Extension> extension_; | 65 scoped_refptr<extensions::Extension> extension_; |
| 34 }; | 66 }; |
| 35 | 67 |
| 68 } // namespace |
| 69 |
| 36 // Test that we can load the two kinds of prompts correctly, that the outlets | 70 // Test that we can load the two kinds of prompts correctly, that the outlets |
| 37 // are hooked up, and that the dialog calls cancel when cancel is pressed. | 71 // are hooked up, and that the dialog calls cancel when cancel is pressed. |
| 38 TEST_F(ExtensionInstallViewControllerTest, BasicsNormalCancel) { | 72 TEST_F(ExtensionInstallViewControllerTest, BasicsNormalCancel) { |
| 39 chrome::MockExtensionInstallPromptDelegate delegate; | 73 MockExtensionInstallViewDelegate delegate; |
| 40 | 74 |
| 41 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( | 75 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( |
| 42 chrome::BuildExtensionInstallPrompt(extension_.get())); | 76 chrome::BuildExtensionInstallPrompt(extension_.get())); |
| 43 ExtensionInstallPrompt::PermissionsType type = | 77 ExtensionInstallPrompt::PermissionsType type = |
| 44 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; | 78 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; |
| 45 | 79 |
| 46 PermissionMessages permissions; | 80 PermissionMessages permissions; |
| 47 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), | 81 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), |
| 48 PermissionIDSet())); | 82 PermissionIDSet())); |
| 49 prompt->SetPermissions(permissions, type); | 83 prompt->SetPermissions(permissions, type); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 79 byItem:[outlineView itemAtRow:1]]); | 113 byItem:[outlineView itemAtRow:1]]); |
| 80 | 114 |
| 81 EXPECT_TRUE([controller cancelButton]); | 115 EXPECT_TRUE([controller cancelButton]); |
| 82 EXPECT_NE(0u, [[[controller cancelButton] stringValue] length]); | 116 EXPECT_NE(0u, [[[controller cancelButton] stringValue] length]); |
| 83 EXPECT_NE('^', [[[controller cancelButton] stringValue] characterAtIndex:0]); | 117 EXPECT_NE('^', [[[controller cancelButton] stringValue] characterAtIndex:0]); |
| 84 | 118 |
| 85 EXPECT_TRUE([controller okButton]); | 119 EXPECT_TRUE([controller okButton]); |
| 86 EXPECT_NE(0u, [[[controller okButton] stringValue] length]); | 120 EXPECT_NE(0u, [[[controller okButton] stringValue] length]); |
| 87 EXPECT_NE('^', [[[controller okButton] stringValue] characterAtIndex:0]); | 121 EXPECT_NE('^', [[[controller okButton] stringValue] characterAtIndex:0]); |
| 88 | 122 |
| 89 // Test that cancel calls our delegate. | 123 // Test that cancel calls our callback. |
| 90 [controller cancel:nil]; | 124 [controller cancel:nil]; |
| 91 EXPECT_EQ(1, delegate.abort_count()); | 125 EXPECT_EQ(MockExtensionInstallViewDelegate::Action::CANCEL, |
| 92 EXPECT_EQ(0, delegate.proceed_count()); | 126 delegate.action()); |
| 93 } | 127 } |
| 94 | 128 |
| 95 TEST_F(ExtensionInstallViewControllerTest, BasicsNormalOK) { | 129 TEST_F(ExtensionInstallViewControllerTest, BasicsNormalOK) { |
| 96 chrome::MockExtensionInstallPromptDelegate delegate; | 130 MockExtensionInstallViewDelegate delegate; |
| 97 | 131 |
| 98 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( | 132 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( |
| 99 chrome::BuildExtensionInstallPrompt(extension_.get())); | 133 chrome::BuildExtensionInstallPrompt(extension_.get())); |
| 100 ExtensionInstallPrompt::PermissionsType type = | 134 ExtensionInstallPrompt::PermissionsType type = |
| 101 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; | 135 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; |
| 102 | 136 |
| 103 PermissionMessages permissions; | 137 PermissionMessages permissions; |
| 104 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), | 138 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), |
| 105 PermissionIDSet())); | 139 PermissionIDSet())); |
| 106 prompt->SetPermissions(permissions, type); | 140 prompt->SetPermissions(permissions, type); |
| 107 | 141 |
| 108 base::scoped_nsobject<ExtensionInstallViewController> controller( | 142 base::scoped_nsobject<ExtensionInstallViewController> controller( |
| 109 [[ExtensionInstallViewController alloc] initWithProfile:profile() | 143 [[ExtensionInstallViewController alloc] initWithProfile:profile() |
| 110 navigator:browser() | 144 navigator:browser() |
| 111 delegate:&delegate | 145 delegate:&delegate |
| 112 prompt:prompt.Pass()]); | 146 prompt:prompt.Pass()]); |
| 113 | 147 |
| 114 [controller view]; // Force nib load. | 148 [controller view]; // Force nib load. |
| 115 [controller ok:nil]; | 149 [controller ok:nil]; |
| 116 | 150 |
| 117 EXPECT_EQ(0, delegate.abort_count()); | 151 EXPECT_EQ(MockExtensionInstallViewDelegate::Action::OKAY, |
| 118 EXPECT_EQ(1, delegate.proceed_count()); | 152 delegate.action()); |
| 119 } | 153 } |
| 120 | 154 |
| 121 // Test that controls get repositioned when there are two warnings vs one | 155 // Test that controls get repositioned when there are two warnings vs one |
| 122 // warning. | 156 // warning. |
| 123 TEST_F(ExtensionInstallViewControllerTest, MultipleWarnings) { | 157 TEST_F(ExtensionInstallViewControllerTest, MultipleWarnings) { |
| 124 chrome::MockExtensionInstallPromptDelegate delegate1; | 158 MockExtensionInstallViewDelegate delegate1; |
| 125 chrome::MockExtensionInstallPromptDelegate delegate2; | 159 MockExtensionInstallViewDelegate delegate2; |
| 126 | 160 |
| 127 scoped_ptr<ExtensionInstallPrompt::Prompt> one_warning_prompt( | 161 scoped_ptr<ExtensionInstallPrompt::Prompt> one_warning_prompt( |
| 128 chrome::BuildExtensionInstallPrompt(extension_.get())); | 162 chrome::BuildExtensionInstallPrompt(extension_.get())); |
| 129 ExtensionInstallPrompt::PermissionsType type = | 163 ExtensionInstallPrompt::PermissionsType type = |
| 130 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; | 164 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; |
| 131 | 165 |
| 132 PermissionMessages permissions; | 166 PermissionMessages permissions; |
| 133 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), | 167 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), |
| 134 PermissionIDSet())); | 168 PermissionIDSet())); |
| 135 one_warning_prompt->SetPermissions(permissions, type); | 169 one_warning_prompt->SetPermissions(permissions, type); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 164 ASSERT_LT([[controller1 view] frame].size.height, | 198 ASSERT_LT([[controller1 view] frame].size.height, |
| 165 [[controller2 view] frame].size.height); | 199 [[controller2 view] frame].size.height); |
| 166 | 200 |
| 167 ASSERT_LT([[controller1 view] frame].size.height, | 201 ASSERT_LT([[controller1 view] frame].size.height, |
| 168 [[controller2 view] frame].size.height); | 202 [[controller2 view] frame].size.height); |
| 169 } | 203 } |
| 170 | 204 |
| 171 // Test that we can load the skinny prompt correctly, and that the outlets are | 205 // Test that we can load the skinny prompt correctly, and that the outlets are |
| 172 // are hooked up. | 206 // are hooked up. |
| 173 TEST_F(ExtensionInstallViewControllerTest, BasicsSkinny) { | 207 TEST_F(ExtensionInstallViewControllerTest, BasicsSkinny) { |
| 174 chrome::MockExtensionInstallPromptDelegate delegate; | 208 MockExtensionInstallViewDelegate delegate; |
| 175 | 209 |
| 176 // No warnings should trigger skinny prompt. | 210 // No warnings should trigger skinny prompt. |
| 177 scoped_ptr<ExtensionInstallPrompt::Prompt> no_warnings_prompt( | 211 scoped_ptr<ExtensionInstallPrompt::Prompt> no_warnings_prompt( |
| 178 chrome::BuildExtensionInstallPrompt(extension_.get())); | 212 chrome::BuildExtensionInstallPrompt(extension_.get())); |
| 179 | 213 |
| 180 base::scoped_nsobject<ExtensionInstallViewController> controller( | 214 base::scoped_nsobject<ExtensionInstallViewController> controller( |
| 181 [[ExtensionInstallViewController alloc] | 215 [[ExtensionInstallViewController alloc] |
| 182 initWithProfile:profile() | 216 initWithProfile:profile() |
| 183 navigator:browser() | 217 navigator:browser() |
| 184 delegate:&delegate | 218 delegate:&delegate |
| (...skipping 21 matching lines...) Expand all Loading... |
| 206 EXPECT_NE(0u, [[[controller okButton] stringValue] length]); | 240 EXPECT_NE(0u, [[[controller okButton] stringValue] length]); |
| 207 EXPECT_NE('^', [[[controller okButton] stringValue] characterAtIndex:0]); | 241 EXPECT_NE('^', [[[controller okButton] stringValue] characterAtIndex:0]); |
| 208 | 242 |
| 209 EXPECT_FALSE([controller outlineView]); | 243 EXPECT_FALSE([controller outlineView]); |
| 210 } | 244 } |
| 211 | 245 |
| 212 | 246 |
| 213 // Test that we can load the inline prompt correctly, and that the outlets are | 247 // Test that we can load the inline prompt correctly, and that the outlets are |
| 214 // are hooked up. | 248 // are hooked up. |
| 215 TEST_F(ExtensionInstallViewControllerTest, BasicsInline) { | 249 TEST_F(ExtensionInstallViewControllerTest, BasicsInline) { |
| 216 chrome::MockExtensionInstallPromptDelegate delegate; | 250 MockExtensionInstallViewDelegate delegate; |
| 217 | 251 |
| 218 // No warnings should trigger skinny prompt. | 252 // No warnings should trigger skinny prompt. |
| 219 scoped_ptr<ExtensionInstallPrompt::Prompt> inline_prompt( | 253 scoped_ptr<ExtensionInstallPrompt::Prompt> inline_prompt( |
| 220 new ExtensionInstallPrompt::Prompt( | 254 new ExtensionInstallPrompt::Prompt( |
| 221 ExtensionInstallPrompt::INLINE_INSTALL_PROMPT)); | 255 ExtensionInstallPrompt::INLINE_INSTALL_PROMPT)); |
| 222 inline_prompt->SetWebstoreData("1,000", true, 3.5, 200); | 256 inline_prompt->SetWebstoreData("1,000", true, 3.5, 200); |
| 223 inline_prompt->set_extension(extension_.get()); | 257 inline_prompt->set_extension(extension_.get()); |
| 224 inline_prompt->set_icon(chrome::LoadInstallPromptIcon()); | 258 inline_prompt->set_icon(chrome::LoadInstallPromptIcon()); |
| 225 | 259 |
| 226 base::scoped_nsobject<ExtensionInstallViewController> controller( | 260 base::scoped_nsobject<ExtensionInstallViewController> controller( |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 | 300 |
| 267 // Though we have no permissions warnings, these should still be hooked up, | 301 // Though we have no permissions warnings, these should still be hooked up, |
| 268 // just invisible. | 302 // just invisible. |
| 269 EXPECT_TRUE([controller outlineView]); | 303 EXPECT_TRUE([controller outlineView]); |
| 270 EXPECT_TRUE([[[controller outlineView] enclosingScrollView] isHidden]); | 304 EXPECT_TRUE([[[controller outlineView] enclosingScrollView] isHidden]); |
| 271 EXPECT_TRUE([controller warningsSeparator]); | 305 EXPECT_TRUE([controller warningsSeparator]); |
| 272 EXPECT_TRUE([[controller warningsSeparator] isHidden]); | 306 EXPECT_TRUE([[controller warningsSeparator] isHidden]); |
| 273 } | 307 } |
| 274 | 308 |
| 275 TEST_F(ExtensionInstallViewControllerTest, PostInstallPermissionsPrompt) { | 309 TEST_F(ExtensionInstallViewControllerTest, PostInstallPermissionsPrompt) { |
| 276 chrome::MockExtensionInstallPromptDelegate delegate; | 310 MockExtensionInstallViewDelegate delegate; |
| 277 | 311 |
| 278 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( | 312 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( |
| 279 chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get())); | 313 chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get())); |
| 280 ExtensionInstallPrompt::PermissionsType type = | 314 ExtensionInstallPrompt::PermissionsType type = |
| 281 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; | 315 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; |
| 282 | 316 |
| 283 PermissionMessages permissions; | 317 PermissionMessages permissions; |
| 284 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), | 318 permissions.push_back(PermissionMessage(base::UTF8ToUTF16("warning 1"), |
| 285 PermissionIDSet())); | 319 PermissionIDSet())); |
| 286 prompt->SetPermissions(permissions, type); | 320 prompt->SetPermissions(permissions, type); |
| 287 | 321 |
| 288 base::scoped_nsobject<ExtensionInstallViewController> controller( | 322 base::scoped_nsobject<ExtensionInstallViewController> controller( |
| 289 [[ExtensionInstallViewController alloc] initWithProfile:profile() | 323 [[ExtensionInstallViewController alloc] initWithProfile:profile() |
| 290 navigator:browser() | 324 navigator:browser() |
| 291 delegate:&delegate | 325 delegate:&delegate |
| 292 prompt:prompt.Pass()]); | 326 prompt:prompt.Pass()]); |
| 293 | 327 |
| 294 [controller view]; // Force nib load. | 328 [controller view]; // Force nib load. |
| 295 | 329 |
| 296 EXPECT_TRUE([controller cancelButton]); | 330 EXPECT_TRUE([controller cancelButton]); |
| 297 EXPECT_FALSE([controller okButton]); | 331 EXPECT_FALSE([controller okButton]); |
| 298 | 332 |
| 299 [controller cancel:nil]; | 333 [controller cancel:nil]; |
| 300 EXPECT_EQ(1, delegate.abort_count()); | 334 EXPECT_EQ(MockExtensionInstallViewDelegate::Action::CANCEL, |
| 335 delegate.action()); |
| 301 } | 336 } |
| 302 | 337 |
| 303 // Test that permission details show up. | 338 // Test that permission details show up. |
| 304 TEST_F(ExtensionInstallViewControllerTest, PermissionsDetails) { | 339 TEST_F(ExtensionInstallViewControllerTest, PermissionsDetails) { |
| 305 chrome::MockExtensionInstallPromptDelegate delegate; | 340 MockExtensionInstallViewDelegate delegate; |
| 306 | 341 |
| 307 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( | 342 scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( |
| 308 chrome::BuildExtensionInstallPrompt(extension_.get())); | 343 chrome::BuildExtensionInstallPrompt(extension_.get())); |
| 309 ExtensionInstallPrompt::PermissionsType type = | 344 ExtensionInstallPrompt::PermissionsType type = |
| 310 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; | 345 ExtensionInstallPrompt::PermissionsType::REGULAR_PERMISSIONS; |
| 311 | 346 |
| 312 PermissionMessages permissions; | 347 PermissionMessages permissions; |
| 313 permissions.push_back(PermissionMessage( | 348 permissions.push_back(PermissionMessage( |
| 314 base::UTF8ToUTF16("warning 1"), | 349 base::UTF8ToUTF16("warning 1"), |
| 315 PermissionIDSet(), | 350 PermissionIDSet(), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 328 [controller view]; // Force nib load. | 363 [controller view]; // Force nib load. |
| 329 | 364 |
| 330 NSOutlineView* outlineView = [controller outlineView]; | 365 NSOutlineView* outlineView = [controller outlineView]; |
| 331 EXPECT_TRUE(outlineView); | 366 EXPECT_TRUE(outlineView); |
| 332 EXPECT_EQ(4, [outlineView numberOfRows]); | 367 EXPECT_EQ(4, [outlineView numberOfRows]); |
| 333 EXPECT_NSEQ(base::SysUTF16ToNSString(permissionString), | 368 EXPECT_NSEQ(base::SysUTF16ToNSString(permissionString), |
| 334 [[outlineView dataSource] outlineView:outlineView | 369 [[outlineView dataSource] outlineView:outlineView |
| 335 objectValueForTableColumn:nil | 370 objectValueForTableColumn:nil |
| 336 byItem:[outlineView itemAtRow:2]]); | 371 byItem:[outlineView itemAtRow:2]]); |
| 337 } | 372 } |
| OLD | NEW |