Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save JeremyPlease/72cb3bf98279fefed4e3 to your computer and use it in GitHub Desktop.
Save JeremyPlease/72cb3bf98279fefed4e3 to your computer and use it in GitHub Desktop.
/**
* This patch works around iOS9 UIWebView regression that causes infinite digest errors in Angular.
*
* The patch can be applied to Angular 1.2.0 – 1.4.5. Newer versions of Angular have the workaround baked in.
*
* To apply this patch load/bundle this file with your application and add a dependency on the "ngIOS9Patch" module
* to your main app module.
*
* For example:
*
* ```
* angular.module('myApp', ['ngRoute'])`
* ```
*
* becomes
*
* ```
* angular.module('myApp', ['ngRoute', 'ngIOS9UIWebViewPatch'])
* ```
*
*
* More info:
* - https://openradar.appspot.com/22186109
* - https://github.com/angular/angular.js/issues/12241
* - https://github.com/driftyco/ionic/issues/4082
*
*
* @license AngularJS
* (c) 2010-2015 Google, Inc. http://angularjs.org
* License: MIT
*/
angular.module('ngIOS9UIWebViewPatch', ['ng']).config(function($provide) {
$provide.decorator('$browser', ['$delegate', '$window', function($delegate, $window) {
if (isIOS9UIWebView($window.navigator.userAgent)) {
return applyIOS9Shim($delegate);
}
return $delegate;
function isIOS9UIWebView(userAgent) {
return /(iPhone|iPad|iPod);.*OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
}
function applyIOS9Shim(browser) {
var pendingLocationUrl = null;
var patchedBrowser = Object.create(browser);
patchedBrowser.url = function() {
if (arguments.length) {
pendingLocationUrl = arguments[0];
return browser.url.apply(patchedBrowser, arguments);
}
return pendingLocationUrl || browser.url();
};
window.addEventListener('popstate', clearPendingLocationUrl, false);
window.addEventListener('hashchange', clearPendingLocationUrl, false);
function clearPendingLocationUrl() {
pendingLocationUrl = null;
}
return patchedBrowser;
}
}]);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment