Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Apostrophe in Querystring Value in Firefox breaks angular #920

Closed
nickretallack opened this issue May 1, 2012 · 5 comments · Fixed by #954
Closed

Apostrophe in Querystring Value in Firefox breaks angular #920

nickretallack opened this issue May 1, 2012 · 5 comments · Fixed by #954
Assignees

Comments

@nickretallack
Copy link

Example:
http://nickretallack.com/experiments/angular/apostrophe.html#/?query=some%27thing

This is a serious bug that causes angular to stop functioning until you refresh the page. This happens any time there is an <ng-view> on the page and an apostrophe in a querystring argument. It happens in Firefox, but it does not happen in Chrome. I'm using Angular 1.0rc6. The error message it produces is below.

10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: $locationWatch; newVal: 7; oldVal: 6"],["fn: $locationWatch; newVal: 8; oldVal: 7"],["fn: $locationWatch; newVal: 9; oldVal: 8"],["fn: $locationWatch; newVal: 10; oldVal: 9"],["fn: $locationWatch; newVal: 11; oldVal: 10"]]

Source code for the example program:

<!doctype html>
<html ng-app>
  <head>
    <script src="http://code.angularjs.org/angular-1.0.0rc6.js"></script>
  </head>
  <body>
    <ng-view></ng-view>
  </body>
</html>
@nickretallack
Copy link
Author

Btw, this is curiously similar to this bug: #904

@nickretallack
Copy link
Author

Here's the problem. We're comparing location.href to a location constructed from its components. Unfortunately in Firefox the hash part of location.href is not the same as location.hash when any special characters are used. location.href is fully escape()'d, while location.hash is unescape()'d. If you have an apostrophe in your url, angular compares and assigns these values repeatedly and they never become equal.

@nickretallack
Copy link
Author

In Chorme, location.href does not escape apostrophes.

@nickretallack
Copy link
Author

Okay, it appears apostrophes are the only thing causing the inconsistency. Firefox escapes them and Chrome does not. escape() escapes them and encodeURIComponent and encodeURI do not. To patch up the inconsistency, modify Browser#url like so:

2915c2915,2919
<       return location.href;
---
>       return location.href.replace(/%27/g,"'")

I've filed a bug on firefox.

@ghost ghost assigned IgorMinar May 7, 2012
@IgorMinar
Copy link
Contributor

I'll look into this week. Thanks for the detailed info.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants