@@ -96,6 +96,7 @@ export default class Store extends EventEmitter<{
9696 componentFilters : [ ] ,
9797 error : [ Error ] ,
9898 hookSettings : [ $ReadOnly < DevToolsHookSettings > ] ,
99+ hostInstanceSelected : [ Element [ 'id' ] ] ,
99100 settingsUpdated : [ $ReadOnly < DevToolsHookSettings > ] ,
100101 mutated : [ [ Array < number > , Map < number , number > ] ] ,
101102 recordChangeDescriptions : [ ] ,
@@ -190,6 +191,9 @@ export default class Store extends EventEmitter<{
190191 _hookSettings : $ReadOnly < DevToolsHookSettings > | null = null ;
191192 _shouldShowWarningsAndErrors : boolean = false ;
192193
194+ // Only used for browser extension for synchronization with built-in Elements panel.
195+ _lastSelectedHostInstanceElementId : Element [ 'id' ] | null = null ;
196+
193197 constructor ( bridge : FrontendBridge , config ? : Config ) {
194198 super ( ) ;
195199
@@ -265,6 +269,7 @@ export default class Store extends EventEmitter<{
265269 bridge . addListener ( 'saveToClipboard' , this . onSaveToClipboard ) ;
266270 bridge . addListener ( 'hookSettings' , this . onHookSettings ) ;
267271 bridge . addListener ( 'backendInitialized' , this . onBackendInitialized ) ;
272+ bridge . addListener ( 'selectElement' , this . onHostInstanceSelected ) ;
268273 }
269274
270275 // This is only used in tests to avoid memory leaks.
@@ -481,6 +486,10 @@ export default class Store extends EventEmitter<{
481486 return this . _unsupportedRendererVersionDetected ;
482487 }
483488
489+ get lastSelectedHostInstanceElementId ( ) : Element [ 'id' ] | null {
490+ return this . _lastSelectedHostInstanceElementId;
491+ }
492+
484493 containsElement ( id : number ) : boolean {
485494 return this . _idToElement . has ( id ) ;
486495 }
@@ -1431,6 +1440,7 @@ export default class Store extends EventEmitter<{
14311440 bridge . removeListener ( 'backendVersion' , this . onBridgeBackendVersion ) ;
14321441 bridge . removeListener ( 'bridgeProtocol' , this . onBridgeProtocol ) ;
14331442 bridge . removeListener ( 'saveToClipboard' , this . onSaveToClipboard ) ;
1443+ bridge . removeListener ( 'selectElement' , this . onHostInstanceSelected ) ;
14341444
14351445 if ( this . _onBridgeProtocolTimeoutID !== null ) {
14361446 clearTimeout ( this . _onBridgeProtocolTimeoutID ) ;
@@ -1507,6 +1517,16 @@ export default class Store extends EventEmitter<{
15071517 this . _bridge . send ( 'getHookSettings' ) ; // Warm up cached hook settings
15081518 } ;
15091519
1520+ onHostInstanceSelected: ( elementId : number ) => void = elementId => {
1521+ if ( this . _lastSelectedHostInstanceElementId === elementId ) {
1522+ return ;
1523+ }
1524+
1525+ this . _lastSelectedHostInstanceElementId = elementId ;
1526+ // By the time we emit this, there is no guarantee that TreeContext is rendered.
1527+ this . emit ( 'hostInstanceSelected' , elementId ) ;
1528+ } ;
1529+
15101530 getHookSettings: ( ) => void = ( ) => {
15111531 if ( this . _hookSettings != null ) {
15121532 this . emit ( 'hookSettings' , this . _hookSettings ) ;
0 commit comments