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

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

Issue 2644233007: DevTools: Use real focus in TreeOutline (Closed)
Patch Set: test results 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
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/ui/treeoutline.css ('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/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 825e66bc8a6a3ea9396ec983fe3bdf669c98df9f..f044821e2059c05596dc68e98919d189a46aa7e6 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.js
@@ -30,13 +30,11 @@
* @unrestricted
*/
UI.TreeOutline = class extends Common.Object {
- /**
- * @param {boolean=} nonFocusable
- */
- constructor(nonFocusable) {
+ constructor() {
super();
this._createRootElement();
+ /** @type {?UI.TreeElement} */
this.selectedTreeElement = null;
this.expandTreeElementsWhenArrowing = false;
/** @type {?function(!UI.TreeElement, !UI.TreeElement):number} */
@@ -44,26 +42,16 @@ 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 = true;
+ this.setFocusable(this._focusable);
+ if (this._focusable)
+ this.contentElement.setAttribute('tabIndex', -1);
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() {
@@ -150,14 +138,24 @@ UI.TreeOutline = class extends Common.Object {
* @param {boolean} focusable
*/
setFocusable(focusable) {
- if (focusable)
- this.contentElement.setAttribute('tabIndex', 0);
- else
+ if (focusable) {
+ this._focusable = true;
+ this.contentElement.setAttribute('tabIndex', -1);
+ if (this.selectedTreeElement)
+ this.selectedTreeElement._setFocusable(true);
+ } else {
+ this._focusable = false;
this.contentElement.removeAttribute('tabIndex');
+ if (this.selectedTreeElement)
+ this.selectedTreeElement._setFocusable(false);
+ }
}
focus() {
- this.contentElement.focus();
+ if (this.selectedTreeElement)
+ this.selectedTreeElement.listItemElement.focus();
+ else
+ this.contentElement.focus();
}
/**
@@ -223,10 +221,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;
@@ -329,6 +325,8 @@ UI.TreeElement = class {
this.parent = null;
this.previousSibling = null;
this.nextSibling = null;
+ this._boundOnFocus = this._onFocus.bind(this);
+ this._boundOnBlur = this._onBlur.bind(this);
this._listItemNode = createElement('li');
this._titleElement = this._listItemNode.createChild('span', 'tree-element-title');
@@ -672,13 +670,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}
@@ -1018,20 +1009,41 @@ UI.TreeElement = class {
this.selected = true;
- if (!omitFocus)
- this.treeOutline.focus();
-
- // Focusing on another node may detach "this" from tree.
- if (!this.treeOutline)
- return false;
this.treeOutline.selectedTreeElement = this;
+ if (this.treeOutline._focusable)
+ this._setFocusable(true);
+ if (!omitFocus || this.treeOutline.contentElement.hasFocus())
+ this.listItemElement.focus();
+
this._listItemNode.classList.add('selected');
- this._setFocused(this.treeOutline._focused);
this.treeOutline.dispatchEventToListeners(UI.TreeOutline.Events.ElementSelected, this);
return this.onselect(selectedByUser);
}
/**
+ * @param {boolean} focusable
+ */
+ _setFocusable(focusable) {
+ if (focusable) {
+ this._listItemNode.setAttribute('tabIndex', 0);
+ this._listItemNode.addEventListener('focus', this._boundOnFocus, false);
+ this._listItemNode.addEventListener('blur', this._boundOnBlur, false);
+ } else {
+ this._listItemNode.removeAttribute('tabIndex');
+ this._listItemNode.removeEventListener('focus', this._boundOnFocus, false);
+ this._listItemNode.removeEventListener('blur', this._boundOnBlur, false);
+ }
+ }
+
+ _onFocus() {
+ this._listItemNode.classList.add('force-white-icons');
+ }
+
+ _onBlur() {
+ this._listItemNode.classList.remove('force-white-icons');
+ }
+
+ /**
* @param {boolean=} omitFocus
*/
revealAndSelect(omitFocus) {
@@ -1039,17 +1051,17 @@ UI.TreeElement = class {
this.select(omitFocus);
}
- /**
- * @param {boolean=} supressOnDeselect
- */
- deselect(supressOnDeselect) {
- if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)
- return;
-
+ deselect() {
+ var hadFocus = this._listItemNode.hasFocus();
this.selected = false;
- this.treeOutline.selectedTreeElement = null;
this._listItemNode.classList.remove('selected');
- this._setFocused(false);
+ this._setFocusable(false);
+
+ if (this.treeOutline && this.treeOutline.selectedTreeElement === this) {
+ this.treeOutline.selectedTreeElement = null;
+ if (hadFocus)
+ this.treeOutline.focus();
+ }
}
_populateIfNeeded() {
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/ui/treeoutline.css ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698