FIX: Infinite loop when poll step is zero (#5380)

* Fix infinite loop when poll step is zero

* Add test for step minimum and for breaking test

* Remove trailing spaces (eslint)

* Remove extra space (eslint)

* Removed test call .twice
This commit is contained in:
Eric Berry 2017-11-30 09:04:41 -07:00 committed by Régis Hanol
parent 3f8d0c5c94
commit ab22c8cad4
5 changed files with 33 additions and 2 deletions

View File

@ -87,7 +87,10 @@ export default Ember.Controller.extend({
if (isMultiple) {
return this._comboboxOptions(pollMinInt + 1, count + 1);
} else if (isNumber) {
const pollStepInt = parseInt(pollStep) || 1;
let pollStepInt = parseInt(pollStep, 10);
if (pollStepInt < 1) {
pollStepInt = 1;
}
return this._comboboxOptions(pollMinInt + 1, pollMinInt + (this.siteSettings.poll_maximum_options * pollStepInt));
}
},
@ -109,10 +112,15 @@ export default Ember.Controller.extend({
pollHeader += ` name=poll${match.length + 1}`;
};
let step = pollStep;
if (step < 1) {
step = 1;
}
if (pollType) pollHeader += ` type=${pollType}`;
if (pollMin && showMinMax) pollHeader += ` min=${pollMin}`;
if (pollMax) pollHeader += ` max=${pollMax}`;
if (isNumber) pollHeader += ` step=${pollStep}`;
if (isNumber) pollHeader += ` step=${step}`;
if (publicPoll) pollHeader += ' public=true';
pollHeader += ']';
output += `${pollHeader}\n`;
@ -143,6 +151,17 @@ export default Ember.Controller.extend({
return InputValidation.create(options);
},
@computed("pollStep")
minStepValueValidation(pollStep) {
let options = { ok: true };
if (pollStep < 1) {
options = { failed: true, reason: I18n.t("poll.ui_builder.help.min_step_value") };
}
return InputValidation.create(options);
},
@computed("disableInsert")
minNumOfOptionsValidation(disableInsert) {
let options = { ok: true };

View File

@ -32,7 +32,9 @@
{{input type='number'
value=pollStep
valueAttribute="value"
min="1"
class="poll-options-step"}}
{{input-tip validation=minStepValueValidation}}
</div>
{{/if}}
{{/if}}

View File

@ -133,6 +133,11 @@ const rule = {
let max = parseInt(attrs["max"], 10);
let step = parseInt(attrs["step"], 10);
// infinite loop if step < 1
if (step < 1) {
step = 1;
}
let header = [];
let token = new state.Token('poll_open', 'div', 1);

View File

@ -75,6 +75,7 @@ en:
help:
options_count: Enter at least 2 options
invalid_values: Minimum value must be smaller than the maximum value.
min_step_value: The minimum step value is 1
poll_type:
label: Type
regular: Single Choice

View File

@ -196,6 +196,10 @@ test("number pollOutput", function(assert) {
controller.set("publicPoll", true);
assert.equal(controller.get("pollOutput"), "[poll type=number min=1 max=20 step=2 public=true]\n[/poll]", "it should return the right output");
controller.set("pollStep", 0);
assert.equal(controller.get("pollOutput"), "[poll type=number min=1 max=20 step=1 public=true]\n[/poll]", "it should return the right output");
});
test("regular pollOutput", function(assert) {