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