Title: [154627] trunk/Source/WebKit
Revision
154627
Author
roger_f...@apple.com
Date
2013-08-26 12:01:23 -0700 (Mon, 26 Aug 2013)

Log Message

<https://bugs.webkit.org/show_bug.cgi?id=119829> Add IAccessibleText and IAccessibleEditableText interfaces and implementation to AppleWin port.

Reviewed by Chris Fleizach.

* AccessibleBase.cpp:
(AccessibleBase::createInstance): Create an AccessibleText instance when necessary.
(AccessibleBase::QueryService):
* AccessibleBase.h:
* AccessibleTextImpl.cpp: Added.
(AccessibleText::AccessibleText):
(AccessibleText::addSelection):
(AccessibleText::get_attributes): Not Implemented
(AccessibleText::get_caretOffset):
(AccessibleText::get_characterExtents):
(AccessibleText::get_nSelections):
(AccessibleText::get_offsetAtPoint):
(AccessibleText::get_selection):
(AccessibleText::get_text):
(AccessibleText::get_textBeforeOffset): Not Implemented
(AccessibleText::get_textAfterOffset): Not Implemented
(AccessibleText::get_textAtOffset): Not Implemented
(AccessibleText::removeSelection):
(AccessibleText::setCaretOffset):
(AccessibleText::setSelection):
(AccessibleText::get_nCharacters):
(AccessibleText::scrollSubstringTo):
(AccessibleText::scrollSubstringToPoint):
(AccessibleText::get_newText): Not Implemented
(AccessibleText::get_oldText): Not Implemented
(AccessibleText::get_attributeRange): Not Implemented
(AccessibleText::copyText):
(AccessibleText::deleteText):
(AccessibleText::insertText):
(AccessibleText::cutText):
(AccessibleText::pasteText):
(AccessibleText::replaceText):
(AccessibleText::setAttributes): Not Implemented
(AccessibleText::QueryInterface):
(AccessibleText::Release):
(AccessibleText::convertSpecialOffset):
(AccessibleText::initialCheck):
* AccessibleTextImpl.h: Added.
(AccessibleText::~AccessibleText):
(AccessibleText::AddRef):
* WebKit.vcxproj/Interfaces/Interfaces.vcxproj:
* WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters:
* WebKit.vcxproj/WebKit/WebKit.vcxproj:
* WebKit.vcxproj/WebKit/WebKit.vcxproj.filters:
* WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj:
* WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (154626 => 154627)


--- trunk/Source/WebKit/ChangeLog	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/ChangeLog	2013-08-26 19:01:23 UTC (rev 154627)
@@ -1,3 +1,16 @@
+2013-08-21  Roger Fong  <roger_f...@apple.com>
+
+        <https://bugs.webkit.org/show_bug.cgi?id=119829> IAccessibleText and IAccessibleEditableText implementation for AppleWindows port.
+
+        Reviewed by Chris Fleizach.
+
+        * WebKit.vcxproj/Interfaces/Interfaces.vcxproj:
+        * WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters:
+        * WebKit.vcxproj/WebKit/WebKit.vcxproj:
+        * WebKit.vcxproj/WebKit/WebKit.vcxproj.filters:
+        * WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj:
+        * WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters:
+
 2013-08-26  Brent Fulgham  <bfulg...@apple.com>
 
         [Windows] Build fix after r154541.

Modified: trunk/Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj (154626 => 154627)


--- trunk/Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj	2013-08-26 19:01:23 UTC (rev 154627)
@@ -326,8 +326,11 @@
     <Midl Include="..\..\win\Interfaces\Accessible2\Accessible2.idl" />
     <Midl Include="..\..\win\Interfaces\Accessible2\Accessible2_2.idl" />
     <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleApplication.idl" />
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleEditableText.idl" />
     <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleRelation.idl" />
     <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleStates.idl" />
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleText.idl" />
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleText2.idl" />
     <Midl Include="..\..\win\Interfaces\AccessibleComparable.idl">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>

Modified: trunk/Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters (154626 => 154627)


