diff options
author | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-24 13:10:27 +0000 |
---|---|---|
committer | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-24 13:10:27 +0000 |
commit | c433bcbf1646a985c3c1a5dd0f7d600787234a4f (patch) | |
tree | 1881dd6d37789b92a39074de639acab1fe448a3e | |
parent | 79f812306a9941dd590b503d3e2e37c0339b8351 (diff) | |
download | chromium_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
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>
|