Bug 1014223 - Use unique identifier for <style> elements; r=harth

This commit is contained in:
Joe Walker
2014-06-17 09:12:16 +01:00
parent 8cd8c981c9
commit c014e6a1d7
4 changed files with 65 additions and 23 deletions

View File

@@ -25,31 +25,44 @@ let test = asyncTest(function*() {
let running = yield usage._testOnly_isRunning(); let running = yield usage._testOnly_isRunning();
ok(!running, "csscoverage not is running"); ok(!running, "csscoverage not is running");
// Pages visited
let expectedVisited = [ PAGE_3 ];
let actualVisited = yield usage._testOnly_visitedPages();
isEqualJson(actualVisited, expectedVisited, 'Visited');
// Page1 // Page1
let expectedPage1 = { reports: [] }; let expectedPage1 = { reports: [] };
let actualPage1 = yield usage.createEditorReport(PAGE_1); let actualPage1 = yield usage.createEditorReport(PAGE_1 + " \u2192 <style> index 0");
isEqualJson(actualPage1, expectedPage1, 'Page1'); isEqualJson(actualPage1, expectedPage1, 'Page1');
// Page2 // Page2
let expectedPage2 = { reports: [] }; let expectedPage2 = { reports: [] };
let actualPage2 = yield usage.createEditorReport(PAGE_2); let actualPage2 = yield usage.createEditorReport(PAGE_2 + " \u2192 <style> index 0");
isEqualJson(actualPage2, expectedPage2, 'Page2'); isEqualJson(actualPage2, expectedPage2, 'Page2');
// Page3 // Page3a
let expectedPage3 = { let expectedPage3a = {
reports: [ reports: [
{ {
selectorText: ".page3-test2", selectorText: ".page3-test2",
start: { line: 9, column: 5 }, start: { line: 9, column: 5 },
}, }
]
};
let actualPage3a = yield usage.createEditorReport(PAGE_3 + " \u2192 <style> index 0");
isEqualJson(actualPage3a, expectedPage3a, 'Page3a');
// Page3b
let expectedPage3b = {
reports: [
{ {
selectorText: ".page3-test3", selectorText: ".page3-test3",
start: { line: 3, column: 5 }, start: { line: 3, column: 5 },
} }
] ]
}; };
let actualPage3 = yield usage.createEditorReport(PAGE_3); let actualPage3b = yield usage.createEditorReport(PAGE_3 + " \u2192 <style> index 1");
isEqualJson(actualPage3, expectedPage3, 'Page3'); isEqualJson(actualPage3b, expectedPage3b, 'Page3b');
// SheetA // SheetA
let expectedSheetA = { let expectedSheetA = {

View File

@@ -32,31 +32,44 @@ let test = asyncTest(function*() {
running = yield usage._testOnly_isRunning(); running = yield usage._testOnly_isRunning();
ok(!running, "csscoverage not is running"); ok(!running, "csscoverage not is running");
// Pages visited
let expectedVisited = [ '', PAGE_3 ]; // '' is for the initial location
let actualVisited = yield usage._testOnly_visitedPages();
isEqualJson(actualVisited, expectedVisited, 'Visited');
// Page1 // Page1
let expectedPage1 = { reports: [] }; let expectedPage1 = { reports: [] };
let actualPage1 = yield usage.createEditorReport(PAGE_1); let actualPage1 = yield usage.createEditorReport(PAGE_1 + " \u2192 <style> index 0");
isEqualJson(actualPage1, expectedPage1, 'Page1'); isEqualJson(actualPage1, expectedPage1, 'Page1');
// Page2 // Page2
let expectedPage2 = { reports: [] }; let expectedPage2 = { reports: [] };
let actualPage2 = yield usage.createEditorReport(PAGE_2); let actualPage2 = yield usage.createEditorReport(PAGE_2 + " \u2192 <style> index 0");
isEqualJson(actualPage2, expectedPage2, 'Page2'); isEqualJson(actualPage2, expectedPage2, 'Page2');
// Page3 // Page3a
let expectedPage3 = { let expectedPage3a = {
reports: [ reports: [
{ {
selectorText: ".page3-test2", selectorText: ".page3-test2",
start: { line: 9, column: 5 }, start: { line: 9, column: 5 },
}, }
]
};
let actualPage3a = yield usage.createEditorReport(PAGE_3 + " \u2192 <style> index 0");
isEqualJson(actualPage3a, expectedPage3a, 'Page3a');
// Page3b
let expectedPage3b = {
reports: [
{ {
selectorText: ".page3-test3", selectorText: ".page3-test3",
start: { line: 3, column: 5 }, start: { line: 3, column: 5 },
} }
] ]
}; };
let actualPage3 = yield usage.createEditorReport(PAGE_3); let actualPage3b = yield usage.createEditorReport(PAGE_3 + " \u2192 <style> index 1");
isEqualJson(actualPage3, expectedPage3, 'Page3'); isEqualJson(actualPage3b, expectedPage3b, 'Page3b');
// SheetA // SheetA
let expectedSheetA = { let expectedSheetA = {

View File

@@ -494,7 +494,7 @@ StyleEditorUI.prototype = {
return; return;
} }
let href = editor.styleSheet.href || editor.styleSheet.nodeHref; let href = csscoverage.sheetToUrl(editor.styleSheet);
usage.createEditorReport(href).then(data => { usage.createEditorReport(href).then(data => {
editor.removeAllUnusedRegions(); editor.removeAllUnusedRegions();

View File

@@ -6,12 +6,8 @@
const { Cc, Ci, Cu } = require("chrome"); const { Cc, Ci, Cu } = require("chrome");
const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
const Services = require("Services"); const Services = require("Services");
const promise = require("resource://gre/modules/Promise.jsm").Promise;
const { getRuleLocation } = require("devtools/server/actors/stylesheets");
const protocol = require("devtools/server/protocol"); const protocol = require("devtools/server/protocol");
const { method, custom, RetVal, Arg } = protocol; const { method, custom, RetVal, Arg } = protocol;
@@ -21,6 +17,12 @@ loader.lazyGetter(this, "gDevTools", () => {
loader.lazyGetter(this, "DOMUtils", () => { loader.lazyGetter(this, "DOMUtils", () => {
return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils) return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils)
}); });
loader.lazyGetter(this, "stylesheets", () => {
return require("devtools/server/actors/stylesheets");
});
loader.lazyGetter(this, "CssLogic", () => {
return require("devtools/styleinspector/css-logic").CssLogic;
});
const CSSRule = Ci.nsIDOMCSSRule; const CSSRule = Ci.nsIDOMCSSRule;
@@ -441,6 +443,14 @@ let UsageReportActor = protocol.ActorClass({
response: { value: RetVal("boolean") } response: { value: RetVal("boolean") }
}), }),
/**
* For testing only. What pages did we visit.
*/
_testOnly_visitedPages: method(function() {
return [...this._visitedPages];
}, {
response: { value: RetVal("array:string") }
}),
}); });
exports.UsageReportActor = UsageReportActor; exports.UsageReportActor = UsageReportActor;
@@ -512,7 +522,7 @@ function getImportedSheets(stylesheet) {
* @see deconstructRuleId(ruleId) * @see deconstructRuleId(ruleId)
*/ */
function ruleToId(rule) { function ruleToId(rule) {
let loc = getRuleLocation(rule); let loc = stylesheets.getRuleLocation(rule);
return sheetToUrl(rule.parentStyleSheet) + "|" + loc.line + "|" + loc.column; return sheetToUrl(rule.parentStyleSheet) + "|" + loc.line + "|" + loc.column;
} }
@@ -669,11 +679,17 @@ exports.SEL_ALL = [
* Find a URL for a given stylesheet * Find a URL for a given stylesheet
*/ */
const sheetToUrl = exports.sheetToUrl = function(stylesheet) { const sheetToUrl = exports.sheetToUrl = function(stylesheet) {
// For <link> elements
if (stylesheet.href) { if (stylesheet.href) {
return stylesheet.href; return stylesheet.href;
} }
if (stylesheet.ownerNode && stylesheet.ownerNode.baseURI) {
return stylesheet.ownerNode.baseURI; // For <style> elements
if (stylesheet.ownerNode) {
let document = stylesheet.ownerNode.ownerDocument;
let sheets = [...document.querySelectorAll("style")];
let index = sheets.indexOf(stylesheet.ownerNode);
return getURL(document) + ' → <style> index ' + index;
} }
throw new Error("Unknown sheet source"); throw new Error("Unknown sheet source");