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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/resources/FrameMenu.js

Issue 2773583002: [DevTools] Introduce a sidebar with a drop-down
Patch Set: [DevTools] Introduce a sidebar with a drop-down Created 3 years, 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 Resources.FrameMenu = class extends Common.Object {
6 constructor() {
7 super();
8 this._button = createElement('button');
9 this._button.className = 'frame-selector';
10 this._button.appendChild(UI.Icon.create('largeicon-navigator-frame'));
11 this._nameLabel = this._button.createChild('span', 'frame-name');
12 this._button.appendChild(UI.Icon.create('smallicon-triangle-down'));
13
14 this._button.addEventListener('click', () => this._showPopup());
15
16 /** @type {?SDK.ResourceTreeFrame} */
17 this._selectedFrame = null;
18
19 SDK.targetManager.addModelListener(
20 SDK.ResourceTreeModel, SDK.ResourceTreeModel.Events.FrameDetached,
21 event => this._frameDetached(/** @type {!SDK.ResourceTreeFrame} */ (even t.data)));
22
23 this.selectFrame(null);
24 }
25
26 /**
27 * @returns {!Element}
28 */
29 element() {
30 return this._button;
31 }
32
33 /**
34 * @param {!SDK.ResourceTreeFrame} frame
35 */
36 _frameDetached(frame) {
37 if (frame === this.selectedFrame())
38 this.selectRootFrame();
39 }
40
41 /**
42 * @return {?SDK.ResourceTreeFrame} frame
43 */
44 selectedFrame() {
45 return this._selectedFrame;
46 }
47
48 selectRootFrame() {
49 var target = SDK.targetManager.mainTarget();
50 var model = target && target.model(SDK.ResourceTreeModel);
51 var frame = model && model.mainFrame;
52 this.selectFrame(frame);
53 }
54
55 _showPopup() {
56 /**
57 * @param {!SDK.ResourceTreeFrame} frame
58 * @return {!Resources.FrameMenu._ListItem}
59 */
60 function frameToListItem(frame) {
61 var depth = SDK.ResourceTreeModel.framePath(frame).length - 1;
62 return new Resources.FrameMenu._ListItem(frame, depth);
63 }
64 var items = SDK.ResourceTreeModel.frames().map(frameToListItem);
65 var provider = new Resources.FrameMenu._ListProvider(this, items);
66 var list = new QuickOpen.FilteredListWidget(provider);
caseq 2017/05/26 22:20:18 I think this should use a different control, prefe
67 var selectedItem = null;
68 if (this._selectedFrame) {
69 for (var i = 0; i < items.length; i++) {
70 if (items[i].frame === this._selectedFrame) {
71 selectedItem = i;
72 break;
73 }
74 }
75 }
76 if (selectedItem !== null)
77 list.setInitialSelection(selectedItem);
78 list.setInputIcon('mediumicon-search');
79 var anchorBox = this._button.firstElementChild.boxInWindow();
80 list.showAsDialog(anchorBox, UI.GlassPane.AnchorBehavior.PreferBottom);
81 }
82
83 /**
84 * @param {?SDK.ResourceTreeFrame} frame
85 */
86 selectFrame(frame) {
87 this._selectedFrame = frame;
88
89 var displayName = frame ? frame.displayName() : '';
90 var frameName = frame ? frame.name : '';
91
92 this._nameLabel.textContent = frameName || displayName;
93 this._button.title = displayName;
94 }
95 };
96
97 Resources.FrameMenu._ListItem = class {
caseq 2017/05/26 22:20:19 nit: convert to typedef?
98 /**
99 * @param {!SDK.ResourceTreeFrame} frame
100 * @param {number} depth
101 */
102 constructor(frame, depth) {
103 this.frame = frame;
104 this.depth = depth;
105 }
106 };
107
108 Resources.FrameMenu._ListProvider = class extends QuickOpen.FilteredListWidget.P rovider {
109 /**
110 * @param {!Resources.FrameMenu} menu
111 * @param {!Array<!Resources.FrameMenu._ListItem>} items
112 */
113 constructor(menu, items) {
114 super();
115 this._menu = menu;
116 this._items = items;
117 }
118
119 /**
120 * @override
121 * @return {number}
122 */
123 itemCount() {
124 return this._items.length;
125 }
126
127 /**
128 * @override
129 * @param {number} itemIndex
130 * @return {string}
131 */
132 itemKeyAt(itemIndex) {
133 var frame = this._items[itemIndex].frame;
134 return frame.displayName() + frame.securityOrigin;
135 }
136
137 /**
138 * @override
139 * @param {?number} itemIndex
140 */
141 highlightItem(itemIndex) {
142 SDK.OverlayModel.hideDOMNodeHighlight();
143 if (itemIndex === null)
144 return;
145 var frame = this._items[itemIndex].frame;
146 var overlayModel = frame.resourceTreeModel().domModel().overlayModel();
147 overlayModel.highlightFrame(frame.id);
148 }
149
150 /**
151 * @override
152 * @param {number} itemIndex
153 * @param {string} query
154 * @param {!Element} titleElement
155 * @param {!Element} subtitleElement
156 */
157 renderItem(itemIndex, query, titleElement, subtitleElement) {
158 var frame = this._items[itemIndex].frame;
159 var indent = query ? 0 : (this._items[itemIndex].depth * 16);
160 var padding = 24 + indent + 'px';
161 titleElement.textContent = frame.displayName();
162 subtitleElement.textContent = frame.securityOrigin;
163 titleElement.style.paddingLeft = padding;
164 subtitleElement.style.paddingLeft = padding;
165 QuickOpen.FilteredListWidget.highlightRanges(titleElement, query, true);
166 QuickOpen.FilteredListWidget.highlightRanges(subtitleElement, query, true);
167 }
168
169 /**
170 * @override
171 * @param {?number} itemIndex
172 * @param {string} promptValue
173 */
174 selectItem(itemIndex, promptValue) {
175 if (itemIndex === null)
176 return;
177 var frame = this._items[itemIndex].frame;
178 this._menu.selectFrame(frame);
179 this._menu.dispatchEventToListeners(Resources.FrameMenu.Events.FrameSelected , frame);
180 }
181
182 /**
183 * @override
184 * @return {boolean}
185 */
186 renderAsTwoRows() {
187 return true;
188 }
189 };
190
191 /**
192 * @enum {symbol}
193 */
194 Resources.FrameMenu.Events = {
195 FrameSelected: Symbol('FrameSelected')
196 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698