move old browser fixes to a separate file, and have way to startup/shutdown other modules

This commit is contained in:
Joe Walker 2010-11-23 12:33:20 +00:00
commit 1de0d55759
2 changed files with 158 additions and 107 deletions

View file

@ -37,111 +37,15 @@
define(function(require, exports, module) {
exports.startup = function(data, reason) {
// Narwhal's shim for ES5 defineProperty
// ES5 15.2.3.6
if (!Object.defineProperty) {
Object.defineProperty = function(object, property, descriptor) {
var has = Object.prototype.hasOwnProperty;
if (typeof descriptor == "object" && object.__defineGetter__) {
if (has.call(descriptor, "value")) {
if (!object.__lookupGetter__(property) && !object.__lookupSetter__(property)) {
// data property defined and no pre-existing accessors
object[property] = descriptor.value;
}
if (has.call(descriptor, "get") || has.call(descriptor, "set")) {
// descriptor has a value property but accessor already exists
throw new TypeError("Object doesn't support this action");
}
}
// fail silently if "writable", "enumerable", or "configurable"
// are requested but not supported
/*
// alternate approach:
if ( // can't implement these features; allow false but not true
!(has.call(descriptor, "writable") ? descriptor.writable : true) ||
!(has.call(descriptor, "enumerable") ? descriptor.enumerable : true) ||
!(has.call(descriptor, "configurable") ? descriptor.configurable : true)
)
throw new RangeError(
"This implementation of Object.defineProperty does not " +
"support configurable, enumerable, or writable."
);
*/
else if (typeof descriptor.get == "function") {
object.__defineGetter__(property, descriptor.get);
}
if (typeof descriptor.set == "function") {
object.__defineSetter__(property, descriptor.set);
}
}
return object;
};
}
exports.startup = function(data, reason) {
require("fixoldbrowsers").startup(data, reason);
require("types/basic").startup(data, reason);
require("canon").startup(data, reason);
};
// ES5 15.2.3.7
if (!Object.defineProperties) {
Object.defineProperties = function(object, properties) {
for (var property in properties) {
if (Object.prototype.hasOwnProperty.call(properties, property)) {
Object.defineProperty(object, property, properties[property]);
}
}
return object;
};
}
/**
* Array detector.
* Firefox 3.5 and Safari 4 have this already. Chrome 4 however ...
* Note to Dojo - your isArray is still broken: instanceof doesn't work with
* Arrays taken from a different frame/window.
*/
if (!Array.isArray) {
Array.isArray = function(data) {
return data && Object.prototype.toString.call(data) === "[object Array]";
};
}
/**
* Retrieves the list of keys on an object.
*/
if (!Object.keys) {
Object.keys = function(obj) {
var k, ret = [];
for (k in obj) {
if (obj.hasOwnProperty(k)) {
ret.push(k);
}
}
return ret;
};
}
if (!Function.prototype.bind) {
// From Narwhal
Function.prototype.bind = function () {
var args = Array.prototype.slice.call(arguments);
var self = this;
var bound = function () {
return self.call.apply(
self,
args.concat(
Array.prototype.slice.call(arguments)
)
);
};
bound.name = this.name;
bound.displayName = this.displayName;
bound.length = this.length;
bound.unbound = self;
return bound;
};
}
exports.globalsLoaded = true;
};
});
exports.shutdown(data, reason) {
require("fixoldbrowsers").shutdown(data, reason);
require("types/basic").shutdown(data, reason);
require("canon").shutdown(data, reason);
};
});