axobjectcache.cpp
来自「linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自Web」· C++ 代码 · 共 257 行
CPP
257 行
/* * 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. * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "AXObjectCache.h"#include "AccessibilityList.h"#include "AccessibilityListBox.h"#include "AccessibilityListBoxOption.h"#include "AccessibilityImageMapLink.h"#include "AccessibilityRenderObject.h"#include "AccessibilityTable.h"#include "AccessibilityTableCell.h"#include "AccessibilityTableColumn.h"#include "AccessibilityTableHeaderContainer.h"#include "AccessibilityTableRow.h"#include "HTMLNames.h"#include "RenderObject.h"#include <wtf/PassRefPtr.h>namespace WebCore {using namespace HTMLNames; bool AXObjectCache::gAccessibilityEnabled = false;bool AXObjectCache::gAccessibilityEnhancedUserInterfaceEnabled = false;AXObjectCache::~AXObjectCache(){ HashMap<AXID, RefPtr<AccessibilityObject> >::iterator end = m_objects.end(); for (HashMap<AXID, RefPtr<AccessibilityObject> >::iterator it = m_objects.begin(); it != end; ++it) { AccessibilityObject* obj = (*it).second.get(); detachWrapper(obj); obj->detach(); removeAXID(obj); }}AccessibilityObject* AXObjectCache::get(RenderObject* renderer){ if (!renderer) return 0; AccessibilityObject* obj = 0; AXID axID = m_renderObjectMapping.get(renderer); ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); if (axID) obj = m_objects.get(axID).get(); return obj;}AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer){ if (!renderer) return 0; AccessibilityObject* obj = get(renderer); if (!obj) { Node* node = renderer->node(); RefPtr<AccessibilityObject> newObj = 0; if (renderer->isListBox()) newObj = AccessibilityListBox::create(renderer); else if (node && (node->hasTagName(ulTag) || node->hasTagName(olTag) || node->hasTagName(dlTag))) newObj = AccessibilityList::create(renderer); else if (renderer->isTable()) newObj = AccessibilityTable::create(renderer); else if (renderer->isTableRow()) newObj = AccessibilityTableRow::create(renderer); else if (renderer->isTableCell()) newObj = AccessibilityTableCell::create(renderer); else newObj = AccessibilityRenderObject::create(renderer); obj = newObj.get(); getAXID(obj); m_renderObjectMapping.set(renderer, obj->axObjectID()); m_objects.set(obj->axObjectID(), obj); attachWrapper(obj); } return obj;}AccessibilityObject* AXObjectCache::getOrCreate(AccessibilityRole role){ RefPtr<AccessibilityObject> obj = 0; // will be filled in... switch (role) { case ListBoxOptionRole: obj = AccessibilityListBoxOption::create(); break; case ImageMapLinkRole: obj = AccessibilityImageMapLink::create(); break; case ColumnRole: obj = AccessibilityTableColumn::create(); break; case TableHeaderContainerRole: obj = AccessibilityTableHeaderContainer::create(); break; default: obj = 0; } if (obj) getAXID(obj.get()); else return 0; m_objects.set(obj->axObjectID(), obj); attachWrapper(obj.get()); return obj.get();}void AXObjectCache::remove(AXID axID){ if (!axID) return; // first fetch object to operate some cleanup functions on it AccessibilityObject* obj = m_objects.get(axID).get(); if (!obj) return; detachWrapper(obj); obj->detach(); removeAXID(obj); // finally remove the object if (!m_objects.take(axID)) { return; } ASSERT(m_objects.size() >= m_idsInUse.size()); } void AXObjectCache::remove(RenderObject* renderer){ if (!renderer) return; AXID axID = m_renderObjectMapping.get(renderer); remove(axID); m_renderObjectMapping.remove(renderer);}AXID AXObjectCache::getAXID(AccessibilityObject* obj){ // check for already-assigned ID AXID objID = obj->axObjectID(); if (objID) { ASSERT(m_idsInUse.contains(objID)); return objID; } // generate a new ID static AXID lastUsedID = 0; objID = lastUsedID; do ++objID; while (objID == 0 || HashTraits<AXID>::isDeletedValue(objID) || m_idsInUse.contains(objID)); m_idsInUse.add(objID); lastUsedID = objID; obj->setAXObjectID(objID); return objID;}void AXObjectCache::removeAXID(AccessibilityObject* obj){ if (!obj) return; AXID objID = obj->axObjectID(); if (objID == 0) return; ASSERT(!HashTraits<AXID>::isDeletedValue(objID)); ASSERT(m_idsInUse.contains(objID)); obj->setAXObjectID(0); m_idsInUse.remove(objID);}void AXObjectCache::childrenChanged(RenderObject* renderer){ if (!renderer) return; AXID axID = m_renderObjectMapping.get(renderer); if (!axID) return; AccessibilityObject* obj = m_objects.get(axID).get(); if (obj) obj->childrenChanged();}#if HAVE(ACCESSIBILITY)void AXObjectCache::selectedChildrenChanged(RenderObject* renderer){ postNotificationToElement(renderer, "AXSelectedChildrenChanged");}#endif#if HAVE(ACCESSIBILITY)void AXObjectCache::handleActiveDescendantChanged(RenderObject* renderer){ if (!renderer) return; AccessibilityObject* obj = getOrCreate(renderer); if (obj) obj->handleActiveDescendantChanged();}void AXObjectCache::handleAriaRoleChanged(RenderObject* renderer){ if (!renderer) return; AccessibilityObject* obj = getOrCreate(renderer); if (obj && obj->isAccessibilityRenderObject()) static_cast<AccessibilityRenderObject*>(obj)->setAriaRole();}#endif} // namespace WebCore
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?