]> git.proxmox.com Git - extjs.git/blame - extjs/templates/executive-dashboard/.sencha/app/microloader/production.js
add extjs 6.0.1 sources
[extjs.git] / extjs / templates / executive-dashboard / .sencha / app / microloader / production.js
CommitLineData
6527f429
DM
1/**\r
2 * Sencha Blink\r
3 * @author Jacky Nguyen <jacky@sencha.com>\r
4 */\r
5(function(global) {\r
6 var emptyFn = function(){},\r
7 callbacks = [],\r
8 doc = global.document,\r
9 head = doc.head || doc.getElementsByTagName('head')[0],\r
10 addWindowListener = global.addEventListener,\r
11 removeWindowListener = global.removeEventListener,\r
12 jsonParse = JSON.parse,\r
13 a = doc.createElement('a'),\r
14 documentLocation = doc.location,\r
15 documentUri = documentLocation.protocol + '//' + documentLocation.hostname + documentLocation.pathname + documentLocation.search,\r
16 manifestFile = 'app.json',\r
17 isRefreshing = false,\r
18 activeManifest, appCache, storage;\r
19\r
20 try {\r
21 storage = global.localStorage;\r
22 appCache = global.applicationCache;\r
23 }\r
24 catch(e) {}\r
25\r
26 function getManifestStorageKey(id) {\r
27 return id + '-' + documentUri + manifestFile;\r
28 }\r
29\r
30 function Manifest(manifest) {\r
31 var manifestContent;\r
32\r
33 if (typeof manifest == 'string') {\r
34 manifestContent = manifest;\r
35 manifest = jsonParse(manifestContent);\r
36 }\r
37 else {\r
38 manifestContent = JSON.stringify(manifest);\r
39 }\r
40\r
41 var applicationId = manifest.id,\r
42 key = getManifestStorageKey(applicationId),\r
43 assetMap = {};\r
44\r
45 function processAsset(asset) {\r
46 var uri;\r
47\r
48 if (typeof asset == 'string') {\r
49 asset = {\r
50 path: asset\r
51 };\r
52 }\r
53\r
54 if (asset.shared) {\r
55 asset.version = asset.shared;\r
56 uri = asset.shared + asset.path;\r
57 }\r
58 else {\r
59 uri = toAbsoluteUri(asset.path);\r
60 }\r
61\r
62 asset.uri = uri;\r
63 asset.key = applicationId + '-' + uri;\r
64 assetMap[uri] = asset;\r
65\r
66 return asset;\r
67 }\r
68\r
69 function processAssets(assets, type) {\r
70 var ln = assets.length,\r
71 i, asset;\r
72\r
73 for (i = 0; i < ln; i++) {\r
74 asset = assets[i];\r
75\r
76 assets[i] = asset = processAsset(asset);\r
77\r
78 asset.type = type;\r
79 asset.index = i;\r
80 asset.collection = assets;\r
81 asset.ready = false;\r
82 asset.evaluated = false;\r
83 }\r
84\r
85 return assets;\r
86 }\r
87\r
88 this.key = key;\r
89 this.css = processAssets(manifest.css, 'css');\r
90 this.js = processAssets(manifest.js, 'js');\r
91\r
92 Ext.microloaded = true;\r
93\r
94 var filterPlatform = window.Ext.filterPlatform = function(platform) {\r
95 var profileMatch = false,\r
96 ua = navigator.userAgent,\r
97 j, jln;\r
98\r
99 platform = [].concat(platform);\r
100\r
101 function isPhone(ua) {\r
102 var isMobile = /Mobile(\/|\s)/.test(ua);\r
103\r
104 // Either:\r
105 // - iOS but not iPad\r
106 // - Android 2\r
107 // - Android with "Mobile" in the UA\r
108\r
109 return /(iPhone|iPod)/.test(ua) ||\r
110 (!/(Silk)/.test(ua) && (/(Android)/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) ||\r
111 (/(BlackBerry|BB)/.test(ua) && isMobile) ||\r
112 /(Windows Phone)/.test(ua);\r
113 }\r
114\r
115 function isTablet(ua) {\r
116 return !isPhone(ua) && (/iPad/.test(ua) || /Android|Silk/.test(ua) || /(RIM Tablet OS)/.test(ua) ||\r
117 (/MSIE 10/.test(ua) && /; Touch/.test(ua)));\r
118 }\r
119\r
120 // Check if the ?platform parameter is set in the URL\r
121 var paramsString = window.location.search.substr(1),\r
122 paramsArray = paramsString.split("&"),\r
123 params = {},\r
124 testPlatform, i;\r
125\r
126 for (i = 0; i < paramsArray.length; i++) {\r
127 var tmpArray = paramsArray[i].split("=");\r
128 params[tmpArray[0]] = tmpArray[1];\r
129 }\r
130\r
131 testPlatform = params.platform;\r
132 if (testPlatform) {\r
133 return platform.indexOf(testPlatform) != -1;\r
134 }\r
135\r
136 for (j = 0, jln = platform.length; j < jln; j++) {\r
137 switch (platform[j]) {\r
138 case 'phone':\r
139 profileMatch = isPhone(ua);\r
140 break;\r
141 case 'tablet':\r
142 profileMatch = isTablet(ua);\r
143 break;\r
144 case 'desktop':\r
145 profileMatch = !isPhone(ua) && !isTablet(ua);\r
146 break;\r
147 case 'ios':\r
148 profileMatch = /(iPad|iPhone|iPod)/.test(ua);\r
149 break;\r
150 case 'android':\r
151 profileMatch = /(Android|Silk)/.test(ua);\r
152 break;\r
153 case 'blackberry':\r
154 profileMatch = /(BlackBerry|BB)/.test(ua);\r
155 break;\r
156 case 'safari':\r
157 profileMatch = /Safari/.test(ua) && !(/(BlackBerry|BB)/.test(ua));\r
158 break;\r
159 case 'chrome':\r
160 profileMatch = /Chrome/.test(ua);\r
161 break;\r
162 case 'ie10':\r
163 profileMatch = /MSIE 10/.test(ua);\r
164 break;\r
165 case 'windows':\r
166 profileMatch = /MSIE 10/.test(ua) || /Trident/.test(ua);\r
167 break;\r
168 case 'tizen':\r
169 profileMatch = /Tizen/.test(ua);\r
170 break;\r
171 case 'firefox':\r
172 profileMatch = /Firefox/.test(ua);\r
173 }\r
174 if (profileMatch) {\r
175 return true;\r
176 }\r
177 }\r
178 return false;\r
179 };\r
180\r
181 this.css = this.css.filter(function(css) {\r
182 var platform = css.platform,\r
183 exclude = css.exclude;\r
184\r
185 css.type = "css";\r
186\r
187 if (platform) {\r
188 if (filterPlatform(platform) && !filterPlatform(exclude)) {\r
189 if(!Ext.theme) {\r
190 Ext.theme = {};\r
191 }\r
192 if(!Ext.theme.name) {\r
193 Ext.theme.name = css.theme || 'Default';\r
194 }\r
195 return true;\r
196 }\r
197 css.filtered = true;\r
198 return false;\r
199 }\r
200 return true;\r
201 });\r
202\r
203 this.js = this.js.filter(function(js) {\r
204 var platform = js.platform,\r
205 exclude = js.exclude;\r
206\r
207 js.type = "js";\r
208\r
209 if (platform) {\r
210 if (filterPlatform(platform) && !filterPlatform(exclude)) {\r
211 return true;\r
212 }\r
213 else {\r
214 js.filtered = true;\r
215 return false;\r
216 }\r
217 }\r
218 return true;\r
219 });\r
220\r
221 this.assets = this.css.concat(this.js);\r
222 this.getAsset = function(uri) {\r
223 return assetMap[uri];\r
224 };\r
225 this.store = function() {\r
226 store(key, manifestContent);\r
227 };\r
228 }\r
229\r
230 if (typeof global.Ext === 'undefined') {\r
231 var Ext = global.Ext = {};\r
232 }\r
233\r
234 function toAbsoluteUri(uri) {\r
235 a.href = uri;\r
236 return a.href;\r
237 }\r
238\r
239 function addMeta(name, content) {\r
240 var meta = document.createElement('meta');\r
241\r
242 meta.setAttribute('name', name);\r
243 meta.setAttribute('content', content);\r
244 head.appendChild(meta);\r
245 }\r
246\r
247 function request(uri, isShared, onSuccess, onFailure) {\r
248 (isShared ? requestIframe : requestXhr)(uri, onSuccess, onFailure);\r
249 }\r
250\r
251 function requestXhr(uri, onSuccess, onFailure) {\r
252 var xhr = new XMLHttpRequest();\r
253\r
254 onFailure = onFailure || emptyFn;\r
255\r
256 uri = uri + ((uri.indexOf('?') == -1) ? '?' : '&') + Date.now();\r
257\r
258 try {\r
259 xhr.open('GET', uri, true);\r
260 xhr.onreadystatechange = function() {\r
261 if (xhr.readyState == 4) {\r
262 var status = xhr.status,\r
263 content = xhr.responseText;\r
264\r
265 if ((status >= 200 && status < 300) || status == 304 || (status == 0 && content.length > 0)) {\r
266 onSuccess(content);\r
267 }\r
268 else {\r
269 onFailure();\r
270 }\r
271 }\r
272 };\r
273 xhr.send(null);\r
274 } catch (e) {\r
275 onFailure();\r
276 }\r
277 }\r
278\r
279 function requestIframe(uri, onSuccess) {\r
280 var iframe = doc.createElement('iframe');\r
281\r
282 callbacks.push({\r
283 iframe: iframe,\r
284 callback: onSuccess\r
285 });\r
286\r
287 iframe.src = uri + '.html';\r
288 iframe.style.cssText = 'width:0;height:0;border:0;position:absolute;z-index:-999;visibility:hidden';\r
289 doc.body.appendChild(iframe);\r
290 }\r
291\r
292 // for remote assets, inject a script element\r
293 function addRemoteScript(uri, onSuccess, onFailure) {\r
294 var script = document.createElement('script');\r
295 script.src = uri;\r
296 script.type = "text/javascript";\r
297 script.charset = "UTF-8";\r
298\r
299 script.onerror = onFailure;\r
300\r
301 if ('addEventListener' in script ) {\r
302 script.onload = onSuccess;\r
303 } else if ('readyState' in script) {\r
304 script.onreadystatechange = function() {\r
305 if (this.readyState === 'loaded' ||\r
306 this.readyState === 'complete') {\r
307 onSuccess();\r
308 }\r
309 };\r
310 } else {\r
311 script.onload = onSuccess;\r
312 }\r
313\r
314 head.appendChild(script);\r
315 }\r
316\r
317 function addRemoteLink(uri) {\r
318 var link = document.createElement('link');\r
319 link.rel = "stylesheet";\r
320 link.href = uri;\r
321 head.appendChild(link);\r
322 }\r
323\r
324 function requestAsset(asset, onSuccess, onFailure) {\r
325 var isRemote = !!asset.remote,\r
326 isShared = !!asset.shared;\r
327\r
328 if (isRemote) {\r
329 if(asset.type === "js") {\r
330 addRemoteScript(asset.uri, function(){\r
331 onSuccess('');\r
332 }, onFailure);\r
333 } else {\r
334 addRemoteLink(asset.uri);\r
335 onSuccess('');\r
336 }\r
337 return;\r
338 }\r
339\r
340 if (!isShared && asset.version && asset.version.length) {\r
341 var onRequestSuccess = onSuccess,\r
342 version = asset.version,\r
343 versionLn = version.length,\r
344 checksumFail, checksumType;\r
345\r
346 onSuccess = function(content) {\r
347 checksumType = content.substring(0, 1);\r
348 if (checksumType == '/') {\r
349 if (content.substring(2, versionLn + 2) !== version) {\r
350 checksumFail = true;\r
351 }\r
352 }\r
353 else if (checksumType == 'f') {\r
354 if (content.substring(10, versionLn + 10) !== version) {\r
355 checksumFail = true;\r
356 }\r
357 }\r
358 else if (checksumType == '.') {\r
359 if (content.substring(1, versionLn + 1) !== version) {\r
360 checksumFail = true;\r
361 }\r
362 }\r
363 if (checksumFail === true) {\r
364 if (confirm("Requested: '" + asset.uri + " seems to have been changed. Attempt to refresh the application?")) {\r
365 refresh();\r
366 }\r
367 return;\r
368 }\r
369 onRequestSuccess(content);\r
370 };\r
371 }\r
372\r
373 request(asset.uri, isShared, onSuccess, onFailure);\r
374 }\r
375\r
376 function onMessage(e) {\r
377 var data = e.data,\r
378 sourceWindow = e.source.window,\r
379 i, ln, callback, iframe;\r
380\r
381 for (i = 0, ln = callbacks.length; i < ln; i++) {\r
382 callback = callbacks[i];\r
383 iframe = callback.iframe;\r
384\r
385 if (iframe.contentWindow === sourceWindow) {\r
386 callback.callback(data);\r
387 doc.body.removeChild(iframe);\r
388 callbacks.splice(i, 1);\r
389 return;\r
390 }\r
391 }\r
392 }\r
393\r
394 function patch(content, delta) {\r
395 var output = [],\r
396 chunk, i, ln;\r
397\r
398 if (delta.length === 0) {\r
399 return content;\r
400 }\r
401\r
402 for (i = 0,ln = delta.length; i < ln; i++) {\r
403 chunk = delta[i];\r
404\r
405 if (typeof chunk === 'number') {\r
406 output.push(content.substring(chunk, chunk + delta[++i]));\r
407 }\r
408 else {\r
409 output.push(chunk);\r
410 }\r
411 }\r
412\r
413 return output.join('');\r
414 }\r
415\r
416 function log(message) {\r
417 if (typeof console != 'undefined') {\r
418 (console.error || console.log).call(console, message);\r
419 }\r
420 }\r
421\r
422 function store(key, value) {\r
423 try {\r
424 storage.setItem(key, value);\r
425 }\r
426 catch (e) {\r
427 if (storage && e.code == e.QUOTA_EXCEEDED_ERR && activeManifest) {\r
428 log("LocalStorage Quota exceeded, cannot store " + key + " locally");\r
429 // Quota exceeded, clean up unused items\r
430// var items = activeManifest.assets.map(function(asset) {\r
431// return asset.key;\r
432// }),\r
433// i = 0,\r
434// ln = storage.length,\r
435// cleaned = false,\r
436// item;\r
437//\r
438// items.push(activeManifest.key);\r
439//\r
440// while (i <= ln - 1) {\r
441// item = storage.key(i);\r
442//\r
443// if (items.indexOf(item) == -1) {\r
444// storage.removeItem(item);\r
445// cleaned = true;\r
446// ln--;\r
447// }\r
448// else {\r
449// i++;\r
450// }\r
451// }\r
452\r
453 // Done cleaning up, attempt to store the value again\r
454 // If there's still not enough space, no other choice\r
455 // but to skip this item from being stored\r
456// if (cleaned) {\r
457// store(key, value);\r
458// }\r
459 }\r
460 }\r
461 }\r
462\r
463 function retrieve(key) {\r
464 try {\r
465 return storage.getItem(key);\r
466 }\r
467 catch (e) {\r
468 // Private browsing mode\r
469 return null;\r
470 }\r
471 }\r
472\r
473 function retrieveAsset(asset) {\r
474 return retrieve(asset.key);\r
475 }\r
476\r
477 function storeAsset(asset, content) {\r
478 return store(asset.key, content);\r
479 }\r
480\r
481 function refresh() {\r
482 if (!isRefreshing) {\r
483 isRefreshing = true;\r
484 requestXhr(manifestFile, function(content) {\r
485 new Manifest(content).store();\r
486 global.location.reload();\r
487 });\r
488 }\r
489 }\r
490\r
491 function blink(currentManifest) {\r
492 var currentAssets = currentManifest.assets,\r
493 assetsCount = currentAssets.length,\r
494 newManifest;\r
495\r
496 activeManifest = currentManifest;\r
497\r
498 addWindowListener('message', onMessage, false);\r
499\r
500 function onAssetReady(asset, content) {\r
501 var assets = asset.collection,\r
502 index = asset.index,\r
503 ln = assets.length,\r
504 i;\r
505\r
506 asset.ready = true;\r
507 asset.content = content;\r
508\r
509 for (i = index - 1; i >= 0; i--) {\r
510 asset = assets[i];\r
511 if (!asset.filtered && (!asset.ready || !asset.evaluated)) {\r
512 return;\r
513 }\r
514 }\r
515\r
516 for (i = index; i < ln; i++) {\r
517 asset = assets[i];\r
518 if (asset.ready) {\r
519 if (!asset.evaluated) {\r
520 evaluateAsset(asset);\r
521 }\r
522 }\r
523 else {\r
524 return;\r
525 }\r
526 }\r
527 }\r
528\r
529 function evaluateAsset(asset) {\r
530 asset.evaluated = true;\r
531\r
532 if (asset.type == 'js') {\r
533 try {\r
534 asset.content = asset.content + "\n//# sourceURL=" + asset.uri + "\n";\r
535 eval.call(window, asset.content);\r
536 }\r
537 catch (e) {\r
538 log("Error evaluating " + asset.uri + " with message: " + e);\r
539 }\r
540 }\r
541 else {\r
542 var style = doc.createElement('style'),\r
543 base;\r
544\r
545 style.type = 'text/css';\r
546 asset.content = asset.content + "\n/*# sourceURL=" + asset.uri + " */\n";\r
547 style.textContent = asset.content;\r
548\r
549 if ('id' in asset) {\r
550 style.id = asset.id;\r
551 }\r
552\r
553 if ('disabled' in asset) {\r
554 style.disabled = asset.disabled;\r
555 }\r
556\r
557 base = document.createElement('base');\r
558 base.href = asset.path.replace(/\/[^\/]*$/, '/');\r
559 head.appendChild(base);\r
560 head.appendChild(style);\r
561 head.removeChild(base);\r
562 }\r
563\r
564 delete asset.content;\r
565\r
566 if (--assetsCount == 0) {\r
567 onReady();\r
568 }\r
569 }\r
570\r
571 function onReady() {\r
572 var updatingAssets = [],\r
573 appCacheReady = false,\r
574 onAppCacheIdle = function() {},\r
575 onAppCacheReady = function() {\r
576 appCache.swapCache();\r
577 appCacheReady = true;\r
578 onAppCacheIdle();\r
579 },\r
580 updatingCount;\r
581\r
582 removeWindowListener('message', onMessage, false);\r
583\r
584 if (appCache.status == appCache.UPDATEREADY) {\r
585 onAppCacheReady();\r
586 }\r
587 else if (appCache.status == appCache.CHECKING || appCache.status == appCache.DOWNLOADING) {\r
588 appCache.onupdateready = onAppCacheReady;\r
589 appCache.onnoupdate = appCache.onobsolete = function() {\r
590 onAppCacheIdle();\r
591 };\r
592 }\r
593\r
594 function notifyUpdateIfAppCacheReady() {\r
595 if (appCacheReady) {\r
596 notifyUpdate();\r
597 }\r
598 }\r
599\r
600 function notifyUpdate() {\r
601 var updatedCallback = Ext.onUpdated || emptyFn;\r
602\r
603 if ('onSetup' in Ext) {\r
604 Ext.onSetup(updatedCallback);\r
605 }\r
606 else {\r
607 updatedCallback();\r
608 }\r
609 }\r
610\r
611 function doUpdate() {\r
612 newManifest.store();\r
613\r
614 updatingAssets.forEach(function(asset) {\r
615 storeAsset(asset, asset.content);\r
616 });\r
617\r
618 notifyUpdate();\r
619 }\r
620\r
621 function onAssetUpdated(asset, content) {\r
622 asset.content = content;\r
623\r
624 if (--updatingCount == 0) {\r
625 if (appCache.status == appCache.IDLE) {\r
626 doUpdate();\r
627 }\r
628 else {\r
629 onAppCacheIdle = doUpdate;\r
630 }\r
631 }\r
632 }\r
633\r
634 function checkForUpdate() {\r
635 removeWindowListener('online', checkForUpdate, false);\r
636 requestXhr(manifestFile, function(manifestContent) {\r
637 activeManifest = newManifest = new Manifest(manifestContent);\r
638\r
639 var assets = newManifest.assets,\r
640 currentAsset;\r
641\r
642 assets.forEach(function(asset) {\r
643 currentAsset = currentManifest.getAsset(asset.uri);\r
644\r
645 if (!currentAsset || asset.version !== currentAsset.version) {\r
646 updatingAssets.push(asset);\r
647 }\r
648 });\r
649\r
650 updatingCount = updatingAssets.length;\r
651\r
652 if (updatingCount == 0) {\r
653 if (appCache.status == appCache.IDLE) {\r
654 notifyUpdateIfAppCacheReady();\r
655 }\r
656 else {\r
657 onAppCacheIdle = notifyUpdateIfAppCacheReady;\r
658 }\r
659 return;\r
660 }\r
661\r
662 updatingAssets.forEach(function(asset) {\r
663 var currentAsset = currentManifest.getAsset(asset.uri),\r
664 path = asset.path,\r
665 update = asset.update;\r
666\r
667 function updateFull() {\r
668 requestAsset(asset, function(content) {\r
669 onAssetUpdated(asset, content);\r
670 });\r
671 }\r
672\r
673 // New asset (never used before)\r
674 // OR Shared from CDN\r
675 // OR Missing local storage\r
676 // OR Full update\r
677 if (!currentAsset || !update || retrieveAsset(asset) === null || update != 'delta') {\r
678 updateFull();\r
679 }\r
680 else {\r
681 requestXhr('deltas/' + path + '/' + currentAsset.version + '.json',\r
682 function(content) {\r
683 try {\r
684 onAssetUpdated(asset, patch(retrieveAsset(asset), jsonParse(content)));\r
685 }\r
686 catch (e) {\r
687 log("Malformed delta content received for " + asset.uri);\r
688 }\r
689 },\r
690 updateFull\r
691 );\r
692 }\r
693 })\r
694 });\r
695 }\r
696\r
697 if (navigator.onLine !== false) {\r
698 checkForUpdate();\r
699 }\r
700 else {\r
701 addWindowListener('online', checkForUpdate, false);\r
702 }\r
703 }\r
704\r
705 if (assetsCount == 0) {\r
706 onReady();\r
707 return;\r
708 }\r
709\r
710 currentAssets.forEach(function(asset) {\r
711 var content = retrieveAsset(asset);\r
712\r
713 if (content === null) {\r
714 requestAsset(asset, function(content) {\r
715 if (!asset.remote) {\r
716 storeAsset(asset, content);\r
717 }\r
718 onAssetReady(asset, content);\r
719 }, function() {\r
720 onAssetReady(asset, '');\r
721 });\r
722 }\r
723 else {\r
724 onAssetReady(asset, content);\r
725 }\r
726 });\r
727 }\r
728\r
729 function blinkOnDomReady(manifest) {\r
730 if (navigator.userAgent.match(/IEMobile\/10\.0/)) {\r
731 var msViewportStyle = document.createElement("style");\r
732 msViewportStyle.appendChild(\r
733 document.createTextNode(\r
734 "@media screen and (orientation: portrait) {" +\r
735 "@-ms-viewport {width: 320px !important;}" +\r
736 "}" +\r
737 "@media screen and (orientation: landscape) {" +\r
738 "@-ms-viewport {width: 560px !important;}" +\r
739 "}"\r
740 )\r
741 );\r
742 document.getElementsByTagName("head")[0].appendChild(msViewportStyle);\r
743 }\r
744\r
745 var readyStateRe = (/MSIE 10/.test(navigator.userAgent)) ? /complete|loaded/ : /interactive|complete|loaded/;\r
746 if (doc.readyState.match(readyStateRe) !== null) {\r
747 blink(manifest);\r
748 }\r
749 else {\r
750 addWindowListener('DOMContentLoaded', function() {\r
751 if (navigator.standalone) {\r
752 // When running from Home Screen, the splash screen will not disappear until all\r
753 // external resource requests finish.\r
754 // The first timeout clears the splash screen\r
755 // The second timeout allows inital HTML content to be displayed\r
756 setTimeout(function() {\r
757 setTimeout(function() {\r
758 blink(manifest);\r
759 }, 1);\r
760 }, 1);\r
761 }\r
762 else {\r
763 setTimeout(function() {\r
764 blink(manifest);\r
765 }, 1);\r
766 }\r
767 }, false);\r
768 }\r
769 }\r
770\r
771 Ext.blink = function(manifest) {\r
772 var manifestContent = retrieve(getManifestStorageKey(manifest.id));\r
773\r
774 addMeta('viewport', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no');\r
775 addMeta('apple-mobile-web-app-capable', 'yes');\r
776 addMeta('apple-touch-fullscreen', 'yes');\r
777\r
778 if (manifestContent) {\r
779 manifest = new Manifest(manifestContent);\r
780 blinkOnDomReady(manifest);\r
781 }\r
782 else {\r
783 requestXhr(manifestFile, function(content) {\r
784 manifest = new Manifest(content);\r
785 manifest.store();\r
786 blinkOnDomReady(manifest);\r
787 });\r
788 }\r
789 };\r
790})(this);