| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2008, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2008, 2010 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2010 Google Inc. All rights reserved. | 3 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 { | 201 { |
| 202 RefPtr<SearchFieldCancelButtonElement> element = adoptRef(new SearchFieldCan
celButtonElement(document)); | 202 RefPtr<SearchFieldCancelButtonElement> element = adoptRef(new SearchFieldCan
celButtonElement(document)); |
| 203 element->setPart(AtomicString("-webkit-search-cancel-button", AtomicString::
ConstructFromLiteral)); | 203 element->setPart(AtomicString("-webkit-search-cancel-button", AtomicString::
ConstructFromLiteral)); |
| 204 element->setAttribute(idAttr, ShadowElementNames::clearButton()); | 204 element->setAttribute(idAttr, ShadowElementNames::clearButton()); |
| 205 return element.release(); | 205 return element.release(); |
| 206 } | 206 } |
| 207 | 207 |
| 208 void SearchFieldCancelButtonElement::detach(const AttachContext& context) | 208 void SearchFieldCancelButtonElement::detach(const AttachContext& context) |
| 209 { | 209 { |
| 210 if (m_capturing) { | 210 if (m_capturing) { |
| 211 if (Frame* frame = document()->frame()) | 211 if (Frame* frame = document().frame()) |
| 212 frame->eventHandler()->setCapturingMouseEventsNode(0); | 212 frame->eventHandler()->setCapturingMouseEventsNode(0); |
| 213 } | 213 } |
| 214 HTMLDivElement::detach(context); | 214 HTMLDivElement::detach(context); |
| 215 } | 215 } |
| 216 | 216 |
| 217 | 217 |
| 218 void SearchFieldCancelButtonElement::defaultEventHandler(Event* event) | 218 void SearchFieldCancelButtonElement::defaultEventHandler(Event* event) |
| 219 { | 219 { |
| 220 // If the element is visible, on mouseup, clear the value, and set selection | 220 // If the element is visible, on mouseup, clear the value, and set selection |
| 221 RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); | 221 RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); |
| 222 if (!input || input->isDisabledOrReadOnly()) { | 222 if (!input || input->isDisabledOrReadOnly()) { |
| 223 if (!event->defaultHandled()) | 223 if (!event->defaultHandled()) |
| 224 HTMLDivElement::defaultEventHandler(event); | 224 HTMLDivElement::defaultEventHandler(event); |
| 225 return; | 225 return; |
| 226 } | 226 } |
| 227 | 227 |
| 228 if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() &&
toMouseEvent(event)->button() == LeftButton) { | 228 if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() &&
toMouseEvent(event)->button() == LeftButton) { |
| 229 if (renderer() && renderer()->visibleToHitTesting()) { | 229 if (renderer() && renderer()->visibleToHitTesting()) { |
| 230 if (Frame* frame = document()->frame()) { | 230 if (Frame* frame = document().frame()) { |
| 231 frame->eventHandler()->setCapturingMouseEventsNode(this); | 231 frame->eventHandler()->setCapturingMouseEventsNode(this); |
| 232 m_capturing = true; | 232 m_capturing = true; |
| 233 } | 233 } |
| 234 } | 234 } |
| 235 input->focus(); | 235 input->focus(); |
| 236 input->select(); | 236 input->select(); |
| 237 event->setDefaultHandled(); | 237 event->setDefaultHandled(); |
| 238 } | 238 } |
| 239 if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && t
oMouseEvent(event)->button() == LeftButton) { | 239 if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && t
oMouseEvent(event)->button() == LeftButton) { |
| 240 if (m_capturing) { | 240 if (m_capturing) { |
| 241 if (Frame* frame = document()->frame()) { | 241 if (Frame* frame = document().frame()) { |
| 242 frame->eventHandler()->setCapturingMouseEventsNode(0); | 242 frame->eventHandler()->setCapturingMouseEventsNode(0); |
| 243 m_capturing = false; | 243 m_capturing = false; |
| 244 } | 244 } |
| 245 if (hovered()) { | 245 if (hovered()) { |
| 246 String oldValue = input->value(); | 246 String oldValue = input->value(); |
| 247 input->setValueForUser(""); | 247 input->setValueForUser(""); |
| 248 input->onSearch(); | 248 input->onSearch(); |
| 249 event->setDefaultHandled(); | 249 event->setDefaultHandled(); |
| 250 } | 250 } |
| 251 } | 251 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 | 309 |
| 310 if (!input || input->isDisabledOrReadOnly()) { | 310 if (!input || input->isDisabledOrReadOnly()) { |
| 311 if (!event->defaultHandled()) | 311 if (!event->defaultHandled()) |
| 312 HTMLDivElement::defaultEventHandler(event); | 312 HTMLDivElement::defaultEventHandler(event); |
| 313 return; | 313 return; |
| 314 } | 314 } |
| 315 | 315 |
| 316 // On mouse down, select the text and set focus. | 316 // On mouse down, select the text and set focus. |
| 317 if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() &&
toMouseEvent(event)->button() == LeftButton) { | 317 if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() &&
toMouseEvent(event)->button() == LeftButton) { |
| 318 if (renderer() && renderer()->visibleToHitTesting()) { | 318 if (renderer() && renderer()->visibleToHitTesting()) { |
| 319 if (Frame* frame = document()->frame()) { | 319 if (Frame* frame = document().frame()) { |
| 320 frame->eventHandler()->setCapturingMouseEventsNode(this); | 320 frame->eventHandler()->setCapturingMouseEventsNode(this); |
| 321 m_capturing = true; | 321 m_capturing = true; |
| 322 } | 322 } |
| 323 } | 323 } |
| 324 RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); | 324 RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); |
| 325 input->focus(); | 325 input->focus(); |
| 326 input->select(); | 326 input->select(); |
| 327 event->setDefaultHandled(); | 327 event->setDefaultHandled(); |
| 328 } | 328 } |
| 329 // On mouse up, release capture cleanly. | 329 // On mouse up, release capture cleanly. |
| 330 if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && t
oMouseEvent(event)->button() == LeftButton) { | 330 if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && t
oMouseEvent(event)->button() == LeftButton) { |
| 331 if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { | 331 if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { |
| 332 if (Frame* frame = document()->frame()) { | 332 if (Frame* frame = document().frame()) { |
| 333 frame->eventHandler()->setCapturingMouseEventsNode(0); | 333 frame->eventHandler()->setCapturingMouseEventsNode(0); |
| 334 m_capturing = false; | 334 m_capturing = false; |
| 335 } | 335 } |
| 336 } | 336 } |
| 337 } | 337 } |
| 338 | 338 |
| 339 if (event->type() == eventNames().clickEvent && m_listenerId) { | 339 if (event->type() == eventNames().clickEvent && m_listenerId) { |
| 340 switch (m_state) { | 340 switch (m_state) { |
| 341 case Idle: | 341 case Idle: |
| 342 startSpeechInput(); | 342 startSpeechInput(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 367 void InputFieldSpeechButtonElement::setState(SpeechInputState state) | 367 void InputFieldSpeechButtonElement::setState(SpeechInputState state) |
| 368 { | 368 { |
| 369 if (m_state != state) { | 369 if (m_state != state) { |
| 370 m_state = state; | 370 m_state = state; |
| 371 shadowHost()->renderer()->repaint(); | 371 shadowHost()->renderer()->repaint(); |
| 372 } | 372 } |
| 373 } | 373 } |
| 374 | 374 |
| 375 SpeechInput* InputFieldSpeechButtonElement::speechInput() | 375 SpeechInput* InputFieldSpeechButtonElement::speechInput() |
| 376 { | 376 { |
| 377 return SpeechInput::from(document()->page()); | 377 return SpeechInput::from(document().page()); |
| 378 } | 378 } |
| 379 | 379 |
| 380 void InputFieldSpeechButtonElement::didCompleteRecording(int) | 380 void InputFieldSpeechButtonElement::didCompleteRecording(int) |
| 381 { | 381 { |
| 382 setState(Recognizing); | 382 setState(Recognizing); |
| 383 } | 383 } |
| 384 | 384 |
| 385 void InputFieldSpeechButtonElement::didCompleteRecognition(int) | 385 void InputFieldSpeechButtonElement::didCompleteRecognition(int) |
| 386 { | 386 { |
| 387 setState(Idle); | 387 setState(Idle); |
| 388 } | 388 } |
| 389 | 389 |
| 390 void InputFieldSpeechButtonElement::setRecognitionResult(int, const SpeechInputR
esultArray& results) | 390 void InputFieldSpeechButtonElement::setRecognitionResult(int, const SpeechInputR
esultArray& results) |
| 391 { | 391 { |
| 392 m_results = results; | 392 m_results = results; |
| 393 | 393 |
| 394 // The call to setValue() below dispatches an event, and an event handler in
the page might | 394 // The call to setValue() below dispatches an event, and an event handler in
the page might |
| 395 // remove the input element from DOM. To make sure it remains valid until we
finish our work | 395 // remove the input element from DOM. To make sure it remains valid until we
finish our work |
| 396 // here, we take a temporary reference. | 396 // here, we take a temporary reference. |
| 397 RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); | 397 RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); |
| 398 if (!input || input->isDisabledOrReadOnly()) | 398 if (!input || input->isDisabledOrReadOnly()) |
| 399 return; | 399 return; |
| 400 | 400 |
| 401 RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); | 401 RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); |
| 402 if (document() && document()->domWindow()) { | 402 if (document().domWindow()) { |
| 403 // Call selectionChanged, causing the element to cache the selection, | 403 // Call selectionChanged, causing the element to cache the selection, |
| 404 // so that the text event inserts the text in this element even if | 404 // so that the text event inserts the text in this element even if |
| 405 // focus has moved away from it. | 405 // focus has moved away from it. |
| 406 input->selectionChanged(false); | 406 input->selectionChanged(false); |
| 407 input->dispatchEvent(TextEvent::create(document()->domWindow(), results.
isEmpty() ? "" : results[0]->utterance(), TextEventInputOther)); | 407 input->dispatchEvent(TextEvent::create(document().domWindow(), results.i
sEmpty() ? "" : results[0]->utterance(), TextEventInputOther)); |
| 408 } | 408 } |
| 409 | 409 |
| 410 // This event is sent after the text event so the website can perform action
s using the input field content immediately. | 410 // This event is sent after the text event so the website can perform action
s using the input field content immediately. |
| 411 // It provides alternative recognition hypotheses and notifies that the resu
lts come from speech input. | 411 // It provides alternative recognition hypotheses and notifies that the resu
lts come from speech input. |
| 412 input->dispatchEvent(SpeechInputEvent::create(eventNames().webkitspeechchang
eEvent, results)); | 412 input->dispatchEvent(SpeechInputEvent::create(eventNames().webkitspeechchang
eEvent, results)); |
| 413 | 413 |
| 414 // Check before accessing the renderer as the above event could have potenti
ally turned off | 414 // Check before accessing the renderer as the above event could have potenti
ally turned off |
| 415 // speech in the input element, hence removing this button and renderer from
the hierarchy. | 415 // speech in the input element, hence removing this button and renderer from
the hierarchy. |
| 416 if (renderer()) | 416 if (renderer()) |
| 417 renderer()->repaint(); | 417 renderer()->repaint(); |
| 418 } | 418 } |
| 419 | 419 |
| 420 void InputFieldSpeechButtonElement::attach(const AttachContext& context) | 420 void InputFieldSpeechButtonElement::attach(const AttachContext& context) |
| 421 { | 421 { |
| 422 ASSERT(!m_listenerId); | 422 ASSERT(!m_listenerId); |
| 423 if (SpeechInput* input = SpeechInput::from(document()->page())) | 423 if (SpeechInput* input = SpeechInput::from(document().page())) |
| 424 m_listenerId = input->registerListener(this); | 424 m_listenerId = input->registerListener(this); |
| 425 HTMLDivElement::attach(context); | 425 HTMLDivElement::attach(context); |
| 426 } | 426 } |
| 427 | 427 |
| 428 void InputFieldSpeechButtonElement::detach(const AttachContext& context) | 428 void InputFieldSpeechButtonElement::detach(const AttachContext& context) |
| 429 { | 429 { |
| 430 if (m_capturing) { | 430 if (m_capturing) { |
| 431 if (Frame* frame = document()->frame()) | 431 if (Frame* frame = document().frame()) |
| 432 frame->eventHandler()->setCapturingMouseEventsNode(0); | 432 frame->eventHandler()->setCapturingMouseEventsNode(0); |
| 433 } | 433 } |
| 434 | 434 |
| 435 if (m_listenerId) { | 435 if (m_listenerId) { |
| 436 if (m_state != Idle) | 436 if (m_state != Idle) |
| 437 speechInput()->cancelRecognition(m_listenerId); | 437 speechInput()->cancelRecognition(m_listenerId); |
| 438 speechInput()->unregisterListener(m_listenerId); | 438 speechInput()->unregisterListener(m_listenerId); |
| 439 m_listenerId = 0; | 439 m_listenerId = 0; |
| 440 } | 440 } |
| 441 | 441 |
| 442 HTMLDivElement::detach(context); | 442 HTMLDivElement::detach(context); |
| 443 } | 443 } |
| 444 | 444 |
| 445 void InputFieldSpeechButtonElement::startSpeechInput() | 445 void InputFieldSpeechButtonElement::startSpeechInput() |
| 446 { | 446 { |
| 447 if (m_state != Idle) | 447 if (m_state != Idle) |
| 448 return; | 448 return; |
| 449 | 449 |
| 450 RefPtr<HTMLInputElement> input = toHTMLInputElement(shadowHost()); | 450 RefPtr<HTMLInputElement> input = toHTMLInputElement(shadowHost()); |
| 451 AtomicString language = input->computeInheritedLanguage(); | 451 AtomicString language = input->computeInheritedLanguage(); |
| 452 String grammar = input->getAttribute(webkitgrammarAttr); | 452 String grammar = input->getAttribute(webkitgrammarAttr); |
| 453 IntRect rect = document()->view()->contentsToRootView(pixelSnappedBoundingBo
x()); | 453 IntRect rect = document().view()->contentsToRootView(pixelSnappedBoundingBox
()); |
| 454 if (speechInput()->startRecognition(m_listenerId, rect, language, grammar, d
ocument()->securityOrigin())) | 454 if (speechInput()->startRecognition(m_listenerId, rect, language, grammar, d
ocument().securityOrigin())) |
| 455 setState(Recording); | 455 setState(Recording); |
| 456 } | 456 } |
| 457 | 457 |
| 458 void InputFieldSpeechButtonElement::stopSpeechInput() | 458 void InputFieldSpeechButtonElement::stopSpeechInput() |
| 459 { | 459 { |
| 460 if (m_state == Recording) | 460 if (m_state == Recording) |
| 461 speechInput()->stopRecording(m_listenerId); | 461 speechInput()->stopRecording(m_listenerId); |
| 462 } | 462 } |
| 463 #endif // ENABLE(INPUT_SPEECH) | 463 #endif // ENABLE(INPUT_SPEECH) |
| 464 | 464 |
| 465 } | 465 } |
| OLD | NEW |