Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 1 | // Copyright (c) 2020 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // @ts-nocheck |
| 6 | // TODO(crbug.com/1011811): Enable TypeScript compiler checks |
| 7 | |
| 8 | import * as Common from '../common/common.js'; |
| 9 | import * as SDK from '../sdk/sdk.js'; |
| 10 | import * as UI from '../ui/ui.js'; |
| 11 | |
Alex Rudenko | 21a9ca3 | 2020-08-18 06:11:37 | [diff] [blame] | 12 | import {ElementsPanel} from './ElementsPanel.js'; |
Jack Franklin | fb0426e | 2020-08-18 11:09:52 | [diff] [blame] | 13 | import {createLayoutPane, LayoutElement} from './LayoutPane_bridge.js'; // eslint-disable-line no-unused-vars |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 14 | |
| 15 | /** |
| 16 | * @param {!Array<!SDK.DOMModel.DOMNode>} nodes |
Jack Franklin | fb0426e | 2020-08-18 11:09:52 | [diff] [blame] | 17 | * @return {!Array<!LayoutElement>} |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 18 | */ |
| 19 | const gridNodesToElements = nodes => { |
Patrick Brosset | bf746e6 | 2020-08-14 08:43:14 | [diff] [blame] | 20 | return nodes.map(node => { |
| 21 | const className = node.getAttribute('class'); |
| 22 | return { |
| 23 | id: node.id, |
Patrick Brosset | 1824faf | 2020-09-03 09:10:49 | [diff] [blame] | 24 | color: node.domModel().overlayModel().colorOfGridInPersistentOverlay(node.id), |
Patrick Brosset | bf746e6 | 2020-08-14 08:43:14 | [diff] [blame] | 25 | name: node.localName(), |
| 26 | domId: node.getAttribute('id'), |
Patrick Brosset | af165fe | 2020-08-28 12:10:39 | [diff] [blame] | 27 | domClasses: className ? className.split(/\s+/).filter(s => !!s) : null, |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 28 | enabled: node.domModel().overlayModel().isHighlightedGridInPersistentOverlay(node.id), |
| 29 | reveal: () => { |
| 30 | ElementsPanel.instance().revealAndSelectNode(node, true, true); |
Patrick Brosset | 50e1d66 | 2020-09-14 12:41:44 | [diff] [blame] | 31 | node.scrollIntoView(); |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 32 | }, |
| 33 | toggle: value => { |
| 34 | if (value) { |
| 35 | node.domModel().overlayModel().highlightGridInPersistentOverlay(node.id); |
| 36 | } else { |
| 37 | node.domModel().overlayModel().hideGridInPersistentOverlay(node.id); |
| 38 | } |
Alex Rudenko | bc83da9 | 2020-09-15 08:46:53 | [diff] [blame^] | 39 | }, |
| 40 | setColor(value) { |
| 41 | this.color = value; |
| 42 | node.domModel().overlayModel().setColorOfGridInPersistentOverlay(node.id, value); |
| 43 | }, |
Patrick Brosset | bf746e6 | 2020-08-14 08:43:14 | [diff] [blame] | 44 | }; |
| 45 | }); |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 46 | }; |
Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 47 | |
| 48 | /** |
| 49 | * @unrestricted |
| 50 | */ |
| 51 | export class LayoutSidebarPane extends UI.ThrottledWidget.ThrottledWidget { |
| 52 | constructor() { |
| 53 | super(true /* isWebComponent */); |
| 54 | this._layoutPane = createLayoutPane(); |
| 55 | this.contentElement.appendChild(this._layoutPane); |
Alex Rudenko | b779980 | 2020-08-26 10:18:54 | [diff] [blame] | 56 | this._settings = ['showGridLineLabels', 'showGridTrackSizes', 'showGridAreas', 'extendGridLines']; |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 57 | this._boundOnSettingChanged = this.onSettingChanged.bind(this); |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 58 | this._domModels = []; |
Alex Rudenko | 0e97afa | 2020-08-14 09:51:11 | [diff] [blame] | 59 | } |
| 60 | |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 61 | /** |
| 62 | * @param {!SDK.DOMModel.DOMModel} domModel |
| 63 | */ |
| 64 | modelAdded(domModel) { |
| 65 | const overlayModel = domModel.overlayModel(); |
| 66 | overlayModel.addEventListener(SDK.OverlayModel.Events.PersistentGridOverlayCleared, this.update, this); |
| 67 | overlayModel.addEventListener(SDK.OverlayModel.Events.PersistentGridOverlayStateChanged, this.update, this); |
| 68 | this._domModels.push(domModel); |
| 69 | } |
| 70 | |
| 71 | /** |
| 72 | * @param {!SDK.DOMModel.DOMModel} domModel |
| 73 | */ |
| 74 | modelRemoved(domModel) { |
| 75 | const overlayModel = domModel.overlayModel(); |
| 76 | overlayModel.removeEventListener(SDK.OverlayModel.Events.PersistentGridOverlayCleared, this.update, this); |
| 77 | overlayModel.removeEventListener(SDK.OverlayModel.Events.PersistentGridOverlayStateChanged, this.update, this); |
| 78 | this._domModels = this._domModels.filter(model => model !== domModel); |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 79 | } |
| 80 | |
| 81 | async _fetchGridNodes() { |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 82 | const nodes = []; |
| 83 | for (const domModel of this._domModels) { |
| 84 | const nodeIds = await domModel.getNodesByStyle( |
| 85 | [{name: 'display', value: 'grid'}, {name: 'display', value: 'inline-grid'}], true /* pierce */); |
| 86 | |
| 87 | nodes.push(...nodeIds.map(id => domModel.nodeForId(id)).filter(node => node !== null)); |
| 88 | } |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 89 | return nodes; |
| 90 | } |
| 91 | |
| 92 | _mapSettings() { |
| 93 | return this._settings |
| 94 | .map(settingName => { |
| 95 | const setting = Common.Settings.Settings.instance().moduleSetting(settingName); |
| 96 | const ext = setting.extension(); |
| 97 | if (!ext) { |
| 98 | return null; |
| 99 | } |
| 100 | const descriptor = ext.descriptor(); |
| 101 | return { |
| 102 | type: descriptor.settingType, |
| 103 | name: descriptor.settingName, |
| 104 | title: descriptor.title, |
| 105 | value: setting.get(), |
| 106 | options: descriptor.options.map(opt => ({ |
| 107 | title: opt.text, |
| 108 | value: opt.value, |
| 109 | })) |
| 110 | }; |
| 111 | }) |
| 112 | .filter(descriptor => descriptor !== null); |
Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | /** |
| 116 | * @override |
| 117 | * @protected |
| 118 | * @return {!Promise<void>} |
| 119 | */ |
| 120 | async doUpdate() { |
| 121 | this._layoutPane.data = { |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 122 | gridElements: gridNodesToElements(await this._fetchGridNodes()), |
| 123 | settings: this._mapSettings(), |
Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 124 | }; |
| 125 | } |
| 126 | |
| 127 | /** |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 128 | * @param {*} event |
| 129 | */ |
| 130 | onSettingChanged(event) { |
| 131 | Common.Settings.Settings.instance().moduleSetting(event.data.setting).set(event.data.value); |
| 132 | } |
| 133 | |
| 134 | /** |
Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 135 | * @override |
| 136 | */ |
| 137 | wasShown() { |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 138 | for (const setting of this._settings) { |
| 139 | Common.Settings.Settings.instance().moduleSetting(setting).addChangeListener(this.update, this); |
| 140 | } |
| 141 | this._layoutPane.addEventListener('setting-changed', this._boundOnSettingChanged); |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 142 | for (const domModel of this._domModels) { |
| 143 | this.modelRemoved(domModel); |
| 144 | } |
| 145 | this._domModels = []; |
| 146 | SDK.SDKModel.TargetManager.instance().observeModels(SDK.DOMModel.DOMModel, this); |
Tim van der Lippe | d1a00aa | 2020-08-19 16:03:56 | [diff] [blame] | 147 | UI.Context.Context.instance().addFlavorChangeListener(SDK.DOMModel.DOMNode, this.update, this); |
Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 148 | this.update(); |
| 149 | } |
| 150 | |
| 151 | /** |
| 152 | * @override |
| 153 | */ |
| 154 | willHide() { |
Alex Rudenko | 034db88 | 2020-08-13 12:21:09 | [diff] [blame] | 155 | for (const setting of this._settings) { |
| 156 | Common.Settings.Settings.instance().moduleSetting(setting).removeChangeListener(this.update, this); |
| 157 | } |
| 158 | this._layoutPane.removeEventListener('setting-changed', this._boundOnSettingChanged); |
Alex Rudenko | 7529de9 | 2020-08-20 09:47:05 | [diff] [blame] | 159 | SDK.SDKModel.TargetManager.instance().unobserveModels(SDK.DOMModel.DOMModel, this); |
Tim van der Lippe | d1a00aa | 2020-08-19 16:03:56 | [diff] [blame] | 160 | UI.Context.Context.instance().removeFlavorChangeListener(SDK.DOMModel.DOMNode, this.update, this); |
Alex Rudenko | a39d214 | 2020-08-11 05:09:40 | [diff] [blame] | 161 | } |
| 162 | } |