summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/api/preference/preference_api.h2
-rw-r--r--chrome/browser/extensions/api/settings_overrides/settings_overrides_api.cc86
-rw-r--r--chrome/browser/extensions/api/settings_overrides/settings_overrides_api.h41
-rw-r--r--chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc29
-rw-r--r--chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc2
-rw-r--r--chrome/chrome_browser_extensions.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/extensions/chrome_manifest_handlers.cc2
-rw-r--r--chrome/common/extensions/manifest_handlers/settings_overrides_handler.cc20
-rw-r--r--chrome/common/extensions/manifest_handlers/settings_overrides_handler.h19
-rw-r--r--chrome/common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc4
-rw-r--r--chrome/test/data/extensions/settings_override/manifest.json19
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"
+ }
+}