diff --git a/Gruntfile.js b/Gruntfile.js index bfa9b04..b7c5fea 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -11,17 +11,18 @@ module.exports = function(grunt) { pkg: grunt.file.readJSON('package.json'), settings: grunt.file.readJSON('./server_config/settings.json'), - font: { + webfont: { icons: { - src: ['front/src/fonts/svg-icons/*.svg'], - destCss: 'front/src/less/icons.less', - destFonts: 'front/src/fonts/icons.woff', - - // Optional: Custom routing of font filepaths for CSS - cssRouter: function (fontpath) { - var pathArray = fontpath.split('/'); - var fileName = pathArray[pathArray.length - 1]; - return '/fonts/' + fileName; + src: 'front/src/fonts/svg-icons/*.svg', + dest: 'tmp', + destCss: 'front/src/less', + options: { + engine: 'node', + types: 'woff', + stylesheet: 'less', + embed: true, + htmlDemo: false, + syntax: 'bootstrap' } } }, @@ -102,7 +103,6 @@ module.exports = function(grunt) { }, build: { files: [ - {src: ['./front/src/fonts/icons.woff'], dest: './front/build/fonts/icons.woff'}, {src: ['./front/src/img/favicon.png'], dest: './front/build/img/favicon.png'}, {src: ['./front/src/img/logo-large.png'], dest: './front/build/img/logo-large.png'}, ] @@ -211,10 +211,7 @@ module.exports = function(grunt) { html: './front/build/main.html', css: './front/build/css/*.css', options: { - assetsDirs: ['front/build'], - patterns: { - css: [[/(\/fonts\/icons\.woff)/gm, 'Replacing reference to icons.woff']] - } + assetsDirs: ['front/build'] } }, htmlmin: { @@ -294,7 +291,7 @@ module.exports = function(grunt) { grunt.registerTask('icons', [ - 'font:icons', + 'webfont:icons', 'less', 'clean:tmp' ]); diff --git a/bin/cli.js b/bin/cli.js index 832112f..b22da78 100644 --- a/bin/cli.js +++ b/bin/cli.js @@ -12,6 +12,7 @@ var cli = meow({ ' yellowlabtools ', '', 'Options:', + ' --device Use "phone" or "tablet" to simulate a mobile device (by user-agent and viewport size).', ' --screenshot Will take a screenshot and use this value as the output path. It needs to end with ".png".', ' --js-deep-analysis When activated, the javascriptExecutionTree will contain sub-requests.', '' @@ -50,6 +51,9 @@ if (cli.flags.jsDeepAnalysis === true || cli.flags.jsDeepAnalysis === 'true') { options.jsDeepAnalysis = true; } +// Device simulation +options.device = cli.flags.device || 'desktop'; + (function execute(url, options) { 'use strict'; diff --git a/bower.json b/bower.json index 7893e0f..8d7a996 100644 --- a/bower.json +++ b/bower.json @@ -5,7 +5,8 @@ "angular-route": "~1.3.14", "angular-resource": "~1.3.14", "angular-sanitize": "~1.3.14", - "angular-animate": "~1.3.14" + "angular-animate": "~1.3.14", + "angular-local-storage": "~0.1.5" }, "resolutions": { "angular": "~1.3.8" diff --git a/front/src/css/dashboard.css b/front/src/css/dashboard.css index 41e9467..ca1c26f 100644 --- a/front/src/css/dashboard.css +++ b/front/src/css/dashboard.css @@ -46,6 +46,14 @@ content: "+"; opacity: 0.85; } +.summary .globalScore .screenshotWrapper.phone:hover:after { + top: 1.7em; + left: 0.64em; +} +.summary .globalScore .screenshotWrapper.tablet:hover:after { + top: 1.5em; + left: 0.9em; +} .summary .notations { display: table; width: 80%; diff --git a/front/src/css/icons.css b/front/src/css/icons.css index ac51e0c..fc67b26 100644 --- a/front/src/css/icons.css +++ b/front/src/css/icons.css @@ -1,6 +1,67 @@ @font-face { - font-family: "fontsmith-icons"; - src: url("/fonts/icons.woff") format("woff"); + font-family: "icons"; + src: url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"); font-weight: normal; font-style: normal; } +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "icons"; + display: inline-block; + vertical-align: middle; + line-height: 1; + font-weight: normal; + font-style: normal; + speak: none; + text-decoration: inherit; + text-transform: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-arrow-left3:before, +.icon-bars:before, +.icon-lab:before, +.icon-list:before, +.icon-loop:before, +.icon-mobile:before, +.icon-question:before, +.icon-screen:before, +.icon-tablet:before, +.icon-warning:before { + font-family: "icons"; + display: inline-block; + font-weight: normal; + font-style: normal; + text-decoration: inherit; +} +.icon-arrow-left3:before { + content: "\f101"; +} +.icon-bars:before { + content: "\f102"; +} +.icon-lab:before { + content: "\f103"; +} +.icon-list:before { + content: "\f104"; +} +.icon-loop:before { + content: "\f105"; +} +.icon-mobile:before { + content: "\f106"; +} +.icon-question:before { + content: "\f107"; +} +.icon-screen:before { + content: "\f108"; +} +.icon-tablet:before { + content: "\f109"; +} +.icon-warning:before { + content: "\f10a"; +} diff --git a/front/src/css/index.css b/front/src/css/index.css index e091604..3548240 100644 --- a/front/src/css/index.css +++ b/front/src/css/index.css @@ -16,9 +16,43 @@ background: #e74c3c; color: #fff; } +.launchBtn:focus { + background: #ffa319; +} .launchBtn.disabled { background: #deaca6; } +.launchBtn.disabled:focus { + color: #ddd; +} +.device { + margin-top: 3em; +} +.device .item { + display: inline-block; + margin: 1em 0.75em; + width: 5.5em; + height: 5.5em; + color: #FFF; + border: 1px solid #FFF; + padding: 1px; + border-radius: 0.5em; + cursor: pointer; + text-decoration: none; + font-size: 0.8em; +} +.device .item.active { + color: #ffa319; + border: 2px solid #ffa319; + padding: 0; +} +.device .item:hover { + color: #ffa319; +} +.device .item > div { + margin: 0.2em 0 0.1em; + font-size: 3em; +} .features { display: table; width: 50%; diff --git a/front/src/css/main.css b/front/src/css/main.css index dea34f0..1414359 100644 --- a/front/src/css/main.css +++ b/front/src/css/main.css @@ -1,9 +1,70 @@ @font-face { - font-family: "fontsmith-icons"; - src: url("/fonts/icons.woff") format("woff"); + font-family: "icons"; + src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABFMAA4AAAAAKwwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEMAAABWQLtM2mNtYXAAAAGIAAAAOgAAAUriHBC2Y3Z0IAAAAcQAAAAUAAAAIv+YA5pmcGdtAAAB2AAABacAAAuX2BTb8Gdhc3AAAAeAAAAACAAAAAgAAAAQZ2x5ZgAAB4gAAAchAAAY9mB1RqxoZWFkAAAOrAAAADIAAAA2A+bhlGhoZWEAAA7gAAAAIAAAACQD/QHAaG10eAAADwAAAAAPAAAALBYAAABsb2NhAAAPEAAAABgAAAAYH8gj5W1heHAAAA8oAAAAIAAAACACfQyHbmFtZQAAD0gAAAEdAAAB8hTbwvhwb3N0AAAQaAAAAGIAAAB/4g/aQ3ByZXAAABDMAAAAfQAAAIqMht7EeJxjYGRiYJzAwMrAwejCmMbAwOAOpb8ySDK0MDAwMbAyM2AFAWmuKQwOHxk/cjEe+H+AQY/xIIMDUJgRJAcAixQLGgB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGD5y/f8PUvCREUTzM0DVAwEjG8OIBwB5MwbBAAB4nGNgwAA8EMh48P8BEAYAFnAFM3icrVb5c9NGFJZ8JE5CjpKDFvVYsXGa2iuTUggGTAiSZRfcw7laCUorxU56H9Ayw9/gv+bJtDP0N/60fm9lm0CSdoZpJqP37e6nffeTyVCCjL3AD4VoPTNmtlo0tnMvoMsWrYbRoejtBZQpxn8XjILR6ch9y7bJCMnwZL1vmIYXuQ6ZikR06FBGia6g523Krdzrr5qTnt/xt+8HtrStXiCo3Q5s2gwtQVVG1TAUSUqKu7SKrcFK0BqfrzHzeTsQMKIXC5psBxF2BJ9NMlpntB5ZURiGFpnlMJRktIODMHQoqwTuyRVjGJT32gHlpUtj0oX5IZmRQzklYZfoJvl9V/BJqpyfOPc7lC3Z2PdET/Rwd7KWL8KtrSBqW/F2GMgQp5s7AY4sdmqg2aG8onGv3DcyaWjGsJSuRIilG1Nm/5DMDu6nfMmhcSXYyCmv8yxn7Au+gTajkClRXRtZUP3xKcPz3ZI9CvaEejn4k+ktZhkmePA4En5PxpwIHSnD4miSsGDk0ErKFmVcT1VMnfI6LeMtw3rh2tGXzijtUH9qMusHtiXtsGQ7NK2STManblx3aEaBKASd8e7y6wDSDWmaV9tYTWPl0CyumdMhEYhAB3ppxotELxI0g6A5NKdau0GS69bDZZo+kE8cekO1toLWTrpp2dif1/tnVWLMentBMjuL/MUuzZa5SFG6bnKGH9N4kLmETGSL7SDh4MFbt4f0stqSLfHaEFvpOb+C2uedEJ40YX8Tuy+n6pQEJoYxLxEtj4yNvmmaOlfzykiMjL8b0Kx0hU9TKMpJKI5cEUH9X3NzpjFjuG4vSs6Olelx2bqAMC3At/myQ4sqMVkuIc4sz6kky/JNleRYvqWSPMvzKhljaalknOXbKimwfEclEyw/UKJC5gOHSho8dKiswSOH3lUGTZdfw8b3YOO7uFvARpY2bGR5ATaylLCR5TJsZFmEjSxXYCPL92Ejy1XYyFIpUdOl5iionYuExyZ4Oh1oH8X1VlHklMlBJ11EETfFKZmQcVXyGPtXBkrJobVReswlulhK8uaiH2AMsYMfHo3M8eNLSlzR9n4EnukfV4IOO1E57xtLfxr8V9+Q1eSSuQiPLsN/GHyyvSjsuOrQFVU5V3No/b+oKMIO6FeREmOpKCqiyc2LUN7p9ZqyiW4PMNYxFtHR66a5uAD9VUyZJTQI/jWFJrzyQa8ihaj1cNe1F8eikt5BOdwJlqCI+31zK3iaEVlhPc2sZM+HLs/AAqap1GzZQPd5r7ZSxHMoHfYZL+pKynpxF8cZL7aAI55Br74TwyQMZtlADiU0NOAXhNaC+05QItNpl0ODI/Z5FFT+2K24kT0qaiPwbKdT7oUupPw6x0BgJ78yiIGsITQ39DYV0DxCNGSTlXG2ajpk7MAgosZuUBE1fBvZ4sGmYFuGIR8rYnXn6Nc3TdRJFTzIjOQyvjmwwBumJuLP86suDlO5oaSocNQaGMy1sJJUzAU04K3Rdvvo9ubL7BM5txVVyyde6iq6Vu5BMRcLrD3OQVoqVAHVG1XYMLpcXBKlXkGTpNfVMTQww1+jFJv/V/Wx+TxfahIj5Ei+7XBgo8/BGPrfYP9tOQjAwI+Ry024vJg2J77u6MP5Cl1GL358yv4dzFxzYZ6uAN9VdBWixVHzEVfRwKdsGKdPFJcjtQA/VX3MGYDPAEwGn6u+qXfaAHpnizk+wDZzGOwwh8EucxjsMec2wBfMYfAlcxgEzGEQMscDuMccBveZw+Ar5jB4wJwGwNfMYfANcxhEzGEQM8cF2GcOgw5zGHSZw+BA0fVRmA95QRtA32p0C+g7XU9YbGLxvaIbI/YPvNDsHzVi9k8aMfVnRbUR9RdeaOqvGjH1N42Y+lDRzRH1ES809XeNmPqHRkx9rJ5O5DLDH09umQoHlF1uPxl+U5x/ACtxTWMAAAEAAf//AA94nM1YS28b1xU+Z4YPkRKH4vAl8TGcB1/imxw+9DI1rmzrMaRkW7QslVLKsYtYgOFCKIJsyy6LLuKi6KIb15uiQaCFgeQHsED+RTbaZNF1N20Xw97ho3GCQo6jcWIN773iLHSO7r3fd77vgAAwHFCAA0CgwQp2cMAsuMANHvCCH4KwCGGIQgwEkCABKViCLOShCGWQoQYNWIE12IIDeIr/VF9l7x4pn6aQFiiBPoNQmOdDZwAg0CA8BiqNVgtl1US0LKHdZrFrYMugY8bm0GAmi7POmVkNnDl0zTldmoRzeXQzc24NmHiB8swznscwX0QvO+/VgC2h38f6NfCVMRjwBTUIJCrU4kJg8TEsyBgOLYS1OvJVjEb46KMkInLdGnKcS4VIJNaFWIyJtcLKZ5NUqXMj13CIP39vkz1W/rizfWN9dXV5uV6vViuVUqlQyOUymXQ6mYzHRZHnOe7Jh496p92Hh/vt7YOdg82b61s3tlbXVtfWVpdXlldWluuNeqNRr9aqtVq1IldkuVIql8rlUqFYKBYLuXwun89lsplsNpNeSi8tpZOpZCqVjCfiiURclERJEnmBFwSei3GxGNew+bJez1UPCtYrHuQwyKC9gKkmepvYIL+QrxymGvVKwOdGmcy2rLFlNrGIySr/7R+dp0CHHzaG8Ow5TT9/Np6PPqaoj49G80bfGfI6dj9nWJb5fNfhDTn7Dhz80DA64OW3k8bL/0V99lyXp2HJ/HXfiLbDRtgdIwWSB7mLBHNm4HMDNglGVdgHuM6BJQS/0JD90nR4ZY9k4qGMh6IovenHzJ1XlEHv8rLfR0UfAPCm7OsBHGNFGR49aN2wzNhxN44IFI2UlkAaLFbaoiXRCja71aal0A4zDvuMlkYHOGcdTm0JZ2HONTunZdAFjNvFaFl0w7zHPa/l0AOs18NqspSnveDze31aAf0QCPoDWhGDsLAYXNBKuEhoazGklTEMkWg4ook8RwOMKMOlVjAaFbogCIzQ6nSuJo7Ocef44eH9fXXnzqbSfEvKUApvQRrVa5JGiq7JlXo1mUXR5gusoZ+2BYJCExONmuwPmngbxRfzdofD/tKY5l+E4zVUanG9/0R5Yuat3EP7UwfjIJ+n+r+LTcTmby8++ugC4ibj/uB6yEcD8QT99u+spqK/3x8Y4Bx8ZzWXfvs9pTcZBr+awwMtOMV/KfwO2qybP6Ocju7PKZ/3Li4EOxhatO62kNs+QGlLfeUj+ugFWGgrZTkjZEFR+CCGFGELC0X/f67g8XuThZin3swVslCmJ2xB/n2uC4bOMKhC6oIkMRJRRX8xEqQt1vP3NMNj5fd77av57Ojw/r326d6purt1+6357EdkM7qAEtE8QaJ+KoGgXa6hmEw1JH+DQ5m8I3rIRISp0mmt85voeuAXG+nb4e3BEEbLN69NRdqfpDR2d4PLt5ALbQ90xZjV6TsQTcGdwWxHcHI9bqONE/AQLWrsuKeABrd5xWTVEKG2huAxk+SeX/rCiGHfePmy31eI0Iyw7K+HZB/MJToSRe+No+FLXzg4r28bkSJsDwnzmbP/G+QETuCMciqz2+i6he4t9NA76qs0obnP0khLlDSygfG4YQMbKNEgEWu1NLZWYMmMnVWdp4jOn3grMUdNzFV+bK5grjD1VkU0rJUG80KJmnir8thbceirTM1VTB6ZKw0WqmNzBaR4RyPx6KMU8VaJ7jImEiNvlexCMskkCeVdTJIdGcF4OBQ/f4/TPVb+/MFpu3VTuZoDf/no9OyDswed1kn7ZHfnzm1FvaluNImFfGdsuHJNNkwYyKsEomiXao0aGSJD+Tiq0qSqBSr1mls0U3ZcKkqfYYkieNnLqOux2LraGS+Z1yyimdDsK8izTE/hyXP3m3DGUnrNHJqlTQz9dy1+rHkEDzkYv0BOhDaXDnW47CH0LrGv9031esYfHNGgMgQwp8elQgeO8B9jcvsrRISoEDkjsoTnox8SoSShqcYvj28WSmKZCoMQCQuPRzpJHrWMqgQcsZNpg+tv4zyj50aiQpT/1Xua6bHySbvVfEN36+jh4YN7d1uddufO5rraVN8dkdWuK+uEiaQQxpKCfkdy4lwfTCq8Mlq/sBtO0vE7/RL5d6omdM/YtJawT7TE8D8EXzb8+7Xw1SQIa8MhrivDzj3KhTsASaQpoDWgUtMKnJ62Ypem9TczbsXWJcqZnRbg3LQA56cFOF6YFuDitBdbE0v0qAILGCjjpAJXxhWYw5BMSnAoSlCCGOtW0WiokBLMd4HnGb61v9dqKRtXX9eD+3uH+4etdqvdbm3d2lAVtXnje11ZZfmnacfSAl0JegM2u1DAhrdOy6lKwG+XUtW6iVd2CBd4dOFxfTXHhvS9EDv3lcut8AzrzDlZU6/sH/RPcBDQW0EOkQviFwG9PyBlt8ew8F84EQnlAAAAeJxjYGRgYADiY+sccuL5bb4ycDMxgMDF5OuTIfTJ5v+//h9gYmM8CORyMIClAWd/DXkAAHicY2BkYGA88P8Agx4TAwPD/y9MPAxAERTADQB7bQS/eJxjYmBgYCISAwACPAAXAAAAAAAB0AJ8A8wEgAY8BvwIzglyCyIMewABAAAACwBsACQAAAAAAAIAcgCCAHcAAAFkC5cAAAAAeJxdjr1OwzAUhU/6h2gQAiExm6ULUvoz9gHamQ7Z08RJWyVx5LiVKjEz8xTMPAXPxYl7JSps6fo75x5fG8ADfhCgWwGGvnarhxuqC/dJd8ID8qPwECGehUdUL8JjvGIiHOIJb5wQDG7pjJEJ93CPWrhP/114QP4QHnL6p/CI/pfwGDG+hUNMgtE+NXW70cWxTKxnX2Jt272p1Tyaeb3WtbaJ05nanlV7KhbO5Sq3plIrUztdlkY11hx06qKdc81yOs3Fj1JTYY8Uhn9usYFGgSNKJLBX/h/FTFjvdFphjgizq/6a/dpnEjieGTNbnFlbnDh7Qdchp86ZMahIK3+3S5fchk7jewc6Kf0IO3+rwRJT7vxfPvKvV78w9VNiAAAAeJxtwUEOwjAMBEBvm6YteQsnXuQgU0UyMThG/T4HrszQRD8L/VeIMGFGwoKMFRt2XFAKu9t5VXnELVX2MSvXpG1EUrNXflptKtv7IyOa9TzuLtJzcFWJ9WTvrR9EX5XIGP4AAHicY/DewXAiKGIjI2Nf5AbGnRwMHAzJBRsZ2Jw2MTAyaIEYm7mZGDkgLH4GMIvdaRczA1CaE8jmcNrF4ABhMzO4bFRh7AiM2ODQEbGROcVloxqIt4ujgYGRxaEjOSQCpCQSCDbzMjHyaO1g/N+6gaV3IxNQH2uKCwBlrSSbAAAA") format("woff"); font-weight: normal; font-style: normal; } +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "icons"; + display: inline-block; + vertical-align: middle; + line-height: 1; + font-weight: normal; + font-style: normal; + speak: none; + text-decoration: inherit; + text-transform: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-arrow-left3:before, +.icon-bars:before, +.icon-lab:before, +.icon-list:before, +.icon-loop:before, +.icon-mobile:before, +.icon-question:before, +.icon-screen:before, +.icon-tablet:before, +.icon-warning:before { + font-family: "icons"; + display: inline-block; + font-weight: normal; + font-style: normal; + text-decoration: inherit; +} +.icon-arrow-left3:before { + content: "\f101"; +} +.icon-bars:before { + content: "\f102"; +} +.icon-lab:before { + content: "\f103"; +} +.icon-list:before { + content: "\f104"; +} +.icon-loop:before { + content: "\f105"; +} +.icon-mobile:before { + content: "\f106"; +} +.icon-question:before { + content: "\f107"; +} +.icon-screen:before { + content: "\f108"; +} +.icon-tablet:before { + content: "\f109"; +} +.icon-warning:before { + content: "\f10a"; +} html { margin: 100px 50px; } @@ -125,11 +186,20 @@ a.linkButton { color: #fff; text-decoration: none; } -.screenshotWrapper.desktop { +.screenshotWrapper { display: inline-block; position: relative; - border: 0.2em solid #AAA; background: #000; +} +.screenshotWrapper > div { + overflow: scroll; + position: relative; +} +.screenshotWrapper .screenshotImage { + width: 100%; +} +.screenshotWrapper.desktop { + border: 0.2em solid #AAA; padding: 0.5em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; @@ -157,11 +227,54 @@ a.linkButton { .screenshotWrapper.desktop > div { width: 12em; height: 6.75em; - overflow: scroll; - position: relative; } -.screenshotWrapper.desktop .screenshotImage { - width: 100%; +.screenshotWrapper.phone { + border: 0.07em solid #CCC; + padding: 1em 0.3em 1.5em; + border-radius: 0.6em; +} +.screenshotWrapper.phone:before { + position: absolute; + width: 0.8em; + height: 0.8em; + bottom: 0.3em; + left: 3.3em; + border: 0.07em solid #CCC; + border-radius: 0.5em; + content: " "; +} +.screenshotWrapper.phone:after { + position: absolute; + width: 1em; + height: 0.1em; + bottom: 13.9em; + left: 3.2em; + background: #555; + border-radius: 0.05em; + content: " "; +} +.screenshotWrapper.phone > div { + width: 6.75em; + height: 12em; +} +.screenshotWrapper.tablet { + border: 0.07em solid #CCC; + padding: 0.8em 0.5em 0.9em; + border-radius: 0.6em; +} +.screenshotWrapper.tablet:before { + position: absolute; + width: 0.5em; + height: 0.5em; + bottom: 0.15em; + left: 4.35em; + border: 0.07em solid #CCC; + border-radius: 0.4em; + content: " "; +} +.screenshotWrapper.tablet > div { + width: 8.25em; + height: 11em; } .star { font-weight: bold; @@ -179,95 +292,3 @@ a.linkButton { .footer .version { font-size: 0.7em; } -/* Icons */ -.icon-lab { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-lab:before { - content: "\e004"; -} -.icon-question { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-question:before { - content: "\e001"; -} -.icon-warning { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-warning:before { - content: "\e000"; -} -.icon-back { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-back:before { - content: "\e006"; -} -.icon-summary { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-summary:before { - content: "\e003"; -} -.icon-spaghetti { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-spaghetti:before { - content: "\e005"; -} -.icon-loop { - font-family: "fontsmith-icons"; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} -.icon-loop:before { - content: "\e002"; -} diff --git a/front/src/fonts/icons.woff b/front/src/fonts/icons.woff deleted file mode 100644 index 9611c2f..0000000 Binary files a/front/src/fonts/icons.woff and /dev/null differ diff --git a/front/src/fonts/svg-icons/arrow-left3.svg b/front/src/fonts/svg-icons/arrow-left3.svg index d96cc70..71c9b9d 100644 --- a/front/src/fonts/svg-icons/arrow-left3.svg +++ b/front/src/fonts/svg-icons/arrow-left3.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/bars.svg b/front/src/fonts/svg-icons/bars.svg index 2e7adca..f491fb9 100644 --- a/front/src/fonts/svg-icons/bars.svg +++ b/front/src/fonts/svg-icons/bars.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/lab.svg b/front/src/fonts/svg-icons/lab.svg index 28b3aa8..ab42c55 100644 --- a/front/src/fonts/svg-icons/lab.svg +++ b/front/src/fonts/svg-icons/lab.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/list.svg b/front/src/fonts/svg-icons/list.svg index 403a80a..da0a00b 100644 --- a/front/src/fonts/svg-icons/list.svg +++ b/front/src/fonts/svg-icons/list.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/loop.svg b/front/src/fonts/svg-icons/loop.svg index 11e65f9..17a0bba 100755 --- a/front/src/fonts/svg-icons/loop.svg +++ b/front/src/fonts/svg-icons/loop.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/mobile.svg b/front/src/fonts/svg-icons/mobile.svg new file mode 100755 index 0000000..5136a81 --- /dev/null +++ b/front/src/fonts/svg-icons/mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/question.svg b/front/src/fonts/svg-icons/question.svg index 49e9fc3..7f447ee 100644 --- a/front/src/fonts/svg-icons/question.svg +++ b/front/src/fonts/svg-icons/question.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/screen.svg b/front/src/fonts/svg-icons/screen.svg new file mode 100755 index 0000000..eb2048c --- /dev/null +++ b/front/src/fonts/svg-icons/screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/tablet.svg b/front/src/fonts/svg-icons/tablet.svg new file mode 100755 index 0000000..45f83ab --- /dev/null +++ b/front/src/fonts/svg-icons/tablet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front/src/fonts/svg-icons/warning.svg b/front/src/fonts/svg-icons/warning.svg index 85f8300..6cfed51 100644 --- a/front/src/fonts/svg-icons/warning.svg +++ b/front/src/fonts/svg-icons/warning.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/front/src/js/app.js b/front/src/js/app.js index a17c4f7..6a229fb 100644 --- a/front/src/js/app.js +++ b/front/src/js/app.js @@ -12,8 +12,10 @@ var yltApp = angular.module('YellowLabTools', [ 'resultsFactory', 'apiService', 'menuService', + 'settingsService', 'gradeDirective', - 'offendersDirectives' + 'offendersDirectives', + 'LocalStorageModule' ]); yltApp.run(['$rootScope', '$location', function($rootScope, $location) { diff --git a/front/src/js/controllers/dashboardCtrl.js b/front/src/js/controllers/dashboardCtrl.js index e688634..a07d1e6 100644 --- a/front/src/js/controllers/dashboardCtrl.js +++ b/front/src/js/controllers/dashboardCtrl.js @@ -34,7 +34,7 @@ dashboardCtrl.controller('DashboardCtrl', ['$scope', '$rootScope', '$routeParams }; $scope.testAgain = function() { - API.launchTest($scope.result.params.url); + API.relaunchTest($scope.result); }; /// When comming from a social shared link, the user needs to click on "See full report" button to display the full dashboard. diff --git a/front/src/js/controllers/indexCtrl.js b/front/src/js/controllers/indexCtrl.js index f9426fa..230bac7 100644 --- a/front/src/js/controllers/indexCtrl.js +++ b/front/src/js/controllers/indexCtrl.js @@ -1,9 +1,14 @@ var indexCtrl = angular.module('indexCtrl', []); -indexCtrl.controller('IndexCtrl', ['$scope', '$location', 'API', function($scope, $location, API) { +indexCtrl.controller('IndexCtrl', ['$scope', 'Settings', 'API', function($scope, Settings, API) { + + $scope.settings = Settings.getMergedSettings(); + console.log($scope.settings); + $scope.launchTest = function() { if ($scope.url) { - API.launchTest($scope.url); + Settings.saveSettings($scope.settings); + API.launchTest($scope.url, $scope.settings); } }; }]); \ No newline at end of file diff --git a/front/src/js/controllers/ruleCtrl.js b/front/src/js/controllers/ruleCtrl.js index d5aec07..12d97bc 100644 --- a/front/src/js/controllers/ruleCtrl.js +++ b/front/src/js/controllers/ruleCtrl.js @@ -29,7 +29,7 @@ ruleCtrl.controller('RuleCtrl', ['$scope', '$rootScope', '$routeParams', '$locat }; $scope.testAgain = function() { - API.launchTest($scope.result.params.url); + API.relaunchTest($scope.result); }; loadResults(); diff --git a/front/src/js/controllers/screenshotCtrl.js b/front/src/js/controllers/screenshotCtrl.js index 1120d9c..0d2b60d 100644 --- a/front/src/js/controllers/screenshotCtrl.js +++ b/front/src/js/controllers/screenshotCtrl.js @@ -10,7 +10,6 @@ screenshotCtrl.controller('ScreenshotCtrl', ['$scope', '$rootScope', '$routePara Results.get({runId: $routeParams.runId}, function(result) { $rootScope.loadedResult = result; $scope.result = result; - init(); }, function(err) { $scope.error = true; }); @@ -24,7 +23,7 @@ screenshotCtrl.controller('ScreenshotCtrl', ['$scope', '$rootScope', '$routePara }; $scope.testAgain = function() { - API.launchTest($scope.result.params.url); + API.relaunchTest($scope.result); }; loadResults(); diff --git a/front/src/js/controllers/timelineCtrl.js b/front/src/js/controllers/timelineCtrl.js index 8f0e83d..799da5a 100644 --- a/front/src/js/controllers/timelineCtrl.js +++ b/front/src/js/controllers/timelineCtrl.js @@ -141,7 +141,7 @@ timelineCtrl.controller('TimelineCtrl', ['$scope', '$rootScope', '$routeParams', }; $scope.testAgain = function() { - API.launchTest($scope.result.params.url); + API.relaunchTest($scope.result); }; loadResults(); diff --git a/front/src/js/services/apiService.js b/front/src/js/services/apiService.js index 28b4db1..4aa145f 100644 --- a/front/src/js/services/apiService.js +++ b/front/src/js/services/apiService.js @@ -4,12 +4,13 @@ apiService.factory('API', ['$location', 'Runs', 'Results', function($location, R return { - launchTest: function(url) { + launchTest: function(url, settings) { Runs.save({ url: url, waitForResponse: false, screenshot: true, - jsTimeline: true + jsTimeline: true, + device: settings.device }, function(data) { $location.path('/queue/' + data.runId); }, function(response) { @@ -19,9 +20,11 @@ apiService.factory('API', ['$location', 'Runs', 'Results', function($location, R alert('An error occured...'); } }); + }, + + relaunchTest: function(result) { + this.launchTest(result.params.url, result.params.options); } - - }; }]); \ No newline at end of file diff --git a/front/src/js/services/settingsService.js b/front/src/js/services/settingsService.js new file mode 100644 index 0000000..6ecad61 --- /dev/null +++ b/front/src/js/services/settingsService.js @@ -0,0 +1,23 @@ +var settingsService = angular.module('settingsService', []); + +settingsService.factory('Settings', ['localStorageService', function(localStorageService) { + + return { + + getMergedSettings: function() { + var defaultSettings = { + device: 'desktop' + }; + + var savedValues = localStorageService.get('settings'); + + return angular.extend(defaultSettings, savedValues); + }, + + saveSettings: function(settings) { + localStorageService.set('settings', settings); + } + + }; + +}]); \ No newline at end of file diff --git a/front/src/less/dashboard.less b/front/src/less/dashboard.less index 379babd..1eeaaa5 100644 --- a/front/src/less/dashboard.less +++ b/front/src/less/dashboard.less @@ -51,6 +51,16 @@ opacity: 0.85; } } + + .screenshotWrapper.phone:hover:after { + top: 1.7em; + left: 0.64em; + } + + .screenshotWrapper.tablet:hover:after { + top: 1.5em; + left: 0.9em; + } } .summary .notations { diff --git a/front/src/less/icons.less b/front/src/less/icons.less index 7603317..860ed7d 100644 --- a/front/src/less/icons.less +++ b/front/src/less/icons.less @@ -1,56 +1,132 @@ -@warning-font-family: "fontsmith-icons"; -@warning-value: "\e000"; -@warning: '"fontsmith-icons"' '"\\e000"'; -@question-font-family: "fontsmith-icons"; -@question-value: "\e001"; -@question: '"fontsmith-icons"' '"\\e001"'; -@lab-font-family: "fontsmith-icons"; -@lab-value: "\e004"; -@lab: '"fontsmith-icons"' '"\\e004"'; -@list-font-family: "fontsmith-icons"; -@list-value: "\e003"; -@list: '"fontsmith-icons"' '"\\e003"'; -@bars-font-family: "fontsmith-icons"; -@bars-value: "\e005"; -@bars: '"fontsmith-icons"' '"\\e005"'; -@arrow-left3-font-family: "fontsmith-icons"; -@arrow-left3-value: "\e006"; -@arrow-left3: '"fontsmith-icons"' '"\\e006"'; -@loop-font-family: "fontsmith-icons"; -@loop-value: "\e002"; -@loop: '"fontsmith-icons"' '"\\e002"'; +// Generated by grunt-webfont +// Based on https://github.com/endtwist/fontcustom/blob/master/lib/fontcustom/templates/fontcustom.css -.icon-font-family(@char) { - font-family: ~`@{char}[0]`; -} - -.icon-font() { - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; -} - -.icon-content(@char) { - content: ~`@{char}[1]`; -} - -.icon(@char) { - .icon-font-family(@char); - .icon-font(); - - &:before { - .icon-content(@char); - } -} @font-face { - font-family: "fontsmith-icons"; - src:url("/fonts/icons.woff") format("woff"), - ; - font-weight: normal; - font-style: normal; -} \ No newline at end of file + font-family:"icons"; + src:url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"); + font-weight:normal; + font-style:normal; +} + + +// Bootstrap Overrides +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family:"icons"; + display:inline-block; + vertical-align:middle; + line-height:1; + font-weight:normal; + font-style:normal; + speak:none; + text-decoration:inherit; + text-transform:none; + text-rendering:optimizeLegibility; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale; +} + +// Mixins + +.icon-arrow-left3, +.icon-bars, +.icon-lab, +.icon-list, +.icon-loop, +.icon-mobile, +.icon-question, +.icon-screen, +.icon-tablet, +.icon-warning { + &:before { + font-family:"icons"; + display:inline-block; + font-weight:normal; + font-style:normal; + text-decoration:inherit; + } +} + + +// Icons + +.icon-arrow-left3 { + &:before { + content:"\f101"; + } + +} + + +.icon-bars { + &:before { + content:"\f102"; + } + +} + + +.icon-lab { + &:before { + content:"\f103"; + } + +} + + +.icon-list { + &:before { + content:"\f104"; + } + +} + + +.icon-loop { + &:before { + content:"\f105"; + } + +} + + +.icon-mobile { + &:before { + content:"\f106"; + } + +} + + +.icon-question { + &:before { + content:"\f107"; + } + +} + + +.icon-screen { + &:before { + content:"\f108"; + } + +} + + +.icon-tablet { + &:before { + content:"\f109"; + } + +} + + +.icon-warning { + &:before { + content:"\f10a"; + } + +} + diff --git a/front/src/less/index.less b/front/src/less/index.less index 5c4ae7d..553b4e5 100644 --- a/front/src/less/index.less +++ b/front/src/less/index.less @@ -18,8 +18,47 @@ .launchBtn { background: #e74c3c; color: #fff; + &:focus { + background: #ffa319; + } &.disabled { background: #deaca6; + &:focus { + color: #ddd; + } + } + +} + +.device { + margin-top: 3em; + .item { + display: inline-block; + margin: 1em 0.75em; + width: 5.5em; + height: 5.5em; + color: #FFF; + border: 1px solid #FFF; + padding: 1px; + border-radius: 0.5em; + cursor: pointer; + text-decoration: none; + font-size: 0.8em; + + &.active { + color: #ffa319; + border: 2px solid #ffa319; + padding: 0; + } + + &:hover { + color: #ffa319; + } + + > div { + margin: 0.2em 0 0.1em; + font-size: 3em; + } } } diff --git a/front/src/less/main.less b/front/src/less/main.less index a22bb81..135a7b0 100644 --- a/front/src/less/main.less +++ b/front/src/less/main.less @@ -126,11 +126,23 @@ a.linkButton { } -.screenshotWrapper.desktop { +.screenshotWrapper { display: inline-block; position: relative; - border: 0.2em solid #AAA; background: #000; + + > div { + overflow: scroll; + position: relative; + } + + .screenshotImage { + width: 100%; + } +} + +.screenshotWrapper.desktop { + border: 0.2em solid #AAA; padding: 0.5em; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; @@ -160,12 +172,61 @@ a.linkButton { > div { width: 12em; height: 6.75em; - overflow: scroll; - position: relative; + } +} + +.screenshotWrapper.phone { + border: 0.07em solid #CCC; + padding: 1em 0.3em 1.5em; + border-radius: 0.6em; + + &:before { + position: absolute; + width: 0.8em; + height: 0.8em; + bottom: 0.3em; + left: 3.3em; + border: 0.07em solid #CCC; + border-radius: 0.5em; + content: " "; } - .screenshotImage { - width: 100%; + &:after { + position: absolute; + width: 1em; + height: 0.1em; + bottom: 13.9em; + left: 3.2em; + background: #555; + border-radius: 0.05em; + content: " "; + } + + > div { + width: 6.75em; + height: 12em; + } +} + +.screenshotWrapper.tablet { + border: 0.07em solid #CCC; + padding: 0.8em 0.5em 0.9em; + border-radius: 0.6em; + + &:before { + position: absolute; + width: 0.5em; + height: 0.5em; + bottom: 0.15em; + left: 4.35em; + border: 0.07em solid #CCC; + border-radius: 0.4em; + content: " "; + } + + > div { + width: 8.25em; + height: 11em; } } @@ -186,27 +247,4 @@ a.linkButton { .version { font-size: 0.7em; } -} - -/* Icons */ -.icon-lab { - .icon(@lab); -} -.icon-question { - .icon(@question); -} -.icon-warning { - .icon(@warning); -} -.icon-back { - .icon(@arrow-left3); -} -.icon-summary { - .icon(@list); -} -.icon-spaghetti { - .icon(@bars); -} -.icon-loop { - .icon(@loop); } \ No newline at end of file diff --git a/front/src/main.html b/front/src/main.html index 6ce0d14..357cce5 100644 --- a/front/src/main.html +++ b/front/src/main.html @@ -24,6 +24,7 @@ + @@ -35,6 +36,8 @@ + + diff --git a/front/src/views/dashboard.html b/front/src/views/dashboard.html index bfa7d8d..cdd8a7f 100644 --- a/front/src/views/dashboard.html +++ b/front/src/views/dashboard.html @@ -11,7 +11,7 @@
-
+
diff --git a/front/src/views/index.html b/front/src/views/index.html index 0a3e488..02caf53 100644 --- a/front/src/views/index.html +++ b/front/src/views/index.html @@ -4,6 +4,14 @@
+
+
+
Choose the simulated device:
+
Desktop
+
Tablet
+
Phone
+
+
diff --git a/front/src/views/resultSubHeader.html b/front/src/views/resultSubHeader.html index af20dd5..d004253 100644 --- a/front/src/views/resultSubHeader.html +++ b/front/src/views/resultSubHeader.html @@ -1,8 +1,8 @@
-
New test
+
New test
Test again
- - + +
\ No newline at end of file diff --git a/front/src/views/screenshot.html b/front/src/views/screenshot.html index 558846b..31a4b67 100644 --- a/front/src/views/screenshot.html +++ b/front/src/views/screenshot.html @@ -2,7 +2,7 @@

Screenshot

-
+
diff --git a/lib/server/controllers/apiController.js b/lib/server/controllers/apiController.js index 3c0462c..657aba5 100644 --- a/lib/server/controllers/apiController.js +++ b/lib/server/controllers/apiController.js @@ -33,7 +33,8 @@ var ApiController = function(app) { waitForResponse: req.body.waitForResponse !== false && req.body.waitForResponse !== 'false' && req.body.waitForResponse !== 0, partialResult: req.body.partialResult || null, screenshot: req.body.screenshot || false, - jsTimeline: req.body.jsTimeline || false + jsTimeline: req.body.jsTimeline || false, + device: req.body.device || 'desktop' } }; @@ -66,7 +67,8 @@ var ApiController = function(app) { var runOptions = { screenshot: run.params.screenshot ? screenshot.getTmpFilePath() : false, - jsDeepAnalysis: run.params.jsTimeline + jsDeepAnalysis: run.params.jsTimeline, + device: run.params.device }; return ylt(run.params.url, runOptions); diff --git a/lib/tools/phantomas/phantomasWrapper.js b/lib/tools/phantomas/phantomasWrapper.js index 3e84138..f9b78c2 100644 --- a/lib/tools/phantomas/phantomasWrapper.js +++ b/lib/tools/phantomas/phantomasWrapper.js @@ -11,11 +11,6 @@ var PhantomasWrapper = function() { /** * This is the phantomas launcher. It merges user chosen options into the default options - * Available options : - * - * - timeout : in seconds (default 60) - * - jsDeepAnalysis : should we inspect subrequests in the javascript execution tree? - * */ this.execute = function(data) { @@ -27,7 +22,9 @@ var PhantomasWrapper = function() { // Cusomizable options 'timeout': task.options.timeout || 60, 'js-deep-analysis': task.options.jsDeepAnalysis || false, - 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36', + 'user-agent': (task.options.device === 'desktop') ? 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36' : null, + 'tablet': (task.options.device === 'tablet'), + 'phone': (task.options.device === 'phone'), 'screenshot': task.options.screenshot || false, // Mandatory @@ -64,7 +61,13 @@ var PhantomasWrapper = function() { value = '"' + value + '"'; } - optionsString += ' ' + '--' + opt + '=' + value; + if (value === true) { + optionsString += ' ' + '--' + opt; + } else if (value === false || value === null) { + // Nothing + } else { + optionsString += ' ' + '--' + opt + '=' + value; + } } debug('node node_modules/phantomas/bin/phantomas.js --url=' + task.url + optionsString + ' --verbose'); diff --git a/package.json b/package.json index 601d1bf..8af9a0c 100644 --- a/package.json +++ b/package.json @@ -40,12 +40,12 @@ "grunt-env": "^0.4.4", "grunt-express": "^1.4.1", "grunt-filerev": "^2.1.2", - "grunt-fontsmith": "^0.9.1", "grunt-inline-angular-templates": "^0.1.5", "grunt-line-remover": "^0.0.2", "grunt-mocha-test": "^0.12.7", "grunt-replace": "^0.8.0", "grunt-usemin": "^3.0.0", + "grunt-webfont": "^0.5.2", "matchdep": "^0.3.0", "mocha": "^2.2.1", "request": "^2.53.0", diff --git a/test/api/apiTest.js b/test/api/apiTest.js index 74be9f3..23b16a1 100644 --- a/test/api/apiTest.js +++ b/test/api/apiTest.js @@ -96,7 +96,8 @@ describe('api', function() { body: { url: wwwUrl + '/simple-page.html', waitForResponse: true, - screenshot: true + screenshot: true, + device: 'tablet' }, json: true, headers: { @@ -164,6 +165,9 @@ describe('api', function() { body.should.have.a.property('javascriptExecutionTree').that.is.an('object'); body.javascriptExecutionTree.should.deep.equal({}); + // Check if the device is set to tablet + body.params.options.should.have.a.property('device').that.equals('tablet'); + // Check if the screenshot temporary file was correctly removed body.params.options.should.not.have.a.property('screenshot'); // Check if the screenshot buffer was correctly removed