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

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

Issue 2712043002: [DevTools] Separate frames and resources handling (Closed)
Patch Set: Added missing null check 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 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.ResourcesSection = class {
6 /**
7 * @param {!Resources.ResourcesPanel} storagePanel
8 * @param {!UI.TreeElement} treeElement
9 */
10 constructor(storagePanel, treeElement) {
11 this._panel = storagePanel;
12 this._treeElement = treeElement;
13 /** @type {!Map<string, !Resources.FrameTreeElement>} */
14 this._treeElementForFrameId = new Map();
15
16 function addListener(eventType, handler, target) {
17 SDK.targetManager.addModelListener(SDK.ResourceTreeModel, eventType, event => handler.call(target, event.data));
18 }
19 addListener(SDK.ResourceTreeModel.Events.FrameAdded, this.frameAdded, this);
caseq 2017/03/03 21:59:54 let's keep listeners private.
eostroukhov 2017/03/04 00:16:36 Done.
20 addListener(SDK.ResourceTreeModel.Events.FrameNavigated, this.frameNavigated , this);
21 addListener(SDK.ResourceTreeModel.Events.FrameDetached, this.frameDetached, this);
22 addListener(SDK.ResourceTreeModel.Events.ResourceAdded, this.resourceAdded, this);
23
24 var mainTarget = SDK.targetManager.mainTarget();
25 var resourceTreeModel = mainTarget && mainTarget.hasDOMCapability() && SDK.R esourceTreeModel.fromTarget(mainTarget);
26 var mainFrame = resourceTreeModel && resourceTreeModel.mainFrame;
27 if (mainFrame)
28 this.populateFrame(mainFrame);
dgozman 2017/02/25 00:54:42 Why populate with main frame?
eostroukhov 2017/02/25 01:00:22 It is the root node.
29 }
30
31 /**
32 * @param {!SDK.ResourceTreeFrame} frame
33 * @returns {?SDK.ResourceTreeFrame}
34 */
35 static _getParentFrame(frame) {
36 var parentFrame = frame.parentFrame;
37 if (parentFrame)
38 return parentFrame;
39 var parentTarget = frame.target().parentTarget();
40 while (parentTarget && !parentTarget.hasDOMCapability())
caseq 2017/03/03 21:59:54 Does it ever happen?
eostroukhov 2017/03/04 00:16:36 Changed to console.assert, as per offline discussi
41 parentTarget = parentTarget.parentTarget();
42 if (!parentTarget)
43 return null;
44 var model = SDK.ResourceTreeModel.fromTarget(parentTarget);
45 return model.mainFrame;
46 }
47
48 /**
49 * @param {!SDK.ResourceTreeFrame} frame
50 */
51 frameAdded(frame) {
52 var parentFrame = Resources.ResourcesSection._getParentFrame(frame);
53 var parentTreeElement = parentFrame ? this._treeElementForFrameId.get(parent Frame.id) : this._treeElement;
54 if (!parentTreeElement) {
55 console.warn('No frame to route ' + frame.url + ' to.');
caseq 2017/03/03 21:59:54 nit: `No frame to route ${frame.url} to.`
eostroukhov 2017/03/04 00:16:36 Done.
56 return;
57 }
58
59 var frameTreeElement = new Resources.FrameTreeElement(this._panel, frame);
60 this._treeElementForFrameId.set(frame.id, frameTreeElement);
61 parentTreeElement.appendChild(frameTreeElement);
62 }
63
64 /**
65 * @param {!SDK.ResourceTreeFrame} frame
66 */
67 frameDetached(frame) {
68 var frameTreeElement = this._treeElementForFrameId.get(frame.id);
69 if (!frameTreeElement)
70 return;
71
72 this._treeElementForFrameId.remove(frame.id);
73 if (frameTreeElement.parent)
74 frameTreeElement.parent.removeChild(frameTreeElement);
75 }
76
77 /**
78 * @param {!SDK.ResourceTreeFrame} frame
79 */
80 frameNavigated(frame) {
81 if (!Resources.ResourcesSection._getParentFrame(frame))
82 return;
83 var frameTreeElement = this._treeElementForFrameId.get(frame.id);
84 if (frameTreeElement)
85 frameTreeElement.frameNavigated(frame);
86 }
87
88 /**
89 * @param {!SDK.Resource} resource
90 */
91 resourceAdded(resource) {
92 var statusCode = resource['statusCode'];
93 if (statusCode >= 301 && statusCode <= 303)
94 return;
95
96 var frameTreeElement = this._treeElementForFrameId.get(resource.frameId);
97 if (!frameTreeElement) {
98 // This is a frame's main resource, it will be retained
99 // and re-added by the resource manager;
100 return;
101 }
102
103 frameTreeElement.appendResource(resource);
104 }
105
106 reset() {
107 this._treeElement.removeChildren();
108 this._treeElementForFrameId.clear();
109 }
110
111 /**
112 * @param {!SDK.ResourceTreeFrame} frame
113 */
114 populateFrame(frame) {
115 this.frameAdded(frame);
116 for (var child of frame.childFrames)
117 this.populateFrame(child);
118 for (var resource of frame.resources())
119 this.resourceAdded(resource);
120 }
121 };
122
123 Resources.FrameTreeElement = class extends Resources.BaseStorageTreeElement {
dgozman 2017/02/25 00:54:42 Didn't we agree on the frame picker? Why is there
eostroukhov 2017/02/25 01:00:22 This is a refactoring change, functionality remain
caseq 2017/03/03 21:59:55 Mind re-uploading with --similarity=<something-sma
eostroukhov 2017/03/04 00:16:36 I tried that.
124 /**
125 * @param {!Resources.ResourcesPanel} storagePanel
126 * @param {!SDK.ResourceTreeFrame} frame
127 */
128 constructor(storagePanel, frame) {
129 super(storagePanel, '', false);
130 this._panel = storagePanel;
131 this._frame = frame;
132 this._frameId = frame.id;
133 this._categoryElements = {};
134 this._treeElementForResource = {};
135 this.frameNavigated(frame);
136
137 var icon = UI.Icon.create('largeicon-navigator-frame', 'navigator-tree-item' );
138 icon.classList.add('navigator-frame-tree-item');
139 this.setLeadingIcons([icon]);
140 }
141
142 frameNavigated(frame) {
143 this.removeChildren();
144 this._frameId = frame.id;
145 this.title = frame.displayName();
146 this._categoryElements = {};
147 this._treeElementForResource = {};
148 }
149
150 get itemURL() {
151 return 'frame://' + encodeURI(this.titleAsText());
152 }
153
154 /**
155 * @override
156 * @return {boolean}
157 */
158 onselect(selectedByUser) {
159 super.onselect(selectedByUser);
160 this._panel.showCategoryView(this.titleAsText());
161
162 this.listItemElement.classList.remove('hovered');
163 SDK.DOMModel.hideDOMNodeHighlight();
164 return false;
165 }
166
167 set hovered(hovered) {
168 if (hovered) {
169 this.listItemElement.classList.add('hovered');
170 var domModel = SDK.DOMModel.fromTarget(this._frame.target());
171 if (domModel)
172 domModel.highlightFrame(this._frameId);
173 } else {
174 this.listItemElement.classList.remove('hovered');
175 SDK.DOMModel.hideDOMNodeHighlight();
176 }
177 }
178
179 /**
180 * @param {!SDK.Resource} resource
181 */
182 appendResource(resource) {
183 var resourceType = resource.resourceType();
184 var categoryName = resourceType.name();
185 var categoryElement = resourceType === Common.resourceTypes.Document ? this : this._categoryElements[categoryName];
186 if (!categoryElement) {
187 categoryElement =
188 new Resources.StorageCategoryTreeElement(this._panel, resource.resourc eType().category().title, categoryName);
189 this._categoryElements[resourceType.name()] = categoryElement;
190 this._insertInPresentationOrder(this, categoryElement);
191 }
192 var resourceTreeElement = new Resources.FrameResourceTreeElement(this._panel , resource);
193 this._insertInPresentationOrder(categoryElement, resourceTreeElement);
194 this._treeElementForResource[resource.url] = resourceTreeElement;
195 }
196
197 /**
198 * @param {string} url
199 * @return {?SDK.Resource}
200 */
201 resourceByURL(url) {
202 var treeElement = this._treeElementForResource[url];
203 return treeElement ? treeElement._resource : null;
204 }
205
206 /**
207 * @override
208 */
209 appendChild(treeElement) {
210 this._insertInPresentationOrder(this, treeElement);
211 }
212
213 _insertInPresentationOrder(parentTreeElement, childTreeElement) {
214 // Insert in the alphabetical order, first frames, then resources. Document resource goes last.
215 function typeWeight(treeElement) {
216 if (treeElement instanceof Resources.StorageCategoryTreeElement)
217 return 2;
218 if (treeElement instanceof Resources.FrameTreeElement)
219 return 1;
220 return 3;
221 }
222
223 function compare(treeElement1, treeElement2) {
224 var typeWeight1 = typeWeight(treeElement1);
225 var typeWeight2 = typeWeight(treeElement2);
226
227 var result;
228 if (typeWeight1 > typeWeight2)
229 result = 1;
230 else if (typeWeight1 < typeWeight2)
231 result = -1;
232 else
233 result = treeElement1.titleAsText().localeCompare(treeElement2.titleAsTe xt());
234 return result;
235 }
236
237 var childCount = parentTreeElement.childCount();
238 var i;
239 for (i = 0; i < childCount; ++i) {
240 if (compare(childTreeElement, parentTreeElement.childAt(i)) < 0)
241 break;
242 }
243 parentTreeElement.insertChild(childTreeElement, i);
244 }
245 };
246
247 Resources.FrameResourceTreeElement = class extends Resources.BaseStorageTreeElem ent {
248 /**
249 * @param {!Resources.ResourcesPanel} storagePanel
250 * @param {!SDK.Resource} resource
251 */
252 constructor(storagePanel, resource) {
253 super(storagePanel, resource.displayName, false);
254 this._panel = storagePanel;
255 /** @type {!SDK.Resource} */
256 this._resource = resource;
257 /** @type {?SourceFrame.ResourceSourceFrame} */
258 this._sourceFrame = null;
259 this.tooltip = resource.url;
260 this._resource[Resources.FrameResourceTreeElement._symbol] = this;
261
262 var icon = UI.Icon.create('largeicon-navigator-file', 'navigator-tree-item') ;
263 icon.classList.add('navigator-file-tree-item');
264 icon.classList.add('navigator-' + resource.resourceType().name() + '-tree-it em');
265 this.setLeadingIcons([icon]);
266 }
267
268 /**
269 * @param {!SDK.Resource} resource
270 */
271 static forResource(resource) {
272 return resource[Resources.FrameResourceTreeElement._symbol];
273 }
274
275 /**
276 * @param {!SDK.Resource} resource
277 * @return {?UI.Widget}
278 */
279 static resourceViewForResource(resource) {
280 if (resource.hasTextContent()) {
281 var treeElement = Resources.FrameResourceTreeElement.forResource(resource) ;
282 if (!treeElement)
283 return null;
284 return treeElement._sourceView();
285 }
286
287 switch (resource.resourceType()) {
288 case Common.resourceTypes.Image:
289 return new SourceFrame.ImageView(resource.mimeType, resource);
290 case Common.resourceTypes.Font:
291 return new SourceFrame.FontView(resource.mimeType, resource);
292 default:
293 return new UI.EmptyWidget(resource.url);
294 }
295 }
296
297 get itemURL() {
298 return this._resource.url;
299 }
300
301 /**
302 * @override
303 * @return {boolean}
304 */
305 onselect(selectedByUser) {
306 super.onselect(selectedByUser);
307 this.showView(Resources.FrameResourceTreeElement.resourceViewForResource(thi s._resource));
308 return false;
309 }
310
311 /**
312 * @override
313 * @return {boolean}
314 */
315 ondblclick(event) {
316 InspectorFrontendHost.openInNewTab(this._resource.url);
317 return false;
318 }
319
320 /**
321 * @override
322 */
323 onattach() {
324 super.onattach();
325 this.listItemElement.draggable = true;
326 this.listItemElement.addEventListener('dragstart', this._ondragstart.bind(th is), false);
327 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
328 }
329
330 /**
331 * @param {!MouseEvent} event
332 * @return {boolean}
333 */
334 _ondragstart(event) {
335 event.dataTransfer.setData('text/plain', this._resource.content || '');
336 event.dataTransfer.effectAllowed = 'copy';
337 return true;
338 }
339
340 _handleContextMenuEvent(event) {
341 var contextMenu = new UI.ContextMenu(event);
342 contextMenu.appendApplicableItems(this._resource);
343 contextMenu.show();
344 }
345
346 /**
347 * @return {!SourceFrame.ResourceSourceFrame}
348 */
349 _sourceView() {
350 if (!this._sourceFrame) {
351 this._sourceFrame = new SourceFrame.ResourceSourceFrame(this._resource);
352 this._sourceFrame.setHighlighterType(this._resource.canonicalMimeType());
353 }
354 return this._sourceFrame;
355 }
356 };
357
358 Resources.FrameResourceTreeElement._symbol = Symbol('treeElement');
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698