Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Externaliser le code de l'analyseur #21

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 12 additions & 21 deletions cli-core/analysis.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ const fs = require('fs')
const path = require('path');
const ProgressBar = require('progress');
const sizes = require('../sizes.js');
const translator = require('./translator.js').translator;
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
const launchAnalyse = require('../greenit-core/greenpanel.js').launchAnalyse;

//Path to the url file
const SUBRESULTS_DIRECTORY = path.join(__dirname,'../results');
Expand Down Expand Up @@ -65,26 +67,15 @@ async function analyseURL(browser, pageInformations, options) {
const client = await page.target().createCDPSession();
let ressourceTree = await client.send('Page.getResourceTree');
await client.detach()

// replace chrome.i18n.getMessage call by i18n custom implementation working in page
// fr is default catalog
await page.evaluate(language_array =>(chrome = { "i18n" : {"getMessage" : function (message, parameters = []) {
return language_array[message].replace(/%s/g, function() {
// parameters is string or array
return Array.isArray(parameters) ? parameters.shift() : parameters;
});
}}}), translator.getCatalog());

//add script, get run, then remove it to not interfere with the analysis
let script = await page.addScriptTag({ path: path.join(__dirname,'../dist/bundle.js')});
await script.evaluate(x=>(x.remove()));

//pass node object to browser
await page.evaluate(x=>(har = x), harObj.log);
await page.evaluate(x=>(resources = x), ressourceTree.frameTree.resources);


//retrieve page content
const pageContent = await page.content();

// Building in memory Page DOM
const dom = new JSDOM(pageContent);

//launch analyse
result = await page.evaluate(()=>(launchAnalyse()));
result = await launchAnalyse(dom.window.document, harObj.log, ressourceTree.frameTree.resources);

page.close();
result.success = true;
Expand Down Expand Up @@ -323,4 +314,4 @@ async function createJsonReports(browser, pagesInformations, options, proxy, hea
module.exports = {
createJsonReports,
login
}
};
4 changes: 2 additions & 2 deletions cli-core/reportHtml.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ function extractBestPractices(bestPracticesFromReport) {
}

function writeGlobalReport(templateEngine, globalReportVariables, outputFile) {
templateEngine.processFile('cli-core/template/global.html', globalReportVariables)
templateEngine.processFile(__dirname + '/template/global.html', globalReportVariables)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il faudrait faire un rebase de la master : cela a été corrigé récemment

.then(globalReportHtml => {
fs.writeFileSync(outputFile, globalReportHtml);
})
Expand All @@ -173,7 +173,7 @@ function writeGlobalReport(templateEngine, globalReportVariables, outputFile) {

function writeAllReports(templateEngine, allReportsVariables, outputFolder) {
allReportsVariables.forEach(reportVariables => {
templateEngine.processFile('cli-core/template/page.html', reportVariables)
templateEngine.processFile(__dirname + '/template/page.html', reportVariables)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idem, en faisant un rebase de la master, cela a déjà été corrigé

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idem, en faisant un rebase de la master, cela a déjà été corrigé

.then(singleReportHtml => {
fs.writeFileSync(`${outputFolder}/${reportVariables.filename}`, singleReportHtml);
})
Expand Down
Empty file modified greenit
100644 → 100755
Empty file.
34 changes: 19 additions & 15 deletions greenit-core/analyseFrameCore.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,20 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

function start_analyse_core() {
function start_analyse_core(document, analyseBestPractices) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Les modifications réalisés dans ce fichier me fait pose un peu un problème... Cela nécessite de modifier le coeur du plugin GreenIT-Analysis. En conséquence, lorsqu'on a besoin de mettre à jour le coeur de GreenIT-Analysis dans GreenIT-Analysis-cli, cela sera beaucoup plus compliqué...

Je continue à réfléchir pour voir si on a une meilleure façon de gérer la mise à jour de GreenIT-Analysis et répondre à la problématique que tu proposes de corriger.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Les modifications réalisés dans ce fichier me fait pose un peu un problème... Cela nécessite de modifier le coeur du plugin GreenIT-Analysis. En conséquence, lorsqu'on a besoin de mettre à jour le coeur de GreenIT-Analysis dans GreenIT-Analysis-cli, cela sera beaucoup plus compliqué...

Je continue à réfléchir pour voir si on a une meilleure façon de gérer la mise à jour de GreenIT-Analysis et répondre à la problématique que tu proposes de corriger.

const analyseStartingTime = Date.now();
const dom_size = document.getElementsByTagName("*").length;
let pageAnalysis;

if (analyseBestPractices) {
// test with http://www.wickham43.net/flashvideo.php
const pluginsNumber = getPluginsNumber();
const printStyleSheetsNumber = getPrintStyleSheetsNumber();
const inlineStyleSheetsNumber = getInlineStyleSheetsNumber();
const emptySrcTagNumber = getEmptySrcTagNumber();
const inlineJsScript = getInlineJsScript();
const inlineJsScriptsNumber = getInlineJsScriptsNumber();
const imagesResizedInBrowser = getImagesResizedInBrowser();
const pluginsNumber = getPluginsNumber(document);
const printStyleSheetsNumber = getPrintStyleSheetsNumber(document);
const inlineStyleSheetsNumber = getInlineStyleSheetsNumber(document);
const emptySrcTagNumber = getEmptySrcTagNumber(document);
const inlineJsScript = getInlineJsScript(document);
const inlineJsScriptsNumber = getInlineJsScriptsNumber(document);
const imagesResizedInBrowser = getImagesResizedInBrowser(document);


pageAnalysis = {
Expand All @@ -55,26 +55,26 @@ function start_analyse_core() {

}

function getPluginsNumber() {
function getPluginsNumber(document) {
const plugins = document.querySelectorAll('object,embed');
return (plugins === undefined) ? 0 : plugins.length;
}



function getEmptySrcTagNumber() {
function getEmptySrcTagNumber(document) {
return document.querySelectorAll('img[src=""]').length
+ document.querySelectorAll('script[src=""]').length
+ document.querySelectorAll('link[rel=stylesheet][href=""]').length;
}


function getPrintStyleSheetsNumber() {
function getPrintStyleSheetsNumber(document) {
return document.querySelectorAll('link[rel=stylesheet][media~=print]').length
+ document.querySelectorAll('style[media~=print]').length;
}

function getInlineStyleSheetsNumber() {
function getInlineStyleSheetsNumber(document) {
let styleSheetsArray = Array.from(document.styleSheets);
let inlineStyleSheetsNumber = 0;
styleSheetsArray.forEach(styleSheet => {
Expand All @@ -90,7 +90,7 @@ return inlineStyleSheetsNumber;
}


function getInlineJsScript() {
function getInlineJsScript(document) {
let scriptArray = Array.from(document.scripts);
let scriptText = "";
scriptArray.forEach(script => {
Expand All @@ -100,7 +100,7 @@ function getInlineJsScript() {
return scriptText;
}

function getInlineJsScriptsNumber() {
function getInlineJsScriptsNumber(document) {
let scriptArray = Array.from(document.scripts);
let inlineScriptNumber = 0;
scriptArray.forEach(script => {
Expand All @@ -111,7 +111,7 @@ function getInlineJsScriptsNumber() {
}


function getImagesResizedInBrowser() {
function getImagesResizedInBrowser(document) {
const imgArray = Array.from(document.querySelectorAll('img'));
let imagesResized = [];
imgArray.forEach(img => {
Expand All @@ -132,3 +132,7 @@ function getImagesResizedInBrowser() {
});
return imagesResized;
}

module.exports = {
start_analyse_core
};
16 changes: 16 additions & 0 deletions greenit-core/chrome.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const {translator} = require("../cli-core/translator");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On est en train d'inclure des dépendances du greenit-core dans cli-core et inversement... Je réfléchis aussi pour voir si on peut faire mieux

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On est en train d'inclure des dépendances du greenit-core dans cli-core et inversement... Je réfléchis aussi pour voir si on peut faire mieux


chrome = {
"i18n": {
"getMessage": function (message, parameters = []) {
return translator.getCatalog()[message].replace(/%s/g, function () {
// parameters is string or array
return Array.isArray(parameters) ? parameters.shift() : parameters;
});
}
}
};

module.exports = {
chrome
};
7 changes: 7 additions & 0 deletions greenit-core/ecoIndex.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,10 @@ function computeWaterConsumptionfromEcoIndex(ecoIndex)
return (Math.round(100 * (3 + 3 * (50 - ecoIndex) / 100)) / 100);
}

module.exports = {
computeEcoIndex,
computeWaterConsumptionfromEcoIndex,
computeGreenhouseGasesEmissionfromEcoIndex,
computeQuantile,
getEcoIndexGrade
};
102 changes: 79 additions & 23 deletions greenit-core/greenpanel.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,48 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

const utils = require('./utils.js');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Au fur et à mesure de la lecture de la PR, je vois que par la suite, beaucoup de code faisant parti du coeur de GreenIT-Analysis sont modifiés, ce qui n'est pas le but non plus de GreenIT-Analysis-cli qui est simplement une extension. Il faut tout de même qu'on trouve une solution pour répondre à la problématique que tu remontes.

En utilisant le plugin GreenIT-Analysis, as-tu aussi des erreurs CSP ?

const {start_analyse_core} = require("./analyseFrameCore");
const {
computeEcoIndex, computeWaterConsumptionfromEcoIndex, computeGreenhouseGasesEmissionfromEcoIndex,
getEcoIndexGrade
} = require("./ecoIndex");
const {isNetworkResource, isDataResource} = require("./utils");
const {registerAddExpiresOrCacheControlHeaders} = require("./rules/AddExpiresOrCacheControlHeaders");
const {registerCompressHttp} = require("./rules/CompressHttp");
const {registerDontResizeImageInBrowser} = require("./rules/DontResizeImageInBrowser");
const {registerDomainsNumber} = require("./rules/DomainsNumber");
const {registerEmptySrcTag} = require("./rules/EmptySrcTag");
const {registerExternalizeCss} = require("./rules/ExternalizeCss");
const {registerExternalizeJs} = require("./rules/ExternalizeJs");
const {registerHttpError} = require("./rules/HttpError");
const {registerHttpRequests} = require("./rules/HttpRequests");
const {registerImageDownloadedNotDisplayed} = require("./rules/ImageDownloadedNotDisplayed");
const {registerJsValidate} = require("./rules/JsValidate");
const {registerMaxCookiesLength} = require("./rules/MaxCookiesLength");
const {registerMinifiedCss} = require("./rules/MinifiedCss");
const {registerMinifiedJs} = require("./rules/MinifiedJs");
const {registerNoCookieForStaticRessources} = require("./rules/NoCookieForStaticRessources");
const {registerNoRedirect} = require("./rules/NoRedirect");
const {registerOptimizeBitmapImages} = require("./rules/OptimizeBitmapImages");
const {registerOptimizeSvg} = require("./rules/OptimizeSvg");
const {registerPlugins} = require("./rules/Plugins");
const {registerPrintStyleSheet} = require("./rules/PrintStyleSheet");
const {registerSocialNetworkButton} = require("./rules/SocialNetworkButton");
const {registerStyleSheets} = require("./rules/StyleSheets");
const {registerUseETags} = require("./rules/UseETags");
const {registerUseStandardTypefaces} = require("./rules/UseStandardTypefaces");
const RulesManager = require('./rulesManager.js').RulesManager

let backgroundPageConnection;
let currentRulesChecker;
let lastAnalyseStartingTime = 0;
let measuresAcquisition;
let analyseBestPractices = true;
let har;
let resources;

function handleResponseFromBackground(frameMeasures) {
if (isOldAnalyse(frameMeasures.analyseStartingTime)) {
debug(() => `Analyse is too old for url ${frameMeasures.url} , time = ${frameMeasures.analyseStartingTime}`);
utils.debug(() => `Analyse is too old for url ${frameMeasures.url} , time = ${frameMeasures.analyseStartingTime}`);
return;
}
measuresAcquisition.aggregateFrameMeasures(frameMeasures);
Expand All @@ -41,21 +72,42 @@ function computeEcoIndexMeasures(measures) {
measures.grade = getEcoIndexGrade(measures.ecoIndex);
}

function registerRules(rulesManager) {
registerAddExpiresOrCacheControlHeaders(rulesManager)
registerCompressHttp(rulesManager)
registerDontResizeImageInBrowser(rulesManager)
registerDomainsNumber(rulesManager)
registerEmptySrcTag(rulesManager)
registerExternalizeCss(rulesManager)
registerExternalizeJs(rulesManager)
registerHttpError(rulesManager)
registerHttpRequests(rulesManager)
registerImageDownloadedNotDisplayed(rulesManager)
registerJsValidate(rulesManager)
registerMaxCookiesLength(rulesManager)
registerMinifiedCss(rulesManager)
registerMinifiedJs(rulesManager)
registerNoCookieForStaticRessources(rulesManager)
registerNoRedirect(rulesManager)
registerOptimizeBitmapImages(rulesManager)
registerOptimizeSvg(rulesManager)
registerPlugins(rulesManager)
registerPrintStyleSheet(rulesManager)
registerSocialNetworkButton(rulesManager)
registerStyleSheets(rulesManager)
registerUseETags(rulesManager)
registerUseStandardTypefaces(rulesManager)
}

function launchAnalyse() {
let now = Date.now();

// To avoid parallel analyse , force 1 secondes between analysis
if (now - lastAnalyseStartingTime < 1000) {
debug(() => "Ignore click");
return;
}
lastAnalyseStartingTime = now;
async function launchAnalyse(document, har, resources) {
lastAnalyseStartingTime = Date.now();
let rulesManager = new RulesManager()
registerRules(rulesManager);
currentRulesChecker = rulesManager.getNewRulesChecker();
measuresAcquisition = new MeasuresAcquisition(currentRulesChecker);
measuresAcquisition.initializeMeasures();
measuresAcquisition.aggregateFrameMeasures(start_analyse_core())
measuresAcquisition.startMeasuring();
measuresAcquisition.aggregateFrameMeasures(start_analyse_core(document, analyseBestPractices))
measuresAcquisition.startMeasuring(har, resources);
let returnObj = measuresAcquisition.getMeasures();
returnObj.bestPractices = measuresAcquisition.getBestPractices()
return returnObj;
Expand Down Expand Up @@ -88,9 +140,9 @@ function MeasuresAcquisition(rules) {
};
}

this.startMeasuring = function () {
getNetworkMeasure();
if (analyseBestPractices) getResourcesMeasure();
this.startMeasuring = function (har, resources) {
getNetworkMeasure(har);
if (analyseBestPractices) getResourcesMeasure(resources);
}

this.getMeasures = () => measures;
Expand Down Expand Up @@ -126,18 +178,18 @@ function MeasuresAcquisition(rules) {



const getNetworkMeasure = () => {
const getNetworkMeasure = (har) => {

console.log("Start network measure...");
// only account for network traffic, filtering resources embedded through data urls
let entries = har.entries.filter(entry => isNetworkResource(entry));

// Get the "mother" url
// Get the "mother" url
if (entries.length > 0) measures.url = entries[0].request.url;
else {
// Bug with firefox when we first get har.entries when starting the plugin , we need to ask again to have it
// Bug with firefox when we first get har.entries when starting the plugin , we need to ask again to have it
if (nbGetHarTry < 1) {
debug(() => 'No entries, try again to get HAR in 1s');
utils.debug(() => 'No entries, try again to get HAR in 1s');
nbGetHarTry++;
setTimeout(getNetworkMeasure, 1000);
}
Expand Down Expand Up @@ -170,7 +222,7 @@ function MeasuresAcquisition(rules) {
}
}

function getResourcesMeasure() {
function getResourcesMeasure(resources) {
resources.forEach(resource => {
if (resource.url.startsWith("file") || resource.url.startsWith("http")) {
if ((resource.type === 'script') || (resource.type === 'stylesheet') || (resource.type === 'image')) {
Expand Down Expand Up @@ -234,3 +286,7 @@ function storeAnalysisInHistory() {

localStorage.setItem("analyse_history", JSON.stringify(analyse_history));
}

module.exports = {
launchAnalyse
};
Loading