aboutsummaryrefslogtreecommitdiff
path: root/node_modules/montage/core/core.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/montage/core/core.js')
-rwxr-xr-xnode_modules/montage/core/core.js1122
1 files changed, 1122 insertions, 0 deletions
diff --git a/node_modules/montage/core/core.js b/node_modules/montage/core/core.js
new file mode 100755
index 00000000..b665f591
--- /dev/null
+++ b/node_modules/montage/core/core.js
@@ -0,0 +1,1122 @@
1/* <copyright>
2 This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3 No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
4 (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5 </copyright> */
6/**
7 @module montage/core/core
8 @requires montage/core/shim
9 @requires montage/core/uuid
10 @requires montage/core/event/binding
11 @requires montage/core/event/event-manager
12 */
13require("core/shim");
14
15/**
16 @external Object
17 */
18
19/* Ecmascript 5 Methods. Should be external as WebKit doesn't need it, and loaded automatically */
20if (!Object.create) {
21 Object._creator = function _ObjectCreator() {
22 this.__proto__ = _ObjectCreator.prototype;
23 };
24 Object.create = function(o, properties) {
25 this._creator.prototype = o || Object.prototype;
26 //Still needs to add properties....
27 return new this._creator;
28 };
29
30 Object.getPrototypeOf = function(o) {
31 return o.__proto__;
32 };
33}
34
35/**
36 @class module:montage/core/core.Montage
37 */
38var M = exports.Montage = Object.create(Object.prototype);
39
40/**
41 Creates a new Montage object.
42 @function module:montage/core/core.Montage.create
43 @param {Object} aPrototype The prototype object to create the new object from. If not specified, the prototype is the Montage prototype.
44 @param {Object} [propertyDescriptor] An object that contains the initial properties and values for the new object.
45 @returns The new object
46 @example
47 <caption>Creating a "empty" Montage object, using Montage as the prototype</caption>
48 var alpha = Montage.create();
49 @example
50 <caption>Creating a new Montage component with a property descriptor object.</caption>
51 var Button = Montage.create(Component , {
52 state: {
53 value: null
54 }
55 });
56 */
57Object.defineProperty(M, "create", {
58 configurable: true,
59 value: function(aPrototype, propertyDescriptor) {
60 if (!propertyDescriptor) {
61
62 var newObject = Object.create(typeof aPrototype === "undefined" ? this : aPrototype);
63
64 if (typeof newObject.didCreate === "function") {
65 newObject.didCreate();
66 }
67
68 if (newObject._dependenciesForProperty) {
69 newObject._dependencyListeners = {};
70 }
71
72 return newObject;
73 } else {
74 var result = Object.create(aPrototype);
75 M.defineProperties(result, propertyDescriptor);
76 return result;
77 }
78 }
79});
80
81var extendedPropertyAttributes = ["serializable", "modify"];
82
83// Extended property attributes, the property name format is "_" + attributeName + "AttributeProperties"
84/**
85@member external:Object#extendedPropertyAttributes
86*/
87extendedPropertyAttributes.forEach(function(name) {
88 Object.defineProperty(Object.prototype, "_" + name + "AttributeProperties", {
89 enumerable: false,
90 configurable: false,
91 writable: false,
92 value: {}
93 });
94});
95
96/**
97 Defines a property on a Montage object.
98 @function module:montage/core/core.Montage.defineProperty
99 @param {Object} obj The object on which to define the property.
100 @param {String} prop The name of the property to define, or modify.
101 @param {Object} descriptor A descriptor object that defines the properties being defined or modified.
102 @example
103 Montage.defineProperty(Object.prototype, "_eventListenerDescriptors", {
104 enumerable: false,
105 serializable: true,
106 value: null,
107 writable: true
108 });
109 */
110Object.defineProperty(M, "defineProperty", {
111
112 value: function(obj, prop, descriptor) {
113 var dependencies = descriptor.dependencies;
114 //reset defaults appropriately for framework.
115 if ("__proto__" in descriptor) {
116 descriptor.__proto__ = ("value" in descriptor ? (typeof descriptor.value === "function" ? _defaultFunctionValueProperty : _defaultObjectValueProperty) : _defaultAccessorProperty);
117 } else {
118 var defaults;
119 if ("value" in descriptor) {
120 if (typeof descriptor.value === "function") {
121 defaults = _defaultFunctionValueProperty;
122 } else {
123 defaults = _defaultObjectValueProperty;
124 }
125 } else {
126 defaults = _defaultAccessorProperty;
127 }
128 for (var key in defaults) {
129 if (!(key in descriptor)) {
130 descriptor[key] = defaults[key];
131 }
132 }
133 }
134
135
136 if (!descriptor.hasOwnProperty("enumerable") && prop.charAt(0) === "_") {
137 descriptor.enumerable = false;
138 }
139 if (dependencies) {
140 var i = 0,
141 independentProperty;
142
143 for (; (independentProperty = dependencies[i]); i++) {
144 M.addDependencyToProperty(obj, independentProperty, prop);
145 }
146
147 }
148
149 if ("serializable" in descriptor) {
150 // get the _serializableAttributeProperties property or creates it through the entire chain if missing.
151 getAttributeProperties(obj, "serializable")[prop] = descriptor.serializable;
152 }
153
154 if ("modify" in descriptor) {
155 getAttributeProperties(obj, "modify")[prop] = descriptor.modify;
156 }
157
158 //this is added to enable value properties with [] or Objects that are new for every instance
159 if (descriptor.distinct === true && typeof descriptor.value === "object") {
160 (function(internalProperty, value) {
161 Object.defineProperty(obj, internalProperty, {
162 enumerable: false,
163 configurable: true,
164 writable: true,
165 value: null
166 });
167 if (value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype) {
168 // we have an object literal {...}
169 if (Object.keys(value).length !== 0) {
170 Object.defineProperty(obj, prop, {
171 configurable: true,
172 get: function() {
173 //Special case for object to copy the values
174 var returnValue = this[internalProperty];
175 if (!returnValue) {
176 var k;
177 returnValue = {};
178 for (k in value) {
179 returnValue[k] = value[k];
180 }
181 this[internalProperty] = returnValue;
182 }
183 return returnValue;
184 },
185 set: function(value) {
186 this[internalProperty] = value;
187 }
188 });
189 } else {
190 Object.defineProperty(obj, prop, {
191 configurable: true,
192 get: function() {
193 return this[internalProperty] || (this[internalProperty] = {});
194 },
195 set: function(value) {
196 this[internalProperty] = value;
197 }
198 });
199 }
200
201 } else if ((value.__proto__ || Object.getPrototypeOf(value)) === __cached__arrayProto) {
202 // we have an array literal [...]
203 if (value.length !== 0) {
204 Object.defineProperty(obj, prop, {
205 configurable: true,
206 get: function() {
207 //Special case for object to copy the values
208 var returnValue = this[internalProperty];
209 if (!returnValue) {
210 var i, k;
211 returnValue = [];
212 for (i = 0; typeof (k = value[i]) !== "undefined"; i++) {
213 returnValue[i] = k;
214 }
215 this[internalProperty] = returnValue;
216 }
217 return returnValue;
218 },
219 set: function(value) {
220 this[internalProperty] = value;
221 }
222 });
223
224 } else {
225 Object.defineProperty(obj, prop, {
226 configurable: true,
227 get: function() {
228 //Special case for array as isArray fails
229 //Object.prototype.toString.call(Object.create([].__proto)) !== "[object Array]"
230 return this[internalProperty] || (this[internalProperty] = []);
231