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

Commit 298f8c4

Browse files
fix(input): ensure that hidden input values are correct after history.back
Due to the nature of some browser's PageCache/BFCache, returning to an Angular app sometimes causes `input[hidden]` elements to retain the last value that was stored before the page was navigated away from previously. This is particularly problematic if the input has an interpolated value. E.g. `<input type="hidden" value="{{ 1 + 2 }}">` since when the browser returns, instead of the original interpolation template, the HTML contains the previous value `<input type="hidden" value="3">`. This commit instructs the browser not to attempt to reinstate the previous value when navigating back in history by setting `autocomplete="off"` on the hidden input element element.
1 parent 138fbf0 commit 298f8c4

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

src/ng/directive/input.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,13 +2002,16 @@ var inputDirective = ['$browser', '$sniffer', '$filter', '$parse',
20022002
return {
20032003
restrict: 'E',
20042004
require: ['?ngModel'],
2005-
link: {
2006-
pre: function(scope, element, attr, ctrls) {
2007-
if (ctrls[0]) {
2008-
(inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,
2009-
$browser, $filter, $parse);
2005+
compile: function(tElement, tAttr) {
2006+
if (lowercase(tAttr.type) === 'hidden') tAttr.$set('autocomplete', 'off');
2007+
return {
2008+
pre: function(scope, element, attr, ctrls) {
2009+
if (ctrls[0]) {
2010+
(inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,
2011+
$browser, $filter, $parse);
2012+
}
20102013
}
2011-
}
2014+
};
20122015
}
20132016
};
20142017
}];
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html ng-app>
3+
<body>
4+
<form>
5+
<input type="hidden" value="{{value}}" />
6+
<button ng-click="value = '{{ 7 * 6 }}'">Click me</button>
7+
</form>
8+
<script src="angular.js"></script>
9+
</body>
10+
</html>

test/e2e/tests/input-hidden.spec.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
'use strict';
2+
3+
describe('hidden thingy', function() {
4+
it('should pass', function() {
5+
6+
loadFixture('input-hidden');
7+
expect(element(by.css('input')).getAttribute('value')).toEqual('');
8+
9+
element(by.css('button')).click();
10+
expect(element(by.css('input')).getAttribute('value')).toEqual('{{ 7 * 6 }}');
11+
12+
loadFixture('sample');
13+
browser.driver.executeScript('history.back()');
14+
var expectedValue = browser.params.browser === 'safari' ? '{{ 7 * 6 }}' : '';
15+
expect(element(by.css('input')).getAttribute('value')).toEqual(expectedValue);
16+
});
17+
});

0 commit comments

Comments
 (0)