Index: src/wp-admin/js/user-profile.js
===================================================================
--- src/wp-admin/js/user-profile.js	(revision 33623)
+++ src/wp-admin/js/user-profile.js	(working copy)
@@ -47,7 +47,7 @@
 			.addClass( $pass1[0].className )
 			.data( 'pw', $pass1.data( 'pw' ) )
 			.val( $pass1.val() )
-			.on( 'input propertychange', function () {
+			.on( 'keyup', function () {
 				if ( $pass1Text.val() === currentPass ) {
 					return;
 				}
@@ -62,13 +62,16 @@
 			generatePassword();
 		}
 
-		$pass1.on( 'input propertychange pwupdate', function () {
+		$pass1.on( 'keyup pwupdate', function () {
 			if ( $pass1.val() === currentPass ) {
 				return;
 			}
 
 			currentPass = $pass1.val();
-			$pass1Text.val( currentPass );
+			if ( $pass1Text.val() !== currentPass ) {
+				$pass1Text.val( currentPass );
+			}
+
 			$pass1.add( $pass1Text ).removeClass( 'short bad good strong' );
 
 			if ( passStrength.className ) {
@@ -163,7 +166,8 @@
 		 * This fixes the issue by copying any changes from the hidden
 		 * pass2 field to the pass1 field, then running check_pass_strength.
 		 */
-		$pass2 = $('#pass2').on( 'input propertychange', function () {
+		$pass2 = $('#pass2');
+		$pass2.on( 'keyup', function () {
 			if ( $pass2.val().length > 0 ) {
 				$pass1.val( $pass2.val() );
 				$pass2.val('');
@@ -244,7 +248,7 @@
 		var $colorpicker, $stylesheet, user_id, current_user_id,
 			select = $( '#display_name' );
 
-		$('#pass1').val('').on( 'input propertychange pwupdate', check_pass_strength );
+		$('#pass1').val('').on( 'keyup pwupdate', check_pass_strength );
 		$('#pass-strength-result').show();
 		$('.color-palette').click( function() {
 			$(this).siblings('input[name="admin_color"]').prop('checked', true);
