diff options
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Views/CollectionContentView.js')
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Views/CollectionContentView.js | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Views/CollectionContentView.js b/Source/WebInspectorUI/UserInterface/Views/CollectionContentView.js new file mode 100644 index 000000000..2b06b3fb2 --- /dev/null +++ b/Source/WebInspectorUI/UserInterface/Views/CollectionContentView.js @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2016 Devin Rousso <dcrousso+webkit@gmail.com>. 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); + } +}; |