void * EmbedPrivate::GetAtkObjectForCurrentDocument() { if (!mNavigation) return nsnull; nsCOMPtr<nsIAccessibilityService> accService = do_GetService("@mozilla.org/accessibilityService;1"); if (accService) { //get current document nsCOMPtr<nsIDOMDocument> domDoc; mNavigation->GetDocument(getter_AddRefs(domDoc)); NS_ENSURE_TRUE(domDoc, nsnull); nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(domDoc)); NS_ENSURE_TRUE(domNode, nsnull); nsCOMPtr<nsIAccessible> acc; accService->GetAccessibleFor(domNode, getter_AddRefs(acc)); NS_ENSURE_TRUE(acc, nsnull); void *atkObj = nsnull; if (NS_SUCCEEDED(acc->GetNativeInterface(&atkObj))) return atkObj; } return nsnull; }
already_AddRefed<nsIAccessible> nsHTMLSelectListAccessible::AccessibleForOption(nsIAccessibilityService *aAccService, nsIContent *aContent, nsIAccessible *aLastGoodAccessible, PRInt32 *aChildCount) { nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(aContent)); NS_ASSERTION(domNode, "DOM node is null"); // Accessibility service will initialize & cache any accessibles created nsCOMPtr<nsIAccessible> accessible; aAccService->GetAccessibleInWeakShell(domNode, mWeakShell, getter_AddRefs(accessible)); nsRefPtr<nsAccessible> acc(nsAccUtils::QueryAccessible(accessible)); if (!acc) return nsnull; ++ *aChildCount; acc->SetParent(this); nsRefPtr<nsAccessible> prevAcc = nsAccUtils::QueryAccessible(aLastGoodAccessible); if (prevAcc) prevAcc->SetNextSibling(accessible); if (!mFirstChild) mFirstChild = accessible; return accessible.forget(); }
//------------------------------------------------------------ nsresult nsFilteredContentIterator::Init(nsINode* aRoot) { NS_ENSURE_TRUE(mPreIterator, NS_ERROR_FAILURE); NS_ENSURE_TRUE(mIterator, NS_ERROR_FAILURE); mIsOutOfRange = false; mDirection = eForward; mCurrentIterator = mPreIterator; mRange = new nsRange(); nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(aRoot)); if (domNode) { mRange->SelectNode(domNode); } nsresult rv = mPreIterator->Init(mRange); NS_ENSURE_SUCCESS(rv, rv); return mIterator->Init(mRange); }
nsresult nsHTMLLinkAccessibleWrap::GetLinkOffset(PRInt32* aStartOffset, PRInt32* aEndOffset) { NS_ENSURE_TRUE(mTextNodes, NS_ERROR_FAILURE); if (!mIsLink) return NS_ERROR_FAILURE; nsCOMPtr<nsILink> currentLink(do_QueryInterface(mActionContent)); NS_ENSURE_TRUE(currentLink, NS_ERROR_FAILURE); PRUint32 index, count = 0; PRUint32 totalLength = 0, textLength = 0; mTextNodes->GetLength(&count); for (index = 0; index < count; index++) { nsCOMPtr<nsIDOMNode> domNode(do_QueryElementAt(mTextNodes, index)); nsCOMPtr<nsIDOMText> domText(do_QueryInterface(domNode)); if (domText) { domText->GetLength(&textLength); totalLength += textLength; } // text node maybe a child (or grandchild, ...) of a link node nsCOMPtr<nsIDOMNode> parentNode; nsCOMPtr<nsILink> link = nsnull; domNode->GetParentNode(getter_AddRefs(parentNode)); while (parentNode) { link = do_QueryInterface(parentNode); if (link) break; nsCOMPtr<nsIDOMNode> temp = parentNode; temp->GetParentNode(getter_AddRefs(parentNode)); } if (link == currentLink) { *aEndOffset = totalLength; *aStartOffset = totalLength - textLength; return NS_OK; } } return NS_ERROR_FAILURE; }
//------------------------------------------------------------ nsresult nsFilteredContentIterator::Init(nsINode* aRoot) { NS_ENSURE_TRUE(mPreIterator, NS_ERROR_FAILURE); NS_ENSURE_TRUE(mIterator, NS_ERROR_FAILURE); mIsOutOfRange = PR_FALSE; mDirection = eForward; mCurrentIterator = mPreIterator; nsresult rv; mRange = do_CreateInstance("@mozilla.org/content/range;1", &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMRange> domRange(do_QueryInterface(mRange)); nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(aRoot)); if (domRange && domNode) { domRange->SelectNode(domNode); } rv = mPreIterator->Init(domRange); NS_ENSURE_SUCCESS(rv, rv); return mIterator->Init(domRange); }
nsresult nsContentEventHandler::SetRangeFromFlatTextOffset( nsIRange* aRange, PRUint32 aNativeOffset, PRUint32 aNativeLength, PRBool aExpandToClusterBoundaries) { nsCOMPtr<nsIContentIterator> iter; nsresult rv = NS_NewContentIterator(getter_AddRefs(iter)); NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(iter, "NS_NewContentIterator succeeded, but the result is null"); rv = iter->Init(mRootContent); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMRange> domRange(do_QueryInterface(aRange)); NS_ASSERTION(domRange, "aRange doesn't have nsIDOMRange!"); PRUint32 nativeOffset = 0; PRUint32 nativeEndOffset = aNativeOffset + aNativeLength; nsCOMPtr<nsIContent> content; for (; !iter->IsDone(); iter->Next()) { nsINode* node = iter->GetCurrentNode(); if (!node || !node->IsNodeOfType(nsINode::eCONTENT)) continue; nsIContent* content = static_cast<nsIContent*>(node); PRUint32 nativeTextLength; nativeTextLength = GetNativeTextLength(content); if (nativeTextLength == 0) continue; if (nativeOffset <= aNativeOffset && aNativeOffset < nativeOffset + nativeTextLength) { nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(content)); NS_ASSERTION(domNode, "aContent doesn't have nsIDOMNode!"); PRUint32 xpOffset = content->IsNodeOfType(nsINode::eTEXT) ? ConvertToXPOffset(content, aNativeOffset - nativeOffset) : 0; if (aExpandToClusterBoundaries) { rv = ExpandToClusterBoundary(content, PR_FALSE, &xpOffset); NS_ENSURE_SUCCESS(rv, rv); } rv = domRange->SetStart(domNode, PRInt32(xpOffset)); NS_ENSURE_SUCCESS(rv, rv); if (aNativeLength == 0) { // Ensure that the end offset and the start offset are same. rv = domRange->SetEnd(domNode, PRInt32(xpOffset)); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; } } if (nativeEndOffset <= nativeOffset + nativeTextLength) { nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(content)); NS_ASSERTION(domNode, "aContent doesn't have nsIDOMNode!"); PRUint32 xpOffset; if (content->IsNodeOfType(nsINode::eTEXT)) { xpOffset = ConvertToXPOffset(content, nativeEndOffset - nativeOffset); if (aExpandToClusterBoundaries) { rv = ExpandToClusterBoundary(content, PR_TRUE, &xpOffset); NS_ENSURE_SUCCESS(rv, rv); } } else { // Use first position of next node, because the end node is ignored // by ContentIterator when the offset is zero. xpOffset = 0; iter->Next(); if (iter->IsDone()) break; domNode = do_QueryInterface(iter->GetCurrentNode()); } rv = domRange->SetEnd(domNode, PRInt32(xpOffset)); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; } nativeOffset += nativeTextLength; } if (nativeOffset < aNativeOffset) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(mRootContent)); NS_ASSERTION(domNode, "lastContent doesn't have nsIDOMNode!"); if (!content) { rv = domRange->SetStart(domNode, 0); NS_ENSURE_SUCCESS(rv, rv); } rv = domRange->SetEnd(domNode, PRInt32(mRootContent->GetChildCount())); NS_ASSERTION(NS_SUCCEEDED(rv), "nsIDOMRange::SetEnd failed"); return rv; }
nsresult EventListenerManager::SetEventHandler(nsIAtom* aName, const nsAString& aBody, uint32_t aLanguage, bool aDeferCompilation, bool aPermitUntrustedEvents, Element* aElement) { NS_PRECONDITION(aLanguage != nsIProgrammingLanguage::UNKNOWN, "Must know the language for the script event listener"); // |aPermitUntrustedEvents| is set to False for chrome - events // *generated* from an unknown source are not allowed. // However, for script languages with no 'sandbox', we want to reject // such scripts based on the source of their code, not just the source // of the event. if (aPermitUntrustedEvents && aLanguage != nsIProgrammingLanguage::JAVASCRIPT) { NS_WARNING("Discarding non-JS event listener from untrusted source"); return NS_ERROR_FAILURE; } nsCOMPtr<nsIDocument> doc; nsCOMPtr<nsIScriptGlobalObject> global = GetScriptGlobalAndDocument(getter_AddRefs(doc)); if (!global) { // This can happen; for example this document might have been // loaded as data. return NS_OK; } #ifdef DEBUG nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(global); if (win) { MOZ_ASSERT(win->IsInnerWindow(), "We should not have an outer window here!"); } #endif nsresult rv = NS_OK; // return early preventing the event listener from being added // 'doc' is fetched above if (doc) { // Don't allow adding an event listener if the document is sandboxed // without 'allow-scripts'. if (doc->GetSandboxFlags() & SANDBOXED_SCRIPTS) { return NS_ERROR_DOM_SECURITY_ERR; } nsCOMPtr<nsIContentSecurityPolicy> csp; rv = doc->NodePrincipal()->GetCsp(getter_AddRefs(csp)); NS_ENSURE_SUCCESS(rv, rv); if (csp) { bool inlineOK = true; bool reportViolations = false; rv = csp->GetAllowsInlineScript(&reportViolations, &inlineOK); NS_ENSURE_SUCCESS(rv, rv); if (reportViolations) { // gather information to log with violation report nsIURI* uri = doc->GetDocumentURI(); nsAutoCString asciiSpec; if (uri) uri->GetAsciiSpec(asciiSpec); nsAutoString scriptSample, attr, tagName(NS_LITERAL_STRING("UNKNOWN")); aName->ToString(attr); nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(mTarget)); if (domNode) domNode->GetNodeName(tagName); // build a "script sample" based on what we know about this element scriptSample.Assign(attr); scriptSample.AppendLiteral(" attribute on "); scriptSample.Append(tagName); scriptSample.AppendLiteral(" element"); csp->LogViolationDetails(nsIContentSecurityPolicy::VIOLATION_TYPE_INLINE_SCRIPT, NS_ConvertUTF8toUTF16(asciiSpec), scriptSample, 0, EmptyString(), EmptyString()); } // return early if CSP wants us to block inline scripts if (!inlineOK) { return NS_OK; } } } // This might be the first reference to this language in the global // We must init the language before we attempt to fetch its context. if (NS_FAILED(global->EnsureScriptEnvironment())) { NS_WARNING("Failed to setup script environment for this language"); // but fall through and let the inevitable failure below handle it. } nsIScriptContext* context = global->GetScriptContext(); NS_ENSURE_TRUE(context, NS_ERROR_FAILURE); NS_ENSURE_STATE(global->GetGlobalJSObject()); JSAutoRequest ar(context->GetNativeContext()); JS::Rooted<JSObject*> scope(context->GetNativeContext(), global->GetGlobalJSObject()); Listener* listener = SetEventHandlerInternal(scope, aName, EmptyString(), nsEventHandler(), aPermitUntrustedEvents); if (!aDeferCompilation) { return CompileEventHandlerInternal(listener, &aBody, aElement); } return NS_OK; }