Mooeypoo has uploaded a new change for review.

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

Change subject: Small validation fixes to scalable
......................................................................

Small validation fixes to scalable

There was an issue where scalable dimensions may have been set as
{ width: undefined } which made the tests in most 'set' methods
pass probperly, because this wasn't an empty object. However,
practically speaking this is an empty dimensions object, and it
should be considered as if it isn't valid.

This wrecked havoc on the calculations done with the aspect ratio,
and affected 'default dimensions' most of all.

Changes made:
* Added a 'isDimensionsObjectValid' method to ve.dm.Scalable that
  tests dimension objects specifically to see if they are valid
  before update is done to any of the stored dimension values.
* Added originalSizeChange event to ve.dm.Scalable and a listener
  in ve.ui.MediaSizeWidget to make sure that the 'full size'
  button is only enabled when original dimensions are acquired,
  even if the API response is slow or was completed after the
  widget is already loaded.
* Fixed small typos in setDefaultDimensions in ve.dm.Scalable

Change-Id: I1242e8dadca4f2cf2737c366034a77edc5ce308e
---
M modules/ve/dm/ve.dm.Scalable.js
M modules/ve/ui/widgets/ve.ui.MediaSizeWidget.js
2 files changed, 81 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/28/125428/1

diff --git a/modules/ve/dm/ve.dm.Scalable.js b/modules/ve/dm/ve.dm.Scalable.js
index ca4b145..51035ac 100644
--- a/modules/ve/dm/ve.dm.Scalable.js
+++ b/modules/ve/dm/ve.dm.Scalable.js
@@ -76,6 +76,13 @@
  */
 
 /**
+ * Original size changed
+ *
+ * @event originalSizeChange
+ * @param {Object} Original dimensions width and height
+ */
+
+/**
  * Min size changed
  *
  * @event minSizeChange
@@ -111,7 +118,7 @@
  * @param {Object} dimensions Dimensions object with width & height
  */
 ve.dm.Scalable.prototype.setCurrentDimensions = function ( dimensions ) {
-       if ( dimensions ) {
+       if ( this.isDimensionsObjectValid( dimensions ) ) {
                this.currentDimensions = ve.copy( dimensions );
                // Only use current dimensions for ratio if it isn't set
                if ( this.fixedRatio && !this.ratio ) {
@@ -127,14 +134,24 @@
  * Also resets the aspect ratio if in fixed ratio mode.
  *
  * @param {Object} dimensions Dimensions object with width & height
+ * @fires originalSizeChange
  */
 ve.dm.Scalable.prototype.setOriginalDimensions = function ( dimensions ) {
-       this.originalDimensions = ve.copy( dimensions );
-       // Always overwrite ratio
-       if ( this.fixedRatio ) {
-               this.setRatioFromDimensions( this.getOriginalDimensions() );
+       if (
+               !this.originalDimensions ||
+               (
+                       this.isDimensionsObjectValid( dimensions ) &&
+                       !ve.compare( this.originalDimensions, dimensions )
+               )
+       ) {
+               this.originalDimensions = ve.copy( dimensions );
+               // Always overwrite ratio
+               if ( this.fixedRatio ) {
+                       this.setRatioFromDimensions( 
this.getOriginalDimensions() );
+               }
+               this.valid = null;
+               this.emit( 'originalSizeChange', this.getOriginalDimensions() );
        }
-       this.valid = null;
 };
 
 /**
@@ -144,7 +161,13 @@
  * @fires defaultSizeChange
  */
 ve.dm.Scalable.prototype.setDefaultDimensions = function ( dimensions ) {
-       if ( !this.dimensions || !ve.compare( this.dimensions, dimensions ) ) {
+       if (
+               !this.defaultDimensions ||
+               (
+                       this.isDimensionsObjectValid( dimensions ) &&
+                       !ve.compare( this.defaultDimensions, dimensions )
+               )
+       ) {
                this.defaultDimensions = ve.copy( dimensions );
                this.valid = null;
                this.emit( 'defaultSizeChange', this.isDefault() );
@@ -179,7 +202,13 @@
  * @fires minSizeChange
  */
 ve.dm.Scalable.prototype.setMinDimensions = function ( dimensions ) {
-       if ( !this.minDimensions || !ve.compare( this.minDimensions, dimensions 
) ) {
+       if (
+               !this.minDimensions ||
+               (
+                       this.isDimensionsObjectValid( dimensions ) &&
+                       !ve.compare( this.minDimensions, dimensions )
+               )
+       ) {
                this.minDimensions = ve.copy( dimensions );
                this.valid = null;
                this.emit( 'minSizeChange', dimensions );
@@ -193,7 +222,13 @@
  * @fires maxSizeChange
  */
 ve.dm.Scalable.prototype.setMaxDimensions = function ( dimensions ) {
-       if ( !this.maxDimensions || !ve.compare( this.maxDimensions, dimensions 
) ) {
+       if (
+               !this.maxDimensions ||
+               (
+                       this.isDimensionsObjectValid( dimensions ) &&
+                       !ve.compare( this.maxDimensions, dimensions )
+               )
+       ) {
                this.maxDimensions = ve.copy( dimensions );
                this.emit( 'maxSizeChange', dimensions );
                this.valid = null;
@@ -493,3 +528,24 @@
        );
        return this.valid;
 };
+
+/**
+ * Check if an object is a dimensions object.
+ * Make sure that if width or height are set, they are not 'undefined'.
+ *
+ * @param {Object} dimensions A dimensions object to test
+ * @returns {boolean} Valid or invalid dimensions object
+ */
+ve.dm.Scalable.prototype.isDimensionsObjectValid = function ( dimensions ) {
+       if (
+               dimensions &&
+               !$.isEmptyObject( dimensions ) &&
+               (
+                       dimensions.width ||
+                       dimensions.height
+               )
+       ) {
+               return true;
+       }
+       return false;
+};
diff --git a/modules/ve/ui/widgets/ve.ui.MediaSizeWidget.js 
b/modules/ve/ui/widgets/ve.ui.MediaSizeWidget.js
index 1075bc8..cbb1352 100644
--- a/modules/ve/ui/widgets/ve.ui.MediaSizeWidget.js
+++ b/modules/ve/ui/widgets/ve.ui.MediaSizeWidget.js
@@ -146,6 +146,20 @@
 
 /* Methods */
 
+/**
+ * Respond to change in original dimensions in the scalable object.
+ * Specifically, enable or disable to 'set full size' button.
+ *
+ * @param {Object} dimensions Original dimensions
+ */
+ve.ui.MediaSizeWidget.prototype.onScalableOriginalSizeChange = function ( 
dimensions ) {
+       this.fullSizeButton.setDisabled( ( !dimensions || $.isEmptyObject( 
dimensions ) ) );
+};
+
+/**
+ * Respond to default size or status change in the scalable object.
+ * @param {Boolean} isDefault Current default state
+ */
 ve.ui.MediaSizeWidget.prototype.onScalableDefaultSizeChange = function ( 
isDefault ) {
        // Update the default size into the dimensions widget
        this.updateDefaultDimensions();
@@ -277,6 +291,8 @@
        this.scalable = scalable;
        // Events
        this.scalable.connect( this, { 'defaultSizeChange': 
'onScalableDefaultSizeChange' } );
+       this.scalable.connect( this, { 'originalSizeChange': 
'onScalableOriginalSizeChange' } );
+
        // Reset current dimensions to new scalable object
        this.setCurrentDimensions( this.scalable.getCurrentDimensions() );
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1242e8dadca4f2cf2737c366034a77edc5ce308e
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Mooeypoo <mor...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to