X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/wordpress.git/blobdiff_plain/7f1521bf193b382565eb753043c161f4cb3fcda7..9441756a895fb4fdc4bcf20e0d228cef622663ca:/wp-includes/js/wp-emoji-loader.js diff --git a/wp-includes/js/wp-emoji-loader.js b/wp-includes/js/wp-emoji-loader.js index d4d02420..327f66a1 100644 --- a/wp-includes/js/wp-emoji-loader.js +++ b/wp-includes/js/wp-emoji-loader.js @@ -1,5 +1,5 @@ ( function( window, document, settings ) { - var src; + var src, ready; /** * Detect if the browser supports rendering emoji or flag emoji. Flag emoji are a single glyph @@ -12,7 +12,8 @@ */ function browserSupportsEmoji( type ) { var canvas = document.createElement( 'canvas' ), - context = canvas.getContext && canvas.getContext( '2d' ); + context = canvas.getContext && canvas.getContext( '2d' ), + tone; if ( ! context || ! context.fillText ) { return false; @@ -26,25 +27,44 @@ context.textBaseline = 'top'; context.font = '600 32px Arial'; - if ( type === 'flag' ) { + if ( 'flag' === type ) { /* * This works because the image will be one of three things: * - Two empty squares, if the browser doesn't render emoji - * - Two squares with 'G' and 'B' in them, if the browser doesn't render flag emoji - * - The British flag + * - Two squares with 'A' and 'U' in them, if the browser doesn't render flag emoji + * - The Australian flag * * The first two will encode to small images (1-2KB data URLs), the third will encode * to a larger image (4-5KB data URL). */ - context.fillText( String.fromCharCode( 55356, 56812, 55356, 56807 ), 0, 0 ); + context.fillText( String.fromCharCode( 55356, 56806, 55356, 56826 ), 0, 0 ); return canvas.toDataURL().length > 3000; - } else { + } else if ( 'diversity' === type ) { /* - * This creates a smiling emoji, and checks to see if there is any image data in the - * center pixel. In browsers that don't support emoji, the character will be rendered - * as an empty square, so the center pixel will be blank. + * This tests if the browser supports the Emoji Diversity specification, by rendering an + * emoji with no skin tone specified (in this case, Santa). It then adds a skin tone, and + * compares if the emoji rendering has changed. */ - context.fillText( String.fromCharCode( 55357, 56835 ), 0, 0 ); + context.fillText( String.fromCharCode( 55356, 57221 ), 0, 0 ); + tone = context.getImageData( 16, 16, 1, 1 ).data.toString(); + context.fillText( String.fromCharCode( 55356, 57221, 55356, 57343 ), 0, 0 ); + // Chrome has issues comparing arrays, so we compare it as a string, instead. + return tone !== context.getImageData( 16, 16, 1, 1 ).data.toString(); + } else { + if ( 'simple' === type ) { + /* + * This creates a smiling emoji, and checks to see if there is any image data in the + * center pixel. In browsers that don't support emoji, the character will be rendered + * as an empty square, so the center pixel will be blank. + */ + context.fillText( String.fromCharCode( 55357, 56835 ), 0, 0 ); + } else { + /* + * To check for Unicode 8 support, let's try rendering the most important advancement + * that the Unicode Consortium have made in years: the burrito. + */ + context.fillText( String.fromCharCode( 55356, 57135 ), 0, 0 ); + } return context.getImageData( 16, 16, 1, 1 ).data[0] !== 0; } } @@ -58,11 +78,34 @@ } settings.supports = { - simple: browserSupportsEmoji( 'simple' ), - flag: browserSupportsEmoji( 'flag' ) + simple: browserSupportsEmoji( 'simple' ), + flag: browserSupportsEmoji( 'flag' ), + unicode8: browserSupportsEmoji( 'unicode8' ), + diversity: browserSupportsEmoji( 'diversity' ) + }; + + settings.DOMReady = false; + settings.readyCallback = function() { + settings.DOMReady = true; }; - if ( ! settings.supports.simple || ! settings.supports.flag ) { + if ( ! settings.supports.simple || ! settings.supports.flag || ! settings.supports.unicode8 || ! settings.supports.diversity ) { + ready = function() { + settings.readyCallback(); + }; + + if ( document.addEventListener ) { + document.addEventListener( 'DOMContentLoaded', ready, false ); + window.addEventListener( 'load', ready, false ); + } else { + window.attachEvent( 'onload', ready ); + document.attachEvent( 'onreadystatechange', function() { + if ( 'complete' === document.readyState ) { + settings.readyCallback(); + } + } ); + } + src = settings.source || {}; if ( src.concatemoji ) {