summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-24 13:10:27 +0000
committerbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-24 13:10:27 +0000
commitc433bcbf1646a985c3c1a5dd0f7d600787234a4f (patch)
tree1881dd6d37789b92a39074de639acab1fe448a3e
parent79f812306a9941dd590b503d3e2e37c0339b8351 (diff)
downloadchromium_src-c433bcbf1646a985c3c1a5dd0f7d600787234a4f.zip
chromium_src-c433bcbf1646a985c3c1a5dd0f7d600787234a4f.tar.gz
chromium_src-c433bcbf1646a985c3c1a5dd0f7d600787234a4f.tar.bz2
Implementation of 'clear' for preference settings in extension preference api
BUG=73387 TEST=browser_tests --gtest_filter=ExtensionApiTest.ContentSettingsClear Review URL: http://codereview.chromium.org/6546015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75877 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_content_settings_apitest.cc16
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc1
-rw-r--r--chrome/browser/extensions/extension_preference_api.cc28
-rw-r--r--chrome/browser/extensions/extension_preference_api.h7
-rw-r--r--chrome/common/extensions/api/extension_api.json26
-rw-r--r--chrome/common/extensions/docs/experimental.extension.html263
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js8
-rw-r--r--chrome/test/data/extensions/api_test/content_settings/clear/manifest.json7
-rw-r--r--chrome/test/data/extensions/api_test/content_settings/clear/test.html30
9 files changed, 386 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_content_settings_apitest.cc b/chrome/browser/extensions/extension_content_settings_apitest.cc
index fccfdd4..601e3ce 100644
--- a/chrome/browser/extensions/extension_content_settings_apitest.cc
+++ b/chrome/browser/extensions/extension_content_settings_apitest.cc
@@ -50,3 +50,19 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoContentSettings) {
EXPECT_FALSE(pref->IsExtensionControlled());
EXPECT_FALSE(prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
}
+
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ContentSettingsClear) {
+ CommandLine::ForCurrentProcess()->AppendSwitch(
+ switches::kEnableExperimentalExtensionApis);
+
+ PrefService* pref_service = browser()->profile()->GetPrefs();
+ pref_service->SetBoolean(prefs::kBlockThirdPartyCookies, true);
+
+ EXPECT_TRUE(RunExtensionTest("content_settings/clear")) << message_;
+
+ const PrefService::Preference* pref = pref_service->FindPreference(
+ prefs::kBlockThirdPartyCookies);
+ ASSERT_TRUE(pref);
+ EXPECT_FALSE(pref->IsExtensionControlled());
+ EXPECT_EQ(true, pref_service->GetBoolean(prefs::kBlockThirdPartyCookies));
+}
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 41b540d..bdd1555 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -303,6 +303,7 @@ void FactoryRegistry::ResetFunctions() {
// Preferences.
RegisterFunction<GetPreferenceFunction>();
RegisterFunction<SetPreferenceFunction>();
+ RegisterFunction<ClearPreferenceFunction>();
}
void FactoryRegistry::GetAllNames(std::vector<std::string>* names) {
diff --git a/chrome/browser/extensions/extension_preference_api.cc b/chrome/browser/extensions/extension_preference_api.cc
index b7d9717..1652634 100644
--- a/chrome/browser/extensions/extension_preference_api.cc
+++ b/chrome/browser/extensions/extension_preference_api.cc
@@ -70,6 +70,8 @@ const char kPermissionErrorMessage[] =
} // namespace
+// TODO(battre): Factor out common parts once this is stable.
+
GetPreferenceFunction::~GetPreferenceFunction() { }
bool GetPreferenceFunction::RunImpl() {
@@ -135,3 +137,29 @@ bool SetPreferenceFunction::RunImpl() {
value->DeepCopy());
return true;
}
+
+ClearPreferenceFunction::~ClearPreferenceFunction() { }
+
+bool ClearPreferenceFunction::RunImpl() {
+ std::string pref_key;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &pref_key));
+ DictionaryValue* details = NULL;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &details));
+
+ bool incognito = false;
+ if (details->HasKey("incognito"))
+ EXTENSION_FUNCTION_VALIDATE(details->GetBoolean("incognito", &incognito));
+
+ std::string browser_pref;
+ std::string permission;
+ EXTENSION_FUNCTION_VALIDATE(
+ PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
+ pref_key, &browser_pref, &permission));
+ if (!GetExtension()->HasApiPermission(permission)) {
+ error_ = base::StringPrintf(kPermissionErrorMessage, pref_key.c_str());
+ return false;
+ }
+ ExtensionPrefs* prefs = profile_->GetExtensionService()->extension_prefs();
+ prefs->RemoveExtensionControlledPref(extension_id(), browser_pref, incognito);
+ return true;
+}
diff --git a/chrome/browser/extensions/extension_preference_api.h b/chrome/browser/extensions/extension_preference_api.h
index 2877e91..aa276c5 100644
--- a/chrome/browser/extensions/extension_preference_api.h
+++ b/chrome/browser/extensions/extension_preference_api.h
@@ -22,4 +22,11 @@ class SetPreferenceFunction : public SyncExtensionFunction {
DECLARE_EXTENSION_FUNCTION_NAME("experimental.preferences.set")
};
+class ClearPreferenceFunction : public SyncExtensionFunction {
+ public:
+ virtual ~ClearPreferenceFunction();
+ virtual bool RunImpl();
+ DECLARE_EXTENSION_FUNCTION_NAME("experimental.preferences.clear")
+};
+
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFERENCE_API_H__
diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json
index 86662a6..a4afad4 100644
--- a/chrome/common/extensions/api/extension_api.json
+++ b/chrome/common/extensions/api/extension_api.json
@@ -4601,6 +4601,32 @@
"parameters": []
}
]
+ },
+ {
+ "name": "clear",
+ "type": "function",
+ "description": "Clears the setting in the user preferences. This way default settings can become effective again.",
+ "parameters": [
+ {
+ "name": "details",
+ "type": "object",
+ "description": "What setting to clear.",
+ "properties": {
+ "incognito": {
+ "type": "boolean",
+ "optional": true,
+ "description": "Whether to clear the setting for the incognito session only (default false)."
+ }
+ }
+ },
+ {
+ "name": "callback",
+ "type": "function",
+ "description": "Called after the preference has been cleared.",
+ "optional": true,
+ "parameters": []
+ }
+ ]
}
]
}
diff --git a/chrome/common/extensions/docs/experimental.extension.html b/chrome/common/extensions/docs/experimental.extension.html
index d250cb1..35f4380 100644
--- a/chrome/common/extensions/docs/experimental.extension.html
+++ b/chrome/common/extensions/docs/experimental.extension.html
@@ -518,6 +518,269 @@
<!-- iterates over all functions -->
<div class="apiItem">
+ <a name="method-Preference-clear"></a> <!-- method-anchor -->
+ <h4>clear</h4>
+
+ <div class="summary"><span style="display: none; ">void</span>
+ <!-- Note: intentionally longer 80 columns -->
+ <span>preference.clear</span>(<span class="null"><span style="display: none; ">, </span><span>object</span>
+ <var><span>details</span></var></span><span class="optional"><span>, </span><span>function</span>
+ <var><span>callback</span></var></span>)</div>
+
+ <div class="description">
+ <p class="todo" style="display: none; ">Undocumented.</p>
+ <p>Clears the setting in the user preferences. This way default settings can become effective again.</p>
+
+ <!-- PARAMETERS -->
+ <h4>Parameters</h4>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>details</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional" style="display: none; ">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>object</span>
+ <span style="display: none; "></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>What setting to clear.</dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>incognito</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>boolean</span>
+ <span style="display: none; "></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>Whether to clear the setting for the incognito session only (default false).</dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
+ </div><div>
+ <div>
+ <dt>
+ <var>callback</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>function</span>
+ <span style="display: none; "></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>Called after the preference has been cleared.</dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
+ </div>
+ </dl>
+
+ <!-- RETURNS -->
+ <h4 style="display: none; ">Returns</h4>
+ <dl>
+ <div style="display: none; ">
+ <div>
+ </div>
+ </div>
+ </dl>
+
+ <!-- CALLBACK -->
+ <div>
+ <div>
+ <h4>Callback function</h4>
+ <p style="display: none; ">
+ The callback <em>parameter</em> should specify a function
+ that looks like this:
+ </p>
+ <p>
+ If you specify the <em>callback</em> parameter, it should
+ specify a function that looks like this:
+ </p>
+
+ <!-- Note: intentionally longer 80 columns -->
+ <pre>function(<span></span>) <span class="subdued">{...}</span>;</pre>
+ <dl>
+ <div style="display: none; ">
+ <div>
+ </div>
+ </div>
+ </dl>
+ </div>
+ </div>
+
+ <!-- MIN_VERSION -->
+ <p style="display: none; ">
+ This function was added in version <b><span></span></b>.
+ If you require this function, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </p>
+ </div> <!-- /description -->
+
+ </div><div class="apiItem">
<a name="method-Preference-get"></a> <!-- method-anchor -->
<h4>get</h4>
diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
index 348f1ed..0d97ced8 100644
--- a/chrome/renderer/resources/extension_process_bindings.js
+++ b/chrome/renderer/resources/extension_process_bindings.js
@@ -339,6 +339,14 @@ var chrome = chrome || {};
[prefKey, details, callback],
extendSchema(setSchema));
};
+ this.clear = function(details, callback) {
+ var clearSchema = this.parameters.clear;
+ chromeHidden.validate([details, callback], clearSchema);
+ return sendRequest(customHandlers.clear ||
+ 'experimental.preferences.clear',
+ [prefKey, details, callback],
+ extendSchema(clearSchema));
+ };
};
customBindings['Preference'].prototype = new CustomBindingsObject();
}
diff --git a/chrome/test/data/extensions/api_test/content_settings/clear/manifest.json b/chrome/test/data/extensions/api_test/content_settings/clear/manifest.json
new file mode 100644
index 0000000..d91bfc1
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/content_settings/clear/manifest.json
@@ -0,0 +1,7 @@
+{
+ "name" : "Content Settings API Test Extension",
+ "version" : "0.1",
+ "description" : "Content Settings API Test Extension",
+ "permissions": [ "experimental", "contentSettings" ],
+ "background_page": "test.html"
+}
diff --git a/chrome/test/data/extensions/api_test/content_settings/clear/test.html b/chrome/test/data/extensions/api_test/content_settings/clear/test.html
new file mode 100644
index 0000000..aef3bf9
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/content_settings/clear/test.html
@@ -0,0 +1,30 @@
+<script>
+// Content settings API test
+// Run with browser_tests --gtest_filter=ExtensionApiTest.ContentSettingsClear
+
+var cs = chrome.experimental.contentSettings;
+chrome.test.runTests([
+ function getBlockThirdPartyCookies() {
+ cs.misc.blockThirdPartyCookies.get({}, chrome.test.callbackPass(
+ function(block) {
+ chrome.test.assertBool(block, true,
+ "third-party cookies should be blocked");
+ }));
+ },
+ function setBlockThirdPartyCookies() {
+ cs.misc.blockThirdPartyCookies.set(
+ {'value': false},
+ chrome.test.callbackPass());
+ },
+ function clearBlockThirdPartyCookies() {
+ cs.misc.blockThirdPartyCookies.clear({}, chrome.test.callbackPass());
+ },
+ function getBlockThirdPartyCookies2() {
+ cs.misc.blockThirdPartyCookies.get({}, chrome.test.callbackPass(
+ function(block) {
+ chrome.test.assertBool(block, true,
+ "third-party cookies should be blocked");
+ }));
+ }
+]);
+</script>