jenkins-bot has submitted this change and it was merged. Change subject: screenshots: Add multi-language support ......................................................................
screenshots: Add multi-language support
Change-Id: I1da41cffd946a76e5f09097decbc0a25562c9508
---
M Gruntfile.js
M build/screenshots.js
A build/tasks/screenshotLangs.json
3 files changed, 379 insertions(+), 259 deletions(-)
Approvals:
Jforrester: Looks good to me, approved
jenkins-bot: Verified
diff --git a/Gruntfile.js b/Gruntfile.js
index 51af4a1..3932e8f 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -56,10 +56,29 @@
}
},
mochaTest: {
- screenshots: {
+ 'screenshots-en': {
options: {
reporter: 'spec',
- timeout: 20000
+ timeout: 20000,
+ require: [
+ function () {
+ /* jshint undef:false */
+ langs = [ 'en' ];
+ }
+ ]
+ },
+ src: [ 'build/screenshots.js' ]
+ },
+ 'screenshots-all': {
+ options: {
+ reporter: 'spec',
+ timeout: 20000,
+ require: [
+ function () {
+ /* jshint undef:false */
+ langs = require(
'./build/tasks/screenshotLangs.json' ).langs;
+ }
+ ]
},
src: [ 'build/screenshots.js' ]
}
@@ -163,7 +182,8 @@
grunt.registerTask( 'fix', [ 'jscs:fix' ] );
grunt.registerTask( 'test', [ 'build', 'lint' ] );
grunt.registerTask( 'test-ci', [ 'git-status' ] );
- grunt.registerTask( 'screenshots', [ 'mochaTest:screenshots' ] );
+ grunt.registerTask( 'screenshots', [ 'mochaTest:screenshots-en' ] );
+ grunt.registerTask( 'screenshots-all', [ 'mochaTest:screenshots-all' ]
);
grunt.registerTask( 'default', 'test' );
if ( process.env.JENKINS_HOME ) {
diff --git a/build/screenshots.js b/build/screenshots.js
index 986eaae..207cc7a 100644
--- a/build/screenshots.js
+++ b/build/screenshots.js
@@ -1,266 +1,271 @@
/* jshint node: true */
-/* global seleniumUtils */
-
-var chrome = require( 'selenium-webdriver/chrome' ),
+/* global seleniumUtils, langs */
+var i, l,
+ chrome = require( 'selenium-webdriver/chrome' ),
test = require( 'selenium-webdriver/testing' ),
fs = require( 'fs' ),
- Jimp = require( 'jimp' ),
- lang = 'en';
+ Jimp = require( 'jimp' );
-test.describe( 'Screenshot', function () {
- var driver;
+function runTests( lang ) {
+ test.describe( 'Screenshots: ' + lang, function () {
+ var driver;
- function runScreenshotTest( name, clientScript, padding ) {
- var filename = './screenshots/' + name + '-' + lang + '.png';
- driver.get(
'http://en.wikipedia.beta.wmflabs.org/wiki/PageDoesNotExist?veaction=edit&uselang='
+ lang );
- driver.wait(
- driver.executeAsyncScript(
+ test.beforeEach( function () {
+ driver = new chrome.Driver();
+ driver.manage().timeouts().setScriptTimeout( 20000 );
+ driver.manage().window().setSize( 1200, 800 );
+ } );
+
+ test.afterEach( function () {
+ driver.quit();
+ } );
+
+ function runScreenshotTest( name, clientScript, padding ) {
+ var filename = './screenshots/' + name + '-' + lang +
'.png';
+ driver.get(
'http://en.wikipedia.beta.wmflabs.org/wiki/PageDoesNotExist?veaction=edit&uselang='
+ lang );
+ driver.wait(
+ driver.executeAsyncScript(
+ // This function is converted to a
string and executed in the browser
+ function () {
+ var done = arguments[
arguments.length - 1 ];
+
+ window.seleniumUtils = {
+ getBoundingRect:
function ( elements ) {
+ var i, l, rect,
boundingRect;
+ for ( i = 0, l
= elements.length; i < l; i++ ) {
+ rect =
elements[ i ].getBoundingClientRect();
+ if (
!boundingRect ) {
+
boundingRect = {
+
left: rect.left,
+
top: rect.top,
+
right: rect.right,
+
bottom: rect.bottom
+
};
+ } else {
+
boundingRect.left = Math.min( boundingRect.left, rect.left );
+
boundingRect.top = Math.min( boundingRect.top, rect.top );
+
boundingRect.right = Math.max( boundingRect.right, rect.right );
+
boundingRect.bottom = Math.max( boundingRect.bottom, rect.bottom );
+ }
+ }
+ if (
boundingRect ) {
+
boundingRect.width = boundingRect.right - boundingRect.left;
+
boundingRect.height = boundingRect.bottom - boundingRect.top;
+ }
+ return
boundingRect;
+ }
+ };
+
+ // Suppress welcome dialog
+ localStorage.setItem(
've-beta-welcome-dialog', 1 );
+ // Suppress user education
indicators
+ localStorage.setItem(
've-hideusered', 1 );
+ mw.hook(
've.activationComplete' ).add( function () {
+ var target =
ve.init.target,
+ surfaceView =
target.getSurface().getView();
+ // Hide edit notices
+
target.actionsToolbar.tools.notices.getPopup().toggle( false );
+ // Modify the document
to make the save button blue
+ // Wait for focus
+ surfaceView.once(
'focus', function () {
+
target.surface.getModel().getFragment().insertContent( ' '
).collapseToStart().select();
+ // Wait for
save button fade
+ setTimeout(
done, 100 );
+ } );
+ } );
+ }
+ ).then( function () {
+ return driver.executeAsyncScript(
clientScript ).then( function ( rect ) {
+ return
driver.takeScreenshot().then( function ( base64Image ) {
+ var imageBuffer;
+ if ( rect ) {
+ imageBuffer =
new Buffer( base64Image, 'base64' );
+ return
cropScreenshot( filename, imageBuffer, rect, padding );
+ } else {
+ fs.writeFile(
filename, base64Image, 'base64' );
+ }
+ } );
+ } );
+ } ),
+ 20000
+ );
+ }
+
+ function cropScreenshot( filename, imageBuffer, rect, padding )
{
+ if ( padding === undefined ) {
+ padding = 5;
+ }
+
+ return Jimp.read( imageBuffer ).then( function (
jimpImage ) {
+ jimpImage
+ .crop(
+ rect.left - padding,
+ rect.top - padding,
+ rect.width + ( padding * 2 ),
+ rect.height + ( padding * 2 )
+ )
+ .write( filename );
+ } );
+ }
+
+ test.it( 'Toolbar', function () {
+ runScreenshotTest( 'VisualEditor_toolbar',
// This function is converted to a string and
executed in the browser
function () {
var done = arguments[ arguments.length
- 1 ];
-
- window.seleniumUtils = {
- getBoundingRect: function (
elements ) {
- var i, l, rect,
boundingRect;
- for ( i = 0, l =
elements.length; i < l; i++ ) {
- rect =
elements[ i ].getBoundingClientRect();
- if (
!boundingRect ) {
-
boundingRect = {
-
left: rect.left,
-
top: rect.top,
-
right: rect.right,
-
bottom: rect.bottom
- };
- } else {
-
boundingRect.left = Math.min( boundingRect.left, rect.left );
-
boundingRect.top = Math.min( boundingRect.top, rect.top );
-
boundingRect.right = Math.max( boundingRect.right, rect.right );
-
boundingRect.bottom = Math.max( boundingRect.bottom, rect.bottom );
- }
- }
- if ( boundingRect ) {
-
boundingRect.width = boundingRect.right - boundingRect.left;
-
boundingRect.height = boundingRect.bottom - boundingRect.top;
- }
- return boundingRect;
- }
- };
-
- // Suppress welcome dialog
- localStorage.setItem(
've-beta-welcome-dialog', 1 );
- // Suppress user education indicators
- localStorage.setItem( 've-hideusered',
1 );
- mw.hook( 've.activationComplete' ).add(
function () {
- var target = ve.init.target,
- surfaceView =
target.getSurface().getView();
- // Hide edit notices
-
target.actionsToolbar.tools.notices.getPopup().toggle( false );
- // Modify the document to make
the save button blue
- // Wait for focus
- surfaceView.once( 'focus',
function () {
-
target.surface.getModel().getFragment().insertContent( ' '
).collapseToStart().select();
- // Wait for save button
fade
- setTimeout( done, 100 );
- } );
- } );
- }
- ).then( function () {
- return driver.executeAsyncScript( clientScript
).then( function ( rect ) {
- return driver.takeScreenshot().then(
function ( base64Image ) {
- var imageBuffer;
- if ( rect ) {
- imageBuffer = new
Buffer( base64Image, 'base64' );
- return cropScreenshot(
filename, imageBuffer, rect, padding );
- } else {
- fs.writeFile( filename,
base64Image, 'base64' );
- }
- } );
- } );
- } ),
- 20000
- );
- }
-
- function cropScreenshot( filename, imageBuffer, rect, padding ) {
- if ( padding === undefined ) {
- padding = 5;
- }
-
- return Jimp.read( imageBuffer ).then( function ( jimpImage ) {
- jimpImage
- .crop(
- rect.left - padding,
- rect.top - padding,
- rect.width + ( padding * 2 ),
- rect.height + ( padding * 2 )
- )
- .write( filename );
+ done(
+ seleniumUtils.getBoundingRect( [
+
ve.init.target.toolbar.$element[ 0 ],
+ $( '#ca-nstab-main' )[
0 ]
+ ] )
+ );
+ },
+ 0
+ );
} );
- }
+ test.it( 'Citoid inspector', function () {
+ runScreenshotTest( 'VisualEditor_Citoid_Inspector',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ];
+
ve.init.target.toolbar.tools.citefromid.onSelect();
+ setTimeout( function () {
+ var rect =
ve.init.target.surface.context.inspectors.currentWindow.$element[ 0
].getBoundingClientRect();
+ done( {
+ top: rect.top - 20,
+ left: rect.left,
+ width: rect.width,
+ height: rect.height + 20
+ } );
+ }, 500 );
+ }
+ );
+ } );
+ test.it( 'Headings tool list', function () {
+ runScreenshotTest( 'VisualEditor_Toolbar_Headings',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ],
+ toolGroup =
ve.init.target.toolbar.tools.paragraph.toolGroup;
+ toolGroup.setActive( true );
+ setTimeout( function () {
+ done(
+
seleniumUtils.getBoundingRect( [
+
toolGroup.$element[ 0 ],
+
toolGroup.$group[ 0 ]
+ ] )
+ );
+ }, 500 );
+ }
+ );
+ } );
+ test.it( 'Text style tool list', function () {
+ runScreenshotTest( 'VisualEditor_Toolbar_Formatting',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ],
+ toolGroup =
ve.init.target.toolbar.tools.bold.toolGroup;
+ toolGroup.setActive( true );
+
toolGroup.getExpandCollapseTool().onSelect();
+ setTimeout( function () {
+ done(
+
seleniumUtils.getBoundingRect( [
+
toolGroup.$element[ 0 ],
+
toolGroup.$group[ 0 ]
+ ] )
+ );
+ }, 500 );
+ }
+ );
+ } );
+ test.it( 'Indentation tool list', function () {
+ runScreenshotTest(
'VisualEditor_Toolbar_List_and_indentation',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ],
+ toolGroup =
ve.init.target.toolbar.tools.bullet.toolGroup;
+ toolGroup.setActive( true );
+ setTimeout( function () {
+ done(
+
seleniumUtils.getBoundingRect( [
+
toolGroup.$element[ 0 ],
+
toolGroup.$group[ 0 ]
+ ] )
+ );
+ }, 500 );
+ }
+ );
+ } );
+ test.it( 'Page options list', function () {
+ runScreenshotTest( 'VisualEditor_More_Settings',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ],
+ toolGroup =
ve.init.target.actionsToolbar.tools.advancedSettings.toolGroup;
+ toolGroup.setActive( true );
+ setTimeout( function () {
+ done(
+
seleniumUtils.getBoundingRect( [
+
toolGroup.$element[ 0 ],
+
toolGroup.$group[ 0 ],
+ // Include save
button for context
+
ve.init.target.toolbarSaveButton.$element[ 0 ]
+ ] )
+ );
+ }, 500 );
+ }
+ );
+ } );
+ test.it( 'Toolbar actions', function () {
+ runScreenshotTest( 'VisualEditor_toolbar_actions',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ];
+ done(
+ seleniumUtils.getBoundingRect( [
+
ve.init.target.toolbar.$actions[ 0 ]
+ ] )
+ );
+ },
+ 0
+ );
+ } );
+ test.it( 'Save dialog', function () {
+ runScreenshotTest( 'VisualEditor_save_dialog',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ];
+ ve.init.target.toolbarSaveButton.emit(
'click' );
+ setTimeout( function () {
+ done(
+
seleniumUtils.getBoundingRect( [
+
ve.init.target.surface.dialogs.currentWindow.$frame[ 0 ]
+ ] )
+ );
+ }, 500 );
+ }
+ );
+ } );
+ test.it( 'Special character inserter', function () {
+ runScreenshotTest(
'VisualEditor_Toolbar_SpecialCharacters',
+ // This function is converted to a string and
executed in the browser
+ function () {
+ var done = arguments[ arguments.length
- 1 ];
+
ve.init.target.toolbar.tools.specialCharacter.onSelect();
+ setTimeout( function () {
+ done(
+
seleniumUtils.getBoundingRect( [
+
ve.init.target.toolbar.tools.specialCharacter.$element[ 0 ],
+
ve.init.target.surface.toolbarDialogs.$element[ 0 ]
+ ]
+ ) );
+ }, 1000 );
+ }
+ );
+ } );
+ } );
+}
- test.beforeEach( function () {
- driver = new chrome.Driver();
- driver.manage().timeouts().setScriptTimeout( 20000 );
- driver.manage().window().setSize( 1200, 800 );
- } );
-
- test.afterEach( function () {
- driver.quit();
- } );
-
- test.it( 'Toolbar', function () {
- runScreenshotTest( 'VisualEditor_toolbar',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ];
- done(
- seleniumUtils.getBoundingRect( [
-
ve.init.target.toolbar.$element[ 0 ],
- $( '#ca-nstab-main' )[ 0 ]
- ] )
- );
- },
- 0
- );
- } );
- test.it( 'Citoid inspector', function () {
- runScreenshotTest( 'VisualEditor_Citoid_Inspector',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ];
-
ve.init.target.toolbar.tools.citefromid.onSelect();
- setTimeout( function () {
- var rect =
ve.init.target.surface.context.inspectors.currentWindow.$element[ 0
].getBoundingClientRect();
- done( {
- top: rect.top - 20,
- left: rect.left,
- width: rect.width,
- height: rect.height + 20
- } );
- }, 500 );
- }
- );
- } );
- test.it( 'Headings tool list', function () {
- runScreenshotTest( 'VisualEditor_Toolbar_Headings',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ],
- toolGroup =
ve.init.target.toolbar.tools.paragraph.toolGroup;
- toolGroup.setActive( true );
- setTimeout( function () {
- done(
- seleniumUtils.getBoundingRect( [
- toolGroup.$element[ 0 ],
- toolGroup.$group[ 0 ]
- ] )
- );
- }, 500 );
- }
- );
- } );
- test.it( 'Text style tool list', function () {
- runScreenshotTest( 'VisualEditor_Toolbar_Formatting',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ],
- toolGroup =
ve.init.target.toolbar.tools.bold.toolGroup;
- toolGroup.setActive( true );
- toolGroup.getExpandCollapseTool().onSelect();
- setTimeout( function () {
- done(
- seleniumUtils.getBoundingRect( [
- toolGroup.$element[ 0 ],
- toolGroup.$group[ 0 ]
- ] )
- );
- }, 500 );
- }
- );
- } );
- test.it( 'Indentation tool list', function () {
- runScreenshotTest( 'VisualEditor_Toolbar_List_and_indentation',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ],
- toolGroup =
ve.init.target.toolbar.tools.bullet.toolGroup;
- toolGroup.setActive( true );
- setTimeout( function () {
- done(
- seleniumUtils.getBoundingRect( [
- toolGroup.$element[ 0 ],
- toolGroup.$group[ 0 ]
- ] )
- );
- }, 500 );
- }
- );
- } );
- test.it( 'Page options list', function () {
- runScreenshotTest( 'VisualEditor_More_Settings',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ],
- toolGroup =
ve.init.target.actionsToolbar.tools.advancedSettings.toolGroup;
- toolGroup.setActive( true );
- setTimeout( function () {
- done(
- seleniumUtils.getBoundingRect( [
- toolGroup.$element[ 0 ],
- toolGroup.$group[ 0 ],
- // Include save button
for context
-
ve.init.target.toolbarSaveButton.$element[ 0 ]
- ] )
- );
- }, 500 );
- }
- );
- } );
- test.it( 'Toolbar actions', function () {
- runScreenshotTest( 'VisualEditor_toolbar_actions',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ];
- done(
- seleniumUtils.getBoundingRect( [
-
ve.init.target.toolbar.$actions[ 0 ]
- ] )
- );
- },
- 0
- );
- } );
- test.it( 'Save dialog', function () {
- runScreenshotTest( 'VisualEditor_save_dialog',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ];
- ve.init.target.toolbarSaveButton.emit( 'click'
);
- setTimeout( function () {
- done(
- seleniumUtils.getBoundingRect( [
-
ve.init.target.surface.dialogs.currentWindow.$frame[ 0 ]
- ] )
- );
- }, 500 );
- }
- );
- } );
- test.it( 'Special character inserter', function () {
- runScreenshotTest( 'VisualEditor_Toolbar_SpecialCharacters',
- // This function is converted to a string and executed
in the browser
- function () {
- var done = arguments[ arguments.length - 1 ];
-
ve.init.target.toolbar.tools.specialCharacter.onSelect();
- setTimeout( function () {
- done(
- seleniumUtils.getBoundingRect( [
-
ve.init.target.toolbar.tools.specialCharacter.$element[ 0 ],
-
ve.init.target.surface.toolbarDialogs.$element[ 0 ]
- ]
- ) );
- }, 1000 );
- }
- );
- } );
-} );
+for ( i = 0, l = langs.length; i < l; i++ ) {
+ runTests( langs[ i ] );
+}
diff --git a/build/tasks/screenshotLangs.json b/build/tasks/screenshotLangs.json
new file mode 100644
index 0000000..3697a39
--- /dev/null
+++ b/build/tasks/screenshotLangs.json
@@ -0,0 +1,95 @@
+{
+ "langs": [
+ "ar",
+ "as",
+ "ast",
+ "az",
+ "azb",
+ "bcl",
+ "be-tarask",
+ "bg",
+ "bn",
+ "bs",
+ "ca",
+ "cdo",
+ "ceb",
+ "cs",
+ "cy",
+ "da",
+ "de",
+ "diq",
+ "egl",
+ "el",
+ "eml",
+ "en",
+ "en-gb",
+ "eo",
+ "es",
+ "et",
+ "eu",
+ "fa",
+ "fi",
+ "fo",
+ "fr",
+ "fur",
+ "fy",
+ "gl",
+ "he",
+ "hi",
+ "hif",
+ "hr",
+ "hu",
+ "hy",
+ "id",
+ "ie",
+ "ilo",
+ "it",
+ "ja",
+ "jv",
+ "ka",
+ "km",
+ "kn",
+ "ko",
+ "lb",
+ "lt",
+ "lv",
+ "mai",
+ "mg",
+ "mk",
+ "ml",
+ "mr",
+ "ms",
+ "nap",
+ "nb",
+ "nl",
+ "om",
+ "or",
+ "pa",
+ "pcd",
+ "pl",
+ "ps",
+ "pt",
+ "pt-br",
+ "ro",
+ "ru",
+ "sah",
+ "sco",
+ "sd",
+ "sk",
+ "sl",
+ "sq",
+ "sr",
+ "su",
+ "sv",
+ "ta",
+ "th",
+ "tl",
+ "tr",
+ "tt",
+ "uk",
+ "vi",
+ "xh",
+ "yi",
+ "zh"
+ ]
+}
--
To view, visit https://gerrit.wikimedia.org/r/295959
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I1da41cffd946a76e5f09097decbc0a25562c9508
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
