| Index: chrome/browser/resources/settings/internet_page/network_proxy.js
|
| diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.js b/chrome/browser/resources/settings/internet_page/network_proxy.js
|
| index e3defda2468a441c81fdac3dfcb06bc213a54eab..01a2a083aa86c49d0377a5ceafb262fe7df20f1b 100644
|
| --- a/chrome/browser/resources/settings/internet_page/network_proxy.js
|
| +++ b/chrome/browser/resources/settings/internet_page/network_proxy.js
|
| @@ -9,7 +9,12 @@
|
| Polymer({
|
| is: 'network-proxy',
|
|
|
| - behaviors: [CrPolicyNetworkBehavior, I18nBehavior, PrefsBehavior],
|
| + behaviors: [
|
| + CrPolicyNetworkBehavior,
|
| + I18nBehavior,
|
| + PrefsBehavior,
|
| + settings.RouteObserverBehavior,
|
| + ],
|
|
|
| properties: {
|
| /**
|
| @@ -30,17 +35,20 @@ Polymer({
|
|
|
| /**
|
| * UI visible / edited proxy configuration.
|
| - * @type {!CrOnc.ProxySettings}
|
| + * @private {!CrOnc.ProxySettings}
|
| */
|
| - proxy: {
|
| + proxy_: {
|
| type: Object,
|
| value: function() {
|
| return this.createDefaultProxySettings_();
|
| },
|
| },
|
|
|
| - /** The Web Proxy Auto Discovery URL extracted from networkProperties. */
|
| - WPAD: {
|
| + /**
|
| + * The Web Proxy Auto Discovery URL extracted from networkProperties.
|
| + * @private
|
| + */
|
| + WPAD_: {
|
| type: String,
|
| value: '',
|
| },
|
| @@ -113,14 +121,24 @@ Polymer({
|
| savedExcludeDomains_: undefined,
|
|
|
| /**
|
| - * Set to true the first time we receive a manual proxy. Used to set the
|
| - * initial |useSameProxy_| value.
|
| + * Set to true while modifying proxy values so that an update does not
|
| + * override the edited values.
|
| * @private {boolean}
|
| */
|
| - receivedManualProxy_: false,
|
| + proxyModified_: false,
|
| +
|
| + /** @protected settings.RouteObserverBehavior */
|
| + currentRouteChanged: function(newRoute) {
|
| + this.proxyModified_ = false;
|
| + this.proxy_ = this.createDefaultProxySettings_();
|
| + if (newRoute == settings.Route.NETWORK_DETAIL)
|
| + this.updateProxy_();
|
| + },
|
|
|
| /** @private */
|
| networkPropertiesChanged_: function() {
|
| + if (this.proxyModified_)
|
| + return; // Ignore update.
|
| this.updateProxy_();
|
| },
|
|
|
| @@ -149,23 +167,28 @@ Polymer({
|
| CrOnc.getActiveValue(proxySettings.Type));
|
| if (proxySettings.Manual) {
|
| proxy.Manual.HTTPProxy = /** @type {!CrOnc.ProxyLocation|undefined} */ (
|
| - CrOnc.getSimpleActiveProperties(proxySettings.Manual.HTTPProxy));
|
| + CrOnc.getSimpleActiveProperties(
|
| + proxySettings.Manual.HTTPProxy)) ||
|
| + {Host: '', Port: 80};
|
| proxy.Manual.SecureHTTPProxy =
|
| /** @type {!CrOnc.ProxyLocation|undefined} */ (
|
| CrOnc.getSimpleActiveProperties(
|
| - proxySettings.Manual.SecureHTTPProxy));
|
| - proxy.Manual.FTPProxy = /** @type {!CrOnc.ProxyLocation|undefined} */ (
|
| - CrOnc.getSimpleActiveProperties(proxySettings.Manual.FTPProxy));
|
| - proxy.Manual.SOCKS = /** @type {!CrOnc.ProxyLocation|undefined} */ (
|
| - CrOnc.getSimpleActiveProperties(proxySettings.Manual.SOCKS));
|
| - if (!this.receivedManualProxy_) {
|
| - let json_http = JSON.stringify(proxy.Manual.HTTPProxy);
|
| - this.useSameProxy_ =
|
| - json_http == JSON.stringify(proxy.Manual.SecureHTTPProxy) &&
|
| - json_http == JSON.stringify(proxy.Manual.FTPProxy) &&
|
| - json_http == JSON.stringify(proxy.Manual.SOCKS);
|
| - this.receivedManualProxy_ = true;
|
| - }
|
| + proxySettings.Manual.SecureHTTPProxy)) ||
|
| + proxy.Manual.HTTPProxy;
|
| + proxy.Manual.FTPProxy =
|
| + /** @type {!CrOnc.ProxyLocation|undefined} */ (
|
| + CrOnc.getSimpleActiveProperties(
|
| + proxySettings.Manual.FTPProxy)) ||
|
| + proxy.Manual.HTTPProxy;
|
| + proxy.Manual.SOCKS =
|
| + /** @type {!CrOnc.ProxyLocation|undefined} */ (
|
| + CrOnc.getSimpleActiveProperties(proxySettings.Manual.SOCKS)) ||
|
| + proxy.Manual.HTTPProxy;
|
| + let json_http = JSON.stringify(proxy.Manual.HTTPProxy);
|
| + this.useSameProxy_ =
|
| + json_http == JSON.stringify(proxy.Manual.SecureHTTPProxy) &&
|
| + json_http == JSON.stringify(proxy.Manual.FTPProxy) &&
|
| + json_http == JSON.stringify(proxy.Manual.SOCKS);
|
| }
|
| if (proxySettings.ExcludeDomains) {
|
| proxy.ExcludeDomains = /** @type {!Array<string>|undefined} */ (
|
| @@ -181,7 +204,7 @@ Polymer({
|
| // Set the Web Proxy Auto Discovery URL.
|
| var ipv4 =
|
| CrOnc.getIPConfigForType(this.networkProperties, CrOnc.IPType.IPV4);
|
| - this.WPAD = (ipv4 && ipv4.WebProxyAutoDiscoveryUrl) || '';
|
| + this.WPAD_ = (ipv4 && ipv4.WebProxyAutoDiscoveryUrl) || '';
|
|
|
| this.setProxyAsync_(proxy);
|
| },
|
| @@ -191,17 +214,16 @@ Polymer({
|
| * @private
|
| */
|
| setProxyAsync_: function(proxy) {
|
| - // Set this.proxy after dom-repeat has been stamped.
|
| + // Set this.proxy_ after dom-repeat has been stamped.
|
| this.async(function() {
|
| - this.proxy = proxy;
|
| + this.proxy_ = proxy;
|
| + this.proxyModified_ = false;
|
| }.bind(this));
|
| },
|
|
|
| /** @private */
|
| useSameProxyChanged_: function() {
|
| - if (!this.receivedManualProxy_)
|
| - return;
|
| - this.sendProxyChange_();
|
| + this.proxyModified_ = true;
|
| },
|
|
|
| /** @private */
|
| @@ -234,32 +256,34 @@ Polymer({
|
| * @private
|
| */
|
| sendProxyChange_: function() {
|
| - if (this.proxy.Type == CrOnc.ProxySettingsType.MANUAL) {
|
| - var proxy =
|
| - /** @type {!CrOnc.ProxySettings} */ (Object.assign({}, this.proxy));
|
| - var defaultProxy = proxy.Manual.HTTPProxy;
|
| + if (this.proxy_.Type == CrOnc.ProxySettingsType.MANUAL) {
|
| + let proxy =
|
| + /** @type {!CrOnc.ProxySettings} */ (Object.assign({}, this.proxy_));
|
| + let manual = proxy.Manual;
|
| + let defaultProxy = manual.HTTPProxy;
|
| if (!defaultProxy || !defaultProxy.Host)
|
| return;
|
| - if (this.useSameProxy_ || !proxy.Manual.SecureHTTPProxy) {
|
| + if (this.useSameProxy_ || !this.get('SecureHTTPProxy.Host', manual)) {
|
| proxy.Manual.SecureHTTPProxy = /** @type {!CrOnc.ProxyLocation} */ (
|
| Object.assign({}, defaultProxy));
|
| }
|
| - if (this.useSameProxy_ || !proxy.Manual.FTPProxy) {
|
| + if (this.useSameProxy_ || !this.get('FTPProxy.Host', manual)) {
|
| proxy.Manual.FTPProxy = /** @type {!CrOnc.ProxyLocation} */ (
|
| Object.assign({}, defaultProxy));
|
| }
|
| - if (this.useSameProxy_ || !proxy.Manual.SOCKS) {
|
| + if (this.useSameProxy_ || !this.get('SOCKS.Host', manual)) {
|
| proxy.Manual.SOCKS = /** @type {!CrOnc.ProxyLocation} */ (
|
| Object.assign({}, defaultProxy));
|
| }
|
| this.savedManual_ = Object.assign({}, proxy.Manual);
|
| this.savedExcludeDomains_ = proxy.ExcludeDomains;
|
| - this.proxy = proxy;
|
| - } else if (this.proxy.Type == CrOnc.ProxySettingsType.PAC) {
|
| - if (!this.proxy.PAC)
|
| + this.proxy_ = proxy;
|
| + } else if (this.proxy_.Type == CrOnc.ProxySettingsType.PAC) {
|
| + if (!this.proxy_.PAC)
|
| return;
|
| }
|
| - this.fire('proxy-change', {field: 'ProxySettings', value: this.proxy});
|
| + this.fire('proxy-change', {field: 'ProxySettings', value: this.proxy_});
|
| + this.proxyModified_ = false;
|
| },
|
|
|
| /**
|
| @@ -271,19 +295,23 @@ Polymer({
|
| let target = /** @type {!HTMLSelectElement} */ (event.target);
|
| var type = /** @type {chrome.networkingPrivate.ProxySettingsType} */ (
|
| target.value);
|
| - this.set('proxy.Type', type);
|
| - this.sendProxyChange_();
|
| + this.set('proxy_.Type', type);
|
| + if (type == CrOnc.ProxySettingsType.MANUAL)
|
| + this.proxyModified_ = true;
|
| + else
|
| + this.sendProxyChange_();
|
| },
|
|
|
| - /**
|
| - * Event triggered when a proxy value changes.
|
| - * @param {Event} event The proxy value change event.
|
| - * @private
|
| - */
|
| - onProxyInputChange_: function(event) {
|
| + /** @private */
|
| + onPACChange_: function() {
|
| this.sendProxyChange_();
|
| },
|
|
|
| + /** @private */
|
| + onProxyInputChange_: function() {
|
| + this.proxyModified_ = true;
|
| + },
|
| +
|
| /**
|
| * Event triggered when a proxy exclusion is added.
|
| * @param {Event} event The add proxy exclusion event.
|
| @@ -293,10 +321,10 @@ Polymer({
|
| var value = this.$.proxyExclusion.value;
|
| if (!value)
|
| return;
|
| - this.push('proxy.ExcludeDomains', value);
|
| + this.push('proxy_.ExcludeDomains', value);
|
| // Clear input.
|
| this.$.proxyExclusion.value = '';
|
| - this.sendProxyChange_();
|
| + this.proxyModified_ = true;
|
| },
|
|
|
| /**
|
| @@ -305,6 +333,11 @@ Polymer({
|
| * @private
|
| */
|
| onProxyExclusionsChange_: function(event) {
|
| + this.proxyModified_ = true;
|
| + },
|
| +
|
| + /** @private */
|
| + onSaveProxyTap_: function() {
|
| this.sendProxyChange_();
|
| },
|
|
|
| @@ -361,14 +394,30 @@ Polymer({
|
| },
|
|
|
| /**
|
| + * @param {string} propertyName
|
| + * @return {boolean} Whether the named property setting is editable.
|
| + * @private
|
| + */
|
| + isEditable_: function(propertyName) {
|
| + if (!this.editable || (this.isShared_() && !this.useSharedProxies_))
|
| + return false;
|
| + if (!this.networkProperties.hasOwnProperty('ProxySettings'))
|
| + return true; // No proxy settings defined, so not enforced.
|
| + let property = /** @type {!CrOnc.ManagedProperty|undefined} */ (
|
| + this.get('ProxySettings.' + propertyName, this.networkProperties));
|
| + if (!property)
|
| + return true;
|
| + return this.isPropertyEditable_(property);
|
| + },
|
| +
|
| + /**
|
| * @param {!CrOnc.ManagedProperty|undefined} property
|
| - * @return {boolean} Whether the property setting is enforced.
|
| + * @return {boolean} Whether |property| is editable.
|
| * @private
|
| */
|
| - isEditable_: function(property) {
|
| - return this.editable && !this.isNetworkPolicyEnforced(property) &&
|
| - !this.isExtensionControlled(property) &&
|
| - (!this.isShared_() || this.useSharedProxies_);
|
| + isPropertyEditable_: function(property) {
|
| + return !this.isNetworkPolicyEnforced(property) &&
|
| + !this.isExtensionControlled(property);
|
| },
|
|
|
| /**
|
| @@ -381,15 +430,13 @@ Polymer({
|
| },
|
|
|
| /**
|
| - * Used to check the editable state for proxy related UI that may or may
|
| - * not be directly controlled by a policy. We use the enforced state of the
|
| - * 'ProxySettings.Type' property for these controls.
|
| - * @return {boolean} Whether the proxy control is editable.
|
| + * @return {boolean}
|
| * @private
|
| */
|
| - isProxyEditable_: function() {
|
| - let property = this.getProxySettingsTypeProperty_();
|
| - return !property || this.isEditable_(property);
|
| + isSaveManualProxyEnabled_: function() {
|
| + if (!this.proxyModified_)
|
| + return false;
|
| + return !!this.get('HTTPProxy.Host', this.proxy_.Manual);
|
| },
|
|
|
| /**
|
|
|