accessibilitylistbox.cpp
来自「linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自Web」· C++ 代码 · 共 178 行
CPP
178 行
/* * 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 "AccessibilityListBox.h"#include "AXObjectCache.h"#include "AccessibilityListBoxOption.h"#include "HitTestResult.h"#include "HTMLNames.h"#include "HTMLSelectElement.h"#include "RenderListBox.h"#include "RenderObject.h"using namespace std;namespace WebCore {using namespace HTMLNames;AccessibilityListBox::AccessibilityListBox(RenderObject* renderer) : AccessibilityRenderObject(renderer){}AccessibilityListBox::~AccessibilityListBox(){} PassRefPtr<AccessibilityListBox> AccessibilityListBox::create(RenderObject* renderer){ return adoptRef(new AccessibilityListBox(renderer));} bool AccessibilityListBox::canSetSelectedChildrenAttribute() const{ Node* selectNode = m_renderer->node(); if (!selectNode) return false; return !static_cast<HTMLSelectElement*>(selectNode)->disabled();}void AccessibilityListBox::addChildren(){ Node* selectNode = m_renderer->node(); if (!selectNode) return; m_haveChildren = true; const Vector<HTMLElement*>& listItems = static_cast<HTMLSelectElement*>(selectNode)->listItems(); unsigned length = listItems.size(); for (unsigned i = 0; i < length; i++) { AccessibilityObject* listOption = listBoxOptionAccessibilityObject(listItems[i]); if (listOption) m_children.append(listOption); }}void AccessibilityListBox::setSelectedChildren(AccessibilityChildrenVector& children){ if (!canSetSelectedChildrenAttribute()) return; Node* selectNode = m_renderer->node(); if (!selectNode) return; // disable any selected options unsigned length = m_children.size(); for (unsigned i = 0; i < length; i++) { AccessibilityListBoxOption* listBoxOption = static_cast<AccessibilityListBoxOption*>(m_children[i].get()); if (listBoxOption->isSelected()) listBoxOption->setSelected(false); } length = children.size(); for (unsigned i = 0; i < length; i++) { AccessibilityObject* obj = children[i].get(); if (obj->roleValue() != ListBoxOptionRole) continue; static_cast<AccessibilityListBoxOption*>(obj)->setSelected(true); }} void AccessibilityListBox::selectedChildren(AccessibilityChildrenVector& result){ ASSERT(result.isEmpty()); if (!hasChildren()) addChildren(); unsigned length = m_children.size(); for (unsigned i = 0; i < length; i++) { if (static_cast<AccessibilityListBoxOption*>(m_children[i].get())->isSelected()) result.append(m_children[i]); } }void AccessibilityListBox::visibleChildren(AccessibilityChildrenVector& result){ ASSERT(result.isEmpty()); if (!hasChildren()) addChildren(); unsigned length = m_children.size(); for (unsigned i = 0; i < length; i++) { if (static_cast<RenderListBox*>(m_renderer)->listIndexIsVisible(i)) result.append(m_children[i]); }}AccessibilityObject* AccessibilityListBox::listBoxOptionAccessibilityObject(HTMLElement* element) const{ // skip hr elements if (!element || element->hasTagName(hrTag)) return 0; AccessibilityObject* listBoxObject = m_renderer->document()->axObjectCache()->getOrCreate(ListBoxOptionRole); static_cast<AccessibilityListBoxOption*>(listBoxObject)->setHTMLElement(element); return listBoxObject;}AccessibilityObject* AccessibilityListBox::doAccessibilityHitTest(const IntPoint& point) const{ // the internal HTMLSelectElement methods for returning a listbox option at a point // ignore optgroup elements. if (!m_renderer) return 0; Node* node = m_renderer->node(); if (!node) return 0; IntRect parentRect = boundingBoxRect(); const Vector<HTMLElement*>& listItems = static_cast<HTMLSelectElement*>(node)->listItems(); unsigned length = listItems.size(); for (unsigned i = 0; i < length; i++) { IntRect rect = static_cast<RenderListBox*>(m_renderer)->itemBoundingBoxRect(parentRect.x(), parentRect.y(), i); if (rect.contains(point)) return listBoxOptionAccessibilityObject(listItems[i]); } return axObjectCache()->getOrCreate(m_renderer);}} // namespace WebCore
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?