From 9c3c452fa90faf47a9d79988259a6b0773495148 Mon Sep 17 00:00:00 2001
From: Andrew Ozz <azaozz@git.wordpress.org>
Date: Sun, 3 May 2015 18:44:37 +0000
Subject: [PATCH] Emoji: - Fix loading errors in IE9 and IE10. - Add fallbacks
 for the loading events. Fixes #32109 for trunk.

git-svn-id: https://develop.svn.wordpress.org/trunk@32334 602fd350-edb4-49c9-b593-d223f7449a82
---
 src/wp-includes/js/wp-emoji-loader.js | 23 +++++++++++-
 src/wp-includes/js/wp-emoji.js        | 51 +++++++--------------------
 2 files changed, 34 insertions(+), 40 deletions(-)

diff --git a/src/wp-includes/js/wp-emoji-loader.js b/src/wp-includes/js/wp-emoji-loader.js
index d4d0242070..619157f710 100755
--- a/src/wp-includes/js/wp-emoji-loader.js
+++ b/src/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
@@ -62,7 +62,28 @@
 		flag:   browserSupportsEmoji( 'flag' )
 	};
 
+	settings.DOMReady = false;
+	settings.readyCallback = function() {
+		settings.DOMReady = true;
+	};
+
 	if ( ! settings.supports.simple || ! settings.supports.flag ) {
+		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 ) {
diff --git a/src/wp-includes/js/wp-emoji.js b/src/wp-includes/js/wp-emoji.js
index 47076c95ea..f41907865e 100644
--- a/src/wp-includes/js/wp-emoji.js
+++ b/src/wp-includes/js/wp-emoji.js
@@ -3,24 +3,6 @@
 	function wpEmoji() {
 		var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
 
-		/**
-		 * Flag to determine if the browser and the OS support emoji.
-		 *
-		 * @since 4.2.0
-		 *
-		 * @var Boolean
-		 */
-		supportsEmoji = false,
-
-		/**
-		 * Flag to determine if the browser and the OS support flag (two character) emoji.
-		 *
-		 * @since 4.2.0
-		 *
-		 * @var Boolean
-		 */
-		supportsFlagEmoji = false,
-
 		/**
 		 * Flag to determine if we should replace emoji characters with images.
 		 *
@@ -30,10 +12,9 @@
 		 */
 		replaceEmoji = false,
 
-		isIE8 = window.navigator.userAgent.indexOf( 'IE 8' ) !== -1,
-
 		// Private
 		twemoji, timer,
+		loaded = false,
 		count = 0;
 
 		/**
@@ -42,6 +23,10 @@
 		 * @since 4.2.0
 		 */
 		function load() {
+			if ( loaded ) {
+				return;
+			}
+
 			if ( typeof window.twemoji === 'undefined' ) {
 				// Break if waiting for longer than 30 sec.
 				if ( count > 600 ) {
@@ -57,6 +42,7 @@
 			}
 
 			twemoji = window.twemoji;
+			loaded = true;
 
 			if ( MutationObserver ) {
 				new MutationObserver( function( mutationRecords ) {
@@ -107,7 +93,7 @@
 		 * @param {Object} args Additional options for Twemoji.
 		 */
 		function parse( object, args ) {
-			if ( ! replaceEmoji ) {
+			if ( ! replaceEmoji || ! twemoji ) {
 				return object;
 			}
 
@@ -132,7 +118,7 @@
 							return false;
 					}
 
-					if ( ! supportsFlagEmoji && supportsEmoji &&
+					if ( ! settings.supports.flag && settings.supports.simple &&
 						! /^1f1(?:e[6-9a-f]|f[0-9a-f])-1f1(?:e[6-9a-f]|f[0-9a-f])$/.test( icon ) ) {
 
 						return false;
@@ -143,29 +129,16 @@
 			} );
 		}
 
-		// Load when the readyState changes to 'interactive', not 'complete'.
-		function onLoad() {
-			if ( ( ! isIE8 && 'interactive' === document.readyState ) || ( isIE8 && 'complete' === document.readyState ) ) {
-				load();
-			}
-		}
-
 		/**
 		 * Initialize our emoji support, and set up listeners.
 		 */
 		if ( settings ) {
-			supportsEmoji = window._wpemojiSettings.supports.simple;
-			supportsFlagEmoji = window._wpemojiSettings.supports.flag;
-			replaceEmoji = ! supportsEmoji || ! supportsFlagEmoji;
+			replaceEmoji = ! settings.supports.simple || ! settings.supports.flag;
 
-			if ( ( ! isIE8 && 'loading' === document.readyState ) || ( isIE8 && 'complete' !== document.readyState ) ) {
-				if ( document.addEventListener ) {
-					document.addEventListener( 'readystatechange', onLoad, false );
-				} else if ( document.attachEvent ) {
-					document.attachEvent( 'onreadystatechange', onLoad );
-				}
-			} else {
+			if ( settings.DOMReady ) {
 				load();
+			} else {
+				settings.readyCallback = load;
 			}
 		}