Nikerabbit has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/93057


Change subject: Refactor ime lazy loading
......................................................................

Refactor ime lazy loading

* Do not load anything unless input field is focused
* Split the setup function to smaller functions
* Introduce $wgULSImeSelectors to allow configuration and avoid
  duplication of selectors in two places.

Change-Id: If5a476e66681dde9f0b72f619d35ddf6255246ac
---
M Resources.php
M UniversalLanguageSelector.hooks.php
M UniversalLanguageSelector.php
M resources/js/ext.uls.ime.js
M resources/js/ext.uls.interface.js
5 files changed, 117 insertions(+), 85 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UniversalLanguageSelector 
refs/changes/57/93057/1

diff --git a/Resources.php b/Resources.php
index a88d82a..9d00a7d 100644
--- a/Resources.php
+++ b/Resources.php
@@ -40,6 +40,7 @@
        'dependencies' => array(
                'ext.uls.init',
                'ext.uls.preferences',
+               'jquery.ime',
        ),
        'messages' => array(
                'uls-ime-helppage',
@@ -104,7 +105,6 @@
                // We can not delay webfonts loading since it is required
                // immediately after page load
                'ext.uls.webfonts',
-               'ext.uls.ime',
        ),
        'messages' => array(
                'uls-plang-title-languages',
diff --git a/UniversalLanguageSelector.hooks.php 
b/UniversalLanguageSelector.hooks.php
index b934477..cd8be48 100644
--- a/UniversalLanguageSelector.hooks.php
+++ b/UniversalLanguageSelector.hooks.php
@@ -256,8 +256,8 @@
         */
        public static function addConfig( &$vars ) {
                global $wgULSGeoService, $wgULSIMEEnabled, $wgULSPosition, 
$wgULSNoWebfontsSelectors,
-                       $wgULSAnonCanChangeLanguage, $wgULSEventLogging, 
$wgULSNoImeSelectors,
-                       $wgULSFontRepositoryBasePath, $wgExtensionAssetsPath;
+                       $wgULSAnonCanChangeLanguage, $wgULSEventLogging, 
$wgULSImeSelectors,
+                       $wgULSNoImeSelectors, $wgULSFontRepositoryBasePath, 
$wgExtensionAssetsPath;
 
                // Place constant stuff here (not depending on request context)
                if ( is_string( $wgULSGeoService ) ) {
@@ -267,6 +267,7 @@
                $vars['wgULSPosition'] = $wgULSPosition;
                $vars['wgULSAnonCanChangeLanguage'] = 
$wgULSAnonCanChangeLanguage;
                $vars['wgULSEventLogging'] = $wgULSEventLogging;
+               $vars['wgULSImeSelectors'] = $wgULSImeSelectors;
                $vars['wgULSNoImeSelectors'] = $wgULSNoImeSelectors;
                $vars['wgULSNoWebfontsSelectors'] = $wgULSNoWebfontsSelectors;
 
diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php
index 35a39c8..6043946 100644
--- a/UniversalLanguageSelector.php
+++ b/UniversalLanguageSelector.php
@@ -124,6 +124,19 @@
 $wgULSEventLogging = false;
 
 /**
+ * Array of jQuery selectors of elements on which IME should be enabled.
+ *
+ * @since 2013.11
+ */
+$wgULSImeSelectors = array(
+       'input:not([type])',
+       'input[type=text]',
+       'input[type=search]',
+       'textarea',
+       '[contenteditable]',
+);
+
+/**
  * Array of jQuery selectors of elements on which IME must not be enabled.
  *
  * @since 2013.07
diff --git a/resources/js/ext.uls.ime.js b/resources/js/ext.uls.ime.js
index 82b76c4..c1d3a82 100644
--- a/resources/js/ext.uls.ime.js
+++ b/resources/js/ext.uls.ime.js
@@ -195,93 +195,102 @@
                };
        };
 
+       /**
+        * Binds the event listeners.
+        */
        mw.ime.setup = function () {
+               var imeSelector = mw.config.get( 'wgULSImeSelectors' ).join( ', 
' );
                mw.ime.init();
-               $( 'body' ).on( 'focus.ime', inputSelector, function () {
-                       var imeselector, $input, noImeSelector;
-
-                       noImeSelector = mw.config.get( 'wgULSNoImeSelectors' 
).join( ', ' );
-                       $input = $( this );
-
-                       if ( !$.ime ) {
-                               mw.loader.using( 'jquery.ime', function () {
-                                       $input.trigger( 'focus' );
-                               } );
-
-                               return;
-                       }
-
-                       mw.ime.init();
-
-                       if ( $input.is( '.noime' ) || 
!$.ime.preferences.isEnabled() ) {
-                               return;
-                       }
-
-                       if ( $input.is( '[contenteditable]' ) && !window.rangy 
) {
-                               // for supporting content editable divs we need 
rangy library
-                               mw.loader.using( 'rangy.core', function () {
-                                       $input.trigger( 'focus' );
-                               } );
-
-                               return;
-                       }
-
-                       if ( noImeSelector.length && $input.is( noImeSelector ) 
) {
-                               $input.addClass( 'noime' );
-                               return;
-                       }
-
-                       $input.ime( {
-                               languages: mw.ime.getIMELanguageList(),
-                               languageSelector: function () {
-                                       var $ulsTrigger;
-
-                                       $ulsTrigger = $( '<a>' ).text( '...' )
-                                               .addClass( 
'ime-selector-more-languages selectable-row selectable-row-item' )
-                                               .attr( {
-                                                       title: $.i18n( 
'ext-uls-input-settings-more-languages-tooltip' )
-                                               } );
-                                       $ulsTrigger.uls( {
-                                               onSelect: function ( language ) 
{
-                                                       $input.data( 
'imeselector' ).selectLanguage( language );
-                                                       $input.focus();
-                                               },
-                                               languages: 
mw.ime.getLanguagesWithIME(),
-                                               top: $input.offset().top
-                                       } );
-
-                                       return $ulsTrigger;
-                               },
-                               helpHandler: function ( ime ) {
-                                       return $( '<a>' )
-                                               .attr( {
-                                                       href: mw.msg( 
'uls-ime-helppage' ).replace( '$1', ime ),
-                                                       target: '_blank',
-                                                       title: $.i18n( 
'ext-uls-ime-help' )
-                                               } )
-                                               .addClass( 'ime-perime-help' )
-                                               .click( function ( event ) {
-                                                       event.stopPropagation();
-                                               } );
-                               }
-                       } );
-
-                       // Some fields may be uninitialized
-                       imeselector = $input.data( 'imeselector' );
-                       if ( imeselector ) {
-                               imeselector.selectLanguage( 
imeselector.decideLanguage() );
-                               imeselector.$element.on( 'setim.ime', function 
( event, inputMethod ) {
-                                       mw.hook( 'mw.uls.ime.change' ).fire( 
inputMethod );
-                               } );
-                       }
+               $( 'body' ).on( 'focus.ime', imeSelector, function () {
+                       mw.ime.handleFocus( $( this ) );
                } );
        };
 
-       $( document ).ready( function () {
-               mw.uls.init( function () {
-                       mw.ime.setup();
+       /**
+        * Loads necessary dependencies, checks input for validity and
+        * adds the ime menu for elements that should have it.
+        * @param {jquery.Element} $input
+        * @since 2013.11
+        */
+       mw.ime.handleFocus = function ( $input ) {
+               var noImeSelector;
+
+               if ( $input.is( '.noime' ) ) {
+                       return;
+               }
+
+               noImeSelector = mw.config.get( 'wgULSNoImeSelectors' ).join( ', 
' );
+               if ( noImeSelector.length && $input.is( noImeSelector ) ) {
+                       $input.addClass( 'noime' );
+                       return;
+               }
+
+               if ( !$.ime.preferences.isEnabled() ) {
+                       return;
+               }
+
+               if ( $input.is( '[contenteditable]' ) && !window.rangy ) {
+                       // for supporting content editable divs we need rangy 
library
+                       mw.loader.using( 'rangy.core', function () {
+                               mw.ime.addIme( $input );
+                       } );
+               }
+
+               mw.ime.addIme( $input );
+       };
+
+       /**
+        * Just adds ime menu to any input element.
+        * @param {jquery.Element} $input
+        * @since 2013.11
+        */
+       mw.ime.addIme = function ( $input ) {
+               var imeselector;
+
+               $input.ime( {
+                       languages: mw.ime.getIMELanguageList(),
+                       languageSelector: function () {
+                               var $ulsTrigger;
+
+                               $ulsTrigger = $( '<a>' ).text( '...' )
+                                       .addClass( 'ime-selector-more-languages 
selectable-row selectable-row-item' )
+                                       .attr( {
+                                               title: $.i18n( 
'ext-uls-input-settings-more-languages-tooltip' )
+                                       } );
+                               $ulsTrigger.uls( {
+                                       onSelect: function ( language ) {
+                                               $input.data( 'imeselector' 
).selectLanguage( language );
+                                               $input.focus();
+                                       },
+                                       languages: mw.ime.getLanguagesWithIME(),
+                                       top: $input.offset().top
+                               } );
+
+                               return $ulsTrigger;
+                       },
+                       helpHandler: function ( ime ) {
+                               return $( '<a>' )
+                                       .attr( {
+                                               href: mw.msg( 
'uls-ime-helppage' ).replace( '$1', ime ),
+                                               target: '_blank',
+                                               title: $.i18n( 
'ext-uls-ime-help' )
+                                       } )
+                                       .addClass( 'ime-perime-help' )
+                                       .click( function ( event ) {
+                                               event.stopPropagation();
+                                       } );
+                       }
                } );
-       } );
+
+               // Some fields may be uninitialized
+               imeselector = $input.data( 'imeselector' );
+               if ( imeselector ) {
+                       imeselector.selectLanguage( 
imeselector.decideLanguage() );
+                       imeselector.$element.on( 'setim.ime', function ( event, 
inputMethod ) {
+                               mw.hook( 'mw.uls.ime.change' ).fire( 
inputMethod );
+                       } );
+               }
+       };
 
        function imeNotification() {
                var notificationMsg = ( mw.config.get( 'wgULSPosition' ) === 
'personal' ) ?
diff --git a/resources/js/ext.uls.interface.js 
b/resources/js/ext.uls.interface.js
index 53a33ff..fe2bf04 100644
--- a/resources/js/ext.uls.interface.js
+++ b/resources/js/ext.uls.interface.js
@@ -297,7 +297,8 @@
                                rtlPage = $( 'body' ).hasClass( 'rtl' ),
                                anonMode = ( mw.user.isAnon() &&
                                        !mw.config.get( 
'wgULSAnonCanChangeLanguage' ) ),
-                               ulsPosition = mw.config.get( 'wgULSPosition' );
+                               ulsPosition = mw.config.get( 'wgULSPosition' ),
+                               imeSelector = mw.config.get( 
'wgULSImeSelectors' ).join( ', ' );
 
                        if ( ulsPosition === 'interlanguage' ) {
                                // TODO: Refactor this block
@@ -445,6 +446,14 @@
                                } );
 
                        showULSTooltip();
+
+                       $( 'body' ).on( 'focus.imeinit', imeSelector, function 
() {
+                               var $input = $( this );
+                               mw.loader.using( 'ext.uls.ime', function () {
+                                       mw.ime.setup();
+                                       mw.ime.handleFocus( $input );
+                               } );
+                       } );
                } );
        } );
 }( jQuery, mediaWiki ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/93057
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If5a476e66681dde9f0b72f619d35ddf6255246ac
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UniversalLanguageSelector
Gerrit-Branch: master
Gerrit-Owner: Nikerabbit <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to