1/* 2 * Copyright (C) 2006, 2008, 2010 Apple Inc. All rights reserved. 3 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#ifndef TextControlInnerElements_h 28#define TextControlInnerElements_h 29 30#include "HTMLDivElement.h" 31#include "SpeechInputListener.h" 32#include <wtf/Forward.h> 33 34namespace WebCore { 35 36class RenderTextControlInnerBlock; 37class SpeechInput; 38 39class TextControlInnerContainer final : public HTMLDivElement { 40public: 41 static PassRefPtr<TextControlInnerContainer> create(Document&); 42protected: 43 TextControlInnerContainer(Document&); 44 virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override; 45}; 46 47class TextControlInnerElement final : public HTMLDivElement { 48public: 49 static PassRefPtr<TextControlInnerElement> create(Document&); 50 51protected: 52 TextControlInnerElement(Document&); 53 virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override; 54 55private: 56 virtual bool isMouseFocusable() const override { return false; } 57}; 58 59class TextControlInnerTextElement final : public HTMLDivElement { 60public: 61 static PassRefPtr<TextControlInnerTextElement> create(Document&); 62 63 virtual void defaultEventHandler(Event*) override; 64 65 RenderTextControlInnerBlock* renderer() const; 66 67private: 68 TextControlInnerTextElement(Document&); 69 virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override; 70 virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle) override; 71 virtual bool isMouseFocusable() const override { return false; } 72 virtual bool isTextControlInnerTextElement() const override { return true; } 73}; 74 75inline bool isTextControlInnerTextElement(const HTMLElement& element) { return element.isTextControlInnerTextElement(); } 76inline bool isTextControlInnerTextElement(const Node& node) { return node.isHTMLElement() && isTextControlInnerTextElement(toHTMLElement(node)); } 77NODE_TYPE_CASTS(TextControlInnerTextElement) 78 79class SearchFieldResultsButtonElement final : public HTMLDivElement { 80public: 81 static PassRefPtr<SearchFieldResultsButtonElement> create(Document&); 82 83 virtual void defaultEventHandler(Event*) override; 84#if !PLATFORM(IOS) 85 virtual bool willRespondToMouseClickEvents() override; 86#endif 87 88private: 89 SearchFieldResultsButtonElement(Document&); 90 virtual const AtomicString& shadowPseudoId() const override; 91 virtual bool isMouseFocusable() const override { return false; } 92}; 93 94class SearchFieldCancelButtonElement final : public HTMLDivElement { 95public: 96 static PassRefPtr<SearchFieldCancelButtonElement> create(Document&); 97 98 virtual void defaultEventHandler(Event*) override; 99 virtual bool isSearchFieldCancelButtonElement() const override { return true; } 100#if !PLATFORM(IOS) 101 virtual bool willRespondToMouseClickEvents() override; 102#endif 103 104private: 105 SearchFieldCancelButtonElement(Document&); 106 virtual const AtomicString& shadowPseudoId() const override; 107 virtual void willDetachRenderers() override; 108 virtual bool isMouseFocusable() const override { return false; } 109 110 bool m_capturing; 111}; 112 113#if ENABLE(INPUT_SPEECH) 114 115class InputFieldSpeechButtonElement final 116 : public HTMLDivElement, 117 public SpeechInputListener { 118public: 119 enum SpeechInputState { 120 Idle, 121 Recording, 122 Recognizing, 123 }; 124 125 static PassRefPtr<InputFieldSpeechButtonElement> create(Document&); 126 virtual ~InputFieldSpeechButtonElement(); 127 128 virtual void defaultEventHandler(Event*); 129#if !PLATFORM(IOS) 130 virtual bool willRespondToMouseClickEvents(); 131#endif 132 virtual bool isInputFieldSpeechButtonElement() const { return true; } 133 SpeechInputState state() const { return m_state; } 134 void startSpeechInput(); 135 void stopSpeechInput(); 136 137 // SpeechInputListener methods. 138 void didCompleteRecording(int); 139 void didCompleteRecognition(int); 140 void setRecognitionResult(int, const SpeechInputResultArray&); 141 142private: 143 InputFieldSpeechButtonElement(Document&); 144 SpeechInput* speechInput(); 145 void setState(SpeechInputState state); 146 virtual const AtomicString& shadowPseudoId() const; 147 virtual bool isMouseFocusable() const override { return false; } 148 virtual void willAttachRenderers() override; 149 virtual void willDetachRenderers() override; 150 151 152 bool m_capturing; 153 SpeechInputState m_state; 154 int m_listenerId; 155 SpeechInputResultArray m_results; 156}; 157 158inline InputFieldSpeechButtonElement* toInputFieldSpeechButtonElement(Element* element) 159{ 160 ASSERT_WITH_SECURITY_IMPLICATION(!element || element->isInputFieldSpeechButtonElement()); 161 return static_cast<InputFieldSpeechButtonElement*>(element); 162} 163 164#endif // ENABLE(INPUT_SPEECH) 165 166} // namespace 167 168#endif 169