| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights
reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights
reserved. |
| 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 7 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) | 7 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) |
| 8 * Copyright (C) 2010 Google Inc. All rights reserved. | 8 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 2128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2139 struct EventHandlingState : FastAllocBase { | 2139 struct EventHandlingState : FastAllocBase { |
| 2140 RefPtr<HTMLInputElement> m_currRadio; | 2140 RefPtr<HTMLInputElement> m_currRadio; |
| 2141 bool m_indeterminate; | 2141 bool m_indeterminate; |
| 2142 bool m_checked; | 2142 bool m_checked; |
| 2143 | 2143 |
| 2144 EventHandlingState(bool indeterminate, bool checked) | 2144 EventHandlingState(bool indeterminate, bool checked) |
| 2145 : m_indeterminate(indeterminate) | 2145 : m_indeterminate(indeterminate) |
| 2146 , m_checked(checked) { } | 2146 , m_checked(checked) { } |
| 2147 }; | 2147 }; |
| 2148 | 2148 |
| 2149 void* HTMLInputElement::preDispatchEventHandler(Event *evt) | 2149 void* HTMLInputElement::preDispatchEventHandler(Event* evt) |
| 2150 { | 2150 { |
| 2151 // preventDefault or "return false" are used to reverse the automatic checki
ng/selection we do here. | 2151 // preventDefault or "return false" are used to reverse the automatic checki
ng/selection we do here. |
| 2152 // This result gives us enough info to perform the "undo" in postDispatch of
the action we take here. | 2152 // This result gives us enough info to perform the "undo" in postDispatch of
the action we take here. |
| 2153 void* result = 0; | 2153 void* result = 0; |
| 2154 if ((inputType() == CHECKBOX || inputType() == RADIO) && evt->isMouseEvent() | 2154 if ((inputType() == CHECKBOX || inputType() == RADIO) && evt->type() == even
tNames().clickEvent) { |
| 2155 && evt->type() == eventNames().clickEvent && static_cast<MouseEvent*
>(evt)->button() == LeftButton) { | |
| 2156 | |
| 2157 OwnPtr<EventHandlingState> state = adoptPtr(new EventHandlingState(indet
erminate(), checked())); | 2155 OwnPtr<EventHandlingState> state = adoptPtr(new EventHandlingState(indet
erminate(), checked())); |
| 2158 | |
| 2159 if (inputType() == CHECKBOX) { | 2156 if (inputType() == CHECKBOX) { |
| 2160 if (indeterminate()) | 2157 if (indeterminate()) |
| 2161 setIndeterminate(false); | 2158 setIndeterminate(false); |
| 2162 else | 2159 else |
| 2163 setChecked(!checked(), true); | 2160 setChecked(!checked(), true); |
| 2164 } else { | 2161 } else { |
| 2165 // For radio buttons, store the current selected radio object. | 2162 // For radio buttons, store the current selected radio object. |
| 2166 // We really want radio groups to end up in sane states, i.e., to ha
ve something checked. | 2163 // We really want radio groups to end up in sane states, i.e., to ha
ve something checked. |
| 2167 // Therefore if nothing is currently selected, we won't allow this a
ction to be "undone", since | 2164 // Therefore if nothing is currently selected, we won't allow this a
ction to be "undone", since |
| 2168 // we want some object in the radio group to actually get selected. | 2165 // we want some object in the radio group to actually get selected. |
| 2169 HTMLInputElement* currRadio = checkedRadioButtons(this).checkedButto
nForGroup(name()); | 2166 HTMLInputElement* currRadio = checkedRadioButtons(this).checkedButto
nForGroup(name()); |
| 2170 if (currRadio) { | 2167 if (currRadio) { |
| 2171 // We have a radio button selected that is not us. Cache it in
our result field and ref it so | 2168 // We have a radio button selected that is not us. Cache it in
our result field and ref it so |
| 2172 // that it can't be destroyed. | 2169 // that it can't be destroyed. |
| 2173 state->m_currRadio = currRadio; | 2170 state->m_currRadio = currRadio; |
| 2174 } | 2171 } |
| 2175 if (indeterminate()) | 2172 if (indeterminate()) |
| 2176 setIndeterminate(false); | 2173 setIndeterminate(false); |
| 2177 setChecked(true, true); | 2174 setChecked(true, true); |
| 2178 } | 2175 } |
| 2179 result = state.leakPtr(); // FIXME: Check whether this actually ends up
leaking. | 2176 result = state.leakPtr(); // FIXME: Check whether this actually ends up
leaking. |
| 2180 } | 2177 } |
| 2181 return result; | 2178 return result; |
| 2182 } | 2179 } |
| 2183 | 2180 |
| 2184 void HTMLInputElement::postDispatchEventHandler(Event *evt, void* data) | 2181 void HTMLInputElement::postDispatchEventHandler(Event *evt, void* data) |
| 2185 { | 2182 { |
| 2186 if ((inputType() == CHECKBOX || inputType() == RADIO) && evt->isMouseEvent() | 2183 if ((inputType() == CHECKBOX || inputType() == RADIO) && evt->type() == even
tNames().clickEvent) { |
| 2187 && evt->type() == eventNames().clickEvent && static_cast<MouseEvent*
>(evt)->button() == LeftButton) { | |
| 2188 | 2184 |
| 2189 if (EventHandlingState* state = reinterpret_cast<EventHandlingState*>(da
ta)) { | 2185 if (EventHandlingState* state = reinterpret_cast<EventHandlingState*>(da
ta)) { |
| 2190 if (inputType() == CHECKBOX) { | 2186 if (inputType() == CHECKBOX) { |
| 2191 // Reverse the checking we did in preDispatch. | 2187 // Reverse the checking we did in preDispatch. |
| 2192 if (evt->defaultPrevented() || evt->defaultHandled()) { | 2188 if (evt->defaultPrevented() || evt->defaultHandled()) { |
| 2193 setIndeterminate(state->m_indeterminate); | 2189 setIndeterminate(state->m_indeterminate); |
| 2194 setChecked(state->m_checked); | 2190 setChecked(state->m_checked); |
| 2195 } | 2191 } |
| 2196 } else { | 2192 } else { |
| 2197 HTMLInputElement* input = state->m_currRadio.get(); | 2193 HTMLInputElement* input = state->m_currRadio.get(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2260 if (isTextField() | 2256 if (isTextField() |
| 2261 && evt->type() == eventNames().keydownEvent | 2257 && evt->type() == eventNames().keydownEvent |
| 2262 && evt->isKeyboardEvent() | 2258 && evt->isKeyboardEvent() |
| 2263 && focused() | 2259 && focused() |
| 2264 && document()->frame() | 2260 && document()->frame() |
| 2265 && document()->frame()->doTextFieldCommandFromEvent(this, static_cas
t<KeyboardEvent*>(evt))) { | 2261 && document()->frame()->doTextFieldCommandFromEvent(this, static_cas
t<KeyboardEvent*>(evt))) { |
| 2266 evt->setDefaultHandled(); | 2262 evt->setDefaultHandled(); |
| 2267 return; | 2263 return; |
| 2268 } | 2264 } |
| 2269 | 2265 |
| 2270 if (inputType() == RADIO | 2266 if (inputType() == RADIO && evt->type() == eventNames().clickEvent) { |
| 2271 && evt->isMouseEvent() | |
| 2272 && evt->type() == eventNames().clickEvent | |
| 2273 && static_cast<MouseEvent*>(evt)->button() == LeftButton) { | |
| 2274 evt->setDefaultHandled(); | 2267 evt->setDefaultHandled(); |
| 2275 return; | 2268 return; |
| 2276 } | 2269 } |
| 2277 | 2270 |
| 2278 // Call the base event handler before any of our own event handling for almo
st all events in text fields. | 2271 // Call the base event handler before any of our own event handling for almo
st all events in text fields. |
| 2279 // Makes editing keyboard handling take precedence over the keydown and keyp
ress handling in this function. | 2272 // Makes editing keyboard handling take precedence over the keydown and keyp
ress handling in this function. |
| 2280 bool callBaseClassEarly = isTextField() && !implicitSubmission | 2273 bool callBaseClassEarly = isTextField() && !implicitSubmission |
| 2281 && (evt->type() == eventNames().keydownEvent || evt->type() == eventName
s().keypressEvent); | 2274 && (evt->type() == eventNames().keydownEvent || evt->type() == eventName
s().keypressEvent); |
| 2282 if (callBaseClassEarly) { | 2275 if (callBaseClassEarly) { |
| 2283 HTMLFormControlElementWithState::defaultEventHandler(evt); | 2276 HTMLFormControlElementWithState::defaultEventHandler(evt); |
| (...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2997 case TIME: | 2990 case TIME: |
| 2998 case URL: | 2991 case URL: |
| 2999 case WEEK: | 2992 case WEEK: |
| 3000 return false; | 2993 return false; |
| 3001 } | 2994 } |
| 3002 return false; | 2995 return false; |
| 3003 } | 2996 } |
| 3004 #endif | 2997 #endif |
| 3005 | 2998 |
| 3006 } // namespace | 2999 } // namespace |
| OLD | NEW |