Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: chrome/content/cssProperties.js

Issue 29317059: Issue 2395 - Added content script for CSS property filters (Closed)
Patch Set: Make function to add CSS selectors configurable in the constructor Created Nov. 13, 2015, 1:16 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/content/cssProperties.js
===================================================================
new file mode 100644
--- /dev/null
+++ b/chrome/content/cssProperties.js
@@ -0,0 +1,88 @@
+function CSSPropertyFilters(window, addSelectorsFunc) {
+ this.window = window;
+ this.addSelectorsFunc = addSelectorsFunc;
+ this.load(this.apply.bind(this));
+}
+
+CSSPropertyFilters.prototype = {
+ stringifyStyle: function(style)
+ {
+ var styles = [];
+ for (var i = 0; i < style.length; i++)
+ {
+ var property = style.item(i);
+ var value = style.getPropertyValue(property);
+ var priority = style.getPropertyPriority(property);
+ styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";");
+ }
+ styles.sort();
+ return styles.join(" ");
+ },
+
+ findSelectors: function(stylesheet, selectors)
+ {
+ var rules = stylesheet.cssRules;
+ if (!rules)
+ return;
+
+ for (var i = 0; i < rules.length; i++)
+ {
+ var rule = rules[i];
+ if (rule.type != this.window.CSSRule.STYLE_RULE)
+ continue;
+
+ var style = this.stringifyStyle(rule.style);
+ for (var j = 0; j < this.patterns.length; j++)
+ {
+ var pattern = this.patterns[j];
+ var regexp = pattern.regexp;
+
+ if (typeof regexp == "string")
+ regexp = pattern.regexp = new RegExp(regexp);
+
+ if (regexp.test(style))
+ selectors.push(pattern.prefix + rule.selectorText + pattern.suffix);
+ }
+ }
+ },
+
+ addSelectors: function(stylesheets)
+ {
+ var selectors = [];
+ for (var i = 0; i < stylesheets.length; i++)
+ this.findSelectors(stylesheets[i], selectors);
+ this.addSelectorsFunc(selectors);
+ },
+
+ onLoad: function(event)
+ {
+ var stylesheet = event.target.sheet;
+ if (stylesheet)
+ this.addSelectors([stylesheet]);
+ },
+
+ load: function(callback)
+ {
+ ext.backgroundPage.sendMessage(
+ {
+ type: "filters.get",
+ what: "cssproperties"
+ },
+ function(patterns)
+ {
+ this.patterns = patterns;
+ callback();
+ }.bind(this)
+ );
+ },
+
+ apply: function()
+ {
+ if (this.patterns.length > 0)
+ {
+ var document = this.window.document;
+ this.addSelectors(document.styleSheets);
+ document.addEventListener("load", this.onLoad.bind(this), true);
+ }
+ }
+};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld