Commit 4d7d1f55 authored by dpapad's avatar dpapad Committed by Commit Bot

WebUI: Update action-link element to use Shadow DOM v1.

Bug: 837381
Change-Id: I5421657d43646c768def7a5ccf235b9eb483e2e2
Reviewed-on: https://chromium-review.googlesource.com/c/1336548Reviewed-by: default avatarScott Chen <scottchen@chromium.org>
Commit-Queue: Demetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608224}
parent 31391ba3
...@@ -27,90 +27,78 @@ ...@@ -27,90 +27,78 @@
// //
// NOTE: <action-link> and document.createElement('action-link') don't work. // NOTE: <action-link> and document.createElement('action-link') don't work.
/** class ActionLink extends HTMLAnchorElement {
* See crbug.com/837381 connectedCallback() {
* @suppress {deprecated} // Action links can start disabled (e.g. <a is="action-link" disabled>).
* this.tabIndex = this.disabled ? -1 : 0;
* @constructor
* @extends {HTMLAnchorElement}
*/
var ActionLink = document.registerElement('action-link', {
prototype: {
__proto__: HTMLAnchorElement.prototype,
/** @this {ActionLink} */ if (!this.hasAttribute('role'))
createdCallback: function() { this.setAttribute('role', 'link');
// Action links can start disabled (e.g. <a is="action-link" disabled>).
this.tabIndex = this.disabled ? -1 : 0;
if (!this.hasAttribute('role')) this.addEventListener('keydown', function(e) {
this.setAttribute('role', 'link'); if (!this.disabled && e.key == 'Enter' && !this.href) {
// Schedule a click asynchronously because other 'keydown' handlers
this.addEventListener('keydown', function(e) { // may still run later (e.g. document.addEventListener('keydown')).
if (!this.disabled && e.key == 'Enter' && !this.href) { // Specifically options dialogs break when this timeout isn't here.
// Schedule a click asynchronously because other 'keydown' handlers // NOTE: this affects the "trusted" state of the ensuing click. I
// may still run later (e.g. document.addEventListener('keydown')). // haven't found anything that breaks because of this (yet).
// Specifically options dialogs break when this timeout isn't here. window.setTimeout(this.click.bind(this), 0);
// NOTE: this affects the "trusted" state of the ensuing click. I
// haven't found anything that breaks because of this (yet).
window.setTimeout(this.click.bind(this), 0);
}
});
function preventDefault(e) {
e.preventDefault();
} }
});
function removePreventDefault() { function preventDefault(e) {
document.removeEventListener('selectstart', preventDefault); e.preventDefault();
document.removeEventListener('mouseup', removePreventDefault); }
}
function removePreventDefault() {
document.removeEventListener('selectstart', preventDefault);
document.removeEventListener('mouseup', removePreventDefault);
}
this.addEventListener('mousedown', function() { this.addEventListener('mousedown', function() {
// This handlers strives to match the behavior of <a href="...">. // This handlers strives to match the behavior of <a href="...">.
// While the mouse is down, prevent text selection from dragging. // While the mouse is down, prevent text selection from dragging.
document.addEventListener('selectstart', preventDefault); document.addEventListener('selectstart', preventDefault);
document.addEventListener('mouseup', removePreventDefault); document.addEventListener('mouseup', removePreventDefault);
// If focus started via mouse press, don't show an outline. // If focus started via mouse press, don't show an outline.
if (document.activeElement != this) if (document.activeElement != this)
this.classList.add('no-outline'); this.classList.add('no-outline');
}); });
this.addEventListener('blur', function() { this.addEventListener('blur', function() {
this.classList.remove('no-outline'); this.classList.remove('no-outline');
}); });
}, }
/** @type {boolean} */ /** @param {boolean} disabled */
set disabled(disabled) { set disabled(disabled) {
if (disabled) if (disabled)
HTMLAnchorElement.prototype.setAttribute.call(this, 'disabled', ''); HTMLAnchorElement.prototype.setAttribute.call(this, 'disabled', '');
else else
HTMLAnchorElement.prototype.removeAttribute.call(this, 'disabled'); HTMLAnchorElement.prototype.removeAttribute.call(this, 'disabled');
this.tabIndex = disabled ? -1 : 0; this.tabIndex = disabled ? -1 : 0;
}, }
get disabled() {
return this.hasAttribute('disabled');
},
/** @override */ get disabled() {
setAttribute: function(attr, val) { return this.hasAttribute('disabled');
if (attr.toLowerCase() == 'disabled') }
this.disabled = true;
else
HTMLAnchorElement.prototype.setAttribute.apply(this, arguments);
},
/** @override */ /** @override */
removeAttribute: function(attr) { setAttribute(attr, val) {
if (attr.toLowerCase() == 'disabled') if (attr.toLowerCase() == 'disabled')
this.disabled = false; this.disabled = true;
else else
HTMLAnchorElement.prototype.removeAttribute.apply(this, arguments); HTMLAnchorElement.prototype.setAttribute.apply(this, arguments);
}, }
},
extends: 'a', /** @override */
}); removeAttribute(attr) {
if (attr.toLowerCase() == 'disabled')
this.disabled = false;
else
HTMLAnchorElement.prototype.removeAttribute.apply(this, arguments);
}
}
customElements.define('action-link', ActionLink, {extends: 'a'});
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