blob: e0b8240c533be6b5382d47de97d14195c92a36d7 [file] [log] [blame]
rdevlin.cronin4b184ca2017-01-13 01:35:441// Copyright 2016 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 "base/callback_helpers.h"
6#include "base/run_loop.h"
7#include "chrome/browser/extensions/chrome_test_extension_loader.h"
8#include "chrome/browser/extensions/extension_browsertest.h"
9#include "chrome/browser/extensions/extension_service.h"
10#include "chrome/browser/extensions/navigation_observer.h"
11#include "chrome/test/base/ui_test_utils.h"
12#include "extensions/browser/extension_dialog_auto_confirm.h"
13#include "extensions/browser/extension_prefs.h"
14#include "extensions/browser/extension_registry.h"
15#include "extensions/common/extension.h"
16
17namespace extensions {
18
19// Test that visiting an url associated with a disabled extension offers to
20// re-enable it.
21IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest,
22 PromptToReEnableExtensionsOnNavigation) {
23 NavigationObserver::SetAllowedRepeatedPromptingForTesting(true);
24 base::ScopedClosureRunner reset_repeated_prompting(base::Bind([]() {
25 NavigationObserver::SetAllowedRepeatedPromptingForTesting(false);
26 }));
27 scoped_refptr<const Extension> extension =
28 ChromeTestExtensionLoader(profile()).LoadExtension(
29 test_data_dir_.AppendASCII("simple_with_file"));
30 ASSERT_TRUE(extension);
31 const std::string kExtensionId = extension->id();
32 const GURL kUrl = extension->GetResourceURL("file.html");
33
34 // We always navigate in a new tab because when we disable the extension, it
35 // closes all tabs for that extension. If we only opened in the current tab,
36 // this would result in the only open tab being closed, and the test quitting.
37 auto navigate_to_url_in_new_tab = [this](const GURL& url) {
38 ui_test_utils::NavigateToURLWithDisposition(
39 browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
40 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
41 };
42
43 ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
44 EXPECT_TRUE(registry->enabled_extensions().Contains(kExtensionId));
45
46 // Disable the extension due to a permissions increase.
47 extension_service()->DisableExtension(
Minh X. Nguyen45479012017-08-18 21:35:3648 kExtensionId, disable_reason::DISABLE_PERMISSIONS_INCREASE);
rdevlin.cronin4b184ca2017-01-13 01:35:4449 EXPECT_TRUE(registry->disabled_extensions().Contains(kExtensionId));
50
51 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Minh X. Nguyen45479012017-08-18 21:35:3652 EXPECT_EQ(disable_reason::DISABLE_PERMISSIONS_INCREASE,
rdevlin.cronin4b184ca2017-01-13 01:35:4453 prefs->GetDisableReasons(kExtensionId));
54
55 {
56 // Visit an associated url and deny the prompt. The extension should remain
57 // disabled.
58 ScopedTestDialogAutoConfirm auto_deny(ScopedTestDialogAutoConfirm::CANCEL);
59 navigate_to_url_in_new_tab(kUrl);
60 base::RunLoop().RunUntilIdle();
61 EXPECT_TRUE(registry->disabled_extensions().Contains(kExtensionId));
Minh X. Nguyen45479012017-08-18 21:35:3662 EXPECT_EQ(disable_reason::DISABLE_PERMISSIONS_INCREASE,
rdevlin.cronin4b184ca2017-01-13 01:35:4463 prefs->GetDisableReasons(kExtensionId));
64 }
65
66 {
67 // Visit an associated url and accept the prompt. The extension should get
68 // re-enabled.
69 ScopedTestDialogAutoConfirm auto_accept(
70 ScopedTestDialogAutoConfirm::ACCEPT);
71 navigate_to_url_in_new_tab(kUrl);
72 base::RunLoop().RunUntilIdle();
73 EXPECT_TRUE(registry->enabled_extensions().Contains(kExtensionId));
Minh X. Nguyen45479012017-08-18 21:35:3674 EXPECT_EQ(disable_reason::DISABLE_NONE,
75 prefs->GetDisableReasons(kExtensionId));
rdevlin.cronin4b184ca2017-01-13 01:35:4476 }
77
78 // Disable the extension for something other than a permissions increase.
79 extension_service()->DisableExtension(kExtensionId,
Minh X. Nguyen45479012017-08-18 21:35:3680 disable_reason::DISABLE_USER_ACTION);
rdevlin.cronin4b184ca2017-01-13 01:35:4481 EXPECT_TRUE(registry->disabled_extensions().Contains(kExtensionId));
Minh X. Nguyen45479012017-08-18 21:35:3682 EXPECT_EQ(disable_reason::DISABLE_USER_ACTION,
rdevlin.cronin4b184ca2017-01-13 01:35:4483 prefs->GetDisableReasons(kExtensionId));
84
85 {
86 // We only prompt for permissions increases, not any other disable reason.
87 // As such, the extension should stay disabled.
88 ScopedTestDialogAutoConfirm auto_accept(
89 ScopedTestDialogAutoConfirm::ACCEPT);
90 navigate_to_url_in_new_tab(kUrl);
91 base::RunLoop().RunUntilIdle();
92 EXPECT_TRUE(registry->disabled_extensions().Contains(kExtensionId));
Minh X. Nguyen45479012017-08-18 21:35:3693 EXPECT_EQ(disable_reason::DISABLE_USER_ACTION,
rdevlin.cronin4b184ca2017-01-13 01:35:4494 prefs->GetDisableReasons(kExtensionId));
95 }
96
97 // Load a hosted app and disable it for a permissions increase.
98 scoped_refptr<const Extension> hosted_app =
99 ChromeTestExtensionLoader(profile()).LoadExtension(
100 test_data_dir_.AppendASCII("hosted_app"));
101 ASSERT_TRUE(hosted_app);
102 const std::string kHostedAppId = hosted_app->id();
103 const GURL kHostedAppUrl("http://localhost/extensions/hosted_app/main.html");
104 EXPECT_EQ(hosted_app, registry->enabled_extensions().GetExtensionOrAppByURL(
105 kHostedAppUrl));
106
107 extension_service()->DisableExtension(
Minh X. Nguyen45479012017-08-18 21:35:36108 kHostedAppId, disable_reason::DISABLE_PERMISSIONS_INCREASE);
rdevlin.cronin4b184ca2017-01-13 01:35:44109 EXPECT_TRUE(registry->disabled_extensions().Contains(kHostedAppId));
Minh X. Nguyen45479012017-08-18 21:35:36110 EXPECT_EQ(disable_reason::DISABLE_PERMISSIONS_INCREASE,
rdevlin.cronin4b184ca2017-01-13 01:35:44111 prefs->GetDisableReasons(kHostedAppId));
112
113 {
114 // When visiting a site that's associated with a hosted app, but not a
115 // chrome-extension url, we don't prompt to re-enable. This is to avoid
116 // prompting when visiting a regular website like calendar.google.com.
117 // See crbug.com/678631.
118 ScopedTestDialogAutoConfirm auto_accept(
119 ScopedTestDialogAutoConfirm::ACCEPT);
120 navigate_to_url_in_new_tab(kHostedAppUrl);
121 base::RunLoop().RunUntilIdle();
122 EXPECT_TRUE(registry->disabled_extensions().Contains(kHostedAppId));
Minh X. Nguyen45479012017-08-18 21:35:36123 EXPECT_EQ(disable_reason::DISABLE_PERMISSIONS_INCREASE,
rdevlin.cronin4b184ca2017-01-13 01:35:44124 prefs->GetDisableReasons(kHostedAppId));
125 }
126}
127
128} // namespace extensions