Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1003)

Unified Diff: Source/core/html/forms/InputType.cpp

Issue 1340883002: Avoid stack overflow in InputType::applyStep(). (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « LayoutTests/fast/forms/week/week-stepup-stepdown-expected.txt ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/forms/InputType.cpp
diff --git a/Source/core/html/forms/InputType.cpp b/Source/core/html/forms/InputType.cpp
index cb8c3978d3e7c3edb4802754986cd6c002c61698..bdf7569ef42dea6cf8c0478e62772716039d283f 100644
--- a/Source/core/html/forms/InputType.cpp
+++ b/Source/core/html/forms/InputType.cpp
@@ -760,10 +760,14 @@ void InputType::applyStep(const Decimal& current, int count, AnyStepHandling any
exceptionState.throwDOMException(InvalidStateError, "This form element does not have an allowed value step.");
return;
}
+ // TODO(tkent): We should do nothing if minimum > maximum, or there is no
+ // valid values between minimum and maximum.
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-input-stepup
EventQueueScope scope;
const Decimal step = stepRange.step();
+ Decimal newValue = current;
const AtomicString& stepString = element().fastGetAttribute(stepAttr);
if (!equalIgnoringCase(stepString, "any") && stepRange.stepMismatch(current)) {
// Snap-to-step / clamping steps
@@ -775,42 +779,31 @@ void InputType::applyStep(const Decimal& current, int count, AnyStepHandling any
//
ASSERT(!step.isZero());
- Decimal newValue;
const Decimal base = stepRange.stepBase();
- if (count < 0)
- newValue = base + ((current - base) / step).floor() * step;
- else if (count > 0)
- newValue = base + ((current - base) / step).ceil() * step;
- else
- newValue = current;
-
- if (newValue < stepRange.minimum())
tkent 2015/09/14 04:19:37 This block is removed.
- newValue = stepRange.minimum();
- if (newValue > stepRange.maximum())
- newValue = stepRange.maximum();
-
- setValueAsDecimal(newValue, count == 1 || count == -1 ? eventBehavior : DispatchNoEvent, IGNORE_EXCEPTION);
tkent 2015/09/14 04:19:37 We go through to the |else| clause.
- if (count > 1) {
- applyStep(newValue, count - 1, AnyIsDefaultStep, eventBehavior, IGNORE_EXCEPTION);
- return;
+ if (count < 0) {
+ newValue = base + ((newValue - base) / step).floor() * step;
+ ++count;
+ } else if (count > 0) {
+ newValue = base + ((newValue - base) / step).ceil() * step;
+ --count;
}
- if (count < -1) {
- applyStep(newValue, count + 1, AnyIsDefaultStep, eventBehavior, IGNORE_EXCEPTION);
- return;
- }
- } else {
- Decimal newValue = current + stepRange.step() * count;
tkent 2015/09/14 04:19:37 The code is not changed in this |else| clause. Ju
+ }
+ newValue = newValue + stepRange.step() * count;
- if (!equalIgnoringCase(stepString, "any"))
- newValue = stepRange.alignValueForStep(current, newValue);
+ if (!equalIgnoringCase(stepString, "any"))
+ newValue = stepRange.alignValueForStep(current, newValue);
- if (newValue > stepRange.maximum())
- newValue = newValue - stepRange.step();
- else if (newValue < stepRange.minimum())
- newValue = newValue + stepRange.step();
+ // TODO(tkent): The following code doesn't clamp newValue if difference
+ // between newValue and the limit is greater than 1 step.
+ // e.g. <input type=number value=0 step=1 max=10> and stepUp(100)
+ // ==> newValue==100, maximum==10
+ if (newValue > stepRange.maximum())
+ newValue = newValue - stepRange.step();
+ else if (newValue < stepRange.minimum())
+ newValue = newValue + stepRange.step();
+
+ setValueAsDecimal(newValue, eventBehavior, exceptionState);
- setValueAsDecimal(newValue, eventBehavior, exceptionState);
- }
if (AXObjectCache* cache = element().document().existingAXObjectCache())
cache->handleValueChanged(&element());
}
« no previous file with comments | « LayoutTests/fast/forms/week/week-stepup-stepdown-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698