diff options
12 files changed, 208 insertions, 19 deletions
diff --git a/chrome/browser/extensions/api/preference/preference_api.h b/chrome/browser/extensions/api/preference/preference_api.h index 6c955e1..e706b57 100644 --- a/chrome/browser/extensions/api/preference/preference_api.h +++ b/chrome/browser/extensions/api/preference/preference_api.h @@ -180,7 +180,7 @@ class PreferenceFunction : public SyncExtensionFunction { virtual ~PreferenceFunction(); // Given an |extension_pref_key|, provides its |browser_pref_key| from the - // static map in extension_preference.cc. Returns true if the corresponding + // static map in preference_api.cc. Returns true if the corresponding // browser pref exists and the extension has the API permission needed to // modify that pref. Sets |error_| if the extension doesn't have the needed // permission. diff --git a/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc b/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc new file mode 100644 index 0000000..f1ee566 --- /dev/null +++ b/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc @@ -0,0 +1,86 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h" + +#include "base/lazy_instance.h" +#include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/extensions/api/preference/preference_api.h" +#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h" +#include "chrome/common/pref_names.h" +#include "content/public/browser/notification_details.h" +#include "content/public/browser/notification_source.h" + +namespace extensions { + +namespace { +base::LazyInstance<ProfileKeyedAPIFactory<SettingsOverridesAPI> > + g_factory = LAZY_INSTANCE_INITIALIZER; +} // namespace + +SettingsOverridesAPI::SettingsOverridesAPI(Profile* profile) + : profile_(profile) { + DCHECK(profile); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, + content::Source<Profile>(profile)); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, + content::Source<Profile>(profile)); +} + +SettingsOverridesAPI::~SettingsOverridesAPI() { +} + +ProfileKeyedAPIFactory<SettingsOverridesAPI>* + SettingsOverridesAPI::GetFactoryInstance() { + return &g_factory.Get(); +} + +void SettingsOverridesAPI::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + switch (type) { + case chrome::NOTIFICATION_EXTENSION_LOADED: { + const Extension* extension = + content::Details<const Extension>(details).ptr(); + const SettingsOverrides* settings = + SettingsOverrides::Get(extension); + if (settings && settings->homepage) { + PreferenceAPI::Get(profile_)->SetExtensionControlledPref( + extension->id(), + prefs::kHomePage, + kExtensionPrefsScopeRegular, + new base::StringValue(settings->homepage->spec())); + PreferenceAPI::Get(profile_)->SetExtensionControlledPref( + extension->id(), + prefs::kHomePageIsNewTabPage, + kExtensionPrefsScopeRegular, + new base::FundamentalValue(false)); + } + break; + } + case chrome::NOTIFICATION_EXTENSION_UNLOADED: { + const Extension* extension = + content::Details<UnloadedExtensionInfo>(details)->extension; + const SettingsOverrides* settings = SettingsOverrides::Get(extension); + if (settings && settings->homepage) { + PreferenceAPI::Get(profile_)->RemoveExtensionControlledPref( + extension->id(), + prefs::kHomePage, + kExtensionPrefsScopeRegular); + PreferenceAPI::Get(profile_)->RemoveExtensionControlledPref( + extension->id(), + prefs::kHomePageIsNewTabPage, + kExtensionPrefsScopeRegular); + } + break; + } + default: { + NOTREACHED(); + break; + } + } +} + +} // namespace extensions diff --git a/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h b/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h new file mode 100644 index 0000000..943f7b2 --- /dev/null +++ b/chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h @@ -0,0 +1,41 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_EXTENSIONS_API_SETTINGS_OVERRIDES_SETTINGS_OVERRIDES_API_H_ +#define CHROME_BROWSER_EXTENSIONS_API_SETTINGS_OVERRIDES_SETTINGS_OVERRIDES_API_H_ + +#include "base/basictypes.h" +#include "chrome/browser/extensions/api/profile_keyed_api_factory.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" + +namespace extensions { + +class SettingsOverridesAPI : public ProfileKeyedAPI, + public content::NotificationObserver { + public: + explicit SettingsOverridesAPI(Profile* profile); + virtual ~SettingsOverridesAPI(); + + // ProfileKeyedAPI implementation. + static ProfileKeyedAPIFactory<SettingsOverridesAPI>* GetFactoryInstance(); + + private: + friend class ProfileKeyedAPIFactory<SettingsOverridesAPI>; + // content::NotificationObserver implementation. + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE; + // ProfileKeyedAPI implementation. + static const char* service_name() { return "SettingsOverridesAPI"; } + + Profile* profile_; + content::NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(SettingsOverridesAPI); +}; + +} // namespace extensions + +#endif // CHROME_BROWSER_EXTENSIONS_API_SETTINGS_OVERRIDES_SETTINGS_OVERRIDES_API_H_ diff --git a/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc b/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc new file mode 100644 index 0000000..0c1b6e1 --- /dev/null +++ b/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc @@ -0,0 +1,29 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/prefs/pref_service.h" +#include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/pref_names.h" + +namespace { + +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideSettings) { + PrefService* prefs = profile()->GetPrefs(); + ASSERT_TRUE(prefs); + prefs->SetString(prefs::kHomePage, "http://google.com/"); + prefs->SetBoolean(prefs::kHomePageIsNewTabPage, true); + + const extensions::Extension* extension = LoadExtension( + test_data_dir_.AppendASCII("settings_override")); + ASSERT_TRUE(extension); + + EXPECT_EQ("http://www.homepage.com/", prefs->GetString(prefs::kHomePage)); + EXPECT_FALSE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); + UnloadExtension(extension->id()); + EXPECT_EQ("http://google.com/", prefs->GetString(prefs::kHomePage)); + EXPECT_TRUE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); +} + +} // namespace diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 6dadc79..ac1c060 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc @@ -85,6 +85,7 @@ #include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h" #include "chrome/browser/extensions/api/serial/serial_connection.h" #include "chrome/browser/extensions/api/sessions/sessions_api.h" +#include "chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h" #include "chrome/browser/extensions/api/signed_in_devices/signed_in_devices_manager.h" #include "chrome/browser/extensions/api/socket/socket.h" #include "chrome/browser/extensions/api/socket/tcp_socket.h" @@ -276,6 +277,7 @@ EnsureBrowserContextKeyedServiceFactoriesBuilt() { extensions::ProcessesAPI::GetFactoryInstance(); extensions::PushMessagingAPI::GetFactoryInstance(); extensions::SessionsAPI::GetFactoryInstance(); + extensions::SettingsOverridesAPI::GetFactoryInstance(); extensions::SignedInDevicesManager::GetFactoryInstance(); #if defined(ENABLE_SPELLCHECK) extensions::SpellcheckAPI::GetFactoryInstance(); diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index e488a0d..b5457f6 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -454,6 +454,8 @@ 'browser/extensions/api/sessions/sessions_api.h', 'browser/extensions/api/sessions/session_id.cc', 'browser/extensions/api/sessions/session_id.h', + 'browser/extensions/api/settings_overrides/settings_overrides_api.cc', + 'browser/extensions/api/settings_overrides/settings_overrides_api.h', 'browser/extensions/api/signed_in_devices/id_mapping_helper.cc', 'browser/extensions/api/signed_in_devices/id_mapping_helper.h', 'browser/extensions/api/signed_in_devices/signed_in_devices_api.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 2c96630..f74081a 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1158,6 +1158,7 @@ 'browser/extensions/api/runtime/runtime_apitest.cc', 'browser/extensions/api/serial/serial_apitest.cc', 'browser/extensions/api/sessions/sessions_apitest.cc', + 'browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc', 'browser/extensions/api/socket/socket_apitest.cc', 'browser/extensions/api/sockets_tcp/sockets_tcp_apitest.cc', 'browser/extensions/api/sockets_tcp_server/sockets_tcp_server_apitest.cc', diff --git a/chrome/common/extensions/chrome_manifest_handlers.cc b/chrome/common/extensions/chrome_manifest_handlers.cc index 970258b..f733313 100644 --- a/chrome/common/extensions/chrome_manifest_handlers.cc +++ b/chrome/common/extensions/chrome_manifest_handlers.cc @@ -87,7 +87,7 @@ void RegisterChromeManifestHandlers() { (new PluginsHandler)->Register(); (new RequirementsHandler)->Register(); (new SandboxedPageHandler)->Register(); - (new SettingsOverrideHandler)->Register(); + (new SettingsOverridesHandler)->Register(); (new ScriptBadgeHandler)->Register(); (new SharedModuleHandler)->Register(); (new SocketsHandler)->Register(); diff --git a/chrome/common/extensions/manifest_handlers/settings_overrides_handler.cc b/chrome/common/extensions/manifest_handlers/settings_overrides_handler.cc index 92e6185..e462bfd 100644 --- a/chrome/common/extensions/manifest_handlers/settings_overrides_handler.cc +++ b/chrome/common/extensions/manifest_handlers/settings_overrides_handler.cc @@ -47,15 +47,21 @@ scoped_ptr<GURL> ParseStartupPage(const ChromeSettingsOverrides& overrides, } // namespace -SettingsOverride::SettingsOverride() {} +SettingsOverrides::SettingsOverrides() {} -SettingsOverride::~SettingsOverride() {} +SettingsOverrides::~SettingsOverrides() {} -SettingsOverrideHandler::SettingsOverrideHandler() {} +const SettingsOverrides* SettingsOverrides::Get( + const Extension* extension) { + return static_cast<SettingsOverrides*>( + extension->GetManifestData(manifest_keys::kSettingsOverride)); +} + +SettingsOverridesHandler::SettingsOverridesHandler() {} -SettingsOverrideHandler::~SettingsOverrideHandler() {} +SettingsOverridesHandler::~SettingsOverridesHandler() {} -bool SettingsOverrideHandler::Parse(Extension* extension, string16* error) { +bool SettingsOverridesHandler::Parse(Extension* extension, string16* error) { const base::Value* dict = NULL; CHECK(extension->manifest()->Get(manifest_keys::kSettingsOverride, &dict)); scoped_ptr<ChromeSettingsOverrides> settings( @@ -63,7 +69,7 @@ bool SettingsOverrideHandler::Parse(Extension* extension, string16* error) { if (!settings) return false; - scoped_ptr<SettingsOverride> info(new SettingsOverride); + scoped_ptr<SettingsOverrides> info(new SettingsOverrides); info->homepage = ParseHomepage(*settings, error); info->search_engine = settings->search_provider.Pass(); info->startup_page = ParseStartupPage(*settings, error); @@ -76,7 +82,7 @@ bool SettingsOverrideHandler::Parse(Extension* extension, string16* error) { return true; } -const std::vector<std::string> SettingsOverrideHandler::Keys() const { +const std::vector<std::string> SettingsOverridesHandler::Keys() const { return SingleKey(manifest_keys::kSettingsOverride); } diff --git a/chrome/common/extensions/manifest_handlers/settings_overrides_handler.h b/chrome/common/extensions/manifest_handlers/settings_overrides_handler.h index 5be179d..459bda6 100644 --- a/chrome/common/extensions/manifest_handlers/settings_overrides_handler.h +++ b/chrome/common/extensions/manifest_handlers/settings_overrides_handler.h @@ -14,29 +14,32 @@ namespace extensions { // SettingsOverride is associated with "chrome_settings_overrides" manifest key. // An extension can add a search engine as default or non-default, overwrite the // homepage and append a startup page to the list. -struct SettingsOverride : public Extension::ManifestData { - SettingsOverride(); - virtual ~SettingsOverride(); +struct SettingsOverrides : public Extension::ManifestData { + SettingsOverrides(); + virtual ~SettingsOverrides(); + + static const SettingsOverrides* Get(const Extension* extension); scoped_ptr<api::manifest_types::ChromeSettingsOverrides::Search_provider> search_engine; scoped_ptr<GURL> homepage; scoped_ptr<GURL> startup_page; + private: - DISALLOW_COPY_AND_ASSIGN(SettingsOverride); + DISALLOW_COPY_AND_ASSIGN(SettingsOverrides); }; -class SettingsOverrideHandler : public ManifestHandler { +class SettingsOverridesHandler : public ManifestHandler { public: - SettingsOverrideHandler(); - virtual ~SettingsOverrideHandler(); + SettingsOverridesHandler(); + virtual ~SettingsOverridesHandler(); virtual bool Parse(Extension* extension, string16* error) OVERRIDE; private: virtual const std::vector<std::string> Keys() const OVERRIDE; - DISALLOW_COPY_AND_ASSIGN(SettingsOverrideHandler); + DISALLOW_COPY_AND_ASSIGN(SettingsOverridesHandler); }; } // namespace extensions diff --git a/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc b/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc index 9f4d55b..d1e039c 100644 --- a/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc +++ b/chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc @@ -35,7 +35,7 @@ const char kManifest[] = "{" using extensions::api::manifest_types::ChromeSettingsOverrides; using extensions::Extension; using extensions::Manifest; -using extensions::SettingsOverride; +using extensions::SettingsOverrides; namespace manifest_keys = extensions::manifest_keys; class DeclarativeSettingsTest : public testing::Test { @@ -59,7 +59,7 @@ TEST_F(DeclarativeSettingsTest, ParseManifest) { ASSERT_TRUE(extension); ASSERT_TRUE(extension->manifest()->HasPath(manifest_keys::kSettingsOverride)); - SettingsOverride* settings_override = static_cast<SettingsOverride*>( + SettingsOverrides* settings_override = static_cast<SettingsOverrides*>( extension->GetManifestData(manifest_keys::kSettingsOverride)); ASSERT_TRUE(settings_override); ASSERT_TRUE(settings_override->search_engine); diff --git a/chrome/test/data/extensions/settings_override/manifest.json b/chrome/test/data/extensions/settings_override/manifest.json new file mode 100644 index 0000000..b1b2a72 --- /dev/null +++ b/chrome/test/data/extensions/settings_override/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "chrome.extension.settings_override", + "version": "0.1", + "manifest_version": 2, + "description": "end-to-end browser test for chrome.settings_override API", + "chrome_settings_overrides": { + "homepage": "http://www.homepage.com", + "search_provider": { + "name": "first", + "keyword": "firstkey", + "search_url": "http://www.foo.com/s?q={searchTerms}", + "favicon_url": "http://www.foo.com/favicon.ico", + "suggest_url": "http://www.foo.com/s?q={searchTerms}", + "encoding": "UTF-8", + "is_default": true + }, + "startup_page": "http://www.startup.com" + } +} |