|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | /** | 
|  | * @implements {Network.GroupLookupInterface} | 
|  | */ | 
|  | export default class NetworkFrameGrouper { | 
|  | /** | 
|  | * @param {!Network.NetworkLogView} parentView | 
|  | */ | 
|  | constructor(parentView) { | 
|  | this._parentView = parentView; | 
|  | /** @type {!Map<!SDK.ResourceTreeFrame, !FrameGroupNode>} */ | 
|  | this._activeGroups = new Map(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @override | 
|  | * @param {!SDK.NetworkRequest} request | 
|  | * @return {?Network.NetworkGroupNode} | 
|  | */ | 
|  | groupNodeForRequest(request) { | 
|  | const frame = SDK.ResourceTreeModel.frameForRequest(request); | 
|  | if (!frame || frame.isTopFrame()) { | 
|  | return null; | 
|  | } | 
|  | let groupNode = this._activeGroups.get(frame); | 
|  | if (groupNode) { | 
|  | return groupNode; | 
|  | } | 
|  | groupNode = new FrameGroupNode(this._parentView, frame); | 
|  | this._activeGroups.set(frame, groupNode); | 
|  | return groupNode; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @override | 
|  | */ | 
|  | reset() { | 
|  | this._activeGroups.clear(); | 
|  | } | 
|  | } | 
|  |  | 
|  | export class FrameGroupNode extends Network.NetworkGroupNode { | 
|  | /** | 
|  | * @param {!Network.NetworkLogView} parentView | 
|  | * @param {!SDK.ResourceTreeFrame} frame | 
|  | */ | 
|  | constructor(parentView, frame) { | 
|  | super(parentView); | 
|  | this._frame = frame; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @override | 
|  | */ | 
|  | displayName() { | 
|  | return new Common.ParsedURL(this._frame.url).domain() || this._frame.name || '<iframe>'; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @override | 
|  | * @param {!Element} cell | 
|  | * @param {string} columnId | 
|  | */ | 
|  | renderCell(cell, columnId) { | 
|  | super.renderCell(cell, columnId); | 
|  | const columnIndex = this.dataGrid.indexOfVisibleColumn(columnId); | 
|  | if (columnIndex === 0) { | 
|  | const name = this.displayName(); | 
|  | cell.appendChild(UI.Icon.create('largeicon-navigator-frame', 'network-frame-group-icon')); | 
|  | cell.createTextChild(name); | 
|  | cell.title = name; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Legacy exported object */ | 
|  | self.Network = self.Network || {}; | 
|  |  | 
|  | /* Legacy exported object */ | 
|  | Network = Network || {}; | 
|  |  | 
|  | /** | 
|  | * @constructor | 
|  | */ | 
|  | Network.NetworkFrameGrouper = NetworkFrameGrouper; | 
|  |  | 
|  | /** | 
|  | * @constructor | 
|  | */ | 
|  | Network.FrameGroupNode = FrameGroupNode; |