@@ -13,6 +13,10 @@ function isIdentifier(node, name) {
1313 return node . type === 'Identifier' && ( Array . isArray ( name ) ? name . includes ( node . name ) : node . name === name ) ;
1414}
1515
16+ function isMemberExpression ( node , objectPredicate , propertyPredicate ) {
17+ return node . type === 'MemberExpression' && objectPredicate ( node . object ) && propertyPredicate ( node . property ) ;
18+ }
19+
1620function getEnclosingExpression ( node ) {
1721 while ( node . parent ) {
1822 if ( node . parent . type === 'BlockStatement' ) {
@@ -199,6 +203,24 @@ module.exports = {
199203 return null ;
200204 }
201205
206+ /**
207+ * @param {Node } event
208+ * @return {string|null }
209+ */
210+ function getEvent ( event ) {
211+ switch ( sourceCode . getText ( event ) ) {
212+ case 'UI.Toolbar.ToolbarInput.Event.TEXT_CHANGED' :
213+ return 'change' ;
214+ case 'UI.Toolbar.ToolbarInput.Event.ENTER_PRESSED' :
215+ return 'submit' ;
216+ default :
217+ if ( event . type === 'Literal' ) {
218+ return event . value . toString ( ) ;
219+ }
220+ return null ;
221+ }
222+ }
223+
202224 /**
203225 * @param {DomFragmentReference } reference
204226 * @param {DomFragment } domFragment
@@ -237,11 +259,15 @@ module.exports = {
237259 domFragment . attributes . push ( { key : attribute . value . toString ( ) , value} ) ;
238260 }
239261 } else if ( isMethodCall && isIdentifier ( property , 'addEventListener' ) ) {
240- const event = firstArg ;
262+ const event = getEvent ( firstArg ) ;
241263 const value = secondArg ;
242- if ( event . type === 'Literal' && value . type !== 'SpreadElement' ) {
243- domFragment . eventListeners . push ( { key : event . value . toString ( ) , value} ) ;
264+ if ( event && value . type !== 'SpreadElement' ) {
265+ domFragment . eventListeners . push ( { key : event , value} ) ;
244266 }
267+ } else if ( isMethodCall && isIdentifier ( property , 'appendToolbarItem' ) ) {
268+ const childFragment = getOrCreateDomFragment ( firstArg ) ;
269+ childFragment . parent = domFragment ;
270+ domFragment . children . push ( childFragment ) ;
245271 } else if (
246272 isPropertyMethodCall && isIdentifier ( property , 'classList' ) && isIdentifier ( grandParent . property , 'add' ) ) {
247273 domFragment . classList . push ( propertyMethodArgument ) ;
@@ -253,6 +279,16 @@ module.exports = {
253279 value : subpropertyValue ,
254280 } ) ;
255281 }
282+ } else if ( isMethodCall && isIdentifier ( property , 'createChild' ) ) {
283+ if ( firstArg ?. type === 'Literal' ) {
284+ const childFragment = getOrCreateDomFragment ( grandParent ) ;
285+ childFragment . tagName = String ( firstArg . value ) ;
286+ childFragment . parent = domFragment ;
287+ domFragment . children . push ( childFragment ) ;
288+ if ( secondArg ) {
289+ childFragment . classList . push ( secondArg ) ;
290+ }
291+ }
256292 } else if ( isMethodCall && isIdentifier ( property , 'appendChild' ) ) {
257293 const childFragment = getOrCreateDomFragment ( firstArg ) ;
258294 childFragment . parent = domFragment ;
@@ -310,6 +346,53 @@ export const DEFAULT_VIEW = (input, _output, target) => {
310346 }
311347 }
312348 } ,
349+ NewExpression ( node ) {
350+ if ( isMemberExpression (
351+ node . callee , n => isMemberExpression ( n , n => isIdentifier ( n , 'UI' ) , n => isIdentifier ( n , 'Toolbar' ) ) ,
352+ n => isIdentifier ( n , 'ToolbarFilter' ) ) ) {
353+ const domFragment = getOrCreateDomFragment ( node ) ;
354+ domFragment . tagName = 'devtools-toolbar-input' ;
355+ domFragment . attributes . push ( {
356+ key : 'type' ,
357+ value : /** @type {Node } */ ( { type : 'Literal' , value : 'filter' } ) ,
358+ } ) ;
359+ const placeholder = node . arguments [ 0 ] ;
360+ const flexGrow = node . arguments [ 1 ] ;
361+ const flexShrink = node . arguments [ 2 ] ;
362+ const title = node . arguments [ 3 ] ;
363+ const jslogContext = node . arguments [ 6 ] ;
364+ if ( placeholder && ! isIdentifier ( placeholder , 'undefined' ) ) {
365+ domFragment . attributes . push ( {
366+ key : 'placeholder' ,
367+ value : placeholder ,
368+ } ) ;
369+ }
370+ if ( flexGrow && ! isIdentifier ( flexGrow , 'undefined' ) ) {
371+ domFragment . style . push ( {
372+ key : 'flex-grow' ,
373+ value : flexGrow ,
374+ } ) ;
375+ }
376+ if ( flexShrink && ! isIdentifier ( flexShrink , 'undefined' ) ) {
377+ domFragment . style . push ( {
378+ key : 'flex-shrink' ,
379+ value : flexShrink ,
380+ } ) ;
381+ }
382+ if ( title && ! isIdentifier ( title , 'undefined' ) ) {
383+ domFragment . attributes . push ( {
384+ key : 'title' ,
385+ value : title ,
386+ } ) ;
387+ }
388+ if ( jslogContext && ! isIdentifier ( jslogContext , 'undefined' ) ) {
389+ domFragment . attributes . push ( {
390+ key : 'id' ,
391+ value : jslogContext ,
392+ } ) ;
393+ }
394+ }
395+ } ,
313396 'Program:exit' ( ) {
314397 while ( queue . length ) {
315398 const domFragment = queue . pop ( ) ;
0 commit comments