-
jpu@apple.com authored
https://bugs.webkit.org/show_bug.cgi?id=83047 Reviewed by Enrica Casucci. Tests: platform/mac/editing/input/edit-dictated-text-with-alternative.html platform/mac/editing/input/insert-dictated-text.html This patch implements visual indication on dictated text with alternatives, and provides UI to show alternative text on OS X. Majority of the changes is for generalizing existing AlternativeTextController class to handle dictation alternatives. The two new classes, AlternativeTextUIController and TextAlternativeWithRange, are used by both WebKit and WK2. So WebCore seems to be the natural place for them. * WebCore.exp.in: * WebCore.xcodeproj/project.pbxproj: * editing/AlternativeTextController.cpp: Expanded exising class interface to support dictation alternatives. (DictationAlternativeDetails): Marker detail class for dictation alternative mark. (WebCore::DictationAlternativeDetails::create): (WebCore::DictationAlternativeDetails::dictationContext): (WebCore::DictationAlternativeDetails::DictationAlternativeDetails): (WebCore::markerTypesForAppliedDictationAlternative): (WebCore::AlternativeTextController::applyAlternativeTextToRange): Generalized existing applyAlternativeTextToRange() to handle dictation alternatives. (WebCore::AlternativeTextController::timerFired): Expanded existing code to handle dictation alternatives. (WebCore::AlternativeTextController::handleAlternativeTextUIResult): Expanded existing code to handle dictation alternatives. (WebCore::AlternativeTextController::respondToChangedSelection): Moved part of the function into respondToMarkerAtEndOfWord() to improve readability. (WebCore::AlternativeTextController::shouldStartTimerFor): (WebCore::AlternativeTextController::respondToMarkerAtEndOfWord): (WebCore::AlternativeTextController::markerDescriptionForAppliedAlternativeText): (WebCore::AlternativeTextController::removeDictationAlternativesForMarker): (WebCore::AlternativeTextController::dictationAlternativesForMarker): (WebCore::AlternativeTextController::applyDictationAlternative): * editing/AlternativeTextController.h: * editing/Editor.cpp: (WebCore::Editor::notifyComponentsOnChangedSelection): Renamed existing respondToChangedSelection() function to avoid naming collision. (WebCore::Editor::appliedEditing): (WebCore::Editor::unappliedEditing): (WebCore::Editor::reappliedEditing): (WebCore::Editor::updateMarkersForWordsAffectedByEditing): (WebCore::Editor::changeSelectionAfterCommand): (WebCore::Editor::respondToChangedSelection): (WebCore::Editor::dictationAlternativesForMarker): (WebCore::Editor::applyDictationAlternativelternative): * editing/Editor.h: * editing/FrameSelection.h: * editing/mac/AlternativeTextUIController.h: Added. WK1 and WK2 use this class to keep track of text alternatives objects. (AlternativeTextUIController): (WebCore::AlternativeTextUIController::AlternativeTextUIController): (AlernativeTextContextController): (WebCore::AlternativeTextUIController::AlernativeTextContextController::AlernativeTextContextController): * editing/mac/AlternativeTextUIController.mm: Added. (WebCore::AlternativeTextUIController::AlernativeTextContextController::addAlternatives): (WebCore::AlternativeTextUIController::AlernativeTextContextController::alternativesForContext): (WebCore::AlternativeTextUIController::AlernativeTextContextController::removeAlternativesForContext): (WebCore::AlternativeTextUIController::AlernativeTextContextController::clear): (WebCore::AlternativeTextUIController::addAlternatives): (WebCore::AlternativeTextUIController::alternativesForContext): (WebCore::AlternativeTextUIController::clear): (WebCore::AlternativeTextUIController::showAlternatives): (WebCore::AlternativeTextUIController::handleAcceptedAlternative): (WebCore::AlternativeTextUIController::dismissAlternatives): (WebCore::AlternativeTextUIController::removeAlternatives): * editing/mac/TextAlternativeWithRange.h: Added. A simple struct to make it easier to pass around a pair of text alternatives object and range. * editing/mac/TextAlternativeWithRange.mm: Added. (WebCore::TextAlternativeWithRange::TextAlternativeWithRange): (WebCore::collectDictationTextAlternatives): * page/AlternativeTextClient.h: * page/ContextMenuController.cpp: Added code to show alternative dictated text in context menu. (WebCore::ContextMenuController::contextMenuItemSelected): (WebCore::ContextMenuController::populate): (WebCore::ContextMenuController::checkOrEnableIfNeeded): * platform/ContextMenuItem.h: * rendering/HitTestResult.cpp: (WebCore::HitTestResult::dictationAlternatives): * rendering/HitTestResult.h: * rendering/InlineTextBox.cpp: (WebCore::InlineTextBox::paintDocumentMarker): Changes in WebKit include implementation of new functions declared in AlternativeTextClient, and logic for calling Editor::insertDictatedText() instead of Editor::insertText() when there's alternatives attached to the input string. * WebCoreSupport/CorrectionPanel.mm: (correctionIndicatorType): (CorrectionPanel::handleAcceptedReplacement): * WebCoreSupport/WebAlternativeTextClient.h: (WebAlternativeTextClient): * WebCoreSupport/WebAlternativeTextClient.mm: (WebAlternativeTextClient::showCorrectionAlternative): (WebAlternativeTextClient::dismissAlternative): (WebAlternativeTextClient::dismissAlternativeSoon): (WebAlternativeTextClient::recordAutocorrectionResponse): (WebAlternativeTextClient::removeDictationAlternatives): (WebAlternativeTextClient::showDictationAlternativeUI): (WebAlternativeTextClient::dismissDictationAlternativeUI): (WebAlternativeTextClient::dictationAlternatives): * WebView/WebHTMLView.mm: (-[WebHTMLView validAttributesForMarkedText]): (-[WebHTMLView insertText:]): * WebView/WebView.mm: (-[WebView handleAcceptedAlternativeText:]): (-[WebView _getWebCoreDictationAlternatives:fromTextAlternatives:]): (-[WebView _showDictationAlternativeUI:WebCore::forDictationContext:]): (-[WebView _dismissDictationAlternativeUI]): (-[WebView _removeDictationAlternatives:]): (-[WebView _dictationAlternatives:]): * WebView/WebViewData.h: * WebView/WebViewData.mm: (-[WebViewPrivate init]): * WebView/WebViewInternal.h: * WebView/WebViewPrivate.h: Changes in WebKit2 include implementation of new functions declared in AlternativeTextClient, and logic for calling Editor::insertDictatedText() instead of Editor::insertText() when there's alternatives attached to the input string. * Shared/API/c/WKContextMenuItemTypes.h: * Shared/API/c/WKSharedAPICast.h: * Shared/WebCoreArgumentCoders.cpp: * Shared/WebCoreArgumentCoders.h: * UIProcess/API/mac/PageClientImpl.h: * UIProcess/API/mac/PageClientImpl.mm: (WebKit::PageClientImpl::PageClientImpl): (WebKit::PageClientImpl::pageClosed): (WebKit::PageClientImpl::addDictationAlternatives): (WebKit::PageClientImpl::removeDictationAlternatives): (WebKit::PageClientImpl::showDictationAlternativeUI): (WebKit::PageClientImpl::dictationAlternatives): (WebKit::PageClientImpl::dismissDictationAlternativeUI): * UIProcess/API/mac/WKView.mm: (-[WKView insertText:replacementRange:]): (-[WKView validAttributesForMarkedText]): (-[WKView handleAcceptedAlternativeText:]): * UIProcess/API/mac/WKViewInternal.h: * UIProcess/PageClient.h: * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::showDictationAlternativeUI): (WebKit::WebPageProxy::dismissDictationAlternativeUI): (WebKit::WebPageProxy::removeDictationAlternatives): (WebKit::WebPageProxy::dictationAlternatives): * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/CorrectionPanel.mm: (correctionIndicatorType): (WebKit::CorrectionPanel::handleAcceptedReplacement): * UIProcess/mac/WebPageProxyMac.mm: (WebKit::WebPageProxy::insertDictatedText): * WebProcess/WebCoreSupport/WebAlternativeTextClient.h: (WebAlternativeTextClient): * WebProcess/WebCoreSupport/mac/WebAlternativeTextClient.cpp: (WebKit::WebAlternativeTextClient::showCorrectionAlternative): (WebKit::WebAlternativeTextClient::dismissAlternative): (WebKit::WebAlternativeTextClient::dismissAlternativeSoon): (WebKit::WebAlternativeTextClient::recordAutocorrectionResponse): (WebKit::WebAlternativeTextClient::removeDictationAlternatives): (WebKit::WebAlternativeTextClient::showDictationAlternativeUI): (WebKit::WebAlternativeTextClient::dismissDictationAlternativeUI): (WebKit::WebAlternativeTextClient::dictationAlternatives): * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/WebPage.messages.in: * WebProcess/WebPage/mac/WebPageMac.mm: (WebKit::WebPage::insertDictatedText): * platform/mac-lion/Skipped: * platform/mac-snowleopard/Skipped: * platform/mac/editing/input/edit-dictated-text-with-alternative-expected.txt: Added. * platform/mac/editing/input/edit-dictated-text-with-alternative.html: Added. * platform/mac/editing/input/insert-dictated-text-expected.txt: Added. * platform/mac/editing/input/insert-dictated-text.html: Added. * DumpRenderTree/mac/TextInputController.m: (+[TextInputController isSelectorExcludedFromWebScript:]): (+[TextInputController webScriptNameForSelector:]): (-[TextInputController dictatedStringWithPrimaryString:alternative:alternativeOffset:alternativeLength:]): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@120357 268f45cc-cd09-0410-ab3c-d52691b4dbfc
e1c1a77e