2 lines
9.7 KiB
Plaintext
2 lines
9.7 KiB
Plaintext
)]}'
|
|
{"version":3,"sources":["reload/reload.js","reload/deprecated.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,G;AACA,kE;AACA,gE;AACA,E;AACA,sD;AACA,E;AACA,mE;AACA,uE;AACA,qE;AACA,gE;AACA,sE;AACA,mE;AACA,4C;AACA,uC;AACA,gE;AACA,4D;AACA,E;AACA,qE;AACA,qE;AACA,wE;AACA,sE;AACA,oC;AACA,E;AACA,qE;AACA,uE;AACA,2C;AACA,G;;AAEA,kE;AACA,kE;AACA,qD;AACA,4C;;AAEA,Y;;AAEA,+B;;AAEA,kB;AACA,+B;AACA,a;;AAEA,8E;AACA,8B;AACA,K;AACA,wE;AACA,wB;AACA,I;AACA,6E;AACA,I;AACA,+E;AACA,uE;AACA,sC;AACA,6C;;AAEA,iC;AACA,2B;AACA,iD;AACA,+C;AACA,U;AACA,uC;AACA,8B;AACA,G;AACA,Y;AACA,gF;AACA,4B;AACA,C;;AAEA,qB;AACA,+B;AACA,oE;AACA,E;;AAEA,yB;AACA,+B;AACA,0C;AACA,Q;AACA,mE;AACA,2B;AACA,uD;AACA,C;;AAEA,+B;AACA,oB;AACA,K;AACA,oC;AACA,uC;AACA,uD;AACA,oB;AACA,G;AACA,e;AACA,yD;AACA,C;;AAEA,+D;AACA,6C;AACA,6B;AACA,C;;;AAGA,mB;;AAEA,kC;;AAEA,wE;AACA,oE;AACA,oE;AACA,mE;AACA,oE;AACA,mE;AACA,+D;AACA,oE;AACA,2D;AACA,iE;AACA,mE;AACA,oE;AACA,6E;AACA,mE;AACA,mE;AACA,qE;AACA,mC;AACA,E;AACA,+C;AACA,kB;AACA,mD;AACA,oB;AACA,qB;AACA,G;AACA,mD;AACA,E;;AAEA,yC;AACA,iE;AACA,E;AACA,yC;AACA,wB;AACA,E;;AAEA,iD;AACA,mD;AACA,0C;AACA,0B;;AAEA,yB;AACA,qC;AACA,sB;AACA,4B;AACA,8B;AACA,gD;AACA,mB;AACA,uB;AACA,oC;AACA,wC;AACA,I;AACA,6C;AACA,yB;AACA,M;AACA,gB;AACA,E;;AAEA,e;AACA,uE;AACA,uE;AACA,iD;AACA,6D;AACA,mB;AACA,wD;AACA,6B;AACA,oC;;AAEA,O;AACA,iC;AACA,+B;AACA,uC;AACA,O;AACA,iB;AACA,0E;AACA,c;AACA,G;;AAEA,2B;AACA,S;AACA,iD;AACA,mB;AACA,wE;AACA,+E;AACA,K;AACA,U;AACA,0F;AACA,G;;AAEA,c;AACA,E;;AAEA,iD;AACA,kD;AACA,6C;AACA,iB;AACA,O;AACA,Q;AACA,a;AACA,kC;AACA,G;AACA,E;;AAEA,kE;AACA,iE;AACA,iE;AACA,mE;AACA,wB;AACA,E;AACA,sB;AACA,qC;AACA,0B;;AAEA,gB;AACA,W;AACA,mB;;AAEA,qD;AACA,8C;AACA,iE;AACA,+B;AACA,K;AACA,Q;;AAEA,c;AACA,E;;;;;;;;;;;;;;;;;;;AClOA,8E;AACA,sD;AACA,wB;AACA,kB;AACA,+B;AACA,uC;AACA,wB;AACA,E","file":"/packages/reload.js","sourcesContent":["/**\n * This code does _NOT_ support hot (session-restoring) reloads on\n * IE6,7. It only works on browsers with sessionStorage support.\n *\n * There are a couple approaches to add IE6,7 support:\n *\n * - use IE's \"userData\" mechanism in combination with window.name.\n * This mostly works, however the problem is that it can not get to the\n * data until after DOMReady. This is a problem for us since this API\n * relies on the data being ready before API users run. We could\n * refactor using Meteor.startup in all API users, but that might slow\n * page loads as we couldn't start the stream until after DOMReady.\n * Here are some resources on this approach:\n * https://github.com/hugeinc/USTORE.js\n * http://thudjs.tumblr.com/post/419577524/localstorage-userdata\n * http://www.javascriptkit.com/javatutors/domstorage2.shtml\n *\n * - POST the data to the server, and have the server send it back on\n * page load. This is nice because it sidesteps all the local storage\n * compatibility issues, however it is kinda tricky. We can use a unique\n * token in the URL, then get rid of it with HTML5 pushstate, but that\n * only works on pushstate browsers.\n *\n * This will all need to be reworked entirely when we add server-side\n * HTML rendering. In that case, the server will need to have access to\n * the client's session to render properly.\n */\n\n// XXX when making this API public, also expose a flag for the app\n// developer to know whether a hot code push is happening. This is\n// useful for apps using `window.onbeforeunload`. See\n// https://github.com/meteor/meteor/pull/657\n\nReload = {};\n\nvar KEY_NAME = 'Meteor_Reload';\n\nvar old_data = {};\n// read in old data at startup.\nvar old_json;\n\n// This logic for sessionStorage detection is based on browserstate/history.js\nvar safeSessionStorage = null;\ntry {\n // This throws a SecurityError on Chrome if cookies & localStorage are\n // explicitly disabled\n //\n // On Firefox with dom.storage.enabled set to false, sessionStorage is null\n //\n // We can't even do (typeof sessionStorage) on Chrome, it throws. So we rely\n // on the throw if sessionStorage == null; the alternative is browser\n // detection, but this seems better.\n safeSessionStorage = window.sessionStorage;\n\n // Check we can actually use it\n if (safeSessionStorage) {\n safeSessionStorage.setItem('__dummy__', '1');\n safeSessionStorage.removeItem('__dummy__');\n } else {\n // Be consistently null, for safety\n safeSessionStorage = null;\n }\n} catch(e) {\n // Expected on chrome with strict security, or if sessionStorage not supported\n safeSessionStorage = null;\n}\n\n// Exported for test.\nReload._getData = function () {\n return safeSessionStorage && safeSessionStorage.getItem(KEY_NAME);\n};\n\nif (safeSessionStorage) {\n old_json = Reload._getData();\n safeSessionStorage.removeItem(KEY_NAME);\n} else {\n // Unsupported browser (IE 6,7) or locked down security settings.\n // No session resumption.\n // Meteor._debug(\"XXX UNSUPPORTED BROWSER/SETTINGS\");\n}\n\nif (!old_json) old_json = '{}';\nvar old_parsed = {};\ntry {\n old_parsed = JSON.parse(old_json);\n if (typeof old_parsed !== \"object\") {\n Meteor._debug(\"Got bad data on reload. Ignoring.\");\n old_parsed = {};\n }\n} catch (err) {\n Meteor._debug(\"Got invalid JSON on reload. Ignoring.\");\n}\n\nif (old_parsed.reload && typeof old_parsed.data === \"object\") {\n // Meteor._debug(\"Restoring reload data.\");\n old_data = old_parsed.data;\n}\n\n\nvar providers = [];\n\n////////// External API //////////\n\n// Packages that support migration should register themselves by calling\n// this function. When it's time to migrate, callback will be called\n// with one argument, the \"retry function,\" and an optional 'option'\n// argument (containing a key 'immediateMigration'). If the package\n// is ready to migrate, it should return [true, data], where data is\n// its migration data, an arbitrary JSON value (or [true] if it has\n// no migration data this time). If the package needs more time\n// before it is ready to migrate, it should return false. Then, once\n// it is ready to migrating again, it should call the retry\n// function. The retry function will return immediately, but will\n// schedule the migration to be retried, meaning that every package\n// will be polled once again for its migration data. If they are all\n// ready this time, then the migration will happen. name must be set if there\n// is migration data. If 'immediateMigration' is set in the options\n// argument, then it doesn't matter whether the package is ready to\n// migrate or not; the reload will happen immediately without waiting\n// (used for OAuth redirect login).\n//\nReload._onMigrate = function (name, callback) {\n if (!callback) {\n // name not provided, so first arg is callback.\n callback = name;\n name = undefined;\n }\n providers.push({name: name, callback: callback});\n};\n\n// Called by packages when they start up.\n// Returns the object that was saved, or undefined if none saved.\n//\nReload._migrationData = function (name) {\n return old_data[name];\n};\n\n// Options are the same as for `Reload._migrate`.\nvar pollProviders = function (tryReload, options) {\n tryReload = tryReload || function () {};\n options = options || {};\n\n var migrationData = {};\n var remaining = _.clone(providers);\n var allReady = true;\n while (remaining.length) {\n var p = remaining.shift();\n var status = p.callback(tryReload, options);\n if (!status[0])\n allReady = false;\n if (status.length > 1 && p.name)\n migrationData[p.name] = status[1];\n };\n if (allReady || options.immediateMigration)\n return migrationData;\n else\n return null;\n};\n\n// Options are:\n// - immediateMigration: true if the page will be reloaded immediately\n// regardless of whether packages report that they are ready or not.\nReload._migrate = function (tryReload, options) {\n // Make sure each package is ready to go, and collect their\n // migration data\n var migrationData = pollProviders(tryReload, options);\n if (migrationData === null)\n return false; // not ready yet..\n\n try {\n // Persist the migration data\n var json = JSON.stringify({\n data: migrationData, reload: true\n });\n } catch (err) {\n Meteor._debug(\"Couldn't serialize data for migration\", migrationData);\n throw err;\n }\n\n if (safeSessionStorage) {\n try {\n safeSessionStorage.setItem(KEY_NAME, json);\n } catch (err) {\n // We should have already checked this, but just log - don't throw\n Meteor._debug(\"Couldn't save data for migration to sessionStorage\", err);\n }\n } else {\n Meteor._debug(\"Browser does not support sessionStorage. Not saving migration state.\");\n }\n\n return true;\n};\n\n// Allows tests to isolate the list of providers.\nReload._withFreshProvidersForTest = function (f) {\n var originalProviders = _.clone(providers);\n providers = [];\n try {\n f();\n } finally {\n providers = originalProviders;\n }\n};\n\n// Migrating reload: reload this page (presumably to pick up a new\n// version of the code or assets), but save the program state and\n// migrate it over. This function returns immediately. The reload\n// will happen at some point in the future once all of the packages\n// are ready to migrate.\n//\nvar reloading = false;\nReload._reload = function (options) {\n options = options || {};\n\n if (reloading)\n return;\n reloading = true;\n\n var tryReload = function () { _.defer(function () {\n if (Reload._migrate(tryReload, options)) {\n // Tell the browser to shut down this VM and make a new one\n window.location.reload();\n }\n }); };\n\n tryReload();\n};\n","// Reload functionality used to live on Meteor._reload. Be nice and try not to\n// break code that uses it, even though it's internal.\n// XXX COMPAT WITH 0.6.4\nMeteor._reload = {\n onMigrate: Reload._onMigrate,\n migrationData: Reload._migrationData,\n reload: Reload._reload\n};\n"]} |