📄 accessiblebase.cpp
字号:
/* * Copyright (C) 2008 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include "WebKitDLL.h"#include "AccessibleBase.h"#include <oleacc.h>#include <WebCore/AccessibilityObject.h>#include <WebCore/AXObjectCache.h>#include <WebCore/BString.h>#include <WebCore/Element.h>#include <WebCore/EventHandler.h>#include <WebCore/FrameView.h>#include <WebCore/HostWindow.h>#include <WebCore/HTMLNames.h>#include <WebCore/HTMLFrameElementBase.h>#include <WebCore/HTMLInputElement.h>#include <WebCore/IntRect.h>#include <WebCore/PlatformKeyboardEvent.h>#include <WebCore/RenderFrame.h>#include <WebCore/RenderObject.h>#include <WebCore/RenderView.h>#include "WebView.h"#include <wtf/RefPtr.h>using namespace WebCore;AccessibleBase::AccessibleBase(AccessibilityObject* obj) : AccessibilityObjectWrapper(obj) , m_refCount(0){ ASSERT_ARG(obj, obj); m_object->setWrapper(this); ++gClassCount; gClassNameCount.add("AccessibleBase");}AccessibleBase::~AccessibleBase(){ --gClassCount; gClassNameCount.remove("AccessibleBase");}AccessibleBase* AccessibleBase::createInstance(AccessibilityObject* obj){ ASSERT_ARG(obj, obj); return new AccessibleBase(obj);}// IUnknownHRESULT STDMETHODCALLTYPE AccessibleBase::QueryInterface(REFIID riid, void** ppvObject){ if (IsEqualGUID(riid, __uuidof(IAccessible))) *ppvObject = this; else if (IsEqualGUID(riid, __uuidof(IDispatch))) *ppvObject = this; else if (IsEqualGUID(riid, __uuidof(IUnknown))) *ppvObject = this; else { *ppvObject = 0; return E_NOINTERFACE; } AddRef(); return S_OK;}ULONG STDMETHODCALLTYPE AccessibleBase::Release(void){ ASSERT(m_refCount > 0); if (--m_refCount) return m_refCount; delete this; return 0;}// IAccessibleHRESULT STDMETHODCALLTYPE AccessibleBase::get_accParent(IDispatch** parent){ *parent = 0; if (!m_object || !m_object->topDocumentFrameView()) return E_FAIL; return WebView::AccessibleObjectFromWindow(m_object->topDocumentFrameView()->hostWindow()->platformWindow(), OBJID_WINDOW, __uuidof(IAccessible), reinterpret_cast<void**>(parent));}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accChildCount(long* count){ if (!m_object) return E_FAIL; if (!count) return E_POINTER; *count = static_cast<long>(m_object->children().size()); return S_OK;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accChild(VARIANT vChild, IDispatch** ppChild){ if (!ppChild) return E_POINTER; *ppChild = 0; AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; *ppChild = static_cast<IDispatch*>(wrapper(childObj)); (*ppChild)->AddRef(); return S_OK;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accName(VARIANT vChild, BSTR* name){ if (!name) return E_POINTER; *name = 0; AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; if (*name = BString(wrapper(childObj)->name()).release()) return S_OK; return S_FALSE;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accValue(VARIANT vChild, BSTR* value){ if (!value) return E_POINTER; *value = 0; AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; if (*value = BString(wrapper(childObj)->value()).release()) return S_OK; return S_FALSE;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accDescription(VARIANT vChild, BSTR* description){ if (!description) return E_POINTER; *description = 0; AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; // TODO: Description, for SELECT subitems, should be a string describing // the position of the item in its group and of the group in the list (see // Firefox). if (*description = BString(wrapper(childObj)->description()).release()) return S_OK; return S_FALSE;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accRole(VARIANT vChild, VARIANT* pvRole){ if (!pvRole) return E_POINTER; ::VariantInit(pvRole); AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; pvRole->vt = VT_I4; pvRole->lVal = wrapper(childObj)->role(); return S_OK;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accState(VARIANT vChild, VARIANT* pvState){ if (!pvState) return E_POINTER; ::VariantInit(pvState); AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; pvState->vt = VT_I4; pvState->lVal = 0; if (childObj->isAnchor()) pvState->lVal |= STATE_SYSTEM_LINKED; if (childObj->isHovered()) pvState->lVal |= STATE_SYSTEM_HOTTRACKED; if (!childObj->isEnabled()) pvState->lVal |= STATE_SYSTEM_UNAVAILABLE; if (childObj->isReadOnly()) pvState->lVal |= STATE_SYSTEM_READONLY; if (childObj->isOffScreen()) pvState->lVal |= STATE_SYSTEM_OFFSCREEN; if (childObj->isMultiSelect()) pvState->lVal |= STATE_SYSTEM_MULTISELECTABLE; if (childObj->isPasswordField()) pvState->lVal |= STATE_SYSTEM_PROTECTED; if (childObj->isIndeterminate()) pvState->lVal |= STATE_SYSTEM_INDETERMINATE; if (childObj->isChecked()) pvState->lVal |= STATE_SYSTEM_CHECKED; if (childObj->isPressed()) pvState->lVal |= STATE_SYSTEM_PRESSED; if (childObj->isFocused()) pvState->lVal |= STATE_SYSTEM_FOCUSED; if (childObj->isVisited()) pvState->lVal |= STATE_SYSTEM_TRAVERSED; if (childObj->canSetFocusAttribute()) pvState->lVal |= STATE_SYSTEM_FOCUSABLE; // TODO: Add selected and selectable states. return S_OK;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accHelp(VARIANT vChild, BSTR* helpText){ if (!helpText) return E_POINTER; *helpText = 0; AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; if (*helpText = BString(childObj->helpText()).release()) return S_OK; return S_FALSE;}HRESULT STDMETHODCALLTYPE AccessibleBase::get_accKeyboardShortcut(VARIANT vChild, BSTR* shortcut){ if (!shortcut) return E_POINTER; *shortcut = 0; AccessibilityObject* childObj; HRESULT hr = getAccessibilityObjectForChild(vChild, childObj); if (FAILED(hr)) return hr; String accessKey = childObj->accessKey(); if (accessKey.isNull()) return S_FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -