ember-appkit-rails 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ember/appkit/rails.rb +4 -0
  3. data/lib/ember/appkit/rails/engine.rb +6 -1
  4. data/lib/ember/appkit/rails/teaspoon.rb +5 -0
  5. data/lib/ember/appkit/rails/teaspoon/engine.rb +3 -0
  6. data/lib/ember/appkit/rails/teaspoon/suite.rb +7 -0
  7. data/lib/ember/appkit/rails/version.rb +1 -1
  8. data/lib/ember/appkit/rails/views/teaspoon/spec/_eak_rails.html.erb +10 -0
  9. data/lib/generators/ember/bootstrap_generator.rb +27 -9
  10. data/lib/generators/ember/component_generator.rb +2 -2
  11. data/lib/generators/ember/controller_generator.rb +4 -4
  12. data/lib/generators/ember/generator_helpers.rb +4 -0
  13. data/lib/generators/ember/install_generator.rb +150 -0
  14. data/lib/generators/ember/model_generator.rb +7 -2
  15. data/lib/generators/ember/resource_generator.rb +1 -1
  16. data/lib/generators/ember/route_generator.rb +2 -2
  17. data/lib/generators/ember/scaffold_generator.rb +17 -3
  18. data/lib/generators/ember/serializer_override.rb +18 -0
  19. data/lib/generators/ember/view_generator.rb +2 -2
  20. data/{test/dummy/config/adapters/application.js.es6.erb → lib/generators/templates/adapters/application.es6.erb} +0 -0
  21. data/lib/generators/templates/application.js.erb +1 -0
  22. data/lib/generators/templates/{array_controller.js.es6 → array_controller.es6} +0 -0
  23. data/lib/generators/templates/{component.js.es6 → component.es6} +0 -0
  24. data/lib/generators/templates/{controller.js.es6 → controller.es6} +0 -0
  25. data/lib/generators/templates/environment.js.erb +2 -0
  26. data/lib/generators/templates/environments/development.js.erb +5 -5
  27. data/lib/generators/templates/environments/production.js.erb +2 -2
  28. data/lib/generators/templates/environments/test.js.erb +1 -1
  29. data/lib/generators/templates/initializers/teaspoon.rb +63 -0
  30. data/lib/generators/templates/{model.js.es6 → model.es6} +0 -0
  31. data/lib/generators/templates/{object_controller.js.es6 → object_controller.es6} +0 -0
  32. data/lib/generators/templates/{route.js.es6 → route.es6} +0 -0
  33. data/lib/generators/templates/{router.js.es6 → router.es6} +0 -0
  34. data/lib/generators/templates/scaffold/route/{edit.js.es6 → edit.es6} +1 -1
  35. data/lib/generators/templates/scaffold/route/{index.js.es6 → index.es6} +1 -1
  36. data/lib/generators/templates/scaffold/route/{new.js.es6 → new.es6} +1 -1
  37. data/lib/generators/templates/scaffold/route/{show.js.es6 → show.es6} +1 -1
  38. data/lib/generators/templates/scaffold/template/form.hbs +3 -4
  39. data/lib/generators/templates/scaffold/template/index.hbs +2 -2
  40. data/lib/generators/templates/scaffold/template/show.hbs +2 -2
  41. data/lib/generators/templates/scaffold_controller/controller.rb +2 -2
  42. data/lib/generators/templates/test/model.es6 +7 -0
  43. data/lib/generators/templates/test/route.es6 +23 -0
  44. data/lib/generators/templates/test/teaspoon_env.rb +38 -0
  45. data/lib/generators/templates/test/test_helper.js +55 -0
  46. data/lib/generators/templates/{view.js.es6 → view.es6} +0 -0
  47. data/test/dummy/config/adapters/application.es6.erb +3 -0
  48. data/test/dummy/config/application.js +1 -0
  49. data/test/dummy/config/environment.js.erb +2 -0
  50. data/test/dummy/config/environments/development.js.erb +5 -5
  51. data/test/dummy/config/environments/production.js.erb +2 -2
  52. data/test/dummy/config/environments/test.js.erb +1 -1
  53. data/test/dummy/config/initializers/secret_token.rb +1 -1
  54. data/test/dummy/config/initializers/teaspoon.rb +63 -0
  55. data/test/dummy/config/{router.js.es6 → router.es6} +0 -0
  56. data/test/dummy/log/test.log +71 -8
  57. data/test/dummy/test/teaspoon_env.rb +38 -0
  58. data/test/dummy/test/test_helper.js +55 -0
  59. data/test/dummy/tmp/cache/assets/test/sprockets/{eeb5bd38d1dad0d908461fd114f702bc → 08230536deeb8bca57aa54c1cf9a8a67} +0 -0
  60. data/test/dummy/tmp/cache/assets/test/sprockets/0f4e288e1e01cda64059f8f521519f5a +0 -0
  61. data/test/dummy/tmp/cache/assets/test/sprockets/{492d1909e24832f58ebca96dade2a876 → 1318d49b0a8b80264cc6d140438953bf} +0 -0
  62. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  63. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  64. data/test/dummy/tmp/cache/assets/test/sprockets/39492898b23538577ff8db562a35fb7c +0 -0
  65. data/test/dummy/tmp/cache/assets/test/sprockets/3f9cb5a26b08b9e25de91fe142228ad2 +0 -0
  66. data/test/dummy/tmp/cache/assets/test/sprockets/4a1d4e32cd7b9fd1c62bfd553ae56051 +0 -0
  67. data/test/dummy/tmp/cache/assets/test/sprockets/4d3cadf0ab91b4a77adf81282a5550a1 +0 -0
  68. data/test/dummy/tmp/cache/assets/test/sprockets/{1f15c49a05b13c3a7ee50d2ac3900f38 → 571f65ff5db500e9ad70fc11060270a8} +0 -0
  69. data/test/dummy/tmp/cache/assets/test/sprockets/660bc633c8899c6c1b20514637fa0169 +0 -0
  70. data/test/dummy/tmp/cache/assets/test/sprockets/67afcba9807cd5e57b80b5fdf9f26758 +0 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/{47fb03bce147145961cb3deeafca54d7 → 7190c4707840ff0d7c60920ae9739c79} +0 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/7ca4966e0a480430a858a7ab74518c75 +0 -0
  73. data/test/dummy/tmp/cache/assets/test/sprockets/83030d43d9bff738a1a01366d61d7691 +0 -0
  74. data/test/dummy/tmp/cache/assets/test/sprockets/83af35bb6b852de883a26a9458fd4e3a +0 -0
  75. data/test/dummy/tmp/cache/assets/test/sprockets/8adfb5e646dca2c629e5d3dc88e2c2e9 +0 -0
  76. data/test/dummy/tmp/cache/assets/test/sprockets/9160f792acb62d1f7721c714681fcfe6 +0 -0
  77. data/test/dummy/tmp/cache/assets/test/sprockets/a6a0d79927cb0ec286aa0afb9812685c +0 -0
  78. data/test/dummy/tmp/cache/assets/test/sprockets/bb4a2293175928af3e23c47488077098 +0 -0
  79. data/test/dummy/tmp/cache/assets/test/sprockets/bf689240392e7355c0de5cfd47272146 +0 -0
  80. data/test/dummy/tmp/cache/assets/test/sprockets/{66c0ce49a71def0f29dcf0bcaf8fb28d → c4eca8931f39b747ea9f916a3b42d8da} +0 -0
  81. data/test/dummy/tmp/cache/assets/test/sprockets/cdbe9110f011148cc7a1f172dc18a883 +0 -0
  82. data/test/dummy/tmp/cache/assets/test/sprockets/d5a48c6656341c56cac8a8e42bb925a5 +0 -0
  83. data/test/dummy/tmp/cache/assets/test/sprockets/{d4cb455bee790d041fb3111fb1636531 → d5b1e7219e29c039a8ebb0a4e5b19a2b} +0 -0
  84. data/test/dummy/tmp/cache/assets/test/sprockets/{ce7582379ff02bb25cee3ac0486fe1f2 → d5ce5243d4ca4a3739a15e60e3c685ba} +0 -0
  85. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  86. data/test/dummy/tmp/cache/assets/test/sprockets/de0932670a6c856bc6eda1586fd29061 +0 -0
  87. data/test/dummy/tmp/cache/assets/test/sprockets/e9abb671d48f6ff2be6ffb463ea652bf +0 -0
  88. data/test/dummy/tmp/cache/assets/test/sprockets/{e36a853a1349d7f33f6c0083c05f897b → fb43f1b92235ac87bedc9ac12be00188} +0 -0
  89. data/test/dummy/tmp/generator_test_output/app/views/{post.js.es6 → post.es6} +0 -0
  90. data/test/fixtures/vcr_cassettes/fetch_ember_beta.yml +39609 -0
  91. data/test/fixtures/vcr_cassettes/fetch_ember_canary.yml +41381 -0
  92. data/test/fixtures/vcr_cassettes/fetch_ember_data_tagged.yml +4283 -0
  93. data/test/fixtures/vcr_cassettes/fetch_ember_release.yml +38824 -0
  94. data/test/fixtures/vcr_cassettes/fetch_ember_tagged.yml +29518 -0
  95. data/test/generators/bootstrap_generator_test.rb +12 -4
  96. data/test/generators/component_generator_test.rb +6 -6
  97. data/test/generators/controller_generator_test.rb +5 -5
  98. data/test/generators/install_generator_test.rb +163 -0
  99. data/test/generators/model_generator_test.rb +29 -7
  100. data/test/generators/resource_generator_test.rb +6 -6
  101. data/test/generators/route_generator_test.rb +1 -1
  102. data/test/generators/scaffold_generator_test.rb +59 -10
  103. data/test/generators/serializer_override_test.rb +19 -0
  104. data/test/generators/view_generator_test.rb +6 -6
  105. data/test/integration/engine_test.rb +4 -0
  106. data/test/support/generator_test_support.rb +2 -2
  107. data/vendor/assets/javascripts/{app.js.es6.erb → app.es6.erb} +3 -1
  108. data/vendor/assets/javascripts/ember-appkit/index.js +0 -1
  109. data/vendor/assets/javascripts/ember-appkit/resolver.js +235 -32
  110. data/vendor/assets/javascripts/fake_xml_http_request.js +473 -0
  111. data/vendor/assets/javascripts/fakehr.js +52 -0
  112. data/vendor/assets/javascripts/httpRespond.js +24 -0
  113. metadata +126 -55
  114. data/lib/generators/templates/adapter.js.erb +0 -3
  115. data/test/dummy/tmp/cache/assets/test/sprockets/10fe949cc641775f5630b5dad6deb5fc +0 -0
  116. data/test/dummy/tmp/cache/assets/test/sprockets/129b422236f443119233cdb0a4525a06 +0 -0
  117. data/test/dummy/tmp/cache/assets/test/sprockets/25b8b60341168a02f48dabd2b0aa82ad +0 -0
  118. data/test/dummy/tmp/cache/assets/test/sprockets/827fafc13575b345cc572fd041ef1fba +0 -0
  119. data/test/dummy/tmp/cache/assets/test/sprockets/83a9a7d15d681a382363d2bccb9528bb +0 -0
  120. data/test/dummy/tmp/cache/assets/test/sprockets/de94a60b438eb5bf57653f3a220acd80 +0 -0
  121. data/vendor/assets/javascripts/ember-appkit/resolver_ext.js +0 -40
@@ -0,0 +1,473 @@
1
+ (function(window, undefined){
2
+ /**
3
+ * Minimal Event interface implementation
4
+ *
5
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
6
+ * Modifications and tests by Christian Johansen.
7
+ *
8
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
9
+ * @author Christian Johansen (christian@cjohansen.no)
10
+ * @license BSD
11
+ *
12
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
13
+ */
14
+
15
+ var _Event = function Event(type, bubbles, cancelable, target) {
16
+ this.type = type;
17
+ this.bubbles = bubbles;
18
+ this.cancelable = cancelable;
19
+ this.target = target;
20
+ };
21
+
22
+ _Event.prototype = {
23
+ stopPropagation: function () {},
24
+ preventDefault: function () {
25
+ this.defaultPrevented = true;
26
+ }
27
+ };
28
+
29
+ /*
30
+ Used to set the statusText property of an xhr object
31
+ */
32
+ var httpStatusCodes = {
33
+ 100: "Continue",
34
+ 101: "Switching Protocols",
35
+ 200: "OK",
36
+ 201: "Created",
37
+ 202: "Accepted",
38
+ 203: "Non-Authoritative Information",
39
+ 204: "No Content",
40
+ 205: "Reset Content",
41
+ 206: "Partial Content",
42
+ 300: "Multiple Choice",
43
+ 301: "Moved Permanently",
44
+ 302: "Found",
45
+ 303: "See Other",
46
+ 304: "Not Modified",
47
+ 305: "Use Proxy",
48
+ 307: "Temporary Redirect",
49
+ 400: "Bad Request",
50
+ 401: "Unauthorized",
51
+ 402: "Payment Required",
52
+ 403: "Forbidden",
53
+ 404: "Not Found",
54
+ 405: "Method Not Allowed",
55
+ 406: "Not Acceptable",
56
+ 407: "Proxy Authentication Required",
57
+ 408: "Request Timeout",
58
+ 409: "Conflict",
59
+ 410: "Gone",
60
+ 411: "Length Required",
61
+ 412: "Precondition Failed",
62
+ 413: "Request Entity Too Large",
63
+ 414: "Request-URI Too Long",
64
+ 415: "Unsupported Media Type",
65
+ 416: "Requested Range Not Satisfiable",
66
+ 417: "Expectation Failed",
67
+ 422: "Unprocessable Entity",
68
+ 500: "Internal Server Error",
69
+ 501: "Not Implemented",
70
+ 502: "Bad Gateway",
71
+ 503: "Service Unavailable",
72
+ 504: "Gateway Timeout",
73
+ 505: "HTTP Version Not Supported"
74
+ };
75
+
76
+
77
+ /*
78
+ Cross-browser XML parsing. Used to turn
79
+ XML responses into Document objects
80
+ Borrowed from JSpec
81
+ */
82
+ function parseXML(text) {
83
+ var xmlDoc;
84
+
85
+ if (typeof DOMParser != "undefined") {
86
+ var parser = new DOMParser();
87
+ xmlDoc = parser.parseFromString(text, "text/xml");
88
+ } else {
89
+ xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
90
+ xmlDoc.async = "false";
91
+ xmlDoc.loadXML(text);
92
+ }
93
+
94
+ return xmlDoc;
95
+ };
96
+
97
+ /*
98
+ Without mocking, the native XMLHttpRequest object will throw
99
+ an error when attempting to set these headers. We match this behavior.
100
+ */
101
+ var unsafeHeaders = {
102
+ "Accept-Charset": true,
103
+ "Accept-Encoding": true,
104
+ "Connection": true,
105
+ "Content-Length": true,
106
+ "Cookie": true,
107
+ "Cookie2": true,
108
+ "Content-Transfer-Encoding": true,
109
+ "Date": true,
110
+ "Expect": true,
111
+ "Host": true,
112
+ "Keep-Alive": true,
113
+ "Referer": true,
114
+ "TE": true,
115
+ "Trailer": true,
116
+ "Transfer-Encoding": true,
117
+ "Upgrade": true,
118
+ "User-Agent": true,
119
+ "Via": true
120
+ };
121
+
122
+ /*
123
+ Adds an "event" onto the fake xhr object
124
+ that just calls the same-named method. This is
125
+ in case a library adds callbacks for these events.
126
+ */
127
+ function _addEventListener(eventName, xhr){
128
+ xhr.addEventListener(eventName, function (event) {
129
+ var listener = xhr["on" + eventName];
130
+
131
+ if (listener && typeof listener == "function") {
132
+ listener(event);
133
+ }
134
+ });
135
+ }
136
+
137
+ /*
138
+ Constructor for a fake window.XMLHttpRequest
139
+ */
140
+ function FakeXMLHttpRequest() {
141
+ this.readyState = FakeXMLHttpRequest.UNSENT;
142
+ this.requestHeaders = {};
143
+ this.requestBody = null;
144
+ this.status = 0;
145
+ this.statusText = "";
146
+
147
+ this._eventListeners = {};
148
+ var events = ["loadstart", "load", "abort", "loadend"];
149
+ for (var i = events.length - 1; i >= 0; i--) {
150
+ _addEventListener(events[i], this);
151
+ }
152
+ }
153
+
154
+
155
+ // These status codes are available on the native XMLHttpRequest
156
+ // object, so we match that here in case a library is relying on them.
157
+ FakeXMLHttpRequest.UNSENT = 0;
158
+ FakeXMLHttpRequest.OPENED = 1;
159
+ FakeXMLHttpRequest.HEADERS_RECEIVED = 2;
160
+ FakeXMLHttpRequest.LOADING = 3;
161
+ FakeXMLHttpRequest.DONE = 4;
162
+
163
+ FakeXMLHttpRequest.prototype = {
164
+ UNSENT: 0,
165
+ OPENED: 1,
166
+ HEADERS_RECEIVED: 2,
167
+ LOADING: 3,
168
+ DONE: 4,
169
+ async: true,
170
+
171
+ /*
172
+ Duplicates the behavior of native XMLHttpRequest's open function
173
+ */
174
+ open: function open(method, url, async, username, password) {
175
+ this.method = method;
176
+ this.url = url;
177
+ this.async = typeof async == "boolean" ? async : true;
178
+ this.username = username;
179
+ this.password = password;
180
+ this.responseText = null;
181
+ this.responseXML = null;
182
+ this.requestHeaders = {};
183
+ this.sendFlag = false;
184
+ this._readyStateChange(FakeXMLHttpRequest.OPENED);
185
+ },
186
+
187
+ /*
188
+ Duplicates the behavior of native XMLHttpRequest's addEventListener function
189
+ */
190
+ addEventListener: function addEventListener(event, listener) {
191
+ this._eventListeners[event] = this._eventListeners[event] || [];
192
+ this._eventListeners[event].push(listener);
193
+ },
194
+
195
+ /*
196
+ Duplicates the behavior of native XMLHttpRequest's removeEventListener function
197
+ */
198
+ removeEventListener: function removeEventListener(event, listener) {
199
+ var listeners = this._eventListeners[event] || [];
200
+
201
+ for (var i = 0, l = listeners.length; i < l; ++i) {
202
+ if (listeners[i] == listener) {
203
+ return listeners.splice(i, 1);
204
+ }
205
+ }
206
+ },
207
+
208
+ /*
209
+ Duplicates the behavior of native XMLHttpRequest's dispatchEvent function
210
+ */
211
+ dispatchEvent: function dispatchEvent(event) {
212
+ var type = event.type;
213
+ var listeners = this._eventListeners[type] || [];
214
+
215
+ for (var i = 0; i < listeners.length; i++) {
216
+ if (typeof listeners[i] == "function") {
217
+ listeners[i].call(this, event);
218
+ } else {
219
+ listeners[i].handleEvent(event);
220
+ }
221
+ }
222
+
223
+ return !!event.defaultPrevented;
224
+ },
225
+
226
+ /*
227
+ Duplicates the behavior of native XMLHttpRequest's setRequestHeader function
228
+ */
229
+ setRequestHeader: function setRequestHeader(header, value) {
230
+ verifyState(this);
231
+
232
+ if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
233
+ throw new Error("Refused to set unsafe header \"" + header + "\"");
234
+ }
235
+
236
+ if (this.requestHeaders[header]) {
237
+ this.requestHeaders[header] += "," + value;
238
+ } else {
239
+ this.requestHeaders[header] = value;
240
+ }
241
+ },
242
+
243
+ /*
244
+ Duplicates the behavior of native XMLHttpRequest's send function
245
+ */
246
+ send: function send(data) {
247
+ verifyState(this);
248
+
249
+ if (!/^(get|head)$/i.test(this.method)) {
250
+ if (this.requestHeaders["Content-Type"]) {
251
+ var value = this.requestHeaders["Content-Type"].split(";");
252
+ this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
253
+ } else {
254
+ this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
255
+ }
256
+
257
+ this.requestBody = data;
258
+ }
259
+
260
+ this.errorFlag = false;
261
+ this.sendFlag = this.async;
262
+ this._readyStateChange(FakeXMLHttpRequest.OPENED);
263
+
264
+ if (typeof this.onSend == "function") {
265
+ this.onSend(this);
266
+ }
267
+
268
+ this.dispatchEvent(new _Event("loadstart", false, false, this));
269
+ },
270
+
271
+ /*
272
+ Duplicates the behavior of native XMLHttpRequest's abort function
273
+ */
274
+ abort: function abort() {
275
+ this.aborted = true;
276
+ this.responseText = null;
277
+ this.errorFlag = true;
278
+ this.requestHeaders = {};
279
+
280
+ if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
281
+ this._readyStateChange(FakeXMLHttpRequest.DONE);
282
+ this.sendFlag = false;
283
+ }
284
+
285
+ this.readyState = FakeXMLHttpRequest.UNSENT;
286
+
287
+ this.dispatchEvent(new _Event("abort", false, false, this));
288
+ if (typeof this.onerror === "function") {
289
+ this.onerror();
290
+ }
291
+ },
292
+
293
+ /*
294
+ Duplicates the behavior of native XMLHttpRequest's getResponseHeader function
295
+ */
296
+ getResponseHeader: function getResponseHeader(header) {
297
+ if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
298
+ return null;
299
+ }
300
+
301
+ if (/^Set-Cookie2?$/i.test(header)) {
302
+ return null;
303
+ }
304
+
305
+ header = header.toLowerCase();
306
+
307
+ for (var h in this.responseHeaders) {
308
+ if (h.toLowerCase() == header) {
309
+ return this.responseHeaders[h];
310
+ }
311
+ }
312
+
313
+ return null;
314
+ },
315
+
316
+ /*
317
+ Duplicates the behavior of native XMLHttpRequest's getAllResponseHeaders function
318
+ */
319
+ getAllResponseHeaders: function getAllResponseHeaders() {
320
+ if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
321
+ return "";
322
+ }
323
+
324
+ var headers = "";
325
+
326
+ for (var header in this.responseHeaders) {
327
+ if (this.responseHeaders.hasOwnProperty(header) && !/^Set-Cookie2?$/i.test(header)) {
328
+ headers += header + ": " + this.responseHeaders[header] + "\r\n";
329
+ }
330
+ }
331
+
332
+ return headers;
333
+ },
334
+
335
+ /*
336
+ Places a FakeXMLHttpRequest object into the passed
337
+ state.
338
+ */
339
+ _readyStateChange: function _readyStateChange(state) {
340
+ this.readyState = state;
341
+
342
+ if (typeof this.onreadystatechange == "function") {
343
+ this.onreadystatechange();
344
+ }
345
+
346
+ this.dispatchEvent(new _Event("readystatechange"));
347
+
348
+ if (this.readyState == FakeXMLHttpRequest.DONE) {
349
+ this.dispatchEvent(new _Event("load", false, false, this));
350
+ this.dispatchEvent(new _Event("loadend", false, false, this));
351
+ }
352
+ },
353
+
354
+
355
+ /*
356
+ Sets the FakeXMLHttpRequest object's response headers and
357
+ places the object into readyState 2
358
+ */
359
+ _setResponseHeaders: function _setResponseHeaders(headers) {
360
+ this.responseHeaders = {};
361
+
362
+ for (var header in headers) {
363
+ if (headers.hasOwnProperty(header)) {
364
+ this.responseHeaders[header] = headers[header];
365
+ }
366
+ }
367
+
368
+ if (this.async) {
369
+ this._readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
370
+ } else {
371
+ this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
372
+ }
373
+ },
374
+
375
+
376
+
377
+ /*
378
+ Sets the FakeXMLHttpRequest object's response body and
379
+ if body text is XML, sets responseXML to parsed document
380
+ object
381
+ */
382
+ _setResponseBody: function _setResponseBody(body) {
383
+ verifyRequestSent(this);
384
+ verifyHeadersReceived(this);
385
+ verifyResponseBodyType(body);
386
+
387
+ var chunkSize = this.chunkSize || 10;
388
+ var index = 0;
389
+ this.responseText = "";
390
+
391
+ do {
392
+ if (this.async) {
393
+ this._readyStateChange(FakeXMLHttpRequest.LOADING);
394
+ }
395
+
396
+ this.responseText += body.substring(index, index + chunkSize);
397
+ index += chunkSize;
398
+ } while (index < body.length);
399
+
400
+ var type = this.getResponseHeader("Content-Type");
401
+
402
+ if (this.responseText && (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
403
+ try {
404
+ this.responseXML = parseXML(this.responseText);
405
+ } catch (e) {
406
+ // Unable to parse XML - no biggie
407
+ }
408
+ }
409
+
410
+ if (this.async) {
411
+ this._readyStateChange(FakeXMLHttpRequest.DONE);
412
+ } else {
413
+ this.readyState = FakeXMLHttpRequest.DONE;
414
+ }
415
+ },
416
+
417
+ /*
418
+ Forces a response on to the FakeXMLHttpRequest object.
419
+
420
+ This is the public API for faking responses. This function
421
+ takes a number status, headers object, and string body:
422
+
423
+ ```
424
+ xhr.respond(404, {Content-Type: 'text/plain'}, "Sorry. This object was not found.")
425
+
426
+ ```
427
+ */
428
+ respond: function respond(status, headers, body) {
429
+ this._setResponseHeaders(headers || {});
430
+ this.status = typeof status == "number" ? status : 200;
431
+ this.statusText = httpStatusCodes[this.status];
432
+ this._setResponseBody(body || "");
433
+ if (typeof this.onload === "function"){
434
+ this.onload();
435
+ }
436
+ }
437
+ }
438
+
439
+ function verifyState(xhr) {
440
+ if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
441
+ throw new Error("INVALID_STATE_ERR");
442
+ }
443
+
444
+ if (xhr.sendFlag) {
445
+ throw new Error("INVALID_STATE_ERR");
446
+ }
447
+ }
448
+
449
+
450
+ function verifyRequestSent(xhr) {
451
+ if (xhr.readyState == FakeXMLHttpRequest.DONE) {
452
+ throw new Error("Request done");
453
+ }
454
+ }
455
+
456
+ function verifyHeadersReceived(xhr) {
457
+ if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
458
+ throw new Error("No headers received");
459
+ }
460
+ }
461
+
462
+ function verifyResponseBodyType(body) {
463
+ if (typeof body != "string") {
464
+ var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
465
+ body + ", which is not a string.");
466
+ error.name = "InvalidBodyException";
467
+ throw error;
468
+ }
469
+ }
470
+
471
+
472
+ window.FakeXMLHttpRequest = FakeXMLHttpRequest;
473
+ })(window);