Commit db108e87 authored by Patti's avatar Patti Committed by Commit Bot

MD Settings: Update Site Details dynamically when default permissions change.

Make the Site Details web UI update the default permission strings when they
change without needing to reload the Site Details page.

Manual test - With #enable-site-details on, open https://permission.site. Open
the Page Info bubble, click "Site settings" to open the Site Details page. Make
sure the 'Location' setting is set to 'Ask (default)'. In a new window, open
chrome://settings/content/location and put the two windows side by side. On
chrome://settings/content/location, click the toggle to block location access by
default, and verify the Site Details page drop-down value for location changes
to 'Block (default)'.

Bug: 656758
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: Id1c03acd9b636ea8463e382ae21cc646161267d9
Reviewed-on: https://chromium-review.googlesource.com/597030
Commit-Queue: Patti <patricialor@chromium.org>
Reviewed-by: default avatarDave Schuyler <dschuyler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#491982}
parent c518ea79
......@@ -10,7 +10,7 @@
Polymer({
is: 'site-details-permission',
behaviors: [SiteSettingsBehavior],
behaviors: [SiteSettingsBehavior, WebUIListenerBehavior],
properties: {
/**
......@@ -29,6 +29,13 @@ Polymer({
observers: ['siteChanged_(site)'],
/** @override */
attached: function() {
this.addWebUIListener(
'contentSettingCategoryChanged',
this.onDefaultSettingChanged_.bind(this));
},
/**
* Updates the drop-down value after |site| has changed.
* @param {!RawSiteException} site The site to display.
......@@ -40,10 +47,7 @@ Polymer({
this.$.permission.value = settings.ContentSetting.DEFAULT;
} else {
// The default setting is unknown, so consult the C++ backend for it.
this.browserProxy.getDefaultValueForContentType(this.category)
.then((defaultValue) => {
this.defaultSetting_ = defaultValue.setting;
});
this.updateDefaultPermission_(site);
this.$.permission.value = site.setting;
}
......@@ -60,6 +64,29 @@ Polymer({
}
},
/**
* Updates the default permission setting for this permission category.
* @param {!RawSiteException} site The site to display.
* @private
*/
updateDefaultPermission_: function(site) {
this.browserProxy.getDefaultValueForContentType(this.category)
.then((defaultValue) => {
this.defaultSetting_ = defaultValue.setting;
});
},
/**
* Handles the category permission changing for this origin.
* @param {!settings.ContentSettingsTypes} category The permission category
* that has changed default permission.
* @private
*/
onDefaultSettingChanged_: function(category) {
if (category == this.category)
this.updateDefaultPermission_(this.site);
},
/**
* Handles the category permission changing for this origin.
* @private
......
......@@ -65,7 +65,7 @@ suite('SiteDetailsPermission', function() {
testElement.$.permission.value = expectedContentSetting;
testElement.$.permission.dispatchEvent(new CustomEvent('change'));
return browserProxy.whenCalled('setOriginPermissions').then(function(args) {
return browserProxy.whenCalled('setOriginPermissions').then((args) => {
assertEquals(origin, args[0]);
assertDeepEquals([testElement.category], args[1]);
assertEquals(expectedContentSetting, args[2]);
......@@ -92,15 +92,15 @@ suite('SiteDetailsPermission', function() {
// Flip the permission and validate that prefs stay in sync.
return validatePermissionFlipWorks(origin, settings.ContentSetting.ALLOW)
.then(function() {
.then(() => {
return validatePermissionFlipWorks(
origin, settings.ContentSetting.BLOCK);
})
.then(function() {
.then(() => {
return validatePermissionFlipWorks(
origin, settings.ContentSetting.ALLOW);
})
.then(function() {
.then(() => {
return validatePermissionFlipWorks(
origin, settings.ContentSetting.DEFAULT);
});
......@@ -119,40 +119,39 @@ suite('SiteDetailsPermission', function() {
};
return browserProxy.whenCalled('getDefaultValueForContentType')
.then(function() {
.then((args) => {
// Check getDefaultValueForContentType was called for camera category.
assertEquals(settings.ContentSettingsTypes.CAMERA, args);
// The default option will always be the first in the menu.
assertEquals(
'Allow (default)', testElement.$.permission.options[0].text,
'Default setting string should match prefs');
browserProxy.resetResolver('getDefaultValueForContentType');
prefs.defaults.camera.setting = settings.ContentSetting.BLOCK;
browserProxy.setPrefs(prefs);
// Trigger a call to siteChanged_() by touching |testElement.site|.
testElement.site = {
origin: origin,
embeddingOrigin: '',
var defaultPrefs = {
camera: {
setting: settings.ContentSetting.BLOCK,
source: settings.SiteSettingSource.PREFERENCE,
}
};
browserProxy.setDefaultPrefs(defaultPrefs);
return browserProxy.whenCalled('getDefaultValueForContentType');
})
.then(function() {
.then((args) => {
assertEquals(settings.ContentSettingsTypes.CAMERA, args);
assertEquals(
'Block (default)', testElement.$.permission.options[0].text,
'Default setting string should match prefs');
browserProxy.resetResolver('getDefaultValueForContentType');
prefs.defaults.camera.setting = settings.ContentSetting.ASK;
browserProxy.setPrefs(prefs);
// Trigger a call to siteChanged_() by touching |testElement.site|.
testElement.site = {
origin: origin,
embeddingOrigin: '',
var defaultPrefs = {
camera: {
setting: settings.ContentSetting.ASK,
source: settings.SiteSettingSource.PREFERENCE,
}
};
browserProxy.setDefaultPrefs(defaultPrefs);
return browserProxy.whenCalled('getDefaultValueForContentType');
})
.then(function() {
.then((args) => {
assertEquals(settings.ContentSettingsTypes.CAMERA, args);
assertEquals(
'Ask (default)', testElement.$.permission.options[0].text,
'Default setting string should match prefs');
......
......@@ -200,9 +200,9 @@ suite('SiteDetails', function() {
browserProxy.setPrefs(prefs);
testElement = createSiteDetails('https://foo.com:443');
return browserProxy.whenCalled('getOriginPermissions').then(function() {
return browserProxy.whenCalled('getOriginPermissions').then(() => {
testElement.root.querySelectorAll('site-details-permission')
.forEach(function(siteDetailsPermission) {
.forEach((siteDetailsPermission) => {
// Verify settings match the values specified in |prefs|.
var expectedSetting = settings.ContentSetting.ALLOW;
var expectedSource = settings.SiteSettingSource.PREFERENCE;
......@@ -253,7 +253,7 @@ suite('SiteDetails', function() {
});
// Accepting the dialog will make a call to setOriginPermissions.
return browserProxy.whenCalled('setOriginPermissions').then(function(args) {
return browserProxy.whenCalled('setOriginPermissions').then((args) => {
assertEquals(testElement.origin, args[0]);
assertDeepEquals(testElement.getCategoryList_(), args[1]);
assertEquals(settings.ContentSetting.DEFAULT, args[2]);
......@@ -269,7 +269,7 @@ suite('SiteDetails', function() {
// Wait for all the permissions to be populated initially.
return browserProxy.whenCalled('getOriginPermissions')
.then(function(result) {
.then(() => {
// Make sure initial state is as expected.
assertEquals(
settings.ContentSetting.BLOCK,
......@@ -289,11 +289,11 @@ suite('SiteDetails', function() {
source: settings.SiteSettingSource.DEFAULT,
};
browserProxy.resetResolver('getOriginPermissions');
browserProxy.setSinglePref(
browserProxy.setSingleException(
settings.ContentSettingsTypes.NOTIFICATIONS, newException);
return browserProxy.whenCalled('getOriginPermissions');
})
.then(function(args) {
.then((args) => {
// The notification pref was just updated, so make sure the call to
// getOriginPermissions was to check notifications.
assertTrue(
......
......@@ -130,6 +130,25 @@ class TestSiteSettingsPrefsBrowserProxy extends TestBrowserProxy {
}
}
/**
* Sets the default prefs only. Use this only when there is a need to
* distinguish between the callback for permissions changing and the callback
* for default permissions changing.
* TODO(https://crbug.com/742706): This function is a hack and should be
* removed.
* @param {!Map<string, !DefaultContentSetting>} defaultPrefs The new
* default prefs to set.
*/
setDefaultPrefs(defaultPrefs) {
this.prefs_.defaults = defaultPrefs;
// Notify all listeners that their data may be out of date.
for (var type in settings.ContentSettingsTypes) {
cr.webUIListenerCallback(
'contentSettingCategoryChanged', settings.ContentSettingsTypes[type]);
}
}
/**
* Sets one exception for a given category, replacing any existing exceptions
* for the same origin. Note this ignores embedding origins.
......@@ -137,7 +156,7 @@ class TestSiteSettingsPrefsBrowserProxy extends TestBrowserProxy {
* exception belongs to.
* @param {!RawSiteException} newException The new preference to add/replace.
*/
setSinglePref(category, newException) {
setSingleException(category, newException) {
// Remove entries from the current prefs which have the same origin.
var newPrefs = /** @type {!Array<RawSiteException>} */
(this.prefs_.exceptions[category].filter((categoryException) => {
......
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