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

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

Issue 2644233007: DevTools: Use real focus in TreeOutline (Closed)
Patch Set: changes Created 3 years, 11 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
Index: third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js b/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js
index b32588bfc35d12c21b9acd67704fa02f180d61d7..39afc0df91c04e4e8f542497c82adf7d0ba86555 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js
@@ -37,6 +37,7 @@ UI.TreeOutline = class extends Common.Object {
super();
this._createRootElement();
+ /** @type {?UI.TreeElement} */
this.selectedTreeElement = null;
this.expandTreeElementsWhenArrowing = false;
/** @type {?function(!UI.TreeElement, !UI.TreeElement):number} */
@@ -44,26 +45,14 @@ UI.TreeOutline = class extends Common.Object {
this.contentElement = this._rootElement._childrenListNode;
this.contentElement.addEventListener('keydown', this._treeKeyDown.bind(this), true);
- this.contentElement.addEventListener('focus', setFocused.bind(this, true), false);
- this.contentElement.addEventListener('blur', setFocused.bind(this, false), false);
- this.setFocusable(!nonFocusable);
+ this._focusable = !nonFocusable;
this.element = this.contentElement;
// Adjust to allow computing margin-left for the selection element.
// Check the padding-left for the li element for correct value.
this._paddingSize = 0;
-
- /**
- * @param {boolean} isFocused
- * @this {UI.TreeOutline}
- */
- function setFocused(isFocused) {
- this._focused = isFocused;
- if (this.selectedTreeElement)
- this.selectedTreeElement._setFocused(this._focused);
- }
}
_createRootElement() {
@@ -146,18 +135,9 @@ UI.TreeOutline = class extends Common.Object {
this._comparator = comparator;
}
- /**
- * @param {boolean} focusable
- */
- setFocusable(focusable) {
- if (focusable)
- this.contentElement.setAttribute('tabIndex', 0);
- else
- this.contentElement.removeAttribute('tabIndex');
- }
-
focus() {
- this.contentElement.focus();
+ if (this.selectedTreeElement)
pfeldman 2017/01/30 18:43:07 What if there is no selected element? Can there be
einbinder 2017/02/01 22:51:35 Selecting the contentElement now, and restoring fo
+ this.selectedTreeElement.listItemElement.focus();
}
/**
@@ -180,6 +160,7 @@ UI.TreeOutline = class extends Common.Object {
element.deselect();
element.onunbind();
element.treeOutline = null;
+ element.listItemElement.removeAttribute('tabIndex');
pfeldman 2017/01/30 18:43:07 It seems like you are now balancing this in the se
einbinder 2017/02/01 22:51:35 Yep, that is better.
}
/**
@@ -223,10 +204,8 @@ UI.TreeOutline = class extends Common.Object {
* @param {!Event} event
*/
_treeKeyDown(event) {
- if (event.target !== this.contentElement)
- return;
-
- if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)
+ if (!this.selectedTreeElement || event.target !== this.selectedTreeElement.listItemElement || event.shiftKey ||
+ event.metaKey || event.ctrlKey)
return;
var handled = false;
@@ -287,8 +266,11 @@ UI.TreeOutline.Events = {
* @unrestricted
*/
UI.TreeOutlineInShadow = class extends UI.TreeOutline {
- constructor() {
- super();
+ /**
+ * @param {boolean=} nonFocusable
+ */
+ constructor(nonFocusable) {
+ super(nonFocusable);
this.contentElement.classList.add('tree-outline');
// Redefine element to the external one.
@@ -682,13 +664,6 @@ UI.TreeElement = class {
this._trailingIconsElement.appendChild(icon);
}
- /**
- * @param {boolean} focused
- */
- _setFocused(focused) {
- this._focused = focused;
- this._listItemNode.classList.toggle('force-white-icons', focused);
- }
/**
* @return {string}
@@ -1028,15 +1003,13 @@ UI.TreeElement = class {
this.selected = true;
+ this.treeOutline.selectedTreeElement = this;
+ if (this.treeOutline._focusable)
+ this._listItemNode.setAttribute('tabIndex', 0);
if (!omitFocus)
- this.treeOutline.focus();
+ this.listItemElement.focus();
- // Focusing on another node may detach "this" from tree.
- if (!this.treeOutline)
- return false;
- this.treeOutline.selectedTreeElement = this;
this._listItemNode.classList.add('selected');
- this._setFocused(this.treeOutline._focused);
this.treeOutline.dispatchEventToListeners(UI.TreeOutline.Events.ElementSelected, this);
return this.onselect(selectedByUser);
}
@@ -1059,7 +1032,7 @@ UI.TreeElement = class {
this.selected = false;
this.treeOutline.selectedTreeElement = null;
this._listItemNode.classList.remove('selected');
- this._setFocused(false);
+ this._listItemNode.removeAttribute('tabIndex');
}
_populateIfNeeded() {

Powered by Google App Engine
This is Rietveld 408576698