blob: a3e4fa1fd9b7f71d142cee448db97ce65bc093b2 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('options', function() {
/** @const */ var ArrayDataModel = cr.ui.ArrayDataModel;
/** @const */ var List = cr.ui.List;
/** @const */ var ListItem = cr.ui.ListItem;
/** @const */ var DeletableItem = options.DeletableItem;
/** @const */ var DeletableItemList = options.DeletableItemList;
/**
* Creates a new ignored protocol / content handler list item.
*
* Accepts values in the form
* ['mailto', 'http://www.thesite.com/%s', 'www.thesite.com'],
* @param {Object} entry A dictionary describing the handlers for a given
* protocol.
* @constructor
* @extends {options.DeletableItem}
*/
function IgnoredHandlersListItem(entry) {
var el = cr.doc.createElement('div');
el.dataItem = entry;
el.__proto__ = IgnoredHandlersListItem.prototype;
el.decorate();
return el;
}
IgnoredHandlersListItem.prototype = {
__proto__: DeletableItem.prototype,
/** @override */
decorate: function() {
DeletableItem.prototype.decorate.call(this);
// Protocol.
var protocolElement = document.createElement('div');
protocolElement.textContent = this.dataItem[0];
protocolElement.className = 'handlers-type-column';
this.contentElement_.appendChild(protocolElement);
// Host name.
var hostElement = document.createElement('div');
hostElement.textContent = this.dataItem[2];
hostElement.className = 'handlers-site-column';
hostElement.title = this.dataItem[1];
this.contentElement_.appendChild(hostElement);
},
};
/**
* @constructor
* @extends {options.DeletableItemList}
*/
var IgnoredHandlersList = cr.ui.define('list');
IgnoredHandlersList.prototype = {
__proto__: DeletableItemList.prototype,
/**
* @override
* @param {Object} entry
*/
createItem: function(entry) {
return new IgnoredHandlersListItem(entry);
},
deleteItemAtIndex: function(index) {
chrome.send('removeIgnoredHandler', [this.dataModel.item(index)]);
},
/**
* The length of the list.
*/
get length() {
return this.dataModel.length;
},
/**
* Set the protocol handlers displayed by this list. See
* IgnoredHandlersListItem for an example of the format the list should
* take.
*
* @param {!Array} list A list of ignored protocol handlers.
*/
setHandlers: function(list) {
this.dataModel = new ArrayDataModel(list);
},
};
/**
* Creates a new protocol / content handler list item.
*
* Accepts values in the form
* { protocol: 'mailto',
* handlers: [
* ['mailto', 'http://www.thesite.com/%s', 'www.thesite.com'],
* ...,
* ],
* }
* @param {Object} entry A dictionary describing the handlers for a given
* protocol.
* @constructor
* @extends {cr.ui.ListItem}
*/
function HandlerListItem(entry) {
var el = cr.doc.createElement('div');
el.dataItem = entry;
el.__proto__ = HandlerListItem.prototype;
el.decorate();
return el;
}
HandlerListItem.prototype = {
__proto__: ListItem.prototype,
/**
* @param {Handlers} data
* @param {{removeHandler: Function, setDefault: Function,
* clearDefault: Function}} delegate
*/
buildWidget_: function(data, delegate) {
// Protocol.
var protocolElement = document.createElement('div');
protocolElement.textContent = data.protocol;
protocolElement.className = 'handlers-type-column';
this.appendChild(protocolElement);
// Handler selection.
var handlerElement = document.createElement('div');
var selectElement = document.createElement('select');
var defaultOptionElement = document.createElement('option');
defaultOptionElement.selected = data.default_handler == -1;
defaultOptionElement.textContent =
loadTimeData.getString('handlers_none_handler');
defaultOptionElement.value = -1;
selectElement.appendChild(defaultOptionElement);
for (var i = 0; i < data.handlers.length; ++i) {
var optionElement = document.createElement('option');
optionElement.selected = i == data.default_handler;
optionElement.textContent = data.handlers[i][2];
optionElement.value = i;
selectElement.appendChild(optionElement);
}
selectElement.addEventListener('change', function(e) {
var index = e.target.value;
if (index == -1) {
this.classList.add('none');
delegate.clearDefault(data.protocol);
} else {
handlerElement.classList.remove('none');
delegate.setDefault(data.handlers[index]);
}
});
handlerElement.appendChild(selectElement);
handlerElement.className = 'handlers-site-column';
if (data.default_handler == -1)
this.classList.add('none');
this.appendChild(handlerElement);
if (data.has_policy_recommendations) {
// Create an indicator to show that the handler has policy
// recommendations.
var indicator = new options.ControlledSettingIndicator();
if (data.is_default_handler_set_by_user || data.default_handler == -1) {
// The default handler is registered by the user or set to none, which
// indicates that the user setting has overridden a policy
// recommendation. Show the appropriate bubble.
indicator.controlledBy = 'hasRecommendation';
indicator.resetHandler = function() {
// If there is a policy recommendation, data.handlers.length >= 1.
// Setting the default handler to 0 ensures that it won't be 'none',
// and there *is* a user registered handler created by setDefault,
// which is required for a change notification.
// The user-registered handlers are removed in a loop. Note that if
// a handler is installed by policy, removeHandler does nothing.
delegate.setDefault(data.handlers[0]);
for (var i = 0; i < data.handlers.length; ++i) {
delegate.removeHandler(i, data.handlers[i]);
}
};
} else {
indicator.controlledBy = 'recommended';
}
this.appendChild(indicator);
}
if (data.registered_by_user) {
// Remove link.
var removeElement = document.createElement('div');
removeElement.textContent =
loadTimeData.getString('handlers_remove_link');
removeElement.addEventListener('click', function(e) {
var value = selectElement ? selectElement.value : 0;
delegate.removeHandler(value, data.handlers[value]);
});
removeElement.className =
'handlers-remove-column handlers-remove-link';
this.appendChild(removeElement);
}
},
/** @override */
decorate: function() {
ListItem.prototype.decorate.call(this);
var delegate = {
removeHandler: function(index, handler) {
chrome.send('removeHandler', [handler]);
},
setDefault: function(handler) {
chrome.send('setDefault', [handler]);
},
clearDefault: function(protocol) {
chrome.send('clearDefault', [protocol]);
},
};
this.buildWidget_(this.dataItem, delegate);
},
};
/**
* Create a new passwords list.
* @constructor
* @extends {cr.ui.List}
*/
var HandlersList = cr.ui.define('list');
HandlersList.prototype = {
__proto__: List.prototype,
/**
* @override
* @param {Object} entry
*/
createItem: function(entry) {
return new HandlerListItem(entry);
},
/**
* The length of the list.
*/
get length() {
return this.dataModel.length;
},
/**
* Set the protocol handlers displayed by this list.
* See HandlerListItem for an example of the format the list should take.
*
* @param {!Array} list A list of protocols with their registered handlers.
*/
setHandlers: function(list) {
this.dataModel = new ArrayDataModel(list);
},
};
return {
IgnoredHandlersListItem: IgnoredHandlersListItem,
IgnoredHandlersList: IgnoredHandlersList,
HandlerListItem: HandlerListItem,
HandlersList: HandlersList,
};
});