/* * Copyright (C) 2016 Devin Rousso . All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ WebInspector.CollectionContentView = class CollectionContentView extends WebInspector.ContentView { constructor(collection) { console.assert(collection instanceof WebInspector.Collection); super(collection); this.representedObject.addEventListener(WebInspector.Collection.Event.ItemAdded, this._handleItemAdded, this); this.representedObject.addEventListener(WebInspector.Collection.Event.ItemRemoved, this._handleItemRemoved, this); this._contentViewMap = new WeakMap; this._handleClickMap = new WeakMap; this._contentViewConstructor = null; let title = ""; switch (this.representedObject.typeVerifier) { case WebInspector.Collection.TypeVerifier.Frame: title = WebInspector.UIString("Frames"); break; case WebInspector.Collection.TypeVerifier.ContentFlow: title = WebInspector.UIString("Flows"); break; case WebInspector.Collection.TypeVerifier.Script: title = WebInspector.UIString("Extra Scripts"); break; case WebInspector.Collection.TypeVerifier.Resource: title = WebInspector.UIString("Resource"); break; case WebInspector.ResourceCollection.TypeVerifier.Document: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Document, true); break; case WebInspector.ResourceCollection.TypeVerifier.Stylesheet: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Stylesheet, true); break; case WebInspector.ResourceCollection.TypeVerifier.Image: this._contentViewConstructor = WebInspector.ImageResourceContentView; title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Image, true); break; case WebInspector.ResourceCollection.TypeVerifier.Font: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Font, true); break; case WebInspector.ResourceCollection.TypeVerifier.Script: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Script, true); break; case WebInspector.ResourceCollection.TypeVerifier.XHR: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.XHR, true); break; case WebInspector.ResourceCollection.TypeVerifier.Fetch: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Fetch, true); break; case WebInspector.ResourceCollection.TypeVerifier.WebSocket: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.WebSocket, true); break; case WebInspector.ResourceCollection.TypeVerifier.Other: title = WebInspector.Resource.displayNameForType(WebInspector.Resource.Type.Other, true); break; } this._contentPlaceholder = new WebInspector.TitleView(title); this.element.classList.add("collection"); } // Public initialLayout() { let items = this.representedObject.items; if (this._contentViewConstructor && items.size) { for (let item of items) this._addContentViewForItem(item); } else this.addSubview(this._contentPlaceholder); } // Private _addContentViewForItem(item) { if (!this._contentViewConstructor) return; if (this._contentPlaceholder.parentView) this.removeSubview(this._contentPlaceholder); let contentView = new this._contentViewConstructor(item); contentView.addEventListener(WebInspector.ResourceContentView.Event.ContentError, this._handleContentError, this); let handleClick = (event) => { if (event.button !== 0 || event.ctrlKey) return; WebInspector.showRepresentedObject(item); }; this._handleClickMap.set(item, handleClick); contentView.element.addEventListener("click", handleClick); contentView.element.title = WebInspector.displayNameForURL(item.url, item.urlComponents); this.addSubview(contentView); this._contentViewMap.set(item, contentView); } _removeContentViewForItem(item) { if (!this._contentViewConstructor) return; let contentView = this._contentViewMap.get(item); console.assert(contentView); if (!contentView) return; this.removeSubview(contentView); this._contentViewMap.delete(item); contentView.removeEventListener(null, null, this); let handleClick = this._handleClickMap.get(item); console.assert(handleClick); if (handleClick) { contentView.element.removeEventListener("click", handleClick); this._handleClickMap.delete(item); } if (!this.representedObject.resources.length) this.addSubview(this._contentPlaceholder); } _handleItemAdded(event) { let item = event.data.item; if (!item) return; this._addContentViewForItem(item); } _handleItemRemoved(event) { let item = event.data.item; if (!item) return; this._removeContentViewForItem(item); } _handleContentError(event) { if (event && event.target) this._removeContentViewForItem(event.target.representedObject); } };