Merge the latest green changeset on mozilla-inbound to mozilla-central

This commit is contained in:
Ehsan Akhgari 2011-08-10 09:56:20 -04:00
Родитель 04c60355e5 6812d0570d
Коммит 11b86bca00
428 изменённых файлов: 4827 добавлений и 2208 удалений

Просмотреть файл

@ -82,7 +82,6 @@ EXPORTS = \
nsHyperTextAccessibleWrap.h \
nsHTMLImageAccessibleWrap.h \
nsHTMLTableAccessibleWrap.h \
nsAccessibleRelationWrap.h \
$(NULL)
# we want to force the creation of a static lib.

Просмотреть файл

@ -1,48 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Alexander Surkov <surkov.alexander@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef _NS_ACCESSIBLE_RELATION_WRAP_H
#define _NS_ACCESSIBLE_RELATION_WRAP_H
#include "nsAccessibleRelation.h"
typedef class nsAccessibleRelation nsAccessibleRelationWrap;
#endif

Просмотреть файл

@ -38,10 +38,12 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsAccessible.h"
#include "nsAccessibleWrap.h"
#include "nsAccUtils.h"
#include "nsApplicationAccessibleWrap.h"
#include "nsIAccessibleRelation.h"
#include "nsRootAccessible.h"
#include "nsDocAccessibleWrap.h"
#include "nsIAccessibleValue.h"
@ -49,8 +51,8 @@
#include "nsAutoPtr.h"
#include "prprf.h"
#include "nsRoleMap.h"
#include "nsRelUtils.h"
#include "nsStateMap.h"
#include "Relation.h"
#include "States.h"
#include "nsMaiInterfaceComponent.h"
@ -941,60 +943,45 @@ refStateSetCB(AtkObject *aAtkObj)
AtkRelationSet *
refRelationSetCB(AtkObject *aAtkObj)
{
AtkRelationSet *relation_set = nsnull;
relation_set = ATK_OBJECT_CLASS(parent_class)->ref_relation_set(aAtkObj);
nsAccessibleWrap *accWrap = GetAccessibleWrap(aAtkObj);
if (!accWrap) {
return relation_set;
}
AtkRelation* relation;
PRUint32 relationType[] = {nsIAccessibleRelation::RELATION_LABELLED_BY,
nsIAccessibleRelation::RELATION_LABEL_FOR,
nsIAccessibleRelation::RELATION_NODE_CHILD_OF,
nsIAccessibleRelation::RELATION_CONTROLLED_BY,
nsIAccessibleRelation::RELATION_CONTROLLER_FOR,
nsIAccessibleRelation::RELATION_EMBEDS,
nsIAccessibleRelation::RELATION_FLOWS_TO,
nsIAccessibleRelation::RELATION_FLOWS_FROM,
nsIAccessibleRelation::RELATION_DESCRIBED_BY,
nsIAccessibleRelation::RELATION_DESCRIPTION_FOR,
};
for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(relationType); i++) {
relation = atk_relation_set_get_relation_by_type(relation_set, static_cast<AtkRelationType>(relationType[i]));
if (relation) {
atk_relation_set_remove(relation_set, relation);
}
nsCOMPtr<nsIAccessibleRelation> geckoRelation;
nsresult rv = accWrap->GetRelationByType(relationType[i],
getter_AddRefs(geckoRelation));
if (NS_SUCCEEDED(rv) && geckoRelation) {
PRUint32 targetsCount = 0;
geckoRelation->GetTargetsCount(&targetsCount);
if (targetsCount) {
AtkObject** accessible_array = new AtkObject*[targetsCount];
for (PRUint32 index = 0; index < targetsCount; index++) {
nsCOMPtr<nsIAccessible> geckoTarget;
geckoRelation->GetTarget(index, getter_AddRefs(geckoTarget));
accessible_array[index] =
nsAccessibleWrap::GetAtkObject(geckoTarget);
}
relation = atk_relation_new(accessible_array, targetsCount,
static_cast<AtkRelationType>(relationType[i]));
atk_relation_set_add(relation_set, relation);
g_object_unref(relation);
delete [] accessible_array;
}
}
}
AtkRelationSet* relation_set =
ATK_OBJECT_CLASS(parent_class)->ref_relation_set(aAtkObj);
nsAccessibleWrap *accWrap = GetAccessibleWrap(aAtkObj);
if (!accWrap)
return relation_set;
PRUint32 relationTypes[] = {
nsIAccessibleRelation::RELATION_LABELLED_BY,
nsIAccessibleRelation::RELATION_LABEL_FOR,
nsIAccessibleRelation::RELATION_NODE_CHILD_OF,
nsIAccessibleRelation::RELATION_CONTROLLED_BY,
nsIAccessibleRelation::RELATION_CONTROLLER_FOR,
nsIAccessibleRelation::RELATION_EMBEDS,
nsIAccessibleRelation::RELATION_FLOWS_TO,
nsIAccessibleRelation::RELATION_FLOWS_FROM,
nsIAccessibleRelation::RELATION_DESCRIBED_BY,
nsIAccessibleRelation::RELATION_DESCRIPTION_FOR,
};
for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(relationTypes); i++) {
AtkRelationType atkType = static_cast<AtkRelationType>(relationTypes[i]);
AtkRelation* atkRelation =
atk_relation_set_get_relation_by_type(relation_set, atkType);
if (atkRelation)
atk_relation_set_remove(relation_set, atkRelation);
Relation rel(accWrap->RelationByType(relationTypes[i]));
nsTArray<AtkObject*> targets;
nsAccessible* tempAcc = nsnull;
while ((tempAcc = rel.Next()))
targets.AppendElement(nsAccessibleWrap::GetAtkObject(tempAcc));
atkRelation = atk_relation_new(targets.Elements(), targets.Length(), atkType);
atk_relation_set_add(relation_set, atkRelation);
g_object_unref(atkRelation);
}
return relation_set;
}
// Check if aAtkObj is a valid MaiAtkObject, and return the nsAccessibleWrap

Просмотреть файл

