| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script> |
| let requestAnimationFrameID; |
| |
| function expand() { |
| let element = document.getElementById("x"); |
| let i = 0; |
| |
| let loop = () => { |
| ++i; |
| let height = parseInt(element.style.height) + 1; |
| element.style.height = height + "px"; |
| TestPage.dispatchEventToFrontend("TestPage-styleChanged", height + "px"); |
| |
| requestAnimationFrameID = requestAnimationFrame(loop); |
| }; |
| |
| loop(); |
| } |
| |
| function stopExpanding() { |
| cancelAnimationFrame(requestAnimationFrameID); |
| } |
| |
| function test() { |
| InspectorTest.redirectRequestAnimationFrame(); |
| |
| let nodeStyles = null; |
| let suite = InspectorTest.createAsyncSuite("ModifyCSSProperty"); |
| |
| InspectorTest.addEventListener("TestPage-styleChanged", (event) => { |
| // Normally, this would get called if the styles sidebar is visible. |
| // This doesn't work in tests. |
| nodeStyles.refresh(); |
| }); |
| |
| suite.addTestCase({ |
| name: "ModifyCSSPropertyRace.ChangeInlineStyle", |
| test(resolve, reject) { |
| let getInlineStyleDeclaration = () => { |
| for (let styleDeclaration of nodeStyles.orderedStyles) { |
| if (styleDeclaration.type === styleDeclaration.constructor.Type.Inline) |
| return styleDeclaration; |
| } |
| InspectorTest.fail("No declaration found."); |
| resolve(); |
| }; |
| |
| let getProperty = (propertyName) => { |
| let styleDeclaration = getInlineStyleDeclaration(); |
| for (let property of styleDeclaration.properties) { |
| if (property.name === propertyName) |
| return property; |
| } |
| InspectorTest.fail("No property found."); |
| resolve(); |
| }; |
| |
| InspectorTest.evaluateInPage("expand()"); |
| let updateCount = 0; |
| let style = getInlineStyleDeclaration(); |
| |
| function styleDecorationUpdated() { |
| ++updateCount; |
| let heightNumber = parseInt(getProperty("height").rawValue); |
| |
| if (updateCount === 1) |
| InspectorTest.expectGreaterThan(heightNumber, 10, "Height should have increased from 10px."); |
| else if (updateCount === 2) { |
| InspectorTest.expectGreaterThan(heightNumber, 11, "Height should have increased from 11px."); |
| getProperty("height").rawValue = "100px"; |
| } else if (updateCount === 3) |
| InspectorTest.expectGreaterThanOrEqual(heightNumber, 100, "Height should be 100px or more."); |
| else { |
| InspectorTest.expectGreaterThanOrEqual(heightNumber, 101, "Height should be 101px or more."); |
| |
| InspectorTest.evaluateInPage("stopExpanding()"); |
| style.removeEventListener(WI.CSSStyleDeclaration.Event.PropertiesChanged, styleDecorationUpdated); |
| resolve(); |
| } |
| } |
| |
| style.addEventListener(WI.CSSStyleDeclaration.Event.PropertiesChanged, styleDecorationUpdated); |
| } |
| }); |
| |
| WI.domManager.requestDocument((documentNode) => { |
| WI.domManager.querySelector(documentNode.id, "#x", (contentNodeId) => { |
| if (contentNodeId) { |
| let domNode = WI.domManager.nodeForId(contentNodeId); |
| nodeStyles = WI.cssManager.stylesForNode(domNode); |
| |
| if (nodeStyles.needsRefresh) { |
| nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => { |
| suite.runTestCasesAndFinish() |
| }); |
| } else |
| suite.runTestCasesAndFinish(); |
| } else { |
| InspectorTest.fail("DOM node not found."); |
| InspectorTest.completeTest(); |
| } |
| }); |
| }); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Testing that changes to "style" attribute made from page's JavaScript are ignored when there's a pending change made via Web Inspector.</p> |
| <div id="x" style="height: 10px"></div> |
| </body> |
| </html> |