blob: 635668730fc9eb2f526903b59f99e3fc5f1f9d1d [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include "third_party/blink/renderer/core/html/forms/date_time_fields_state.h"
#include "third_party/blink/renderer/core/html/forms/form_controller.h"
namespace blink {
const unsigned DateTimeFieldsState::kEmptyValue = static_cast<unsigned>(-1);
static unsigned GetNumberFromFormControlState(const FormControlState& state,
wtf_size_t index) {
if (index >= state.ValueSize())
return DateTimeFieldsState::kEmptyValue;
bool parsed;
unsigned const value = state[index].ToUInt(&parsed);
return parsed ? value : DateTimeFieldsState::kEmptyValue;
}
static DateTimeFieldsState::AMPMValue GetAMPMFromFormControlState(
const FormControlState& state,
wtf_size_t index) {
if (index >= state.ValueSize())
return DateTimeFieldsState::kAMPMValueEmpty;
const String value = state[index];
if (value == "A")
return DateTimeFieldsState::kAMPMValueAM;
if (value == "P")
return DateTimeFieldsState::kAMPMValuePM;
return DateTimeFieldsState::kAMPMValueEmpty;
}
DateTimeFieldsState::DateTimeFieldsState()
: year_(kEmptyValue),
month_(kEmptyValue),
day_of_month_(kEmptyValue),
hour_(kEmptyValue),
minute_(kEmptyValue),
second_(kEmptyValue),
millisecond_(kEmptyValue),
week_of_year_(kEmptyValue),
ampm_(kAMPMValueEmpty) {}
unsigned DateTimeFieldsState::Hour23() const {
if (!HasHour() || !HasAMPM())
return kEmptyValue;
return (hour_ % 12) + (ampm_ == kAMPMValuePM ? 12 : 0);
}
DateTimeFieldsState DateTimeFieldsState::RestoreFormControlState(
const FormControlState& state) {
DateTimeFieldsState date_time_fields_state;
date_time_fields_state.SetYear(GetNumberFromFormControlState(state, 0));
date_time_fields_state.SetMonth(GetNumberFromFormControlState(state, 1));
date_time_fields_state.SetDayOfMonth(GetNumberFromFormControlState(state, 2));
date_time_fields_state.SetHour(GetNumberFromFormControlState(state, 3));
date_time_fields_state.SetMinute(GetNumberFromFormControlState(state, 4));
date_time_fields_state.SetSecond(GetNumberFromFormControlState(state, 5));
date_time_fields_state.SetMillisecond(
GetNumberFromFormControlState(state, 6));
date_time_fields_state.SetWeekOfYear(GetNumberFromFormControlState(state, 7));
date_time_fields_state.SetAMPM(GetAMPMFromFormControlState(state, 8));
return date_time_fields_state;
}
FormControlState DateTimeFieldsState::SaveFormControlState() const {
FormControlState state;
state.Append(HasYear() ? String::Number(year_) : g_empty_string);
state.Append(HasMonth() ? String::Number(month_) : g_empty_string);
state.Append(HasDayOfMonth() ? String::Number(day_of_month_)
: g_empty_string);
state.Append(HasHour() ? String::Number(hour_) : g_empty_string);
state.Append(HasMinute() ? String::Number(minute_) : g_empty_string);
state.Append(HasSecond() ? String::Number(second_) : g_empty_string);
state.Append(HasMillisecond() ? String::Number(millisecond_)
: g_empty_string);
state.Append(HasWeekOfYear() ? String::Number(week_of_year_)
: g_empty_string);
if (HasAMPM())
state.Append(ampm_ == kAMPMValueAM ? "A" : "P");
else
state.Append(g_empty_string);
return state;
}
} // namespace blink