|  | // Copyright 2019 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. | 
|  |  | 
|  | /** | 
|  | * @unrestricted | 
|  | */ | 
|  | export class CSSOverviewPanel extends UI.Panel { | 
|  | constructor() { | 
|  | super('css_overview'); | 
|  | this.registerRequiredCSS('css_overview/cssOverview.css'); | 
|  | this.element.classList.add('css-overview-panel'); | 
|  |  | 
|  | const [model] = SDK.targetManager.models(CssOverview.CSSOverviewModel); | 
|  | this._model = model; | 
|  |  | 
|  | this._controller = new CssOverview.OverviewController(); | 
|  | this._startView = new CssOverview.CSSOverviewStartView(this._controller); | 
|  | this._processingView = new CssOverview.CSSOverviewProcessingView(this._controller); | 
|  | this._completedView = new CssOverview.CSSOverviewCompletedView(this._controller, model.target()); | 
|  |  | 
|  | this._controller.addEventListener(CssOverview.Events.RequestOverviewStart, this._startOverview, this); | 
|  | this._controller.addEventListener(CssOverview.Events.RequestOverviewCancel, this._cancelOverview, this); | 
|  | this._controller.addEventListener(CssOverview.Events.OverviewCompleted, this._overviewCompleted, this); | 
|  | this._controller.addEventListener(CssOverview.Events.Reset, this._reset, this); | 
|  | this._controller.addEventListener(CssOverview.Events.RequestNodeHighlight, this._requestNodeHighlight, this); | 
|  |  | 
|  | this._reset(); | 
|  | } | 
|  |  | 
|  | _reset() { | 
|  | this._backgroundColors = new Map(); | 
|  | this._textColors = new Map(); | 
|  | this._fillColors = new Map(); | 
|  | this._borderColors = new Map(); | 
|  | this._fontInfo = new Map(); | 
|  | this._mediaQueries = []; | 
|  | this._unusedDeclarations = new Map(); | 
|  | this._elementCount = 0; | 
|  | this._cancelled = false; | 
|  | this._globalStyleStats = { | 
|  | styleRules: 0, | 
|  | inlineStyles: 0, | 
|  | externalSheets: 0, | 
|  | stats: { | 
|  | // Simple. | 
|  | type: 0, | 
|  | class: 0, | 
|  | id: 0, | 
|  | universal: 0, | 
|  | attribute: 0, | 
|  |  | 
|  | // Non-simple. | 
|  | nonSimple: 0 | 
|  | } | 
|  | }; | 
|  | this._renderInitialView(); | 
|  | } | 
|  |  | 
|  | _requestNodeHighlight(evt) { | 
|  | this._model.highlightNode(evt.data); | 
|  | } | 
|  |  | 
|  | _renderInitialView() { | 
|  | this._processingView.hideWidget(); | 
|  | this._completedView.hideWidget(); | 
|  |  | 
|  | this._startView.show(this.contentElement); | 
|  | } | 
|  |  | 
|  | _renderOverviewStartedView() { | 
|  | this._startView.hideWidget(); | 
|  | this._completedView.hideWidget(); | 
|  |  | 
|  | this._processingView.show(this.contentElement); | 
|  | } | 
|  |  | 
|  | _renderOverviewCompletedView() { | 
|  | this._startView.hideWidget(); | 
|  | this._processingView.hideWidget(); | 
|  |  | 
|  | this._completedView.show(this.contentElement); | 
|  | this._completedView.setOverviewData({ | 
|  | backgroundColors: this._backgroundColors, | 
|  | textColors: this._textColors, | 
|  | fillColors: this._fillColors, | 
|  | borderColors: this._borderColors, | 
|  | globalStyleStats: this._globalStyleStats, | 
|  | fontInfo: this._fontInfo, | 
|  | elementCount: this._elementCount, | 
|  | mediaQueries: this._mediaQueries, | 
|  | unusedDeclarations: this._unusedDeclarations, | 
|  | }); | 
|  | } | 
|  |  | 
|  | async _startOverview() { | 
|  | this._renderOverviewStartedView(); | 
|  |  | 
|  | const [globalStyleStats, {elementCount, backgroundColors, textColors, fillColors, borderColors, fontInfo, unusedDeclarations}, mediaQueries] = | 
|  | await Promise.all([ | 
|  | this._model.getGlobalStylesheetStats(), this._model.getNodeStyleStats(), | 
|  | this._model.getMediaQueries() | 
|  | ]); | 
|  |  | 
|  | if (elementCount) { | 
|  | this._elementCount = elementCount; | 
|  | } | 
|  |  | 
|  | if (globalStyleStats) { | 
|  | this._globalStyleStats = globalStyleStats; | 
|  | } | 
|  |  | 
|  | if (mediaQueries) { | 
|  | this._mediaQueries = mediaQueries; | 
|  | } | 
|  |  | 
|  | if (backgroundColors) { | 
|  | this._backgroundColors = backgroundColors; | 
|  | } | 
|  |  | 
|  | if (textColors) { | 
|  | this._textColors = textColors; | 
|  | } | 
|  |  | 
|  | if (fillColors) { | 
|  | this._fillColors = fillColors; | 
|  | } | 
|  |  | 
|  | if (borderColors) { | 
|  | this._borderColors = borderColors; | 
|  | } | 
|  |  | 
|  | if (fontInfo) { | 
|  | this._fontInfo = fontInfo; | 
|  | } | 
|  |  | 
|  | if (unusedDeclarations) { | 
|  | this._unusedDeclarations = unusedDeclarations; | 
|  | } | 
|  |  | 
|  | this._controller.dispatchEventToListeners(CssOverview.Events.OverviewCompleted); | 
|  | } | 
|  |  | 
|  | _getStyleValue(styles, name) { | 
|  | const item = styles.filter(style => style.name === name); | 
|  | if (!item.length) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | return item[0].value; | 
|  | } | 
|  |  | 
|  | _cancelOverview() { | 
|  | this._cancelled = true; | 
|  | } | 
|  |  | 
|  | _overviewCompleted() { | 
|  | this._renderOverviewCompletedView(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Legacy exported object */ | 
|  | self.CssOverview = self.CssOverview || {}; | 
|  |  | 
|  | /* Legacy exported object */ | 
|  | CssOverview = CssOverview || {}; | 
|  |  | 
|  | /** | 
|  | * @constructor | 
|  | */ | 
|  | CssOverview.CSSOverviewPanel = CSSOverviewPanel; |