fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-02-28 12:30 pm

[js] Old JS libraries don't play nice with other libraries on the page

[commit: http://hg.dwscoalition.org/js/rev/cdb7bebfacb1]

http://bugs.dwscoalition.org/show_bug.cgi?id=3531

Play nice: stop extending Object.prototype, so we don't break "for ( var i
in...)" loops.

Patch by [personal profile] fu.

Files modified:
  • checkallbutton.js
  • core.js
  • datasource.js
  • dom.js
  • json.js
  • selectable_table.js
  • view.js
--------------------------------------------------------------------------------
diff -r 94d9f670a934 -r cdb7bebfacb1 checkallbutton.js
--- a/checkallbutton.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/checkallbutton.js	Mon Feb 28 20:30:17 2011 +0800
@@ -14,7 +14,9 @@ CheckallButton = new Class(Object, {
   //  button => the "check all" button element
   //  parent => [optional] only check boxes that are children of this element
   init: function (opts) {
-    CheckallButton.superClass.init.apply(arguments);
+    if ( CheckallButton.superClass.init ) {
+        CheckallButton.superClass.init.apply(arguments);
+    }
 
     this.button = opts["button"];
     this.className = opts["class"];
diff -r 94d9f670a934 -r cdb7bebfacb1 core.js
--- a/core.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/core.js	Mon Feb 28 20:30:17 2011 +0800
@@ -185,47 +185,43 @@ if( !Object.prototype.hasOwnProperty ) {
 }
 
 
-Object.prototype.extend = function() {
+if ( ! defined ( window.OBJ ) ) 
+    OBJ = {};
+
+OBJ.extend = function(obj_this) {
     var a = arguments;
     for( var i = 0; i < a.length; i++ ) {
         var o = a[ i ];
         for( var p in o ) {
             try {
-                if( !this[ p ] &&
+                if( !obj_this[ p ] &&
                     (!o.hasOwnProperty || o.hasOwnProperty( p )) )
-                    this[ p ] = o[ p ];
+                    obj_this[ p ] = o[ p ];
             } catch( e ) {}
         }
     }
-    return this;
+    return obj_this;
 }
 
 
-Object.prototype.override = function() {
+OBJ.override = function(obj_this) {
     var a = arguments;
     for( var i = 0; i < a.length; i++ ) {
         var o = a[ i ];
         for( var p in o ) {
             try {
                 if( !o.hasOwnProperty || o.hasOwnProperty( p ) )
-                    this[ p ] = o[ p ];
+                    obj_this[ p ] = o[ p ];
             } catch( e ) {}
         }
     }
-    return this;
+    return obj_this;
 }
-
-
-Object.prototype.extend( {
-    init: Function.stub,
-    destroy: Function.stub
-} );
-
 
 
 /* function extensions */
 
-Function.prototype.extend( {
+OBJ.extend( Function.prototype, {
     bind: function( object ) {
         var method = this;
         return function() {
@@ -255,36 +251,37 @@ Class = function( superClass ) {
 
     // Set the constructor:
     var constructor = function() {
-        if( arguments.length )
+        if( arguments.length && this.init )
             this.init.apply( this, arguments );
     };    
     //   -- Accomplish static-inheritance:
-    constructor.override( Class );  // inherit static methods from Class
+    OBJ.override( constructor,Class );  // inherit static methods from Class
     superClass = superClass || Object; 
-    constructor.override( superClass ); // inherit static methods from the superClass 
+    OBJ.override(constructor, superClass ); // inherit static methods from the superClass 
     constructor.superClass = superClass.prototype;
     
     // Set the constructor's prototype (accomplish object-inheritance):
     constructor.prototype = new superClass();
     constructor.prototype.constructor = constructor; // rev. 0.7    
     //   -- extend prototype with Class instance methods
-    constructor.prototype.extend( Class.prototype );    
+    OBJ.extend(constructor.prototype, Class.prototype );    
     //   -- override prototype with interface methods
     for( var i = 1; i < arguments.length; i++ )
-        constructor.prototype.override( arguments[ i ] );
+        OBJ.override(constructor.prototype, arguments[ i ] );
     
     return constructor;
 }
 
 
-Class.extend( {
+OBJ.extend( Class, {
     initSingleton: function() {
         if( this.singleton )
             return this.singleton;
         this.singleton = this.singletonConstructor
             ? new this.singletonConstructor()
             : new this();
-        this.singleton.init.apply( this.singleton, arguments );
+        if ( this.singleton.init )
+            this.singleton.init.apply( this.singleton, arguments );
         return this.singleton;
     }
 } );
@@ -364,7 +361,7 @@ Class.prototype = {
 
 /* string extensions */
 
-String.extend( {
+OBJ.extend( String, {
     escapeJSChar: function( c ) {
         // try simple escaping
         switch( c ) {
@@ -426,7 +423,7 @@ String.extend( {
 } );
 
 
-String.prototype.extend( {
+OBJ.extend( String.prototype, {
     escapeJS: function() {
         return this.replace( /([^ -!#-\[\]-~])/g, function( m, c ) { return String.escapeJSChar( c ); } )
     },
@@ -506,7 +503,7 @@ String.prototype.extend( {
 
 /* extend array object */
 
-Array.extend( { 
+OBJ.extend( Array, { 
     fromPseudo: function ( args ) {
         var out = [];
         for ( var i = 0; i < args.length; i++ )
@@ -518,7 +515,7 @@ Array.extend( {
 
 /* extend array object */
 
-Array.prototype.extend( {
+OBJ.extend(Array.prototype, {
     copy: function() {
         var out = [];
         for( var i = 0; i < this.length; i++ )
@@ -713,7 +710,7 @@ Array.prototype.extend( {
 
 /* date extensions */
 
-Date.extend( {
+OBJ.extend(Date, {
     /*  iso 8601 date format parser
         this was fun to write...
         thanks to: http://www.cl.cam.ac.uk/~mgk25/iso-time.html */
@@ -763,7 +760,7 @@ Date.extend( {
 } );
 
 
-Date.prototype.extend( {
+OBJ.extend(Date.prototype, {
     getISOTimezoneOffset: function() {
         var offset = -this.getTimezoneOffset();
         var negative = false;
diff -r 94d9f670a934 -r cdb7bebfacb1 datasource.js
--- a/datasource.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/datasource.js	Mon Feb 28 20:30:17 2011 +0800
@@ -4,7 +4,8 @@ DataSource = new Class(Object, {
 DataSource = new Class(Object, {
 
   init: function (initialData) {
-    DataSource.superClass.init.apply(this, arguments);
+    if ( DataSource.superClass.init )
+        DataSource.superClass.init.apply(this, arguments);
     this.watchers = [];
     this.theData = defined(initialData) ? initialData : [];
     this.sortField = "";
diff -r 94d9f670a934 -r cdb7bebfacb1 dom.js
--- a/dom.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/dom.js	Mon Feb 28 20:30:17 2011 +0800
@@ -42,7 +42,7 @@ if( !defined( window.Node ) )
     Node = {};
 
 try {
-    Node.extend( {
+    OBJ.extend( Node, {
         ELEMENT_NODE: 1,
         ATTRIBUTE_NODE: 2,
         TEXT_NODE: 3,
@@ -60,7 +60,7 @@ if( !defined( window.DOM ) )
     DOM = {};
 
 
-DOM.extend( {
+OBJ.extend( DOM, {
     getElement: function( e ) {
         return (typeof e == "string" || typeof e == "number") ? document.getElementById( e ) : e;
     },
diff -r 94d9f670a934 -r cdb7bebfacb1 json.js
--- a/json.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/json.js	Mon Feb 28 20:30:17 2011 +0800
@@ -103,29 +103,29 @@ Array.prototype.toJSON = function( root 
 }
 
 
-Object.prototype.toJSON = function( root ) {
+OBJ.toJSON = function( obj_this, root ) {
     // crude recursion detection
     if( !root )
-        root = this;
-    else if( root == this )
+        root = obj_this;
+    else if( root == obj_this )
         return "{}";
     
     var out = [ "{" ];
-    for( var i in this ) {
-        if( typeof this[ i ] == "undefined" ||
-            (this.hasOwnProperty && !this.hasOwnProperty( i )) )
+    for( var i in obj_this ) {
+        if( typeof obj_this[ i ] == "undefined" ||
+            (obj_this.hasOwnProperty && !obj_this.hasOwnProperty( i )) )
             continue;
         if( out.length > 1 )
             out.push( "," );
-        out.push( i.toJSON() );
+        out.push( OBJ.toJSON(i) );
         if( this[ i ] == null )
             out.push( ":null" );
-        else if( typeof this[ i ] == "function" )
+        else if( typeof obj_this[ i ] == "function" )
             continue;
-        else if( !this[ i ].toJSON )
+        else if( !OBJ.toJSON(obj_this[ i ]) )
             out.push( ":{}" );
         else
-            out.push( ":", this[ i ].toJSON( root ) );
+            out.push( ":", OBJ.toJSON(this[ i ], root) );
     }
     out.push( "}" );
     return out.join( "" );
diff -r 94d9f670a934 -r cdb7bebfacb1 selectable_table.js
--- a/selectable_table.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/selectable_table.js	Mon Feb 28 20:30:17 2011 +0800
@@ -19,7 +19,8 @@ SelectableTable = new Class(DataSource, 
     //       you can specify the class of your checkboxes to make them stay in sync
     //   selectableItem: What type of elements can be selected. Values are "cell" or "row"
     init: function (opts) {
-        SelectableTable.superClass.init.apply(this, []);
+        if ( SelectableTable.superClass.init )
+            SelectableTable.superClass.init.apply(this, []);
 
         var table = opts.table;
         var selectableClass = opts.selectableClass;
diff -r 94d9f670a934 -r cdb7bebfacb1 view.js
--- a/view.js	Mon Feb 28 14:10:05 2011 +0800
+++ b/view.js	Mon Feb 28 20:30:17 2011 +0800
@@ -4,7 +4,8 @@ View = new Class(Object, {
 View = new Class(Object, {
 
   init: function (opts) {
-    View.superClass.init.apply(this, arguments);
+    if ( View.superClass.init )
+        View.superClass.init.apply(this, arguments);
     this.watchers = [];
     this.datasource = opts.datasource;
     this.view = opts.view;
--------------------------------------------------------------------------------