| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/protocol-test.js"></script> |
| <script> |
| |
| function test() |
| { |
| |
| var nodes = []; |
| |
| InspectorProtocol.eventHandler["DOM.setChildNodes"] = setChildNodes; |
| |
| enableLayerTreeAgent(); |
| |
| function enableLayerTreeAgent(result) |
| { |
| step({ |
| name: "Enable the LayerTree agent", |
| command: "LayerTree.enable", |
| parameters: {}, |
| callback: getDocument |
| }); |
| }; |
| |
| function getDocument() |
| { |
| // We must first get the document so that later on we may get sensible nodeIds. |
| step({ |
| name: "Get the Document", |
| command: "DOM.getDocument", |
| parameters: {}, |
| callback: getLayerTree |
| }); |
| }; |
| |
| function getLayerTree(result) |
| { |
| step({ |
| name: "Get the layer tree", |
| command: "LayerTree.layersForNode", |
| parameters: {"nodeId": result.root.nodeId}, |
| callback: gotLayerTree |
| }); |
| }; |
| |
| function gotLayerTree(result) |
| { |
| logTestName("Check layers' reasons for compositing") |
| |
| var layers = result.layers; |
| |
| var nodesById = {}; |
| nodes.forEach(function(node) { |
| nodesById[node.nodeId] = node; |
| }); |
| |
| var count = 0; |
| |
| function hasId(node, id) { |
| return node && node.attributes && node.attributes[0] === "id" && node.attributes[1] === id; |
| } |
| |
| function dumpReasons(layer, compositingReasons) { |
| var node = nodesById[layer.nodeId]; |
| |
| if (hasId(node, "blending")) { |
| assert( |
| "<div id=\"blending\"> is composited due having CSS blending applied and composited descendants", |
| compositingReasons.blendingWithCompositedDescendants, |
| true); |
| } else if (hasId(node, "isolating")) { |
| assert( |
| "<div id=\"isolating\"> is composition due to isolating compositing descendants having CSS blending applied", |
| compositingReasons.isolatesCompositedBlendingDescendants, |
| true); |
| } |
| |
| if (++count === layers.length) |
| ProtocolTest.completeTest(); |
| }; |
| |
| layers.forEach(function (layer) { |
| runCommand({ |
| command: "LayerTree.reasonsForCompositingLayer", |
| parameters: {"layerId": layer.layerId}, |
| callback: function(result) { |
| dumpReasons(layer, result.compositingReasons); |
| } |
| }); |
| }); |
| }; |
| |
| function setChildNodes (messageObject) { |
| messageObject.params.nodes.forEach(function (node) { |
| nodes.push(node); |
| }) |
| }; |
| |
| function step(test) |
| { |
| if (test.callback) |
| logTestName(test.name); |
| runCommand(test); |
| }; |
| |
| function logTestName(name) |
| { |
| ProtocolTest.log("\n=== " + name + " ===\n"); |
| }; |
| |
| function runCommand(command) |
| { |
| InspectorProtocol.sendCommand(command.command, command.parameters, function(messageObject) { |
| InspectorProtocol.checkForError(messageObject); |
| |
| if (command.name) |
| ProtocolTest.log("PASS"); |
| |
| if (command.callback) |
| command.callback(messageObject.result); |
| }); |
| }; |
| |
| function assert(name, actual, expected) |
| { |
| if (expected === actual) |
| ProtocolTest.log("PASS: " + name + "."); |
| else |
| ProtocolTest.log("FAIL: " + name + ". Expected " + expected + " but got " + actual); |
| }; |
| |
| }; |
| |
| window.addEventListener("DOMContentLoaded", function() |
| { |
| runTest(); |
| }, false); |
| |
| </script> |
| <style type="text/css"> |
| |
| #isolating { |
| isolation: isolate; |
| } |
| |
| #blending { |
| mix-blend-mode: difference; |
| } |
| |
| #composited { |
| -webkit-transform: translateZ(0); |
| } |
| |
| </style> |
| </head> |
| <body> |
| <div id="isolating"> |
| <div id="blending"> |
| <div id="composited"></div> |
| </div> |
| </div> |
| </body> |
| </html> |