nsresult nsTextAttrsMgr::GetAttributes(nsIPersistentProperties *aAttributes, PRInt32 *aStartHTOffset, PRInt32 *aEndHTOffset) { // 1. Hyper text accessible must be specified always. // 2. Offset accessible and result hyper text offsets must be specified in // the case of text attributes. // 3. Offset accessible and result hyper text offsets must not be specified // but include default text attributes flag and attributes list must be // specified in the case of default text attributes. NS_PRECONDITION(mHyperTextAcc && ((mOffsetAcc && mOffsetAccIdx != -1 && aStartHTOffset && aEndHTOffset) || (!mOffsetAcc && mOffsetAccIdx == -1 && !aStartHTOffset && !aEndHTOffset && mIncludeDefAttrs && aAttributes)), "Wrong usage of nsTextAttrsMgr!"); // Embedded objects are combined into own range with empty attributes set. if (mOffsetAcc && nsAccUtils::IsEmbeddedObject(mOffsetAcc)) { for (PRInt32 childIdx = mOffsetAccIdx - 1; childIdx >= 0; childIdx--) { nsAccessible *currAcc = mHyperTextAcc->GetChildAt(childIdx); if (!nsAccUtils::IsEmbeddedObject(currAcc)) break; (*aStartHTOffset)--; } PRInt32 childCount = mHyperTextAcc->GetChildCount(); for (PRInt32 childIdx = mOffsetAccIdx + 1; childIdx < childCount; childIdx++) { nsAccessible *currAcc = mHyperTextAcc->GetChildAt(childIdx); if (!nsAccUtils::IsEmbeddedObject(currAcc)) break; (*aEndHTOffset)++; } return NS_OK; } // Get the content and frame of the accessible. In the case of document // accessible it's role content and root frame. nsIContent *hyperTextElm = mHyperTextAcc->GetContent(); nsIFrame *rootFrame = mHyperTextAcc->GetFrame(); NS_ASSERTION(rootFrame, "No frame for accessible!"); if (!rootFrame) return NS_OK; nsIContent *offsetNode = nsnull, *offsetElm = nsnull; nsIFrame *frame = nsnull; if (mOffsetAcc) { offsetNode = mOffsetAcc->GetContent(); offsetElm = nsCoreUtils::GetDOMElementFor(offsetNode); frame = offsetElm->GetPrimaryFrame(); } nsTArray<nsITextAttr*> textAttrArray(10); // "language" text attribute nsLangTextAttr langTextAttr(mHyperTextAcc, hyperTextElm, offsetNode); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&langTextAttr)); // "color" text attribute nsCSSTextAttr colorTextAttr(0, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&colorTextAttr)); // "font-family" text attribute nsCSSTextAttr fontFamilyTextAttr(1, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontFamilyTextAttr)); // "font-style" text attribute nsCSSTextAttr fontStyleTextAttr(2, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontStyleTextAttr)); // "text-line-through-style" text attribute nsCSSTextAttr lineThroughTextAttr(3, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&lineThroughTextAttr)); // "text-underline-style" text attribute nsCSSTextAttr underlineTextAttr(4, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&underlineTextAttr)); // "text-position" text attribute nsCSSTextAttr posTextAttr(5, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&posTextAttr)); // "background-color" text attribute nsBGColorTextAttr bgColorTextAttr(rootFrame, frame); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&bgColorTextAttr)); // "font-size" text attribute nsFontSizeTextAttr fontSizeTextAttr(rootFrame, frame); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontSizeTextAttr)); // "font-weight" text attribute nsFontWeightTextAttr fontWeightTextAttr(rootFrame, frame); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontWeightTextAttr)); // Expose text attributes if applicable. if (aAttributes) { PRUint32 len = textAttrArray.Length(); for (PRUint32 idx = 0; idx < len; idx++) { nsITextAttr *textAttr = textAttrArray[idx]; nsAutoString value; if (textAttr->GetValue(value, mIncludeDefAttrs)) nsAccUtils::SetAccAttr(aAttributes, textAttr->GetName(), value); } } nsresult rv = NS_OK; // Expose text attributes range where they are applied if applicable. if (mOffsetAcc) rv = GetRange(textAttrArray, aStartHTOffset, aEndHTOffset); textAttrArray.Clear(); return rv; }
nsresult nsTextAttrsMgr::GetAttributes(nsIPersistentProperties *aAttributes, PRInt32 *aStartHTOffset, PRInt32 *aEndHTOffset) { // 1. Hyper text accessible and its DOM node must be specified always. // 2. Offset DOM node and result hyper text offsets must be specifed in // the case of text attributes. // 3. Offset DOM node and result hyper text offsets must not be specifed but // include default text attributes flag and attributes list must be specified // in the case of default text attributes. NS_PRECONDITION(mHyperTextAcc && mHyperTextNode && ((mOffsetNode && aStartHTOffset && aEndHTOffset) || (!mOffsetNode && !aStartHTOffset && !aEndHTOffset && mIncludeDefAttrs && aAttributes)), "Wrong usage of nsTextAttrsMgr!"); nsCOMPtr<nsIDOMElement> hyperTextElm = nsCoreUtils::GetDOMElementFor(mHyperTextNode); nsCOMPtr<nsIDOMElement> offsetElm; if (mOffsetNode) offsetElm = nsCoreUtils::GetDOMElementFor(mOffsetNode); nsIFrame *rootFrame = nsCoreUtils::GetFrameFor(hyperTextElm); nsIFrame *frame = nsnull; if (offsetElm) frame = nsCoreUtils::GetFrameFor(offsetElm); nsTPtrArray<nsITextAttr> textAttrArray(10); // "language" text attribute nsLangTextAttr langTextAttr(mHyperTextAcc, mHyperTextNode, mOffsetNode); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&langTextAttr)); // "color" text attribute nsCSSTextAttr colorTextAttr(0, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&colorTextAttr)); // "font-family" text attribute nsCSSTextAttr fontFamilyTextAttr(1, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontFamilyTextAttr)); // "font-style" text attribute nsCSSTextAttr fontStyleTextAttr(2, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontStyleTextAttr)); // "text-line-through-style" text attribute nsCSSTextAttr lineThroughTextAttr(3, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&lineThroughTextAttr)); // "text-underline-style" text attribute nsCSSTextAttr underlineTextAttr(4, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&underlineTextAttr)); // "text-position" text attribute nsCSSTextAttr posTextAttr(5, hyperTextElm, offsetElm); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&posTextAttr)); // "background-color" text attribute nsBGColorTextAttr bgColorTextAttr(rootFrame, frame); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&bgColorTextAttr)); // "font-size" text attribute nsFontSizeTextAttr fontSizeTextAttr(rootFrame, frame); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontSizeTextAttr)); // "font-weight" text attribute nsFontWeightTextAttr fontWeightTextAttr(rootFrame, frame); textAttrArray.AppendElement(static_cast<nsITextAttr*>(&fontWeightTextAttr)); // Expose text attributes if applicable. if (aAttributes) { PRUint32 len = textAttrArray.Length(); for (PRUint32 idx = 0; idx < len; idx++) { nsITextAttr *textAttr = textAttrArray[idx]; nsAutoString value; if (textAttr->GetValue(value, mIncludeDefAttrs)) nsAccUtils::SetAccAttr(aAttributes, textAttr->GetName(), value); } } nsresult rv = NS_OK; // Expose text attributes range where they are applied if applicable. if (mOffsetNode) rv = GetRange(textAttrArray, aStartHTOffset, aEndHTOffset); textAttrArray.Clear(); return rv; }