Commit a5d0ac74 authored by Pascal Hartig's avatar Pascal Hartig

Flight: Update dependencies

parent 2e2ee2b3
...@@ -41,6 +41,12 @@ define( ...@@ -41,6 +41,12 @@ define(
} }
} }
function proxyEventTo(targetEvent) {
return function(e, data) {
$(e.target).trigger(targetEvent, data);
};
}
function withBase() { function withBase() {
// delegate trigger, bind and unbind to an element // delegate trigger, bind and unbind to an element
...@@ -99,6 +105,8 @@ define( ...@@ -99,6 +105,8 @@ define(
originalCb = utils.delegate( originalCb = utils.delegate(
this.resolveDelegateRules(origin) this.resolveDelegateRules(origin)
); );
} else if (typeof origin == 'string') {
originalCb = proxyEventTo(origin);
} else { } else {
originalCb = origin; originalCb = origin;
} }
...@@ -117,16 +125,13 @@ define( ...@@ -117,16 +125,13 @@ define(
callback = originalCb.bind(this); callback = originalCb.bind(this);
callback.target = originalCb; callback.target = originalCb;
callback.context = this;
// if the original callback is already branded by jQuery's guid, copy it to the context-bound version
if (originalCb.guid) {
callback.guid = originalCb.guid;
}
$element.on(type, callback); $element.on(type, callback);
// get jquery's guid from our bound fn, so unbinding will work // store every bound version of the callback
originalCb.guid = callback.guid; originalCb.bound || (originalCb.bound = []);
originalCb.bound.push(callback);
return callback; return callback;
}; };
...@@ -148,6 +153,19 @@ define( ...@@ -148,6 +153,19 @@ define(
type = arguments[0]; type = arguments[0];
} }
if (callback) {
//this callback may be the original function or a bound version
var boundFunctions = callback.target ? callback.target.bound : callback.bound || [];
//set callback to version bound against this instance
boundFunctions && boundFunctions.some(function(fn, i, arr) {
if (fn.context && (this.identity == fn.context.identity)) {
arr.splice(i, 1);
callback = fn;
return true;
}
}, this);
}
return $element.off(type, callback); return $element.off(type, callback);
}; };
...@@ -158,7 +176,7 @@ define( ...@@ -158,7 +176,7 @@ define(
if (!(r in this.attr)) { if (!(r in this.attr)) {
throw new Error('Component "' + this.toString() + '" wants to listen on "' + r + '" but no such attribute was defined.'); throw new Error('Component "' + this.toString() + '" wants to listen on "' + r + '" but no such attribute was defined.');
} }
rules[this.attr[r]] = ruleInfo[r]; rules[this.attr[r]] = (typeof ruleInfo[r] == 'string') ? proxyEventTo(ruleInfo[r]) : ruleInfo[r];
}, this); }, this);
return rules; return rules;
......
...@@ -27,7 +27,11 @@ define( ...@@ -27,7 +27,11 @@ define(
componentInfo && Object.keys(componentInfo.instances).forEach(function(k) { componentInfo && Object.keys(componentInfo.instances).forEach(function(k) {
var info = componentInfo.instances[k]; var info = componentInfo.instances[k];
// It's possible that a previous teardown caused another component to teardown,
// so we can't assume that the instances object is as it was.
if (info && info.instance) {
info.instance.teardown(); info.instance.teardown();
}
}); });
} }
...@@ -65,20 +69,10 @@ define( ...@@ -65,20 +69,10 @@ define(
}.bind(this)); }.bind(this));
} }
// define the constructor for a custom component type function prettyPrintMixins() {
// takes an unlimited number of mixin functions as arguments //could be called from constructor or constructor.prototype
// typical api call with 3 mixins: define(timeline, withTweetCapability, withScrollCapability); var mixedIn = this.mixedIn || this.prototype.mixedIn || [];
function define(/*mixins*/) { return mixedIn.map(function(mixin) {
// unpacking arguments by hand benchmarked faster
var l = arguments.length;
// add three for common mixins
var mixins = new Array(l + 3);
for (var i = 0; i < l; i++) mixins[i] = arguments[i];
var Component = function() {};
Component.toString = Component.prototype.toString = function() {
var prettyPrintMixins = mixins.map(function(mixin) {
if (mixin.name == null) { if (mixin.name == null) {
// function name property not supported by this browser, use regex // function name property not supported by this browser, use regex
var m = mixin.toString().match(functionNameRegEx); var m = mixin.toString().match(functionNameRegEx);
...@@ -87,15 +81,37 @@ define( ...@@ -87,15 +81,37 @@ define(
return (mixin.name != 'withBase') ? mixin.name : ''; return (mixin.name != 'withBase') ? mixin.name : '';
} }
}).filter(Boolean).join(', '); }).filter(Boolean).join(', ');
return prettyPrintMixins;
}; };
// define the constructor for a custom component type
// takes an unlimited number of mixin functions as arguments
// typical api call with 3 mixins: define(timeline, withTweetCapability, withScrollCapability);
function define(/*mixins*/) {
// unpacking arguments by hand benchmarked faster
var l = arguments.length;
var mixins = new Array(l);
for (var i = 0; i < l; i++) mixins[i] = arguments[i];
var Component = function() {};
Component.toString = Component.prototype.toString = prettyPrintMixins;
if (debug.enabled) { if (debug.enabled) {
Component.describe = Component.prototype.describe = Component.toString(); Component.describe = Component.prototype.describe = Component.toString();
} }
// 'options' is optional hash to be merged with 'defaults' in the component definition // 'options' is optional hash to be merged with 'defaults' in the component definition
Component.attachTo = attachTo; Component.attachTo = attachTo;
// enables extension of existing "base" Components
Component.mixin = function() {
var newComponent = define(); //TODO: fix pretty print
var newPrototype = Object.create(Component.prototype);
newPrototype.mixedIn = [].concat(Component.prototype.mixedIn);
compose.mixin(newPrototype, arguments);
newComponent.prototype = newPrototype;
newComponent.prototype.constructor = newComponent;
return newComponent;
};
Component.teardownAll = teardownAll; Component.teardownAll = teardownAll;
// prepend common mixins to supplied list, then mixin all flavors // prepend common mixins to supplied list, then mixin all flavors
......
...@@ -65,13 +65,13 @@ define( ...@@ -65,13 +65,13 @@ define(
function mixin(base, mixins) { function mixin(base, mixins) {
base.mixedIn = base.hasOwnProperty('mixedIn') ? base.mixedIn : []; base.mixedIn = base.hasOwnProperty('mixedIn') ? base.mixedIn : [];
mixins.forEach(function(mixin) { for (var i=0; i<mixins.length; i++) {
if (base.mixedIn.indexOf(mixin) == -1) { if (base.mixedIn.indexOf(mixins[i]) == -1) {
setPropertyWritability(base, false); setPropertyWritability(base, false);
mixin.call(base); mixins[i].call(base);
base.mixedIn.push(mixin); base.mixedIn.push(mixins[i]);
}
} }
});
setPropertyWritability(base, true); setPropertyWritability(base, true);
} }
......
...@@ -11,9 +11,9 @@ define( ...@@ -11,9 +11,9 @@ define(
function() { function() {
'use strict'; 'use strict';
//****************************************************************************************** // ==========================================
// Search object model // Search object model
//****************************************************************************************** // ==========================================
function traverse(util, searchTerm, options) { function traverse(util, searchTerm, options) {
options = options || {}; options = options || {};
...@@ -53,17 +53,17 @@ define( ...@@ -53,17 +53,17 @@ define(
function byValueCoerced(searchTerm, options) {search('valueCoerced', null, searchTerm, options);} function byValueCoerced(searchTerm, options) {search('valueCoerced', null, searchTerm, options);}
function custom(fn, options) {traverse(fn, null, options);} function custom(fn, options) {traverse(fn, null, options);}
//****************************************************************************************** // ==========================================
// Event logging // Event logging
//****************************************************************************************** // ==========================================
var ALL = 'all'; //no filter var ALL = 'all'; //no filter
//no logging by default //log nothing by default
var defaultEventNamesFilter = []; var logFilter = {
var defaultActionsFilter = []; eventNames: [],
actions: []
var logFilter = retrieveLogFilter(); }
function filterEventLogsByAction(/*actions*/) { function filterEventLogsByAction(/*actions*/) {
var actions = [].slice.call(arguments); var actions = [].slice.call(arguments);
...@@ -94,26 +94,32 @@ define( ...@@ -94,26 +94,32 @@ define(
} }
function saveLogFilter() { function saveLogFilter() {
try {
if (window.localStorage) { if (window.localStorage) {
localStorage.setItem('logFilter_eventNames', logFilter.eventNames); localStorage.setItem('logFilter_eventNames', logFilter.eventNames);
localStorage.setItem('logFilter_actions', logFilter.actions); localStorage.setItem('logFilter_actions', logFilter.actions);
} }
} catch (ignored) {};
} }
function retrieveLogFilter() { function retrieveLogFilter() {
var result = { var eventNames, actions;
eventNames: (window.localStorage && localStorage.getItem('logFilter_eventNames')) || defaultEventNamesFilter, try {
actions: (window.localStorage && localStorage.getItem('logFilter_actions')) || defaultActionsFilter eventNames = (window.localStorage && localStorage.getItem('logFilter_eventNames'));
}; actions = (window.localStorage && localStorage.getItem('logFilter_actions'));
} catch(ignored) {
// reconstitute arrays return;
Object.keys(result).forEach(function(k) { }
var thisProp = result[k]; eventNames && (logFilter.eventNames = eventNames);
actions && (logFilter.actions = actions);
// reconstitute arrays in place
Object.keys(logFilter).forEach(function(k) {
var thisProp = logFilter[k];
if (typeof thisProp == 'string' && thisProp !== ALL) { if (typeof thisProp == 'string' && thisProp !== ALL) {
result[k] = thisProp.split(','); logFilter[k] = thisProp ? thisProp.split(',') : [];
} }
}); });
return result;
} }
return { return {
...@@ -126,6 +132,8 @@ define( ...@@ -126,6 +132,8 @@ define(
console.info('You can configure event logging with DEBUG.events.logAll()/logNone()/logByName()/logByAction()'); console.info('You can configure event logging with DEBUG.events.logAll()/logNone()/logByName()/logByAction()');
} }
retrieveLogFilter();
window.DEBUG = this; window.DEBUG = this;
}, },
......
...@@ -27,26 +27,35 @@ define( ...@@ -27,26 +27,35 @@ define(
} }
function log(action, component, eventArgs) { function log(action, component, eventArgs) {
var name, elem, fn, logFilter, toRegExp, actionLoggable, nameLoggable; if (!window.DEBUG || !window.DEBUG.enabled) return;
var name, eventType, elem, fn, payload, logFilter, toRegExp, actionLoggable, nameLoggable, info;
if (typeof eventArgs[eventArgs.length-1] == 'function') { if (typeof eventArgs[eventArgs.length-1] == 'function') {
fn = eventArgs.pop(); fn = eventArgs.pop();
fn = fn.unbound || fn; // use unbound version if any (better info) fn = fn.unbound || fn; // use unbound version if any (better info)
} }
if (typeof eventArgs[eventArgs.length - 1] == 'object') { if (eventArgs.length == 1) {
eventArgs.pop(); // trigger data arg - not logged right now elem = component.$node[0];
eventType = eventArgs[0];
} else if ((eventArgs.length == 2) && typeof eventArgs[1] == 'object' && !eventArgs[1].type) {
//2 args, first arg is not elem
elem = component.$node[0];
eventType = eventArgs[0];
if (action == "trigger") {
payload = eventArgs[1];
} }
if (eventArgs.length == 2) {
elem = eventArgs[0];
name = eventArgs[1];
} else { } else {
elem = component.$node[0]; //2+ args, first arg is elem
name = eventArgs[0]; elem = eventArgs[0];
eventType = eventArgs[1];
if (action == "trigger") {
payload = eventArgs[2];
} }
}
name = typeof eventType == 'object' ? eventType.type : eventType;
if (window.DEBUG && window.DEBUG.enabled) {
logFilter = DEBUG.events.logFilter; logFilter = DEBUG.events.logFilter;
// no regex for you, actions... // no regex for you, actions...
...@@ -60,14 +69,12 @@ define( ...@@ -60,14 +69,12 @@ define(
logFilter.eventNames.some(function(e) {return toRegExp(e).test(name);}); logFilter.eventNames.some(function(e) {return toRegExp(e).test(name);});
if (actionLoggable && nameLoggable) { if (actionLoggable && nameLoggable) {
console.info( info = [actionSymbols[action], action, '[' + name + ']'];
actionSymbols[action], payload && info.push(payload);
action, info.push(elemToString(elem));
'[' + name + ']', info.push(component.constructor.describe.split(' ').slice(0,3).join(' '));
elemToString(elem), console.groupCollapsed && action == 'trigger' && console.groupCollapsed(action, name);
component.constructor.describe.split(' ').slice(0,3).join(' ') // two mixins only console.info.apply(console, info);
);
}
} }
} }
...@@ -75,6 +82,11 @@ define( ...@@ -75,6 +82,11 @@ define(
this.before('trigger', function() { this.before('trigger', function() {
log('trigger', this, utils.toArray(arguments)); log('trigger', this, utils.toArray(arguments));
}); });
if (console.groupCollapsed) {
this.after('trigger', function() {
console.groupEnd();
});
}
this.before('on', function() { this.before('on', function() {
log('on', this, utils.toArray(arguments)); log('on', this, utils.toArray(arguments));
}); });
......
...@@ -151,6 +151,12 @@ define( ...@@ -151,6 +151,12 @@ define(
return this.allInstances[instance.identity] || null; return this.allInstances[instance.identity] || null;
}; };
this.getBoundEventNames = function(instance) {
return this.findInstanceInfo(instance).events.map(function(ev) {
return ev.type;
});
};
this.findInstanceInfoByNode = function(node) { this.findInstanceInfoByNode = function(node) {
var result = []; var result = [];
Object.keys(this.allInstances).forEach(function(k) { Object.keys(this.allInstances).forEach(function(k) {
......
...@@ -219,13 +219,41 @@ define( ...@@ -219,13 +219,41 @@ define(
var target = $(e.target), parent; var target = $(e.target), parent;
Object.keys(rules).forEach(function(selector) { Object.keys(rules).forEach(function(selector) {
if ((parent = target.closest(selector)).length) { if (!e.isPropagationStopped() && (parent = target.closest(selector)).length) {
data = data || {}; data = data || {};
data.el = parent[0]; data.el = parent[0];
return rules[selector].apply(this, [e, data]); return rules[selector].apply(this, [e, data]);
} }
}, this); }, this);
}; };
},
// ensures that a function will only be called once.
// usage:
// will only create the application once
// var initialize = utils.once(createApplication)
// initialize();
// initialize();
//
// will only delete a record once
// var myHanlder = function () {
// $.ajax({type: 'DELETE', url: 'someurl.com', data: {id: 1}});
// };
// this.on('click', utils.once(myHandler));
//
once: function(func) {
var ran, result;
return function() {
if (ran) {
return result;
}
ran = true;
result = func.apply(this, arguments);
return result;
};
} }
}; };
......
File mode changed from 100644 to 100755
/** /**
* @license RequireJS text 2.0.10 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license. * Available via the MIT or new BSD license.
* see: http://github.com/requirejs/text for details * see: http://github.com/requirejs/text for details
*/ */
...@@ -23,7 +23,7 @@ define(['module'], function (module) { ...@@ -23,7 +23,7 @@ define(['module'], function (module) {
masterConfig = (module.config && module.config()) || {}; masterConfig = (module.config && module.config()) || {};
text = { text = {
version: '2.0.10', version: '2.0.12',
strip: function (content) { strip: function (content) {
//Strips <?xml ...?> declarations so that external SVG and XML //Strips <?xml ...?> declarations so that external SVG and XML
...@@ -162,12 +162,12 @@ define(['module'], function (module) { ...@@ -162,12 +162,12 @@ define(['module'], function (module) {
// Do not bother with the work if a build and text will // Do not bother with the work if a build and text will
// not be inlined. // not be inlined.
if (config.isBuild && !config.inlineText) { if (config && config.isBuild && !config.inlineText) {
onLoad(); onLoad();
return; return;
} }
masterConfig.isBuild = config.isBuild; masterConfig.isBuild = config && config.isBuild;
var parsed = text.parseName(name), var parsed = text.parseName(name),
nonStripName = parsed.moduleName + nonStripName = parsed.moduleName +
...@@ -257,8 +257,10 @@ define(['module'], function (module) { ...@@ -257,8 +257,10 @@ define(['module'], function (module) {
} }
callback(file); callback(file);
} catch (e) { } catch (e) {
if (errback) {
errback(e); errback(e);
} }
}
}; };
} else if (masterConfig.env === 'xhr' || (!masterConfig.env && } else if (masterConfig.env === 'xhr' || (!masterConfig.env &&
text.createXhr())) { text.createXhr())) {
...@@ -285,12 +287,14 @@ define(['module'], function (module) { ...@@ -285,12 +287,14 @@ define(['module'], function (module) {
//Do not explicitly handle errors, those should be //Do not explicitly handle errors, those should be
//visible via console output in the browser. //visible via console output in the browser.
if (xhr.readyState === 4) { if (xhr.readyState === 4) {
status = xhr.status; status = xhr.status || 0;
if (status > 399 && status < 600) { if (status > 399 && status < 600) {
//An http 4xx or 5xx error. Signal an error. //An http 4xx or 5xx error. Signal an error.
err = new Error(url + ' HTTP status: ' + status); err = new Error(url + ' HTTP status: ' + status);
err.xhr = xhr; err.xhr = xhr;
if (errback) {
errback(err); errback(err);
}
} else { } else {
callback(xhr.responseText); callback(xhr.responseText);
} }
...@@ -347,7 +351,7 @@ define(['module'], function (module) { ...@@ -347,7 +351,7 @@ define(['module'], function (module) {
typeof Components !== 'undefined' && Components.classes && typeof Components !== 'undefined' && Components.classes &&
Components.interfaces)) { Components.interfaces)) {
//Avert your gaze! //Avert your gaze!
Cc = Components.classes, Cc = Components.classes;
Ci = Components.interfaces; Ci = Components.interfaces;
Components.utils['import']('resource://gre/modules/FileUtils.jsm'); Components.utils['import']('resource://gre/modules/FileUtils.jsm');
xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc); xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment