| 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 #include "chrome/browser/extensions/api/file_system/file_system_api.h" | 5 #include "chrome/browser/extensions/api/file_system/file_system_api.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 #else | 78 #else |
| 79 #define ToStringType | 79 #define ToStringType |
| 80 #endif | 80 #endif |
| 81 | 81 |
| 82 #if defined(OS_CHROMEOS) | 82 #if defined(OS_CHROMEOS) |
| 83 class TestingConsentProviderDelegate | 83 class TestingConsentProviderDelegate |
| 84 : public ConsentProvider::DelegateInterface { | 84 : public ConsentProvider::DelegateInterface { |
| 85 public: | 85 public: |
| 86 TestingConsentProviderDelegate() | 86 TestingConsentProviderDelegate() |
| 87 : show_dialog_counter_(0), | 87 : show_dialog_counter_(0), |
| 88 show_notification_counter_(0), |
| 88 dialog_button_(ui::DIALOG_BUTTON_NONE), | 89 dialog_button_(ui::DIALOG_BUTTON_NONE), |
| 89 is_auto_launched_(false) {} | 90 is_auto_launched_(false) {} |
| 90 | 91 |
| 91 ~TestingConsentProviderDelegate() {} | 92 ~TestingConsentProviderDelegate() {} |
| 92 | 93 |
| 93 // Sets a fake dialog response. | 94 // Sets a fake dialog response. |
| 94 void SetDialogButton(ui::DialogButton button) { dialog_button_ = button; } | 95 void SetDialogButton(ui::DialogButton button) { dialog_button_ = button; } |
| 95 | 96 |
| 96 // Sets a fake result of detection the auto launch kiosk mode. | 97 // Sets a fake result of detection the auto launch kiosk mode. |
| 97 void SetIsAutoLaunched(bool is_auto_launched) { | 98 void SetIsAutoLaunched(bool is_auto_launched) { |
| 98 is_auto_launched_ = is_auto_launched; | 99 is_auto_launched_ = is_auto_launched; |
| 99 } | 100 } |
| 100 | 101 |
| 101 // Sets a whitelisted components list with a single id. | 102 // Sets a whitelisted components list with a single id. |
| 102 void SetComponentWhitelist(const std::string& extension_id) { | 103 void SetComponentWhitelist(const std::string& extension_id) { |
| 103 whitelisted_component_id_ = extension_id; | 104 whitelisted_component_id_ = extension_id; |
| 104 } | 105 } |
| 105 | 106 |
| 106 int show_dialog_counter() const { return show_dialog_counter_; } | 107 int show_dialog_counter() const { return show_dialog_counter_; } |
| 108 int show_notification_counter() const { return show_notification_counter_; } |
| 107 | 109 |
| 108 private: | 110 private: |
| 109 // ConsentProvider::DelegateInterface overrides: | 111 // ConsentProvider::DelegateInterface overrides: |
| 110 void ShowDialog( | 112 void ShowDialog( |
| 111 const extensions::Extension& extension, | 113 const extensions::Extension& extension, |
| 112 base::WeakPtr<Volume> volume, | 114 const base::WeakPtr<Volume>& volume, |
| 113 bool writable, | 115 bool writable, |
| 114 const ConsentProvider::ShowDialogCallback& callback) override { | 116 const ConsentProvider::ShowDialogCallback& callback) override { |
| 115 ++show_dialog_counter_; | 117 ++show_dialog_counter_; |
| 116 callback.Run(dialog_button_); | 118 callback.Run(dialog_button_); |
| 117 } | 119 } |
| 118 | 120 |
| 121 void ShowNotification(const extensions::Extension& extension, |
| 122 const base::WeakPtr<Volume>& volume, |
| 123 bool writable) override { |
| 124 ++show_notification_counter_; |
| 125 } |
| 126 |
| 119 bool IsAutoLaunched(const extensions::Extension& extension) override { | 127 bool IsAutoLaunched(const extensions::Extension& extension) override { |
| 120 return is_auto_launched_; | 128 return is_auto_launched_; |
| 121 } | 129 } |
| 122 | 130 |
| 123 bool IsWhitelistedComponent(const extensions::Extension& extension) override { | 131 bool IsWhitelistedComponent(const extensions::Extension& extension) override { |
| 124 return whitelisted_component_id_.compare(extension.id()) == 0; | 132 return whitelisted_component_id_.compare(extension.id()) == 0; |
| 125 } | 133 } |
| 126 | 134 |
| 127 int show_dialog_counter_; | 135 int show_dialog_counter_; |
| 136 int show_notification_counter_; |
| 128 ui::DialogButton dialog_button_; | 137 ui::DialogButton dialog_button_; |
| 129 bool is_auto_launched_; | 138 bool is_auto_launched_; |
| 130 std::string whitelisted_component_id_; | 139 std::string whitelisted_component_id_; |
| 131 | 140 |
| 132 DISALLOW_COPY_AND_ASSIGN(TestingConsentProviderDelegate); | 141 DISALLOW_COPY_AND_ASSIGN(TestingConsentProviderDelegate); |
| 133 }; | 142 }; |
| 134 | 143 |
| 135 // Rewrites result of a consent request from |result| to |log|. | 144 // Rewrites result of a consent request from |result| to |log|. |
| 136 void OnConsentReceived(ConsentProvider::Consent* log, | 145 void OnConsentReceived(ConsentProvider::Consent* log, |
| 137 const ConsentProvider::Consent result) { | 146 const ConsentProvider::Consent result) { |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 ConsentProvider provider(&delegate); | 332 ConsentProvider provider(&delegate); |
| 324 EXPECT_TRUE(provider.IsGrantable(*whitelisted_component_extension)); | 333 EXPECT_TRUE(provider.IsGrantable(*whitelisted_component_extension)); |
| 325 | 334 |
| 326 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 335 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 327 provider.RequestConsent(*whitelisted_component_extension.get(), volume_, | 336 provider.RequestConsent(*whitelisted_component_extension.get(), volume_, |
| 328 true /* writable */, | 337 true /* writable */, |
| 329 base::Bind(&OnConsentReceived, &result)); | 338 base::Bind(&OnConsentReceived, &result)); |
| 330 base::RunLoop().RunUntilIdle(); | 339 base::RunLoop().RunUntilIdle(); |
| 331 | 340 |
| 332 EXPECT_EQ(0, delegate.show_dialog_counter()); | 341 EXPECT_EQ(0, delegate.show_dialog_counter()); |
| 342 EXPECT_EQ(0, delegate.show_notification_counter()); |
| 333 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); | 343 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); |
| 334 } | 344 } |
| 335 | 345 |
| 336 // Non-component apps in non-kiosk mode will be rejected instantly, without | 346 // Non-component apps in non-kiosk mode will be rejected instantly, without |
| 337 // asking for user consent. | 347 // asking for user consent. |
| 338 { | 348 { |
| 339 scoped_refptr<Extension> non_component_extension( | 349 scoped_refptr<Extension> non_component_extension( |
| 340 test_util::CreateEmptyExtension()); | 350 test_util::CreateEmptyExtension()); |
| 341 TestingConsentProviderDelegate delegate; | 351 TestingConsentProviderDelegate delegate; |
| 342 ConsentProvider provider(&delegate); | 352 ConsentProvider provider(&delegate); |
| 343 EXPECT_FALSE(provider.IsGrantable(*non_component_extension)); | 353 EXPECT_FALSE(provider.IsGrantable(*non_component_extension)); |
| 344 } | 354 } |
| 345 } | 355 } |
| 346 | 356 |
| 347 TEST_F(FileSystemApiConsentProviderTest, ForKioskApps) { | 357 TEST_F(FileSystemApiConsentProviderTest, ForKioskApps) { |
| 348 // Non-component apps in auto-launch kiosk mode will be granted access | 358 // Non-component apps in auto-launch kiosk mode will be granted access |
| 349 // instantly without asking for user consent. | 359 // instantly without asking for user consent, but with a notification. |
| 350 { | 360 { |
| 351 scoped_refptr<Extension> auto_launch_kiosk_app( | 361 scoped_refptr<Extension> auto_launch_kiosk_app( |
| 352 test_util::BuildApp(ExtensionBuilder().Pass()) | 362 test_util::BuildApp(ExtensionBuilder().Pass()) |
| 353 .MergeManifest(DictionaryBuilder() | 363 .MergeManifest(DictionaryBuilder() |
| 354 .SetBoolean("kiosk_enabled", true) | 364 .SetBoolean("kiosk_enabled", true) |
| 355 .SetBoolean("kiosk_only", true)) | 365 .SetBoolean("kiosk_only", true)) |
| 356 .Build()); | 366 .Build()); |
| 357 user_manager_->AddKioskAppUser(auto_launch_kiosk_app->id()); | 367 user_manager_->AddKioskAppUser(auto_launch_kiosk_app->id()); |
| 358 user_manager_->LoginUser(auto_launch_kiosk_app->id()); | 368 user_manager_->LoginUser(auto_launch_kiosk_app->id()); |
| 359 | 369 |
| 360 TestingConsentProviderDelegate delegate; | 370 TestingConsentProviderDelegate delegate; |
| 361 delegate.SetIsAutoLaunched(true); | 371 delegate.SetIsAutoLaunched(true); |
| 362 ConsentProvider provider(&delegate); | 372 ConsentProvider provider(&delegate); |
| 363 EXPECT_TRUE(provider.IsGrantable(*auto_launch_kiosk_app)); | 373 EXPECT_TRUE(provider.IsGrantable(*auto_launch_kiosk_app)); |
| 364 | 374 |
| 365 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 375 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 366 provider.RequestConsent(*auto_launch_kiosk_app.get(), volume_, | 376 provider.RequestConsent(*auto_launch_kiosk_app.get(), volume_, |
| 367 true /* writable */, | 377 true /* writable */, |
| 368 base::Bind(&OnConsentReceived, &result)); | 378 base::Bind(&OnConsentReceived, &result)); |
| 369 base::RunLoop().RunUntilIdle(); | 379 base::RunLoop().RunUntilIdle(); |
| 370 | 380 |
| 371 EXPECT_EQ(0, delegate.show_dialog_counter()); | 381 EXPECT_EQ(0, delegate.show_dialog_counter()); |
| 382 EXPECT_EQ(1, delegate.show_notification_counter()); |
| 372 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); | 383 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); |
| 373 } | 384 } |
| 374 | 385 |
| 375 // Non-component apps in manual-launch kiosk mode will be granted access after | 386 // Non-component apps in manual-launch kiosk mode will be granted access after |
| 376 // receiving approval from the user. | 387 // receiving approval from the user. |
| 377 scoped_refptr<Extension> manual_launch_kiosk_app( | 388 scoped_refptr<Extension> manual_launch_kiosk_app( |
| 378 test_util::BuildApp(ExtensionBuilder().Pass()) | 389 test_util::BuildApp(ExtensionBuilder().Pass()) |
| 379 .MergeManifest(DictionaryBuilder() | 390 .MergeManifest(DictionaryBuilder() |
| 380 .SetBoolean("kiosk_enabled", true) | 391 .SetBoolean("kiosk_enabled", true) |
| 381 .SetBoolean("kiosk_only", true)) | 392 .SetBoolean("kiosk_only", true)) |
| 382 .Build()); | 393 .Build()); |
| 383 user_manager_->KioskAppLoggedIn(manual_launch_kiosk_app->id()); | 394 user_manager_->KioskAppLoggedIn(manual_launch_kiosk_app->id()); |
| 384 { | 395 { |
| 385 TestingConsentProviderDelegate delegate; | 396 TestingConsentProviderDelegate delegate; |
| 386 delegate.SetDialogButton(ui::DIALOG_BUTTON_OK); | 397 delegate.SetDialogButton(ui::DIALOG_BUTTON_OK); |
| 387 ConsentProvider provider(&delegate); | 398 ConsentProvider provider(&delegate); |
| 388 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); | 399 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); |
| 389 | 400 |
| 390 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 401 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 391 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_, | 402 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_, |
| 392 true /* writable */, | 403 true /* writable */, |
| 393 base::Bind(&OnConsentReceived, &result)); | 404 base::Bind(&OnConsentReceived, &result)); |
| 394 base::RunLoop().RunUntilIdle(); | 405 base::RunLoop().RunUntilIdle(); |
| 395 | 406 |
| 396 EXPECT_EQ(1, delegate.show_dialog_counter()); | 407 EXPECT_EQ(1, delegate.show_dialog_counter()); |
| 408 EXPECT_EQ(0, delegate.show_notification_counter()); |
| 397 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); | 409 EXPECT_EQ(ConsentProvider::CONSENT_GRANTED, result); |
| 398 } | 410 } |
| 399 | 411 |
| 400 // Non-component apps in manual-launch kiosk mode will be rejected access | 412 // Non-component apps in manual-launch kiosk mode will be rejected access |
| 401 // after rejecting by a user. | 413 // after rejecting by a user. |
| 402 { | 414 { |
| 403 TestingConsentProviderDelegate delegate; | 415 TestingConsentProviderDelegate delegate; |
| 404 ConsentProvider provider(&delegate); | 416 ConsentProvider provider(&delegate); |
| 405 delegate.SetDialogButton(ui::DIALOG_BUTTON_CANCEL); | 417 delegate.SetDialogButton(ui::DIALOG_BUTTON_CANCEL); |
| 406 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); | 418 EXPECT_TRUE(provider.IsGrantable(*manual_launch_kiosk_app)); |
| 407 | 419 |
| 408 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; | 420 ConsentProvider::Consent result = ConsentProvider::CONSENT_IMPOSSIBLE; |
| 409 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_, | 421 provider.RequestConsent(*manual_launch_kiosk_app.get(), volume_, |
| 410 true /* writable */, | 422 true /* writable */, |
| 411 base::Bind(&OnConsentReceived, &result)); | 423 base::Bind(&OnConsentReceived, &result)); |
| 412 base::RunLoop().RunUntilIdle(); | 424 base::RunLoop().RunUntilIdle(); |
| 413 | 425 |
| 414 EXPECT_EQ(1, delegate.show_dialog_counter()); | 426 EXPECT_EQ(1, delegate.show_dialog_counter()); |
| 427 EXPECT_EQ(0, delegate.show_notification_counter()); |
| 415 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); | 428 EXPECT_EQ(ConsentProvider::CONSENT_REJECTED, result); |
| 416 } | 429 } |
| 417 } | 430 } |
| 418 #endif | 431 #endif |
| 419 | 432 |
| 420 } // namespace extensions | 433 } // namespace extensions |
| OLD | NEW |