--- trunk/Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters	2013-08-26 19:01:23 UTC (rev 154627)
@@ -277,6 +277,15 @@
     <Midl Include="..\..\win\Interfaces\AccessibilityDelegate.idl">
       <Filter>IDL</Filter>
     </Midl>
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleText.idl">
+      <Filter>IDL\Accessibility2</Filter>
+    </Midl>
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleText2.idl">
+      <Filter>IDL\Accessibility2</Filter>
+    </Midl>
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleEditableText.idl">
+      <Filter>IDL\Accessibility2</Filter>
+    </Midl>
   </ItemGroup>
   <ItemGroup>
     <None Include="InterfacesPostBuild.cmd" />

Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj (154626 => 154627)


--- trunk/Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj	2013-08-26 19:01:23 UTC (rev 154627)
@@ -269,6 +269,7 @@
     <ClCompile Include="..\..\win\AccessibleBase.cpp" />
     <ClCompile Include="..\..\win\AccessibleDocument.cpp" />
     <ClCompile Include="..\..\win\AccessibleImage.cpp" />
+    <ClCompile Include="..\..\win\AccessibleTextImpl.cpp" />
     <ClCompile Include="..\..\win\CFDictionaryPropertyBag.cpp" />
     <ClCompile Include="..\..\win\DefaultDownloadDelegate.cpp" />
     <ClCompile Include="..\..\win\DefaultPolicyDelegate.cpp" />
@@ -416,6 +417,7 @@
     <ClInclude Include="..\..\win\AccessibleBase.h" />
     <ClInclude Include="..\..\win\AccessibleDocument.h" />
     <ClInclude Include="..\..\win\AccessibleImage.h" />
+    <ClInclude Include="..\..\win\AccessibleTextImpl.h" />
     <ClInclude Include="..\..\win\CFDictionaryPropertyBag.h" />
     <ClInclude Include="..\..\win\CodeAnalysisConfig.h" />
     <ClInclude Include="..\..\win\COMEnumVariant.h" />

Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj.filters (154626 => 154627)


--- trunk/Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj.filters	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKit/WebKit.vcxproj.filters	2013-08-26 19:01:23 UTC (rev 154627)
@@ -275,6 +275,9 @@
     <ClCompile Include="..\..\cf\WebCoreSupport\WebInspectorClientCF.cpp">
       <Filter>WebCoreSupport</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\win\AccessibleTextImpl.cpp">
+      <Filter>Sources</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\win\WebCoreSupport\EmbeddedWidget.h">
@@ -536,6 +539,9 @@
       <Filter>Header Files</Filter>
     </ClInclude>
     <ClInclude Include="..\..\win\WebKitPrefix.h" />
+    <ClInclude Include="..\..\win\AccessibleTextImpl.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="WebKitPostBuild.cmd" />
@@ -628,4 +634,4 @@
       <Filter>Resources</Filter>
     </ResourceCompile>
   </ItemGroup>
-</Project>
+</Project>
\ No newline at end of file

Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj (154626 => 154627)


--- trunk/Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj	2013-08-26 19:01:23 UTC (rev 154627)
@@ -268,6 +268,9 @@
     <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\WebKit\Interfaces\Accessible2_2_i.c" />
     <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\WebKit\Interfaces\AccessibleApplication_i.c" />
     <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\WebKit\Interfaces\AccessibleRelation_i.c" />
+    <ClCompile Include="..\..\..\..\WebKitBuild\Release\obj32\WebKit\Interfaces\AccessibleEditableText_i.c" />
+    <ClCompile Include="..\..\..\..\WebKitBuild\Release\obj32\WebKit\Interfaces\AccessibleText2_i.c" />
+    <ClCompile Include="..\..\..\..\WebKitBuild\Release\obj32\WebKit\Interfaces\AccessibleText_i.c" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters (154626 => 154627)


--- trunk/Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters	2013-08-26 19:01:23 UTC (rev 154627)
@@ -10,5 +10,8 @@
     <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\WebKit\Interfaces\Accessible2_2_i.c" />
     <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\WebKit\Interfaces\AccessibleApplication_i.c" />
     <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\WebKit\Interfaces\AccessibleRelation_i.c" />
+    <ClCompile Include="..\..\..\..\WebKitBuild\Release\obj32\WebKit\Interfaces\AccessibleEditableText_i.c" />
+    <ClCompile Include="..\..\..\..\WebKitBuild\Release\obj32\WebKit\Interfaces\AccessibleText_i.c" />
+    <ClCompile Include="..\..\..\..\WebKitBuild\Release\obj32\WebKit\Interfaces\AccessibleText2_i.c" />
   </ItemGroup>
 </Project>
\ No newline at end of file

Modified: trunk/Source/WebKit/win/AccessibleBase.cpp (154626 => 154627)


--- trunk/Source/WebKit/win/AccessibleBase.cpp	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/win/AccessibleBase.cpp	2013-08-26 19:01:23 UTC (rev 154627)
@@ -29,6 +29,7 @@
 #include "AccessibleBase.h"
 
 #include "AccessibleImage.h"
+#include "AccessibleTextImpl.h"
 #include "WebView.h"
 #include <WebCore/AccessibilityListBox.h>
 #include <WebCore/AccessibilityMenuListPopup.h>
@@ -78,6 +79,8 @@
 
     if (obj->isImage())
         return new AccessibleImage(obj, window);
+    else if (obj->isStaticText() || obj->isTextControl() || (obj->node() && obj->node()->isTextNode()))
+        return new AccessibleText(obj, window);
 
     return new AccessibleBase(obj, window);
 }
@@ -88,7 +91,10 @@
         && !IsEqualGUID(guidService, IID_IAccessible2_2)
         && !IsEqualGUID(guidService, IID_IAccessible2)
         && !IsEqualGUID(guidService, IID_IAccessibleApplication)
-        && !IsEqualGUID(guidService, IID_IAccessible)) {
+        && !IsEqualGUID(guidService, IID_IAccessible)
+        && !IsEqualGUID(guidService, IID_IAccessibleText)
+        && !IsEqualGUID(guidService, IID_IAccessibleText2)
+        && !IsEqualGUID(guidService, IID_IAccessibleEditableText)) {
         *ppvObject = 0;
         return E_INVALIDARG;
     }

Modified: trunk/Source/WebKit/win/AccessibleBase.h (154626 => 154627)


--- trunk/Source/WebKit/win/AccessibleBase.h	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/win/AccessibleBase.h	2013-08-26 19:01:23 UTC (rev 154627)
@@ -26,6 +26,9 @@
 #ifndef AccessibleBase_h
 #define AccessibleBase_h
 
+#include "AccessibleEditableText.h"
+#include "AccessibleText.h"
+#include "AccessibleText2.h"
 #include "WebKit.h"
 #include <WebCore/AccessibilityObject.h>
 #include <WebCore/AccessibilityObjectWrapperWin.h>

Added: trunk/Source/WebKit/win/AccessibleTextImpl.cpp (0 => 154627)


--- trunk/Source/WebKit/win/AccessibleTextImpl.cpp	                        (rev 0)
+++ trunk/Source/WebKit/win/AccessibleTextImpl.cpp	2013-08-26 19:01:23 UTC (rev 154627)
@@ -0,0 +1,576 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All Rights Reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR
+ * PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "AccessibleTextImpl.h"
+
+#include "WebKitDLL.h"
+#include "WebView.h"
+
+#include <WebCore/Document.h>
+#include <WebCore/Editor.h>
+#include <WebCore/Frame.h>
+#include <WebCore/FrameSelection.h>
+#include <WebCore/HTMLTextFormControlElement.h>
+#include <WebCore/Node.h>
+#include <WebCore/Page.h>
+#include <WebCore/Position.h>
+#include <WebCore/RenderTextControl.h>
+#include <WebCore/VisibleSelection.h>
+#include <WebCore/htmlediting.h>
+
+using namespace WebCore;
+
+AccessibleText::AccessibleText(WebCore::AccessibilityObject* obj, HWND window)
+    : AccessibleBase(obj, window)
+{
+    ASSERT_ARG(obj, obj->isStaticText() || obj->isTextControl() || (obj->node() && obj->node()->isTextNode()));
+    ASSERT_ARG(obj, obj->isAccessibilityRenderObject());
+}
+
+// IAccessibleText
+HRESULT AccessibleText::addSelection(long startOffset, long endOffset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startOffset = convertSpecialOffset(startOffset);
+    endOffset = convertSpecialOffset(endOffset);
+
+    m_object->setSelectedTextRange(PlainTextRange(startOffset, endOffset-startOffset));
+    
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_attributes(long offset, long* startOffset, long* endOffset, BSTR* textAttributes)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    offset = convertSpecialOffset(offset);
+
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleText::get_caretOffset(long* offset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    VisiblePosition caretPosition = m_object->visiblePositionForPoint(m_object->document()->frame()->selection().absoluteCaretBounds().center());
+
+    int caretOffset = caretPosition.deepEquivalent().offsetInContainerNode();
+    if (caretOffset < 0)
+        return E_FAIL;
+    *offset = caretOffset;
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_characterExtents(long offset, enum IA2CoordinateType coordType, long* x, long* y, long* width, long* height)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    offset = convertSpecialOffset(offset);
+
+    Node* node = m_object->node();
+    if (!node)
+        return E_POINTER;
+
+    IntRect boundingRect = m_object->boundsForVisiblePositionRange(VisiblePositionRange(VisiblePosition(Position(node, offset, Position::PositionIsOffsetInAnchor)), VisiblePosition(Position(node, offset+1, Position::PositionIsOffsetInAnchor))));
+    *width = boundingRect.width();
+    *height = boundingRect.height();
+    switch (coordType) {
+    case IA2_COORDTYPE_SCREEN_RELATIVE:
+        POINT points[1];
+        points[0].x = boundingRect.x();
+        points[0].y = boundingRect.y();
+        MapWindowPoints(m_window, 0, points, 1);
+        *x = points[0].x;
+        *y = points[0].y;
+        break;
+    case IA2_COORDTYPE_PARENT_RELATIVE:
+        *x = boundingRect.x();
+        *y = boundingRect.y();
+        break;
+    default:
+        return E_INVALIDARG;
+    }
+
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_nSelections(long* nSelections)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    if (m_object->document()->frame()->selection().isNone())
+        *nSelections = 0;
+    else
+        *nSelections = 1;
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_offsetAtPoint(long x, long y, enum IA2CoordinateType coordType, long* offset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    Node* node = m_object->node();
+    if (!node)
+        return E_POINTER;
+
+    VisiblePosition vpos;
+    switch (coordType) {
+    case IA2_COORDTYPE_SCREEN_RELATIVE:
+        POINT points[1];
+        points[0].x = x;
+        points[0].y = y;
+        MapWindowPoints(0, m_window, points, 1);
+        vpos = m_object->visiblePositionForPoint(IntPoint(points[0].x, points[0].y));
+        break;
+    case IA2_COORDTYPE_PARENT_RELATIVE:
+        vpos = m_object->visiblePositionForPoint(IntPoint(x, y));
+        break;
+    default:
+        return E_INVALIDARG;
+    }
+
+    int caretPosition = vpos.deepEquivalent().offsetInContainerNode();
+    if (caretPosition < 0 || caretPosition > m_object->stringValue().length())
+        return S_FALSE; 
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_selection(long selectionIndex, long* startOffset, long* endOffset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    long selections;
+    get_nSelections(&selections);
+    if (selectionIndex < 0 || selectionIndex >= selections)
+        return E_INVALIDARG;
+
+    PlainTextRange selectionRange = m_object->selectedTextRange();
+
+    *startOffset = selectionRange.start;
+    *endOffset = selectionRange.length;
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_text(long startOffset, long endOffset, BSTR* text)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startOffset = convertSpecialOffset(startOffset);
+    endOffset = convertSpecialOffset(endOffset);
+    WTF::String substringText = m_object->stringValue().substring(startOffset, endOffset - startOffset);
+
+    *text = SysAllocStringLen(substringText.characters(), substringText.length());
+    if (substringText.length() && !*text)
+        return E_OUTOFMEMORY;
+
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_textBeforeOffset(long offset, enum IA2TextBoundaryType boundaryType, long* startOffset, long* endOffset, BSTR* text)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+    
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleText::get_textAfterOffset(long offset, enum IA2TextBoundaryType boundaryType, long* startOffset, long* endOffset, BSTR* text)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+    
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleText::get_textAtOffset(long offset, enum IA2TextBoundaryType boundaryType, long* startOffset, long* endOffset, BSTR* text)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+    
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleText::removeSelection(long selectionIndex)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    long selections;
+    get_nSelections(&selections);
+    if (selectionIndex < 0 || selectionIndex >= selections)
+        return E_INVALIDARG;
+
+    m_object->document()->frame()->selection().clear();
+    return S_OK;
+}
+
+HRESULT AccessibleText::setCaretOffset(long offset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+        
+    offset = convertSpecialOffset(offset);
+
+    Node* node = m_object->node();
+    if (!node)
+        return E_POINTER;
+
+    m_object->document()->frame()->selection().setSelection(VisibleSelection(VisiblePosition(Position(node, offset, Position::PositionIsOffsetInAnchor))));
+    return S_OK;
+}
+
+HRESULT AccessibleText::setSelection(long selectionIndex, long startOffset, long endOffset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    long selections;
+    get_nSelections(&selections);
+    if (selectionIndex < 0 || selectionIndex >= selections)
+        return E_INVALIDARG;
+
+    m_object->setSelectedTextRange(PlainTextRange(startOffset, endOffset - startOffset));
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_nCharacters(long* characters)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    int length = m_object->stringValue().length();
+    if (length < 0)
+        return E_FAIL;
+
+    *characters = length;
+    return S_OK;
+}
+
+HRESULT AccessibleText::scrollSubstringTo(long startIndex, long endIndex, enum IA2ScrollType scrollType)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startIndex = convertSpecialOffset(startIndex);
+    endIndex = convertSpecialOffset(endIndex);
+
+    VisiblePositionRange textRange = m_object->visiblePositionRangeForRange(PlainTextRange(startIndex, endIndex-startIndex));
+    if (textRange.start.isNull() || textRange.end.isNull())
+        return S_FALSE;
+
+    IntRect boundingBox = makeRange(textRange.start, textRange.end)->boundingBox();
+    switch (scrollType) {
+    case IA2_SCROLL_TYPE_TOP_LEFT:
+        m_object->scrollToGlobalPoint(boundingBox.minXMinYCorner());
+        break;
+    case IA2_SCROLL_TYPE_BOTTOM_RIGHT:
+        m_object->scrollToGlobalPoint(boundingBox.maxXMaxYCorner());
+        break;
+    case IA2_SCROLL_TYPE_TOP_EDGE:
+        m_object->scrollToGlobalPoint(IntPoint((boundingBox.x() + boundingBox.maxX()) / 2, boundingBox.y()));
+        break;
+    case IA2_SCROLL_TYPE_BOTTOM_EDGE:
+        m_object->scrollToGlobalPoint(IntPoint((boundingBox.x() + boundingBox.maxX()) / 2, boundingBox.maxY()));
+        break;
+    case IA2_SCROLL_TYPE_LEFT_EDGE:
+        m_object->scrollToGlobalPoint(IntPoint(boundingBox.x(), (boundingBox.y() + boundingBox.maxY()) / 2));
+        break;
+    case IA2_SCROLL_TYPE_RIGHT_EDGE:
+        m_object->scrollToGlobalPoint(IntPoint(boundingBox.maxX(), (boundingBox.y() + boundingBox.maxY()) / 2));
+        break;
+    case IA2_SCROLL_TYPE_ANYWHERE:
+        m_object->scrollToGlobalPoint(boundingBox.center());
+        break;
+    default:
+        return E_INVALIDARG;
+    }
+    return S_OK;
+}
+
+HRESULT AccessibleText::scrollSubstringToPoint(long startIndex, long endIndex, enum IA2CoordinateType coordinateType, long x, long y)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startIndex = convertSpecialOffset(startIndex);
+    endIndex = convertSpecialOffset(endIndex);
+
+    switch (coordinateType) {
+    case IA2_COORDTYPE_SCREEN_RELATIVE:
+        POINT points[1];
+        points[0].x = x;
+        points[0].y = y;
+        MapWindowPoints(0, m_window, points, 1);
+        m_object->scrollToGlobalPoint(IntPoint(points[0].x, points[0].y));
+        break;
+    case IA2_COORDTYPE_PARENT_RELATIVE:
+        m_object->scrollToGlobalPoint(IntPoint(x, y));
+        break;
+    default:
+        return E_INVALIDARG;
+    }
+
+    return S_OK;
+}
+
+HRESULT AccessibleText::get_newText(IA2TextSegment* newText)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+    
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleText::get_oldText(IA2TextSegment* oldText)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    return E_NOTIMPL;
+}
+
+
+// IAccessibleText2
+HRESULT AccessibleText::get_attributeRange(long offset, BSTR filter, long* startOffset, long* endOffset, BSTR* attributeValues)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleText::copyText(long startOffset, long endOffset)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startOffset = convertSpecialOffset(startOffset);
+    endOffset = convertSpecialOffset(endOffset);
+
+    Frame* frame = m_object->document()->frame();
+    if (!frame)
+        return E_POINTER;
+
+    addSelection(startOffset, endOffset);
+
+    frame->editor().copy();
+    return S_OK;
+}
+
+HRESULT AccessibleText::deleteText(long startOffset, long endOffset)
+{
+    if (m_object->isReadOnly())
+        return S_FALSE;
+
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    Frame* frame = m_object->document()->frame();
+    if (!frame)
+        return E_POINTER;
+
+    addSelection(startOffset, endOffset);
+
+    frame->editor().deleteSelectionWithSmartDelete(false);
+    return S_OK;
+}
+
+HRESULT AccessibleText::insertText(long offset, BSTR* text)
+{
+    if (m_object->isReadOnly())
+        return S_FALSE;
+
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    offset = convertSpecialOffset(offset);
+
+    Frame* frame = m_object->document()->frame();
+    if (!frame)
+        return E_POINTER;
+    
+    addSelection(offset, offset);
+
+    frame->editor().insertText(*text, 0);
+    return S_OK;
+}
+
+HRESULT AccessibleText::cutText(long startOffset, long endOffset)
+{
+    if (m_object->isReadOnly())
+        return S_FALSE;
+
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startOffset = convertSpecialOffset(startOffset);
+    endOffset = convertSpecialOffset(endOffset);
+
+    Frame* frame = m_object->document()->frame();
+    if (!frame)
+        return E_POINTER;
+
+    addSelection(startOffset, endOffset);
+
+    frame->editor().cut();
+    return S_OK;
+}
+
+HRESULT AccessibleText::pasteText(long offset)
+{
+    if (m_object->isReadOnly())
+        return S_FALSE;
+
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    offset = convertSpecialOffset(offset);
+
+    Frame* frame = m_object->document()->frame();
+    if (!frame)
+        return E_POINTER;
+
+    addSelection(offset, offset);
+
+    frame->editor().paste();
+    return S_OK;
+}
+
+HRESULT AccessibleText::replaceText(long startOffset, long endOffset, BSTR* text)
+{
+    if (m_object->isReadOnly())
+        return S_FALSE;
+
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    startOffset = convertSpecialOffset(startOffset);
+    endOffset = convertSpecialOffset(endOffset);
+
+    Frame* frame = m_object->document()->frame();
+    if (!frame)
+        return E_POINTER;
+
+    addSelection(startOffset, endOffset);
+
+    frame->editor().replaceSelectionWithText(*text, true, false);
+    return S_OK;
+}
+
+HRESULT AccessibleText::setAttributes(long startOffset, long endOffset, BSTR* attributes)
+{
+    if (initialCheck() == E_POINTER)
+        return E_POINTER;
+
+    return E_NOTIMPL;
+}
+
+// IAccessible2
+HRESULT AccessibleText::get_attributes(BSTR* attributes)
+{
+    WTF::String text("text-model:a1");
+    *attributes = SysAllocStringLen(text.characters(), text.length());
+    return S_OK;
+}
+
+// IUnknown
+HRESULT STDMETHODCALLTYPE AccessibleText::QueryInterface(REFIID riid, void** ppvObject)
+{
+    if (IsEqualGUID(riid, __uuidof(IAccessibleText)))
+        *ppvObject = static_cast<IAccessibleText*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IAccessibleEditableText)))
+        *ppvObject = static_cast<IAccessibleEditableText*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IAccessible)))
+        *ppvObject = static_cast<IAccessible*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IDispatch)))
+        *ppvObject = static_cast<IAccessible*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IUnknown)))
+        *ppvObject = static_cast<IAccessible*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IAccessible2_2)))
+        *ppvObject = static_cast<IAccessible2_2*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IAccessible2)))
+        *ppvObject = static_cast<IAccessible2*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IAccessibleComparable)))
+        *ppvObject = static_cast<IAccessibleComparable*>(this);
+    else if (IsEqualGUID(riid, __uuidof(IServiceProvider)))
+        *ppvObject = static_cast<IServiceProvider*>(this);
+    else if (IsEqualGUID(riid, __uuidof(AccessibleBase)))
+        *ppvObject = static_cast<AccessibleBase*>(this);
+    else {
+        *ppvObject = 0;
+        return E_NOINTERFACE;
+    }
+    AddRef();
+    return S_OK;
+}
+
+ULONG STDMETHODCALLTYPE AccessibleText::Release(void)
+{
+    ASSERT(m_refCount > 0);
+    if (--m_refCount)
+        return m_refCount;
+    delete this;
+    return 0;
+}
+
+int AccessibleText::convertSpecialOffset(int offset)
+{
+    ASSERT(m_object);
+    
+    if (offset == IA2_TEXT_OFFSET_LENGTH) 
+        return m_object->stringValue().length();
+    if (offset == IA2_TEXT_OFFSET_CARET) {
+        long caretOffset;
+        get_caretOffset(&caretOffset);
+        return caretOffset;
+    }
+    return offset;
+}
+
+HRESULT AccessibleText::initialCheck()
+{
+    if (!m_object)
+        return E_FAIL;
+
+    Document* document = m_object->document();
+    if (!document)
+        return E_FAIL;
+
+    Frame* frame = document->frame();
+    if (!frame)
+        return E_FAIL;
+
+    return S_OK;
+}