@ -40,6 +40,8 @@
#include "nsAccessibilityService.h"
#include "nsAccessible.h"
#include "mozilla/dom/Element.h"
////////////////////////////////////////////////////////////////////////////////
// AccIterator
////////////////////////////////////////////////////////////////////////////////
@ -62,7 +64,7 @@ AccIterator::~AccIterator()
}
nsAccessible*
AccIterator::GetNext()
AccIterator::Next()
{
while (mState) {
nsAccessible *child = mState->mParent->GetChildAt(mState->mIndex++);
@ -255,3 +257,93 @@ XULDescriptionIterator::Next()
return nsnull;
}
////////////////////////////////////////////////////////////////////////////////
// IDRefsIterator
////////////////////////////////////////////////////////////////////////////////
IDRefsIterator::IDRefsIterator(nsIContent* aContent, nsIAtom* aIDRefsAttr) :
mCurrIdx(0)
{
if (!aContent->IsInDoc() ||
!aContent->GetAttr(kNameSpaceID_None, aIDRefsAttr, mIDs))
return;
if (aContent->IsInAnonymousSubtree()) {
mXBLDocument = do_QueryInterface(aContent->GetOwnerDoc());
mBindingParent = do_QueryInterface(aContent->GetBindingParent());
} else {
mDocument = aContent->GetOwnerDoc();
}
}
const nsDependentSubstring
IDRefsIterator::NextID()
{
for (; mCurrIdx < mIDs.Length(); mCurrIdx++) {
if (!NS_IsAsciiWhitespace(mIDs[mCurrIdx]))
break;
}
if (mCurrIdx >= mIDs.Length())
return nsDependentSubstring();
nsAString::index_type idStartIdx = mCurrIdx;
while (++mCurrIdx < mIDs.Length()) {
if (NS_IsAsciiWhitespace(mIDs[mCurrIdx]))
break;
}
return Substring(mIDs, idStartIdx, mCurrIdx++ - idStartIdx);
}
nsIContent*
IDRefsIterator::NextElem()
{
while (true) {
const nsDependentSubstring id = NextID();
if (id.IsEmpty())
break;
nsIContent* refContent = GetElem(id);
if (refContent)
return refContent;
}
return nsnull;
}
nsIContent*
IDRefsIterator::GetElem(const nsDependentSubstring& aID)
{
if (mXBLDocument) {
// If content is anonymous subtree then use "anonid" attribute to get
// elements, otherwise search elements in DOM by ID attribute.
nsCOMPtr<nsIDOMElement> refElm;
mXBLDocument->GetAnonymousElementByAttribute(mBindingParent,
NS_LITERAL_STRING("anonid"),
aID,
getter_AddRefs(refElm));
nsCOMPtr<nsIContent> refContent = do_QueryInterface(refElm);
return refContent;
}
return mDocument->GetElementById(aID);
}
nsAccessible*
IDRefsIterator::Next()
{
nsIContent* nextElm = NextElem();
return nextElm ? GetAccService()->GetAccessible(nextElm) : nsnull;
}
nsAccessible*
SingleAccIterator::Next()
{
nsRefPtr<nsAccessible> nextAcc;
mAcc.swap(nextAcc);
return (nextAcc && !nextAcc->IsDefunct()) ? nextAcc : nsnull;
}

Просмотреть файл

@ -1,3 +1,5 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -38,15 +40,32 @@
#ifndef nsAccIterator_h_
#define nsAccIterator_h_
#include "nsAccessibilityService.h"
#include "filters.h"
#include "nscore.h"
#include "nsDocAccessible.h"
#include "nsIDOMDocumentXBL.h"
/**
* AccIterable is a basic interface for iterators over accessibles.
*/
class AccIterable
{
public:
virtual ~AccIterable() { }
virtual nsAccessible* Next() = 0;
private:
friend class Relation;
nsAutoPtr<AccIterable> mNextIter;
};
/**
* Allows to iterate through accessible children or subtree complying with
* filter function.
*/
class AccIterator
class AccIterator : public AccIterable
{
public:
/**
@ -67,13 +86,13 @@ public:
AccIterator(nsAccessible* aRoot, filters::FilterFuncPtr aFilterFunc,
IterationType aIterationType = eFlatNav);
~AccIterator();
virtual ~AccIterator();
/**
* Return next accessible complying with filter function. Return the first
* accessible for the first time.
*/
nsAccessible *GetNext();
virtual nsAccessible *Next();
private:
AccIterator();
@ -99,7 +118,7 @@ private:
* Allows to traverse through related accessibles that are pointing to the given
* dependent accessible by relation attribute.
*/
class RelatedAccIterator
class RelatedAccIterator : public AccIterable
{
public:
/**
@ -115,10 +134,12 @@ public:
RelatedAccIterator(nsDocAccessible* aDocument, nsIContent* aDependentContent,
nsIAtom* aRelAttr);
virtual ~RelatedAccIterator() { }
/**
* Return next related accessible for the given dependent accessible.
*/
nsAccessible* Next();
virtual nsAccessible* Next();
private:
RelatedAccIterator();
@ -136,7 +157,7 @@ private:
/**
* Used to iterate through HTML labels associated with the given element.
*/
class HTMLLabelIterator
class HTMLLabelIterator : public AccIterable
{
public:
enum LabelFilter {
@ -147,10 +168,12 @@ public:
HTMLLabelIterator(nsDocAccessible* aDocument, nsIContent* aElement,
LabelFilter aFilter = eAllLabels);
virtual ~HTMLLabelIterator() { }
/**
* Return next label accessible associated with the given element.
*/
nsAccessible* Next();
virtual nsAccessible* Next();
private:
HTMLLabelIterator();
@ -166,15 +189,16 @@ private:
/**
* Used to iterate through HTML outputs associated with the given element.
*/
class HTMLOutputIterator
class HTMLOutputIterator : public AccIterable
{
public:
HTMLOutputIterator(nsDocAccessible* aDocument, nsIContent* aElement);
virtual ~HTMLOutputIterator() { }
/**
* Return next output accessible associated with the given element.
*/
nsAccessible* Next();
virtual nsAccessible* Next();
private:
HTMLOutputIterator();
@ -188,15 +212,16 @@ private:
/**
* Used to iterate through XUL labels associated with the given element.
*/
class XULLabelIterator
class XULLabelIterator : public AccIterable
{
public:
XULLabelIterator(nsDocAccessible* aDocument, nsIContent* aElement);
virtual ~XULLabelIterator() { }
/**
* Return next label accessible associated with the given element.
*/
nsAccessible* Next();
virtual nsAccessible* Next();
private:
XULLabelIterator();
@ -210,15 +235,16 @@ private:
/**
* Used to iterate through XUL descriptions associated with the given element.
*/
class XULDescriptionIterator
class XULDescriptionIterator : public AccIterable
{
public:
XULDescriptionIterator(nsDocAccessible* aDocument, nsIContent* aElement);
virtual ~XULDescriptionIterator() { }
/**
* Return next description accessible associated with the given element.
*/
nsAccessible* Next();
virtual nsAccessible* Next();
private:
XULDescriptionIterator();
@ -228,4 +254,66 @@ private:
RelatedAccIterator mRelIter;
};
/**
* Used to iterate through IDs, elements or accessibles pointed by IDRefs
* attribute. Note, any method used to iterate through IDs, elements, or
* accessibles moves iterator to next position.
*/
class IDRefsIterator : public AccIterable
{
public:
IDRefsIterator(nsIContent* aContent, nsIAtom* aIDRefsAttr);
virtual ~IDRefsIterator() { }
/**
* Return next ID.
*/
const nsDependentSubstring NextID();
/**
* Return next element.
*/
nsIContent* NextElem();
/**
* Return the element with the given ID.
*/
nsIContent* GetElem(const nsDependentSubstring& aID);
// AccIterable
virtual nsAccessible* Next();
private:
IDRefsIterator();
IDRefsIterator(const IDRefsIterator&);
IDRefsIterator operator = (const IDRefsIterator&);
nsString mIDs;
nsAString::index_type mCurrIdx;
nsIDocument* mDocument;
nsCOMPtr<nsIDOMDocumentXBL> mXBLDocument;
nsCOMPtr<nsIDOMElement> mBindingParent;
};
/**
* Iterator that points to a single accessible returning it on the first call
* to Next().
*/
class SingleAccIterator : public AccIterable
{
public:
SingleAccIterator(nsAccessible* aTarget): mAcc(aTarget) { }
virtual ~SingleAccIterator() { }
virtual nsAccessible* Next();
private:
SingleAccIterator();
SingleAccIterator(const SingleAccIterator&);
SingleAccIterator& operator = (const SingleAccIterator&);
nsRefPtr<nsAccessible> mAcc;
};
#endif

Просмотреть файл

@ -63,10 +63,8 @@ CPPSRCS = \
nsAccessibilityAtoms.cpp \
nsCoreUtils.cpp \
nsAccUtils.cpp \
nsRelUtils.cpp \
nsAccessibilityService.cpp \
nsAccessible.cpp \
nsAccessibleRelation.cpp \
nsAccTreeWalker.cpp \
nsBaseWidgetAccessible.cpp \
nsEventShell.cpp \

Просмотреть файл

@ -0,0 +1,154 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Trevor Saunders <trev.saunders@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef RELATION_H_
#define RELATION_H_
#include "AccIterator.h"
/**
* This class is used to return Relation objects from functions. A copy
* constructor doesn't work here because we need to mutate the old relation to
* have its nsAutoPtr forget what it points to.
*/
struct RelationCopyHelper
{
RelationCopyHelper(AccIterable* aFirstIter, AccIterable* aLastIter) :
mFirstIter(aFirstIter), mLastIter(aLastIter) { }
AccIterable* mFirstIter;
AccIterable* mLastIter;
};
/**
* A collection of relation targets of a certain type. Targets are computed
* lazily while enumerating.
*/
class Relation
{
public:
Relation() : mFirstIter(nsnull), mLastIter(nsnull) { }
Relation(const RelationCopyHelper aRelation) :
mFirstIter(aRelation.mFirstIter), mLastIter(aRelation.mLastIter) { }
Relation(AccIterable* aIter) : mFirstIter(aIter), mLastIter(aIter) { }
Relation(nsAccessible* aAcc) :
mFirstIter(nsnull), mLastIter(nsnull)
{ AppendTarget(aAcc); }
Relation(nsIContent* aContent) :
mFirstIter(nsnull), mLastIter(nsnull)
{ AppendTarget(aContent); }
Relation& operator = (const RelationCopyHelper& aRH)
{
mFirstIter = aRH.mFirstIter;
mLastIter = aRH.mLastIter;
return *this;
}
Relation& operator = (Relation& aRelation)
{
mFirstIter = aRelation.mFirstIter;
mLastIter = aRelation.mLastIter;
return *this;
}
operator RelationCopyHelper()
{
return RelationCopyHelper(mFirstIter.forget(), mLastIter);
}
inline void AppendIter(AccIterable* aIter)
{
if (mLastIter)
mLastIter->mNextIter = aIter;
else
mFirstIter = aIter;
mLastIter = aIter;
}
/**
* Append the given accessible to the set of related accessibles.
*/
inline void AppendTarget(nsAccessible* aAcc)
{
if (aAcc)
AppendIter(new SingleAccIterator(aAcc));
}
/**
* Append the one accessible for this content node to the set of related
* accessibles.
*/
inline void AppendTarget(nsIContent* aContent)
{
if (aContent)
AppendTarget(GetAccService()->GetAccessible(aContent));
}
/**
* compute and return the next related accessible.
*/
inline nsAccessible* Next()
{
nsAccessible* target = nsnull;
// a trick nsAutoPtr deletes what it used to point to when assigned to
while (mFirstIter && !(target = mFirstIter->Next()))
mFirstIter = mFirstIter->mNextIter;
if (!mFirstIter)
mLastIter = nsnull;
return target;
}
private:
Relation& operator = (const Relation&);
nsAutoPtr<AccIterable> mFirstIter;
AccIterable* mLastIter;
};
#endif

Просмотреть файл

@ -106,14 +106,14 @@ nsARIAGridAccessible::GetColumnCount(PRInt32 *acolumnCount)
return NS_ERROR_FAILURE;
AccIterator rowIter(this, filters::GetRow);
nsAccessible* row = rowIter.GetNext();
nsAccessible* row = rowIter.Next();
if (!row)
return NS_OK;
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
while ((cell = cellIter.GetNext()))
while ((cell = cellIter.Next()))
(*acolumnCount)++;
return NS_OK;
@ -129,7 +129,7 @@ nsARIAGridAccessible::GetRowCount(PRInt32 *arowCount)
return NS_ERROR_FAILURE;
AccIterator rowIter(this, filters::GetRow);
while (rowIter.GetNext())
while (rowIter.Next())
(*arowCount)++;
return NS_OK;
@ -327,7 +327,7 @@ nsARIAGridAccessible::IsColumnSelected(PRInt32 aColumn, PRBool *aIsSelected)
NS_ENSURE_ARG(IsValidColumn(aColumn));
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = rowIter.GetNext();
nsAccessible *row = rowIter.Next();
if (!row)
return NS_OK;
@ -340,7 +340,7 @@ nsARIAGridAccessible::IsColumnSelected(PRInt32 aColumn, PRBool *aIsSelected)
if (!nsAccUtils::IsARIASelected(cell))
return NS_OK;
}
} while ((row = rowIter.GetNext()));
} while ((row = rowIter.Next()));
*aIsSelected = PR_TRUE;
return NS_OK;
@ -361,7 +361,7 @@ nsARIAGridAccessible::IsRowSelected(PRInt32 aRow, PRBool *aIsSelected)
if (!nsAccUtils::IsARIASelected(row)) {
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
while ((cell = cellIter.GetNext())) {
while ((cell = cellIter.Next())) {
if (!nsAccUtils::IsARIASelected(cell))
return NS_OK;
}
@ -411,7 +411,7 @@ nsARIAGridAccessible::GetSelectedCellCount(PRUint32* aCount)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
while ((row = rowIter.GetNext())) {
while ((row = rowIter.Next())) {
if (nsAccUtils::IsARIASelected(row)) {
(*aCount) += colCount;
continue;
@ -420,7 +420,7 @@ nsARIAGridAccessible::GetSelectedCellCount(PRUint32* aCount)
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
while ((cell = cellIter.GetNext())) {
while ((cell = cellIter.Next())) {
if (nsAccUtils::IsARIASelected(cell))
(*aCount)++;
}
@ -447,14 +447,14 @@ nsARIAGridAccessible::GetSelectedRowCount(PRUint32* aCount)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
while ((row = rowIter.GetNext())) {
while ((row = rowIter.Next())) {
if (nsAccUtils::IsARIASelected(row)) {
(*aCount)++;
continue;
}
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = cellIter.GetNext();
nsAccessible *cell = cellIter.Next();
if (!cell)
continue;
@ -464,7 +464,7 @@ nsARIAGridAccessible::GetSelectedRowCount(PRUint32* aCount)
isRowSelected = PR_FALSE;
break;
}
} while ((cell = cellIter.GetNext()));
} while ((cell = cellIter.Next()));
if (isRowSelected)
(*aCount)++;
@ -490,18 +490,18 @@ nsARIAGridAccessible::GetSelectedCells(nsIArray **aCells)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
while ((row = rowIter.GetNext())) {
while ((row = rowIter.Next())) {
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
if (nsAccUtils::IsARIASelected(row)) {
while ((cell = cellIter.GetNext()))
while ((cell = cellIter.Next()))
selCells->AppendElement(static_cast<nsIAccessible *>(cell), PR_FALSE);
continue;
}
while ((cell = cellIter.GetNext())) {
while ((cell = cellIter.Next())) {
if (nsAccUtils::IsARIASelected(cell))
selCells->AppendElement(static_cast<nsIAccessible *>(cell), PR_FALSE);
}
@ -534,7 +534,7 @@ nsARIAGridAccessible::GetSelectedCellIndices(PRUint32 *aCellsCount,
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
for (PRInt32 rowIdx = 0; (row = rowIter.GetNext()); rowIdx++) {
for (PRInt32 rowIdx = 0; (row = rowIter.Next()); rowIdx++) {
if (nsAccUtils::IsARIASelected(row)) {
for (PRInt32 colIdx = 0; colIdx < colCount; colIdx++)
selCells.AppendElement(rowIdx * colCount + colIdx);
@ -545,7 +545,7 @@ nsARIAGridAccessible::GetSelectedCellIndices(PRUint32 *aCellsCount,
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
for (PRInt32 colIdx = 0; (cell = cellIter.GetNext()); colIdx++) {
for (PRInt32 colIdx = 0; (cell = cellIter.Next()); colIdx++) {
if (nsAccUtils::IsARIASelected(cell))
selCells.AppendElement(rowIdx * colCount + colIdx);
}
@ -594,14 +594,14 @@ nsARIAGridAccessible::GetSelectedRowIndices(PRUint32 *arowCount,
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
for (PRInt32 rowIdx = 0; (row = rowIter.GetNext()); rowIdx++) {
for (PRInt32 rowIdx = 0; (row = rowIter.Next()); rowIdx++) {
if (nsAccUtils::IsARIASelected(row)) {
selRows.AppendElement(rowIdx);
continue;
}
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = cellIter.GetNext();
nsAccessible *cell = cellIter.Next();
if (!cell)
continue;
@ -611,7 +611,7 @@ nsARIAGridAccessible::GetSelectedRowIndices(PRUint32 *arowCount,
isRowSelected = PR_FALSE;
break;
}
} while ((cell = cellIter.GetNext()));
} while ((cell = cellIter.Next()));
if (isRowSelected)
selRows.AppendElement(rowIdx);
@ -640,7 +640,7 @@ nsARIAGridAccessible::SelectRow(PRInt32 aRow)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
for (PRInt32 rowIdx = 0; (row = rowIter.GetNext()); rowIdx++) {
for (PRInt32 rowIdx = 0; (row = rowIter.Next()); rowIdx++) {
nsresult rv = SetARIASelected(row, rowIdx == aRow);
NS_ENSURE_SUCCESS(rv, rv);
}
@ -659,7 +659,7 @@ nsARIAGridAccessible::SelectColumn(PRInt32 aColumn)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
while ((row = rowIter.GetNext())) {
while ((row = rowIter.Next())) {
// Unselect all cells in the row.
nsresult rv = SetARIASelected(row, PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
@ -698,7 +698,7 @@ nsARIAGridAccessible::UnselectColumn(PRInt32 aColumn)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = nsnull;
while ((row = rowIter.GetNext())) {
while ((row = rowIter.Next())) {
nsAccessible *cell = GetCellInRowAt(row, aColumn);
if (cell) {
nsresult rv = SetARIASelected(cell, PR_FALSE);
@ -766,8 +766,8 @@ nsARIAGridAccessible::GetRowAt(PRInt32 aRow)
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = rowIter.GetNext();
while (rowIdx != 0 && (row = rowIter.GetNext()))
nsAccessible *row = rowIter.Next();
while (rowIdx != 0 && (row = rowIter.Next()))
rowIdx--;
return row;
@ -779,8 +779,8 @@ nsARIAGridAccessible::GetCellInRowAt(nsAccessible *aRow, PRInt32 aColumn)
PRInt32 colIdx = aColumn;
AccIterator cellIter(aRow, filters::GetCell);
nsAccessible *cell = cellIter.GetNext();
while (colIdx != 0 && (cell = cellIter.GetNext()))
nsAccessible *cell = cellIter.Next();
while (colIdx != 0 && (cell = cellIter.Next()))
colIdx--;
return cell;
@ -821,7 +821,7 @@ nsARIAGridAccessible::SetARIASelected(nsAccessible *aAccessible,
AccIterator cellIter(aAccessible, filters::GetCell);
nsAccessible *cell = nsnull;
while ((cell = cellIter.GetNext())) {
while ((cell = cellIter.Next())) {
rv = SetARIASelected(cell, PR_FALSE, PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
}
@ -843,7 +843,7 @@ nsARIAGridAccessible::SetARIASelected(nsAccessible *aAccessible,
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
while ((cell = cellIter.GetNext())) {
while ((cell = cellIter.Next())) {
if (cell != aAccessible) {
rv = SetARIASelected(cell, PR_TRUE, PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
@ -868,7 +868,7 @@ nsARIAGridAccessible::GetSelectedColumnsArray(PRUint32 *acolumnCount,
return NS_ERROR_FAILURE;
AccIterator rowIter(this, filters::GetRow);
nsAccessible *row = rowIter.GetNext();
nsAccessible *row = rowIter.Next();
if (!row)
return NS_OK;
@ -892,14 +892,14 @@ nsARIAGridAccessible::GetSelectedColumnsArray(PRUint32 *acolumnCount,
AccIterator cellIter(row, filters::GetCell);
nsAccessible *cell = nsnull;
for (colIdx = 0; (cell = cellIter.GetNext()); colIdx++) {
for (colIdx = 0; (cell = cellIter.Next()); colIdx++) {
if (isColSelArray.SafeElementAt(colIdx, PR_FALSE) &&
!nsAccUtils::IsARIASelected(cell)) {
isColSelArray[colIdx] = PR_FALSE;
selColCount--;
}
}
} while ((row = rowIter.GetNext()));
} while ((row = rowIter.Next()));
if (!selColCount)
return NS_OK;

Просмотреть файл

@ -48,10 +48,12 @@
#include "nsEventShell.h"
#include "nsAccEvent.h"
#include "nsAccessibleRelation.h"
#include "nsAccessibilityService.h"
#include "nsAccTreeWalker.h"
#include "nsRelUtils.h"
#include "nsIAccessibleRelation.h"
#include "nsTextEquivUtils.h"
#include "Relation.h"
#include "States.h"
#include "nsIDOMElement.h"
@ -1528,13 +1530,11 @@ nsAccessible::State()
state |= states::SELECTED;
} else {
// If focus is in a child of the tab panel surely the tab is selected!
nsCOMPtr<nsIAccessible> tabPanel = nsRelUtils::
GetRelatedAccessible(this, nsIAccessibleRelation::RELATION_LABEL_FOR);
if (nsAccUtils::Role(tabPanel) == nsIAccessibleRole::ROLE_PROPERTYPAGE) {
nsRefPtr<nsAccessible> tabPanelAcc(do_QueryObject(tabPanel));
nsINode *tabPanelNode = tabPanelAcc->GetNode();
if (nsCoreUtils::IsAncestorOf(tabPanelNode, gLastFocusedNode))
Relation rel = RelationByType(nsIAccessibleRelation::RELATION_LABEL_FOR);
nsAccessible* relTarget = nsnull;
while ((relTarget = rel.Next())) {
if (relTarget->Role() == nsIAccessibleRole::ROLE_PROPERTYPAGE &&
nsCoreUtils::IsAncestorOf(relTarget->GetNode(), gLastFocusedNode))
state |= states::SELECTED;
}
}
@ -1830,11 +1830,11 @@ nsAccessible::ARIARoleInternal()
if (mParent && mParent->Role() == nsIAccessibleRole::ROLE_COMBOBOX) {
return nsIAccessibleRole::ROLE_COMBOBOX_LIST;
nsCOMPtr<nsIAccessible> possibleCombo =
nsRelUtils::GetRelatedAccessible(this,
nsIAccessibleRelation::RELATION_NODE_CHILD_OF);
if (nsAccUtils::Role(possibleCombo) == nsIAccessibleRole::ROLE_COMBOBOX)
return nsIAccessibleRole::ROLE_COMBOBOX_LIST;
Relation rel = RelationByType(nsIAccessibleRelation::RELATION_NODE_CHILD_OF);
nsAccessible* targetAcc = nsnull;
while ((targetAcc = rel.Next()))
if (targetAcc->Role() == nsIAccessibleRole::ROLE_COMBOBOX)
return nsIAccessibleRole::ROLE_COMBOBOX_LIST;
}
} else if (mRoleMapEntry->role == nsIAccessibleRole::ROLE_OPTION) {
@ -1998,155 +1998,95 @@ NS_IMETHODIMP nsAccessible::GetAccessibleBelow(nsIAccessible **_retval)
return NS_ERROR_NOT_IMPLEMENTED;
}
nsIDOMNode* nsAccessible::GetAtomicRegion()
nsIContent*
nsAccessible::GetAtomicRegion() const
{
nsIContent *loopContent = mContent;
nsAutoString atomic;
while (loopContent && !loopContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_atomic, atomic)) {
while (loopContent && !loopContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_atomic, atomic))
loopContent = loopContent->GetParent();
}
nsCOMPtr<nsIDOMNode> atomicRegion;
if (atomic.EqualsLiteral("true")) {
atomicRegion = do_QueryInterface(loopContent);
}
return atomicRegion;
return atomic.EqualsLiteral("true") ? loopContent : nsnull;
}
// nsIAccessible getRelationByType()
NS_IMETHODIMP
nsAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
nsAccessible::GetRelationByType(PRUint32 aType,
nsIAccessibleRelation** aRelation)
{
NS_ENSURE_ARG_POINTER(aRelation);
*aRelation = nsnull;
if (IsDefunct())
return NS_ERROR_FAILURE;
Relation rel = RelationByType(aType);
NS_ADDREF(*aRelation = new nsAccessibleRelation(aType, &rel));
return *aRelation ? NS_OK : NS_ERROR_FAILURE;
}
Relation
nsAccessible::RelationByType(PRUint32 aType)
{
// Relationships are defined on the same content node that the role would be
// defined on.
nsresult rv = NS_OK_NO_RELATION_TARGET;
switch (aRelationType)
{
case nsIAccessibleRelation::RELATION_LABEL_FOR:
{
RelatedAccIterator iter(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_labelledby);
switch (aType) {
case nsIAccessibleRelation::RELATION_LABEL_FOR: {
Relation rel(new RelatedAccIterator(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_labelledby));
if (mContent->Tag() == nsAccessibilityAtoms::label)
rel.AppendIter(new IDRefsIterator(mContent, mContent->IsHTML() ?
nsAccessibilityAtoms::_for :
nsAccessibilityAtoms::control));
nsAccessible* related = nsnull;
while ((related = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, related);
NS_ENSURE_SUCCESS(rv, rv);
}
if (mContent->Tag() == nsAccessibilityAtoms::label) {
nsIAtom *IDAttr = mContent->IsHTML() ?
nsAccessibilityAtoms::_for : nsAccessibilityAtoms::control;
rv = nsRelUtils::
AddTargetFromIDRefAttr(aRelationType, aRelation, mContent, IDAttr);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
return rel;
}
case nsIAccessibleRelation::RELATION_LABELLED_BY:
{
rv = nsRelUtils::
AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent,
nsAccessibilityAtoms::aria_labelledby);
NS_ENSURE_SUCCESS(rv, rv);
nsAccessible* label = nsnull;
case nsIAccessibleRelation::RELATION_LABELLED_BY: {
Relation rel(new IDRefsIterator(mContent,
nsAccessibilityAtoms::aria_labelledby));
if (mContent->IsHTML()) {
HTMLLabelIterator iter(GetDocAccessible(), mContent);
while ((label = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, label);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
rel.AppendIter(new HTMLLabelIterator(GetDocAccessible(), mContent));
} else if (mContent->IsXUL()) {
rel.AppendIter(new XULLabelIterator(GetDocAccessible(), mContent));
}
if (mContent->IsXUL()) {
XULLabelIterator iter(GetDocAccessible(), mContent);
while ((label = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, label);
NS_ENSURE_SUCCESS(rv, rv);
}
}
return rv;
return rel;
}
case nsIAccessibleRelation::RELATION_DESCRIBED_BY: {
Relation rel(new IDRefsIterator(mContent,
nsAccessibilityAtoms::aria_describedby));
if (mContent->IsXUL())
rel.AppendIter(new XULDescriptionIterator(GetDocAccessible(), mContent));
case nsIAccessibleRelation::RELATION_DESCRIBED_BY:
{
rv = nsRelUtils::
AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent,
nsAccessibilityAtoms::aria_describedby);
NS_ENSURE_SUCCESS(rv, rv);
if (mContent->IsXUL()) {
XULDescriptionIterator iter(GetDocAccessible(), mContent);
nsAccessible* descr = nsnull;
while ((descr = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, descr);
NS_ENSURE_SUCCESS(rv, rv);
}
}
return rv;
return rel;
}
case nsIAccessibleRelation::RELATION_DESCRIPTION_FOR: {
Relation rel(new RelatedAccIterator(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_describedby));
case nsIAccessibleRelation::RELATION_DESCRIPTION_FOR:
{
RelatedAccIterator iter(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_describedby);
nsAccessible* related = nsnull;
while ((related = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, related);
NS_ENSURE_SUCCESS(rv, rv);
}
// This affectively adds an optional control attribute to xul:description,
// which only affects accessibility, by allowing the description to be
// tied to a control.
if (mContent->Tag() == nsAccessibilityAtoms::description &&
mContent->IsXUL()) {
// This affectively adds an optional control attribute to xul:description,
// which only affects accessibility, by allowing the description to be
// tied to a control.
return nsRelUtils::
AddTargetFromIDRefAttr(aRelationType, aRelation, mContent,
nsAccessibilityAtoms::control);
}
mContent->IsXUL())
rel.AppendIter(new IDRefsIterator(mContent,
nsAccessibilityAtoms::control));
return rv;
return rel;
}
case nsIAccessibleRelation::RELATION_NODE_CHILD_OF:
{
RelatedAccIterator iter(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_owns);
nsAccessible* related = nsnull;
while ((related = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, related);
NS_ENSURE_SUCCESS(rv, rv);
}
// Got relation from aria-owns, don't calculate it from native markup.
if (rv != NS_OK_NO_RELATION_TARGET)
return NS_OK;
case nsIAccessibleRelation::RELATION_NODE_CHILD_OF: {
Relation rel(new RelatedAccIterator(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_owns));
// This is an ARIA tree or treegrid that doesn't use owns, so we need to
// get the parent the hard way.
if (mRoleMapEntry &&
(mRoleMapEntry->role == nsIAccessibleRole::ROLE_OUTLINEITEM ||
mRoleMapEntry->role == nsIAccessibleRole::ROLE_ROW)) {
AccGroupInfo* groupInfo = GetGroupInfo();
if (!groupInfo)
return NS_OK_NO_RELATION_TARGET;
return rel;
return nsRelUtils::AddTarget(aRelationType, aRelation,
groupInfo->ConceptualParent());
rel.AppendTarget(groupInfo->ConceptualParent());
}
// If accessible is in its own Window, or is the root of a document,
@ -2161,65 +2101,28 @@ nsAccessible::GetRelationByType(PRUint32 aRelationType,
if (view) {
nsIScrollableFrame *scrollFrame = do_QueryFrame(frame);
if (scrollFrame || view->GetWidget() || !frame->GetParent())
return nsRelUtils::AddTarget(aRelationType, aRelation, Parent());
rel.AppendTarget(Parent());
}
}
return rv;
return rel;
}
case nsIAccessibleRelation::RELATION_CONTROLLED_BY:
{
RelatedAccIterator iter(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_controls);
nsAccessible* related = nsnull;
while ((related = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, related);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
case nsIAccessibleRelation::RELATION_CONTROLLED_BY:
return Relation(new RelatedAccIterator(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_controls));
case nsIAccessibleRelation::RELATION_CONTROLLER_FOR: {
Relation rel(new IDRefsIterator(mContent,
nsAccessibilityAtoms::aria_controls));
rel.AppendIter(new HTMLOutputIterator(GetDocAccessible(), mContent));
return rel;
}
case nsIAccessibleRelation::RELATION_CONTROLLER_FOR:
{
nsresult rv = nsRelUtils::
AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent,
nsAccessibilityAtoms::aria_controls);
NS_ENSURE_SUCCESS(rv,rv);
HTMLOutputIterator iter(GetDocAccessible(), mContent);
nsAccessible* related = nsnull;
while ((related = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, related);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
}
case nsIAccessibleRelation::RELATION_FLOWS_TO:
{
return nsRelUtils::
AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent,
nsAccessibilityAtoms::aria_flowto);
}
case nsIAccessibleRelation::RELATION_FLOWS_FROM:
{
RelatedAccIterator iter(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_flowto);
nsAccessible* related = nsnull;
while ((related = iter.Next())) {
rv = nsRelUtils::AddTarget(aRelationType, aRelation, related);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
}
case nsIAccessibleRelation::RELATION_DEFAULT_BUTTON:
{
case nsIAccessibleRelation::RELATION_FLOWS_TO:
return Relation(new IDRefsIterator(mContent,
nsAccessibilityAtoms::aria_flowto));
case nsIAccessibleRelation::RELATION_FLOWS_FROM:
return Relation(new RelatedAccIterator(GetDocAccessible(), mContent,
nsAccessibilityAtoms::aria_flowto));
case nsIAccessibleRelation::RELATION_DEFAULT_BUTTON: {
if (mContent->IsHTML()) {
// HTML form controls implements nsIFormControl interface.
nsCOMPtr<nsIFormControl> control(do_QueryInterface(mContent));
@ -2228,12 +2131,10 @@ nsAccessible::GetRelationByType(PRUint32 aRelationType,
if (form) {
nsCOMPtr<nsIContent> formContent =
do_QueryInterface(form->GetDefaultSubmitElement());
return nsRelUtils::AddTargetFromContent(aRelationType, aRelation,
formContent);
return Relation(formContent);
}
}
}
else {
} else {
// In XUL, use first <button default="true" .../> in the document
nsCOMPtr<nsIDOMXULDocument> xulDoc =
do_QueryInterface(mContent->GetOwnerDoc());
@ -2271,40 +2172,32 @@ nsAccessible::GetRelationByType(PRUint32 aRelationType,
}
}
nsCOMPtr<nsIContent> relatedContent(do_QueryInterface(buttonEl));
return nsRelUtils::AddTargetFromContent(aRelationType, aRelation,
relatedContent);
return Relation(relatedContent);
}
}
return NS_OK;
return Relation();
}
case nsIAccessibleRelation::RELATION_MEMBER_OF:
{
nsCOMPtr<nsIContent> regionContent = do_QueryInterface(GetAtomicRegion());
return nsRelUtils::
AddTargetFromContent(aRelationType, aRelation, regionContent);
}
case nsIAccessibleRelation::RELATION_SUBWINDOW_OF:
case nsIAccessibleRelation::RELATION_EMBEDS:
case nsIAccessibleRelation::RELATION_EMBEDDED_BY:
case nsIAccessibleRelation::RELATION_POPUP_FOR:
case nsIAccessibleRelation::RELATION_PARENT_WINDOW_OF:
{
return NS_OK_NO_RELATION_TARGET;
}
default:
return NS_ERROR_INVALID_ARG;
case nsIAccessibleRelation::RELATION_MEMBER_OF:
return Relation(GetAtomicRegion());
case nsIAccessibleRelation::RELATION_SUBWINDOW_OF:
case nsIAccessibleRelation::RELATION_EMBEDS:
case nsIAccessibleRelation::RELATION_EMBEDDED_BY:
case nsIAccessibleRelation::RELATION_POPUP_FOR:
case nsIAccessibleRelation::RELATION_PARENT_WINDOW_OF:
default:
return Relation();
}
}
NS_IMETHODIMP
nsAccessible::GetRelationsCount(PRUint32 *aCount)
nsAccessible::GetRelationsCount(PRUint32* aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
*aCount = 0;
if (IsDefunct())
return NS_ERROR_FAILURE;
nsCOMPtr<nsIArray> relations;
nsresult rv = GetRelations(getter_AddRefs(relations));
NS_ENSURE_SUCCESS(rv, rv);
@ -2313,33 +2206,31 @@ nsAccessible::GetRelationsCount(PRUint32 *aCount)
}
NS_IMETHODIMP
nsAccessible::GetRelation(PRUint32 aIndex, nsIAccessibleRelation **aRelation)
nsAccessible::GetRelation(PRUint32 aIndex, nsIAccessibleRelation** aRelation)
{
NS_ENSURE_ARG_POINTER(aRelation);
*aRelation = nsnull;
if (IsDefunct())
return NS_ERROR_FAILURE;
nsCOMPtr<nsIArray> relations;
nsresult rv = GetRelations(getter_AddRefs(relations));
nsresult rv= GetRelations(getter_AddRefs(relations));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAccessibleRelation> relation;
rv = relations->QueryElementAt(aIndex, NS_GET_IID(nsIAccessibleRelation),
getter_AddRefs(relation));
// nsIArray::QueryElementAt() returns NS_ERROR_ILLEGAL_VALUE on invalid index.
if (rv == NS_ERROR_ILLEGAL_VALUE)
return NS_ERROR_INVALID_ARG;
NS_ENSURE_SUCCESS(rv, rv);
NS_IF_ADDREF(*aRelation = relation);
return NS_OK;
nsCOMPtr<nsIAccessibleRelation> relation = do_QueryElementAt(relations,
aIndex, &rv);
NS_ADDREF(*aRelation = relation);
return rv;
}
NS_IMETHODIMP
nsAccessible::GetRelations(nsIArray **aRelations)
{
NS_ENSURE_ARG_POINTER(aRelations);
*aRelations = nsnull;
if (IsDefunct())
return NS_ERROR_FAILURE;
nsCOMPtr<nsIMutableArray> relations = do_CreateInstance(NS_ARRAY_CONTRACTID);
NS_ENSURE_TRUE(relations, NS_ERROR_OUT_OF_MEMORY);
@ -2351,8 +2242,12 @@ nsAccessible::GetRelations(nsIArray **aRelations)
nsCOMPtr<nsIAccessibleRelation> relation;
nsresult rv = GetRelationByType(relType, getter_AddRefs(relation));
if (NS_SUCCEEDED(rv) && relation)
relations->AppendElement(relation, PR_FALSE);
if (NS_SUCCEEDED(rv) && relation) {
PRUint32 targets = 0;
relation->GetTargetsCount(&targets);
if (targets)
relations->AppendElement(relation, PR_FALSE);
}
}
NS_ADDREF(*aRelations = relations);
@ -2974,7 +2869,7 @@ nsAccessible::SelectedItems()
AccIterator iter(this, filters::GetSelected, AccIterator::eTreeNav);
nsIAccessible* selected = nsnull;
while ((selected = iter.GetNext()))
while ((selected = iter.Next()))
selectedItems->AppendElement(selected, PR_FALSE);
nsIMutableArray* items = nsnull;
@ -2988,7 +2883,7 @@ nsAccessible::SelectedItemCount()
PRUint32 count = 0;
AccIterator iter(this, filters::GetSelected, AccIterator::eTreeNav);
nsAccessible* selected = nsnull;
while ((selected = iter.GetNext()))
while ((selected = iter.Next()))
++count;
return count;
@ -3001,7 +2896,7 @@ nsAccessible::GetSelectedItem(PRUint32 aIndex)
nsAccessible* selected = nsnull;
PRUint32 index = 0;
while ((selected = iter.GetNext()) && index < aIndex)
while ((selected = iter.Next()) && index < aIndex)
index++;
return selected;
@ -3013,7 +2908,7 @@ nsAccessible::IsItemSelected(PRUint32 aIndex)
PRUint32 index = 0;
AccIterator iter(this, filters::GetSelectable, AccIterator::eTreeNav);
nsAccessible* selected = nsnull;
while ((selected = iter.GetNext()) && index < aIndex)
while ((selected = iter.Next()) && index < aIndex)
index++;
return selected &&
@ -3026,7 +2921,7 @@ nsAccessible::AddItemToSelection(PRUint32 aIndex)
PRUint32 index = 0;
AccIterator iter(this, filters::GetSelectable, AccIterator::eTreeNav);
nsAccessible* selected = nsnull;
while ((selected = iter.GetNext()) && index < aIndex)
while ((selected = iter.Next()) && index < aIndex)
index++;
if (selected)
@ -3041,7 +2936,7 @@ nsAccessible::RemoveItemFromSelection(PRUint32 aIndex)
PRUint32 index = 0;
AccIterator iter(this, filters::GetSelectable, AccIterator::eTreeNav);
nsAccessible* selected = nsnull;
while ((selected = iter.GetNext()) && index < aIndex)
while ((selected = iter.Next()) && index < aIndex)
index++;
if (selected)
@ -3057,7 +2952,7 @@ nsAccessible::SelectAll()
nsAccessible* selectable = nsnull;
AccIterator iter(this, filters::GetSelectable, AccIterator::eTreeNav);
while((selectable = iter.GetNext())) {
while((selectable = iter.Next())) {
success = true;
selectable->SetSelected(PR_TRUE);
}
@ -3071,7 +2966,7 @@ nsAccessible::UnselectAll()
nsAccessible* selected = nsnull;
AccIterator iter(this, filters::GetSelected, AccIterator::eTreeNav);
while ((selected = iter.GetNext())) {
while ((selected = iter.Next())) {
success = true;
selected->SetSelected(PR_FALSE);
}

Просмотреть файл

@ -62,6 +62,7 @@ class nsAccessible;
class nsHyperTextAccessible;
class nsHTMLLIAccessible;
struct nsRoleMapEntry;
class Relation;
class nsTextAccessible;
struct nsRect;
@ -237,6 +238,11 @@ public:
virtual void GetPositionAndSizeInternal(PRInt32 *aPosInSet,
PRInt32 *aSetSize);
/**
* Get the relation of the given type.
*/
virtual Relation RelationByType(PRUint32 aType);
//////////////////////////////////////////////////////////////////////////////
// Initializing methods
@ -667,7 +673,7 @@ protected:
* Get the container node for an atomic region, defined by aria-atomic="true"
* @return the container node
*/
nsIDOMNode* GetAtomicRegion();
nsIContent* GetAtomicRegion() const;
/**
* Get numeric value of the given ARIA attribute.

Просмотреть файл

@ -42,6 +42,7 @@
#include "nsApplicationAccessible.h"
#include "Relation.h"
#include "States.h"
#include "nsAccessibilityService.h"
#include "nsAccUtils.h"
@ -182,38 +183,10 @@ nsApplicationAccessible::FocusedChild()
return nsnull;
}
NS_IMETHODIMP
nsApplicationAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsApplicationAccessible::RelationByType(PRUint32 aRelationType)
{
NS_ENSURE_ARG_POINTER(aRelation);
*aRelation = nsnull;
return NS_OK;
}
NS_IMETHODIMP
nsApplicationAccessible::GetRelationsCount(PRUint32 *aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
*aCount = 0;
return NS_OK;
}
NS_IMETHODIMP
nsApplicationAccessible::GetRelation(PRUint32 aIndex,
nsIAccessibleRelation **aRelation)
{
NS_ENSURE_ARG_POINTER(aRelation);
*aRelation = nsnull;
return NS_ERROR_INVALID_ARG;
}
NS_IMETHODIMP
nsApplicationAccessible::GetRelations(nsIArray **aRelations)
{
NS_ENSURE_ARG_POINTER(aRelations);
*aRelations = nsnull;
return NS_OK;
return Relation();
}
NS_IMETHODIMP

Просмотреть файл

@ -93,11 +93,6 @@ public:
NS_IMETHOD GetAttributes(nsIPersistentProperties **aAttributes);
NS_IMETHOD GroupPosition(PRInt32 *aGroupLevel, PRInt32 *aSimilarItemsInGroup,
PRInt32 *aPositionInGroup);
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
NS_IMETHOD GetRelationsCount(PRUint32 *aRelationsCount);
NS_IMETHOD GetRelation(PRUint32 aIndex, nsIAccessibleRelation **aRelation);
NS_IMETHOD GetRelations(nsIArray **aRelations);
NS_IMETHOD GetBounds(PRInt32 *aX, PRInt32 *aY,
PRInt32 *aWidth, PRInt32 *aHeight);
NS_IMETHOD SetSelected(PRBool aIsSelected);
@ -122,6 +117,7 @@ public:
virtual PRUint32 NativeRole();
virtual PRUint64 State();
virtual PRUint64 NativeState();
virtual Relation RelationByType(PRUint32 aRelType);
virtual nsAccessible* ChildAtPoint(PRInt32 aX, PRInt32 aY,
EWhichChildAtPoint aWhichChild);

Просмотреть файл

@ -828,77 +828,3 @@ nsAccessibleDOMStringList::Contains(const nsAString& aString, PRBool *aResult)
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// IDRefsIterator
////////////////////////////////////////////////////////////////////////////////
IDRefsIterator::IDRefsIterator(nsIContent* aContent, nsIAtom* aIDRefsAttr) :
mCurrIdx(0)
{
if (!aContent->IsInDoc() ||
!aContent->GetAttr(kNameSpaceID_None, aIDRefsAttr, mIDs))
return;
if (aContent->IsInAnonymousSubtree()) {
mXBLDocument = do_QueryInterface(aContent->GetOwnerDoc());
mBindingParent = do_QueryInterface(aContent->GetBindingParent());
} else {
mDocument = aContent->GetOwnerDoc();
}
}
const nsDependentSubstring
IDRefsIterator::NextID()
{
for (; mCurrIdx < mIDs.Length(); mCurrIdx++) {
if (!NS_IsAsciiWhitespace(mIDs[mCurrIdx]))
break;
}
if (mCurrIdx >= mIDs.Length())
return nsDependentSubstring();
nsAString::index_type idStartIdx = mCurrIdx;
while (++mCurrIdx < mIDs.Length()) {
if (NS_IsAsciiWhitespace(mIDs[mCurrIdx]))
break;
}
return Substring(mIDs, idStartIdx, mCurrIdx++ - idStartIdx);
}
nsIContent*
IDRefsIterator::NextElem()
{
while (true) {
const nsDependentSubstring id = NextID();
if (id.IsEmpty())
break;
nsIContent* refContent = GetElem(id);
if (refContent)
return refContent;
}
return nsnull;
}
nsIContent*
IDRefsIterator::GetElem(const nsDependentSubstring& aID)
{
if (mXBLDocument) {
// If content is anonymous subtree then use "anonid" attribute to get
// elements, otherwise search elements in DOM by ID attribute.
nsCOMPtr<nsIDOMElement> refElm;
mXBLDocument->GetAnonymousElementByAttribute(mBindingParent,
NS_LITERAL_STRING("anonid"),
aID,
getter_AddRefs(refElm));
nsCOMPtr<nsIContent> refContent = do_QueryInterface(refElm);
return refContent;
}
return mDocument->GetElementById(aID);
}

Просмотреть файл

@ -41,7 +41,6 @@
#include "nsAccessibilityAtoms.h"
#include "nsIDOMDocumentXBL.h"
#include "nsIDOMNode.h"
#include "nsIContent.h"
#include "nsIBoxObject.h"
@ -401,39 +400,5 @@ private:
nsTArray<nsString> mNames;
};
/**
* Used to iterate through IDs or elements pointed by IDRefs attribute. Note,
* any method used to iterate through IDs or elements moves iterator to next
* position.
*/
class IDRefsIterator
{
public:
IDRefsIterator(nsIContent* aContent, nsIAtom* aIDRefsAttr);
/**
* Return next ID.
*/
const nsDependentSubstring NextID();
/**
* Return next element.
*/
nsIContent* NextElem();
/**
* Return the element with the given ID.
*/
nsIContent* GetElem(const nsDependentSubstring& aID);
private:
nsString mIDs;
nsAString::index_type mCurrIdx;
nsIDocument* mDocument;
nsCOMPtr<nsIDOMDocumentXBL> mXBLDocument;
nsCOMPtr<nsIDOMElement> mBindingParent;
};
#endif

Просмотреть файл

@ -36,6 +36,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "AccIterator.h"
#include "States.h"
#include "nsAccCache.h"
#include "nsAccessibilityAtoms.h"

Просмотреть файл

@ -1,147 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Alexander Surkov <surkov.alexander@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsRelUtils.h"
#include "nsAccessibilityService.h"
#include "nsAccessible.h"
#include "nsCoreUtils.h"
#include "nsIDOMDocument.h"
#include "nsIDOMElement.h"
#include "nsIDOMDocumentXBL.h"
#include "nsAutoPtr.h"
#include "nsArrayUtils.h"
already_AddRefed<nsIAccessible>
nsRelUtils::GetRelatedAccessible(nsIAccessible *aAccessible,
PRUint32 aRelationType)
{
nsCOMPtr<nsIAccessibleRelation> relation;
nsresult rv = aAccessible->GetRelationByType(aRelationType,
getter_AddRefs(relation));
if (NS_FAILED(rv) || !relation)
return nsnull;
nsIAccessible *targetAccessible = nsnull;
rv = relation->GetTarget(0, &targetAccessible);
return targetAccessible;
}
nsresult
nsRelUtils::AddTarget(PRUint32 aRelationType, nsIAccessibleRelation **aRelation,
nsIAccessible *aTarget)
{
if (!aTarget)
return NS_OK_NO_RELATION_TARGET;
if (*aRelation) {
nsRefPtr<nsAccessibleRelation> relation = QueryAccRelation(*aRelation);
return relation->AddTarget(aTarget);
}
*aRelation = new nsAccessibleRelationWrap(aRelationType, aTarget);
NS_ENSURE_TRUE(*aRelation, NS_ERROR_OUT_OF_MEMORY);
NS_ADDREF(*aRelation);
return NS_OK;
}
nsresult
nsRelUtils::AddTargetFromContent(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIContent *aContent)
{
if (!aContent)
return NS_OK_NO_RELATION_TARGET;
nsAccessible* accessible = GetAccService()->GetAccessible(aContent);
return AddTarget(aRelationType, aRelation, accessible);
}
nsresult
nsRelUtils::AddTargetFromIDRefAttr(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIContent *aContent, nsIAtom *aAttr,
PRBool aMayBeAnon)
{
nsAutoString id;
if (!aContent->GetAttr(kNameSpaceID_None, aAttr, id))
return NS_OK_NO_RELATION_TARGET;
nsCOMPtr<nsIDOMDocument> document =
do_QueryInterface(aContent->GetOwnerDoc());
NS_ASSERTION(document, "The given node is not in document!");
if (!document)
return NS_OK_NO_RELATION_TARGET;
nsCOMPtr<nsIDOMElement> refElm;
if (aMayBeAnon && aContent->GetBindingParent()) {
nsCOMPtr<nsIDOMDocumentXBL> documentXBL(do_QueryInterface(document));
nsCOMPtr<nsIDOMElement> bindingParent =
do_QueryInterface(aContent->GetBindingParent());
documentXBL->GetAnonymousElementByAttribute(bindingParent,
NS_LITERAL_STRING("id"),
id,
getter_AddRefs(refElm));
}
else {
document->GetElementById(id, getter_AddRefs(refElm));
}
nsCOMPtr<nsIContent> refContent(do_QueryInterface(refElm));
return AddTargetFromContent(aRelationType, aRelation, refContent);
}
nsresult
nsRelUtils::AddTargetFromIDRefsAttr(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIContent *aContent, nsIAtom *aAttr)
{
nsresult rv = NS_OK_NO_RELATION_TARGET;
nsIContent* refElm = nsnull;
IDRefsIterator iter(aContent, aAttr);
while ((refElm = iter.NextElem())) {
rv = AddTargetFromContent(aRelationType, aRelation, refElm);
NS_ENSURE_SUCCESS(rv, rv);
}
return rv;
}

Просмотреть файл

@ -1,136 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Alexander Surkov <surkov.alexander@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef _nsRelUtils_H_
#define _nsRelUtils_H_
#include "nsAccessibleRelationWrap.h"
#include "nsIAtom.h"
#include "nsIContent.h"
// Used by AddTarget...() methods. Returned when can't get target accessible.
#define NS_OK_NO_RELATION_TARGET \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_GENERAL, 0x24)
/**
* Utils class designed to work with accessible relations.
*/
class nsRelUtils
{
public:
/**
* Return first target of the relation of the given relation type for
* the given accessible.
*
* @param aAccessible [in] the accessible to get an relation
* @param aRelationType [in] relation type
* @return an accessible
*/
static already_AddRefed<nsIAccessible>
GetRelatedAccessible(nsIAccessible *aAccessible, PRUint32 aRelationType);
/**
* Create the relation if the given relation is null. Add target to it
* which is the given accessible.
*
* @param aRelationType [in] relation type
* @param aRelation [in, out] relation object
* @param aTarget [in] accessible object
*/
static nsresult AddTarget(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIAccessible *aTarget);
/**
* Create the relation if the given relation is null and add the target to it
* which is the accessible for the given node.
*
* @param aRelationType [in] relation type
* @param aRelation [in, out] relation object
* @param aContent [in] accessible node
*/
static nsresult AddTargetFromContent(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIContent *aContent);
/**
* Create the relation if the given relation is null and add the target to it
* pointed by IDRef attribute on the given node.
*
* @param aRelationType [in] relation type
* @param aRelation [in, out] relation object
* @param aContent [in] node having the given IDRef attribute
* @param aAttr [in] IDRef attribute
* @param aMayBeAnon [in] true if the target may be anonymous; if so,
* we need to look for it under the binding
* parent of aContent.
*/
static nsresult AddTargetFromIDRefAttr(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIContent *aContent, nsIAtom *aAttr,
PRBool aMayBeAnon = PR_FALSE);
/**
* Create the relation if the given relation is null and add the targets to it
* that are pointed by IDRefs attribute on the given node.
*
* @param aRelationType [in] relation type
* @param aRelation [in, out] relation object
* @param aContent [in] node having the given IDRefs attribute
* @param aAttr [in] IDRefs attribute
*/
static nsresult AddTargetFromIDRefsAttr(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation,
nsIContent *aContent, nsIAtom *aAttr);
/**
* Query nsAccessibleRelation from the given nsIAccessibleRelation.
*/
static already_AddRefed<nsAccessibleRelation>
QueryAccRelation(nsIAccessibleRelation *aRelation)
{
nsAccessibleRelation* relation = nsnull;
if (aRelation)
CallQueryInterface(aRelation, &relation);
return relation;
}
};
#endif

Просмотреть файл

@ -38,15 +38,16 @@
#define CreateEvent CreateEventA
#include "nsIDOMDocument.h"
#include "States.h"
#include "nsAccessibilityService.h"
#include "nsApplicationAccessibleWrap.h"
#include "nsAccUtils.h"
#include "nsCoreUtils.h"
#include "nsRelUtils.h"
#include "Relation.h"
#include "States.h"
#include "mozilla/dom/Element.h"
#include "nsHTMLSelectAccessible.h"
#include "nsIAccessibleRelation.h"
#include "nsIDocShell.h"
#include "nsIDocShellTreeItem.h"
#include "nsIDocShellTreeNode.h"
@ -830,27 +831,20 @@ nsRootAccessible::GetContentDocShell(nsIDocShellTreeItem *aStart)
}
// nsIAccessible method
NS_IMETHODIMP
nsRootAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsRootAccessible::RelationByType(PRUint32 aType)
{
NS_ENSURE_ARG_POINTER(aRelation);
*aRelation = nsnull;
if (!mDocument || aRelationType != nsIAccessibleRelation::RELATION_EMBEDS) {
return nsDocAccessibleWrap::GetRelationByType(aRelationType, aRelation);
}
if (!mDocument || aType != nsIAccessibleRelation::RELATION_EMBEDS)
return nsDocAccessibleWrap::RelationByType(aType);
nsCOMPtr<nsIDocShellTreeItem> treeItem =
nsCoreUtils::GetDocShellTreeItemFor(mDocument);
nsCOMPtr<nsIDocShellTreeItem> contentTreeItem = GetContentDocShell(treeItem);
// there may be no content area, so we need a null check
if (contentTreeItem) {
nsDocAccessible *accDoc = nsAccUtils::GetDocAccessibleFor(contentTreeItem);
return nsRelUtils::AddTarget(aRelationType, aRelation, accDoc);
}
if (!contentTreeItem)
return Relation();
return NS_OK;
return Relation(nsAccUtils::GetDocAccessibleFor(contentTreeItem));
}
////////////////////////////////////////////////////////////////////////////////

Просмотреть файл

@ -51,6 +51,8 @@
#include "nsIDocument.h"
#include "nsIDOMEventListener.h"
class Relation;
#define NS_ROOTACCESSIBLE_IMPL_CID \
{ /* eaba2cf0-21b1-4e2b-b711-d3a89dcd5e1a */ \
0xeaba2cf0, \
@ -73,8 +75,6 @@ public:
// nsIAccessible
NS_IMETHOD GetName(nsAString& aName);
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsIDOMEventListener
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
@ -83,6 +83,7 @@ public:
virtual void Shutdown();
// nsAccessible
virtual Relation RelationByType(PRUint32 aType);
virtual PRUint32 NativeRole();
virtual PRUint64 NativeState();

Просмотреть файл

@ -147,7 +147,7 @@ nsTextAttrsMgr::GetAttributes(nsIPersistentProperties *aAttributes,
frame = offsetElm->GetPrimaryFrame();
}
nsTPtrArray<nsITextAttr> textAttrArray(10);
nsTArray<nsITextAttr*> textAttrArray(10);
// "language" text attribute
nsLangTextAttr langTextAttr(mHyperTextAcc, hyperTextElm, offsetNode);
@ -212,7 +212,7 @@ nsTextAttrsMgr::GetAttributes(nsIPersistentProperties *aAttributes,
}
nsresult
nsTextAttrsMgr::GetRange(const nsTPtrArray<nsITextAttr>& aTextAttrArray,
nsTextAttrsMgr::GetRange(const nsTArray<nsITextAttr*>& aTextAttrArray,
PRInt32 *aStartHTOffset, PRInt32 *aEndHTOffset)
{
PRUint32 attrLen = aTextAttrArray.Length();

Просмотреть файл

@ -52,7 +52,6 @@ class nsHyperTextAccessible;
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsTPtrArray.h"
class nsITextAttr;
@ -112,7 +111,7 @@ protected:
* @param aStartHTOffset [in, out] the start offset
* @param aEndHTOffset [in, out] the end offset
*/
nsresult GetRange(const nsTPtrArray<nsITextAttr>& aTextAttrArray,
nsresult GetRange(const nsTArray<nsITextAttr*>& aTextAttrArray,
PRInt32 *aStartHTOffset, PRInt32 *aEndHTOffset);
private:

Просмотреть файл

@ -39,6 +39,7 @@
#include "nsTextEquivUtils.h"
#include "AccIterator.h"
#include "nsAccessibilityService.h"
#include "nsAccessible.h"
#include "nsAccUtils.h"

Просмотреть файл

@ -38,12 +38,13 @@
#include "nsHTMLFormControlAccessible.h"
#include "Relation.h"
#include "States.h"
#include "nsAccessibilityAtoms.h"
#include "nsAccUtils.h"
#include "nsRelUtils.h"
#include "nsTextEquivUtils.h"
#include "nsIAccessibleRelation.h"
#include "nsIDOMDocument.h"
#include "nsIDOMHTMLInputElement.h"
#include "nsIDOMNSHTMLElement.h"
@ -615,24 +616,17 @@ nsHTMLGroupboxAccessible::GetNameInternal(nsAString& aName)
return NS_OK;
}
NS_IMETHODIMP
nsHTMLGroupboxAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsHTMLGroupboxAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsHyperTextAccessibleWrap::GetRelationByType(aRelationType,
aRelation);
NS_ENSURE_SUCCESS(rv, rv);
if (aRelationType == nsIAccessibleRelation::RELATION_LABELLED_BY) {
Relation rel = nsHyperTextAccessibleWrap::RelationByType(aType);
// No override for label, so use <legend> for this <fieldset>
return nsRelUtils::
AddTargetFromContent(aRelationType, aRelation, GetLegend());
}
if (aType == nsIAccessibleRelation::RELATION_LABELLED_BY)
rel.AppendTarget(GetLegend());
return NS_OK;
return rel;
}
////////////////////////////////////////////////////////////////////////////////
// nsHTMLLegendAccessible
////////////////////////////////////////////////////////////////////////////////
@ -643,35 +637,18 @@ nsHTMLLegendAccessible::
{
}
NS_IMETHODIMP
nsHTMLLegendAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsHTMLLegendAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsHyperTextAccessibleWrap::
GetRelationByType(aRelationType, aRelation);
NS_ENSURE_SUCCESS(rv, rv);
Relation rel = nsHyperTextAccessibleWrap::RelationByType(aType);
if (aType != nsIAccessibleRelation::RELATION_LABEL_FOR)
return rel;
if (aRelationType == nsIAccessibleRelation::RELATION_LABEL_FOR) {
// Look for groupbox parent
nsAccessible* groupbox = Parent();
nsAccessible* groupbox = Parent();
if (groupbox && groupbox->Role() == nsIAccessibleRole::ROLE_GROUPING)
rel.AppendTarget(groupbox);
if (groupbox && groupbox->Role() == nsIAccessibleRole::ROLE_GROUPING) {
// XXX: if group box exposes more than one relation of the given type
// then we fail.
nsCOMPtr<nsIAccessible> testLabelAccessible =
nsRelUtils::GetRelatedAccessible(groupbox,
nsIAccessibleRelation::RELATION_LABELLED_BY);
if (testLabelAccessible == this) {
// We're the first child of the parent groupbox, see
// nsHTMLGroupboxAccessible::GetRelationByType().
return nsRelUtils::
AddTarget(aRelationType, aRelation, groupbox);
}
}
}
return NS_OK;
return rel;
}
PRUint32

Просмотреть файл

@ -176,13 +176,10 @@ class nsHTMLGroupboxAccessible : public nsHyperTextAccessibleWrap
public:
nsHTMLGroupboxAccessible(nsIContent *aContent, nsIWeakReference *aShell);
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual nsresult GetNameInternal(nsAString& aName);
virtual PRUint32 NativeRole();
virtual Relation RelationByType(PRUint32 aType);
protected:
nsIContent* GetLegend();
@ -197,12 +194,9 @@ class nsHTMLLegendAccessible : public nsHyperTextAccessibleWrap
public:
nsHTMLLegendAccessible(nsIContent *aContent, nsIWeakReference *aShell);
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual PRUint32 NativeRole();
virtual Relation RelationByType(PRUint32 aType);
};
#endif

Просмотреть файл

@ -39,14 +39,15 @@
#include "nsHTMLTableAccessible.h"
#include "Relation.h"
#include "States.h"
#include "nsAccessibilityService.h"
#include "nsAccTreeWalker.h"
#include "nsAccUtils.h"
#include "nsDocAccessible.h"
#include "nsRelUtils.h"
#include "nsTextEquivUtils.h"
#include "nsIAccessibleRelation.h"
#include "nsIDOMElement.h"
#include "nsIDOMDocument.h"
#include "nsIDOMRange.h"
@ -504,18 +505,14 @@ nsHTMLTableAccessible::GetAttributesInternal(nsIPersistentProperties *aAttribute
////////////////////////////////////////////////////////////////////////////////
// nsHTMLTableAccessible: nsIAccessible implementation
NS_IMETHODIMP
nsHTMLTableAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsHTMLTableAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType,
aRelation);
NS_ENSURE_SUCCESS(rv, rv);
Relation rel = nsAccessibleWrap::RelationByType(aType);
if (aType == nsIAccessibleRelation::RELATION_LABELLED_BY)
rel.AppendTarget(Caption());
if (aRelationType == nsIAccessibleRelation::RELATION_LABELLED_BY)
return nsRelUtils::AddTarget(aRelationType, aRelation, Caption());
return NS_OK;
return rel;
}
////////////////////////////////////////////////////////////////////////////////
@ -1521,19 +1518,14 @@ nsHTMLTableAccessible::IsProbablyForLayout(PRBool *aIsProbablyForLayout)
// nsHTMLCaptionAccessible
////////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP
nsHTMLCaptionAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsHTMLCaptionAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsHyperTextAccessible::GetRelationByType(aRelationType,
aRelation);
NS_ENSURE_SUCCESS(rv, rv);
Relation rel = nsHyperTextAccessible::RelationByType(aType);
if (aType == nsIAccessibleRelation::RELATION_LABEL_FOR)
rel.AppendTarget(Parent());
if (aRelationType == nsIAccessibleRelation::RELATION_LABEL_FOR) {
return nsRelUtils::AddTarget(aRelationType, aRelation, Parent());
}
return NS_OK;
return rel;
}
PRUint32

Просмотреть файл

@ -130,16 +130,13 @@ public:
NS_DECL_NSIACCESSIBLETABLE
NS_DECLARE_STATIC_IID_ACCESSOR(NS_TABLEACCESSIBLE_IMPL_CID)
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual void Description(nsString& aDescription);
virtual nsresult GetNameInternal(nsAString& aName);
virtual PRUint32 NativeRole();
virtual PRUint64 NativeState();
virtual nsresult GetAttributesInternal(nsIPersistentProperties *aAttributes);
virtual Relation RelationByType(PRUint32 aRelationType);
// TableAccessible
inline nsAccessible* Caption() const
@ -219,11 +216,10 @@ public:
nsHyperTextAccessibleWrap(aContent, aShell) { }
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual PRUint32 NativeRole();
virtual Relation RelationByType(PRUint32 aRelationType);
};
#endif

Просмотреть файл

@ -41,10 +41,11 @@
#include "nsDocAccessible.h"
#include "nsAccUtils.h"
#include "nsRelUtils.h"
#include "nsTextEquivUtils.h"
#include "Relation.h"
#include "States.h"
#include "nsIAccessibleRelation.h"
#include "nsIFrame.h"
#include "nsPresContext.h"
#include "nsBlockFrame.h"
@ -198,23 +199,14 @@ nsHTMLOutputAccessible::
NS_IMPL_ISUPPORTS_INHERITED0(nsHTMLOutputAccessible, nsHyperTextAccessible)
NS_IMETHODIMP
nsHTMLOutputAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation** aRelation)
Relation
nsHTMLOutputAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType, aRelation);
NS_ENSURE_SUCCESS(rv, rv);
Relation rel = nsAccessibleWrap::RelationByType(aType);
if (aType == nsIAccessibleRelation::RELATION_CONTROLLED_BY)
rel.AppendIter(new IDRefsIterator(mContent, nsAccessibilityAtoms::_for));
if (rv != NS_OK_NO_RELATION_TARGET)
return NS_OK; // XXX bug 381599, avoid performance problems
if (aRelationType == nsIAccessibleRelation::RELATION_CONTROLLED_BY) {
return nsRelUtils::
AddTargetFromIDRefsAttr(aRelationType, aRelation, mContent,
nsAccessibilityAtoms::_for);
}
return NS_OK;
return rel;
}
PRUint32

Просмотреть файл

@ -115,13 +115,10 @@ public:
NS_DECL_ISUPPORTS_INHERITED
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation** aRelation);
// nsAccessible
virtual PRUint32 NativeRole();
virtual nsresult GetAttributesInternal(nsIPersistentProperties* aAttributes);
virtual Relation RelationByType(PRUint32 aType);
};
/**

Просмотреть файл

@ -72,7 +72,6 @@ EXPORTS = \
nsHyperTextAccessibleWrap.h \
nsHTMLImageAccessibleWrap.h \
nsHTMLTableAccessibleWrap.h \
nsAccessibleRelationWrap.h \
nsApplicationAccessibleWrap.h \
mozDocAccessible.h \
mozAccessible.h \

Просмотреть файл

@ -1,49 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=2:tabstop=2:
*/
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Alexander Surkov <surkov.alexander@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef _NS_ACCESSIBLE_RELATION_WRAP_H
#define _NS_ACCESSIBLE_RELATION_WRAP_H
#include "nsAccessibleRelation.h"
typedef class nsAccessibleRelation nsAccessibleRelationWrap;
#endif

Просмотреть файл

@ -61,7 +61,6 @@ CPPSRCS = \
nsHyperTextAccessibleWrap.cpp \
nsHTMLImageAccessibleWrap.cpp \
nsHTMLTableAccessibleWrap.cpp \
nsAccessibleRelationWrap.cpp \
nsApplicationAccessibleWrap.cpp \
nsWinUtils.cpp \
CAccessibleAction.cpp \
@ -71,6 +70,7 @@ CPPSRCS = \
CAccessibleEditableText.cpp \
CAccessibleHyperlink.cpp \
CAccessibleHypertext.cpp \
ia2AccessibleRelation.cpp \
CAccessibleTable.cpp \
CAccessibleTableCell.cpp \
CAccessibleValue.cpp \
@ -90,7 +90,6 @@ EXPORTS = \
nsHyperTextAccessibleWrap.h \
nsHTMLImageAccessibleWrap.h \
nsHTMLTableAccessibleWrap.h \
nsAccessibleRelationWrap.h \
nsApplicationAccessibleWrap.h \
CAccessibleAction.h \
CAccessibleImage.h \

Просмотреть файл

@ -38,37 +38,31 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsAccessibleRelationWrap.h"
#include "ia2AccessibleRelation.h"
#include "Relation.h"
#include "nsIAccessibleRelation.h"
#include "nsID.h"
#include "AccessibleRelation_i.c"
#include "nsAccessNodeWrap.h"
#include "nsArrayUtils.h"
nsAccessibleRelationWrap::
nsAccessibleRelationWrap(PRUint32 aType, nsIAccessible *aTarget) :
nsAccessibleRelation(aType, aTarget)
ia2AccessibleRelation::ia2AccessibleRelation(PRUint32 aType, Relation* aRel) :
mType(aType), mReferences(0)
{
}
// ISupports
NS_IMPL_ISUPPORTS_INHERITED1(nsAccessibleRelationWrap, nsAccessibleRelation,
nsIWinAccessNode)
// nsIWinAccessNode
NS_IMETHODIMP
nsAccessibleRelationWrap::QueryNativeInterface(REFIID aIID, void** aInstancePtr)
{
return QueryInterface(aIID, aInstancePtr);
nsAccessible* target = nsnull;
while ((target = aRel->Next()))
mTargets.AppendElement(target);
}
// IUnknown
STDMETHODIMP
nsAccessibleRelationWrap::QueryInterface(REFIID iid, void** ppv)
ia2AccessibleRelation::QueryInterface(REFIID iid, void** ppv)
{
if (!ppv)
return E_INVALIDARG;
*ppv = NULL;
if (IID_IAccessibleRelation == iid || IID_IUnknown == iid) {
@ -80,63 +74,78 @@ nsAccessibleRelationWrap::QueryInterface(REFIID iid, void** ppv)
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE
ia2AccessibleRelation::AddRef()
{
return mReferences++;
}
ULONG STDMETHODCALLTYPE
ia2AccessibleRelation::Release()
{
mReferences--;
ULONG references = mReferences;
if (!mReferences)
delete this;
return references;
}
// IAccessibleRelation
STDMETHODIMP
nsAccessibleRelationWrap::get_relationType(BSTR *aRelationType)
ia2AccessibleRelation::get_relationType(BSTR *aRelationType)
{
__try {
if (!aRelationType)
return E_INVALIDARG;
*aRelationType = NULL;
PRUint32 type = 0;
nsresult rv = GetRelationType(&type);
if (NS_FAILED(rv))
return GetHRESULT(rv);
switch (type) {
case RELATION_CONTROLLED_BY:
switch (mType) {
case nsIAccessibleRelation::RELATION_CONTROLLED_BY:
*aRelationType = ::SysAllocString(IA2_RELATION_CONTROLLED_BY);
break;
case RELATION_CONTROLLER_FOR:
case nsIAccessibleRelation::RELATION_CONTROLLER_FOR:
*aRelationType = ::SysAllocString(IA2_RELATION_CONTROLLER_FOR);
break;
case RELATION_DESCRIBED_BY:
case nsIAccessibleRelation::RELATION_DESCRIBED_BY:
*aRelationType = ::SysAllocString(IA2_RELATION_DESCRIBED_BY);
break;
case RELATION_DESCRIPTION_FOR:
case nsIAccessibleRelation::RELATION_DESCRIPTION_FOR:
*aRelationType = ::SysAllocString(IA2_RELATION_DESCRIPTION_FOR);
break;
case RELATION_EMBEDDED_BY:
case nsIAccessibleRelation::RELATION_EMBEDDED_BY:
*aRelationType = ::SysAllocString(IA2_RELATION_EMBEDDED_BY);
break;
case RELATION_EMBEDS:
case nsIAccessibleRelation::RELATION_EMBEDS:
*aRelationType = ::SysAllocString(IA2_RELATION_EMBEDS);
break;
case RELATION_FLOWS_FROM:
case nsIAccessibleRelation::RELATION_FLOWS_FROM:
*aRelationType = ::SysAllocString(IA2_RELATION_FLOWS_FROM);
break;
case RELATION_FLOWS_TO:
case nsIAccessibleRelation::RELATION_FLOWS_TO:
*aRelationType = ::SysAllocString(IA2_RELATION_FLOWS_TO);
break;
case RELATION_LABEL_FOR:
case nsIAccessibleRelation::RELATION_LABEL_FOR:
*aRelationType = ::SysAllocString(IA2_RELATION_LABEL_FOR);
break;
case RELATION_LABELLED_BY:
case nsIAccessibleRelation::RELATION_LABELLED_BY:
*aRelationType = ::SysAllocString(IA2_RELATION_LABELED_BY);
break;
case RELATION_MEMBER_OF:
case nsIAccessibleRelation::RELATION_MEMBER_OF:
*aRelationType = ::SysAllocString(IA2_RELATION_MEMBER_OF);
break;
case RELATION_NODE_CHILD_OF:
case nsIAccessibleRelation::RELATION_NODE_CHILD_OF:
*aRelationType = ::SysAllocString(IA2_RELATION_NODE_CHILD_OF);
break;
case RELATION_PARENT_WINDOW_OF:
case nsIAccessibleRelation::RELATION_PARENT_WINDOW_OF:
*aRelationType = ::SysAllocString(IA2_RELATION_PARENT_WINDOW_OF);
break;
case RELATION_POPUP_FOR:
case nsIAccessibleRelation::RELATION_POPUP_FOR:
*aRelationType = ::SysAllocString(IA2_RELATION_POPUP_FOR);
break;
case RELATION_SUBWINDOW_OF:
case nsIAccessibleRelation::RELATION_SUBWINDOW_OF:
*aRelationType = ::SysAllocString(IA2_RELATION_SUBWINDOW_OF);
break;
default:
@ -150,9 +159,12 @@ __try {
}
STDMETHODIMP
nsAccessibleRelationWrap::get_localizedRelationType(BSTR *aLocalizedRelationType)
ia2AccessibleRelation::get_localizedRelationType(BSTR *aLocalizedRelationType)
{
__try {
if (!aLocalizedRelationType)
return E_INVALIDARG;
*aLocalizedRelationType = NULL;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
@ -160,17 +172,26 @@ __try {
}
STDMETHODIMP
nsAccessibleRelationWrap::get_nTargets(long *aNTargets)
ia2AccessibleRelation::get_nTargets(long *aNTargets)
{
__try {
*aNTargets = 0;
if (!aNTargets)
return E_INVALIDARG;
PRUint32 count = 0;
nsresult rv = GetTargetsCount(&count);
if (NS_FAILED(rv))
return GetHRESULT(rv);
*aNTargets = mTargets.Length();
return S_OK;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
return E_FAIL;
}
*aNTargets = count;
STDMETHODIMP
ia2AccessibleRelation::get_target(long aTargetIndex, IUnknown **aTarget)
{
__try {
if (aTargetIndex < 0 || aTargetIndex >= mTargets.Length() || !aTarget)
return E_INVALIDARG;
mTargets[aTargetIndex]->QueryInterface((const nsID&) IID_IUnknown, (void**) aTarget);
return S_OK;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
@ -178,77 +199,22 @@ __try {
}
STDMETHODIMP
nsAccessibleRelationWrap::get_target(long aTargetIndex, IUnknown **aTarget)
ia2AccessibleRelation::get_targets(long aMaxTargets, IUnknown **aTargets,
long *aNTargets)
{
__try {
nsCOMPtr<nsIAccessible> accessible;
nsresult rv = GetTarget(aTargetIndex, getter_AddRefs(accessible));
if (NS_FAILED(rv))
return GetHRESULT(rv);
if (!aNTargets || !aTargets)
return E_INVALIDARG;
nsCOMPtr<nsIWinAccessNode> winAccessNode(do_QueryInterface(accessible));
if (!winAccessNode)
return E_FAIL;
void *instancePtr = NULL;
rv = winAccessNode->QueryNativeInterface(IID_IUnknown, &instancePtr);
if (NS_FAILED(rv))
return GetHRESULT(rv);
*aTarget = static_cast<IUnknown*>(instancePtr);
return S_OK;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
return E_FAIL;
}
STDMETHODIMP
nsAccessibleRelationWrap::get_targets(long aMaxTargets, IUnknown **aTarget,
long *aNTargets)
{
__try {
*aNTargets = 0;
PRUint32 maxTargets = mTargets.Length();
if (maxTargets > aMaxTargets)
maxTargets = aMaxTargets;
nsCOMPtr<nsIArray> targets;
nsresult rv = GetTargets(getter_AddRefs(targets));
if (NS_FAILED(rv))
return GetHRESULT(rv);
for (PRUint32 idx = 0; idx < maxTargets; idx++)
get_target(idx, aTargets + idx);
PRUint32 length = 0;
rv = targets->GetLength(&length);
if (NS_FAILED(rv))
return GetHRESULT(rv);
if (length == 0)
return S_FALSE;
PRUint32 count = length < PRUint32(aMaxTargets) ? length : aMaxTargets;
PRUint32 index = 0;
for (; index < count; index++) {
nsCOMPtr<nsIWinAccessNode> winAccessNode =
do_QueryElementAt(targets, index, &rv);
if (NS_FAILED(rv))
break;
void *instancePtr = NULL;
nsresult rv = winAccessNode->QueryNativeInterface(IID_IUnknown,
&instancePtr);
if (NS_FAILED(rv))
break;
aTarget[index] = static_cast<IUnknown*>(instancePtr);
}
if (NS_FAILED(rv)) {
for (PRUint32 index2 = 0; index2 < index; index2++) {
aTarget[index2]->Release();
aTarget[index2] = NULL;
}
return GetHRESULT(rv);
}
*aNTargets = count;
*aNTargets = maxTargets;
return S_OK;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }

Просмотреть файл

@ -41,27 +41,22 @@
#ifndef _NS_ACCESSIBLE_RELATION_WRAP_H
#define _NS_ACCESSIBLE_RELATION_WRAP_H
#include "nsAccessibleRelation.h"
#include "nsAccessible.h"
#include "nsTArray.h"
#include "AccessibleRelation.h"
#include "nsIWinAccessNode.h"
#include "nsISupports.h"
class nsAccessibleRelationWrap: public nsAccessibleRelation,
public nsIWinAccessNode,
public IAccessibleRelation
class ia2AccessibleRelation : public IAccessibleRelation
{
public:
nsAccessibleRelationWrap(PRUint32 aType, nsIAccessible *aTarget);
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
// nsIWinAccessNode
NS_DECL_NSIWINACCESSNODE
ia2AccessibleRelation(PRUint32 aType, Relation* aRel);
virtual ~ia2AccessibleRelation() { }
// IUnknown
STDMETHODIMP QueryInterface(REFIID, void**);
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID aIID, void** aOutPtr);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
// IAccessibleRelation
virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_relationType(
@ -82,6 +77,17 @@ public:
/* [length_is][size_is][out] */ IUnknown **target,
/* [retval][out] */ long *nTargets);
inline bool HasTargets() const
{ return mTargets.Length(); }
private:
ia2AccessibleRelation();
ia2AccessibleRelation(const ia2AccessibleRelation&);
ia2AccessibleRelation& operator = (const ia2AccessibleRelation&);
PRUint32 mType;
nsTArray<nsRefPtr<nsAccessible> > mTargets;
ULONG mReferences;
};
#endif

Просмотреть файл

@ -41,12 +41,15 @@
#include "nsAccessibilityAtoms.h"
#include "nsAccUtils.h"
#include "nsCoreUtils.h"
#include "nsRelUtils.h"
#include "nsWinUtils.h"
#include "Relation.h"
#include "States.h"
#include "ia2AccessibleRelation.h"
#include "nsIAccessibleDocument.h"
#include "nsIAccessibleEvent.h"
#include "nsIAccessibleRelation.h"
#include "nsIAccessibleWin32Object.h"
#include "Accessible2_i.c"
@ -894,13 +897,15 @@ __try {
pvarEndUpAt->vt = VT_EMPTY;
if (xpRelation)
xpAccessibleResult = nsRelUtils::GetRelatedAccessible(this, xpRelation);
if (xpRelation) {
Relation rel = RelationByType(xpRelation);
xpAccessibleResult = rel.Next();
}
if (xpAccessibleResult) {
pvarEndUpAt->pdispVal = NativeAccessible(xpAccessibleResult);
pvarEndUpAt->vt = VT_DISPATCH;
return NS_OK;
return S_OK;
}
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
return E_FAIL;
@ -1056,12 +1061,21 @@ STDMETHODIMP
nsAccessibleWrap::get_nRelations(long *aNRelations)
{
__try {
PRUint32 count = 0;
nsresult rv = GetRelationsCount(&count);
*aNRelations = count;
if (!aNRelations)
return E_INVALIDARG;
return GetHRESULT(rv);
*aNRelations = 0;
if (IsDefunct())
return E_FAIL;
for (PRUint32 relType = nsIAccessibleRelation::RELATION_FIRST;
relType <= nsIAccessibleRelation::RELATION_LAST; relType++) {
Relation rel = RelationByType(relType);
if (rel.Next())
(*aNRelations)++;
}
return S_OK;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
return E_FAIL;
}
@ -1071,26 +1085,31 @@ nsAccessibleWrap::get_relation(long aRelationIndex,
IAccessibleRelation **aRelation)
{
__try {
if (!aRelation)
return E_INVALIDARG;
*aRelation = NULL;
nsCOMPtr<nsIAccessibleRelation> relation;
nsresult rv = GetRelation(aRelationIndex, getter_AddRefs(relation));
if (NS_FAILED(rv))
return GetHRESULT(rv);
nsCOMPtr<nsIWinAccessNode> winAccessNode(do_QueryInterface(relation));
if (!winAccessNode)
if (IsDefunct())
return E_FAIL;
void *instancePtr = NULL;
rv = winAccessNode->QueryNativeInterface(IID_IAccessibleRelation,
&instancePtr);
if (NS_FAILED(rv))
return GetHRESULT(rv);
PRUint32 relIdx = 0;
for (PRUint32 relType = nsIAccessibleRelation::RELATION_FIRST;
relType <= nsIAccessibleRelation::RELATION_LAST; relType++) {
Relation rel = RelationByType(relType);
nsRefPtr<ia2AccessibleRelation> ia2Relation =
new ia2AccessibleRelation(relType, &rel);
if (ia2Relation->HasTargets()) {
if (relIdx == aRelationIndex) {
ia2Relation.forget(aRelation);
return S_OK;
}
*aRelation = static_cast<IAccessibleRelation*>(instancePtr);
return S_OK;
relIdx++;
}
}
return E_INVALIDARG;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
return E_FAIL;
}
@ -1101,49 +1120,25 @@ nsAccessibleWrap::get_relations(long aMaxRelations,
long *aNRelations)
{
__try {
*aRelation = NULL;
if (!aRelation || !aNRelations)
return E_INVALIDARG;
*aNRelations = 0;
nsCOMPtr<nsIArray> relations;
nsresult rv = GetRelations(getter_AddRefs(relations));
if (NS_FAILED(rv))
return GetHRESULT(rv);
if (IsDefunct())
return E_FAIL;
PRUint32 length = 0;
rv = relations->GetLength(&length);
if (NS_FAILED(rv))
return GetHRESULT(rv);
if (length == 0)
return S_FALSE;
PRUint32 count = length < (PRUint32)aMaxRelations ? length : aMaxRelations;
PRUint32 index = 0;
for (; index < count; index++) {
nsCOMPtr<nsIWinAccessNode> winAccessNode =
do_QueryElementAt(relations, index, &rv);
if (NS_FAILED(rv))
break;
void *instancePtr = NULL;
nsresult rv = winAccessNode->QueryNativeInterface(IID_IAccessibleRelation,
&instancePtr);
if (NS_FAILED(rv))
break;
aRelation[index] = static_cast<IAccessibleRelation*>(instancePtr);
}
if (NS_FAILED(rv)) {
for (PRUint32 index2 = 0; index2 < index; index2++) {
aRelation[index2]->Release();
aRelation[index2] = NULL;
for (PRUint32 relType = nsIAccessibleRelation::RELATION_FIRST;
relType <= nsIAccessibleRelation::RELATION_LAST &&
*aNRelations < aMaxRelations; relType++) {
Relation rel = RelationByType(relType);
nsRefPtr<ia2AccessibleRelation> ia2Rel =
new ia2AccessibleRelation(relType, &rel);
if (ia2Rel->HasTargets()) {
ia2Rel.forget(aRelation + (*aNRelations));
(*aNRelations)++;
}
return GetHRESULT(rv);
}
*aNRelations = count;
return S_OK;
} __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }

Просмотреть файл

@ -66,7 +66,6 @@ EXPORTS = \
nsHyperTextAccessibleWrap.h \
nsHTMLImageAccessibleWrap.h \
nsHTMLTableAccessibleWrap.h \
nsAccessibleRelationWrap.h \
nsApplicationAccessibleWrap.h \
$(NULL)

Просмотреть файл

@ -49,6 +49,7 @@ LIBXUL_LIBRARY = 1
CPPSRCS = \
nsAccEvent.cpp \
nsAccessibleRelation.cpp \
$(NULL)
# we don't want the shared lib, but we want to force the creation of a static lib.

Просмотреть файл

@ -38,28 +38,30 @@
#include "nsAccessibleRelation.h"
#include "Relation.h"
#include "nsAccessible.h"
#include "nsArrayUtils.h"
#include "nsComponentManagerUtils.h"
nsAccessibleRelation::
nsAccessibleRelation(PRUint32 aType, nsIAccessible *aTarget) :
nsAccessibleRelation::nsAccessibleRelation(PRUint32 aType,
Relation* aRel) :
mType(aType)
{
mTargets = do_CreateInstance(NS_ARRAY_CONTRACTID);
if (aTarget)
mTargets->AppendElement(aTarget, PR_FALSE);
nsIAccessible* targetAcc = nsnull;
while ((targetAcc = aRel->Next()))
mTargets->AppendElement(targetAcc, false);
}
// nsISupports
NS_IMPL_ISUPPORTS2(nsAccessibleRelation, nsAccessibleRelation,
nsIAccessibleRelation)
NS_IMPL_ISUPPORTS1(nsAccessibleRelation, nsIAccessibleRelation)
// nsIAccessibleRelation
NS_IMETHODIMP
nsAccessibleRelation::GetRelationType(PRUint32 *aType)
{
NS_ENSURE_ARG_POINTER(aType);
*aType = mType;
return NS_OK;
}
@ -69,9 +71,6 @@ nsAccessibleRelation::GetTargetsCount(PRUint32 *aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
*aCount = 0;
NS_ENSURE_TRUE(mTargets, NS_ERROR_NOT_INITIALIZED);
return mTargets->GetLength(aCount);
}
@ -79,37 +78,16 @@ NS_IMETHODIMP
nsAccessibleRelation::GetTarget(PRUint32 aIndex, nsIAccessible **aTarget)
{
NS_ENSURE_ARG_POINTER(aTarget);
*aTarget = nsnull;
NS_ENSURE_TRUE(mTargets, NS_ERROR_NOT_INITIALIZED);
nsresult rv = NS_OK;
nsCOMPtr<nsIAccessible> target = do_QueryElementAt(mTargets, aIndex, &rv);
NS_ENSURE_SUCCESS(rv, rv);
target.swap(*aTarget);
return NS_OK;
target.forget(aTarget);
return rv;
}
NS_IMETHODIMP
nsAccessibleRelation::GetTargets(nsIArray **aTargets)
{
NS_ENSURE_ARG_POINTER(aTargets);
*aTargets = nsnull;
NS_ENSURE_TRUE(mTargets, NS_ERROR_NOT_INITIALIZED);
NS_ADDREF(*aTargets = mTargets);
return NS_OK;
}
// nsAccessibleRelation
nsresult
nsAccessibleRelation::AddTarget(nsIAccessible *aTarget)
{
NS_ENSURE_ARG(aTarget);
NS_ENSURE_TRUE(mTargets, NS_ERROR_NOT_INITIALIZED);
return mTargets->AppendElement(aTarget, PR_FALSE);
}

Просмотреть файл

@ -39,19 +39,12 @@
#ifndef _nsAccessibleRelation_H_
#define _nsAccessibleRelation_H_
#include "nsIAccessible.h"
#include "nsIAccessibleRelation.h"
#include "nsCOMPtr.h"
#include "nsIMutableArray.h"
#define NS_ACCRELATION_IMPL_CID \
{ \
0xb20390d0, \
0x40d3, \
0x4c76, \
{ 0xb6, 0x2e, 0xc2, 0x30, 0xc8, 0xea, 0x0c, 0x1e } \
}
class Relation;
/**
* Class represents an accessible relation.
@ -59,25 +52,18 @@
class nsAccessibleRelation: public nsIAccessibleRelation
{
public:
nsAccessibleRelation(PRUint32 aType, nsIAccessible *aTarget);
nsAccessibleRelation(PRUint32 aType, Relation* aRel);
NS_DECL_ISUPPORTS
NS_DECL_NSIACCESSIBLERELATION
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ACCRELATION_IMPL_CID)
/**
* Add target for the given key.
*
* @param aTarget - accessible target for the given relation.
*/
nsresult AddTarget(nsIAccessible *aTarget);
private:
nsAccessibleRelation();
nsAccessibleRelation(const nsAccessibleRelation&);
nsAccessibleRelation& operator = (const nsAccessibleRelation&);
PRUint32 mType;
nsCOMPtr<nsIMutableArray> mTargets;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsAccessibleRelation, NS_ACCRELATION_IMPL_CID)
#endif

Просмотреть файл

@ -44,12 +44,13 @@
#include "nsAccTreeWalker.h"
#include "nsCoreUtils.h"
#include "nsDocAccessible.h"
#include "nsRelUtils.h"
#include "Relation.h"
#include "States.h"
// NOTE: alphabetically ordered
#include "nsHTMLFormControlAccessible.h"
#include "nsXULMenuAccessible.h"
#include "nsIAccessibleRelation.h"
#include "nsIDOMHTMLInputElement.h"
#include "nsIDOMNSEditableElement.h"
#include "nsIDOMXULButtonElement.h"
@ -417,48 +418,41 @@ nsresult
nsXULGroupboxAccessible::GetNameInternal(nsAString& aName)
{
// XXX: we use the first related accessible only.
nsCOMPtr<nsIAccessible> label =
nsRelUtils::GetRelatedAccessible(this, nsIAccessibleRelation::RELATION_LABELLED_BY);
if (label) {
nsAccessible* label =
RelationByType(nsIAccessibleRelation::RELATION_LABELLED_BY).Next();
if (label)
return label->GetName(aName);
}
return NS_OK;
}
NS_IMETHODIMP
nsXULGroupboxAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsXULGroupboxAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType, aRelation);
NS_ENSURE_SUCCESS(rv, rv);
Relation rel = nsAccessibleWrap::RelationByType(aType);
if (aType != nsIAccessibleRelation::RELATION_LABELLED_BY)
return rel;
if (aRelationType == nsIAccessibleRelation::RELATION_LABELLED_BY) {
// The label for xul:groupbox is generated from xul:label that is
// inside the anonymous content of the xul:caption.
// The xul:label has an accessible object but the xul:caption does not
PRInt32 childCount = GetChildCount();
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
nsAccessible *childAcc = GetChildAt(childIdx);
if (childAcc->Role() == nsIAccessibleRole::ROLE_LABEL) {
// Ensure that it's our label
// XXX: we'll fail if group accessible expose more than one relation
// targets.
nsCOMPtr<nsIAccessible> testGroupboxAccessible =
nsRelUtils::GetRelatedAccessible(childAcc,
nsIAccessibleRelation::RELATION_LABEL_FOR);
if (testGroupboxAccessible == this) {
// The label for xul:groupbox is generated from xul:label that is
// inside the anonymous content of the xul:caption.
// The xul:label has an accessible object but the xul:caption does not
PRInt32 childCount = GetChildCount();
for (PRInt32 childIdx = 0; childIdx < childCount; childIdx++) {
nsAccessible *childAcc = GetChildAt(childIdx);
if (childAcc->Role() == nsIAccessibleRole::ROLE_LABEL) {
// Ensure that it's our label
Relation reverseRel =
childAcc->RelationByType(nsIAccessibleRelation::RELATION_LABEL_FOR);
nsAccessible* testGroupbox = nsnull;
while ((testGroupbox = reverseRel.Next()))
if (testGroupbox == this) {
// The <label> points back to this groupbox
return nsRelUtils::
AddTarget(aRelationType, aRelation, childAcc);
rel.AppendTarget(childAcc);
}
}
}
}
return NS_OK;
return rel;
}
////////////////////////////////////////////////////////////////////////////////

Просмотреть файл

@ -140,13 +140,10 @@ class nsXULGroupboxAccessible : public nsAccessibleWrap
public:
nsXULGroupboxAccessible(nsIContent *aContent, nsIWeakReference *aShell);
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual PRUint32 NativeRole();
virtual nsresult GetNameInternal(nsAString& aName);
virtual Relation RelationByType(PRUint32 aRelationType);
};
/**

Просмотреть файл

@ -39,10 +39,11 @@
#include "nsXULTabAccessible.h"
#include "nsAccUtils.h"
#include "nsRelUtils.h"
#include "Relation.h"
#include "States.h"
// NOTE: alphabetically ordered
#include "nsIAccessibleRelation.h"
#include "nsIDocument.h"
#include "nsIFrame.h"
#include "nsIDOMDocument.h"
@ -138,32 +139,28 @@ nsXULTabAccessible::NativeState()
}
// nsIAccessible
NS_IMETHODIMP
nsXULTabAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsXULTabAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType,
aRelation);
NS_ENSURE_SUCCESS(rv, rv);
if (aRelationType != nsIAccessibleRelation::RELATION_LABEL_FOR)
return NS_OK;
Relation rel = nsAccessibleWrap::RelationByType(aType);
if (aType != nsIAccessibleRelation::RELATION_LABEL_FOR)
return rel;
// Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible.
nsCOMPtr<nsIDOMXULRelatedElement> tabsElm =
do_QueryInterface(mContent->GetParent());
if (!tabsElm)
return NS_OK;
return rel;
nsCOMPtr<nsIDOMNode> DOMNode(GetDOMNode());
nsCOMPtr<nsIDOMNode> tabpanelNode;
tabsElm->GetRelatedElement(DOMNode, getter_AddRefs(tabpanelNode));
if (!tabpanelNode)
return NS_OK;
return rel;
nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode));
return nsRelUtils::AddTargetFromContent(aRelationType, aRelation,
tabpanelContent);
rel.AppendTarget(tabpanelContent);
return rel;
}
void
@ -244,29 +241,26 @@ nsXULTabpanelAccessible::NativeRole()
return nsIAccessibleRole::ROLE_PROPERTYPAGE;
}
NS_IMETHODIMP
nsXULTabpanelAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsXULTabpanelAccessible::RelationByType(PRUint32 aType)
{
nsresult rv = nsAccessibleWrap::GetRelationByType(aRelationType, aRelation);
NS_ENSURE_SUCCESS(rv, rv);
if (aRelationType != nsIAccessibleRelation::RELATION_LABELLED_BY)
return NS_OK;
Relation rel = nsAccessibleWrap::RelationByType(aType);
if (aType != nsIAccessibleRelation::RELATION_LABELLED_BY)
return rel;
// Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible.
nsCOMPtr<nsIDOMXULRelatedElement> tabpanelsElm =
do_QueryInterface(mContent->GetParent());
if (!tabpanelsElm)
return NS_OK;
return rel;
nsCOMPtr<nsIDOMNode> DOMNode(GetDOMNode());
nsCOMPtr<nsIDOMNode> tabNode;
tabpanelsElm->GetRelatedElement(DOMNode, getter_AddRefs(tabNode));
if (!tabNode)
return NS_OK;
return rel;
nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode));
return nsRelUtils::AddTargetFromContent(aRelationType, aRelation,
tabContent);
rel.AppendTarget(tabContent);
return rel;
}

Просмотреть файл

@ -56,14 +56,13 @@ public:
// nsIAccessible
NS_IMETHOD GetActionName(PRUint8 aIndex, nsAString& aName);
NS_IMETHOD DoAction(PRUint8 index);
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual void GetPositionAndSizeInternal(PRInt32 *aPosInSet,
PRInt32 *aSetSize);
virtual PRUint32 NativeRole();
virtual PRUint64 NativeState();
virtual Relation RelationByType(PRUint32 aType);
// ActionAccessible
virtual PRUint8 ActionCount();
@ -118,12 +117,9 @@ class nsXULTabpanelAccessible : public nsAccessibleWrap
public:
nsXULTabpanelAccessible(nsIContent *aContent, nsIWeakReference *aShell);
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual PRUint32 NativeRole();
virtual Relation RelationByType(PRUint32 aType);
};
#endif

Просмотреть файл

@ -44,10 +44,11 @@
#include "nsAccUtils.h"
#include "nsBaseWidgetAccessible.h"
#include "nsCoreUtils.h"
#include "nsRelUtils.h"
#include "nsTextEquivUtils.h"
#include "Relation.h"
#include "States.h"
#include "nsIAccessibleRelation.h"
#include "nsIDOMXULDescriptionElement.h"
#include "nsINameSpaceManager.h"
#include "nsString.h"
@ -88,25 +89,21 @@ nsXULTextAccessible::NativeState()
return nsHyperTextAccessibleWrap::NativeState() | states::READONLY;
}
NS_IMETHODIMP
nsXULTextAccessible::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsXULTextAccessible::RelationByType(PRUint32 aType)
{
nsresult rv =
nsHyperTextAccessibleWrap::GetRelationByType(aRelationType, aRelation);
NS_ENSURE_SUCCESS(rv, rv);
if (aRelationType == nsIAccessibleRelation::RELATION_LABEL_FOR) {
Relation rel = nsHyperTextAccessibleWrap::RelationByType(aType);
if (aType == nsIAccessibleRelation::RELATION_LABEL_FOR) {
// Caption is the label for groupbox
nsIContent *parent = mContent->GetParent();
if (parent && parent->Tag() == nsAccessibilityAtoms::caption) {
nsAccessible* parent = Parent();
if (parent && parent->Role() == nsIAccessibleRole::ROLE_GROUPING)
return nsRelUtils::AddTarget(aRelationType, aRelation, parent);
rel.AppendTarget(parent);
}
}
return NS_OK;
return rel;
}

Просмотреть файл

@ -48,18 +48,14 @@
*/
class nsXULTextAccessible : public nsHyperTextAccessibleWrap
{
public:
nsXULTextAccessible(nsIContent *aContent, nsIWeakReference *aShell);
// nsIAccessible
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
// nsAccessible
virtual nsresult GetNameInternal(nsAString& aName);
virtual PRUint32 NativeRole();
virtual PRUint64 NativeState();
virtual Relation RelationByType(PRUint32 aRelationType);
};
/**

Просмотреть файл

@ -1,4 +1,5 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -42,9 +43,10 @@
#include "nsAccUtils.h"
#include "nsCoreUtils.h"
#include "nsDocAccessible.h"
#include "nsRelUtils.h"
#include "Relation.h"
#include "States.h"
#include "nsIAccessibleRelation.h"
#include "nsIDOMXULElement.h"
#include "nsIDOMXULMultSelectCntrlEl.h"
#include "nsIDOMXULTreeElement.h"
@ -756,32 +758,26 @@ nsXULTreeItemAccessibleBase::TakeFocus()
return nsAccessible::TakeFocus();
}
NS_IMETHODIMP
nsXULTreeItemAccessibleBase::GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation)
Relation
nsXULTreeItemAccessibleBase::RelationByType(PRUint32 aType)
{
NS_ENSURE_ARG_POINTER(aRelation);
*aRelation = nsnull;
if (aType != nsIAccessibleRelation::RELATION_NODE_CHILD_OF)
return nsAccessible::RelationByType(aType);
if (IsDefunct())
return NS_ERROR_FAILURE;
if (aRelationType == nsIAccessibleRelation::RELATION_NODE_CHILD_OF) {
Relation rel;
PRInt32 parentIndex;
if (NS_SUCCEEDED(mTreeView->GetParentIndex(mRow, &parentIndex))) {
if (parentIndex == -1)
return nsRelUtils::AddTarget(aRelationType, aRelation, mParent);
if (!NS_SUCCEEDED(mTreeView->GetParentIndex(mRow, &parentIndex)))
return rel;
nsRefPtr<nsXULTreeAccessible> treeAcc = do_QueryObject(mParent);
nsAccessible *logicalParent = treeAcc->GetTreeItemAccessible(parentIndex);
return nsRelUtils::AddTarget(aRelationType, aRelation, logicalParent);
}
return NS_OK;
if (parentIndex == -1) {
rel.AppendTarget(mParent);
return rel;
}
return nsAccessible::GetRelationByType(aRelationType, aRelation);
nsRefPtr<nsXULTreeAccessible> treeAcc = do_QueryObject(mParent);
rel.AppendTarget(treeAcc->GetTreeItemAccessible(parentIndex));
return rel;
}
PRUint8

Просмотреть файл

@ -188,9 +188,6 @@ public:
NS_IMETHOD SetSelected(PRBool aSelect);
NS_IMETHOD TakeFocus();
NS_IMETHOD GetRelationByType(PRUint32 aRelationType,
nsIAccessibleRelation **aRelation);
NS_IMETHOD GroupPosition(PRInt32 *aGroupLevel,
PRInt32 *aSimilarItemsInGroup,
PRInt32 *aPositionInGroup);
@ -206,6 +203,7 @@ public:
// nsAccessible
virtual PRUint64 NativeState();
virtual PRInt32 IndexInParent() const;
virtual Relation RelationByType(PRUint32 aType);
virtual nsAccessible* FocusedChild();
// ActionAccessible

Просмотреть файл

@ -156,10 +156,6 @@ endif
include $(topsrcdir)/config/rules.mk
ifeq ($(MOZ_WIDGET_TOOLKIT),photon)
LIBS += -lphexlib
endif
ifeq ($(OS_ARCH),WINNT)
#
# Control the default heap size.

Просмотреть файл

@ -1,6 +1,6 @@
dnl check if the build is using lto. This is really primitive and only detects llvm based
dnl compilers right now.
AC_DEFUN(MOZ_DOING_LTO,
AC_DEFUN([MOZ_DOING_LTO],
[
cat > conftest.c <<EOF
int foo = 1;

Просмотреть файл

@ -37,7 +37,7 @@ dnl
dnl ***** END LICENSE BLOCK *****
dnl MOZ_CHECK_HEADER(HEADER-FILE, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
AC_DEFUN(MOZ_CHECK_HEADER,
AC_DEFUN([MOZ_CHECK_HEADER],
[ dnl Do the transliteration at runtime so arg 1 can be a shell variable.
ac_safe=`echo "$1" | sed 'y%./+-%__p_%'`
AC_MSG_CHECKING([for $1])
@ -55,7 +55,7 @@ AC_DEFUN(MOZ_CHECK_HEADER,
])
dnl MOZ_CHECK_HEADERS(HEADER-FILE... [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
AC_DEFUN(MOZ_CHECK_HEADERS,
AC_DEFUN([MOZ_CHECK_HEADERS],
[ for ac_hdr in $1
do
MOZ_CHECK_HEADER($ac_hdr,

Просмотреть файл

@ -49,7 +49,7 @@ dnl
dnl for example:
dnl MOZ_N_BYTE_TYPE([JS_INT32_T], [4], [int long 'long long' short])
dnl
AC_DEFUN(MOZ_N_BYTE_TYPE,
AC_DEFUN([MOZ_N_BYTE_TYPE],
[
dnl The simplest approach would simply be to run a program that says
dnl printf ("%d\n", sizeof ($type));
@ -83,7 +83,7 @@ dnl found.
dnl
dnl for example:
dnl MOZ_SIZE_OF_TYPE([JS_BYTES_PER_WORD], [void*], [4 8])
AC_DEFUN(MOZ_SIZE_OF_TYPE,
AC_DEFUN([MOZ_SIZE_OF_TYPE],
[
AC_CACHE_CHECK([for the size of $2], moz_cv_size_of_$1, [
moz_cv_size_of_$1=
@ -113,7 +113,7 @@ dnl found.
dnl
dnl for example:
dnl MOZ_ALIGN_OF_TYPE(JS_ALIGN_OF_POINTER, void*, 2 4 8 16)
AC_DEFUN(MOZ_ALIGN_OF_TYPE,
AC_DEFUN([MOZ_ALIGN_OF_TYPE],
[
AC_CACHE_CHECK([for the alignment of $2], moz_cv_align_of_$1, [
moz_cv_align_of_$1=

Просмотреть файл

@ -36,14 +36,14 @@ dnl the terms of any one of the MPL, the GPL or the LGPL.
dnl
dnl ***** END LICENSE BLOCK *****
AC_DEFUN(MOZ_PROG_CHECKMSYS,
AC_DEFUN([MOZ_PROG_CHECKMSYS],
[AC_REQUIRE([AC_INIT_BINSH])dnl
if test `uname -s | grep -c MINGW 2>/dev/null` != "0"; then
msyshost=1
fi
])
AC_DEFUN(MOZ_PATH_PROG,
AC_DEFUN([MOZ_PATH_PROG],
[ AC_PATH_PROG($1,$2,$3,$4)
if test "$msyshost"; then
case "[$]$1" in
@ -59,7 +59,7 @@ AC_DEFUN(MOZ_PATH_PROG,
fi
])
AC_DEFUN(MOZ_PATH_PROGS,
AC_DEFUN([MOZ_PATH_PROGS],
[ AC_PATH_PROGS($1,$2,$3,$4)
if test "$msyshost"; then
case "[$]$1" in

Просмотреть файл

@ -5,7 +5,7 @@
dnl AM_PATH_NSS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
dnl Test for NSS, and define NSS_CFLAGS and NSS_LIBS
AC_DEFUN(AM_PATH_NSS,
AC_DEFUN([AM_PATH_NSS],
[dnl
AC_ARG_WITH(nss-prefix,

Просмотреть файл

@ -0,0 +1,13 @@
if test -z "$CC" ; then
CC=gcc-4.2
fi
if test -z "$CXX" ; then
CXX=g++-4.2
fi
# We do 32 bit builds for leopard
CC="$CC -arch i386"
CXX="$CXX -arch i386"
ac_add_options --with-macos-sdk=/Developer/SDKs/MacOSX10.5.sdk

Просмотреть файл

@ -65,15 +65,20 @@ public class ASMozStub extends android.app.Service {
Timer timer = null;
@SuppressWarnings("unchecked")
private static final Class[] mStartForegroundSignature = new Class[] {
private static final Class<?>[] mSetForegroundSignature = new Class[] {
boolean.class};
@SuppressWarnings("unchecked")
private static final Class<?>[] mStartForegroundSignature = new Class[] {
int.class, Notification.class};
@SuppressWarnings("unchecked")
private static final Class[] mStopForegroundSignature = new Class[] {
private static final Class<?>[] mStopForegroundSignature = new Class[] {
boolean.class};
private NotificationManager mNM;
private Method mSetForeground;
private Method mStartForeground;
private Method mStopForeground;
private Object[] mSetForegroundArgs = new Object[1];
private Object[] mStartForegroundArgs = new Object[2];
private Object[] mStopForegroundArgs = new Object[1];
@ -97,6 +102,13 @@ public class ASMozStub extends android.app.Service {
mStartForeground = mStopForeground = null;
}
try {
mSetForeground = getClass().getMethod("setForeground", mSetForegroundSignature);
}
catch (NoSuchMethodException e) {
mSetForeground = null;
}
doToast("Listener Service created...");
}
@ -183,7 +195,18 @@ public class ASMozStub extends android.app.Service {
}
// Fall back on the old API.
setForeground(true);
if (mSetForeground != null) {
try {
mSetForegroundArgs[0] = Boolean.TRUE;
mSetForeground.invoke(this, mSetForegroundArgs);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
mNM.notify(id, notification);
}
@ -210,6 +233,17 @@ public class ASMozStub extends android.app.Service {
// Fall back on the old API. Note to cancel BEFORE changing the
// foreground state, since we could be killed at that point.
mNM.cancel(id);
setForeground(false);
if (mSetForeground != null) {
try {
mSetForegroundArgs[0] = Boolean.FALSE;
mSetForeground.invoke(this, mSetForegroundArgs);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}

Просмотреть файл

@ -137,7 +137,7 @@ public class DoCommand {
String ffxProvider = "org.mozilla.ffxcp";
String fenProvider = "org.mozilla.fencp";
private final String prgVersion = "SUTAgentAndroid Version 1.01";
private final String prgVersion = "SUTAgentAndroid Version 1.02";
public enum Command
{

Просмотреть файл

@ -531,7 +531,6 @@ MOZ_TREE_FREETYPE = @MOZ_TREE_FREETYPE@
MOZ_ENABLE_CAIRO_FT = @MOZ_ENABLE_CAIRO_FT@
MOZ_ENABLE_GTK2 = @MOZ_ENABLE_GTK2@
MOZ_ENABLE_QT = @MOZ_ENABLE_QT@
MOZ_ENABLE_PHOTON = @MOZ_ENABLE_PHOTON@
MOZ_ENABLE_XREMOTE = @MOZ_ENABLE_XREMOTE@
MOZ_ENABLE_DWRITE_FONT = @MOZ_ENABLE_DWRITE_FONT@
MOZ_ENABLE_D2D_SURFACE = @MOZ_ENABLE_D2D_SURFACE@

Просмотреть файл

@ -565,14 +565,6 @@ pcfs/pc_dir.h
Pgenerr.h
PGenErr.h
Ph.h
photon/Pg.h
photon/PhProto.h
photon/PhRender.h
photon/PpProto.h
photon/PtProgress.h
photon/PtServer.h
photon/PtWebClient.h
photon/PxImage.h
pk11func.h
pk11pub.h
pkcs11t.h

Просмотреть файл

@ -1360,8 +1360,6 @@ OSF1)
OS_2)
HOST_OS_ARCH=OS2
;;
QNX)
;;
SCO_SV)
HOST_OS_ARCH=SCOOS
;;
@ -1450,14 +1448,6 @@ OS_2)
OS_TARGET=OS2
OS_RELEASE=`uname -v`
;;
QNX)
if test "$OS_TARGET" != "NTO"; then
changequote(,)
OS_RELEASE=`uname -v | sed 's/^\([0-9]\)\([0-9]*\)$/\1.\2/'`
changequote([,])
fi
OS_TEST=x86
;;
SCO_SV)
OS_ARCH=SCOOS
OS_RELEASE=5.0
@ -2499,37 +2489,6 @@ ia64*-hpux*)
MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,lib$(LIBRARY_NAME)$(DLL_SUFFIX) -o $@'
;;
*-nto*)
AC_DEFINE(NTO)
AC_DEFINE(_QNX_SOURCE)
AC_DEFINE(_i386)
OS_TARGET=NTO
WARNINGS_AS_ERRORS=''
MOZ_OPTIMIZE_FLAGS="-O"
MOZ_DEBUG_FLAGS="-gstabs"
USE_PTHREADS=1
_PEDANTIC=
LIBS="$LIBS -lsocket -lstdc++"
_DEFINES_CFLAGS='-include $(DEPTH)/mozilla-config.h -DMOZILLA_CLIENT -D_POSIX_C_SOURCE=199506'
_DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -include $(DEPTH)/mozilla-config.h -D_POSIX_C_SOURCE=199506'
if test "$with_x" != "yes"
then
_PLATFORM_DEFAULT_TOOLKIT="photon"
TK_CFLAGS='-I/usr/include/photon'
TK_LIBS='-lph'
fi
case "${target_cpu}" in
ppc*)
AC_DEFINE(HAVE_VA_LIST_AS_ARRAY)
;;
esac
case "${host_cpu}" in
i*86)
USE_ELF_DYNSTR_GC=1
;;
esac
;;
*-openbsd*)
if test "$SO_VERSION"; then
DLL_SUFFIX=".so.$SO_VERSION"
@ -2636,20 +2595,6 @@ alpha*-*-osf*)
AC_DEFINE(NEED_USLEEP_PROTOTYPE)
;;
*-qnx*)
DIRENT_INO=d_stat.st_ino
dnl Solves the problems the QNX compiler has with nsCOMPtr.h.
AC_DEFINE(NSCAP_DISABLE_TEST_DONTQUERY_CASES)
AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES)
dnl Explicit set STDC_HEADERS to workaround QNX 6.0's failing of std test
AC_DEFINE(STDC_HEADERS)
if test "$no_x" = "yes"; then
_PLATFORM_DEFAULT_TOOLKIT='photon'
TK_CFLAGS='-I/usr/nto/include/photon'
TK_LIBS='-lphoton -lphrender'
fi
;;
*-sco*)
AC_DEFINE(NSCAP_DISABLE_TEST_DONTQUERY_CASES)
AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES)
@ -4963,7 +4908,6 @@ MOZ_ARG_HEADER(Toolkit Options)
Select default toolkit
Platform specific defaults:
Mac OS X - cairo-cocoa
Neutrino/QNX - photon
OS/2 - cairo-os2
Win32 - cairo-windows
Gtk2 with DirectFB - cairo-gtk2-dfb
@ -4972,8 +4916,7 @@ MOZ_ARG_HEADER(Toolkit Options)
[ _DEFAULT_TOOLKIT=$enableval ],
[ _DEFAULT_TOOLKIT=$_PLATFORM_DEFAULT_TOOLKIT])
if test "$_DEFAULT_TOOLKIT" = "photon" \
-o "$_DEFAULT_TOOLKIT" = "cairo-windows" \
if test "$_DEFAULT_TOOLKIT" = "cairo-windows" \
-o "$_DEFAULT_TOOLKIT" = "cairo-gtk2" \
-o "$_DEFAULT_TOOLKIT" = "cairo-gtk2-dfb" \
-o "$_DEFAULT_TOOLKIT" = "cairo-gtk2-x11" \
@ -4994,10 +4937,6 @@ dnl = Enable the toolkit as needed =
dnl ========================================================
case "$MOZ_WIDGET_TOOLKIT" in
photon)
MOZ_ENABLE_PHOTON=1
AC_DEFINE(MOZ_WIDGET_PHOTON)
;;
cairo-windows)
MOZ_WIDGET_TOOLKIT=windows
@ -5252,7 +5191,6 @@ AC_SUBST(TK_CFLAGS)
AC_SUBST(TK_LIBS)
AC_SUBST(MOZ_ENABLE_GTK2)
AC_SUBST(MOZ_ENABLE_PHOTON)
AC_SUBST(MOZ_ENABLE_QT)
AC_SUBST(MOZ_ENABLE_QTNETWORK)
AC_SUBST(MOZ_ENABLE_QMSYSTEM2)
@ -7501,6 +7439,7 @@ else
AC_MSG_RESULT([no])
WIN32_NEW_STYLE_JEMALLOC=1
AC_DEFINE(WIN32_NEW_STYLE_JEMALLOC)
WIN32_CRT_SRC_DIR=
if test -z "$MOZ_DEBUG"; then
WIN32_CRT_LIBS="msvcrt.lib msvcprt.lib"
else
@ -7510,7 +7449,7 @@ else
WIN32_CRTDLL_FULLPATH=`lib -nologo -list $WIN32_CRT_LIBS | grep crtdll\\.obj`
lib -NOLOGO -OUT:crtdll.obj $WIN32_CRT_LIBS -EXTRACT:$WIN32_CRTDLL_FULLPATH
if grep -q '__imp__\{0,1\}free' crtdll.obj; then
MOZ_MEMORY_LDFLAGS='-MANIFEST:NO -LIBPATH:$(DIST)/lib -NODEFAULTLIB:msvcrt -NODEFAULTLIB:msvcrtd -NODEFAULTLIB:msvcprt -NODEFAULTLIB:msvcprtd -DEFAULTLIB:mozcrt'
MOZ_MEMORY_LDFLAGS='-LIBPATH:$(DIST)/lib -NODEFAULTLIB:msvcrt -NODEFAULTLIB:msvcrtd -NODEFAULTLIB:msvcprt -NODEFAULTLIB:msvcprtd -DEFAULTLIB:mozcrt'
else
MOZ_MEMORY_LDFLAGS='$(DIST)/../memory/jemalloc/jemalloc.lib'
fi

Просмотреть файл

@ -1692,6 +1692,10 @@ protected:
// True if we're an SVG document being used as an image.
PRPackedBool mIsBeingUsedAsImage;
// True is this document is synthetic : stand alone image, video, audio
// file, etc.
PRPackedBool mIsSyntheticDocument;
// The document's script global object, the object from which the
// document can get its script context and scope. This is the
// *inner* window object.

Просмотреть файл

@ -48,7 +48,6 @@
#include "mozilla/css/Declaration.h"
#include "nsIHTMLDocument.h"
#include "nsIDocument.h"
#include "nsTPtrArray.h"
#include "nsContentUtils.h"
#include "nsReadableUtils.h"
#include "prprf.h"
@ -59,7 +58,7 @@ namespace css = mozilla::css;
#define MISC_STR_PTR(_cont) \
reinterpret_cast<void*>((_cont)->mStringBits & NS_ATTRVALUE_POINTERVALUE_MASK)
nsTPtrArray<const nsAttrValue::EnumTable>* nsAttrValue::sEnumTableArray = nsnull;
nsTArray<const nsAttrValue::EnumTable*>* nsAttrValue::sEnumTableArray = nsnull;
nsAttrValue::nsAttrValue()
: mBits(0)
@ -107,7 +106,7 @@ nsAttrValue::Init()
{
NS_ASSERTION(!sEnumTableArray, "nsAttrValue already initialized");
sEnumTableArray = new nsTPtrArray<const EnumTable>;
sEnumTableArray = new nsTArray<const EnumTable*>;
NS_ENSURE_TRUE(sEnumTableArray, NS_ERROR_OUT_OF_MEMORY);
return NS_OK;

Просмотреть файл

@ -58,7 +58,6 @@ class nsIAtom;
class nsISVGValue;
class nsIDocument;
template<class E, class A> class nsTArray;
template<class E, class A> class nsTPtrArray;
struct nsTArrayDefaultAllocator;
namespace mozilla {
@ -377,7 +376,7 @@ private:
PRBool aCanBePercent = PR_FALSE,
PRBool* aIsPercent = nsnull) const;
static nsTPtrArray<const EnumTable, nsTArrayDefaultAllocator>* sEnumTableArray;
static nsTArray<const EnumTable*, nsTArrayDefaultAllocator>* sEnumTableArray;
PtrBits mBits;
};

Просмотреть файл

@ -134,7 +134,6 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_XTFSERVICE_CID);
#include "nsAttrName.h"
#include "nsIDOMUserDataHandler.h"
#include "nsContentCreatorFunctions.h"
#include "nsTPtrArray.h"
#include "nsGUIEvent.h"
#include "nsMutationEvent.h"
#include "nsIMEStateManager.h"
@ -1558,7 +1557,7 @@ nsContentUtils::GetCommonAncestor(nsINode* aNode1,
}
// Build the chain of parents
nsAutoTPtrArray<nsINode, 30> parents1, parents2;
nsAutoTArray<nsINode*, 30> parents1, parents2;
do {
parents1.AppendElement(aNode1);
aNode1 = aNode1->GetNodeParent();

Просмотреть файл

@ -5919,6 +5919,13 @@ nsDocument::SetXmlStandalone(PRBool aXmlStandalone)
return IsHTML() ? NS_ERROR_DOM_NOT_SUPPORTED_ERR : NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDocument::GetMozSyntheticDocument(PRBool *aSyntheticDocument)
{
*aSyntheticDocument = mIsSyntheticDocument;
return NS_OK;
}
NS_IMETHODIMP
nsDocument::GetXmlVersion(nsAString& aXmlVersion)
{

Просмотреть файл

@ -523,7 +523,7 @@ public:
virtual void NotifyPossibleTitleChange(PRBool aBoundTitleElement);
virtual void SetDocumentURI(nsIURI* aURI);
/**
* Set the principal responsible for this document.
*/

Просмотреть файл

@ -142,7 +142,6 @@
#include "mozAutoDocUpdate.h"
#include "nsCSSParser.h"
#include "nsTPtrArray.h"
#include "prprf.h"
#include "nsSVGFeatures.h"
@ -756,7 +755,7 @@ nsINode::CompareDocPosition(nsINode* aOtherNode)
return 0;
}
nsAutoTPtrArray<nsINode, 32> parents1, parents2;
nsAutoTArray<nsINode*, 32> parents1, parents2;
nsINode *node1 = aOtherNode, *node2 = this;

Просмотреть файл

@ -224,6 +224,14 @@ if (false) {
is(textarea.value, val);
textarea.value="";
// ============ NOSCRIPT should not be copied
copyChildrenToClipboard("div13");
testSelectionToString("__");
testClipboardValue("text/unicode", "__");
testClipboardValue("text/html", "<div id=\"div13\">__</div>");
testPasteText("__");
// ============ manipulating Selection in oncopy
copyRangeToClipboard($("div11").childNodes[0],0, $("div11").childNodes[1],2);
@ -311,6 +319,8 @@ x.appendChild(document.createTextNode('10'))
<div id="div11" oncopy="modifySelection('X')"><span>div</span>11</div>
<div id="div12" oncopy="modifySelection('X<b style=\'display:none\'>Y</b>')"><span>div</span>12</div>
<div id="div13">_<noscript>FAIL</noscript>_</div>
</div>
</body>
</html>

Просмотреть файл

@ -413,7 +413,7 @@ nsTextStateManager::Init(nsIWidget* aWidget,
PRBool aWantUpdates)
{
mWidget = aWidget;
MOZ_ASSERT(mWidget);
if (!aWantUpdates) {
mEditableNode = aNode;
return NS_OK;
@ -501,10 +501,13 @@ public:
SelectionChangeEvent(nsIWidget *widget)
: mWidget(widget)
{
MOZ_ASSERT(mWidget);
}
NS_IMETHOD Run() {
mWidget->OnIMESelectionChange();
if(mWidget) {
mWidget->OnIMESelectionChange();
}
return NS_OK;
}
@ -520,7 +523,7 @@ nsTextStateManager::NotifySelectionChanged(nsIDOMDocument* aDoc,
PRInt32 count = 0;
nsresult rv = aSel->GetRangeCount(&count);
NS_ENSURE_SUCCESS(rv, rv);
if (count > 0) {
if (count > 0 && mWidget) {
nsContentUtils::AddScriptRunner(new SelectionChangeEvent(mWidget));
}
return NS_OK;
@ -536,10 +539,13 @@ public:
, mOldEnd(oldEnd)
, mNewEnd(newEnd)
{
MOZ_ASSERT(mWidget);
}
NS_IMETHOD Run() {
mWidget->OnIMETextChange(mStart, mOldEnd, mNewEnd);
if(mWidget) {
mWidget->OnIMETextChange(mStart, mOldEnd, mNewEnd);
}
return NS_OK;
}

Просмотреть файл

@ -41,7 +41,6 @@
#include "nsGenericHTMLElement.h"
#include "nsIDOMHTMLFieldSetElement.h"
#include "nsIConstraintValidation.h"
#include "nsTPtrArray.h"
class nsHTMLFieldSetElement : public nsGenericHTMLFormElement,
@ -113,7 +112,7 @@ private:
nsRefPtr<nsContentList> mElements;
// List of elements which have this fieldset as first fieldset ancestor.
nsTPtrArray<nsGenericHTMLFormElement> mDependentElements;
nsTArray<nsGenericHTMLFormElement*> mDependentElements;
nsIContent* mFirstLegend;
};

Просмотреть файл

@ -150,6 +150,8 @@ MediaDocument::Init()
getter_AddRefs(mStringBundle));
}
mIsSyntheticDocument = PR_TRUE;
return NS_OK;
}

Просмотреть файл

@ -39,17 +39,15 @@
#ifndef txOwningArray_h__
#define txOwningArray_h__
#include "nsTPtrArray.h"
// Class acting like a nsTPtrArray except that it deletes its objects
// Class acting like a nsTArray except that it deletes its objects
// on destruction. It does not however delete its objects on operations
// like RemoveElementsAt or on |array[i] = bar|.
template<class E>
class txOwningArray : public nsTPtrArray<E>
class txOwningArray : public nsTArray<E*>
{
public:
typedef nsTPtrArray<E> base_type;
typedef nsTArray<E*> base_type;
typedef typename base_type::elem_type elem_type;
~txOwningArray()

Просмотреть файл

@ -317,7 +317,7 @@ txStylesheet::doneCompiling()
frameIter.reset();
ImportFrame* frame;
while ((frame = static_cast<ImportFrame*>(frameIter.next()))) {
nsTPtrArray<txStripSpaceTest> frameStripSpaceTests;
nsTArray<txStripSpaceTest*> frameStripSpaceTests;
txListIterator itemIter(&frame->mToplevelItems);
itemIter.resetToEnd();
@ -502,7 +502,7 @@ txStylesheet::addFrames(txListIterator& aInsertIter)
nsresult
txStylesheet::addStripSpace(txStripSpaceItem* aStripSpaceItem,
nsTPtrArray<txStripSpaceTest>& aFrameStripSpaceTests)
nsTArray<txStripSpaceTest*>& aFrameStripSpaceTests)
{
PRInt32 testCount = aStripSpaceItem->mStripSpaceTests.Length();
for (; testCount > 0; --testCount) {

Просмотреть файл

@ -43,7 +43,6 @@
#include "txExpandedNameMap.h"
#include "txList.h"
#include "txXSLTPatterns.h"
#include "nsTPtrArray.h"
#include "nsISupportsImpl.h"
class txInstruction;
@ -145,7 +144,7 @@ private:
nsresult addGlobalVariable(txVariableItem* aVariable);
nsresult addFrames(txListIterator& aInsertIter);
nsresult addStripSpace(txStripSpaceItem* aStripSpaceItem,
nsTPtrArray<txStripSpaceTest>& aFrameStripSpaceTests);
nsTArray<txStripSpaceTest*>& aFrameStripSpaceTests);
nsresult addAttributeSet(txAttributeSetItem* aAttributeSetItem);
// List of ImportFrames

Просмотреть файл

@ -133,7 +133,7 @@ public:
nsresult addStripSpaceTest(txStripSpaceTest* aStripSpaceTest);
nsTPtrArray<txStripSpaceTest> mStripSpaceTests;
nsTArray<txStripSpaceTest*> mStripSpaceTests;
};
// xsl:template

Просмотреть файл

@ -46,7 +46,6 @@
#define nsXULControllers_h__
#include "nsCOMPtr.h"
#include "nsTPtrArray.h"
#include "nsWeakPtr.h"
#include "nsIControllers.h"
#include "nsISecurityCheckedComponent.h"
@ -97,7 +96,7 @@ protected:
void DeleteControllers();
nsTPtrArray<nsXULControllerData> mControllers;
nsTArray<nsXULControllerData*> mControllers;
PRUint32 mCurControllerID;
};

Просмотреть файл

@ -42,7 +42,6 @@
#include "nsIInterfaceRequestorUtils.h"
#include "nsIServiceManager.h"
#include "nsIEnumerator.h"
#include "nsTPtrArray.h"
#include "nsGkAtoms.h"
#include "nsContentUtils.h"
#include "nsIDocument.h"
@ -1298,7 +1297,7 @@ nsFocusManager::GetCommonAncestor(nsPIDOMWindow* aWindow1,
nsCOMPtr<nsIDocShellTreeItem> dsti2 = do_QueryInterface(webnav);
NS_ENSURE_TRUE(dsti2, nsnull);
nsAutoTPtrArray<nsIDocShellTreeItem, 30> parents1, parents2;
nsAutoTArray<nsIDocShellTreeItem*, 30> parents1, parents2;
do {
parents1.AppendElement(dsti1);
nsCOMPtr<nsIDocShellTreeItem> parentDsti1;

Просмотреть файл

@ -10075,6 +10075,19 @@ nsGlobalWindow::HasPerformanceSupport()
return Preferences::GetBool("dom.enable_performance", PR_FALSE);
}
PRInt64
nsGlobalWindow::SizeOf() const
{
PRInt64 size = sizeof(*this);
if (IsInnerWindow() && mDoc) {
size += mDoc->SizeOf();
}
size += mNavigator ? mNavigator->SizeOf() : 0;
return size;
}
// nsGlobalChromeWindow implementation
@ -11227,3 +11240,21 @@ NS_IMETHODIMP nsNavigator::GetMozNotification(nsIDOMDesktopNotificationCenter **
NS_ADDREF(*aRetVal = mNotification);
return NS_OK;
}
PRInt64
nsNavigator::SizeOf() const
{
PRInt64 size = sizeof(*this);
// TODO: add SizeOf() to nsMimeTypeArray, bug 674113.
size += mMimeTypes ? sizeof(*mMimeTypes.get()) : 0;
// TODO: add SizeOf() to nsPluginArray, bug 674114.
size += mPlugins ? sizeof(*mPlugins.get()) : 0;
// TODO: add SizeOf() to nsGeolocation, bug 674115.
size += mGeolocation ? sizeof(*mGeolocation.get()) : 0;
// TODO: add SizeOf() to nsDesktopNotificationCenter, bug 674116.
size += mNotification ? sizeof(*mNotification.get()) : 0;
return size;
}

Просмотреть файл

@ -538,15 +538,7 @@ public:
return sWindowsById;
}
PRInt64 SizeOf() const {
PRInt64 size = sizeof(*this);
if (IsInnerWindow() && mDoc) {
size += mDoc->SizeOf();
}
return size;
}
PRInt64 SizeOf() const;
private:
// Enable updates for the accelerometer.
@ -1076,6 +1068,8 @@ public:
static bool HasDesktopNotificationSupport();
PRInt64 SizeOf() const;
protected:
nsRefPtr<nsMimeTypeArray> mMimeTypes;
nsRefPtr<nsPluginArray> mPlugins;

Просмотреть файл

@ -62,7 +62,7 @@ interface nsIDOMLocation;
* http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html
*/
[scriptable, uuid(d53c3d3d-2413-4abc-b54e-11c5c8380776)]
[scriptable, uuid(10034b87-384e-4e19-902c-c4edafb899be)]
interface nsIDOMDocument : nsIDOMNode
{
readonly attribute nsIDOMDocumentType doctype;
@ -316,6 +316,12 @@ interface nsIDOMDocument : nsIDOMNode
*/
readonly attribute DOMString contentType;
/**
* True if this document is synthetic : stand alone image, video, audio file,
* etc.
*/
readonly attribute boolean mozSyntheticDocument;
/**
* Returns the script element whose script is currently being processed.
*

Просмотреть файл

@ -527,12 +527,14 @@ ContentParent::RecvGetClipboardText(const PRInt32& whichClipboard, nsString* tex
clipboard->GetData(trans, whichClipboard);
nsCOMPtr<nsISupports> tmp;
PRUint32 len;
rv = trans->GetTransferData(kUnicodeMime, getter_AddRefs(tmp), &len);
NS_ENSURE_SUCCESS(rv, rv);
rv = trans->GetTransferData(kUnicodeMime, getter_AddRefs(tmp), &len);
if (NS_FAILED(rv))
return false;
nsCOMPtr<nsISupportsString> supportsString = do_QueryInterface(tmp);
// No support for non-text data
NS_ENSURE_TRUE(supportsString, NS_ERROR_NOT_IMPLEMENTED);
if (!supportsString)
return false;
supportsString->GetData(*text);
return true;
}

Просмотреть файл

@ -471,11 +471,13 @@ TabChild::DestroyWindow()
void
TabChild::ActorDestroy(ActorDestroyReason why)
{
// The messageManager relays messages via the TabChild which
// no longer exists.
static_cast<nsFrameMessageManager*>
(mTabChildGlobal->mMessageManager.get())->Disconnect();
mTabChildGlobal->mMessageManager = nsnull;
if (mTabChildGlobal) {
// The messageManager relays messages via the TabChild which
// no longer exists.
static_cast<nsFrameMessageManager*>
(mTabChildGlobal->mMessageManager.get())->Disconnect();
mTabChildGlobal->mMessageManager = nsnull;
}
}
TabChild::~TabChild()
@ -488,11 +490,13 @@ TabChild::~TabChild()
DestroyCx();
}
nsEventListenerManager* elm = mTabChildGlobal->GetListenerManager(PR_FALSE);
if (elm) {
elm->Disconnect();
if (mTabChildGlobal) {
nsEventListenerManager* elm = mTabChildGlobal->GetListenerManager(PR_FALSE);
if (elm) {
elm->Disconnect();
}
mTabChildGlobal->mTabChild = nsnull;
}
mTabChildGlobal->mTabChild = nsnull;
}
bool
@ -507,7 +511,7 @@ TabChild::RecvLoadURL(const nsCString& uri)
NS_WARNING("mWebNav->LoadURI failed. Eating exception, what else can I do?");
}
return NS_SUCCEEDED(rv);
return true;
}
bool
@ -522,7 +526,11 @@ TabChild::RecvShow(const nsIntSize& size)
}
if (!InitWidget(size)) {
return false;
// We can fail to initialize our widget if the <browser
// remote> has already been destroyed, and we couldn't hook
// into the parent-process's layer system. That's not a fatal
// error.
return true;
}
baseWindow->InitWindow(0, mWidget,
@ -551,6 +559,10 @@ TabChild::RecvUpdateDimensions(const nsRect& rect, const nsIntSize& size)
printf("[TabChild] Update Dimensions to (x,y,w,h)= (%ud, %ud, %ud, %ud) and move to (w,h)= (%ud, %ud)\n", rect.x, rect.y, rect.width, rect.height, size.width, size.height);
#endif
if (!mRemoteFrame) {
return true;
}
mOuterRect.x = rect.x;
mOuterRect.y = rect.y;
mOuterRect.width = rect.width;
@ -794,7 +806,9 @@ bool
TabChild::RecvLoadRemoteScript(const nsString& aURL)
{
if (!mCx && !InitTabChildGlobal())
return false;
// This can happen if we're half-destroyed. It's not a fatal
// error.
return true;
LoadFrameScriptInternal(aURL);
return true;
@ -844,10 +858,12 @@ public:
bool
TabChild::RecvDestroy()
{
// Let the frame scripts know the child is being closed
nsContentUtils::AddScriptRunner(
new UnloadScriptEvent(this, mTabChildGlobal)
);
if (mTabChildGlobal) {
// Let the frame scripts know the child is being closed
nsContentUtils::AddScriptRunner(
new UnloadScriptEvent(this, mTabChildGlobal)
);
}
// XXX what other code in ~TabChild() should we be running here?
DestroyWindow();
@ -965,7 +981,8 @@ TabChild::InitWidget(const nsIntSize& size)
NS_ABORT_IF_FALSE(0 == remoteFrame->ManagedPLayersChild().Length(),
"shouldn't have a shadow manager yet");
PLayersChild* shadowManager = remoteFrame->SendPLayersConstructor();
LayerManager::LayersBackend be;
PLayersChild* shadowManager = remoteFrame->SendPLayersConstructor(&be);
if (!shadowManager) {
NS_WARNING("failed to construct LayersChild");
// This results in |remoteFrame| being deleted.
@ -973,14 +990,11 @@ TabChild::InitWidget(const nsIntSize& size)
return false;
}
LayerManager* lm = mWidget->GetLayerManager();
NS_ABORT_IF_FALSE(LayerManager::LAYERS_BASIC == lm->GetBackendType(),
"content processes should only be using BasicLayers");
BasicShadowLayerManager* bslm = static_cast<BasicShadowLayerManager*>(lm);
NS_ABORT_IF_FALSE(!bslm->HasShadowManager(),
"PuppetWidget shouldn't have shadow manager yet");
bslm->SetShadowManager(shadowManager);
ShadowLayerForwarder* lf =
mWidget->GetLayerManager(shadowManager, be)->AsShadowForwarder();
NS_ABORT_IF_FALSE(lf && lf->HasShadowManager(),
"PuppetWidget should have shadow manager");
lf->SetParentBackendType(be);
mRemoteFrame = remoteFrame;
return true;

Просмотреть файл

@ -768,8 +768,7 @@ PRenderFrameParent*
TabParent::AllocPRenderFrame()
{
nsRefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
NS_WARN_IF_FALSE(frameLoader, "'message sent to unknown actor ID' coming up");
return frameLoader ? new RenderFrameParent(frameLoader) : nsnull;
return new RenderFrameParent(frameLoader);
}
bool

Просмотреть файл

@ -49,8 +49,8 @@
#include "nsIPrefService.h"
#include "nsDOMDeviceMotionEvent.h"
static const nsTPtrArray<nsIDOMWindow>::index_type NoIndex =
nsTPtrArray<nsIDOMWindow>::NoIndex;
static const nsTArray<nsIDOMWindow*>::index_type NoIndex =
nsTArray<nsIDOMWindow*>::NoIndex;
class nsDeviceMotionData : public nsIDeviceMotionData
{

Просмотреть файл

@ -40,7 +40,6 @@
#include "nsIDeviceMotion.h"
#include "nsIDOMDeviceMotionEvent.h"
#include "nsCOMArray.h"
#include "nsTPtrArray.h"
#include "nsCOMPtr.h"
#include "nsITimer.h"
@ -65,7 +64,7 @@ public:
private:
nsCOMArray<nsIDeviceMotionListener> mListeners;
nsTPtrArray<nsIDOMWindow> mWindowListeners;
nsTArray<nsIDOMWindow*> mWindowListeners;
void StartDisconnectTimer();

Просмотреть файл

@ -5,7 +5,10 @@
android:installLocation="auto"
android:versionCode="@ANDROID_VERSION_CODE@"
android:versionName="@MOZ_APP_VERSION@"
android:sharedUserId="@MOZ_ANDROID_SHARED_ID@">
#ifdef MOZ_ANDROID_SHARED_ID
android:sharedUserId="@MOZ_ANDROID_SHARED_ID@"
#endif
>
<uses-sdk android:minSdkVersion="5"
android:targetSdkVersion="5"/>

Просмотреть файл

@ -101,13 +101,18 @@ GARBAGE_DIRS += classes res
ifeq ($(MOZ_APP_NAME),fennec)
ICON_PATH = $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/content/fennec_48x48.png
ICON_PATH_HDPI = $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/content/fennec_72x72.png
ifeq (org.mozilla.fennec_unofficial,$(ANDROID_PACKAGE_NAME))
DEFINES += -DMOZ_ANDROID_SHARED_ID="org.mozilla.fennec_unofficial.sharedID"
else ifeq (,$(MOZ_OFFICIAL_BRANDING))
DEFINES += -DMOZ_ANDROID_SHARED_ID="org.mozilla.fennec.sharedID"
else
# we released these builds to the public with shared IDs and need to keep them
ifeq (org.mozilla.firefox,$(ANDROID_PACKAGE_NAME))
DEFINES += -DMOZ_ANDROID_SHARED_ID="org.mozilla.firefox.sharedID"
else ifeq (org.mozilla.firefox_beta,$(ANDROID_PACKAGE_NAME))
DEFINES += -DMOZ_ANDROID_SHARED_ID="org.mozilla.firefox.sharedID"
else ifeq (org.mozilla.fennec_aurora,$(ANDROID_PACKAGE_NAME))
DEFINES += -DMOZ_ANDROID_SHARED_ID="org.mozilla.fennec.sharedID"
else ifeq (org.mozilla.fennec,$(ANDROID_PACKAGE_NAME))
DEFINES += -DMOZ_ANDROID_SHARED_ID="org.mozilla.fennec.sharedID"
endif
else
ICON_PATH = $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/content/icon48.png
ICON_PATH_HDPI = $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/content/icon64.png

Просмотреть файл

@ -38,6 +38,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "mozilla/layers/PLayers.h"
#include "mozilla/layers/ShadowLayers.h"
#include "ImageLayers.h"
@ -389,6 +390,12 @@ Layer::GetEffectiveOpacity()
return opacity;
}
void
ContainerLayer::FillSpecificAttributes(SpecificLayerAttributes& aAttrs)
{
aAttrs = ContainerLayerAttributes(GetFrameMetrics());
}
PRBool
ContainerLayer::HasMultipleChildren()
{

Просмотреть файл

@ -79,9 +79,11 @@ class ImageLayer;
class ColorLayer;
class ImageContainer;
class CanvasLayer;
class ShadowLayer;
class ReadbackLayer;
class ReadbackProcessor;
class ShadowLayer;
class ShadowLayerForwarder;
class ShadowLayerManager;
class SpecificLayerAttributes;
/**
@ -115,6 +117,10 @@ public:
mDisplayPort.IsEqualEdges(aOther.mDisplayPort) &&
mScrollId == aOther.mScrollId);
}
PRBool operator!=(const FrameMetrics& aOther) const
{
return !operator==(aOther);
}
PRBool IsDefault() const
{
@ -283,6 +289,12 @@ public:
virtual void Destroy() { mDestroyed = PR_TRUE; mUserData.Clear(); }
PRBool IsDestroyed() { return mDestroyed; }
virtual ShadowLayerForwarder* AsShadowForwarder()
{ return nsnull; }
virtual ShadowLayerManager* AsShadowManager()
{ return nsnull; }
/**
* Start a new transaction. Nested transactions are not allowed so
* there must be no transaction currently in progress.
@ -1071,8 +1083,11 @@ public:
void SetFrameMetrics(const FrameMetrics& aFrameMetrics)
{
mFrameMetrics = aFrameMetrics;
Mutated();
}
virtual void FillSpecificAttributes(SpecificLayerAttributes& aAttrs);
// These getters can be used anytime.
virtual ContainerLayer* AsContainerLayer() { return this; }

Просмотреть файл

@ -114,13 +114,14 @@ EXPORTS += \
$(NULL)
CPPSRCS += \
LayerManagerD3D10.cpp \
ThebesLayerD3D10.cpp \
CanvasLayerD3D10.cpp \
ColorLayerD3D10.cpp \
ContainerLayerD3D10.cpp \
ImageLayerD3D10.cpp \
ColorLayerD3D10.cpp \
CanvasLayerD3D10.cpp \
LayerManagerD3D10.cpp \
ReadbackManagerD3D10.cpp \
ShadowLayerUtilsD3D10.cpp \
ThebesLayerD3D10.cpp \
$(NULL)
endif
endif
@ -153,6 +154,11 @@ DEFINES += -DUSE_GLES2
endif
endif
ifdef MOZ_ENABLE_D3D10_LAYER
EXPORTS_mozilla/layers += ShadowLayerUtilsD3D10.h
DEFINES += -DMOZ_ENABLE_D3D10_LAYER
endif
include $(topsrcdir)/config/rules.mk
include $(topsrcdir)/ipc/chromium/chromium-config.mk

Просмотреть файл

@ -1907,11 +1907,6 @@ public:
virtual void InsertAfter(Layer* aChild, Layer* aAfter);
virtual void RemoveChild(Layer* aChild);
virtual void FillSpecificAttributes(SpecificLayerAttributes& aAttrs)
{
aAttrs = ContainerLayerAttributes(GetFrameMetrics());
}
virtual Layer* AsLayer() { return this; }
virtual ShadowableLayer* AsShadowableLayer() { return this; }

Просмотреть файл

@ -224,6 +224,15 @@ public:
BasicShadowLayerManager(nsIWidget* aWidget);
virtual ~BasicShadowLayerManager();
virtual ShadowLayerForwarder* AsShadowForwarder()
{
return this;
}
virtual ShadowLayerManager* AsShadowManager()
{
return this;
}
virtual void BeginTransactionWithTarget(gfxContext* aTarget);
virtual bool EndEmptyTransaction();
virtual void EndTransaction(DrawThebesLayerCallback aCallback,
@ -247,12 +256,6 @@ public:
ShadowableLayer* Hold(Layer* aLayer);
bool HasShadowManager() const { return ShadowLayerForwarder::HasShadowManager(); }
PLayersChild* GetShadowManager() const { return mShadowManager; }
void SetShadowManager(PLayersChild* aShadowManager)
{
mShadowManager = aShadowManager;
}
virtual PRBool IsCompositingCheap();
virtual bool HasShadowManagerInternal() const { return HasShadowManager(); }

Просмотреть файл

@ -38,6 +38,7 @@
#include "CanvasLayerD3D10.h"
#include "../d3d9/Nv3DVUtils.h"
#include "gfxImageSurface.h"
#include "gfxWindowsSurface.h"
#include "gfxWindowsPlatform.h"

Просмотреть файл

@ -38,6 +38,8 @@
#include "ColorLayerD3D10.h"
#include "../d3d9/Nv3DVUtils.h"
namespace mozilla {
namespace layers {

Просмотреть файл

@ -38,7 +38,6 @@
#ifndef GFX_COLORLAYERD3D10_H
#define GFX_COLORLAYERD3D10_H
#include "Layers.h"
#include "LayerManagerD3D10.h"
namespace mozilla {

Просмотреть файл

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -40,6 +40,7 @@
#include "gfxUtils.h"
#include "nsRect.h"
#include "../d3d9/Nv3DVUtils.h"
#include "ThebesLayerD3D10.h"
#include "ReadbackProcessor.h"
@ -374,5 +375,55 @@ ContainerLayerD3D10::Validate()
}
}
ShadowContainerLayerD3D10::ShadowContainerLayerD3D10(LayerManagerD3D10 *aManager)
: ShadowContainerLayer(aManager, NULL)
, LayerD3D10(aManager)
{
mImplData = static_cast<LayerD3D10*>(this);
}
ShadowContainerLayerD3D10::~ShadowContainerLayerD3D10() {}
void
ShadowContainerLayerD3D10::InsertAfter(Layer* aChild, Layer* aAfter)
{
mFirstChild = aChild;
}
void
ShadowContainerLayerD3D10::RemoveChild(Layer* aChild)
{
}
void
ShadowContainerLayerD3D10::ComputeEffectiveTransforms(const gfx3DMatrix& aTransformToSurface)
{
DefaultComputeEffectiveTransforms(aTransformToSurface);
}
LayerD3D10*
ShadowContainerLayerD3D10::GetFirstChildD3D10()
{
return static_cast<LayerD3D10*>(mFirstChild->ImplData());
}
void
ShadowContainerLayerD3D10::RenderLayer()
{
LayerD3D10* layerToRender = GetFirstChildD3D10();
layerToRender->RenderLayer();
}
void
ShadowContainerLayerD3D10::Validate()
{
}
void
ShadowContainerLayerD3D10::LayerManagerDestroyed()
{
}
} /* layers */
} /* mozilla */

Просмотреть файл

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -38,7 +38,6 @@
#ifndef GFX_CONTAINERLAYERD3D10_H
#define GFX_CONTAINERLAYERD3D10_H
#include "Layers.h"
#include "LayerManagerD3D10.h"
namespace mozilla {
@ -74,6 +73,33 @@ public:
}
};
// This is a bare-bones implementation of a container layer, only
// enough to contain a shadow "window texture". This impl doesn't
// honor the transform/cliprect/etc. when rendering.
class ShadowContainerLayerD3D10 : public ShadowContainerLayer,
public LayerD3D10
{
public:
ShadowContainerLayerD3D10(LayerManagerD3D10 *aManager);
~ShadowContainerLayerD3D10();
void InsertAfter(Layer* aChild, Layer* aAfter);
void RemoveChild(Layer* aChild);
virtual void ComputeEffectiveTransforms(const gfx3DMatrix& aTransformToSurface);
/* LayerD3D10 implementation */
virtual LayerD3D10 *GetFirstChildD3D10();
virtual Layer* GetLayer() { return this; }
virtual void RenderLayer();
virtual void Validate();
virtual void LayerManagerDestroyed();
private:
};
} /* layers */
} /* mozilla */

Просмотреть файл

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -35,6 +35,8 @@
*
* ***** END LICENSE BLOCK ***** */
#include <algorithm>
#include "LayerManagerD3D10.h"
#include "LayerManagerD3D10Effect.h"
#include "gfxWindowsPlatform.h"
@ -49,11 +51,13 @@
#include "CanvasLayerD3D10.h"
#include "ReadbackLayerD3D10.h"
#include "ImageLayerD3D10.h"
#include "mozilla/layers/PLayerChild.h"
#include "../d3d9/Nv3DVUtils.h"
#include "gfxCrashReporterUtils.h"
using namespace std;
using namespace mozilla::gfx;
namespace mozilla {
@ -227,6 +231,11 @@ LayerManagerD3D10::Initialize()
mInputLayout = attachments->mInputLayout;
}
if (HasShadowManager()) {
reporter.SetSuccessful();
return true;
}
nsRefPtr<IDXGIDevice> dxgiDevice;
nsRefPtr<IDXGIAdapter> dxgiAdapter;
nsRefPtr<IDXGIFactory> dxgiFactory;
@ -287,6 +296,9 @@ LayerManagerD3D10::Destroy()
if (mRoot) {
static_cast<LayerD3D10*>(mRoot->ImplData())->LayerManagerDestroyed();
}
mRootForShadowTree = nsnull;
// XXX need to be careful here about surface destruction
// racing with share-to-chrome message
}
LayerManager::Destroy();
}
@ -300,6 +312,10 @@ LayerManagerD3D10::SetRoot(Layer *aRoot)
void
LayerManagerD3D10::BeginTransaction()
{
#ifdef MOZ_LAYERS_HAVE_LOG
MOZ_LAYERS_LOG(("[----- BeginTransaction"));
Log();
#endif
}
void
@ -330,11 +346,21 @@ LayerManagerD3D10::EndTransaction(DrawThebesLayerCallback aCallback,
// so we don't need to pass any global transform here.
mRoot->ComputeEffectiveTransforms(gfx3DMatrix());
#ifdef MOZ_LAYERS_HAVE_LOG
MOZ_LAYERS_LOG((" ----- (beginning paint)"));
Log();
#endif
Render();
mCurrentCallbackInfo.Callback = nsnull;
mCurrentCallbackInfo.CallbackData = nsnull;
}
#ifdef MOZ_LAYERS_HAVE_LOG
Log();
MOZ_LAYERS_LOG(("]----- EndTransaction"));
#endif
mTarget = nsnull;
}
@ -344,6 +370,13 @@ LayerManagerD3D10::CreateThebesLayer()
nsRefPtr<ThebesLayer> layer = new ThebesLayerD3D10(this);
return layer.forget();
}
already_AddRefed<ShadowThebesLayer>
LayerManagerD3D10::CreateShadowThebesLayer()
{
nsRefPtr<ShadowThebesLayerD3D10> layer = new ShadowThebesLayerD3D10(this);
return layer.forget();
}
already_AddRefed<ContainerLayer>
LayerManagerD3D10::CreateContainerLayer()
@ -352,6 +385,13 @@ LayerManagerD3D10::CreateContainerLayer()
return layer.forget();
}
already_AddRefed<ShadowContainerLayer>
LayerManagerD3D10::CreateShadowContainerLayer()
{
nsRefPtr<ShadowContainerLayer> layer = new ShadowContainerLayerD3D10(this);
return layer.forget();
}
already_AddRefed<ImageLayer>
LayerManagerD3D10::CreateImageLayer()
{
@ -546,9 +586,13 @@ LayerManagerD3D10::UpdateRenderTarget()
nsRefPtr<ID3D10Texture2D> backBuf;
hr = mSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (void**)backBuf.StartAssignment());
if (FAILED(hr)) {
return;
if (mSwapChain) {
hr = mSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (void**)backBuf.StartAssignment());
if (FAILED(hr)) {
return;
}
} else {
backBuf = mBackBuffer;
}
mDevice->CreateRenderTargetView(backBuf, NULL, getter_AddRefs(mRTView));
@ -557,28 +601,57 @@ LayerManagerD3D10::UpdateRenderTarget()
void
LayerManagerD3D10::VerifyBufferSize()
{
DXGI_SWAP_CHAIN_DESC swapDesc;
mSwapChain->GetDesc(&swapDesc);
nsIntRect rect;
mWidget->GetClientBounds(rect);
if (swapDesc.BufferDesc.Width == rect.width &&
swapDesc.BufferDesc.Height == rect.height) {
return;
}
HRESULT hr;
if (mSwapChain) {
DXGI_SWAP_CHAIN_DESC swapDesc;
mSwapChain->GetDesc(&swapDesc);
mRTView = nsnull;
if (gfxWindowsPlatform::IsOptimus()) {
mSwapChain->ResizeBuffers(1, rect.width, rect.height,
DXGI_FORMAT_B8G8R8A8_UNORM,
0);
if (swapDesc.BufferDesc.Width == rect.width &&
swapDesc.BufferDesc.Height == rect.height) {
return;
}
mRTView = nsnull;
if (gfxWindowsPlatform::IsOptimus()) {
mSwapChain->ResizeBuffers(1, rect.width, rect.height,
DXGI_FORMAT_B8G8R8A8_UNORM,
0);
} else {
mSwapChain->ResizeBuffers(1, rect.width, rect.height,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE);
}
} else {
mSwapChain->ResizeBuffers(1, rect.width, rect.height,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE);
}
D3D10_TEXTURE2D_DESC oldDesc;
if (mBackBuffer) {
mBackBuffer->GetDesc(&oldDesc);
} else {
oldDesc.Width = oldDesc.Height = 0;
}
if (oldDesc.Width == rect.width &&
oldDesc.Height == rect.height) {
return;
}
CD3D10_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM,
rect.width, rect.height, 1, 1);
desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
desc.MiscFlags = D3D10_RESOURCE_MISC_SHARED
// FIXME/bug 662109: synchronize using KeyedMutex
/*D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX*/;
hr = device()->CreateTexture2D(&desc, nsnull, getter_AddRefs(mBackBuffer));
if (FAILED(hr)) {
ReportFailure(nsDependentCString("Failed to create shared texture"),
hr);
NS_RUNTIMEABORT("Failed to create back buffer");
}
// XXX resize texture?
mRTView = nsnull;
}
}
void
@ -638,6 +711,75 @@ LayerManagerD3D10::Render()
if (mTarget) {
PaintToTarget();
} else if (mBackBuffer) {
ShadowLayerForwarder::BeginTransaction();
nsIntRect contentRect = nsIntRect(0, 0, rect.width, rect.height);
if (!mRootForShadowTree) {
mRootForShadowTree = new DummyRoot(this);
mRootForShadowTree->SetShadow(ConstructShadowFor(mRootForShadowTree));
CreatedContainerLayer(mRootForShadowTree);
ShadowLayerForwarder::SetRoot(mRootForShadowTree);
}
nsRefPtr<WindowLayer> windowLayer =
static_cast<WindowLayer*>(mRootForShadowTree->GetFirstChild());
if (!windowLayer) {
windowLayer = new WindowLayer(this);
windowLayer->SetShadow(ConstructShadowFor(windowLayer));
CreatedThebesLayer(windowLayer);
ShadowLayerForwarder::CreatedThebesBuffer(windowLayer,
contentRect,
contentRect,
SurfaceDescriptor());
mRootForShadowTree->InsertAfter(windowLayer, nsnull);
ShadowLayerForwarder::InsertAfter(mRootForShadowTree, windowLayer);
}
if (!mRootForShadowTree->GetVisibleRegion().IsEqual(contentRect)) {
mRootForShadowTree->SetVisibleRegion(contentRect);
windowLayer->SetVisibleRegion(contentRect);
ShadowLayerForwarder::Mutated(mRootForShadowTree);
ShadowLayerForwarder::Mutated(windowLayer);
}
FrameMetrics m;
if (ContainerLayer* cl = mRoot->AsContainerLayer()) {
m = cl->GetFrameMetrics();
} else {
m.mScrollId = FrameMetrics::ROOT_SCROLL_ID;
}
if (m != mRootForShadowTree->GetFrameMetrics()) {
mRootForShadowTree->SetFrameMetrics(m);
ShadowLayerForwarder::Mutated(mRootForShadowTree);
}
SurfaceDescriptorD3D10 sd;
GetDescriptor(mBackBuffer, &sd);
ShadowLayerForwarder::PaintedThebesBuffer(windowLayer,
contentRect,
contentRect, nsIntPoint(),
sd);
// A source in the graphics pipeline can't also be a target. So
// unbind here to avoid racing with the chrome process sourcing
// the back texture.
mDevice->OMSetRenderTargets(0, NULL, NULL);
// XXX revisit this Flush() in bug 662109. It's not clear it's
// needed.
mDevice->Flush();
mRTView = NULL;
AutoInfallibleTArray<EditReply, 10> replies;
ShadowLayerForwarder::EndTransaction(&replies);
// We expect only 1 reply, but might get none if the parent
// process crashed
swap(mBackBuffer, mRemoteFrontBuffer);
} else {
mSwapChain->Present(0, 0);
}
@ -699,5 +841,42 @@ LayerD3D10::LayerD3D10(LayerManagerD3D10 *aManager)
{
}
WindowLayer::WindowLayer(LayerManagerD3D10* aManager)
: ThebesLayer(aManager, nsnull)
{
}
WindowLayer::~WindowLayer()
{
PLayerChild::Send__delete__(GetShadow());
}
DummyRoot::DummyRoot(LayerManagerD3D10* aManager)
: ContainerLayer(aManager, nsnull)
{
}
DummyRoot::~DummyRoot()
{
RemoveChild(nsnull);
PLayerChild::Send__delete__(GetShadow());
}
void
DummyRoot::InsertAfter(Layer* aLayer, Layer* aNull)
{
NS_ABORT_IF_FALSE(!mFirstChild && !aNull,
"Expect to append one child, once");
mFirstChild = nsRefPtr<Layer>(aLayer).forget().get();
}
void
DummyRoot::RemoveChild(Layer* aNull)
{
NS_ABORT_IF_FALSE(!aNull, "Unused argument should be null");
NS_IF_RELEASE(mFirstChild);
}
}
}

Просмотреть файл

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -38,6 +38,8 @@
#ifndef GFX_LAYERMANAGERD3D10_H
#define GFX_LAYERMANAGERD3D10_H
#include "mozilla/layers/PLayers.h"
#include "mozilla/layers/ShadowLayers.h"
#include "Layers.h"
#include <windows.h>
@ -51,6 +53,7 @@
namespace mozilla {
namespace layers {
class DummyRoot;
class Nv3DVUtils;
/**
@ -74,11 +77,18 @@ struct ShaderConstantRectD3D10
extern cairo_user_data_key_t gKeyD3D10Texture;
/*
* This is the LayerManager used for Direct3D 9. For now this will render on
* the main thread.
* This is the LayerManager used for Direct3D 10. For now this will
* render on the main thread.
*
* For the time being, LayerManagerD3D10 both forwards layers
* transactions and receives forwarded transactions. In the Azure
* future, it will only be a ShadowLayerManager.
*/
class THEBES_API LayerManagerD3D10 : public LayerManager {
class THEBES_API LayerManagerD3D10 : public ShadowLayerManager,
public ShadowLayerForwarder {
public:
typedef LayerManager::LayersBackend LayersBackend;
LayerManagerD3D10(nsIWidget *aWidget);
virtual ~LayerManagerD3D10();
@ -97,6 +107,12 @@ public:
*/
virtual void Destroy();
virtual ShadowLayerForwarder* AsShadowForwarder()
{ return this; }
virtual ShadowLayerManager* AsShadowManager()
{ return this; }
virtual void SetRoot(Layer *aLayer);
virtual void BeginTransaction();
@ -125,14 +141,22 @@ public:
}
virtual already_AddRefed<ThebesLayer> CreateThebesLayer();
virtual already_AddRefed<ShadowThebesLayer> CreateShadowThebesLayer();
virtual already_AddRefed<ContainerLayer> CreateContainerLayer();
virtual already_AddRefed<ShadowContainerLayer> CreateShadowContainerLayer();
virtual already_AddRefed<ImageLayer> CreateImageLayer();
virtual already_AddRefed<ShadowImageLayer> CreateShadowImageLayer()
{ return nsnull; }
virtual already_AddRefed<ColorLayer> CreateColorLayer();
virtual already_AddRefed<ShadowColorLayer> CreateShadowColorLayer()
{ return nsnull; }
virtual already_AddRefed<CanvasLayer> CreateCanvasLayer();
virtual already_AddRefed<ShadowCanvasLayer> CreateShadowCanvasLayer()
{ return nsnull; }
virtual already_AddRefed<ReadbackLayer> CreateReadbackLayer();
@ -204,6 +228,28 @@ private:
*/
nsRefPtr<gfxContext> mTarget;
/*
* We use a double-buffered "window surface" to display our content
* in the compositor process, if we're remote. The textures act
* like the backing store for an OS window --- we render the layer
* tree into the back texture and send it to the compositor, then
* swap back/front textures. This means, obviously, that we've lost
* all layer tree information after rendering.
*
* The remote front buffer is the texture currently being displayed
* by chrome. We keep a reference to it to simplify resource
* management; if we didn't, then there can be periods during IPC
* transport when neither process holds a "real" ref. That's
* solvable but not worth the complexity.
*/
nsRefPtr<ID3D10Texture2D> mBackBuffer;
nsRefPtr<ID3D10Texture2D> mRemoteFrontBuffer;
/*
* If we're remote content, this is the root of the shadowable tree
* we send to the compositor.
*/
nsRefPtr<DummyRoot> mRootForShadowTree;
/*
* Copies the content of our backbuffer to the set transaction target.
*/
@ -256,6 +302,44 @@ protected:
LayerManagerD3D10 *mD3DManager;
};
/**
* WindowLayer is a simple, special kinds of shadowable layer into
* which layer trees are rendered. It represents something like an OS
* window. It exists only to allow sharing textures with the
* compositor while reusing existing shadow-layer machinery.
*
* WindowLayer being implemented as a thebes layer isn't an important
* detail; other layer types could have been used.
*/
class WindowLayer : public ThebesLayer, public ShadowableLayer {
public:
WindowLayer(LayerManagerD3D10* aManager);
virtual ~WindowLayer();
void InvalidateRegion(const nsIntRegion&) {}
Layer* AsLayer() { return this; }
void SetShadow(PLayerChild* aChild) { mShadow = aChild; }
};
/**
* DummyRoot is the root of the shadowable layer tree created by
* remote content. It exists only to contain WindowLayers. It always
* has exactly one child WindowLayer.
*/
class DummyRoot : public ContainerLayer, public ShadowableLayer {
public:
DummyRoot(LayerManagerD3D10* aManager);
virtual ~DummyRoot();
void ComputeEffectiveTransforms(const gfx3DMatrix&) {}
void InsertAfter(Layer*, Layer*);
void RemoveChild(Layer*);
Layer* AsLayer() { return this; }
void SetShadow(PLayerChild* aChild) { mShadow = aChild; }
};
} /* layers */
} /* mozilla */

Просмотреть файл

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -35,6 +35,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "mozilla/layers/PLayers.h"
#include "ThebesLayerD3D10.h"
#include "gfxPlatform.h"
@ -43,6 +44,7 @@
#include "gfxD2DSurface.h"
#endif
#include "../d3d9/Nv3DVUtils.h"
#include "gfxTeeSurface.h"
#include "gfxUtils.h"
#include "ReadbackLayer.h"
@ -284,7 +286,7 @@ ThebesLayerD3D10::Validate(ReadbackProcessor *aReadback)
device()->CreateTexture2D(&desc, NULL, getter_AddRefs(readbackTexture));
device()->CopyResource(readbackTexture, mTexture);
for (int i = 0; i < readbackUpdates.Length(); i++) {
for (PRUint32 i = 0; i < readbackUpdates.Length(); i++) {
mD3DManager->readbackManager()->PostTask(readbackTexture,
&readbackUpdates[i],
gfxPoint(newTextureRect.x, newTextureRect.y));
@ -455,6 +457,121 @@ ThebesLayerD3D10::CreateNewTextures(const gfxIntSize &aSize, SurfaceMode aMode)
}
}
}
ShadowThebesLayerD3D10::ShadowThebesLayerD3D10(LayerManagerD3D10* aManager)
: ShadowThebesLayer(aManager, NULL)
, LayerD3D10(aManager)
{
mImplData = static_cast<LayerD3D10*>(this);
}
ShadowThebesLayerD3D10::~ShadowThebesLayerD3D10()
{
}
void
ShadowThebesLayerD3D10::SetFrontBuffer(const OptionalThebesBuffer& aNewFront,
const nsIntRegion& aValidRegion)
{
NS_ABORT_IF_FALSE(OptionalThebesBuffer::Tnull_t == aNewFront.type(),
"Expected dummy front buffer initially");
}
void
ShadowThebesLayerD3D10::Swap(
const ThebesBuffer& aNewFront, const nsIntRegion& aUpdatedRegion,
ThebesBuffer* aNewBack, nsIntRegion* aNewBackValidRegion,
OptionalThebesBuffer* aReadOnlyFront, nsIntRegion* aFrontUpdatedRegion)
{
nsRefPtr<ID3D10Texture2D> newBackBuffer = mTexture;
mTexture = OpenForeign(mD3DManager->device(), aNewFront.buffer());
NS_ABORT_IF_FALSE(mTexture, "Couldn't open foreign texture");
// The content process tracks back/front buffers on its own, so
// the newBack is in essence unused.
aNewBack->buffer() = aNewFront.buffer();
// The content process doesn't need to read back from the front
// buffer (yet).
*aReadOnlyFront = null_t();
// FIXME/bug 662109: synchronize using KeyedMutex
}
void
ShadowThebesLayerD3D10::DestroyFrontBuffer()
{
}
void
ShadowThebesLayerD3D10::Disconnect()
{
}
void
ShadowThebesLayerD3D10::RenderLayer()
{
if (!mTexture) {
return;
}
// FIXME/bug 662109: synchronize using KeyedMutex
nsRefPtr<ID3D10ShaderResourceView> srView;
HRESULT hr = device()->CreateShaderResourceView(mTexture, NULL, getter_AddRefs(srView));
if (FAILED(hr)) {
NS_WARNING("Failed to create shader resource view for ThebesLayerD3D10.");
}
SetEffectTransformAndOpacity();
ID3D10EffectTechnique *technique =
effect()->GetTechniqueByName("RenderRGBLayerPremul");
effect()->GetVariableByName("tRGB")->AsShaderResource()->SetResource(srView);
nsIntRect textureRect = GetVisibleRegion().GetBounds();
nsIntRegionRectIterator iter(mVisibleRegion);
while (const nsIntRect *iterRect = iter.Next()) {
effect()->GetVariableByName("vLayerQuad")->AsVector()->SetFloatVector(
ShaderConstantRectD3D10(
(float)iterRect->x,
(float)iterRect->y,
(float)iterRect->width,
(float)iterRect->height)
);
effect()->GetVariableByName("vTextureCoords")->AsVector()->SetFloatVector(
ShaderConstantRectD3D10(
(float)(iterRect->x - textureRect.x) / (float)textureRect.width,
(float)(iterRect->y - textureRect.y) / (float)textureRect.height,
(float)iterRect->width / (float)textureRect.width,
(float)iterRect->height / (float)textureRect.height)
);
technique->GetPassByIndex(0)->Apply(0);
device()->Draw(4, 0);
}
// FIXME/bug 662109: synchronize using KeyedMutex
// Set back to default.
effect()->GetVariableByName("vTextureCoords")->AsVector()->
SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f));
}
void
ShadowThebesLayerD3D10::Validate()
{
}
void
ShadowThebesLayerD3D10::LayerManagerDestroyed()
{
}
} /* namespace layers */
} /* namespace mozilla */

Просмотреть файл

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -38,7 +38,6 @@
#ifndef GFX_THEBESLAYERD3D10_H
#define GFX_THEBESLAYERD3D10_H
#include "Layers.h"
#include "LayerManagerD3D10.h"
namespace mozilla {
@ -102,6 +101,35 @@ private:
const nsIntRegion &aCopyRegion, nsIntRegion* aValidRegion);
};
class ShadowThebesLayerD3D10 : public ShadowThebesLayer,
public LayerD3D10
{
public:
ShadowThebesLayerD3D10(LayerManagerD3D10* aManager);
virtual ~ShadowThebesLayerD3D10();
// ShadowThebesLayer impl
virtual void SetFrontBuffer(const OptionalThebesBuffer& aNewFront,
const nsIntRegion& aValidRegion);
virtual void
Swap(const ThebesBuffer& aNewFront, const nsIntRegion& aUpdatedRegion,
ThebesBuffer* aNewBack, nsIntRegion* aNewBackValidRegion,
OptionalThebesBuffer* aReadOnlyFront, nsIntRegion* aFrontUpdatedRegion);
virtual void DestroyFrontBuffer();
virtual void Disconnect();
/* LayerD3D10 implementation */
virtual Layer* GetLayer() { return this; }
virtual void RenderLayer();
virtual void Validate();
virtual void LayerManagerDestroyed();
private:
/* Texture with our surface data */
nsRefPtr<ID3D10Texture2D> mTexture;
};
} /* layers */
} /* mozilla */
#endif /* GFX_THEBESLAYERD3D10_H */

Просмотреть файл

@ -121,6 +121,9 @@ public:
*/
virtual void Destroy();
virtual ShadowLayerManager* AsShadowManager()
{ return this; }
virtual void BeginTransaction();
virtual void BeginTransactionWithTarget(gfxContext* aTarget);

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше