void InputFieldSpeechButtonElement::setRecognitionResult(int, const SpeechInputResultArray& results) { m_results = results; // The call to setValue() below dispatches an event, and an event handler in the page might // remove the input element from DOM. To make sure it remains valid until we finish our work // here, we take a temporary reference. RefPtr<HTMLInputElement> input(static_cast<HTMLInputElement*>(shadowHost())); if (input->disabled() || input->readOnly()) return; RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); if (document() && document()->domWindow()) { // Call selectionChanged, causing the element to cache the selection, // so that the text event inserts the text in this element even if // focus has moved away from it. input->selectionChanged(false); input->dispatchEvent(TextEvent::create(document()->domWindow(), results.isEmpty() ? "" : results[0]->utterance(), TextEventInputOther)); } // This event is sent after the text event so the website can perform actions using the input field content immediately. // It provides alternative recognition hypotheses and notifies that the results come from speech input. input->dispatchEvent(SpeechInputEvent::create(eventNames().webkitspeechchangeEvent, results)); // Check before accessing the renderer as the above event could have potentially turned off // speech in the input element, hence removing this button and renderer from the hierarchy. if (renderer()) renderer()->repaint(); }
void InputFieldSpeechButtonElement::setRecognitionResult(int, const SpeechInputResultArray& results) { m_results = results; // The call to setValue() below dispatches an event, and an event handler in the page might // remove the input element from DOM. To make sure it remains valid until we finish our work // here, we take a temporary reference. RefPtr<HTMLInputElement> input(static_cast<HTMLInputElement*>(shadowAncestorNode())); if (input->disabled() || input->isReadOnlyFormControl()) return; RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); input->setValue(results.isEmpty() ? "" : results[0]->utterance()); input->dispatchEvent(SpeechInputEvent::create(eventNames().webkitspeechchangeEvent, results)); // Check before accessing the renderer as the above event could have potentially turned off // speech in the input element, hence removing this button and renderer from the hierarchy. if (renderer()) renderer()->repaint(); }