blob: d5c69d7e1276f70ed971f40e2591d7b3b65ae45d [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview using private properties isn't a Closure violation in tests.
* @suppress {accessControls}
*/
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
};
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(', '));
};