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

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

Issue 2805593002: DevTools: Navigate TabbedPane with arrow keys (Closed)
Patch Set: Created 3 years, 8 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/TabbedPane.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js b/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js
index a578b774e1ce12d82f7b5394b17dde3d361e68e0..61057821b32b4ea9c91f86c5b696daa1a6760aed 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js
@@ -43,6 +43,7 @@ UI.TabbedPane = class extends UI.VBox {
this._tabSlider = createElementWithClass('div', 'tabbed-pane-tab-slider');
this._tabsElement = this._headerContentsElement.createChild('div', 'tabbed-pane-header-tabs');
this._tabsElement.setAttribute('role', 'tablist');
+ this._tabsElement.addEventListener('keydown', this._keyDown.bind(this), false);
this._contentElement = this.contentElement.createChild('div', 'tabbed-pane-content');
this._contentElement.setAttribute('role', 'tabpanel');
this._contentElement.createChild('content');
@@ -543,6 +544,7 @@ UI.TabbedPane = class extends UI.VBox {
var dropDownContainer = createElementWithClass('div', 'tabbed-pane-header-tabs-drop-down-container');
var chevronIcon = UI.Icon.create('largeicon-chevron', 'chevron-icon');
dropDownContainer.appendChild(chevronIcon);
+ dropDownContainer.addEventListener('click', this._onDropDownMouseDown.bind(this));
aboxhall 2017/04/12 07:25:06 Do we need to make sure we don't run all this code
einbinder 2017/04/17 21:46:39 The ContextMenu consumes the mousedown event if it
aboxhall 2017/04/17 23:03:36 Oh right :)
dropDownContainer.addEventListener('mousedown', this._onDropDownMouseDown.bind(this));
return dropDownContainer;
}
@@ -553,7 +555,15 @@ UI.TabbedPane = class extends UI.VBox {
_onDropDownMouseDown(event) {
if (event.which !== 1)
return;
- var menu = new UI.ContextMenu(event);
+ var x = event.x;
+ var y = event.y;
+ // This wasn't a mouse event, manually set the position
aboxhall 2017/04/12 07:25:06 Can we just do this normally? It doesn't seem like
einbinder 2017/04/17 21:46:39 Done.
+ if (!x && !y) {
+ var rect = this._dropDownButton.getBoundingClientRect();
+ x = (rect.left + rect.right) / 2;
+ y = (rect.top + rect.bottom) / 2;
+ }
+ var menu = new UI.ContextMenu(event, false, x, y);
for (var i = 0; i < this._tabs.length; ++i) {
var tab = this._tabs[i];
if (tab._shown)
@@ -756,6 +766,7 @@ UI.TabbedPane = class extends UI.VBox {
* @param {!UI.TabbedPaneTab} tab
*/
_showTab(tab) {
+ tab.tabElement.tabIndex = 0;
tab.tabElement.classList.add('selected');
UI.ARIAUtils.setSelected(tab.tabElement, true);
tab.view.show(this.element);
@@ -781,6 +792,7 @@ UI.TabbedPane = class extends UI.VBox {
* @param {!UI.TabbedPaneTab} tab
*/
_hideTab(tab) {
+ tab.tabElement.tabIndex = -1;
aboxhall 2017/04/12 07:25:06 Can just remove the tabIndex attribute instead (pr
einbinder 2017/04/17 21:46:39 Done.
tab.tabElement.classList.remove('selected');
tab.tabElement.setAttribute('aria-selected', 'false');
tab.view.detach();
@@ -842,6 +854,38 @@ UI.TabbedPane = class extends UI.VBox {
this._allowTabReorder = allow;
this._automaticReorder = automatic;
}
+
+ /**
+ * @param {!Event} event
+ */
+ _keyDown(event) {
+ if (!this._currentTab)
+ return;
+ var nextTab = null;
aboxhall 2017/04/12 07:25:06 s/nextTab/nextTabElement/ ?
einbinder 2017/04/17 21:46:39 Done.
+ switch (event.keyCode) {
+ case UI.KeyboardShortcut.Keys.Up.code:
+ case UI.KeyboardShortcut.Keys.Left.code:
+ nextTab = this._currentTab.tabElement.previousElementSibling;
+ if (!nextTab && !this._dropDownButton.parentElement)
+ nextTab = this._currentTab.tabElement.parentElement.lastElementChild;
+ break;
+ case UI.KeyboardShortcut.Keys.Down.code:
+ case UI.KeyboardShortcut.Keys.Right.code:
+ nextTab = this._currentTab.tabElement.nextElementSibling;
+ if (!nextTab && !this._dropDownButton.parentElement)
+ nextTab = this._currentTab.tabElement.parentElement.firstElementChild;
+ break;
+ default:
+ return;
+ }
+ if (!nextTab) {
+ this._dropDownButton.click();
aboxhall 2017/04/12 07:25:06 This is pretty counter-intuitive - maybe extract t
einbinder 2017/04/17 21:46:39 I need the event to construct the ContextMenu. I t
aboxhall 2017/04/17 23:03:36 Ah, I see. Yeah it's a bit of a hack using a conte
+ return;
+ }
+ var tab = this._tabs.find(tab => tab.tabElement === nextTab);
+ this.selectTab(tab.id, true);
+ nextTab.focus();
+ }
};
/** @enum {symbol} */

Powered by Google App Engine
This is Rietveld 408576698