Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Unified Diff: third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js

Issue 2776263006: [DevTools] Migrate checkbox label to a proper web component (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
index ad82daf5eb7a579c37c2189075c0ae230aa3ebc9..5cfac2c4c9a3689496688c4d54dca48972265df9 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
@@ -1257,26 +1257,6 @@ UI.createLabel = function(title, iconClass) {
};
/**
- * @param {string=} title
- * @param {boolean=} checked
- * @param {string=} subtitle
- * @return {!Element}
- */
-UI.createCheckboxLabel = function(title, checked, subtitle) {
- var element = createElement('label', 'dt-checkbox');
- element.checkboxElement.checked = !!checked;
- if (title !== undefined) {
- element.textElement = element.shadowRoot.createChild('div', 'dt-checkbox-text');
- element.textElement.textContent = title;
- if (subtitle !== undefined) {
- element.subtitleElement = element.textElement.createChild('div', 'dt-checkbox-subtitle');
- element.subtitleElement.textContent = subtitle;
- }
- }
- return element;
-};
-
-/**
* @return {!Element}
* @param {number} min
* @param {number} max
@@ -1314,6 +1294,93 @@ UI.appendStyle = function(node, cssFile) {
}
};
+/**
+ * @extends {HTMLLabelElement}
+ */
+UI.CheckboxLabel = class extends HTMLLabelElement {
+ constructor() {
+ super();
+ /** @type {!DocumentFragment} */
+ this._shadowRoot;
+ /** @type {!HTMLInputElement} */
+ this.checkboxElement;
+ /** @type {!Element} */
+ this.textElement;
+ throw new Error('Checkbox must be created via factory method.');
+ }
+
+ /**
+ * @override
+ */
+ createdCallback() {
+ UI.CheckboxLabel._lastId = (UI.CheckboxLabel._lastId || 0) + 1;
+ var id = 'ui-checkbox-label' + UI.CheckboxLabel._lastId;
+ this._shadowRoot = UI.createShadowRootWithCoreStyles(this, 'ui/checkboxTextLabel.css');
+ this.checkboxElement = /** @type {!HTMLInputElement} */ (this._shadowRoot.createChild('input'));
+ this.checkboxElement.type = 'checkbox';
+ this.checkboxElement.setAttribute('id', id);
+ this.textElement = this._shadowRoot.createChild('label', 'dt-checkbox-text');
+ this.textElement.setAttribute('for', id);
+ this._shadowRoot.createChild('content');
+ }
+
+ /**
+ * @param {string=} title
+ * @param {boolean=} checked
+ * @param {string=} subtitle
+ * @return {!UI.CheckboxLabel}
+ */
+ static create(title, checked, subtitle) {
+ if (!UI.CheckboxLabel._constructor)
+ UI.CheckboxLabel._constructor = UI.registerCustomElement('label', 'dt-checkbox', UI.CheckboxLabel.prototype);
+ var element = /** @type {!UI.CheckboxLabel} */ (new UI.CheckboxLabel._constructor());
+ element.checkboxElement.checked = !!checked;
+ if (title !== undefined) {
+ element.textElement.textContent = title;
+ if (subtitle !== undefined)
+ element.textElement.createChild('div', 'dt-checkbox-subtitle').textContent = subtitle;
+ }
+ return element;
+ }
+
+ /**
+ * @param {string} color
+ * @this {Element}
+ */
+ set backgroundColor(color) {
+ this.checkboxElement.classList.add('dt-checkbox-themed');
+ this.checkboxElement.style.backgroundColor = color;
+ }
+
+ /**
+ * @param {string} color
+ * @this {Element}
+ */
+ set checkColor(color) {
+ this.checkboxElement.classList.add('dt-checkbox-themed');
+ var stylesheet = createElement('style');
+ stylesheet.textContent = 'input.dt-checkbox-themed:checked:after { background-color: ' + color + '}';
+ this._shadowRoot.appendChild(stylesheet);
+ }
+
+ /**
+ * @param {string} color
+ * @this {Element}
+ */
+ set borderColor(color) {
+ this.checkboxElement.classList.add('dt-checkbox-themed');
+ this.checkboxElement.style.borderColor = color;
+ }
+
+ /**
+ * @param {boolean} focus
+ * @this {Element}
+ */
+ set visualizeFocus(focus) {
+ this.checkboxElement.classList.toggle('dt-checkbox-visualize-focus', focus);
+ }
+};
+
(function() {
UI.registerCustomElement('button', 'text-button', {
/**
@@ -1356,74 +1423,6 @@ UI.appendStyle = function(node, cssFile) {
this.radioElement.dispatchEvent(new Event('change'));
}
- UI.registerCustomElement('label', 'dt-checkbox', {
- /**
- * @this {Element}
- */
- createdCallback: function() {
- this._root = UI.createShadowRootWithCoreStyles(this, 'ui/checkboxTextLabel.css');
- var checkboxElement = createElementWithClass('input', 'dt-checkbox-button');
- checkboxElement.type = 'checkbox';
- this._root.appendChild(checkboxElement);
- this.checkboxElement = checkboxElement;
-
- this.addEventListener('click', toggleCheckbox.bind(this));
-
- /**
- * @param {!Event} event
- * @this {Node}
- */
- function toggleCheckbox(event) {
- var deepTarget = event.deepElementFromPoint();
- if (deepTarget !== checkboxElement && deepTarget !== this) {
- event.consume();
- checkboxElement.click();
- }
- }
-
- this._root.createChild('content');
- },
-
- /**
- * @param {string} color
- * @this {Element}
- */
- set backgroundColor(color) {
- this.checkboxElement.classList.add('dt-checkbox-themed');
- this.checkboxElement.style.backgroundColor = color;
- },
-
- /**
- * @param {string} color
- * @this {Element}
- */
- set checkColor(color) {
- this.checkboxElement.classList.add('dt-checkbox-themed');
- var stylesheet = createElement('style');
- stylesheet.textContent = 'input.dt-checkbox-themed:checked:after { background-color: ' + color + '}';
- this._root.appendChild(stylesheet);
- },
-
- /**
- * @param {string} color
- * @this {Element}
- */
- set borderColor(color) {
- this.checkboxElement.classList.add('dt-checkbox-themed');
- this.checkboxElement.style.borderColor = color;
- },
-
- /**
- * @param {boolean} focus
- * @this {Element}
- */
- set visualizeFocus(focus) {
- this.checkboxElement.classList.toggle('dt-checkbox-visualize-focus', focus);
- },
-
- __proto__: HTMLLabelElement.prototype
- });
-
UI.registerCustomElement('label', 'dt-icon-label', {
/**
* @this {Element}
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698