Added: trunk/Source/WebKit/win/AccessibleTextImpl.h (0 => 154627)


--- trunk/Source/WebKit/win/AccessibleTextImpl.h	                        (rev 0)
+++ trunk/Source/WebKit/win/AccessibleTextImpl.h	2013-08-26 19:01:23 UTC (rev 154627)
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef AccessibleTextImpl_h
+#define AccessibleTextImpl_h
+
+#include "AccessibleBase.h"
+
+class AccessibleText : public AccessibleBase, public IAccessibleText2, public IAccessibleEditableText {
+public:
+    AccessibleText(WebCore::AccessibilityObject*, HWND);
+    virtual ~AccessibleText() { }
+
+    // IAccessibleText
+    virtual HRESULT STDMETHODCALLTYPE addSelection(long startOffset, long endOffset);
+    virtual HRESULT STDMETHODCALLTYPE get_attributes(long offset, long* startOffset, long* endOffset, BSTR* textAttributes);
+    virtual HRESULT STDMETHODCALLTYPE get_caretOffset(long* offset);
+    virtual HRESULT STDMETHODCALLTYPE get_characterExtents(long offset, enum IA2CoordinateType coordType, long* x, long* y, long* width, long* height);
+    virtual HRESULT STDMETHODCALLTYPE get_nSelections(long* nSelections);
+    virtual HRESULT STDMETHODCALLTYPE get_offsetAtPoint(long x, long y, enum IA2CoordinateType coordType, long* offset);
+    virtual HRESULT STDMETHODCALLTYPE get_selection(long selectionIndex, long* startOffset, long* endOffset);
+    virtual HRESULT STDMETHODCALLTYPE get_text(long startOffset, long endOffset, BSTR* text);
+    virtual HRESULT STDMETHODCALLTYPE get_textBeforeOffset(long offset, enum IA2TextBoundaryType boundaryType, long* startOffset, long* endOffset, BSTR* text);
+    virtual HRESULT STDMETHODCALLTYPE get_textAfterOffset(long offset, enum IA2TextBoundaryType boundaryType, long* startOffset, long* endOffset, BSTR* text);
+    virtual HRESULT STDMETHODCALLTYPE get_textAtOffset(long offset, enum IA2TextBoundaryType boundaryType, long* startOffset, long* endOffset, BSTR* text);
+    virtual HRESULT STDMETHODCALLTYPE removeSelection(long selectionIndex);
+    virtual HRESULT STDMETHODCALLTYPE setCaretOffset(long offset);
+    virtual HRESULT STDMETHODCALLTYPE setSelection(long selectionIndex, long startOffset, long endOffset);
+    virtual HRESULT STDMETHODCALLTYPE get_nCharacters(long* characters);
+    virtual HRESULT STDMETHODCALLTYPE scrollSubstringTo(long startIndex, long endIndex, enum IA2ScrollType scrollType);
+    virtual HRESULT STDMETHODCALLTYPE scrollSubstringToPoint(long startIndex, long endIndex, enum IA2CoordinateType coordinateType, long x, long y);
+    virtual HRESULT STDMETHODCALLTYPE get_newText(IA2TextSegment* newText);
+    virtual HRESULT STDMETHODCALLTYPE get_oldText(IA2TextSegment* oldText);
+    
+    // IAccessibleText2
+    virtual HRESULT STDMETHODCALLTYPE get_attributeRange(long offset, BSTR filter, long* startOffset, long* endOffset, BSTR* attributeValues);
+
+    // IAccessibleEditableText
+    virtual HRESULT STDMETHODCALLTYPE copyText(long startOffset, long endOffset);
+    virtual HRESULT STDMETHODCALLTYPE deleteText(long startOffset, long endOffset);
+    virtual HRESULT STDMETHODCALLTYPE insertText(long offset, BSTR* text);
+    virtual HRESULT STDMETHODCALLTYPE cutText(long startOffset, long endOffset);
+    virtual HRESULT STDMETHODCALLTYPE pasteText(long offset);
+    virtual HRESULT STDMETHODCALLTYPE replaceText(long startOffset, long endOffset, BSTR* text);
+    virtual HRESULT STDMETHODCALLTYPE setAttributes(long startOffset, long endOffset, BSTR* attributes);
+
+    // IUnknown
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+    virtual ULONG STDMETHODCALLTYPE AddRef(void) { return ++m_refCount; }
+    virtual ULONG STDMETHODCALLTYPE Release(void);
+
+    // IAccessibleBase
+    virtual HRESULT STDMETHODCALLTYPE get_attributes(BSTR* attributes);
+
+private:
+    int convertSpecialOffset(int specialOffset);
+    HRESULT initialCheck();
+};
+
+#endif // AccessibleText_h

