| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 #include "core/html/forms/InputTypeNames.h" | 39 #include "core/html/forms/InputTypeNames.h" |
| 40 #include "core/html/shadow/ShadowElementNames.h" | 40 #include "core/html/shadow/ShadowElementNames.h" |
| 41 #include "core/html/shadow/TextControlInnerElements.h" | 41 #include "core/html/shadow/TextControlInnerElements.h" |
| 42 #include "core/rendering/RenderSearchField.h" | 42 #include "core/rendering/RenderSearchField.h" |
| 43 #include "wtf/PassOwnPtr.h" | 43 #include "wtf/PassOwnPtr.h" |
| 44 | 44 |
| 45 namespace WebCore { | 45 namespace WebCore { |
| 46 | 46 |
| 47 using namespace HTMLNames; | 47 using namespace HTMLNames; |
| 48 | 48 |
| 49 inline SearchInputType::SearchInputType(HTMLInputElement* element) | 49 inline SearchInputType::SearchInputType(HTMLInputElement& element) |
| 50 : BaseTextInputType(element) | 50 : BaseTextInputType(element) |
| 51 , m_searchEventTimer(this, &SearchInputType::searchEventTimerFired) | 51 , m_searchEventTimer(this, &SearchInputType::searchEventTimerFired) |
| 52 { | 52 { |
| 53 } | 53 } |
| 54 | 54 |
| 55 PassRefPtr<InputType> SearchInputType::create(HTMLInputElement* element) | 55 PassRefPtr<InputType> SearchInputType::create(HTMLInputElement& element) |
| 56 { | 56 { |
| 57 return adoptRef(new SearchInputType(element)); | 57 return adoptRef(new SearchInputType(element)); |
| 58 } | 58 } |
| 59 | 59 |
| 60 void SearchInputType::countUsage() | 60 void SearchInputType::countUsage() |
| 61 { | 61 { |
| 62 observeFeatureIfVisible(UseCounter::InputTypeSearch); | 62 observeFeatureIfVisible(UseCounter::InputTypeSearch); |
| 63 } | 63 } |
| 64 | 64 |
| 65 RenderObject* SearchInputType::createRenderer(RenderStyle*) const | 65 RenderObject* SearchInputType::createRenderer(RenderStyle*) const |
| 66 { | 66 { |
| 67 return new RenderSearchField(element()); | 67 return new RenderSearchField(&element()); |
| 68 } | 68 } |
| 69 | 69 |
| 70 const AtomicString& SearchInputType::formControlType() const | 70 const AtomicString& SearchInputType::formControlType() const |
| 71 { | 71 { |
| 72 return InputTypeNames::search(); | 72 return InputTypeNames::search(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 bool SearchInputType::shouldRespectSpeechAttribute() | 75 bool SearchInputType::shouldRespectSpeechAttribute() |
| 76 { | 76 { |
| 77 return true; | 77 return true; |
| 78 } | 78 } |
| 79 | 79 |
| 80 bool SearchInputType::isSearchField() const | 80 bool SearchInputType::isSearchField() const |
| 81 { | 81 { |
| 82 return true; | 82 return true; |
| 83 } | 83 } |
| 84 | 84 |
| 85 bool SearchInputType::needsContainer() const | 85 bool SearchInputType::needsContainer() const |
| 86 { | 86 { |
| 87 return true; | 87 return true; |
| 88 } | 88 } |
| 89 | 89 |
| 90 void SearchInputType::createShadowSubtree() | 90 void SearchInputType::createShadowSubtree() |
| 91 { | 91 { |
| 92 TextFieldInputType::createShadowSubtree(); | 92 TextFieldInputType::createShadowSubtree(); |
| 93 Element* container = containerElement(); | 93 Element* container = containerElement(); |
| 94 Element* viewPort = element()->userAgentShadowRoot()->getElementById(ShadowE
lementNames::editingViewPort()); | 94 Element* viewPort = element().userAgentShadowRoot()->getElementById(ShadowEl
ementNames::editingViewPort()); |
| 95 ASSERT(container); | 95 ASSERT(container); |
| 96 ASSERT(viewPort); | 96 ASSERT(viewPort); |
| 97 | 97 |
| 98 container->insertBefore(SearchFieldDecorationElement::create(element()->docu
ment()), viewPort); | 98 container->insertBefore(SearchFieldDecorationElement::create(element().docum
ent()), viewPort); |
| 99 container->insertBefore(SearchFieldCancelButtonElement::create(element()->do
cument()), viewPort->nextSibling()); | 99 container->insertBefore(SearchFieldCancelButtonElement::create(element().doc
ument()), viewPort->nextSibling()); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void SearchInputType::handleKeydownEvent(KeyboardEvent* event) | 102 void SearchInputType::handleKeydownEvent(KeyboardEvent* event) |
| 103 { | 103 { |
| 104 if (element()->isDisabledOrReadOnly()) { | 104 if (element().isDisabledOrReadOnly()) { |
| 105 TextFieldInputType::handleKeydownEvent(event); | 105 TextFieldInputType::handleKeydownEvent(event); |
| 106 return; | 106 return; |
| 107 } | 107 } |
| 108 | 108 |
| 109 const String& key = event->keyIdentifier(); | 109 const String& key = event->keyIdentifier(); |
| 110 if (key == "U+001B") { | 110 if (key == "U+001B") { |
| 111 RefPtr<HTMLInputElement> input = element(); | 111 RefPtr<HTMLInputElement> input(element()); |
| 112 input->setValueForUser(""); | 112 input->setValueForUser(""); |
| 113 input->onSearch(); | 113 input->onSearch(); |
| 114 event->setDefaultHandled(); | 114 event->setDefaultHandled(); |
| 115 return; | 115 return; |
| 116 } | 116 } |
| 117 TextFieldInputType::handleKeydownEvent(event); | 117 TextFieldInputType::handleKeydownEvent(event); |
| 118 } | 118 } |
| 119 | 119 |
| 120 void SearchInputType::startSearchEventTimer() | 120 void SearchInputType::startSearchEventTimer() |
| 121 { | 121 { |
| 122 ASSERT(element()->renderer()); | 122 ASSERT(element().renderer()); |
| 123 unsigned length = element()->innerTextValue().length(); | 123 unsigned length = element().innerTextValue().length(); |
| 124 | 124 |
| 125 if (!length) { | 125 if (!length) { |
| 126 stopSearchEventTimer(); | 126 stopSearchEventTimer(); |
| 127 element()->onSearch(); | 127 element().onSearch(); |
| 128 return; | 128 return; |
| 129 } | 129 } |
| 130 | 130 |
| 131 // After typing the first key, we wait 0.5 seconds. | 131 // After typing the first key, we wait 0.5 seconds. |
| 132 // After the second key, 0.4 seconds, then 0.3, then 0.2 from then on. | 132 // After the second key, 0.4 seconds, then 0.3, then 0.2 from then on. |
| 133 m_searchEventTimer.startOneShot(max(0.2, 0.6 - 0.1 * length)); | 133 m_searchEventTimer.startOneShot(max(0.2, 0.6 - 0.1 * length)); |
| 134 } | 134 } |
| 135 | 135 |
| 136 void SearchInputType::stopSearchEventTimer() | 136 void SearchInputType::stopSearchEventTimer() |
| 137 { | 137 { |
| 138 m_searchEventTimer.stop(); | 138 m_searchEventTimer.stop(); |
| 139 } | 139 } |
| 140 | 140 |
| 141 void SearchInputType::searchEventTimerFired(Timer<SearchInputType>*) | 141 void SearchInputType::searchEventTimerFired(Timer<SearchInputType>*) |
| 142 { | 142 { |
| 143 element()->onSearch(); | 143 element().onSearch(); |
| 144 } | 144 } |
| 145 | 145 |
| 146 bool SearchInputType::searchEventsShouldBeDispatched() const | 146 bool SearchInputType::searchEventsShouldBeDispatched() const |
| 147 { | 147 { |
| 148 return element()->hasAttribute(incrementalAttr); | 148 return element().hasAttribute(incrementalAttr); |
| 149 } | 149 } |
| 150 | 150 |
| 151 void SearchInputType::didSetValueByUserEdit(ValueChangeState state) | 151 void SearchInputType::didSetValueByUserEdit(ValueChangeState state) |
| 152 { | 152 { |
| 153 updateCancelButtonVisibility(); | 153 updateCancelButtonVisibility(); |
| 154 | 154 |
| 155 // If the incremental attribute is set, then dispatch the search event | 155 // If the incremental attribute is set, then dispatch the search event |
| 156 if (searchEventsShouldBeDispatched()) | 156 if (searchEventsShouldBeDispatched()) |
| 157 startSearchEventTimer(); | 157 startSearchEventTimer(); |
| 158 | 158 |
| 159 TextFieldInputType::didSetValueByUserEdit(state); | 159 TextFieldInputType::didSetValueByUserEdit(state); |
| 160 } | 160 } |
| 161 | 161 |
| 162 void SearchInputType::updateInnerTextValue() | 162 void SearchInputType::updateInnerTextValue() |
| 163 { | 163 { |
| 164 BaseTextInputType::updateInnerTextValue(); | 164 BaseTextInputType::updateInnerTextValue(); |
| 165 updateCancelButtonVisibility(); | 165 updateCancelButtonVisibility(); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void SearchInputType::updateCancelButtonVisibility() | 168 void SearchInputType::updateCancelButtonVisibility() |
| 169 { | 169 { |
| 170 Element* button = element()->userAgentShadowRoot()->getElementById(ShadowEle
mentNames::clearButton()); | 170 Element* button = element().userAgentShadowRoot()->getElementById(ShadowElem
entNames::clearButton()); |
| 171 if (!button) | 171 if (!button) |
| 172 return; | 172 return; |
| 173 if (element()->value().isEmpty()) | 173 if (element().value().isEmpty()) |
| 174 button->setInlineStyleProperty(CSSPropertyVisibility, CSSValueHidden); | 174 button->setInlineStyleProperty(CSSPropertyVisibility, CSSValueHidden); |
| 175 else | 175 else |
| 176 button->removeInlineStyleProperty(CSSPropertyVisibility); | 176 button->removeInlineStyleProperty(CSSPropertyVisibility); |
| 177 } | 177 } |
| 178 | 178 |
| 179 bool SearchInputType::supportsInputModeAttribute() const | 179 bool SearchInputType::supportsInputModeAttribute() const |
| 180 { | 180 { |
| 181 return true; | 181 return true; |
| 182 } | 182 } |
| 183 | 183 |
| 184 } // namespace WebCore | 184 } // namespace WebCore |
| OLD | NEW |