Add unit test for the Settings API Bubble.
[chromium-blink-merge.git] / chrome / browser / extensions / settings_api_helpers.cc
blob839098cbd4b0814000c3a36dc0a7a9ef4bb98871
1 // 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.
5 #include "chrome/browser/extensions/settings_api_helpers.h"
7 #include "chrome/browser/extensions/api/preference/preference_api.h"
8 #include "chrome/common/pref_names.h"
9 #include "extensions/browser/extension_registry.h"
10 #include "extensions/common/extension_set.h"
12 namespace extensions {
14 const extensions::SettingsOverrides* FindOverridingExtension(
15 content::BrowserContext* browser_context,
16 SettingsApiOverrideType type,
17 const Extension** extension) {
18 const extensions::ExtensionSet& extensions =
19 extensions::ExtensionRegistry::Get(browser_context)->enabled_extensions();
21 for (extensions::ExtensionSet::const_iterator it = extensions.begin();
22 it != extensions.end();
23 ++it) {
24 const extensions::SettingsOverrides* settings =
25 extensions::SettingsOverrides::Get(*it);
26 if (settings) {
27 if (type == BUBBLE_TYPE_HOME_PAGE && !settings->homepage)
28 continue;
29 if (type == BUBBLE_TYPE_STARTUP_PAGES && settings->startup_pages.empty())
30 continue;
31 if (type == BUBBLE_TYPE_SEARCH_ENGINE && !settings->search_engine)
32 continue;
34 std::string key;
35 switch (type) {
36 case BUBBLE_TYPE_HOME_PAGE:
37 key = prefs::kHomePage;
38 break;
39 case BUBBLE_TYPE_STARTUP_PAGES:
40 key = prefs::kRestoreOnStartup;
41 break;
42 case BUBBLE_TYPE_SEARCH_ENGINE:
43 key = prefs::kDefaultSearchProviderEnabled;
44 break;
47 // Found an extension overriding the current type, check if primary.
48 PreferenceAPI* preference_api = PreferenceAPI::Get(browser_context);
49 if (preference_api && // Expected to be NULL in unit tests.
50 !preference_api->DoesExtensionControlPref((*it)->id(), key, NULL))
51 continue; // Not primary.
53 // Found the primary extension, return its setting.
54 *extension = *it;
55 return settings;
59 return NULL;
62 const Extension* OverridesHomepage(content::BrowserContext* browser_context,
63 GURL* home_page_url) {
64 const extensions::Extension* extension = NULL;
65 const extensions::SettingsOverrides* settings =
66 FindOverridingExtension(
67 browser_context, BUBBLE_TYPE_HOME_PAGE, &extension);
69 if (settings && home_page_url)
70 *home_page_url = *settings->homepage;
71 return extension;
74 const Extension* OverridesStartupPages(content::BrowserContext* browser_context,
75 std::vector<GURL>* startup_pages) {
76 const extensions::Extension* extension = NULL;
77 const extensions::SettingsOverrides* settings =
78 FindOverridingExtension(
79 browser_context, BUBBLE_TYPE_STARTUP_PAGES, &extension);
80 if (settings && startup_pages) {
81 startup_pages->clear();
82 for (std::vector<GURL>::const_iterator it = settings->startup_pages.begin();
83 it != settings->startup_pages.end();
84 ++it)
85 startup_pages->push_back(GURL(*it));
87 return extension;
90 const Extension* OverridesSearchEngine(
91 content::BrowserContext* browser_context,
92 api::manifest_types::ChromeSettingsOverrides::Search_provider*
93 search_provider) {
94 const extensions::Extension* extension = NULL;
95 const extensions::SettingsOverrides* settings =
96 FindOverridingExtension(
97 browser_context, BUBBLE_TYPE_SEARCH_ENGINE, &extension);
98 if (settings && search_provider)
99 search_provider = settings->search_engine.get();
100 return extension;
103 } // namespace extensions