1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright (c) 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/settings_api_helpers.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/api/preference/preference_api.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/common/pref_names.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_pref_names.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/browser/extension_pref_value_map.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/browser/extension_pref_value_map_factory.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/browser/extension_registry.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_set.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace extensions { 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Returns which |extension| (if any) is overriding a particular |type| of 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// setting. 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const Extension* FindOverridingExtension( 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::BrowserContext* browser_context, 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SettingsApiOverrideType type) { 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ExtensionSet& extensions = 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionRegistry::Get(browser_context)->enabled_extensions(); 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (ExtensionSet::const_iterator it = extensions.begin(); 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it != extensions.end(); 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++it) { 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const SettingsOverrides* settings = SettingsOverrides::Get(it->get()); 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (settings) { 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (type == BUBBLE_TYPE_HOME_PAGE && !settings->homepage) 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch continue; 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (type == BUBBLE_TYPE_STARTUP_PAGES && settings->startup_pages.empty()) 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch continue; 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (type == BUBBLE_TYPE_SEARCH_ENGINE && !settings->search_engine) 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch continue; 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string key; 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switch (type) { 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case BUBBLE_TYPE_HOME_PAGE: 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch key = prefs::kHomePage; 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case BUBBLE_TYPE_STARTUP_PAGES: 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch key = prefs::kRestoreOnStartup; 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case BUBBLE_TYPE_SEARCH_ENGINE: 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch key = prefs::kDefaultSearchProviderEnabled; 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Found an extension overriding the current type, check if primary. 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PreferenceAPI* preference_api = PreferenceAPI::Get(browser_context); 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (preference_api && // Expected to be NULL in unit tests. 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !preference_api->DoesExtensionControlPref((*it)->id(), key, NULL)) 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch continue; // Not primary. 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Found the primary extension. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return it->get(); 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return NULL; 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const Extension* GetExtensionOverridingHomepage( 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserContext* browser_context) { 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return FindOverridingExtension(browser_context, BUBBLE_TYPE_HOME_PAGE); 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const Extension* GetExtensionOverridingStartupPages( 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserContext* browser_context) { 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return FindOverridingExtension(browser_context, BUBBLE_TYPE_STARTUP_PAGES); 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const Extension* GetExtensionOverridingSearchEngine( 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::BrowserContext* browser_context) { 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return FindOverridingExtension(browser_context, BUBBLE_TYPE_SEARCH_ENGINE); 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const Extension* GetExtensionOverridingProxy( 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::BrowserContext* browser_context) { 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionPrefValueMap* extension_prefs_value_map = 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionPrefValueMapFactory::GetForBrowserContext(browser_context); 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!extension_prefs_value_map) 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return NULL; // Can be null during testing. 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string extension_id = 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension_prefs_value_map->GetExtensionControllingPref(prefs::kProxy); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (extension_id.empty()) 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return NULL; 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return ExtensionRegistry::Get(browser_context)->GetExtensionById( 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension_id, ExtensionRegistry::ENABLED); 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace extensions 98