LayersTestRunner.layerTreeModel=function(){if(!LayersTestRunner._layerTreeModel){LayersTestRunner._layerTreeModel=TestRunner.mainTarget.model(Layers.LayerTreeModel);}
return LayersTestRunner._layerTreeModel;};LayersTestRunner.labelForLayer=function(layer){const node=layer.nodeForSelfOrAncestor();let label=(node?Elements.DOMPath.fullQualifiedSelector(node,false):'<invalid node id>');const height=layer.height();const width=layer.width();if(height<=200&&width<=200){label+=' '+height+'x'+width;}
if(typeof layer.__extraData!=='undefined'){label+=' ('+layer.__extraData+')';}
return label;};LayersTestRunner.dumpLayerTree=function(prefix,root){if(!prefix){prefix='';}
if(!root){root=LayersTestRunner.layerTreeModel().layerTree().contentRoot();if(!root){TestRunner.addResult('No layer root, perhaps not in the composited mode! ');TestRunner.completeTest();return;}}
TestRunner.addResult(prefix+LayersTestRunner.labelForLayer(root));root.children().forEach(LayersTestRunner.dumpLayerTree.bind(LayersTestRunner,prefix+'    '));};LayersTestRunner.dumpLayers3DView=function(prefix,root){if(!prefix){prefix='';}
if(!root){root=UI.panels.layers._layers3DView._rotatingContainerElement;}
if(root.__layer){TestRunner.addResult(prefix+LayersTestRunner.labelForLayer(root.__layer));}
for(let element=root.firstElementChild;element;element=element.nextSibling){LayersTestRunner.dumpLayers3DView(prefix+'    ',element);}};LayersTestRunner.evaluateAndWaitForTreeChange=async function(expression){await TestRunner.evaluateInPageAnonymously(expression);return LayersTestRunner.layerTreeModel().once(Layers.LayerTreeModel.Events.LayerTreeChanged);};LayersTestRunner.findLayerByNodeIdAttribute=function(nodeIdAttribute){let result;function testLayer(layer){const node=layer.node();if(!node){return false;}
if(!node||node.getAttribute('id')!==nodeIdAttribute){return false;}
result=layer;return true;}
LayersTestRunner.layerTreeModel().layerTree().forEachLayer(testLayer);if(!result){TestRunner.addResult('ERROR: No layer for '+nodeIdAttribute);}
return result;};LayersTestRunner.requestLayers=function(){LayersTestRunner.layerTreeModel().enable();return LayersTestRunner.layerTreeModel().once(Layers.LayerTreeModel.Events.LayerTreeChanged);};LayersTestRunner.dispatchMouseEvent=function(eventType,button,element,offsetX,offsetY){const totalOffset=element.totalOffset();const eventArguments={bubbles:true,cancelable:true,view:window,screenX:totalOffset.left-element.scrollLeft+offsetX,screenY:totalOffset.top-element.scrollTop+offsetY,clientX:totalOffset.left+offsetX,clientY:totalOffset.top+offsetY,button:button,composed:true};if(eventType==='mouseout'){eventArguments.screenX=0;eventArguments.screenY=0;eventArguments.clientX=0;eventArguments.clientY=0;}
element.dispatchEvent(new MouseEvent(eventType,eventArguments));};LayersTestRunner.findLayerTreeElement=function(layer){const element=layer[LayerViewer.LayerTreeElement._symbol];element.reveal();return element.listItemElement;};LayersTestRunner.dispatchMouseEventToLayerTree=function(eventType,button,layer){const element=LayersTestRunner.findLayerTreeElement(layer);TestRunner.assertTrue(!!element);LayersTestRunner.dispatchMouseEvent(eventType,button,element,element.clientWidth>>1,element.clientHeight>>1);};LayersTestRunner.dumpSelectedStyles=function(message,element){const classes=[];if(element.classList.contains('selected')){classes.push('selected');}
if(element.classList.contains('hovered')){classes.push('hovered');}
TestRunner.addResult(message+': '+classes.join(', '));};;