blob: a6bb9418658a1781161b99b123b86734a6e51d74 [file] [log] [blame]
Alex Rudenkoa39d2142020-08-11 05:09:401// 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
8import * as Common from '../common/common.js';
9import * as SDK from '../sdk/sdk.js';
10import * as UI from '../ui/ui.js';
11
Alex Rudenko21a9ca32020-08-18 06:11:3712import {ElementsPanel} from './ElementsPanel.js';
Jack Franklinfb0426e2020-08-18 11:09:5213import {createLayoutPane, LayoutElement} from './LayoutPane_bridge.js'; // eslint-disable-line no-unused-vars
Alex Rudenko034db882020-08-13 12:21:0914
15/**
16 * @param {!Array<!SDK.DOMModel.DOMNode>} nodes
Jack Franklinfb0426e2020-08-18 11:09:5217 * @return {!Array<!LayoutElement>}
Alex Rudenko034db882020-08-13 12:21:0918 */
19const gridNodesToElements = nodes => {
Patrick Brossetbf746e62020-08-14 08:43:1420 return nodes.map(node => {
21 const className = node.getAttribute('class');
22 return {
23 id: node.id,
Patrick Brosset1824faf2020-09-03 09:10:4924 color: node.domModel().overlayModel().colorOfGridInPersistentOverlay(node.id),
Patrick Brossetbf746e62020-08-14 08:43:1425 name: node.localName(),
26 domId: node.getAttribute('id'),
Patrick Brossetaf165fe2020-08-28 12:10:3927 domClasses: className ? className.split(/\s+/).filter(s => !!s) : null,
Alex Rudenko7529de92020-08-20 09:47:0528 enabled: node.domModel().overlayModel().isHighlightedGridInPersistentOverlay(node.id),
29 reveal: () => {
30 ElementsPanel.instance().revealAndSelectNode(node, true, true);
Patrick Brosset50e1d662020-09-14 12:41:4431 node.scrollIntoView();
Alex Rudenko7529de92020-08-20 09:47:0532 },
33 toggle: value => {
34 if (value) {
35 node.domModel().overlayModel().highlightGridInPersistentOverlay(node.id);
36 } else {
37 node.domModel().overlayModel().hideGridInPersistentOverlay(node.id);
38 }
Alex Rudenkobc83da92020-09-15 08:46:5339 },
40 setColor(value) {
41 this.color = value;
42 node.domModel().overlayModel().setColorOfGridInPersistentOverlay(node.id, value);
43 },
Patrick Brossetbf746e62020-08-14 08:43:1444 };
45 });
Alex Rudenko034db882020-08-13 12:21:0946};
Alex Rudenkoa39d2142020-08-11 05:09:4047
48/**
49 * @unrestricted
50 */
51export class LayoutSidebarPane extends UI.ThrottledWidget.ThrottledWidget {
52 constructor() {
53 super(true /* isWebComponent */);
54 this._layoutPane = createLayoutPane();
55 this.contentElement.appendChild(this._layoutPane);
Alex Rudenkob7799802020-08-26 10:18:5456 this._settings = ['showGridLineLabels', 'showGridTrackSizes', 'showGridAreas', 'extendGridLines'];
Alex Rudenko034db882020-08-13 12:21:0957 this._boundOnSettingChanged = this.onSettingChanged.bind(this);
Alex Rudenko7529de92020-08-20 09:47:0558 this._domModels = [];
Alex Rudenko0e97afa2020-08-14 09:51:1159 }
60
Alex Rudenko7529de92020-08-20 09:47:0561 /**
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 Rudenko034db882020-08-13 12:21:0979 }
80
81 async _fetchGridNodes() {
Alex Rudenko7529de92020-08-20 09:47:0582 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 Rudenko034db882020-08-13 12:21:0989 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 Rudenkoa39d2142020-08-11 05:09:40113 }
114
115 /**
116 * @override
117 * @protected
118 * @return {!Promise<void>}
119 */
120 async doUpdate() {
121 this._layoutPane.data = {
Alex Rudenko034db882020-08-13 12:21:09122 gridElements: gridNodesToElements(await this._fetchGridNodes()),
123 settings: this._mapSettings(),
Alex Rudenkoa39d2142020-08-11 05:09:40124 };
125 }
126
127 /**
Alex Rudenko034db882020-08-13 12:21:09128 * @param {*} event
129 */
130 onSettingChanged(event) {
131 Common.Settings.Settings.instance().moduleSetting(event.data.setting).set(event.data.value);
132 }
133
134 /**
Alex Rudenkoa39d2142020-08-11 05:09:40135 * @override
136 */
137 wasShown() {
Alex Rudenko034db882020-08-13 12:21:09138 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 Rudenko7529de92020-08-20 09:47:05142 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 Lipped1a00aa2020-08-19 16:03:56147 UI.Context.Context.instance().addFlavorChangeListener(SDK.DOMModel.DOMNode, this.update, this);
Alex Rudenkoa39d2142020-08-11 05:09:40148 this.update();
149 }
150
151 /**
152 * @override
153 */
154 willHide() {
Alex Rudenko034db882020-08-13 12:21:09155 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 Rudenko7529de92020-08-20 09:47:05159 SDK.SDKModel.TargetManager.instance().unobserveModels(SDK.DOMModel.DOMModel, this);
Tim van der Lipped1a00aa2020-08-19 16:03:56160 UI.Context.Context.instance().removeFlavorChangeListener(SDK.DOMModel.DOMNode, this.update, this);
Alex Rudenkoa39d2142020-08-11 05:09:40161 }
162}