# ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Google Safe Browsing. # # The Initial Developer of the Original Code is Google Inc. # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Aaron Boodman (original author) # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** /** * lang.js - Some missing JavaScript language features */ /** * Partially applies this function to a particular "this object" and zero or * more arguments. The result is a new function with some arguments of the first * function pre-filled and the value of |this| "pre-specified". * * Remaining arguments specified at call-time are appended to the pre- * specified ones. * * Usage: * var barMethBound = bind(myFunction, myObj, "arg1", "arg2"); * barMethBound("arg3", "arg4"); * * @param thisObj {object} Specifies the object which |this| should point to * when the function is run. If the value is null or undefined, it will default * to the global object. * * @returns {function} A partially-applied form of the function bind() was * invoked as a method of. */ function bind(fn, self, opt_args) { var boundargs = (typeof fn.boundArgs_ != "undefined") ? fn.boundArgs_ : []; boundargs = boundargs.concat(Array.prototype.slice.call(arguments, 2)); if (typeof fn.boundSelf_ != "undefined") { self = fn.boundSelf_; } if (typeof fn.boundFn_ != "undefined") { fn = fn.boundFn_; } var newfn = function() { // Combine the static args and the new args into one big array var args = boundargs.concat(Array.prototype.slice.call(arguments)); return fn.apply(self, args); } newfn.boundArgs_ = boundargs; newfn.boundSelf_ = self; newfn.boundFn_ = fn; return newfn; } /** * An alias to the bind() global function. * * Usage: * var g = f.bind(obj, arg1, arg2); * g(arg3, arg4); */ Function.prototype.bind = function(self, opt_args) { return bind.apply( null, [this, self].concat(Array.prototype.slice.call(arguments, 1))); } /** * Unbelievably, Function inheritence is broken in chrome in Firefox * (still as of FFox 1.5b1). Hence if you're working in an extension * and not using the subscriptloader, you can't use the method * above. Instead, use this global function that does roughly the same * thing. * * //XXX is this still the case? * *************************************************************************** * NOTE THE REVERSED ORDER OF FUNCTION AND OBJECT REFERENCES AS bind() * *************************************************************************** * * // Example to bind foo.bar(): * var bound = BindToObject(bar, foo, "arg1", "arg2"); * bound("arg3", "arg4"); * * @param func {string} Reference to the function to be bound * * @param obj {object} Specifies the object which |this| should point to * when the function is run. If the value is null or undefined, it will default * to the global object. * * @param opt_{...} Dummy optional arguments to make a jscompiler happy * * @returns {function} A partially-applied form of the speficied function. */ function BindToObject(func, obj, opt_A, opt_B, opt_C, opt_D, opt_E, opt_F) { // This is the sick product of Aaron's mind. Not for the feint of heart. var args = Array.prototype.splice.call(arguments, 1, arguments.length); return Function.prototype.bind.apply(func, args); } /** * Inherit the prototype methods from one constructor into another. * * Usage: * * function ParentClass(a, b) { } * ParentClass.prototype.foo = function(a) { } * * function ChildClass(a, b, c) { * ParentClass.call(this, a, b); * } * * ChildClass.inherits(ParentClass); * * var child = new ChildClass("a", "b", "see"); * child.foo(); // works * * In addition, a superclass' implementation of a method can be invoked * as follows: * * ChildClass.prototype.foo = function(a) { * ChildClass.superClass_.foo.call(this, a); * // other code * }; */ Function.prototype.inherits = function(parentCtor) { var tempCtor = function(){}; tempCtor.prototype = parentCtor.prototype; this.superClass_ = parentCtor.prototype; this.prototype = new tempCtor(); }