Reviewed by Hyatt.
[WebKit-https.git] / WebCore / html / HTMLTextFieldInnerElement.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25  
26 #include "config.h"
27 #include "HTMLTextFieldInnerElement.h"
28
29 #include "BeforeTextInsertedEvent.h"
30 #include "Document.h"
31 #include "EventHandler.h"
32 #include "EventNames.h"
33 #include "Frame.h"
34 #include "HTMLInputElement.h"
35 #include "HTMLTextAreaElement.h"
36 #include "RenderTextControl.h"
37
38 namespace WebCore {
39
40 using namespace EventNames;
41
42 HTMLTextFieldInnerElement::HTMLTextFieldInnerElement(Document* doc, Node* shadowParent)
43     : HTMLDivElement(doc), m_shadowParent(shadowParent)
44 {
45 }
46
47 HTMLTextFieldInnerTextElement::HTMLTextFieldInnerTextElement(Document* doc, Node* shadowParent)
48     : HTMLTextFieldInnerElement(doc, shadowParent)
49 {
50 }
51
52 void HTMLTextFieldInnerTextElement::defaultEventHandler(Event* evt)
53 {
54     // FIXME: In the future, we should add a way to have default event listeners.  Then we would add one to the text field's inner div, and we wouldn't need this subclass.
55     Node* shadowAncestor = shadowAncestorNode();
56     if (shadowAncestor && shadowAncestor->renderer()) {
57         ASSERT(shadowAncestor->renderer()->isTextField() || shadowAncestor->renderer()->isTextArea());
58         if (evt->isBeforeTextInsertedEvent())
59             if (shadowAncestor->renderer()->isTextField())
60                 static_cast<HTMLInputElement*>(shadowAncestor)->defaultEventHandler(evt);
61             else
62                 static_cast<HTMLTextAreaElement*>(shadowAncestor)->defaultEventHandler(evt);
63         if (evt->type() == webkitEditableContentChangedEvent)
64             static_cast<RenderTextControl*>(shadowAncestor->renderer())->subtreeHasChanged();
65     }
66     if (!evt->defaultHandled())
67         HTMLDivElement::defaultEventHandler(evt);
68 }
69
70 HTMLSearchFieldResultsButtonElement::HTMLSearchFieldResultsButtonElement(Document* doc)
71     : HTMLTextFieldInnerElement(doc)
72 {
73 }
74
75 void HTMLSearchFieldResultsButtonElement::defaultEventHandler(Event* evt)
76 {
77     // On mousedown, bring up a menu, if needed
78     HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode());
79     if (evt->type() == mousedownEvent) {
80         input->focus();
81         input->select();
82         if (input && input->renderer() && static_cast<RenderTextControl*>(input->renderer())->popupIsVisible())
83             static_cast<RenderTextControl*>(input->renderer())->hidePopup();
84         else if (input->maxResults() > 0)
85             static_cast<RenderTextControl*>(input->renderer())->showPopup();
86         evt->setDefaultHandled();
87     }
88     if (!evt->defaultHandled())
89         HTMLDivElement::defaultEventHandler(evt);
90 }
91
92 HTMLSearchFieldCancelButtonElement::HTMLSearchFieldCancelButtonElement(Document* doc)
93     : HTMLTextFieldInnerElement(doc)
94     , m_capturing(false)
95 {
96 }
97
98 void HTMLSearchFieldCancelButtonElement::defaultEventHandler(Event* evt)
99 {
100     // If the element is visible, on mouseup, clear the value, and set selection
101     HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode());
102     if (evt->type() == mousedownEvent) {
103         input->focus();
104         input->select();
105         evt->setDefaultHandled();
106         if (Frame* frame = document()->frame())
107             frame->eventHandler()->setCapturingMouseEventsNode(this);
108         m_capturing = true;
109     } else if (evt->type() == mouseupEvent) {
110         if (m_capturing && renderer() && renderer()->style()->visibility() == VISIBLE) {
111             if (hovered()) {
112                 input->setValue("");
113                 input->onSearch();
114                 evt->setDefaultHandled();
115             }
116             if (Frame* frame = document()->frame())
117                 frame->eventHandler()->setCapturingMouseEventsNode(0);
118             m_capturing = false;
119         }
120     }
121     if (!evt->defaultHandled())
122         HTMLDivElement::defaultEventHandler(evt);
123 }
124
125 }