Commit ded53b66 authored by finnur's avatar finnur Committed by Commit bot

Site Settings Desktop: Implement tri-state 'Delete local data on exit'.

BUG=635847, 614277
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:closure_compilation

Review-Url: https://codereview.chromium.org/2316633002
Cr-Commit-Position: refs/heads/master@{#417258}
parent ca81e7b9
......@@ -1734,6 +1734,9 @@
<message name="IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIE_SUBLABEL" desc="A sub-label below the Block 3rd-party cookie checkbox.">
Prevent third-party websites from saving and reading cookie data.
</message>
<message name="IDS_SETTINGS_SITE_SETTINGS_DELETE_DATA_POST_SESSION" desc="Label for the checkbox that allows the user to automatically delete their data at the end of the browser session.">
Keep local data only until you quit your browser
</message>
<message name="IDS_SETTINGS_SITE_SETTINGS_ADOBE_FLASH_SETTINGS" desc="The text for the link that points the user to the Adobe Flash Player Storage settings on the web">
Adobe Flash Player Storage settings
</message>
......
......@@ -262,10 +262,12 @@ var SiteSettingsBehaviorImpl = {
'siteSettingsAskBeforeAccessingRecommended') :
loadTimeData.getString('siteSettingsAskBeforeAccessing');
case settings.ContentSettingsTypes.COOKIES:
// "Allow sites to save and read cookie data" vs "Blocked".
if (!categoryEnabled) {
// Tri-state: "Allow sites to save and read cookie data" vs "Blocked"
// vs "Keep local data only until you quit your browser".
if (setting == settings.PermissionValues.BLOCK)
return loadTimeData.getString('siteSettingsBlocked');
}
if (setting == settings.PermissionValues.SESSION_ONLY)
return loadTimeData.getString('deleteDataPostSession');
return showRecommendation ?
loadTimeData.getString('siteSettingsCookiesAllowedRecommended') :
loadTimeData.getString('siteSettingsCookiesAllowed');
......
......@@ -46,7 +46,15 @@
on-change="onChangePermissionControl_"></paper-toggle-button>
</div>
<content select=".cookie-controls"></content>
<template is="dom-if" if="[[isCookiesCategory_(category)]]">
<div class="settings-box">
<paper-checkbox id="sessionOnlyCheckbox" disabled="[[!categoryEnabled]]"
checked="{{cookiesSessionOnly_}}"
on-change="onChangePermissionControl_">
<div>$i18n{deleteDataPostSession}</div>
</paper-checkbox>
</div>
</template>
<template is="dom-if" if="[[isFlashCategory_(category)]]">
<div class="settings-box two-line">
......@@ -59,6 +67,8 @@
</div>
</template>
<content select=".cookie-controls"></content>
<div class="settings-box layout horizontal">
<if expr="chromeos">
<div class="flex" hidden$="[[!isPluginCategory_(category)]]">
......
......@@ -42,7 +42,17 @@ Polymer({
flashAskFirst_: {
type: Boolean,
value: true,
}
},
/**
* Used only for Cookies to keep track of the Session Only state.
* Defaults to true, as the checkbox should be checked unless the user
* has explicitly unchecked it or has the ALLOW setting on Cookies.
*/
cookiesSessionOnly_: {
type: Boolean,
value: true,
},
},
observers: [
......@@ -71,7 +81,6 @@ Polymer({
onChangePermissionControl_: function(event) {
switch (this.category) {
case settings.ContentSettingsTypes.BACKGROUND_SYNC:
case settings.ContentSettingsTypes.COOKIES:
case settings.ContentSettingsTypes.IMAGES:
case settings.ContentSettingsTypes.JAVASCRIPT:
case settings.ContentSettingsTypes.KEYGEN:
......@@ -97,6 +106,17 @@ Polymer({
settings.PermissionValues.ASK :
settings.PermissionValues.BLOCK);
break;
case settings.ContentSettingsTypes.COOKIES:
// This category is tri-state: "Allow", "Block", "Keep data until
// browser quits".
var value = settings.PermissionValues.BLOCK;
if (this.categoryEnabled) {
value = this.cookiesSessionOnly_ ?
settings.PermissionValues.SESSION_ONLY :
settings.PermissionValues.ALLOW;
}
this.browserProxy.setDefaultValueForContentType(this.category, value);
break;
case settings.ContentSettingsTypes.PLUGINS:
// This category is tri-state: "Allow", "Block", "Ask before running".
var value = settings.PermissionValues.BLOCK;
......@@ -128,15 +148,27 @@ Polymer({
if (this.category == settings.ContentSettingsTypes.PLUGINS &&
setting == settings.PermissionValues.IMPORTANT_CONTENT) {
sliderSetting = settings.PermissionValues.ALLOW;
} else if (
this.category == settings.ContentSettingsTypes.COOKIES &&
setting == settings.PermissionValues.SESSION_ONLY) {
sliderSetting = settings.PermissionValues.ALLOW;
}
this.sliderDescription_ =
this.computeCategoryDesc(this.category, sliderSetting, true);
// The checkbox should only be cleared when the Flash setting
// is explicitly set to ALLOW.
if (this.category == settings.ContentSettingsTypes.PLUGINS &&
setting == settings.PermissionValues.ALLOW) {
this.flashAskFirst_ = false;
if (this.category == settings.ContentSettingsTypes.PLUGINS) {
// The checkbox should only be cleared when the Flash setting
// is explicitly set to ALLOW.
if (setting == settings.PermissionValues.ALLOW)
this.flashAskFirst_ = false;
if (setting == settings.PermissionValues.IMPORTANT_CONTENT)
this.flashAskFirst_ = true;
} else if (
this.category == settings.ContentSettingsTypes.COOKIES) {
if (setting == settings.PermissionValues.ALLOW)
this.cookiesSessionOnly_ = false;
else if (setting == settings.PermissionValues.SESSION_ONLY)
this.cookiesSessionOnly_ = true;
}
}.bind(this));
},
......@@ -146,6 +178,11 @@ Polymer({
return category == settings.ContentSettingsTypes.PLUGINS;
},
/** @private */
isCookiesCategory_: function(category) {
return category == settings.ContentSettingsTypes.COOKIES;
},
/**
* Returns whether this is the Plugins category.
* @param {string} category The current category.
......
......@@ -1370,6 +1370,8 @@ void AddSiteSettingsStrings(content::WebUIDataSource* html_source) {
{"thirdPartyCookie", IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIE},
{"thirdPartyCookieSublabel",
IDS_SETTINGS_SITE_SETTINGS_THIRD_PARTY_COOKIE_SUBLABEL},
{"deleteDataPostSession",
IDS_SETTINGS_SITE_SETTINGS_DELETE_DATA_POST_SESSION},
{"handlerIsDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_IS_DEFAULT},
{"handlerSetDefault", IDS_SETTINGS_SITE_SETTINGS_HANDLER_SET_DEFAULT},
{"handlerRemove", IDS_SETTINGS_SITE_SETTINGS_REMOVE},
......
......@@ -56,6 +56,19 @@ cr.define('site_settings_category', function() {
},
};
/**
* An example pref where the Cookies category is set to delete when
* session ends.
*/
var prefsCookesSessionOnly = {
defaults: {
cookies: 'session_only',
},
exceptions: {
cookies: [],
},
};
// Import necessary html before running suite.
suiteSetup(function() {
return PolymerTest.importHtml(
......@@ -150,6 +163,11 @@ cr.define('site_settings_category', function() {
assertNotEquals('', testElement.computeCategoryDesc(
category, settings.PermissionValues.IMPORTANT_CONTENT,
false));
} else if (category == settings.ContentSettingsTypes.COOKIES) {
assertNotEquals('', testElement.computeCategoryDesc(
category, settings.PermissionValues.SESSION_ONLY, true));
assertNotEquals('', testElement.computeCategoryDesc(
category, settings.PermissionValues.SESSION_ONLY, false));
}
}
......@@ -161,21 +179,20 @@ cr.define('site_settings_category', function() {
}
});
test('test special tri-state Flash category', function() {
browserProxy.setPrefs(prefsFlashDetect);
function testTristateCategory(prefs, category, thirdState, checkbox) {
browserProxy.setPrefs(prefs);
testElement.category = settings.ContentSettingsTypes.PLUGINS;
testElement.category = category;
var askCheckbox = null;
return browserProxy.whenCalled('getDefaultValueForContentType').then(
function(contentType) {
Polymer.dom.flush();
askCheckbox = testElement.$$('#flashAskCheckbox');
askCheckbox = testElement.$$(checkbox);
assertTrue(!!askCheckbox);
assertEquals(
settings.ContentSettingsTypes.PLUGINS, contentType);
assertEquals(category, contentType);
assertTrue(testElement.categoryEnabled);
assertFalse(askCheckbox.disabled);
assertTrue(askCheckbox.checked);
......@@ -183,11 +200,10 @@ cr.define('site_settings_category', function() {
MockInteractions.tap(testElement.$.toggle);
return browserProxy.whenCalled('setDefaultValueForContentType');
}).then(function(arguments) {
// Check DETECT => BLOCK transition succeeded.
// Check THIRD_STATE => BLOCK transition succeeded.
Polymer.dom.flush();
assertEquals(
settings.ContentSettingsTypes.PLUGINS, arguments[0]);
assertEquals(category, arguments[0]);
assertEquals(settings.PermissionValues.BLOCK, arguments[1]);
assertFalse(testElement.categoryEnabled);
assertTrue(askCheckbox.disabled);
......@@ -197,13 +213,11 @@ cr.define('site_settings_category', function() {
MockInteractions.tap(testElement.$.toggle);
return browserProxy.whenCalled('setDefaultValueForContentType');
}).then(function(arguments) {
// Check BLOCK => DETECT transition succeeded.
// Check BLOCK => THIRD_STATE transition succeeded.
Polymer.dom.flush();
assertEquals(
settings.ContentSettingsTypes.PLUGINS, arguments[0]);
assertEquals(
settings.PermissionValues.IMPORTANT_CONTENT, arguments[1]);
assertEquals(category, arguments[0]);
assertEquals(thirdState, arguments[1]);
assertTrue(testElement.categoryEnabled);
assertFalse(askCheckbox.disabled);
assertTrue(askCheckbox.checked);
......@@ -212,11 +226,10 @@ cr.define('site_settings_category', function() {
MockInteractions.tap(askCheckbox);
return browserProxy.whenCalled('setDefaultValueForContentType');
}).then(function(arguments) {
// Check DETECT => ALLOW transition succeeded.
// Check THIRD_STATE => ALLOW transition succeeded.
Polymer.dom.flush();
assertEquals(
settings.ContentSettingsTypes.PLUGINS, arguments[0]);
assertEquals(category, arguments[0]);
assertEquals(
settings.PermissionValues.ALLOW, arguments[1]);
assertTrue(testElement.categoryEnabled);
......@@ -230,8 +243,7 @@ cr.define('site_settings_category', function() {
// Check ALLOW => BLOCK transition succeeded.
Polymer.dom.flush();
assertEquals(
settings.ContentSettingsTypes.PLUGINS, arguments[0]);
assertEquals(category, arguments[0]);
assertEquals(settings.PermissionValues.BLOCK, arguments[1]);
assertFalse(testElement.categoryEnabled);
assertTrue(askCheckbox.disabled);
......@@ -244,8 +256,7 @@ cr.define('site_settings_category', function() {
// Check BLOCK => ALLOW transition succeeded.
Polymer.dom.flush();
assertEquals(
settings.ContentSettingsTypes.PLUGINS, arguments[0]);
assertEquals(category, arguments[0]);
assertEquals(settings.PermissionValues.ALLOW, arguments[1]);
assertTrue(testElement.categoryEnabled);
assertFalse(askCheckbox.disabled);
......@@ -255,18 +266,28 @@ cr.define('site_settings_category', function() {
MockInteractions.tap(askCheckbox);
return browserProxy.whenCalled('setDefaultValueForContentType');
}).then(function(arguments) {
// Check ALLOW => DETECT transition succeeded.
// Check ALLOW => THIRD_STATE transition succeeded.
Polymer.dom.flush();
assertEquals(
settings.ContentSettingsTypes.PLUGINS, arguments[0]);
assertEquals(
settings.PermissionValues.IMPORTANT_CONTENT, arguments[1]);
assertEquals(category, arguments[0]);
assertEquals(thirdState, arguments[1]);
assertTrue(testElement.categoryEnabled);
assertFalse(askCheckbox.disabled);
assertTrue(askCheckbox.checked);
});;
});
});
}
test('test special tri-state Flash category', function() {
return testTristateCategory(
prefsFlashDetect, settings.ContentSettingsTypes.PLUGINS,
settings.PermissionValues.IMPORTANT_CONTENT, '#flashAskCheckbox');
});
test('test special tri-state Cookies category', function() {
return testTristateCategory(
prefsCookesSessionOnly, settings.ContentSettingsTypes.COOKIES,
settings.PermissionValues.SESSION_ONLY, '#sessionOnlyCheckbox');
});
});
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment