1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/extensions/active_tab_permission_granter_delegate_chromeos.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/run_loop.h"
11 #include "chrome/browser/chromeos/extensions/public_session_permission_helper.h"
12 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
13 #include "chromeos/login/login_state/scoped_test_public_session_login_state.h"
14 #include "extensions/browser/extension_dialog_auto_confirm.h"
15 #include "extensions/common/extension.h"
16 #include "extensions/common/extension_builder.h"
17 #include "extensions/common/value_builder.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace extensions {
21
22 namespace {
23
24 const char kWhitelistedId[] = "cbkkbcmdlboombapidmoeolnmdacpkch";
25 // Use an extension ID that will never be whitelisted.
26 const char kNonWhitelistedId[] = "bogus";
27
CreateExtension(const std::string & id)28 scoped_refptr<const Extension> CreateExtension(const std::string& id) {
29 return ExtensionBuilder("test").SetID(id).Build();
30 }
31
32 } // namespace
33
34 class ActiveTabPermissionGranterDelegateChromeOSTest
35 : public ChromeRenderViewHostTestHarness {
36 protected:
37 void SetUp() override;
38 void TearDown() override;
39
40 ActiveTabPermissionGranterDelegateChromeOS delegate_;
41 std::unique_ptr<chromeos::ScopedTestPublicSessionLoginState> login_state_;
42 };
43
SetUp()44 void ActiveTabPermissionGranterDelegateChromeOSTest::SetUp() {
45 ChromeRenderViewHostTestHarness::SetUp();
46 login_state_.reset(new chromeos::ScopedTestPublicSessionLoginState());
47 }
48
TearDown()49 void ActiveTabPermissionGranterDelegateChromeOSTest::TearDown() {
50 login_state_.reset();
51 permission_helper::ResetPermissionsForTesting();
52 ChromeRenderViewHostTestHarness::TearDown();
53 }
54
TEST_F(ActiveTabPermissionGranterDelegateChromeOSTest,GrantedForWhitelisted)55 TEST_F(ActiveTabPermissionGranterDelegateChromeOSTest, GrantedForWhitelisted) {
56 auto extension = CreateExtension(kWhitelistedId);
57 EXPECT_TRUE(delegate_.ShouldGrantActiveTabOrPrompt(extension.get(), nullptr));
58 }
59
TEST_F(ActiveTabPermissionGranterDelegateChromeOSTest,RejectedForNonWhitelisted)60 TEST_F(ActiveTabPermissionGranterDelegateChromeOSTest,
61 RejectedForNonWhitelisted) {
62 auto extension = CreateExtension(kNonWhitelistedId);
63 // Deny the permission request.
64 ScopedTestDialogAutoConfirm auto_confirm(ScopedTestDialogAutoConfirm::CANCEL);
65 // First request is always rejected (by design).
66 EXPECT_FALSE(
67 delegate_.ShouldGrantActiveTabOrPrompt(extension.get(), nullptr));
68 // Spin the loop, allowing the dialog to be resolved.
69 base::RunLoop().RunUntilIdle();
70 // Dialog result is propagated here, permission request is rejected.
71 EXPECT_FALSE(
72 delegate_.ShouldGrantActiveTabOrPrompt(extension.get(), nullptr));
73 }
74
TEST_F(ActiveTabPermissionGranterDelegateChromeOSTest,GrantedForNonWhitelisted)75 TEST_F(ActiveTabPermissionGranterDelegateChromeOSTest,
76 GrantedForNonWhitelisted) {
77 auto extension = CreateExtension(kNonWhitelistedId);
78 // Allow the permission request.
79 ScopedTestDialogAutoConfirm auto_confirm(ScopedTestDialogAutoConfirm::ACCEPT);
80 EXPECT_FALSE(
81 delegate_.ShouldGrantActiveTabOrPrompt(extension.get(), nullptr));
82 base::RunLoop().RunUntilIdle();
83 // The permission request is granted now.
84 EXPECT_TRUE(delegate_.ShouldGrantActiveTabOrPrompt(extension.get(), nullptr));
85 }
86
87 } // namespace extensions
88