Modified: trunk/Source/WebKit/win/ChangeLog (154626 => 154627)


--- trunk/Source/WebKit/win/ChangeLog	2013-08-26 18:45:21 UTC (rev 154626)
+++ trunk/Source/WebKit/win/ChangeLog	2013-08-26 19:01:23 UTC (rev 154627)
@@ -1,3 +1,52 @@
+2013-08-23  Roger Fong  <roger_f...@apple.com>
+
+        <https://bugs.webkit.org/show_bug.cgi?id=119829> Add IAccessibleText and IAccessibleEditableText implementation.
+
+        Reviewed by Chris Fleizach.
+
+        Add IAccessibleText and IAccessibleEditableText interfaces and implementation to AppleWin port.
+
+        * AccessibleBase.cpp:
+        (AccessibleBase::createInstance): Create an AccessibleText instance when necessary.
+        (AccessibleBase::QueryService):
+        * AccessibleBase.h:
+        * AccessibleTextImpl.cpp: Added.
+        (AccessibleText::AccessibleText):
+        (AccessibleText::addSelection):
+        (AccessibleText::get_attributes): Not Implemented
+        (AccessibleText::get_caretOffset):
+        (AccessibleText::get_characterExtents):
+        (AccessibleText::get_nSelections):
+        (AccessibleText::get_offsetAtPoint):
+        (AccessibleText::get_selection):
+        (AccessibleText::get_text):
+        (AccessibleText::get_textBeforeOffset): Not Implemented
+        (AccessibleText::get_textAfterOffset): Not Implemented
+        (AccessibleText::get_textAtOffset): Not Implemented
+        (AccessibleText::removeSelection):
+        (AccessibleText::setCaretOffset):
+        (AccessibleText::setSelection):
+        (AccessibleText::get_nCharacters):
+        (AccessibleText::scrollSubstringTo):
+        (AccessibleText::scrollSubstringToPoint):
+        (AccessibleText::get_newText): Not Implemented
+        (AccessibleText::get_oldText): Not Implemented
+        (AccessibleText::get_attributeRange): Not Implemented
+        (AccessibleText::copyText):
+        (AccessibleText::deleteText):
+        (AccessibleText::insertText):
+        (AccessibleText::cutText):
+        (AccessibleText::pasteText):
+        (AccessibleText::replaceText):
+        (AccessibleText::setAttributes): Not Implemented
+        (AccessibleText::QueryInterface):
+        (AccessibleText::Release):
+        (AccessibleText::convertSpecialOffset):
+        (AccessibleText::initialCheck):
+        * AccessibleTextImpl.h: Added.
+        (AccessibleText::~AccessibleText):
+        (AccessibleText::AddRef):
+
 2013-08-24  Darin Adler  <da...@apple.com>
 
         Frame::tree should return a reference instead of a pointer
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to