Skip to content
  • jpu@apple.com's avatar
    Mark text with text alternative with blue underline. · e1c1a77e
    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