blob: 44cf6f1270430d0f04d03c77a743b890405be491 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(
`Tests that the styleSheetAdded and styleSheetRemoved events are reported into the frontend. Bug 105828. https://bugs.webkit.org/show_bug.cgi?id=105828\n`);
await TestRunner.loadModule('elements_test_runner');
await TestRunner.showPanel('elements');
await TestRunner.navigatePromise('resources/stylesheet-tracking-main.html');
await TestRunner.addStylesheetTag('stylesheet-tracking.css');
await TestRunner.evaluateInPagePromise(`
function addStyleSheet()
{
var styleElement = document.createElement("style");
styleElement.id = "style";
styleElement.type = "text/css";
styleElement.textContent = "@import url(\\"stylesheet-tracking-import.css\\");\\na { color: green; }"
document.head.appendChild(styleElement);
}
function removeImport()
{
document.getElementById("style").sheet.deleteRule(0);
}
function removeStyleSheet()
{
document.head.removeChild(document.getElementById("style"));
}
function loadIframe()
{
var iframe = document.createElement("iframe");
iframe.setAttribute("seamless", "seamless");
iframe.src = "stylesheet-tracking-iframe.html";
document.body.appendChild(iframe);
}
function iframe()
{
return document.getElementsByTagName("iframe")[0];
}
function addIframeStyleSheets()
{
iframe().contentWindow.postMessage("addStyleSheets", "*");
}
function navigateIframe()
{
iframe().src = iframe().src;
}
function removeIframeStyleSheets()
{
iframe().contentWindow.postMessage("removeStyleSheets", "*");
}
function removeIframe()
{
var element = iframe();
element.parentElement.removeChild(element);
}
`);
var inspectedNode;
TestRunner.cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetAdded, styleSheetAdded, null);
TestRunner.cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetRemoved, styleSheetRemoved, null);
var headers = TestRunner.cssModel.styleSheetHeaders();
TestRunner.addResult(headers.length + ' headers known:');
sortAndDumpData(headers);
ElementsTestRunner.selectNodeAndWaitForStyles('inspected', step0);
function step0(node) {
inspectedNode = node;
TestRunner.addResult('=== Adding iframe... ===');
TestRunner.evaluateInPage('loadIframe()');
waitStyleSheetAdded(1, iframeAdded);
function iframeAdded() {
TestRunner.addResult('=== Adding iframe stylesheet... ===');
waitStyleSheetAdded(2, navigateIframe);
TestRunner.evaluateInPage('addIframeStyleSheets()');
}
function navigateIframe() {
TestRunner.addResult('=== Navigating iframe... ===');
waitStyleSheetRemoved(3, frameNavigated);
TestRunner.evaluateInPage('navigateIframe()');
function frameNavigated() {
waitStyleSheetAdded(1, styleSheetsAdded);
}
function styleSheetsAdded() {
TestRunner.addResult('=== Adding iframe stylesheet... ===');
waitStyleSheetAdded(2, removeIframeStyleSheets);
TestRunner.evaluateInPage('addIframeStyleSheets()');
}
}
function removeIframeStyleSheets() {
TestRunner.addResult('=== Removing iframe stylesheet... ===');
waitStyleSheetRemoved(2, step1);
TestRunner.evaluateInPage('removeIframeStyleSheets()');
}
}
function step1() {
TestRunner.addResult('=== Adding stylesheet... ===');
waitStyleSheetAdded(4, step2);
TestRunner.evaluateInPage('addStyleSheet()');
}
function step2() {
TestRunner.addResult('=== Removing @import... ===');
waitStyleSheetRemoved(3, step3);
TestRunner.evaluateInPage('removeImport()');
}
function step3() {
TestRunner.addResult('=== Removing stylesheet... ===');
waitStyleSheetRemoved(1, step4);
TestRunner.evaluateInPage('removeStyleSheet()');
}
function step4() {
TestRunner.addResult('=== Adding rule... ===');
waitStyleSheetAdded(1);
ElementsTestRunner.addNewRule('#inspected', successCallback);
function successCallback() {
TestRunner.addResult('Rule added');
step5();
}
}
function step5() {
TestRunner.addResult('=== Removing iframe... ===');
TestRunner.evaluateInPage('removeIframe()');
waitStyleSheetRemoved(1, step6);
}
function step6() {
TestRunner.completeTest();
}
var addedCallback;
var addedSheetCount;
var addedSheets = [];
function waitStyleSheetAdded(count, next) {
addedSheetCount = count;
addedCallback = next;
}
function styleSheetAdded(event) {
var header = event.data;
addedSheets.push(header);
--addedSheetCount;
if (addedSheetCount > 0)
return;
else if (addedSheetCount < 0)
TestRunner.addResult('Unexpected styleSheetAdded()');
TestRunner.addResult('Stylesheets added:');
sortAndDumpData(addedSheets);
addedSheets = [];
if (addedCallback) {
var callback = addedCallback;
addedCallback = null;
callback();
}
}
var removedCallback;
var removedSheetCount;
var removedSheets = [];
function waitStyleSheetRemoved(count, next) {
removedSheetCount = count;
removedCallback = next;
}
function styleSheetRemoved(event) {
var header = event.data;
removedSheets.push(header);
--removedSheetCount;
if (removedSheetCount > 0)
return;
else if (removedSheetCount < 0)
TestRunner.addResult('Unexpected styleSheetRemoved()');
TestRunner.addResult('Stylesheets removed:');
sortAndDumpData(removedSheets);
removedSheets = [];
if (removedCallback) {
var callback = removedCallback;
removedCallback = null;
callback();
}
}
function sortAndDumpData(sheets) {
function sorter(a, b) {
return a.sourceURL.localeCompare(b.sourceURL);
}
sheets = sheets.sort(sorter);
for (var i = 0; i < sheets.length; ++i) {
var header = sheets[i];
TestRunner.addResult(' URL=' + trimURL(header.sourceURL));
TestRunner.addResult(' origin=' + header.origin);
TestRunner.addResult(' isInline=' + header.isInline);
TestRunner.addResult(' hasSourceURL=' + header.hasSourceURL);
}
}
function trimURL(url) {
if (!url)
return url;
var lastIndex = url.lastIndexOf('devtools/');
if (lastIndex < 0)
return url;
return '.../' + url.substr(lastIndex);
}
})();