diff --git a/Recipe.min.js b/Recipe.min.js
index 6aa8339..a7fe3dc 100644
--- a/Recipe.min.js
+++ b/Recipe.min.js
@@ -437,63 +437,68 @@ function getPatternUsage(results, domClasses, cssClasses) {
return results;
}
-void function() {
-
- window.HtmlUsage = {};
-
- // This function has been added to the elementAnalyzers in
- // CSSUsage.js under onready()
- // is an HTMLElement passed in by elementAnalyzers
- window.HtmlUsage.GetNodeName = function (element) {
-
- // If the browser doesn't recognize the element - throw it away
- if(element instanceof HTMLUnknownElement) {
- return;
- }
-
- var node = element.nodeName;
-
- var tags = HtmlUsageResults.tags || (HtmlUsageResults.tags = {});
- var tag = tags[node] || (tags[node] = 0);
- tags[node]++;
-
- GetAttributes(element, node);
- }
-
- function GetAttributes(element, node) {
- for(var i = 0; i < element.attributes.length; i++) {
- var att = element.attributes[i];
-
- if(IsValidAttribute(element, att.nodeName)) {
- var attributes = HtmlUsageResults.attributes || (HtmlUsageResults.attributes = {});
- var attribute = attributes[att.nodeName] || (attributes[att.nodeName] = {});
- var attributeTag = attribute[node] || (attribute[node] = {count: 0});
- attributeTag.count++;
- }
- }
- }
-
- function IsValidAttribute(element, attname) {
- // We need to convert className
- if(attname == "class") {
- attname = "className";
- }
-
- if(attname == "classname") {
- return false;
- }
-
- // Only keep attributes that are not data
- if(attname.indexOf('data-') != -1) {
- return false;
- }
-
- if(typeof(element[attname]) == "undefined") {
- return false;
- }
-
- return true;
- }
+void function() {
+
+ window.HtmlUsage = {};
+
+ // This function has been added to the elementAnalyzers in
+ // CSSUsage.js under onready()
+ // is an HTMLElement passed in by elementAnalyzers
+ window.HtmlUsage.GetNodeName = function (element) {
+
+ var node = element.nodeName;
+
+ // If the browser doesn't recognize the element - throw it away
+ if(element instanceof HTMLUnknownElement) {
+ node = "**UNKNOWN";
+ }
+ // Identify custom elements
+ else if(element instanceof HTMLElement && (node.indexOf("-") != -1) && (node != "annotation-xml")) {
+ node = "**CUSTOM";
+ }
+ else {
+ GetAttributes(element, node);
+ }
+
+ var tags = HtmlUsageResults.tags || (HtmlUsageResults.tags = {});
+ var tag = tags[node] || (tags[node] = 0);
+ tags[node]++;
+ }
+
+ function GetAttributes(element, node) {
+ for(var i = 0; i < element.attributes.length; i++) {
+ var att = element.attributes[i];
+
+ if(IsValidAttribute(element, att.nodeName)) {
+ var attributes = HtmlUsageResults.attributes || (HtmlUsageResults.attributes = {});
+ var attribute = attributes[att.nodeName] || (attributes[att.nodeName] = {});
+ var attributeTag = attribute[node] || (attribute[node] = {count: 0});
+ attributeTag.count++;
+ }
+ }
+ }
+
+ function IsValidAttribute(element, attname) {
+ // We need to convert className
+ if(attname == "class") {
+ attname = "className";
+ }
+
+ if(attname == "classname") {
+ return false;
+ }
+
+ // Only keep attributes that are not data
+ if(attname.indexOf('data-') != -1) {
+ return false;
+ }
+
+ if(typeof(element[attname]) == "undefined") {
+ return false;
+ }
+
+ return true;
+ }
}();
void function() { try {
@@ -1645,25 +1650,25 @@ void function() {
return isFlashDownloadLink;
}
}();
-/*
- RECIPE: Payment Request
- -------------------------------------------------------------
- Author: Stanley Hon
- Description: This counts any page that includes any script references to PaymentRequest
-*/
-
-void function() {
- window.CSSUsage.StyleWalker.recipesToRun.push( function paymentrequest(/*HTML DOM Element*/ element, results) {
-
- if(element.nodeName == "SCRIPT") {
- if (element.innerText.indexOf("PaymentRequest") != -1) {
- results["use"] = results["use"] || { count: 0 };
- results["use"].count++;
- }
- }
-
- return results;
- });
+/*
+ RECIPE: Payment Request
+ -------------------------------------------------------------
+ Author: Stanley Hon
+ Description: This counts any page that includes any script references to PaymentRequest
+*/
+
+void function() {
+ window.CSSUsage.StyleWalker.recipesToRun.push( function paymentrequest(/*HTML DOM Element*/ element, results) {
+
+ if(element.nodeName == "SCRIPT") {
+ if (element.innerText.indexOf("PaymentRequest") != -1) {
+ results["use"] = results["use"] || { count: 0 };
+ results["use"].count++;
+ }
+ }
+
+ return results;
+ });
}();
/*
RECIPE:
@@ -1754,168 +1759,171 @@ void function() {
}();
-//
-// This file is only here to create the TSV
-// necessary to collect the data from the crawler
-//
-void function() {
-
- /* String hash function
- /* credits goes to http://erlycoder.com/49/javascript-hash-functions-to-convert-string-into-integer-hash- */
- const hashCodeOf = (str) => {
- var hash = 5381; var char = 0;
- for (var i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash << 5) + hash) + char;
- }
- return hash;
- }
-
- var ua = navigator.userAgent;
- var uaName = ua.indexOf('Edge')>=0 ? 'EDGE' :ua.indexOf('Chrome')>=0 ? 'CHROME' : 'FIREFOX';
- window.INSTRUMENTATION_RESULTS = {
- UA: uaName,
- UASTRING: ua,
- UASTRING_HASH: hashCodeOf(ua),
- URL: location.href,
- TIMESTAMP: Date.now(),
- css: {/* see CSSUsageResults */},
- html: {/* see HtmlUsageResults */},
- dom: {},
- scripts: {/* "bootstrap.js": 1 */},
- };
- window.INSTRUMENTATION_RESULTS_TSV = [];
-
- /* make the script work in the context of a webview */
- try {
- var console = window.console || (window.console={log:function(){},warn:function(){},error:function(){}});
- console.unsafeLog = console.log;
- console.log = function() {
- try {
- this.unsafeLog.apply(this,arguments);
- } catch(ex) {
- // ignore
- }
- };
- } catch (ex) {
- // we tried...
- }
-}();
-
-window.onCSSUsageResults = function onCSSUsageResults(CSSUsageResults) {
-
- // Collect the results (css)
- INSTRUMENTATION_RESULTS.css = CSSUsageResults;
- INSTRUMENTATION_RESULTS.html = HtmlUsageResults;
- INSTRUMENTATION_RESULTS.recipe = RecipeResults;
-
- // Convert it to a more efficient format
- INSTRUMENTATION_RESULTS_TSV = convertToTSV(INSTRUMENTATION_RESULTS);
-
- // Remove tabs and new lines from the data
- for(var i = INSTRUMENTATION_RESULTS_TSV.length; i--;) {
- var row = INSTRUMENTATION_RESULTS_TSV[i];
- for(var j = row.length; j--;) {
- row[j] = (''+row[j]).replace(/(\s|\r|\n)+/g, ' ');
- }
- }
-
- // Convert into one signle tsv file
- var tsvString = INSTRUMENTATION_RESULTS_TSV.map((row) => (row.join('\t'))).join('\n');
- if(window.debugCSSUsage) console.log(tsvString);
-
- // Add it to the document dom
- var output = document.createElement('script');
- output.id = "css-usage-tsv-results";
- output.textContent = tsvString;
- output.type = 'text/plain';
- document.querySelector('head').appendChild(output);
-
- /** convert the instrumentation results to a spreadsheet for analysis */
- function convertToTSV(INSTRUMENTATION_RESULTS) {
-
- var VALUE_COLUMN = 4;
- var finishedRows = [];
- var currentRowTemplate = [
- INSTRUMENTATION_RESULTS.UA,
- INSTRUMENTATION_RESULTS.UASTRING_HASH,
- INSTRUMENTATION_RESULTS.URL,
- INSTRUMENTATION_RESULTS.TIMESTAMP,
- 0
- ];
-
- currentRowTemplate.push('ua');
- convertToTSV({identifier: INSTRUMENTATION_RESULTS.UASTRING});
- currentRowTemplate.pop();
-
-
-
-
-
-
-
-
-
-
- currentRowTemplate.push('recipe');
- convertToTSV(INSTRUMENTATION_RESULTS['recipe']);
- currentRowTemplate.pop();
-
- var l = finishedRows[0].length;
- finishedRows.sort((a,b) => {
- for(var i = VALUE_COLUMN+1; ib[i]) return +1;
- }
- return 0;
- });
-
- return finishedRows;
-
- /** helper function doing the actual conversion */
- function convertToTSV(object) {
- if(object==null || object==undefined || typeof object == 'number' || typeof object == 'string') {
- finishedRows.push(new Row(currentRowTemplate, ''+object));
- } else {
- for(var key in object) {
- if({}.hasOwnProperty.call(object,key)) {
- currentRowTemplate.push(key);
- convertToTSV(object[key]);
- currentRowTemplate.pop();
- }
- }
- }
- }
-
- /** constructor for a row of our table */
- function Row(currentRowTemplate, value) {
-
- // Initialize an empty row with enough columns
- var row = [
- /*UANAME: edge */'',
- /*UASTRING: mozilla/5.0 (...) */'',
- /*URL: http://.../... */'',
- /*TIMESTAMP: 1445622257303 */'',
- /*VALUE: 0|1|... */'',
- /*DATATYPE: css|dom|html... */'',
- /*SUBTYPE: props|types|api|... */'',
- /*NAME: font-size|querySelector|... */'',
- /*CONTEXT: count|values|... */'',
- /*SUBCONTEXT: px|em|... */'',
- /*... */'',
- /*... */'',
- ];
-
- // Copy the column values from the template
- for(var i = currentRowTemplate.length; i--;) {
- row[i] = currentRowTemplate[i];
- }
-
- // Add the value to the row
- row[VALUE_COLUMN] = value;
-
- return row;
- }
-
- }
+//
+// This file is only here to create the TSV
+// necessary to collect the data from the crawler
+//
+void function() {
+
+ /* String hash function
+ /* credits goes to http://erlycoder.com/49/javascript-hash-functions-to-convert-string-into-integer-hash- */
+ const hashCodeOf = (str) => {
+ var hash = 5381; var char = 0;
+ for (var i = 0; i < str.length; i++) {
+ char = str.charCodeAt(i);
+ hash = ((hash << 5) + hash) + char;
+ }
+ return hash;
+ }
+
+ var ua = navigator.userAgent;
+ var uaName = ua.indexOf('Edge')>=0 ? 'EDGE' :ua.indexOf('Chrome')>=0 ? 'CHROME' : 'FIREFOX';
+ window.INSTRUMENTATION_RESULTS = {
+ UA: uaName,
+ UASTRING: ua,
+ UASTRING_HASH: hashCodeOf(ua),
+ URL: location.href,
+ TIMESTAMP: Date.now(),
+ css: {/* see CSSUsageResults */},
+ html: {/* see HtmlUsageResults */},
+ dom: {},
+ scripts: {/* "bootstrap.js": 1 */},
+ };
+ window.INSTRUMENTATION_RESULTS_TSV = [];
+
+ /* make the script work in the context of a webview */
+ try {
+ var console = window.console || (window.console={log:function(){},warn:function(){},error:function(){}});
+ console.unsafeLog = console.log;
+ console.log = function() {
+ try {
+ this.unsafeLog.apply(this,arguments);
+ } catch(ex) {
+ // ignore
+ }
+ };
+ } catch (ex) {
+ // we tried...
+ }
+}();
+
+window.onCSSUsageResults = function onCSSUsageResults(CSSUsageResults) {
+
+ // Collect the results (css)
+ INSTRUMENTATION_RESULTS.css = CSSUsageResults;
+ INSTRUMENTATION_RESULTS.html = HtmlUsageResults;
+ INSTRUMENTATION_RESULTS.recipe = RecipeResults;
+
+ // Convert it to a more efficient format
+ INSTRUMENTATION_RESULTS_TSV = convertToTSV(INSTRUMENTATION_RESULTS);
+
+ // Remove tabs and new lines from the data
+ for(var i = INSTRUMENTATION_RESULTS_TSV.length; i--;) {
+ var row = INSTRUMENTATION_RESULTS_TSV[i];
+ for(var j = row.length; j--;) {
+ row[j] = (''+row[j]).replace(/(\s|\r|\n)+/g, ' ');
+ }
+ }
+
+ // Convert into one signle tsv file
+ var tsvString = INSTRUMENTATION_RESULTS_TSV.map((row) => (row.join('\t'))).join('\n');
+ if(window.debugCSSUsage) console.log(tsvString);
+
+ // Add it to the document dom
+ var output = document.createElement('script');
+ output.id = "css-usage-tsv-results";
+ output.textContent = tsvString;
+ output.type = 'text/plain';
+ document.querySelector('head').appendChild(output);
+
+ /** convert the instrumentation results to a spreadsheet for analysis */
+ function convertToTSV(INSTRUMENTATION_RESULTS) {
+
+ var VALUE_COLUMN = 4;
+ var finishedRows = [];
+ var currentRowTemplate = [
+ INSTRUMENTATION_RESULTS.UA,
+ INSTRUMENTATION_RESULTS.UASTRING_HASH,
+ INSTRUMENTATION_RESULTS.URL,
+ INSTRUMENTATION_RESULTS.TIMESTAMP,
+ 0
+ ];
+
+ currentRowTemplate.push('ua');
+ convertToTSV({identifier: INSTRUMENTATION_RESULTS.UASTRING});
+ currentRowTemplate.pop();
+
+
+ convertToTSV(INSTRUMENTATION_RESULTS['css']);
+ currentRowTemplate.pop();
+
+
+ convertToTSV(INSTRUMENTATION_RESULTS['dom']);
+ currentRowTemplate.pop();
+
+
+ convertToTSV(INSTRUMENTATION_RESULTS['html']);
+ currentRowTemplate.pop();
+
+ currentRowTemplate.push('recipe');
+ convertToTSV(INSTRUMENTATION_RESULTS['recipe']);
+ currentRowTemplate.pop();
+
+ var l = finishedRows[0].length;
+ finishedRows.sort((a,b) => {
+ for(var i = VALUE_COLUMN+1; ib[i]) return +1;
+ }
+ return 0;
+ });
+
+ return finishedRows;
+
+ /** helper function doing the actual conversion */
+ function convertToTSV(object) {
+ if(object==null || object==undefined || typeof object == 'number' || typeof object == 'string') {
+ finishedRows.push(new Row(currentRowTemplate, ''+object));
+ } else {
+ for(var key in object) {
+ if({}.hasOwnProperty.call(object,key)) {
+ currentRowTemplate.push(key);
+ convertToTSV(object[key]);
+ currentRowTemplate.pop();
+ }
+ }
+ }
+ }
+
+ /** constructor for a row of our table */
+ function Row(currentRowTemplate, value) {
+
+ // Initialize an empty row with enough columns
+ var row = [
+ /*UANAME: edge */'',
+ /*UASTRING: mozilla/5.0 (...) */'',
+ /*URL: http://.../... */'',
+ /*TIMESTAMP: 1445622257303 */'',
+ /*VALUE: 0|1|... */'',
+ /*DATATYPE: css|dom|html... */'',
+ /*SUBTYPE: props|types|api|... */'',
+ /*NAME: font-size|querySelector|... */'',
+ /*CONTEXT: count|values|... */'',
+ /*SUBCONTEXT: px|em|... */'',
+ /*... */'',
+ /*... */'',
+ ];
+
+ // Copy the column values from the template
+ for(var i = currentRowTemplate.length; i--;) {
+ row[i] = currentRowTemplate[i];
+ }
+
+ // Add the value to the row
+ row[VALUE_COLUMN] = value;
+
+ return row;
+ }
+
+ }
};
\ No newline at end of file
diff --git a/cssUsage.src.js b/cssUsage.src.js
index a9a0e40..d6bad28 100644
--- a/cssUsage.src.js
+++ b/cssUsage.src.js
@@ -437,63 +437,68 @@ function getPatternUsage(results, domClasses, cssClasses) {
return results;
}
-void function() {
-
- window.HtmlUsage = {};
-
- // This function has been added to the elementAnalyzers in
- // CSSUsage.js under onready()
- // is an HTMLElement passed in by elementAnalyzers
- window.HtmlUsage.GetNodeName = function (element) {
-
- // If the browser doesn't recognize the element - throw it away
- if(element instanceof HTMLUnknownElement) {
- return;
- }
-
- var node = element.nodeName;
-
- var tags = HtmlUsageResults.tags || (HtmlUsageResults.tags = {});
- var tag = tags[node] || (tags[node] = 0);
- tags[node]++;
-
- GetAttributes(element, node);
- }
-
- function GetAttributes(element, node) {
- for(var i = 0; i < element.attributes.length; i++) {
- var att = element.attributes[i];
-
- if(IsValidAttribute(element, att.nodeName)) {
- var attributes = HtmlUsageResults.attributes || (HtmlUsageResults.attributes = {});
- var attribute = attributes[att.nodeName] || (attributes[att.nodeName] = {});
- var attributeTag = attribute[node] || (attribute[node] = {count: 0});
- attributeTag.count++;
- }
- }
- }
-
- function IsValidAttribute(element, attname) {
- // We need to convert className
- if(attname == "class") {
- attname = "className";
- }
-
- if(attname == "classname") {
- return false;
- }
-
- // Only keep attributes that are not data
- if(attname.indexOf('data-') != -1) {
- return false;
- }
-
- if(typeof(element[attname]) == "undefined") {
- return false;
- }
-
- return true;
- }
+void function() {
+
+ window.HtmlUsage = {};
+
+ // This function has been added to the elementAnalyzers in
+ // CSSUsage.js under onready()
+ // is an HTMLElement passed in by elementAnalyzers
+ window.HtmlUsage.GetNodeName = function (element) {
+
+ var node = element.nodeName;
+
+ // If the browser doesn't recognize the element - throw it away
+ if(element instanceof HTMLUnknownElement) {
+ node = "**UNKNOWN";
+ }
+ // Identify custom elements
+ else if(element instanceof HTMLElement && (node.indexOf("-") != -1) && (node != "annotation-xml")) {
+ node = "**CUSTOM";
+ }
+ else {
+ GetAttributes(element, node);
+ }
+
+ var tags = HtmlUsageResults.tags || (HtmlUsageResults.tags = {});
+ var tag = tags[node] || (tags[node] = 0);
+ tags[node]++;
+ }
+
+ function GetAttributes(element, node) {
+ for(var i = 0; i < element.attributes.length; i++) {
+ var att = element.attributes[i];
+
+ if(IsValidAttribute(element, att.nodeName)) {
+ var attributes = HtmlUsageResults.attributes || (HtmlUsageResults.attributes = {});
+ var attribute = attributes[att.nodeName] || (attributes[att.nodeName] = {});
+ var attributeTag = attribute[node] || (attribute[node] = {count: 0});
+ attributeTag.count++;
+ }
+ }
+ }
+
+ function IsValidAttribute(element, attname) {
+ // We need to convert className
+ if(attname == "class") {
+ attname = "className";
+ }
+
+ if(attname == "classname") {
+ return false;
+ }
+
+ // Only keep attributes that are not data
+ if(attname.indexOf('data-') != -1) {
+ return false;
+ }
+
+ if(typeof(element[attname]) == "undefined") {
+ return false;
+ }
+
+ return true;
+ }
}();
void function() { try {
@@ -1645,25 +1650,25 @@ void function() {
return isFlashDownloadLink;
}
}();
-/*
- RECIPE: Payment Request
- -------------------------------------------------------------
- Author: Stanley Hon
- Description: This counts any page that includes any script references to PaymentRequest
-*/
-
-void function() {
- window.CSSUsage.StyleWalker.recipesToRun.push( function paymentrequest(/*HTML DOM Element*/ element, results) {
-
- if(element.nodeName == "SCRIPT") {
- if (element.innerText.indexOf("PaymentRequest") != -1) {
- results["use"] = results["use"] || { count: 0 };
- results["use"].count++;
- }
- }
-
- return results;
- });
+/*
+ RECIPE: Payment Request
+ -------------------------------------------------------------
+ Author: Stanley Hon
+ Description: This counts any page that includes any script references to PaymentRequest
+*/
+
+void function() {
+ window.CSSUsage.StyleWalker.recipesToRun.push( function paymentrequest(/*HTML DOM Element*/ element, results) {
+
+ if(element.nodeName == "SCRIPT") {
+ if (element.innerText.indexOf("PaymentRequest") != -1) {
+ results["use"] = results["use"] || { count: 0 };
+ results["use"].count++;
+ }
+ }
+
+ return results;
+ });
}();
/*
RECIPE:
@@ -1754,171 +1759,171 @@ void function() {
}();
-//
-// This file is only here to create the TSV
-// necessary to collect the data from the crawler
-//
-void function() {
-
- /* String hash function
- /* credits goes to http://erlycoder.com/49/javascript-hash-functions-to-convert-string-into-integer-hash- */
- const hashCodeOf = (str) => {
- var hash = 5381; var char = 0;
- for (var i = 0; i < str.length; i++) {
- char = str.charCodeAt(i);
- hash = ((hash << 5) + hash) + char;
- }
- return hash;
- }
-
- var ua = navigator.userAgent;
- var uaName = ua.indexOf('Edge')>=0 ? 'EDGE' :ua.indexOf('Chrome')>=0 ? 'CHROME' : 'FIREFOX';
- window.INSTRUMENTATION_RESULTS = {
- UA: uaName,
- UASTRING: ua,
- UASTRING_HASH: hashCodeOf(ua),
- URL: location.href,
- TIMESTAMP: Date.now(),
- css: {/* see CSSUsageResults */},
- html: {/* see HtmlUsageResults */},
- dom: {},
- scripts: {/* "bootstrap.js": 1 */},
- };
- window.INSTRUMENTATION_RESULTS_TSV = [];
-
- /* make the script work in the context of a webview */
- try {
- var console = window.console || (window.console={log:function(){},warn:function(){},error:function(){}});
- console.unsafeLog = console.log;
- console.log = function() {
- try {
- this.unsafeLog.apply(this,arguments);
- } catch(ex) {
- // ignore
- }
- };
- } catch (ex) {
- // we tried...
- }
-}();
-
-window.onCSSUsageResults = function onCSSUsageResults(CSSUsageResults) {
-
- // Collect the results (css)
- INSTRUMENTATION_RESULTS.css = CSSUsageResults;
- INSTRUMENTATION_RESULTS.html = HtmlUsageResults;
- INSTRUMENTATION_RESULTS.recipe = RecipeResults;
-
- // Convert it to a more efficient format
- INSTRUMENTATION_RESULTS_TSV = convertToTSV(INSTRUMENTATION_RESULTS);
-
- // Remove tabs and new lines from the data
- for(var i = INSTRUMENTATION_RESULTS_TSV.length; i--;) {
- var row = INSTRUMENTATION_RESULTS_TSV[i];
- for(var j = row.length; j--;) {
- row[j] = (''+row[j]).replace(/(\s|\r|\n)+/g, ' ');
- }
- }
-
- // Convert into one signle tsv file
- var tsvString = INSTRUMENTATION_RESULTS_TSV.map((row) => (row.join('\t'))).join('\n');
- if(window.debugCSSUsage) console.log(tsvString);
-
- // Add it to the document dom
- var output = document.createElement('script');
- output.id = "css-usage-tsv-results";
- output.textContent = tsvString;
- output.type = 'text/plain';
- document.querySelector('head').appendChild(output);
-
- /** convert the instrumentation results to a spreadsheet for analysis */
- function convertToTSV(INSTRUMENTATION_RESULTS) {
-
- var VALUE_COLUMN = 4;
- var finishedRows = [];
- var currentRowTemplate = [
- INSTRUMENTATION_RESULTS.UA,
- INSTRUMENTATION_RESULTS.UASTRING_HASH,
- INSTRUMENTATION_RESULTS.URL,
- INSTRUMENTATION_RESULTS.TIMESTAMP,
- 0
- ];
-
- currentRowTemplate.push('ua');
- convertToTSV({identifier: INSTRUMENTATION_RESULTS.UASTRING});
- currentRowTemplate.pop();
-
- currentRowTemplate.push('css');
- convertToTSV(INSTRUMENTATION_RESULTS['css']);
- currentRowTemplate.pop();
-
- currentRowTemplate.push('dom');
- convertToTSV(INSTRUMENTATION_RESULTS['dom']);
- currentRowTemplate.pop();
-
- currentRowTemplate.push('html');
- convertToTSV(INSTRUMENTATION_RESULTS['html']);
- currentRowTemplate.pop();
-
- currentRowTemplate.push('recipe');
- convertToTSV(INSTRUMENTATION_RESULTS['recipe']);
- currentRowTemplate.pop();
-
- var l = finishedRows[0].length;
- finishedRows.sort((a,b) => {
- for(var i = VALUE_COLUMN+1; ib[i]) return +1;
- }
- return 0;
- });
-
- return finishedRows;
-
- /** helper function doing the actual conversion */
- function convertToTSV(object) {
- if(object==null || object==undefined || typeof object == 'number' || typeof object == 'string') {
- finishedRows.push(new Row(currentRowTemplate, ''+object));
- } else {
- for(var key in object) {
- if({}.hasOwnProperty.call(object,key)) {
- currentRowTemplate.push(key);
- convertToTSV(object[key]);
- currentRowTemplate.pop();
- }
- }
- }
- }
-
- /** constructor for a row of our table */
- function Row(currentRowTemplate, value) {
-
- // Initialize an empty row with enough columns
- var row = [
- /*UANAME: edge */'',
- /*UASTRING: mozilla/5.0 (...) */'',
- /*URL: http://.../... */'',
- /*TIMESTAMP: 1445622257303 */'',
- /*VALUE: 0|1|... */'',
- /*DATATYPE: css|dom|html... */'',
- /*SUBTYPE: props|types|api|... */'',
- /*NAME: font-size|querySelector|... */'',
- /*CONTEXT: count|values|... */'',
- /*SUBCONTEXT: px|em|... */'',
- /*... */'',
- /*... */'',
- ];
-
- // Copy the column values from the template
- for(var i = currentRowTemplate.length; i--;) {
- row[i] = currentRowTemplate[i];
- }
-
- // Add the value to the row
- row[VALUE_COLUMN] = value;
-
- return row;
- }
-
- }
+//
+// This file is only here to create the TSV
+// necessary to collect the data from the crawler
+//
+void function() {
+
+ /* String hash function
+ /* credits goes to http://erlycoder.com/49/javascript-hash-functions-to-convert-string-into-integer-hash- */
+ const hashCodeOf = (str) => {
+ var hash = 5381; var char = 0;
+ for (var i = 0; i < str.length; i++) {
+ char = str.charCodeAt(i);
+ hash = ((hash << 5) + hash) + char;
+ }
+ return hash;
+ }
+
+ var ua = navigator.userAgent;
+ var uaName = ua.indexOf('Edge')>=0 ? 'EDGE' :ua.indexOf('Chrome')>=0 ? 'CHROME' : 'FIREFOX';
+ window.INSTRUMENTATION_RESULTS = {
+ UA: uaName,
+ UASTRING: ua,
+ UASTRING_HASH: hashCodeOf(ua),
+ URL: location.href,
+ TIMESTAMP: Date.now(),
+ css: {/* see CSSUsageResults */},
+ html: {/* see HtmlUsageResults */},
+ dom: {},
+ scripts: {/* "bootstrap.js": 1 */},
+ };
+ window.INSTRUMENTATION_RESULTS_TSV = [];
+
+ /* make the script work in the context of a webview */
+ try {
+ var console = window.console || (window.console={log:function(){},warn:function(){},error:function(){}});
+ console.unsafeLog = console.log;
+ console.log = function() {
+ try {
+ this.unsafeLog.apply(this,arguments);
+ } catch(ex) {
+ // ignore
+ }
+ };
+ } catch (ex) {
+ // we tried...
+ }
+}();
+
+window.onCSSUsageResults = function onCSSUsageResults(CSSUsageResults) {
+
+ // Collect the results (css)
+ INSTRUMENTATION_RESULTS.css = CSSUsageResults;
+ INSTRUMENTATION_RESULTS.html = HtmlUsageResults;
+ INSTRUMENTATION_RESULTS.recipe = RecipeResults;
+
+ // Convert it to a more efficient format
+ INSTRUMENTATION_RESULTS_TSV = convertToTSV(INSTRUMENTATION_RESULTS);
+
+ // Remove tabs and new lines from the data
+ for(var i = INSTRUMENTATION_RESULTS_TSV.length; i--;) {
+ var row = INSTRUMENTATION_RESULTS_TSV[i];
+ for(var j = row.length; j--;) {
+ row[j] = (''+row[j]).replace(/(\s|\r|\n)+/g, ' ');
+ }
+ }
+
+ // Convert into one signle tsv file
+ var tsvString = INSTRUMENTATION_RESULTS_TSV.map((row) => (row.join('\t'))).join('\n');
+ if(window.debugCSSUsage) console.log(tsvString);
+
+ // Add it to the document dom
+ var output = document.createElement('script');
+ output.id = "css-usage-tsv-results";
+ output.textContent = tsvString;
+ output.type = 'text/plain';
+ document.querySelector('head').appendChild(output);
+
+ /** convert the instrumentation results to a spreadsheet for analysis */
+ function convertToTSV(INSTRUMENTATION_RESULTS) {
+
+ var VALUE_COLUMN = 4;
+ var finishedRows = [];
+ var currentRowTemplate = [
+ INSTRUMENTATION_RESULTS.UA,
+ INSTRUMENTATION_RESULTS.UASTRING_HASH,
+ INSTRUMENTATION_RESULTS.URL,
+ INSTRUMENTATION_RESULTS.TIMESTAMP,
+ 0
+ ];
+
+ currentRowTemplate.push('ua');
+ convertToTSV({identifier: INSTRUMENTATION_RESULTS.UASTRING});
+ currentRowTemplate.pop();
+
+ currentRowTemplate.push('css');
+ convertToTSV(INSTRUMENTATION_RESULTS['css']);
+ currentRowTemplate.pop();
+
+ currentRowTemplate.push('dom');
+ convertToTSV(INSTRUMENTATION_RESULTS['dom']);
+ currentRowTemplate.pop();
+
+ currentRowTemplate.push('html');
+ convertToTSV(INSTRUMENTATION_RESULTS['html']);
+ currentRowTemplate.pop();
+
+ currentRowTemplate.push('recipe');
+ convertToTSV(INSTRUMENTATION_RESULTS['recipe']);
+ currentRowTemplate.pop();
+
+ var l = finishedRows[0].length;
+ finishedRows.sort((a,b) => {
+ for(var i = VALUE_COLUMN+1; ib[i]) return +1;
+ }
+ return 0;
+ });
+
+ return finishedRows;
+
+ /** helper function doing the actual conversion */
+ function convertToTSV(object) {
+ if(object==null || object==undefined || typeof object == 'number' || typeof object == 'string') {
+ finishedRows.push(new Row(currentRowTemplate, ''+object));
+ } else {
+ for(var key in object) {
+ if({}.hasOwnProperty.call(object,key)) {
+ currentRowTemplate.push(key);
+ convertToTSV(object[key]);
+ currentRowTemplate.pop();
+ }
+ }
+ }
+ }
+
+ /** constructor for a row of our table */
+ function Row(currentRowTemplate, value) {
+
+ // Initialize an empty row with enough columns
+ var row = [
+ /*UANAME: edge */'',
+ /*UASTRING: mozilla/5.0 (...) */'',
+ /*URL: http://.../... */'',
+ /*TIMESTAMP: 1445622257303 */'',
+ /*VALUE: 0|1|... */'',
+ /*DATATYPE: css|dom|html... */'',
+ /*SUBTYPE: props|types|api|... */'',
+ /*NAME: font-size|querySelector|... */'',
+ /*CONTEXT: count|values|... */'',
+ /*SUBCONTEXT: px|em|... */'',
+ /*... */'',
+ /*... */'',
+ ];
+
+ // Copy the column values from the template
+ for(var i = currentRowTemplate.length; i--;) {
+ row[i] = currentRowTemplate[i];
+ }
+
+ // Add the value to the row
+ row[VALUE_COLUMN] = value;
+
+ return row;
+ }
+
+ }
};
\ No newline at end of file
diff --git a/src/htmlUsage.js b/src/htmlUsage.js
index 33a4728..da904ec 100644
--- a/src/htmlUsage.js
+++ b/src/htmlUsage.js
@@ -7,18 +7,23 @@ void function() {
// is an HTMLElement passed in by elementAnalyzers
window.HtmlUsage.GetNodeName = function (element) {
+ var node = element.nodeName;
+
// If the browser doesn't recognize the element - throw it away
if(element instanceof HTMLUnknownElement) {
- return;
+ node = "**UNKNOWN";
+ }
+ // Identify custom elements
+ else if(element instanceof HTMLElement && (node.indexOf("-") != -1) && (node != "annotation-xml")) {
+ node = "**CUSTOM";
+ }
+ else {
+ GetAttributes(element, node);
}
-
- var node = element.nodeName;
var tags = HtmlUsageResults.tags || (HtmlUsageResults.tags = {});
var tag = tags[node] || (tags[node] = 0);
tags[node]++;
-
- GetAttributes(element, node);
}
function GetAttributes(element, node) {
@@ -28,7 +33,7 @@ void function() {
if(IsValidAttribute(element, att.nodeName)) {
var attributes = HtmlUsageResults.attributes || (HtmlUsageResults.attributes = {});
var attribute = attributes[att.nodeName] || (attributes[att.nodeName] = {});
- var attributeTag = attribute[node] || (attribute[node] = {count: 0});
+ var attributeTag = attribute[node] || (attribute[node] = {count: 0});
attributeTag.count++;
}
}
@@ -38,7 +43,7 @@ void function() {
// We need to convert className
if(attname == "class") {
attname = "className";
- }
+ }
if(attname == "classname") {
return false;
diff --git a/tests/test-page/index.html b/tests/test-page/index.html
index fb2bcf5..78548d7 100644
--- a/tests/test-page/index.html
+++ b/tests/test-page/index.html
@@ -26,16 +26,16 @@ Header using font-face
-
+
Random stuff to make sure that I cover values and props
Text
CRAZY!!!
-
+
-
+
VARIABLES
-
+