blob: 2b06b3fb20c22ff9f8a166b0b08afd1243aec406 [file] [log] [blame]
/*
* 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);
}
};