[Windows] Implement Accessibility2 APIs in Windows.
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Jun 2013 00:05:23 +0000 (00:05 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Jun 2013 00:05:23 +0000 (00:05 +0000)
https://bugs.webkit.org/show_bug.cgi?id=117561

Reviewed by Anders Carlsson.

Source/WebKit:

* WebKit.vcxproj/Interfaces/Interfaces.vcxproj: Add new IAccessible2 IDL files.
* WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters: Ditto.
* WebKit.vcxproj/Interfaces/InterfacesCommon.props: Reference new Accessible2 folder.
* WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj: Build IAccessible2 symbols.
* WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters: Ditto.

Source/WebKit/win:

* AccessibleBase.cpp: Add stubs for IAccessible2 interface, replace attributeValue
method with get_attribute from IAccessible2 API.
* AccessibleBase.h: Ditto.
* AccessibleDocument.cpp: Revise signatures for IAccessible2.
* AccessibleDocument.h: Ditto.
* AccessibleImage.cpp: Revise signatures for IAccessible2.
* AccessibleImage.h: Ditto.
* Interfaces/Accessible2: Added.
* Interfaces/Accessible2/Accessible2.idl: Added.
* Interfaces/Accessible2/Accessible2_2.idl: Added.
* Interfaces/Accessible2/AccessibleApplication.idl: Added.
* Interfaces/Accessible2/AccessibleRelation.idl: Added.
* Interfaces/Accessible2/AccessibleStates.idl: Added.
* Interfaces/Accessible2/IA2CommonTypes.idl: Added.
* Interfaces/AccessibleComparable.idl:
* Interfaces/WebKit.idl: Reference IAccessible2 types.
* WebFrame.cpp:
(WebFrame::accessible): Pass window handle to IAccessible types.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@151529 268f45cc-cd09-0410-ab3c-d52691b4dbfc

24 files changed:
Source/WebKit/ChangeLog
Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj
Source/WebKit/WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters
Source/WebKit/WebKit.vcxproj/Interfaces/InterfacesCommon.props
Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj
Source/WebKit/WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters
Source/WebKit/win/AccessibleBase.cpp
Source/WebKit/win/AccessibleBase.h
Source/WebKit/win/AccessibleDocument.cpp
Source/WebKit/win/AccessibleDocument.h
Source/WebKit/win/AccessibleImage.cpp
Source/WebKit/win/AccessibleImage.h
Source/WebKit/win/ChangeLog
Source/WebKit/win/Interfaces/Accessible2/Accessible2.idl [new file with mode: 0644]
Source/WebKit/win/Interfaces/Accessible2/Accessible2_2.idl [new file with mode: 0644]
Source/WebKit/win/Interfaces/Accessible2/AccessibleApplication.idl [new file with mode: 0644]
Source/WebKit/win/Interfaces/Accessible2/AccessibleRelation.idl [new file with mode: 0644]
Source/WebKit/win/Interfaces/Accessible2/AccessibleStates.idl [new file with mode: 0644]
Source/WebKit/win/Interfaces/Accessible2/IA2CommonTypes.idl [new file with mode: 0644]
Source/WebKit/win/Interfaces/AccessibleComparable.idl
Source/WebKit/win/Interfaces/WebKit.idl
Source/WebKit/win/WebFrame.cpp
Tools/DumpRenderTree/win/AccessibilityControllerWin.cpp
Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp

index ba3dd6f6dd73fa589e11a1fbbcbc889f201659ab..0d66bf4a72c82ccf3d133d3919c185bb424f6ac0 100644 (file)
@@ -1,3 +1,16 @@
+2013-06-12  Brent Fulgham  <bfulgham@apple.com>
+
+        [Windows] Implement Accessibility2 APIs in Windows.
+        https://bugs.webkit.org/show_bug.cgi?id=117561
+
+        Reviewed by Anders Carlsson.
+
+        * WebKit.vcxproj/Interfaces/Interfaces.vcxproj: Add new IAccessible2 IDL files.
+        * WebKit.vcxproj/Interfaces/Interfaces.vcxproj.filters: Ditto.
+        * WebKit.vcxproj/Interfaces/InterfacesCommon.props: Reference new Accessible2 folder.
+        * WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj: Build IAccessible2 symbols.
+        * WebKit.vcxproj/WebKitGUID/WebKitGUID.vcxproj.filters: Ditto.
+
 2013-06-10  Bear Travis  <betravis@adobe.com>
 
         [CSS Shapes][CSS Exclusions] Split CSS Exclusions and CSS Shapes code
index 78b36e2c58e162f361f3d9eb1068aaa46b8c5f50..4e4bd79d97375b879d91b8a7a6e7f33c61b1b17f 100644 (file)
     </Link>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\Accessible2.idl" />\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\Accessible2_2.idl" />\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleApplication.idl" />\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleRelation.idl" />\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleStates.idl" />\r
     <Midl Include="..\..\win\Interfaces\AccessibleComparable.idl">\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>\r
     </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\IA2CommonTypes.idl" />\r
     <Midl Include="..\..\win\Interfaces\IGEN_DOMObject.idl">\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>\r
index 686c85ce49befdf195325945f63be7e9bc54af02..9006838c68851c6683be6fbcc3eb2e08aedda7f9 100644 (file)
     <Midl Include="..\..\win\Interfaces\WebKit.idl">\r
       <Filter>IDL</Filter>\r
     </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\IA2CommonTypes.idl">\r
+      <Filter>IDL\Accessibility2</Filter>\r
+    </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\Accessible2.idl">\r
+      <Filter>IDL\Accessibility2</Filter>\r
+    </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\Accessible2_2.idl">\r
+      <Filter>IDL\Accessibility2</Filter>\r
+    </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleRelation.idl">\r
+      <Filter>IDL\Accessibility2</Filter>\r
+    </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleStates.idl">\r
+      <Filter>IDL\Accessibility2</Filter>\r
+    </Midl>\r
+    <Midl Include="..\..\win\Interfaces\Accessible2\AccessibleApplication.idl">\r
+      <Filter>IDL\Accessibility2</Filter>\r
+    </Midl>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <None Include="InterfacesPostBuild.cmd" />\r
     <Filter Include="IDL">\r
       <UniqueIdentifier>{51652c01-e301-4b72-9d96-5d50491d258c}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="IDL\Accessibility2">\r
+      <UniqueIdentifier>{2e15fc38-df6f-470f-b201-272e8d2d91a4}</UniqueIdentifier>\r
+    </Filter>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index fbab4e9367c3ba26e20e022521de2f19a378004a..87b6d0bc596a5839e7c1b76f4d96f3ffd48ab96e 100644 (file)
@@ -7,7 +7,7 @@
   </PropertyGroup>\r
   <ItemDefinitionGroup>\r
     <Midl>\r
-      <AdditionalIncludeDirectories>$(ConfigurationBuildDir)\obj32\WebKit\DerivedSources;../../win/Interfaces;$(IntDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <AdditionalIncludeDirectories>$(ConfigurationBuildDir)\obj32\WebKit\DerivedSources;../../win/Interfaces;../../win/Interfaces/Accessible2;$(IntDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
     </Midl>\r
   </ItemDefinitionGroup>\r
   <ItemDefinitionGroup>\r
index c34e8ac1d5b283cac840a769aa701d492e4e83dd..2938ef0a31a9375146ebc3462138d19d48d3698e 100644 (file)
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="$(ConfigurationBuildDir)\obj32\WebKit\Interfaces\WebKit_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj32\WebKit\Interfaces\Accessible2_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj32\WebKit\Interfaces\Accessible2_2_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj32\WebKit\Interfaces\AccessibleApplication_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj32\WebKit\Interfaces\AccessibleRelation_i.c" />\r
   </ItemGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
index 9ded616a2c35bfaee255d9f651093079bc24fbfc..ff231e663b09e35c2770beb32948e6edee5ff0c4 100644 (file)
@@ -6,5 +6,9 @@
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="$(ConfigurationBuildDir)\obj\WebKit\Interfaces\WebKit_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj\WebKit\Interfaces\Accessible2_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj\WebKit\Interfaces\Accessible2_2_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj\WebKit\Interfaces\AccessibleApplication_i.c" />\r
+    <ClCompile Include="$(ConfigurationBuildDir)\obj\WebKit\Interfaces\AccessibleRelation_i.c" />\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index 225a80dea1bffde74359d4339c363d5ab416b8bc..7afe4a08ca9d7fb11d177fa8559af022b177a48d 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2008, 2009, 2010, 2013 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2012 Serotek Corporation. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -42,6 +43,7 @@
 #include <WebCore/HTMLFrameElementBase.h>
 #include <WebCore/HTMLInputElement.h>
 #include <WebCore/IntRect.h>
+#include <WebCore/NotImplemented.h>
 #include <WebCore/PlatformEvent.h>
 #include <WebCore/RenderFrame.h>
 #include <WebCore/RenderObject.h>
@@ -53,8 +55,9 @@
 
 using namespace WebCore;
 
-AccessibleBase::AccessibleBase(AccessibilityObject* obj)
+AccessibleBase::AccessibleBase(AccessibilityObject* obj, HWND window)
     : AccessibilityObjectWrapper(obj)
+    , m_window(window)
     , m_refCount(0)
 {
     ASSERT_ARG(obj, obj);
@@ -69,19 +72,23 @@ AccessibleBase::~AccessibleBase()
     gClassNameCount.remove("AccessibleBase");
 }
 
-AccessibleBase* AccessibleBase::createInstance(AccessibilityObject* obj)
+AccessibleBase* AccessibleBase::createInstance(AccessibilityObject* obj, HWND window)
 {
     ASSERT_ARG(obj, obj);
 
     if (obj->isImage())
-        return new AccessibleImage(obj);
+        return new AccessibleImage(obj, window);
 
-    return new AccessibleBase(obj);
+    return new AccessibleBase(obj, window);
 }
 
 HRESULT AccessibleBase::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
 {
-    if (!IsEqualGUID(guidService, SID_AccessibleComparable)) {
+    if (!IsEqualGUID(guidService, SID_AccessibleComparable)
+        && !IsEqualGUID(guidService, IID_IAccessible2_2)
+        && !IsEqualGUID(guidService, IID_IAccessible2)
+        && !IsEqualGUID(guidService, IID_IAccessibleApplication)
+        && !IsEqualGUID(guidService, IID_IAccessible)) {
         *ppvObject = 0;
         return E_INVALIDARG;
     }
@@ -97,6 +104,10 @@ HRESULT STDMETHODCALLTYPE AccessibleBase::QueryInterface(REFIID riid, void** ppv
         *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)))
@@ -120,8 +131,195 @@ ULONG STDMETHODCALLTYPE AccessibleBase::Release(void)
     return 0;
 }
 
+// IAccessible2_2
+HRESULT AccessibleBase::get_attribute(BSTR key, VARIANT* value)
+{
+    if (!value)
+        return E_POINTER;
+
+    AtomicString keyAtomic(key, ::SysStringLen(key));
+
+    accessibilityAttributeValue(keyAtomic, value);
+
+    return S_OK;
+}
+
+HRESULT AccessibleBase::get_accessibleWithCaret(IUnknown** accessible, long* caretOffset)
+{
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_relationTargetsOfType(BSTR type, long maxTargets, IUnknown*** targets, long* nTargets)
+{
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+// IAccessible2
+HRESULT AccessibleBase::get_nRelations(long* nRelations)
+{
+    if (!nRelations)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+    notImplemented();
+    *nRelations = 0;
+    return S_OK;
+}
+
+HRESULT AccessibleBase::get_relation(long relationIndex, IAccessibleRelation** relation)
+{
+    if (!relation)
+        return E_POINTER;
+
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_relations(long maxRelations, IAccessibleRelation** relations, long* nRelations)
+{
+    if (!relations || !nRelations)
+        return E_POINTER;
+
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::role(long* role)
+{
+    if (!role)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+
+    *role = wrapper(m_object)->role();
+    return S_OK;
+}
+
+HRESULT AccessibleBase::scrollTo(IA2ScrollType scrollType)
+{
+    if (!m_object)
+        return E_FAIL;
+    return S_FALSE;
+}
+
+HRESULT AccessibleBase::scrollToPoint(IA2CoordinateType coordinateType, long x, long y)
+{
+    if (!m_object)
+        return E_FAIL;
+    return S_FALSE;
+}
+
+HRESULT AccessibleBase::get_groupPosition(long* groupLevel, long* similarItemsInGroup, long* positionInGroup)
+{
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_states(AccessibleStates* states)
+{
+    if (!states)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+
+    *states = 0;
+    notImplemented();
+    return S_OK;
+}
+
+HRESULT AccessibleBase::get_extendedRole(BSTR* extendedRole)
+{
+    if (!extendedRole)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+
+    notImplemented();
+    return S_FALSE;
+}
+
+HRESULT AccessibleBase::get_localizedExtendedRole(BSTR* localizedExtendedRole)
+{
+    if (!localizedExtendedRole)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+
+    notImplemented();
+    return S_FALSE;
+}
+
+HRESULT AccessibleBase::get_nExtendedStates(long* nExtendedStates)
+{
+    if (!nExtendedStates)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+
+    notImplemented();
+    *nExtendedStates = 0;
+    return S_OK;
+}
+
+HRESULT AccessibleBase::get_extendedStates(long maxExtendedStates, BSTR** extendedStates, long* nExtendedStates)
+{
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_localizedExtendedStates(long maxLocalizedExtendedStates, BSTR** localizedExtendedStates, long* nLocalizedExtendedStates)
+{
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_uniqueID(long* uniqueID)
+{
+    if (!uniqueID)
+        return E_POINTER;
+
+    if (!m_object)
+        return E_FAIL;
+
+    *uniqueID = static_cast<long>(m_object->axObjectID());
+    return S_OK;
+}
+
+HRESULT AccessibleBase::get_windowHandle(HWND* windowHandle)
+{
+    *windowHandle = m_window;
+    return S_OK;
+}
+
+HRESULT AccessibleBase::get_indexInParent(long* indexInParent)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_locale(IA2Locale* locale)
+{
+    notImplemented();
+    return E_NOTIMPL;
+}
+
+HRESULT AccessibleBase::get_attributes(BSTR* attributes)
+{
+    if (!m_object)
+        return E_FAIL;
+    notImplemented();
+    return S_FALSE;
+}
+
 // IAccessible
-HRESULT STDMETHODCALLTYPE AccessibleBase::get_accParent(IDispatch** parent)
+HRESULT AccessibleBase::get_accParent(IDispatch** parent)
 {
     *parent = 0;
 
@@ -135,10 +333,10 @@ HRESULT STDMETHODCALLTYPE AccessibleBase::get_accParent(IDispatch** parent)
         return S_OK;
     }
 
-    if (!m_object->topDocumentFrameView())
+    if (!m_window)
         return E_FAIL;
 
-    return WebView::AccessibleObjectFromWindow(m_object->topDocumentFrameView()->hostWindow()->platformPageClient(),
+    return WebView::AccessibleObjectFromWindow(m_window,
         OBJID_WINDOW, __uuidof(IAccessible), reinterpret_cast<void**>(parent));
 }
 
@@ -250,79 +448,85 @@ HRESULT STDMETHODCALLTYPE AccessibleBase::get_accRole(VARIANT vChild, VARIANT* p
     return S_OK;
 }
 
-HRESULT STDMETHODCALLTYPE AccessibleBase::get_accState(VARIANT vChild, VARIANT* pvState)
+long AccessibleBase::state() const
 {
-    if (!pvState)
-        return E_POINTER;
+    long state = 0;
+    if (m_object->isLinked())
+        state |= STATE_SYSTEM_LINKED;
 
-    ::VariantInit(pvState);
+    if (m_object->isHovered())
+        state |= STATE_SYSTEM_HOTTRACKED;
 
-    AccessibilityObject* childObj;
-    HRESULT hr = getAccessibilityObjectForChild(vChild, childObj);
+    if (!m_object->isEnabled())
+        state |= STATE_SYSTEM_UNAVAILABLE;
 
-    if (FAILED(hr))
-        return hr;
+    if (m_object->isReadOnly())
+        state |= STATE_SYSTEM_READONLY;
 
-    pvState->vt = VT_I4;
-    pvState->lVal = 0;
+    if (m_object->isOffScreen())
+        state |= STATE_SYSTEM_OFFSCREEN;
 
-    if (childObj->isLinked())
-        pvState->lVal |= STATE_SYSTEM_LINKED;
+    if (m_object->isPasswordField())
+        state |= STATE_SYSTEM_PROTECTED;
 
-    if (childObj->isHovered())
-        pvState->lVal |= STATE_SYSTEM_HOTTRACKED;
+    if (m_object->isIndeterminate())
+        state |= STATE_SYSTEM_INDETERMINATE;
 
-    if (!childObj->isEnabled())
-        pvState->lVal |= STATE_SYSTEM_UNAVAILABLE;
+    if (m_object->isChecked())
+        state |= STATE_SYSTEM_CHECKED;
 
-    if (childObj->isReadOnly())
-        pvState->lVal |= STATE_SYSTEM_READONLY;
+    if (m_object->isPressed())
+        state |= STATE_SYSTEM_PRESSED;
 
-    if (childObj->isOffScreen())
-        pvState->lVal |= STATE_SYSTEM_OFFSCREEN;
+    if (m_object->isFocused())
+        state |= STATE_SYSTEM_FOCUSED;
 
-    if (childObj->isPasswordField())
-        pvState->lVal |= STATE_SYSTEM_PROTECTED;
+    if (m_object->isVisited())
+        state |= STATE_SYSTEM_TRAVERSED;
 
-    if (childObj->isIndeterminate())
-        pvState->lVal |= STATE_SYSTEM_INDETERMINATE;
+    if (m_object->canSetFocusAttribute())
+        state |= STATE_SYSTEM_FOCUSABLE;
 
-    if (childObj->isChecked())
-        pvState->lVal |= STATE_SYSTEM_CHECKED;
+    if (m_object->isSelected())
+        state |= STATE_SYSTEM_SELECTED;
 
-    if (childObj->isPressed())
-        pvState->lVal |= STATE_SYSTEM_PRESSED;
+    if (m_object->canSetSelectedAttribute())
+        state |= STATE_SYSTEM_SELECTABLE;
 
-    if (childObj->isFocused())
-        pvState->lVal |= STATE_SYSTEM_FOCUSED;
+    if (m_object->isMultiSelectable())
+        state |= STATE_SYSTEM_EXTSELECTABLE | STATE_SYSTEM_MULTISELECTABLE;
 
-    if (childObj->isVisited())
-        pvState->lVal |= STATE_SYSTEM_TRAVERSED;
+    if (!m_object->isVisible())
+        state |= STATE_SYSTEM_INVISIBLE;
 
-    if (childObj->canSetFocusAttribute())
-        pvState->lVal |= STATE_SYSTEM_FOCUSABLE;
+    if (m_object->isCollapsed())
+        state |= STATE_SYSTEM_COLLAPSED;
 
-    if (childObj->isSelected())
-        pvState->lVal |= STATE_SYSTEM_SELECTED;
+    if (m_object->roleValue() == PopUpButtonRole) {
+        state |= STATE_SYSTEM_HASPOPUP;
 
-    if (childObj->canSetSelectedAttribute())
-        pvState->lVal |= STATE_SYSTEM_SELECTABLE;
+        if (!m_object->isCollapsed())
+            state |= STATE_SYSTEM_EXPANDED;
+    }
 
-    if (childObj->isMultiSelectable())
-        pvState->lVal |= STATE_SYSTEM_EXTSELECTABLE | STATE_SYSTEM_MULTISELECTABLE;
+    return state;
+}
 
-    if (!childObj->isVisible())
-        pvState->lVal |= STATE_SYSTEM_INVISIBLE;
+HRESULT AccessibleBase::get_accState(VARIANT vChild, VARIANT* pvState)
+{
+    if (!pvState)
+        return E_POINTER;
 
-    if (childObj->isCollapsed())
-        pvState->lVal |= STATE_SYSTEM_COLLAPSED;
+    ::VariantInit(pvState);
 
-    if (childObj->roleValue() == PopUpButtonRole) {
-        pvState->lVal |= STATE_SYSTEM_HASPOPUP;
+    AccessibilityObject* childObj;
+    HRESULT hr = getAccessibilityObjectForChild(vChild, childObj);
 
-        if (!childObj->isCollapsed())
-            pvState->lVal |= STATE_SYSTEM_EXPANDED;
-    }
+    if (FAILED(hr))
+        return hr;
+
+    pvState->vt = VT_I4;
+    pvState->lVal = wrapper(childObj)->state();
 
     return S_OK;
 }
@@ -820,11 +1024,11 @@ HRESULT AccessibleBase::getAccessibilityObjectForChild(VARIANT vChild, Accessibi
     return S_OK;
 }
 
-AccessibleBase* AccessibleBase::wrapper(AccessibilityObject* obj)
+AccessibleBase* AccessibleBase::wrapper(AccessibilityObject* obj) const
 {
     AccessibleBase* result = static_cast<AccessibleBase*>(obj->wrapper());
     if (!result)
-        result = createInstance(obj);
+        result = createInstance(obj, m_window);
     return result;
 }
 
@@ -834,15 +1038,3 @@ HRESULT AccessibleBase::isSameObject(IAccessibleComparable* other, BOOL* result)
     *result = (otherAccessibleBase == this || otherAccessibleBase->m_object == m_object);
     return S_OK;
 }
-
-HRESULT AccessibleBase::attributeValue(BSTR key, VARIANT* value)
-{
-    if (!value)
-        return E_POINTER;
-
-    AtomicString keyAtomic(key, ::SysStringLen(key));
-
-    accessibilityAttributeValue(keyAtomic, value);
-
-    return S_OK;
-}
index e0740b6bf8f9b246a6bcbe98f4c46eaa166b4221..ed6a4e51b34b40bcce32b6f8b6591d8343916b53 100644 (file)
@@ -32,7 +32,7 @@
 
 class DECLSPEC_UUID("3dbd565b-db22-4d88-8e0e-778bde54524a") AccessibleBase : public IAccessibleComparable, public IServiceProvider, public WebCore::AccessibilityObjectWrapper {
 public:
-    static AccessibleBase* createInstance(WebCore::AccessibilityObject*);
+    static AccessibleBase* createInstance(WebCore::AccessibilityObject*, HWND);
 
     // IServiceProvider
     virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppv);
@@ -42,6 +42,31 @@ public:
     virtual ULONG STDMETHODCALLTYPE AddRef(void) { return ++m_refCount; }
     virtual ULONG STDMETHODCALLTYPE Release(void);
 
+    // IAccessible2_2
+    virtual HRESULT STDMETHODCALLTYPE get_attribute(BSTR name, VARIANT* attribute);
+    virtual HRESULT STDMETHODCALLTYPE get_accessibleWithCaret(IUnknown** accessible, long* caretOffset);
+    virtual HRESULT STDMETHODCALLTYPE get_relationTargetsOfType(BSTR type, long maxTargets, IUnknown*** targets, long* nTargets);
+
+    // IAccessible2
+    virtual HRESULT STDMETHODCALLTYPE get_nRelations(long*);
+    virtual HRESULT STDMETHODCALLTYPE get_relation(long relationIndex, IAccessibleRelation**);
+    virtual HRESULT STDMETHODCALLTYPE get_relations(long maxRelations, IAccessibleRelation** relations, long* nRelations);
+    virtual HRESULT STDMETHODCALLTYPE role(long*);
+    virtual HRESULT STDMETHODCALLTYPE scrollTo(IA2ScrollType);
+    virtual HRESULT STDMETHODCALLTYPE scrollToPoint(IA2CoordinateType, long x, long y);
+    virtual HRESULT STDMETHODCALLTYPE get_groupPosition(long* groupLevel, long* similarItemsInGroup, long* positionInGroup);
+    virtual HRESULT STDMETHODCALLTYPE get_states(AccessibleStates*);
+    virtual HRESULT STDMETHODCALLTYPE get_extendedRole(BSTR*);
+    virtual HRESULT STDMETHODCALLTYPE get_localizedExtendedRole(BSTR*);
+    virtual HRESULT STDMETHODCALLTYPE get_nExtendedStates(long*);
+    virtual HRESULT STDMETHODCALLTYPE get_extendedStates(long maxExtendedStates, BSTR** extendedStates, long* nExtendedStates);
+    virtual HRESULT STDMETHODCALLTYPE get_localizedExtendedStates(long maxLocalizedExtendedStates, BSTR** localizedExtendedStates, long* nLocalizedExtendedStates);
+    virtual HRESULT STDMETHODCALLTYPE get_uniqueID(long*);
+    virtual HRESULT STDMETHODCALLTYPE get_windowHandle(HWND*);
+    virtual HRESULT STDMETHODCALLTYPE get_indexInParent(long*);
+    virtual HRESULT STDMETHODCALLTYPE get_locale(IA2Locale*);
+    virtual HRESULT STDMETHODCALLTYPE get_attributes(BSTR*);
+
     // IAccessible
     virtual HRESULT STDMETHODCALLTYPE get_accParent(IDispatch**);
     virtual HRESULT STDMETHODCALLTYPE get_accChildCount(long*);
@@ -94,20 +119,21 @@ public:
 
     // IAccessibleComparable
     virtual HRESULT STDMETHODCALLTYPE isSameObject(IAccessibleComparable* other, BOOL* result);
-    virtual HRESULT STDMETHODCALLTYPE attributeValue(BSTR key, VARIANT* value);
 
 protected:
-    AccessibleBase(WebCore::AccessibilityObject*);
+    AccessibleBase(WebCore::AccessibilityObject*, HWND);
     virtual ~AccessibleBase();
 
     virtual WTF::String name() const;
     virtual WTF::String value() const;
     virtual long role() const;
+    virtual long state() const;
 
     HRESULT getAccessibilityObjectForChild(VARIANT vChild, WebCore::AccessibilityObject*&) const;
 
-    static AccessibleBase* wrapper(WebCore::AccessibilityObject*);
+    AccessibleBase* wrapper(WebCore::AccessibilityObject*) const;
 
+    HWND m_window;
     int m_refCount;
 
 private:
index e98acc1b2c45c0fdcf726b659b532c7b96c2df14..c7c69c69b8e69004d8b71c15723898562c7957f9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 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
@@ -33,8 +33,8 @@
 using namespace WebCore;
 
 // AccessibleDocument
-AccessibleDocument::AccessibleDocument(Document* doc)
-    : AccessibleBase(doc->axObjectCache()->rootObject())
+AccessibleDocument::AccessibleDocument(Document* doc, HWND window)
+    : AccessibleBase(doc->axObjectCache()->rootObject(), window)
 {
 }
 
index bc13613ed7c3dbf26b1add29de57e8d10116ffac..aff1f69d2301dab71944f84b5c947c361139ac45 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008,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
@@ -30,7 +30,7 @@
 
 class AccessibleDocument : public AccessibleBase {
 public:
-    AccessibleDocument(WebCore::Document*);
+    AccessibleDocument(WebCore::Document*, HWND);
     WebCore::Document* document() const;
 
 protected:
index ee1d5056a5acf08a41a19b552b1d209ce5631357..4a70cc80d093ddbe996da6cdd42a9c5af7237f9a 100644 (file)
@@ -32,8 +32,8 @@
 using namespace WebCore;
 using namespace WebCore::HTMLNames;
 
-AccessibleImage::AccessibleImage(AccessibilityObject* obj)
-    : AccessibleBase(obj)
+AccessibleImage::AccessibleImage(AccessibilityObject* obj, HWND window)
+    : AccessibleBase(obj, window)
 {
     ASSERT_ARG(obj, obj->isImage());
     ASSERT_ARG(obj, obj->isAccessibilityRenderObject());
index e987795a7d0d8ff4676897a47b8d9f11fb678aee..cce93b56b886029f1509e51ba25d7c4eeeab65e5 100644 (file)
@@ -31,7 +31,7 @@
 class AccessibleImage : public AccessibleBase
 {
 public:
-    AccessibleImage(WebCore::AccessibilityObject*);
+    AccessibleImage(WebCore::AccessibilityObject*, HWND);
     virtual ~AccessibleImage() { }
 
 private:
index 4567ccc4839f59d3b5c90bbd1198ccb6bf5a1979..eaa8454c9615094d9930d122920a00f1e373d0c2 100644 (file)
@@ -1,3 +1,29 @@
+2013-06-12  Brent Fulgham  <bfulgham@apple.com>
+
+        [Windows] Implement Accessibility2 APIs in Windows.
+        https://bugs.webkit.org/show_bug.cgi?id=117561
+
+        Reviewed by Anders Carlsson.
+
+        * AccessibleBase.cpp: Add stubs for IAccessible2 interface, replace attributeValue
+        method with get_attribute from IAccessible2 API.
+        * AccessibleBase.h: Ditto.
+        * AccessibleDocument.cpp: Revise signatures for IAccessible2.
+        * AccessibleDocument.h: Ditto.
+        * AccessibleImage.cpp: Revise signatures for IAccessible2.
+        * AccessibleImage.h: Ditto.
+        * Interfaces/Accessible2: Added.
+        * Interfaces/Accessible2/Accessible2.idl: Added.
+        * Interfaces/Accessible2/Accessible2_2.idl: Added.
+        * Interfaces/Accessible2/AccessibleApplication.idl: Added.
+        * Interfaces/Accessible2/AccessibleRelation.idl: Added.
+        * Interfaces/Accessible2/AccessibleStates.idl: Added.
+        * Interfaces/Accessible2/IA2CommonTypes.idl: Added.
+        * Interfaces/AccessibleComparable.idl:
+        * Interfaces/WebKit.idl: Reference IAccessible2 types.
+        * WebFrame.cpp: 
+        (WebFrame::accessible): Pass window handle to IAccessible types.
+
 2013-06-12  Brent Fulgham  <bfulgham@apple.com>
 
         [Windows] Support Title UI Element Accessibility Attribute
diff --git a/Source/WebKit/win/Interfaces/Accessible2/Accessible2.idl b/Source/WebKit/win/Interfaces/Accessible2/Accessible2.idl
new file mode 100644 (file)
index 0000000..3e17dda
--- /dev/null
@@ -0,0 +1,692 @@
+/*************************************************************************
+ *
+ *  File Name (Accessible2.idl)
+ * 
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2013 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, 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. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+/** @mainpage
+
+ @section _interfaces Interfaces
+  IAccessible2\n
+  IAccessible2_2\n
+  IAccessibleAction\n
+  IAccessibleApplication\n
+  IAccessibleComponent\n
+  IAccessibleDocument\n
+  IAccessibleEditableText\n
+  IAccessibleHypertext\n
+  IAccessibleHypertext2\n
+  IAccessibleHyperlink\n
+  IAccessibleImage\n
+  IAccessibleRelation\n
+  IAccessibleTable [Deprecated]\n
+  IAccessibleTable2\n
+  IAccessibleTableCell\n
+  IAccessibleText\n
+  IAccessibleText2\n
+  IAccessibleValue
+
+ @section _structs Structs
+  IA2Locale\n
+  IA2TableModelChange\n
+  IA2TextSegment
+
+ @section _enums Enums
+  ::IA2Actions values are predefined actions for use when implementing support for HTML5 media.\n
+  ::IA2CoordinateType values define the requested coordinate type (screen or parent window).\n
+  ::IA2EventID values identify events.\n
+  ::IA2Role values defines roles which are in addition to the existing MSAA roles.\n
+  ::IA2ScrollType values define where to place an object or substring on the screen.\n
+  ::IA2States values define states which are in addition to the existing MSAA states.\n
+  ::IA2TableModelChangeType values describe the kinds of changes made to a table (insert, delete, update).\n
+  ::IA2TextBoundaryType values define the requested text unit (character, word, sentence, line, paragraph).\n
+  ::IA2TextSpecialOffsets values define special offsets for use in the text interfaces.
+
+ @section _constants Constants
+  @ref grpRelations
+
+ @section _misc Miscellaneous
+  @ref _licensePage "BSD License"\n
+  @ref _generalInfo "General Information"\n
+
+ @page _licensePage BSD License
+  %IAccessible2 IDL Specification
+
+  Copyright (c) 2007, 2013 Linux Foundation\n
+  Copyright (c) 2006 IBM Corporation\n
+  Copyright (c) 2000, 2006 Sun Microsystems, Inc.\n
+  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. 
+   3. Neither the name of the Linux Foundation nor the names of its 
+      contributors may be used to endorse or promote products 
+      derived from this software without specific prior written 
+      permission. 
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+  This BSD License conforms to the Open Source Initiative "Simplified 
+  BSD License" as published at: 
+  http://www.opensource.org/licenses/bsd-license.php 
+  %IAccessible2 is a trademark of the Linux Foundation. The %IAccessible2 
+  mark may be used in accordance with the
+  <a href="http://www.linuxfoundation.org/collaborate/workgroups/accessibility/trademark-policy">
+  Linux Foundation Trademark Policy</a> to indicate compliance with the %IAccessible2 specification. 
+
+ @page _generalInfo General Information 
+  The following information is applicable to two or more interfaces.
+
+ @ref _errors\n
+ @ref _memory\n
+ &nbsp;&nbsp;@ref _arrayConsideration\n
+ @ref _indexes\n
+ @ref _enums\n
+ @ref _specialOffsets\n
+ @ref _dicoveringInterfaces\n
+ @ref _changingInterfaces\n
+ @ref _applicationInfo\n
+ @ref _childIDs\n
+ @ref _variants\n
+ @ref _iaaction-iahyperlink\n
+ @ref _trademark
+
+ @section _errors Error Handling
+  HRESULT values are defined by the Microsoft&reg; Win32&reg; API.  For more information, refer to
+  <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137%28v=vs.85%29.aspx">
+  Interpreting HRESULT Values</a> in MSDN&reg;.
+
+  Note that the S_FALSE return value is considered a non-error value and the 
+  SUCCEEDED macro will return TRUE.  S_FALSE is used when there is no failure
+  but there was nothing valid to return, e.g. in IAccessible2::attributes when
+  there are no attributes.  When S_FALSE is returned [out] pointer types should 
+  be NULL and [out] longs should generally be 0, but sometimes -1 is used such
+  as IAccessible2::indexInParent, IAccessibleText::caretOffset, and
+  IAccessibleHypertext::hyperlinkIndex.
+
+  Note that for BSTR [out] variables common COM practice is that the server does 
+  the SysAllocString and the client does the SysFreeString.  Also note that when
+  NULL is returned there is no need for the client to call SysFreeString.  Please
+  refer to the documentation for each method for more details regarding error handling.
+
+ @section _memory Memory Management
+  The following memory management issues should be considered:
+  @li Although [out] BSTR variables are declared by the client, their space is 
+   allocated by the server.  They need to be freed with SysFreeString by the 
+   client at end of life; the same is true when BSTRs are used in structs or 
+   arrays which are passed to the server.
+  @li If there is no valid [out] BSTR to return, the server should return S_FALSE and 
+   assign NULL to the output, e.g. *theOutBSTR = NULL;. 
+  @li COM interfaces need to be referenced with AddRef when used and dereferenced
+   with Release at end of life.
+  @li Single [out] longs, HWNDs, booleans, and structs are declared by the caller
+   and passed by reference. The marshaller does all the memory management.
+  
+  The following articles may be helpful for understanding memory management issues:
+  @li An article by Don Box in a
+   <a href="http://www.microsoft.com/msj/1196/activex1196.aspx">Q & A section</a>
+   of the November 1996 edition of the Microsoft Systems Journal.
+  @li A posting to a CodeGuru forum, 
+   <a href="http://www.codeguru.com/forum/showthread.php?t=364511">Windows SDK 
+   String: What are the rules for BSTR allocation and deallocation?</a>
+
+ @subsection _arrayConsideration Special Consideration when using Arrays
+  There are several methods which return arrays.  In the case of IAccessible2::relations
+  and IAccessibleRelation::targets the client must allocate and free the arrays.
+
+  For the remaining methods which return arrays, the server must allocate the array
+  and the client must free the array when no longer needed.  These methods are
+  IAccessible2::extendedStates, IAccessible2::localizedExtendedStates,
+  IAccessible2_2::relationTargetsOfType, IAccessibleAction::keyBinding, 
+  IAccessibleHypertext2::hyperlinks, IAccessibleTable::selectedChildren, 
+  IAccessibleTable::selectedColumns, IAccessibleTable::selectedRows,
+  IAccessibleTable2::selectedCells, IAccessibleTable2::selectedColumns,
+  IAccessibleTable2::selectedRows, IAccessibleTableCell::columnHeaderCells,
+  and IAccessibleTableCell::rowHeaderCells.
+  For those methods, the server must allocate both the top level array and any storage 
+  associated with it, e.g. for BSTRs.  The server must allocate the arrays with 
+  CoTaskMemAlloc and any BSTRs with SysAllocString.  The client must use CoTaskMemFree
+  to free the array and any BSTRs must be freed with SysFreeString.  
+  
+  Also, the IDL for IAccessible2::extendedStates, IAccessible2::localizedExtendedStates, 
+  IAccessibleAction::keyBinding, IAccessibleTable::selectedChildren, 
+  IAccessibleTable::selectedColumns, and IAccessibleTable::selectedRows includes an
+  extraneous [in] parameter for the caller to specify the max size of the array.
+  This parameter will be ignored by the COM server.
+
+ @section _indexes Zero and One Based Indexes
+  Unless otherwise specified all offsets and indexes are 0 based. 
+
+ @section _enums Enums
+  Note that enums start at 0.
+
+ @section _specialOffsets Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods
+  IAccessibleText and IAccessibleEditableText can use one or more of the following
+  special offset values.  They are defined in the ::IA2TextSpecialOffsets enum.
+  @li Using ::IA2_TEXT_OFFSET_LENGTH (-1) as an offset in any of the IAccessibleText or
+   IAccessibleEditableText methods is the same as specifying the length of the string.
+  @li Using ::IA2_TEXT_OFFSET_CARET (-2) as an offset for IAccessibleText::textBeforeOffset, 
+   IAccessibleText::textAtOffset, and IAccessibleText::textAfterOffset indicates that the 
+   text related to the physical location of the caret should be used.  This is needed for 
+   applications that consider the character offset of the end of one line (as reached by 
+   pressing the End key) the same as the offset of the first character on the next line.
+   Since the same offset is associated with two different lines a special means is needed 
+   to fetch text from the line where the caret is physically located.
+
+ @section _dicoveringInterfaces Discovery of Interfaces
+  In general AT (Assistive Technology) should try IAccessible2 interfaces, followed by using 
+  the MSAA (Microsoft&reg; Active Accessibility&reg;) interfaces.  (In cases where the an application
+  is known to have custom interfaces which provide information not supplied by IAccessible2
+  or MSAA, then those custom interfaces can be used.)  The AT can then, by default, support
+  unknown IAccessible2/MSAA applications, without the application developers having to request
+  AT vendors for support on an individual application by application basis.
+
+  When you have a reference to an IAccessible and require a reference to an IAccessible2 use 
+  QueryService as follows:
+  @code
+  // pAcc is a reference to the accessible object's IAccessible interface. 
+  IServiceProvider *pService = NULL; 
+  hr = pAcc->QueryInterface(IID_IServiceProvider, (void **)&pService); 
+  if(SUCCEEDED(hr)) { 
+    IAccessible2 *pIA2 = NULL; 
+    hr = pService->QueryService(IID_IAccessible, IID_IAccessible2, (void**)&pIA2); 
+    if (SUCCEEDED(hr) && pIA2) { 
+      // The control supports IAccessible2. 
+      // pIA2 is the reference to the accessible object's IAccessible2 interface.
+    } 
+  } 
+  @endcode
+
+  @section _changingInterfaces Changing between Accessible Interfaces
+  Note that developers must always implement MSAA's IAccessible and, if needed, some
+  of the interfaces in the set of IAccessible2 interfaces.  Although the IAccessible2
+  IDL is coded such that IAccessible2 is a subclass of MSAA's IAccessible, none of
+  MSAA's IAccessible methods are redefined by IAccessible2.
+
+  QueryService must be used to switch from a reference to an MSAA IAccessible interface 
+  to another interface.  This has been 
+  <a href="http://www.atia.org/files/public/Introducing_IAccessibleEx.doc">
+  documented</a> and the pertinent facts have been extracted below: 
+
+  @par 
+   Why use QueryService instead of just using QueryInterface to get IAccessibleEx 
+   directly? The reason is that since MSAA 2.0, clients don't talk to a server's 
+   IAccessible interface directly; instead they talk to an intermediate MSAA-provided 
+   wrapper that calls through to the original IAccessible. This wrapper provides services 
+   such as implementing IDispatch, supplying information from MSAA 2.0's Dynamic Annotation 
+   service, and scaling locations when running on Windows Vista with DPI scaling enabled. 
+   QueryService is the supported way to expose additional interfaces from an existing 
+   IAccessible and was originally used by MSHTML to expose IHTMLElement objects corresponding 
+   to IAccessibles. QueryService is often more convenient for servers to implement than 
+   QueryInterface because it does not have the same requirements for preserving object 
+   identity or symmetry/transitivity as QueryInterface, so QueryService allows servers to 
+   easily implement the interface on the same object or a separate object. The latter is 
+   often hard to do with QueryInterface unless the original object supports aggregation. 
+
+  Two related references in MSDN&reg; are: 
+  @li <a href="http://msdn.microsoft.com/en-us/library/ms696078(VS.85).aspx">
+  "Using QueryService to expose a native object model interface for an IAccessible object"</a>
+  @li <a href="http://msdn.microsoft.com/en-us/library/ms528415.aspx#acc_obj"> 
+  "Accessing the Internet Explorer Object Associated with an Accessible Object"</a>
+
+  Based on this information from Microsoft, QueryService must be used to switch back and forth 
+  between a reference to an MSAA IAccessible interface and any of the IAccessible2 interfaces. 
+
+  Regarding switching between any of the IAccessible2 interfaces, applications implementing
+  IAccessible2 should implement the IAccessible2 interfaces on a single object since ATs
+  will be using QueryInterface to switch between the IAccessilbe2 interfaces.  Implementing
+  the IAccessible2 interfaces on separate objects would require the use of QueryService.
+  There is one exception, IAccessibleApplication can be implemented on a separate object so
+  its common code doesn't have to be included in each accessible object.  ATs should use
+  QueryService to access IAccessibleApplication.
+
+ @section _applicationInfo Access to Information about the Application
+  Servers implementing IAccessible2 should provide access to the IAccessibleApplication 
+  interface via QueryService from any object so that ATs can easily determine specific 
+  information about the application such as its name or version.
+
+ @section _childIDs Child IDs
+  The IAccessible2 interfaces do not support child IDs, i.e. simple child elements.
+  Full accessible objects must be created for each object that supports IAccessible2.
+  Therefore MSAA's get_accChild should never return a child ID (other than CHILDID_SELF)
+  for an object that implements any of the IAccessible2 interfaces.
+
+  Microsoft's UI Automation specification has the same limitation and this was resolved
+  in the UI Automation Express specification by adding IAccessibleEx::GetObjectForChild
+  and IAccessibleEx::GetIAccessiblePair.  These methods allow mapping back and forth 
+  between an IAccessibleEx and an {IAccessible, Child ID} pair.  A future version of 
+  IAccessible2 may include similar methods to map back and forth between an IAccessible2
+  and an {IAccessible, Child ID} pair.
+
+ @section _variants VARIANTs
+  Some methods return a VARIANT.  Implementers need to make sure that the return type is 
+  specified, i.e. VT_I4, VT_IDISPATCH, etc.  The methods that return VARIANTs are 
+  IAccessibleHyperlink::anchor, IAccessibleHyperlink::anchorTarget, IAccessibleValue::currentValue,
+  IAccessibleValue::maximumValue, IAccessibleValue::minimumValue.
+
+ @section _iaaction-iahyperlink IAccessibleHyperlink as subclass of IAccessibleAction
+  In this version of the IDL, IAccessibleHyperlink is a subclass of IAccessibleAction.  
+  However, there is no practical need for that inheritance and in some cases, such as
+  an image map of smart tags, it doesn't make sense because such an image map doesn't 
+  have actionable objects; it's the secondary smart tags that are actionable.  As a 
+  result, implementations should not rely on the inheritance as it may be removed in 
+  a later version of the IDL.
+
+ @section _trademark Trademark Attribution
+  The names of actual companies and products mentioned herein may be the trademarks of
+  their respective owners.  In particular, Active Accessibility, Microsoft, MSDN, and Win32
+  are trademarks of the Microsoft group of companies in the U.S.A. and/or other countries.
+
+**/
+
+import "objidl.idl";
+import "oaidl.idl";
+import "oleacc.idl";
+import "AccessibleRelation.idl";
+import "AccessibleStates.idl";
+import "IA2CommonTypes.idl";
+
+/** A structure defining the locale of an accessible object.
+IAccessible2::locale returns this struct.
+*/
+typedef struct IA2Locale {
+  BSTR language; ///< ISO 639-1 Alpha-2 two character language code
+  BSTR country;  ///< ISO 3166-1 Alpha-2 two character country code
+  BSTR variant;  ///< Application specific variant of the locale
+} IA2Locale;
+
+/** @brief This interface exposes the primary set of information about an
+ IAccessible2 enabled accessible object.
+
+ This interface must always be provided for objects that support some
+ portion of the collection of the %IAccessible2 interfaces.
+
+ Please refer to @ref _changingInterfaces "Changing between Accessible Interfaces"
+ for special considerations related to use of the MSAA IAccessible interface and 
+ the set of %IAccessible2 interfaces.
+ */
+[object, uuid(E89F726E-C4F4-4c19-BB19-B647D7FA8478)]
+interface IAccessible2 : IAccessible
+{
+
+  /** @brief Returns the number of accessible relations for this object.
+   @param [out] nRelations
+   @retval S_OK
+  */
+  [propget] HRESULT nRelations
+    (
+     [out, retval] long *nRelations
+    );
+
+  /** @brief Returns one accessible relation for this object.
+   @param [in] relationIndex
+     0 based
+   @param [out] relation
+   @retval S_OK
+   @retval E_INVALIDARG if bad [in] passed
+  */
+  [propget] HRESULT relation
+    (
+     [in] long relationIndex,
+     [out, retval] IAccessibleRelation **relation
+    );
+
+  /** @brief Returns multiple accessible relations for this object.
+   @param [in] maxRelations
+     maximum size of the array allocated by the client
+   @param [out] relations
+    The array of accessible relation objects.  Note that this array is to be
+    allocated by the client and freed when no longer needed.  Refer to @ref 
+    _arrayConsideration "Special Consideration when using Arrays" for more details.
+   @param [out] nRelations 
+    actual number of relations in the returned array (not more than maxRelations)
+   @retval S_OK
+   @retval S_FALSE if there are no relations, nRelations is set to 0
+   @note As a performant alternative, client code should consider using IAccessible2_2::relationTargetsOfType.
+  */
+  [propget] HRESULT relations
+    (
+     [in] long maxRelations, 
+     [out, size_is(maxRelations), length_is(*nRelations)]
+       IAccessibleRelation **relations, 
+     [out, retval] long *nRelations 
+    );
+
+  /** @brief Returns the role of an %IAccessible2 object.
+   @param [out] role
+    The role of an %IAccessible2 object.
+   @retval S_OK
+   @note 
+   @li For convenience MSAA roles are also passed through this method so the
+    AT doesn't have to also fetch roles through MSAA's get_accRole.
+   @li %IAccessible2 roles should not be passed through MSAA's get_accRole.
+   @li For compatibility with non IAccessible2 enabled ATs, IAccessible2 
+    applications should also add support to get_accRole to return the closest 
+    MSAA role or ROLE_SYSTEM_CLIENT (the MSAA defined default role) if there 
+    is not a good match.  
+   @li This method is missing a [propget] prefix in the IDL.  The result is the
+    method is named role in generated C++ code instead of get_role.
+  */
+  HRESULT role
+    (
+     [out, retval] long *role
+    );
+
+  /** @brief Makes an object visible on the screen.
+   @param [in] scrollType
+    Defines where the object should be placed on the screen.
+   @retval S_OK
+   @retval E_INVALIDARG if bad [in] passed
+  */
+  HRESULT scrollTo
+    (
+     [in] enum IA2ScrollType scrollType 
+    );
+
+  /** @brief Moves the top left of an object to a specified location.
+
+   @param [in] coordinateType
+    Specifies whether the coordinates are relative to the screen or the parent object.
+   @param [in] x
+    Defines the x coordinate.
+   @param [in] y
+    Defines the y coordinate.
+   @retval S_OK
+   @retval E_INVALIDARG if bad [in] passed
+  */
+  HRESULT scrollToPoint
+    (
+     [in] enum IA2CoordinateType coordinateType,
+     [in] long x,
+     [in] long y 
+    );
+
+  /** @brief Returns grouping information.
+   
+   Used for tree items, list items, tab panel labels, radio buttons, etc.
+   Also used for collections of non-text objects.
+
+   @param [out] groupLevel
+    1 based, 0 indicates that this value is not applicable
+   @param [out] similarItemsInGroup
+    1 based, 0 indicates that this value is not applicable
+   @param [out] positionInGroup
+    1 based, 0 indicates that this value is not applicable. This is an index
+    into the objects in the current group, not an index into all the objects
+    at the same group level.
+   @retval S_OK if at least one value is valid
+   @retval S_FALSE if no values are valid, [out] values are 0s
+   @note This method is meant to describe the nature of an object's containment
+    structure.  It's exposed by trees, tree grids, nested lists, nested menus,
+    but not headings, which uses the level object attribute.  It is also exposed
+    by radio buttons (with groupLevel == 0).
+   @note This is normally not implemented on a combo box to describe the nature
+    of its contents.  Normally an AT will get that information from its child list 
+    object.  However, in some cases when non-edit combo boxes are not able to be structured
+    such that the list is a child of the combo box, this method is implemented on
+    the combo box itself. ATs can use this interface if a child list is not found.
+  */
+  [propget] HRESULT groupPosition
+    (
+     [out] long *groupLevel,
+     [out] long *similarItemsInGroup,
+     [out, retval] long *positionInGroup 
+    );
+
+  /** @brief Returns the bit strip containing any IAccessible2 states.
+  
+   The IAccessible2 states are in addition to the MSAA states and are defined in
+   the IA2States enum.
+
+   @param [out] states
+   @retval S_OK
+  */
+  [propget] HRESULT states
+    (
+     [out, retval] AccessibleStates *states
+    );
+
+  /** @brief Returns the extended role.
+   
+   An extended role is a role which is dynamically generated by the application.
+   It is not predefined by the %IAccessible2 specification.
+   
+   @param [out] extendedRole
+   @retval S_OK
+   @retval S_FALSE if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT extendedRole
+    (
+     [out, retval] BSTR *extendedRole
+    );
+
+  /** @brief Returns the localized extended role.
+   @param [out] localizedExtendedRole
+   @retval S_OK
+   @retval S_FALSE if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT localizedExtendedRole
+    (
+     [out, retval] BSTR *localizedExtendedRole
+    );
+
+  /** @brief Returns the number of extended states.
+   @param [out] nExtendedStates
+   @retval S_OK
+  */
+  [propget] HRESULT nExtendedStates
+    (
+     [out, retval] long *nExtendedStates
+    );
+
+  /** @brief Returns the extended states (array of strings).
+
+   An extended state is a state which is dynamically generated by the application.
+   It is not predefined by the %IAccessible2 specification.
+
+   @param [in] maxExtendedStates
+    This parameter is ignored. Refer to @ref _arrayConsideration 
+    "Special Consideration when using Arrays" for more details.
+   @param [out] extendedStates
+    This array is allocated by the server.  The client must free it with CoTaskMemFree.
+   @param [out] nExtendedStates
+    The number of extended states returned; the size of the returned array.
+   @retval S_OK
+   @retval S_FALSE if there are no states, [out] values are NULL and 0 respectively
+  */
+  [propget] HRESULT extendedStates
+    (
+     [in] long maxExtendedStates,
+     [out, size_is(,maxExtendedStates), length_is(,*nExtendedStates)] BSTR **extendedStates,
+     [out, retval] long *nExtendedStates
+    );
+
+  /** @brief Returns the localized extended states (array of strings).
+
+   @param [in] maxLocalizedExtendedStates
+    This parameter is ignored. Refer to @ref _arrayConsideration 
+    "Special Consideration when using Arrays" for more details.
+   @param [out] localizedExtendedStates
+    This array is allocated by the server.  The client must free it with CoTaskMemFree. 
+   @param [out] nLocalizedExtendedStates
+    The number of localized extended states returned; the size of the returned array.
+   @retval S_OK
+   @retval S_FALSE if there are no states, [out] values are NULL and 0 respectively
+  */
+  [propget] HRESULT localizedExtendedStates
+    (
+     [in] long maxLocalizedExtendedStates,
+     [out, size_is(,maxLocalizedExtendedStates), length_is(,*nLocalizedExtendedStates)] BSTR **localizedExtendedStates,
+     [out, retval] long *nLocalizedExtendedStates
+    );
+
+  /** @brief Returns the unique ID.
+   
+   The uniqueID is an identifier for this object, is unique within the
+   current window, and remains the same for the lifetime of the accessible
+   object. 
+   
+   The uniqueID is not related to:
+   - the MSAA objectID which is used by the server to disambiguate between
+   IAccessibles per HWND or
+   - the MSAA childID which is used to disambiguate between children being
+   managed by an IAccessible.
+
+   This value is provided so the AT can have access to a unique runtime persistent 
+   identifier even when not handling an event for the object.
+   
+   An example of when this value is useful is if the AT wants to build a cache. 
+   The AT could cache the uniqueIDs in addition to other data being cached. 
+   When an event is fired the AT could map the uniqueID to its internal model.
+   Thus, if there's a REORDER/SHOW/HIDE event the AT knows which part of the 
+   internal structure has been invalidated and can refetch just that part.
+
+   This value can also be used by an AT to determine when the current control
+   has changed. If the role is the same for two controls that are adjacent in 
+   the tab order, this can be used to detect the new control.
+
+   Another use of this value by an AT is to identify when a grouping object has 
+   changed, e.g. when moving from a radio button in one group to a radio button in a 
+   different group.
+
+   One means of implementing this would be to create a factory with a 32 bit number 
+   generator and a reuse pool.  The number generator would emit numbers starting 
+   at 1.  Each time an object's life cycle ended, its number would be saved into a 
+   reuse pool.  The number generator would be used whenever the reuse pool was empty.
+
+   Another way to create a unique ID is to generate it from a pointer value, e.g. an
+   object's address. That would be unique because no two active objects can use the
+   same allocated memory space.
+
+   @param [out] uniqueID
+   @retval S_OK
+  */
+  [propget] HRESULT uniqueID
+    (
+     [out, retval] long *uniqueID
+    );
+
+  /** @brief Returns the window handle for the parent window which contains this object.
+
+   This is the same window handle which will be passed for any events that occur on the 
+   object, but is cached in the accessible object for use when it would be helpful to 
+   access the window handle in cases where an event isn't fired on this object.
+
+   A use case is when a screen reader is grabbing an entire web page on a page load. 
+   Without the availability of windowHandle, the AT would have to get the window handle
+   by using WindowFromAccessibleObject on each IAccessible, which is slow because it's 
+   implemented by oleacc.dll as a loop which crawls up the ancestor chain and looks for 
+   a ROLE_WINDOW object, mapping that back to a window handle.
+   
+   @param [out] windowHandle
+   @retval S_OK
+  */
+  [propget] HRESULT windowHandle
+    (
+     [out, retval] HWND *windowHandle
+    );
+  /** @brief Returns the index of this object in its parent object.
+   @param [out] indexInParent
+     0 based; -1 indicates there is no parent; the upper bound is the value 
+     returned by the parent's IAccessible::get_accChildCount.
+   @retval S_OK
+   @retval S_FALSE if no parent, [out] value is -1
+  */
+  [propget] HRESULT indexInParent
+    (
+     [out, retval] long *indexInParent
+    );
+
+  /** @brief Returns the IA2Locale of the accessible object. 
+   @param [out] locale
+   @retval S_OK
+  */
+  [propget] HRESULT locale
+    (
+     [out, retval] IA2Locale *locale
+    );
+
+  /** @brief Returns the attributes specific to this object, such as a cell's formula.
+   @param [out] attributes
+   @retval S_OK
+   @retval S_FALSE returned if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT attributes
+    (
+     [out, retval] BSTR *attributes
+    );
+
+}
+
diff --git a/Source/WebKit/win/Interfaces/Accessible2/Accessible2_2.idl b/Source/WebKit/win/Interfaces/Accessible2/Accessible2_2.idl
new file mode 100644 (file)
index 0000000..e90c2a3
--- /dev/null
@@ -0,0 +1,123 @@
+/*************************************************************************
+ *
+ *  File Name (Accessible2_2.idl)
+ * 
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2013 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, 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. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+import "objidl.idl";
+import "oaidl.idl";
+import "oleacc.idl";
+import "Accessible2.idl";
+
+/** @brief This interface exposes the primary set of information about an
+ IAccessible2 enabled accessible object.
+
+ This interface must always be provided for objects that support some
+ portion of the collection of the %IAccessible2 interfaces.
+
+ Please refer to @ref _changingInterfaces "Changing between Accessible Interfaces"
+ for special considerations related to use of the MSAA IAccessible interface and 
+ the set of %IAccessible2 interfaces.
+ */
+[object, uuid(6C9430E9-299D-4E6F-BD01-A82A1E88D3FF)]
+interface IAccessible2_2 : IAccessible2
+{
+  /** @brief Returns the attribute value of a specified attribute specific to this object.
+   @param [in] name
+   @param [out] attribute
+   @retval S_OK
+   @retval S_FALSE returned if there is nothing to return, [out] value is NULL.
+   @retval E_INVALIDARG if bad [in] passed.
+   @note The output value is a VARIANT.  Typically it will be a VT_BSTR, but there
+     are some cases where it will be a VT_I4 or VT_BOOL.  Refer to the <a href=
+     "http://www.linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2/objectattributesIAccessible2">
+     Object Attributes specification</a> for more information.
+  */
+  [propget] HRESULT attribute
+    (
+     [in] BSTR name,
+     [out, retval] VARIANT *attribute
+    );
+
+  /** @brief Returns the deepest hypertext accessible in the subtree of this object, and the caret offset within it.
+   @param [out] accessible
+   @param [out] caretOffset
+   @retval S_OK
+   @retval S_FALSE returned if there is no caret in any of the objects in the subtree, [out] accessible is NULL and [out] caretOffset is -1.
+  */
+  [propget] HRESULT accessibleWithCaret
+    (
+     [out] IUnknown **accessible,
+     [out, retval] long *caretOffset
+    );
+
+  /** @brief Returns relation targets for a specified target type.
+   @param [in] type
+    The requested @ref grpRelations "relation type".
+   @param [in] maxTargets
+    The number of targets requested.  0 indicates that all targets should be returned.
+   @param [out] targets
+    This array is allocated by the server.  The client must free it with CoTaskMemFree.
+   @param [out] nTargets
+    The number of targets returned; the size of the returned array.
+   @retval S_OK
+   @retval S_FALSE if there are no targets, [out] values are NULL and 0 respectively.
+   @retval E_INVALIDARG if bad [in] passed.
+  */
+  [propget] HRESULT relationTargetsOfType
+    (
+     [in] BSTR type,
+     [in] long maxTargets,
+     [out, size_is(,*nTargets)] IUnknown ***targets,
+     [out, retval] long *nTargets
+    );
+
+}
+
diff --git a/Source/WebKit/win/Interfaces/Accessible2/AccessibleApplication.idl b/Source/WebKit/win/Interfaces/Accessible2/AccessibleApplication.idl
new file mode 100644 (file)
index 0000000..2586334
--- /dev/null
@@ -0,0 +1,121 @@
+/*************************************************************************
+ *
+ *  File Name (AccessibleApplication.idl)
+ * 
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2010 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, 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. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+
+import "objidl.idl";
+import "oaidl.idl";
+import "oleacc.idl";
+
+/** @brief This interface gives access to the application's name and version information.
+        
+ This interface provides the AT with the information it needs to differentiate 
+ this application from other applications, from other versions of this 
+ application, or from other versions of this application running on different 
+ versions of an accessibility bridge or accessibility toolkit.
+
+ Servers implementing IAccessible2 should provide access to the %IAccessibleApplication 
+ interface via QueryService from any object so that ATs can easily determine specific 
+ information about the application such as its name or version.
+*/
+[object, uuid(D49DED83-5B25-43F4-9B95-93B44595979E)]
+interface IAccessibleApplication : IUnknown
+{
+  
+  /** @brief Returns the application name.
+   @param [out] name
+   @retval S_OK
+   @retval S_FALSE if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT appName
+    (
+     [out, retval] BSTR *name
+    );
+
+  /** @brief Returns the application version.
+   @param [out] version
+    The version string must not contain levels when it is know beforehand that
+    this information will never require a change in a client's behavior.
+    For example, use "3.6.0" rather than "3.6.0.v201005131500".
+   @retval S_OK
+   @retval S_FALSE if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT appVersion
+    (
+     [out, retval] BSTR *version
+    );
+
+  /** @brief Returns the toolkit/bridge name.
+   @param [out] name
+   @retval S_OK
+   @retval S_FALSE if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT toolkitName
+    (
+     [out, retval] BSTR *name
+    );
+
+  /** @brief Returns the toolkit/bridge version.
+   @param [out] version
+    The version string must not contain levels when it is know beforehand that
+    this information will never require a change in a client's behavior.
+    For example, use "3.6.0" rather than "3.6.0.v201005131500".
+   @retval S_OK
+   @retval S_FALSE if there is nothing to return, [out] value is NULL
+  */
+  [propget] HRESULT toolkitVersion
+    (
+     [out, retval] BSTR *version
+    );  
+
+}
+
diff --git a/Source/WebKit/win/Interfaces/Accessible2/AccessibleRelation.idl b/Source/WebKit/win/Interfaces/Accessible2/AccessibleRelation.idl
new file mode 100644 (file)
index 0000000..ba8d3ae
--- /dev/null
@@ -0,0 +1,227 @@
+/*************************************************************************
+ *
+ *  File Name (AccessibleRelation.idl)
+ * 
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2013 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, 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. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+import "objidl.idl";
+import "oaidl.idl";
+import "oleacc.idl";
+
+/** @defgroup grpRelations Relations 
+  Use the following constants to compare against the BSTRs returned by 
+  IAccessibleRelation::relationType.
+*/ 
+///@{
+
+/** The target object is the containing application object. */
+const WCHAR *const IA2_RELATION_CONTAINING_APPLICATION = L"containingApplication";
+
+/** The target object is the containing document object. The target object implements
+ the IAccessibleDocument interface.
+*/
+const WCHAR *const IA2_RELATION_CONTAINING_DOCUMENT = L"containingDocument";
+
+/** The target object is the containing tab pane object. */
+const WCHAR *const IA2_RELATION_CONTAINING_TAB_PANE = L"containingTabPane";
+
+/** The target object is the containing window object. */
+const WCHAR *const IA2_RELATION_CONTAINING_WINDOW = L"containingWindow";
+
+/** Some attribute of this object is affected by a target object. */
+const WCHAR *const IA2_RELATION_CONTROLLED_BY = L"controlledBy";
+
+/** This object is interactive and controls some attribute of a target object. */
+const WCHAR *const IA2_RELATION_CONTROLLER_FOR = L"controllerFor";
+
+/** This object is described by the target object. */
+const WCHAR *const IA2_RELATION_DESCRIBED_BY = L"describedBy";
+
+/** This object is describes the target object. */
+const WCHAR *const IA2_RELATION_DESCRIPTION_FOR = L"descriptionFor";
+
+/** This object is embedded by a target object. */
+const WCHAR *const IA2_RELATION_EMBEDDED_BY = L"embeddedBy";
+
+/** This object embeds a target object. This relation can be used on the
+ OBJID_CLIENT accessible for a top level window to show where the content 
+ areas are.
+*/
+const WCHAR *const IA2_RELATION_EMBEDS = L"embeds";
+
+/** Content flows to this object from a target object. 
+ This relation and IA2_RELATION_FLOWS_TO are useful to tie text and non-text
+ objects together in order to allow assistive technology to follow the
+ intended reading order.
+*/
+const WCHAR *const IA2_RELATION_FLOWS_FROM = L"flowsFrom";
+
+/** Content flows from this object to a target object. */
+const WCHAR *const IA2_RELATION_FLOWS_TO = L"flowsTo";
+
+/** This object is label for a target object. */
+const WCHAR *const IA2_RELATION_LABEL_FOR = L"labelFor";
+
+/** This object is labelled by a target object. Note that the double L spelling
+ which follows is preferred.  Please use it instead.  This single L version may
+ be removed in a later version.
+*/
+const WCHAR *const IA2_RELATION_LABELED_BY = L"labelledBy";
+
+/** This object is labelled by a target object. */
+const WCHAR *const IA2_RELATION_LABELLED_BY = L"labelledBy";
+
+/** This object is a member of a group of one or more objects. When 
+ there is more than one object in the group each member may have one and the 
+ same target, e.g. a grouping object.  It is also possible that each member has 
+ multiple additional targets, e.g. one for every other member in the group.
+*/
+const WCHAR *const IA2_RELATION_MEMBER_OF = L"memberOf";
+
+/** The target object is the next object in the tab order. */
+const WCHAR *const IA2_RELATION_NEXT_TABBABLE = L"nextTabbable";
+
+/** This object is a logical child of a target object.  This relation is the reciprocal
+ of the IA2_RELATION_NODE_PARENT_OF relation. In some cases an application's accessible
+ tree is such that objects can be in a logical parent-child relationship which is
+ different from the hierarchy of the accessible tree. */
+const WCHAR *const IA2_RELATION_NODE_CHILD_OF = L"nodeChildOf";
+
+/** This object is a logical parent of a target object. This relation is the reciprocal
+ of the IA2_RELATION_NODE_CHILD_OF relation. In some cases an application's accessible
+ tree is such that objects can be in a logical parent-child relationship which is
+ different from the hierarchy of the accessible tree. */
+const WCHAR *const IA2_RELATION_NODE_PARENT_OF = L"nodeParentOf";
+
+/** This object is a parent window of the target object. */
+const WCHAR *const IA2_RELATION_PARENT_WINDOW_OF = L"parentWindowOf";
+
+/** This object is a transient component related to the target object. 
+ When this object is activated the target object doesn't lose focus.
+*/
+const WCHAR *const IA2_RELATION_POPUP_FOR = L"popupFor";
+
+/** The target object is the previous object in the tab order. */
+const WCHAR *const IA2_RELATION_PREVIOUS_TABBABLE = L"previousTabbable";
+
+/** This object is a sub window of a target object. */
+const WCHAR *const IA2_RELATION_SUBWINDOW_OF = L"subwindowOf";
+
+///@}
+
+/** This interface gives access to an object's set of relations.
+*/
+[object, uuid(7CDF86EE-C3DA-496a-BDA4-281B336E1FDC)]
+interface IAccessibleRelation : IUnknown
+{
+  /** @brief Returns the type of the relation.
+   @param [out] relationType
+    The strings returned are defined @ref grpRelations "in this section of the documentation".
+   @retval S_OK
+  */
+  [propget] HRESULT relationType
+    (
+     [out, retval] BSTR *relationType
+    );
+
+  /** @brief Returns a localized version of the relation type.
+   @param [out] localizedRelationType
+   @retval S_OK
+  */
+  [propget] HRESULT localizedRelationType
+    (
+     [out, retval] BSTR *localizedRelationType
+    );
+
+  /** @brief Returns the number of targets for this relation.
+   @param [out] nTargets
+   @retval S_OK
+  */
+  [propget] HRESULT nTargets
+    (
+     [out, retval] long *nTargets
+    );
+
+  /** @brief Returns one accessible relation target.
+   @param [in] targetIndex
+    0 based index
+   @param [out] target
+   @retval S_OK
+   @retval E_INVALIDARG if bad [in] passed
+   @note Use QueryInterface to get IAccessible2.
+  */
+  [propget] HRESULT target
+    (
+     [in] long targetIndex,
+     [out, retval] IUnknown **target 
+    );
+
+  /** @brief Returns multiple accessible relation targets
+   @param [in] maxTargets
+    maximum size of the array allocated by the client
+   @param [out] targets
+    The array of target objects.  Note that this array is to be allocated by the
+    client and freed when no longer needed.  Refer to @ref _arrayConsideration 
+    "Special Consideration when using Arrays" for more details.  You will need to use 
+    QueryInterface on the IUnknown to get the IAccessible2.
+   @param [out] nTargets
+    actual number of targets in the returned array (not more than maxTargets)
+   @retval S_OK
+   @retval E_INVALIDARG if bad [in] passed, e.g. a negative value
+  */
+  [propget] HRESULT targets
+    (
+     [in] long maxTargets, 
+     [out, size_is(maxTargets), length_is(*nTargets)]
+       IUnknown **targets, 
+     [out, retval] long *nTargets 
+    );
+
+}
diff --git a/Source/WebKit/win/Interfaces/Accessible2/AccessibleStates.idl b/Source/WebKit/win/Interfaces/Accessible2/AccessibleStates.idl
new file mode 100644 (file)
index 0000000..8637174
--- /dev/null
@@ -0,0 +1,209 @@
+/*************************************************************************
+ *
+ *  File Name (AccessibleStates.idl)
+ * 
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2010 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, 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. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+import "objidl.idl";
+
+typedef long AccessibleStates;
+
+/** %IAccessible2 specific state bit constants
+
+  This enum defines the state bits returned by IAccessible2::states.  The 
+  %IAccessible2 state bits are in addition to those returned by MSAA.
+*/
+enum IA2States {
+
+/** Indicates a window is currently the active window, or is an active subelement 
+  within a container or table.
+
+ This state can be used to indicate the current active item in a container, even 
+  if the container itself is not currently active. In other words this would indicate
+  the item that will get focus if you tab to the container.
+
+ This information is important for knowing what to report for trees and potentially 
+  other containers in a virtual buffer.
+
+ Also, see ::IA2_STATE_MANAGES_DESCENDANTS for more information.
+*/
+IA2_STATE_ACTIVE = 0x1,
+
+/** Indicates that the object is armed.
+
+ Used to indicate that the control is "pressed" and will be invoked when the 
+  actuator, e.g. a mouse button, is "released".  An AT which either monitors the 
+  mouse or synthesizes mouse events might need to know that, and possibly a talking
+  interface would even let the user know about it.  It could also potentially be
+  useful to on screen keyboards or test tools since the information does indicate
+  something about the state of the interface, for example, code operating asynchronously
+  might need to wait for the armed state to change before doing something else.
+
+*/
+IA2_STATE_ARMED = 0x2,
+
+/** Indicates the user interface object corresponding to this object no longer exists. */
+IA2_STATE_DEFUNCT = 0x4,
+
+/** An object with this state has a caret and implements the IAccessibleText interface.
+  
+ Such fields may be read-only, so STATE_SYSTEM_READONLY is valid in combination
+  with IA2_STATE_EDITABLE.
+
+*/
+IA2_STATE_EDITABLE = 0x8,
+
+/** Indicates the orientation of this object is horizontal. */
+IA2_STATE_HORIZONTAL = 0x10,
+
+/** Indicates this object is minimized and is represented only by an icon. */
+IA2_STATE_ICONIFIED = 0x20,
+
+/** Indicates an input validation failure. */
+IA2_STATE_INVALID_ENTRY = 0x40,
+
+/** Indicates that this object manages its children.
+
+ Note: Due to the fact that MSAA's WinEvents don't allow the active child index
+  to be passed on the IA2_EVENT_ACTIVE_DESCENDANT_CHANGED event, the manages
+  descendants scheme can't be used.  Instead the active child object has to fire
+  MSAA's EVENT_OBJECT_FOCUS.  In a future release a new event mechanism may be
+  added to provide for event specific data to be passed with the event.  At that
+  time the IA2_EVENT_ACTIVE_DECENDENT_CHANGED event and
+  IA2_STATE_MANAGES_DESCENDANTS state would be useful.
+*/
+IA2_STATE_MANAGES_DESCENDANTS = 0x80,
+
+/** Indicates that an object is modal.
+
+ Modal objects have the behavior that something must be done with the object 
+  before the user can interact with an object in a different window.
+*/
+IA2_STATE_MODAL = 0x100,
+
+/** Indicates this text object can contain multiple lines of text. */
+IA2_STATE_MULTI_LINE = 0x200,
+
+/** Indicates this object paints every pixel within its rectangular region. */
+IA2_STATE_OPAQUE = 0x400,
+
+/** Indicates that user interaction is required.
+
+ An example of when this state is used is when a field in a form must be filled 
+  before a form can be processed.
+*/
+IA2_STATE_REQUIRED = 0x800,
+
+/** Indicates an object which supports text selection.
+
+ Note: This is different than MSAA STATE_SYSTEM_SELECTABLE.
+*/
+IA2_STATE_SELECTABLE_TEXT = 0x1000,
+
+/** Indicates that this text object can contain only a single line of text. */
+IA2_STATE_SINGLE_LINE = 0x2000,
+
+/** Indicates that the accessible object is stale.
+
+ This state is used when the accessible object no longer accurately 
+  represents the state of the object which it is representing such as when an
+  object is transient or when an object has been or is in the process of being
+  destroyed or when the object's index in its parent has changed.
+*/
+IA2_STATE_STALE = 0x4000,
+
+/** Indicates that the object implements autocompletion.
+
+ This state indicates that a text control will respond to the input of 
+ one ore more characters and cause a sub-item to become selected.  The 
+ selection may also result in events fired on the parent object.
+*/
+IA2_STATE_SUPPORTS_AUTOCOMPLETION = 0x8000,
+
+/** Indicates this object is transient.
+
+ An object has this state when its parent object has the state ::IA2_STATE_MANAGES_DESCENDANTS.
+ For example, a list item object may be managed by its parent list object and may only 
+ exist as long as the object is actually rendered.  Similarly a table cell's accessible 
+ object may exist only while the cell has focus.  However, from the perspective of an 
+ assistive technology a transient object behaves like a non-transient object.  As a 
+ result it is likely that this state is not of use to an assistive technology, but it 
+ is provided in case an assistive technology determines that knowledge of the transient 
+ nature of the object is useful and also for harmony with the Linux accessibility API.
+
+ Also, see ::IA2_STATE_MANAGES_DESCENDANTS for more information.
+ */
+IA2_STATE_TRANSIENT = 0x10000,
+
+/** Indicates the orientation of this object is vertical. */
+IA2_STATE_VERTICAL = 0x20000,
+
+/** Indicates this object is checkable.
+
+ The standard checkable objects are check boxes, radio buttons, check box menu
+ items, radio menu items, and toggle buttons.  Since assistive technology will
+ determine that these objects are checkable via the object's role the checkable
+ state is not required.  However, this state is necessary in those cases where
+ an object has a role which is not one of the previously mentioned roles.  An
+ example is a table cell which indicates whether or not an email has an attachment,
+ whether or not an mail is considered spam, and whether or not an email has been read.
+ */
+IA2_STATE_CHECKABLE = 0x40000,
+
+/** Indicates this object is pinned.
+
+ This state indicates that an object is fixed at a certain location.  One example
+ is a browser tab that when pinned cannot be moved until unpinned.  Another example
+ is a movable or floating object that when pinned remains in its pinned location
+ until being unpinned.
+ */
+IA2_STATE_PINNED = 0x80000
+
+};
diff --git a/Source/WebKit/win/Interfaces/Accessible2/IA2CommonTypes.idl b/Source/WebKit/win/Interfaces/Accessible2/IA2CommonTypes.idl
new file mode 100644 (file)
index 0000000..8a12af4
--- /dev/null
@@ -0,0 +1,191 @@
+/*************************************************************************
+ *
+ *  File Name (IA2CommonTypes.idl)
+ * 
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2010 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, 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. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "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 THE COPYRIGHT HOLDER 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. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+ /** These constants control the scrolling of an object or substring into a window.
+
+ This enum is used in IAccessible2::scrollTo and IAccessibleText::scrollSubstringTo.
+*/
+enum IA2ScrollType {
+
+  /** Scroll the top left corner of the object or substring such that the top left
+   corner (and as much as possible of the rest of the object or substring) is within
+   the top level window.  In cases where the entire object or substring fits within 
+   the top level window, the placement of the object or substring is dependent on 
+   the application.  For example, the object or substring may be scrolled to the 
+   closest edge, the furthest edge, or midway between those two edges.  In cases
+   where there is a hierarchy of nested scrollable controls, more than one control
+   may have to be scrolled.
+  */
+  IA2_SCROLL_TYPE_TOP_LEFT, 
+
+  /** Scroll the bottom right corner of the object or substring such that the bottom right
+   corner (and as much as possible of the rest of the object or substring) is within
+   the top level window.  In cases where the entire object or substring fits within 
+   the top level window, the placement of the object or substring is dependent on 
+   the application.  For example, the object or substring may be scrolled to the 
+   closest edge, the furthest edge, or midway between those two edges.  In cases
+   where there is a hierarchy of nested scrollable controls, more than one control
+   may have to be scrolled.
+  */
+  IA2_SCROLL_TYPE_BOTTOM_RIGHT,
+
+  /** Scroll the top edge of the object or substring such that the top edge 
+   (and as much as possible of the rest of the object or substring) is within the
+   top level window.  In cases where the entire object or substring fits within 
+   the top level window, the placement of the object or substring is dependent on 
+   the application.  For example, the object or substring may be scrolled to the 
+   closest edge, the furthest edge, or midway between those two edges.  In cases
+   where there is a hierarchy of nested scrollable controls, more than one control
+   may have to be scrolled.
+  */
+  IA2_SCROLL_TYPE_TOP_EDGE,
+
+  /** Scroll the bottom edge of the object or substring such that the bottom edge 
+   (and as much as possible of the rest of the object or substring) is within the
+   top level window.  In cases where the entire object or substring fits within 
+   the top level window, the placement of the object or substring is dependent on 
+   the application.  For example, the object or substring may be scrolled to the 
+   closest edge, the furthest edge, or midway between those two edges.  In cases
+   where there is a hierarchy of nested scrollable controls, more than one control
+   may have to be scrolled.
+  */
+  IA2_SCROLL_TYPE_BOTTOM_EDGE, 
+
+  /** Scroll the left edge of the object or substring such that the left edge 
+   (and as much as possible of the rest of the object or substring) is within the
+   top level window.  In cases where the entire object or substring fits within 
+   the top level window, the placement of the object or substring is dependent on 
+   the application.  For example, the object or substring may be scrolled to the 
+   closest edge, the furthest edge, or midway between those two edges.  In cases
+   where there is a hierarchy of nested scrollable controls, more than one control
+   may have to be scrolled.
+  */
+  IA2_SCROLL_TYPE_LEFT_EDGE, 
+
+  /** Scroll the right edge of the object or substring such that the right edge 
+   (and as much as possible of the rest of the object or substring) is within the
+   top level window.  In cases where the entire object or substring fits within 
+   the top level window, the placement of the object or substring is dependent on 
+   the application.  For example, the object or substring may be scrolled to the 
+   closest edge, the furthest edge, or midway between those two edges.  In cases
+   where there is a hierarchy of nested scrollable controls, more than one control
+   may have to be scrolled.
+  */
+  IA2_SCROLL_TYPE_RIGHT_EDGE,
+
+  /** Scroll the object or substring such that as much as possible of the 
+   object or substring is within the top level window.  The placement of 
+   the object is dependent on the application.  For example, the object or
+   substring may be scrolled to to closest edge, the furthest edge, or midway
+   between those two edges.
+  */
+  IA2_SCROLL_TYPE_ANYWHERE
+};
+
+/** These constants define which coordinate system a point is located in.
+ This enum is used in IAccessible2::scrollToPoint, IAccessibleImage::imagePosition,
+ IAccessibleText::characterExtents, and IAccessibleText::offsetAtPoint, and 
+ IAccessibleText::scrollSubstringToPoint.
+*/
+enum IA2CoordinateType {
+
+  /// The coordinates are relative to the screen.
+  IA2_COORDTYPE_SCREEN_RELATIVE, 
+
+  /** The coordinates are relative to the upper left corner of the bounding box
+   of the immediate parent.
+  */
+  IA2_COORDTYPE_PARENT_RELATIVE  
+
+};
+
+/** Special offsets for use in IAccessibleText and IAccessibleEditableText methods
+  
+  Refer to @ref _specialOffsets 
+  "Special Offsets for use in the IAccessibleText and IAccessibleEditableText Methods" 
+  for more information.
+*/
+enum IA2TextSpecialOffsets {
+  IA2_TEXT_OFFSET_LENGTH = -1,  /**< This offset is equivalent to the length of the string.  It eliminates
+                                     the need to call IAccessibleText::nCharacters. */
+  IA2_TEXT_OFFSET_CARET = -2    /**< This offset signifies that the text related to the physical location
+                                     of the caret should be used. */
+};
+
+/** These constants specify the kind of change made to a table.
+
+   This enum is used in the IA2TableModelChange struct which in turn is used by
+   IAccessibleTable::modelChange and IAccessibleTable2::modelChange.
+*/
+enum IA2TableModelChangeType {
+  IA2_TABLE_MODEL_CHANGE_INSERT,  // = 0;
+  IA2_TABLE_MODEL_CHANGE_DELETE,
+  IA2_TABLE_MODEL_CHANGE_UPDATE
+};
+
+/** A structure defining the type of and extents of changes made to a table
+ IAccessibleTable::modelChange and IAccessibleTable2::modelChange return this struct.
+ In the case of an insertion or change the row and column offsets define the boundaries
+ of the inserted or changed subtable after the operation.  In the case of a deletion
+ the row and column offsets define the boundaries of the subtable being removed before
+ the removal.
+*/
+typedef struct IA2TableModelChange {
+  enum IA2TableModelChangeType type;  // insert, delete, update
+  long firstRow;                      ///< 0 based, inclusive
+  long lastRow;                       ///< 0 based, inclusive
+  long firstColumn;                   ///< 0 based, inclusive
+  long lastColumn;                    ///< 0 based, inclusive
+} IA2TableModelChange;
index ff564a168882427c9ef2cf4ea56ca564a0d7ed0a..0348f8f4f715f893b961e16ed9caa47a9d5bef4e 100644 (file)
@@ -29,6 +29,7 @@ import "ocidl.idl";
 #endif
 
 import "oleacc.idl";
+import "Accessible2_2.idl";
 
 cpp_quote("extern const GUID  __declspec(selectany) SID_AccessibleComparable = { 0x62b8cb5f, 0xfb7a, 0x4faf, 0x81, 0xe8, 0x52, 0xb6, 0x5f, 0x12, 0x8b, 0x31 };")
 
@@ -39,8 +40,7 @@ cpp_quote("extern const GUID  __declspec(selectany) SID_AccessibleComparable = {
     dual,
     pointer_default(unique)
 ]
-interface IAccessibleComparable : IAccessible
+interface IAccessibleComparable : IAccessible2_2
 {
     HRESULT isSameObject([in] IAccessibleComparable* other, [out, retval] BOOL* result);
-    HRESULT attributeValue([in] BSTR key, [out, retval] VARIANT* value);
 }
index 959688d07f71cc473854ec000c390d5d2b0259d6..5c27734f5fa3f07d39c341ea545af6eccce72edf 100644 (file)
@@ -55,6 +55,8 @@ cpp_quote(" */")
 import "oaidl.idl";
 import "ocidl.idl";
 
+import "AccessibleApplication.idl";
+
 #include "AccessibleComparable.idl"
 #include "WebScrollbarTypes.idl"
 #include "JavaScriptCoreAPITypes.idl"
index 16ca45e755468a5769f5cc65170791500d881657..a5ed75f6f7f6832adce9738507ea243cb887643c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2006-2009, 2011, 2013 Apple Inc. All rights reserved.
  * Copyright (C) Research In Motion Limited 2009. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -2590,7 +2590,7 @@ COMPtr<IAccessible> WebFrame::accessible() const
         // the Document renderer was destroyed and its wrapper was detached, or
         // the previous Document is in the page cache, and the current document
         // needs to be wrapped.
-        m_accessible = new AccessibleDocument(currentDocument);
+        m_accessible = new AccessibleDocument(currentDocument, webView()->viewWindow());
     }
     return m_accessible.get();
 }
index b7e4859a8c0b5b4f9c7a6957da1a6c894cd945d6..d8c89b3c6c9b012d16414b6f650f904acc921c47 100644 (file)
@@ -78,8 +78,6 @@ static COMPtr<IAccessibleComparable> comparableObject(const COMPtr<IServiceProvi
     return comparable;
 }
 
-static const _bstr_t s_AXDRTElementIdAttribute(L"AXDRTElementIdAttribute");
-
 static COMPtr<IAccessible> findAccessibleObjectById(AccessibilityUIElement parentObject, BSTR idAttribute)
 {
     COMPtr<IAccessible> parentIAccessible = parentObject.platformUIElement();
@@ -95,7 +93,8 @@ static COMPtr<IAccessible> findAccessibleObjectById(AccessibilityUIElement paren
     VARIANT value;
     ::VariantInit(&value);
 
-    if (SUCCEEDED(comparable->attributeValue(s_AXDRTElementIdAttribute, &value))) {
+    _bstr_t elementIdAttributeKey(L"AXDRTElementIdAttribute");
+    if (SUCCEEDED(comparable->get_attribute(elementIdAttributeKey, &value))) {
         ASSERT(V_VT(&value) == VT_BSTR);
         if (VARCMP_EQ == ::VarBstrCmp(value.bstrVal, idAttribute, LOCALE_USER_DEFAULT, 0)) {
             ::VariantClear(&value);
index 0f9c6e0124587f8b78e01a985e2e6c974bb5c836..06bb121c52a9c5235e6ebe2b1858c4a025dc87f4 100644 (file)
@@ -30,6 +30,7 @@
 #include "DumpRenderTree.h"
 #include "FrameLoadDelegate.h"
 #include <JavaScriptCore/JSStringRef.h>
+#include <comutil.h>
 #include <tchar.h>
 #include <string>
 
@@ -172,7 +173,9 @@ AccessibilityUIElement AccessibilityUIElement::titleUIElement()
 
     VARIANT value;
     ::VariantInit(&value);
-    if (FAILED(comparable->attributeValue(L"AXTitleUIElementAttribute", &value))) {
+
+    _bstr_t titleUIElementAttributeKey(L"AXTitleUIElementAttribute");
+    if (FAILED(comparable->get_attribute(titleUIElementAttributeKey, &value))) {
         ::VariantClear(&value);
         return 0;
     }