11// Copyright 2020 The Chromium Authors
22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
4- /* eslint-disable @devtools/no-lit-render-outside-of-view */
54
65import '../../../ui/kit/kit.js' ;
76
@@ -35,16 +34,18 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
3534const { render, html} = Lit ;
3635const { widgetConfig} = UI . Widget ;
3736
38- export interface LinearMemoryValueInterpreterData {
39- value : ArrayBuffer ;
40- valueTypes : Set < ValueType > ;
37+ export interface ViewInput {
4138 endianness : Endianness ;
42- valueTypeModes ?: Map < ValueType , ValueTypeMode > ;
39+ buffer : ArrayBuffer ;
40+ valueTypes : Set < ValueType > ;
41+ valueTypeModes : Map < ValueType , ValueTypeMode > ;
4342 memoryLength : number ;
43+ showSettings : boolean ;
4444 onValueTypeModeChange : ( type : ValueType , mode : ValueTypeMode ) => void ;
4545 onJumpToAddressClicked : ( address : number ) => void ;
4646 onEndiannessChanged : ( endianness : Endianness ) => void ;
4747 onValueTypeToggled : ( type : ValueType , checked : boolean ) => void ;
48+ onSettingsToggle : ( ) => void ;
4849}
4950
5051function renderEndiannessSetting (
@@ -68,42 +69,83 @@ function renderEndiannessSetting(
6869 // clang-format on
6970}
7071
71- export class LinearMemoryValueInterpreter extends HTMLElement {
72- readonly #shadow = this . attachShadow ( { mode : 'open' } ) ;
73- #onValueTypeModeChange: ( type : ValueType , mode : ValueTypeMode ) => void = ( ) => { } ;
74- #onJumpToAddressClicked: ( address : number ) => void = ( ) => { } ;
75- #onEndiannessChanged: ( endianness : Endianness ) => void = ( ) => { } ;
76- #onValueTypeToggled: ( type : ValueType , checked : boolean ) => void = ( ) => { } ;
72+ export const DEFAULT_VIEW = ( input : ViewInput , _output : undefined , target : HTMLElement ) : void => {
73+ // Disabled until https://crbug.com/1079231 is fixed.
74+ // clang-format off
75+ render ( html `
76+ < style > ${ UI . inspectorCommonStyles } </ style >
77+ < style > ${ linearMemoryValueInterpreterStyles } </ style >
78+ < div class ="value-interpreter ">
79+ < div class ="settings-toolbar ">
80+ ${ renderEndiannessSetting ( input . onEndiannessChanged , input . endianness ) }
81+ < devtools-button data-settings ="true " class ="toolbar-button ${ input . showSettings ? '' : 'disabled' } "
82+ title =${ i18nString ( UIStrings . toggleValueTypeSettings ) } @click =${ input . onSettingsToggle }
83+ jslog=${ VisualLogging . toggleSubpane ( 'linear-memory-inspector.toggle-value-settings' ) . track ( { click : true } ) }
84+ .iconName=${ 'gear' }
85+ .toggledIconName=${ 'gear-filled' }
86+ .toggleType=${ Buttons . Button . ToggleType . PRIMARY }
87+ .variant=${ Buttons . Button . Variant . ICON_TOGGLE }
88+ > </ devtools-button >
89+ </ div >
90+ < span class ="divider "> </ span >
91+ < div >
92+ ${ input . showSettings ?
93+ html `
94+ < devtools-widget .widgetConfig =${ widgetConfig ( ValueInterpreterSettings , {
95+ valueTypes : input . valueTypes , onToggle : input . onValueTypeToggled
96+ } ) } >
97+ </ devtools-widget > ` :
98+ html `
99+ < devtools-widget .widgetConfig =${ widgetConfig ( ValueInterpreterDisplay , {
100+ buffer : input . buffer ,
101+ valueTypes : input . valueTypes ,
102+ endianness : input . endianness ,
103+ valueTypeModes : input . valueTypeModes ,
104+ memoryLength : input . memoryLength ,
105+ onValueTypeModeChange : input . onValueTypeModeChange ,
106+ onJumpToAddressClicked : input . onJumpToAddressClicked ,
107+ } ) } >
108+ </ devtools-widget > ` }
109+ </ div >
110+ </ div >
111+ ` ,
112+ target ,
113+ ) ;
114+ // clang-format on
115+ } ;
116+
117+ export type View = typeof DEFAULT_VIEW ;
118+
119+ export class LinearMemoryValueInterpreter extends UI . Widget . Widget {
120+ readonly #view: View ;
77121 #endianness = Endianness . LITTLE ;
78122 #buffer = new ArrayBuffer ( 0 ) ;
79123 #valueTypes = new Set < ValueType > ( ) ;
80124 #valueTypeModeConfig = new Map < ValueType , ValueTypeMode > ( ) ;
81125 #memoryLength = 0 ;
82126 #showSettings = false ;
127+ #onValueTypeModeChange: ( type : ValueType , mode : ValueTypeMode ) => void = ( ) => { } ;
128+ #onJumpToAddressClicked: ( address : number ) => void = ( ) => { } ;
129+ #onEndiannessChanged: ( endianness : Endianness ) => void = ( ) => { } ;
130+ #onValueTypeToggled: ( type : ValueType , checked : boolean ) => void = ( ) => { } ;
83131
84- set data ( data : LinearMemoryValueInterpreterData ) {
85- this . #endianness = data . endianness ;
86- this . #buffer = data . value ;
87- this . #valueTypes = data . valueTypes ;
88- this . #valueTypeModeConfig = data . valueTypeModes || new Map ( ) ;
89- this . #memoryLength = data . memoryLength ;
90- this . #onValueTypeModeChange = data . onValueTypeModeChange ;
91- this . #onJumpToAddressClicked = data . onJumpToAddressClicked ;
92- this . #onEndiannessChanged = data . onEndiannessChanged ;
93- this . #onValueTypeToggled = data . onValueTypeToggled ;
94- this . #render( ) ;
132+ constructor ( element ?: HTMLElement , view : View = DEFAULT_VIEW ) {
133+ super ( element ) ;
134+ this . #view = view ;
95135 }
96136
97- set value ( value : ArrayBuffer ) {
137+ set buffer ( value : ArrayBuffer ) {
98138 this . #buffer = value ;
139+ this . requestUpdate ( ) ;
99140 }
100141
101- get value ( ) : ArrayBuffer {
142+ get buffer ( ) : ArrayBuffer {
102143 return this . #buffer;
103144 }
104145
105146 set valueTypes ( value : Set < ValueType > ) {
106147 this . #valueTypes = value ;
148+ this . requestUpdate ( ) ;
107149 }
108150
109151 get valueTypes ( ) : Set < ValueType > {
@@ -112,6 +154,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
112154
113155 set valueTypeModes ( value : Map < ValueType , ValueTypeMode > ) {
114156 this . #valueTypeModeConfig = value ;
157+ this . requestUpdate ( ) ;
115158 }
116159
117160 get valueTypeModes ( ) : Map < ValueType , ValueTypeMode > {
@@ -120,6 +163,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
120163
121164 set endianness ( value : Endianness ) {
122165 this . #endianness = value ;
166+ this . requestUpdate ( ) ;
123167 }
124168
125169 get endianness ( ) : Endianness {
@@ -128,6 +172,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
128172
129173 set memoryLength ( value : number ) {
130174 this . #memoryLength = value ;
175+ this . requestUpdate ( ) ;
131176 }
132177
133178 get memoryLength ( ) : number {
@@ -140,7 +185,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
140185
141186 set onValueTypeModeChange ( value : ( type : ValueType , mode : ValueTypeMode ) => void ) {
142187 this . #onValueTypeModeChange = value ;
143- this . #render ( ) ;
188+ this . requestUpdate ( ) ;
144189 }
145190
146191 get onJumpToAddressClicked ( ) : ( address : number ) => void {
@@ -149,7 +194,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
149194
150195 set onJumpToAddressClicked ( value : ( address : number ) => void ) {
151196 this . #onJumpToAddressClicked = value ;
152- this . #render ( ) ;
197+ this . requestUpdate ( ) ;
153198 }
154199
155200 get onEndiannessChanged ( ) : ( endianness : Endianness ) => void {
@@ -158,7 +203,7 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
158203
159204 set onEndiannessChanged ( value : ( endianness : Endianness ) => void ) {
160205 this . #onEndiannessChanged = value ;
161- this . #render ( ) ;
206+ this . performUpdate ( ) ;
162207 }
163208
164209 get onValueTypeToggled ( ) : ( type : ValueType , checked : boolean ) => void {
@@ -167,63 +212,28 @@ export class LinearMemoryValueInterpreter extends HTMLElement {
167212
168213 set onValueTypeToggled ( value : ( type : ValueType , checked : boolean ) => void ) {
169214 this . #onValueTypeToggled = value ;
170- this . #render( ) ;
171- }
172-
173- #render( ) : void {
174- // Disabled until https://crbug.com/1079231 is fixed.
175- // clang-format off
176- render ( html `
177- < style > ${ UI . inspectorCommonStyles } </ style >
178- < style > ${ linearMemoryValueInterpreterStyles } </ style >
179- < div class ="value-interpreter ">
180- < div class ="settings-toolbar ">
181- ${ renderEndiannessSetting ( this . #onEndiannessChanged, this . #endianness) }
182- < devtools-button data-settings ="true " class ="toolbar-button ${ this . #showSettings ? '' : 'disabled' } "
183- title =${ i18nString ( UIStrings . toggleValueTypeSettings ) } @click =${ this . #onSettingsToggle}
184- jslog=${ VisualLogging . toggleSubpane ( 'linear-memory-inspector.toggle-value-settings' ) . track ( { click : true } ) }
185- .iconName=${ 'gear' }
186- .toggledIconName=${ 'gear-filled' }
187- .toggleType=${ Buttons . Button . ToggleType . PRIMARY }
188- .variant=${ Buttons . Button . Variant . ICON_TOGGLE }
189- > </ devtools-button >
190- </ div >
191- < span class ="divider "> </ span >
192- < div >
193- ${ this . #showSettings ?
194- html `
195- < devtools-widget .widgetConfig =${ widgetConfig ( ValueInterpreterSettings , {
196- valueTypes : this . #valueTypes, onToggle : this . #onValueTypeToggled } ) } >
197- </ devtools-widget > ` :
198- html `
199- < devtools-widget .widgetConfig =${ widgetConfig ( ValueInterpreterDisplay , {
200- buffer : this . #buffer,
201- valueTypes : this . #valueTypes,
202- endianness : this . #endianness,
203- valueTypeModes : this . #valueTypeModeConfig,
204- memoryLength : this . #memoryLength,
205- onValueTypeModeChange : this . #onValueTypeModeChange,
206- onJumpToAddressClicked : this . #onJumpToAddressClicked,
207- } ) } >
208- </ devtools-widget > ` }
209- </ div >
210- </ div >
211- ` ,
212- this . #shadow, { host : this } ,
213- ) ;
214- // clang-format on
215+ this . performUpdate ( ) ;
216+ }
217+
218+ override performUpdate ( ) : void {
219+ const viewInput : ViewInput = {
220+ endianness : this . #endianness,
221+ buffer : this . #buffer,
222+ valueTypes : this . #valueTypes,
223+ valueTypeModes : this . #valueTypeModeConfig,
224+ memoryLength : this . #memoryLength,
225+ showSettings : this . #showSettings,
226+ onValueTypeModeChange : this . #onValueTypeModeChange,
227+ onJumpToAddressClicked : this . #onJumpToAddressClicked,
228+ onEndiannessChanged : this . #onEndiannessChanged,
229+ onValueTypeToggled : this . #onValueTypeToggled,
230+ onSettingsToggle : this . #onSettingsToggle. bind ( this ) ,
231+ } ;
232+ this . #view( viewInput , undefined , this . contentElement ) ;
215233 }
216234
217235 #onSettingsToggle( ) : void {
218236 this . #showSettings = ! this . #showSettings;
219- this . #render( ) ;
220- }
221- }
222-
223- customElements . define ( 'devtools-linear-memory-inspector-interpreter' , LinearMemoryValueInterpreter ) ;
224-
225- declare global {
226- interface HTMLElementTagNameMap {
227- 'devtools-linear-memory-inspector-interpreter' : LinearMemoryValueInterpreter ;
237+ this . requestUpdate ( ) ;
228238 }
229239}
0 commit comments