blob: 6e03168dd4ca7022a8e3e99dfb13f64e11bc59c8 [file] [log] [blame]
[email protected]2397ce82014-04-03 16:20:231// Copyright (c) 2014 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/extensions/settings_api_helpers.h"
6
7#include "chrome/browser/extensions/api/preference/preference_api.h"
8#include "chrome/common/pref_names.h"
dbeam455f3cc2016-11-17 02:08:299#include "chrome/common/url_constants.h"
abhishek.a2171c612852015-08-31 10:48:1910#include "components/proxy_config/proxy_config_pref_names.h"
[email protected]2d3e7102014-06-21 05:57:1711#include "components/search_engines/search_engines_pref_names.h"
dbeam455f3cc2016-11-17 02:08:2912#include "content/public/browser/browser_url_handler.h"
[email protected]8dc56d02014-06-07 00:44:2313#include "extensions/browser/extension_pref_value_map.h"
14#include "extensions/browser/extension_pref_value_map_factory.h"
[email protected]2397ce82014-04-03 16:20:2315#include "extensions/browser/extension_registry.h"
dbeam455f3cc2016-11-17 02:08:2916#include "extensions/common/constants.h"
[email protected]2397ce82014-04-03 16:20:2317#include "extensions/common/extension_set.h"
dbeam455f3cc2016-11-17 02:08:2918#include "url/gurl.h"
[email protected]2397ce82014-04-03 16:20:2319
20namespace extensions {
21
[email protected]8a357df2014-06-11 11:09:1322namespace {
23
24// Returns which |extension| (if any) is overriding a particular |type| of
25// setting.
26const Extension* FindOverridingExtension(
[email protected]2397ce82014-04-03 16:20:2327 content::BrowserContext* browser_context,
[email protected]8a357df2014-06-11 11:09:1328 SettingsApiOverrideType type) {
[email protected]8dc56d02014-06-07 00:44:2329 const ExtensionSet& extensions =
30 ExtensionRegistry::Get(browser_context)->enabled_extensions();
[email protected]2397ce82014-04-03 16:20:2331
[email protected]8dc56d02014-06-07 00:44:2332 for (ExtensionSet::const_iterator it = extensions.begin();
[email protected]2397ce82014-04-03 16:20:2333 it != extensions.end();
34 ++it) {
dchengc7047942014-08-26 05:05:3135 const SettingsOverrides* settings = SettingsOverrides::Get(it->get());
[email protected]2397ce82014-04-03 16:20:2336 if (settings) {
37 if (type == BUBBLE_TYPE_HOME_PAGE && !settings->homepage)
38 continue;
39 if (type == BUBBLE_TYPE_STARTUP_PAGES && settings->startup_pages.empty())
40 continue;
41 if (type == BUBBLE_TYPE_SEARCH_ENGINE && !settings->search_engine)
42 continue;
43
44 std::string key;
45 switch (type) {
46 case BUBBLE_TYPE_HOME_PAGE:
47 key = prefs::kHomePage;
48 break;
49 case BUBBLE_TYPE_STARTUP_PAGES:
50 key = prefs::kRestoreOnStartup;
51 break;
52 case BUBBLE_TYPE_SEARCH_ENGINE:
53 key = prefs::kDefaultSearchProviderEnabled;
54 break;
55 }
56
57 // Found an extension overriding the current type, check if primary.
58 PreferenceAPI* preference_api = PreferenceAPI::Get(browser_context);
59 if (preference_api && // Expected to be NULL in unit tests.
60 !preference_api->DoesExtensionControlPref((*it)->id(), key, NULL))
61 continue; // Not primary.
62
[email protected]8a357df2014-06-11 11:09:1363 // Found the primary extension.
dchengc7047942014-08-26 05:05:3164 return it->get();
[email protected]2397ce82014-04-03 16:20:2365 }
66 }
67
68 return NULL;
69}
70
[email protected]8a357df2014-06-11 11:09:1371} // namespace
[email protected]2397ce82014-04-03 16:20:2372
[email protected]8a357df2014-06-11 11:09:1373const Extension* GetExtensionOverridingHomepage(
74 content::BrowserContext* browser_context) {
75 return FindOverridingExtension(browser_context, BUBBLE_TYPE_HOME_PAGE);
[email protected]2397ce82014-04-03 16:20:2376}
77
dbeam455f3cc2016-11-17 02:08:2978const Extension* GetExtensionOverridingNewTabPage(
79 content::BrowserContext* browser_context) {
80 GURL ntp_url(chrome::kChromeUINewTabURL);
81 bool ignored;
82 content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(
83 &ntp_url, browser_context, &ignored);
84 if (ntp_url.SchemeIs(kExtensionScheme)) {
85 return ExtensionRegistry::Get(browser_context)->GetExtensionById(
86 ntp_url.host(), ExtensionRegistry::ENABLED);
87 }
88 return nullptr;
89}
90
[email protected]8dc56d02014-06-07 00:44:2391const Extension* GetExtensionOverridingStartupPages(
[email protected]8a357df2014-06-11 11:09:1392 content::BrowserContext* browser_context) {
93 return FindOverridingExtension(browser_context, BUBBLE_TYPE_STARTUP_PAGES);
[email protected]2397ce82014-04-03 16:20:2394}
95
[email protected]8dc56d02014-06-07 00:44:2396const Extension* GetExtensionOverridingSearchEngine(
[email protected]8a357df2014-06-11 11:09:1397 content::BrowserContext* browser_context) {
98 return FindOverridingExtension(browser_context, BUBBLE_TYPE_SEARCH_ENGINE);
[email protected]2397ce82014-04-03 16:20:2399}
100
[email protected]8dc56d02014-06-07 00:44:23101const Extension* GetExtensionOverridingProxy(
102 content::BrowserContext* browser_context) {
103 ExtensionPrefValueMap* extension_prefs_value_map =
104 ExtensionPrefValueMapFactory::GetForBrowserContext(browser_context);
105 if (!extension_prefs_value_map)
106 return NULL; // Can be null during testing.
107 std::string extension_id =
abhishek.a2171c612852015-08-31 10:48:19108 extension_prefs_value_map->GetExtensionControllingPref(
109 proxy_config::prefs::kProxy);
[email protected]8dc56d02014-06-07 00:44:23110 if (extension_id.empty())
111 return NULL;
112 return ExtensionRegistry::Get(browser_context)->GetExtensionById(
113 extension_id, ExtensionRegistry::ENABLED);
114}
115
[email protected]2397ce82014-04-03 16:20:23116} // namespace extensions