summaryrefslogtreecommitdiff
path: root/lib/dojo/request/registry.js.uncompressed.js
blob: b5d28f3e742762398bf7cf5e476da9791c97cf6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
define("dojo/request/registry", [
	'require',
	'../_base/array',
	'./default!platform',
	'./util'
], function(require, array, fallbackProvider, util){
	var providers = [];

	function request(url, options){
		var matchers = providers.slice(0),
			i = 0,
			matcher;

		while(matcher=matchers[i++]){
			if(matcher(url, options)){
				return matcher.request.call(null, url, options);
			}
		}

		return fallbackProvider.apply(null, arguments);
	}

	function createMatcher(match, provider){
		var matcher;

		if(provider){
			if(match.test){
				// RegExp
				matcher = function(url){
					return match.test(url);
				};
			}else if(match.apply && match.call){
				matcher = function(){
					return match.apply(null, arguments);
				};
			}else{
				matcher = function(url){
					return url === match;
				};
			}

			matcher.request = provider;
		}else{
			// If only one argument was passed, assume it is a provider function
			// to apply unconditionally to all URLs
			matcher = function(){
				return true;
			};

			matcher.request = match;
		}

		return matcher;
	}

	request.register = function(url, provider, first){
		var matcher = createMatcher(url, provider);
		providers[(first ? 'unshift' : 'push')](matcher);

		return {
			remove: function(){
				var idx;
				if(~(idx = array.indexOf(providers, matcher))){
					providers.splice(idx, 1);
				}
			}
		};
	};

	request.load = function(id, parentRequire, loaded, config){
		if(id){
			// if there's an id, load and set the fallback provider
			require([id], function(fallback){
				fallbackProvider = fallback;
				loaded(request);
			});
		}else{
			loaded(request);
		}
	};

	util.addCommonMethods(request);

	return request;
});