зеркало из https://github.com/mozilla/pjs.git
Change the binding parent for native anonymous content to work like the binding parent for XBL anonymous content, and be the parent of the anonymous content subtree rather than the root of the anonymous content subtree. (Bug 436453) r=bzbarsky,smaug,surkov sr=bzbarsky
This commit is contained in:
Родитель
138dc7e844
Коммит
957c98a91c
|
@ -191,8 +191,7 @@ NS_IMETHODIMP nsAccessNode::Init()
|
|||
// so that nsDocAccessible::RefreshNodes() can find the anonymous subtree to release when
|
||||
// the root node goes away
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(mDOMNode);
|
||||
if (content && (content->IsNativeAnonymous() ||
|
||||
content->GetBindingParent())) {
|
||||
if (content && content->IsInAnonymousSubtree()) {
|
||||
// Specific examples of where this is used: <input type="file"> and <xul:findbar>
|
||||
nsCOMPtr<nsIAccessible> parentAccessible;
|
||||
docAccessible->GetAccessibleInParentChain(mDOMNode, PR_TRUE, getter_AddRefs(parentAccessible));
|
||||
|
|
|
@ -796,7 +796,7 @@ nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode,
|
|||
nsAutoString controlID;
|
||||
if (!nsAccUtils::GetID(aForNode, controlID)) {
|
||||
binding = aForNode->GetBindingParent();
|
||||
if (binding == aForNode)
|
||||
if (aForNode->IsRootOfNativeAnonymousSubtree()) // XXX Was this the intent?
|
||||
return nsnull;
|
||||
|
||||
aForNode->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::anonid, controlID);
|
||||
|
|
|
@ -1941,6 +1941,7 @@ nsresult nsAccessible::GetXULName(nsAString& aLabel, PRBool aCanAggregateSubtree
|
|||
|
||||
// Can get text from title of <toolbaritem> if we're a child of a <toolbaritem>
|
||||
nsIContent *bindingParent = content->GetBindingParent();
|
||||
// XXXldb: Why do we skip to bindingParent's parent?
|
||||
nsIContent *parent = bindingParent? bindingParent->GetParent() :
|
||||
content->GetParent();
|
||||
while (parent) {
|
||||
|
|
|
@ -1760,9 +1760,8 @@ void nsDocAccessible::RefreshNodes(nsIDOMNode *aStartNode)
|
|||
getter_AddRefs(childAccessNode));
|
||||
childAccessNode->GetDOMNode(getter_AddRefs(possibleAnonNode));
|
||||
nsCOMPtr<nsIContent> iterContent = do_QueryInterface(possibleAnonNode);
|
||||
if (iterContent && (iterContent->IsNativeAnonymous() ||
|
||||
iterContent->GetBindingParent())) {
|
||||
// GetBindingParent() check is a perf win -- make sure we don't
|
||||
if (iterContent && iterContent->IsInAnonymousSubtree()) {
|
||||
// IsInAnonymousSubtree() check is a perf win -- make sure we don't
|
||||
// shut down the same subtree twice since we'll reach non-anon content via
|
||||
// DOM traversal later in this method
|
||||
RefreshNodes(possibleAnonNode);
|
||||
|
|
|
@ -640,7 +640,9 @@ nsresult nsHyperTextAccessible::DOMPointToHypertextOffset(nsIDOMNode* aNode, PRI
|
|||
if (findContent->IsNodeOfType(nsINode::eHTML) &&
|
||||
findContent->NodeInfo()->Equals(nsAccessibilityAtoms::br)) {
|
||||
nsIContent *parent = findContent->GetParent();
|
||||
if (parent && parent->IsNativeAnonymous() && parent->GetChildCount() == 1) {
|
||||
if (parent &&
|
||||
parent->IsRootOfNativeAnonymousSubtree() &&
|
||||
parent->GetChildCount() == 1) {
|
||||
// This <br> is the only node in a text control, therefore it is the hacky
|
||||
// "bogus node" used when there is no text in a control
|
||||
*aHyperTextOffset = 0;
|
||||
|
|
|
@ -146,7 +146,7 @@ public:
|
|||
* @see nsIAnonymousContentCreator
|
||||
* @return whether this content is anonymous
|
||||
*/
|
||||
PRBool IsNativeAnonymous() const
|
||||
PRBool IsRootOfNativeAnonymousSubtree() const
|
||||
{
|
||||
return HasFlag(NODE_IS_ANONYMOUS);
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ public:
|
|||
}
|
||||
nsIContent* content = GetBindingParent();
|
||||
while (content) {
|
||||
if (content->IsNativeAnonymous()) {
|
||||
if (content->IsRootOfNativeAnonymousSubtree()) {
|
||||
NS_ERROR("Element not marked to be in native anonymous subtree!");
|
||||
break;
|
||||
}
|
||||
|
@ -189,6 +189,31 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if and only if this node has a parent, but is not in
|
||||
* its parent's child list.
|
||||
*/
|
||||
PRBool IsRootOfAnonymousSubtree() const
|
||||
{
|
||||
NS_ASSERTION(!IsRootOfNativeAnonymousSubtree() ||
|
||||
(GetParent() && GetBindingParent() == GetParent()),
|
||||
"root of native anonymous subtree must have parent equal "
|
||||
"to binding parent");
|
||||
nsIContent *bindingParent = GetBindingParent();
|
||||
return bindingParent && bindingParent == GetParent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if and only if there is NOT a path through child lists
|
||||
* from the top of this node's parent chain back to this node.
|
||||
*/
|
||||
PRBool IsInAnonymousSubtree() const
|
||||
{
|
||||
NS_ASSERTION(!IsInNativeAnonymousSubtree() || GetBindingParent(),
|
||||
"must have binding parent when in native anonymous subtree");
|
||||
return GetBindingParent() != nsnull;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the namespace that this element's tag is defined in
|
||||
* @return the namespace
|
||||
|
@ -563,9 +588,12 @@ public:
|
|||
}
|
||||
|
||||
/**
|
||||
* Gets content node with the binding responsible for our construction (and
|
||||
* existence). Used by anonymous content (XBL-generated). null for all
|
||||
* explicit content.
|
||||
* Gets content node with the binding (or native code, possibly on the
|
||||
* frame) responsible for our construction (and existence). Used by
|
||||
* anonymous content (both XBL-generated and native-anonymous).
|
||||
*
|
||||
* null for all explicit content (i.e., content reachable from the top
|
||||
* of its GetParent() chain via child lists).
|
||||
*
|
||||
* @return the binding parent
|
||||
*/
|
||||
|
|
|
@ -1890,7 +1890,7 @@ nsContentUtils::GenerateStateKey(nsIContent* aContent,
|
|||
NS_ENSURE_TRUE(aContent, NS_ERROR_FAILURE);
|
||||
|
||||
// Don't capture state for anonymous content
|
||||
if (aContent->IsNativeAnonymous() || aContent->GetBindingParent()) {
|
||||
if (aContent->IsInAnonymousSubtree()) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -2145,8 +2145,8 @@ nsDocument::ElementFromPoint(PRInt32 aX, PRInt32 aY, nsIDOMElement** aReturn)
|
|||
// replace it with the first non-anonymous parent node of type element.
|
||||
while (ptContent &&
|
||||
!ptContent->IsNodeOfType(nsINode::eELEMENT) ||
|
||||
ptContent->GetBindingParent() ||
|
||||
ptContent->IsNativeAnonymous()) {
|
||||
ptContent->IsInAnonymousSubtree()) {
|
||||
// XXXldb: Faster to jump to GetBindingParent if non-null?
|
||||
ptContent = ptContent->GetParent();
|
||||
}
|
||||
|
||||
|
|
|
@ -592,8 +592,11 @@ nsGenericDOMDataNode::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
(!aBindingParent && aParent &&
|
||||
aParent->GetBindingParent() == GetBindingParent()),
|
||||
"Already have a binding parent. Unbind first!");
|
||||
NS_PRECONDITION(aBindingParent != this || IsNativeAnonymous(),
|
||||
"Only native anonymous content should have itself as its "
|
||||
NS_PRECONDITION(aBindingParent != this,
|
||||
"Content must not be its own binding parent");
|
||||
NS_PRECONDITION(!IsRootOfNativeAnonymousSubtree() ||
|
||||
aBindingParent == aParent,
|
||||
"Native anonymous content must have its parent as its "
|
||||
"own binding parent");
|
||||
|
||||
if (!aBindingParent && aParent) {
|
||||
|
@ -605,13 +608,14 @@ nsGenericDOMDataNode::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
nsDataSlots *slots = GetDataSlots();
|
||||
NS_ENSURE_TRUE(slots, NS_ERROR_OUT_OF_MEMORY);
|
||||
|
||||
NS_ASSERTION(IsNativeAnonymous() || !HasFlag(NODE_IS_IN_ANONYMOUS_SUBTREE) ||
|
||||
NS_ASSERTION(IsRootOfNativeAnonymousSubtree() ||
|
||||
!HasFlag(NODE_IS_IN_ANONYMOUS_SUBTREE) ||
|
||||
aBindingParent->IsInNativeAnonymousSubtree(),
|
||||
"Trying to re-bind content from native anonymous subtree to"
|
||||
"non-native anonymous parent!");
|
||||
slots->mBindingParent = aBindingParent; // Weak, so no addref happens.
|
||||
if (IsNativeAnonymous() ||
|
||||
aBindingParent->IsInNativeAnonymousSubtree()) {
|
||||
if (IsRootOfNativeAnonymousSubtree() ||
|
||||
aParent->IsInNativeAnonymousSubtree()) {
|
||||
SetFlags(NODE_IS_IN_ANONYMOUS_SUBTREE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -435,18 +435,15 @@ nsIContent*
|
|||
nsIContent::FindFirstNonNativeAnonymous() const
|
||||
{
|
||||
// This handles also nested native anonymous content.
|
||||
nsIContent* content = GetBindingParent();
|
||||
nsIContent* possibleResult =
|
||||
!IsNativeAnonymous() ? const_cast<nsIContent*>(this) : nsnull;
|
||||
while (content) {
|
||||
if (content->IsNativeAnonymous()) {
|
||||
content = possibleResult = content->GetParent();
|
||||
} else {
|
||||
content = content->GetBindingParent();
|
||||
for (const nsIContent *content = this; content;
|
||||
content = content->GetBindingParent()) {
|
||||
if (!content->IsInNativeAnonymousSubtree()) {
|
||||
// Oops, this function signature allows casting const to
|
||||
// non-const. (Then again, so does GetChildAt(0)->GetParent().)
|
||||
return const_cast<nsIContent*>(content);
|
||||
}
|
||||
}
|
||||
|
||||
return possibleResult;
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
@ -2091,11 +2088,11 @@ nsGenericElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
NS_PRECONDITION(!aParent || !aDocument ||
|
||||
!aParent->HasFlag(NODE_FORCE_XBL_BINDINGS),
|
||||
"Parent in document but flagged as forcing XBL");
|
||||
NS_PRECONDITION(aBindingParent != this || IsNativeAnonymous(),
|
||||
"Only native anonymous content should have itself as its "
|
||||
"own binding parent");
|
||||
NS_PRECONDITION(!IsNativeAnonymous() || aBindingParent == this,
|
||||
"Native anonymous content must have itself as its "
|
||||
NS_PRECONDITION(aBindingParent != this,
|
||||
"Content must not be its own binding parent");
|
||||
NS_PRECONDITION(!IsRootOfNativeAnonymousSubtree() ||
|
||||
aBindingParent == aParent,
|
||||
"Native anonymous content must have its parent as its "
|
||||
"own binding parent");
|
||||
|
||||
if (!aBindingParent && aParent) {
|
||||
|
@ -2121,13 +2118,13 @@ nsGenericElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|||
slots->mBindingParent = aBindingParent; // Weak, so no addref happens.
|
||||
}
|
||||
}
|
||||
NS_ASSERTION(!aBindingParent || IsNativeAnonymous() ||
|
||||
NS_ASSERTION(!aBindingParent || IsRootOfNativeAnonymousSubtree() ||
|
||||
!HasFlag(NODE_IS_IN_ANONYMOUS_SUBTREE) ||
|
||||
aBindingParent->IsInNativeAnonymousSubtree(),
|
||||
"Trying to re-bind content from native anonymous subtree to"
|
||||
"non-native anonymous parent!");
|
||||
if (IsNativeAnonymous() ||
|
||||
aBindingParent && aBindingParent->IsInNativeAnonymousSubtree()) {
|
||||
if (IsRootOfNativeAnonymousSubtree() ||
|
||||
aParent && aParent->IsInNativeAnonymousSubtree()) {
|
||||
SetFlags(NODE_IS_IN_ANONYMOUS_SUBTREE);
|
||||
}
|
||||
|
||||
|
@ -2302,7 +2299,7 @@ FindNativeAnonymousSubtreeOwner(nsIContent* aContent)
|
|||
if (aContent->IsInNativeAnonymousSubtree()) {
|
||||
PRBool isNativeAnon = PR_FALSE;
|
||||
while (aContent && !isNativeAnon) {
|
||||
isNativeAnon = aContent->IsNativeAnonymous();
|
||||
isNativeAnon = aContent->IsRootOfNativeAnonymousSubtree();
|
||||
aContent = aContent->GetParent();
|
||||
}
|
||||
}
|
||||
|
@ -2318,7 +2315,7 @@ nsGenericElement::doPreHandleEvent(nsIContent* aContent,
|
|||
|
||||
// Don't propagate mouseover and mouseout events when mouse is moving
|
||||
// inside native anonymous content.
|
||||
PRBool isAnonForEvents = aContent->IsNativeAnonymous();
|
||||
PRBool isAnonForEvents = aContent->IsRootOfNativeAnonymousSubtree();
|
||||
if ((aVisitor.mEvent->message == NS_MOUSE_ENTER_SYNTH ||
|
||||
aVisitor.mEvent->message == NS_MOUSE_EXIT_SYNTH) &&
|
||||
// This is an optimization - try to stop event propagation when
|
||||
|
|
|
@ -134,10 +134,8 @@ nsDOMEvent::nsDOMEvent(nsPresContext* aPresContext, nsEvent* aEvent)
|
|||
mExplicitOriginalTarget = GetTargetFromFrame();
|
||||
mTmpRealOriginalTarget = mExplicitOriginalTarget;
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(mExplicitOriginalTarget);
|
||||
if (content) {
|
||||
if (content->IsNativeAnonymous() || content->GetBindingParent()) {
|
||||
mExplicitOriginalTarget = nsnull;
|
||||
}
|
||||
if (content && content->IsInAnonymousSubtree()) {
|
||||
mExplicitOriginalTarget = nsnull;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1263,15 +1263,11 @@ nsBindingManager::WalkRules(nsStyleSet* aStyleSet,
|
|||
}
|
||||
}
|
||||
|
||||
nsIContent* parent = content->GetBindingParent();
|
||||
if (parent == content) {
|
||||
NS_ASSERTION(content->IsNativeAnonymous(), "Unexpected binding parent");
|
||||
|
||||
break; // The anonymous content case is often deliberately hacked to
|
||||
// return itself to cut off style inheritance here. Do that.
|
||||
if (content->IsRootOfNativeAnonymousSubtree()) {
|
||||
break; // Deliberately cut off style inheritance here.
|
||||
}
|
||||
|
||||
content = parent;
|
||||
content = content->GetBindingParent();
|
||||
} while (content);
|
||||
|
||||
// If "content" is non-null that means we cut off inheritance at some point
|
||||
|
|
|
@ -110,11 +110,10 @@ IsAncestorBinding(nsIDocument* aDocument,
|
|||
NS_ASSERTION(aChild, "expected a child content");
|
||||
|
||||
PRUint32 bindingRecursion = 0;
|
||||
nsIContent* bindingParent = aChild->GetBindingParent();
|
||||
nsBindingManager* bindingManager = aDocument->BindingManager();
|
||||
for (nsIContent* prev = aChild;
|
||||
bindingParent && prev != bindingParent;
|
||||
prev = bindingParent, bindingParent = bindingParent->GetBindingParent()) {
|
||||
for (nsIContent *bindingParent = aChild->GetBindingParent();
|
||||
bindingParent;
|
||||
bindingParent = bindingParent->GetBindingParent()) {
|
||||
nsXBLBinding* binding = bindingManager->GetBinding(bindingParent);
|
||||
if (!binding) {
|
||||
continue;
|
||||
|
|
|
@ -1086,6 +1086,7 @@ nsXULElement::UnregisterAccessKey(const nsAString& aOldValue)
|
|||
if (mNodeInfo->Equals(nsGkAtoms::label)) {
|
||||
// For anonymous labels the unregistering must
|
||||
// occur on the binding parent control.
|
||||
// XXXldb: And what if the binding parent is null?
|
||||
content = GetBindingParent();
|
||||
}
|
||||
|
||||
|
|
|
@ -440,7 +440,7 @@ nsEditor::GetDesiredSpellCheckState()
|
|||
return PR_FALSE;
|
||||
}
|
||||
|
||||
if (content->IsNativeAnonymous()) {
|
||||
if (content->IsRootOfNativeAnonymousSubtree()) {
|
||||
content = content->GetParent();
|
||||
}
|
||||
|
||||
|
@ -5241,7 +5241,7 @@ nsEditor::GetPIDOMEventTarget()
|
|||
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(rootElement);
|
||||
|
||||
if (content && content->IsNativeAnonymous())
|
||||
if (content && content->IsRootOfNativeAnonymousSubtree())
|
||||
{
|
||||
mEventTarget = do_QueryInterface(content->GetParent());
|
||||
piTarget = mEventTarget;
|
||||
|
|
|
@ -188,7 +188,7 @@ nsHTMLEditor::CreateAnonymousElement(const nsAString & aTag, nsIDOMNode * aPare
|
|||
|
||||
// establish parenthood of the element
|
||||
newContent->SetNativeAnonymous();
|
||||
res = newContent->BindToTree(doc, parentContent, newContent, PR_TRUE);
|
||||
res = newContent->BindToTree(doc, parentContent, parentContent, PR_TRUE);
|
||||
if (NS_FAILED(res)) {
|
||||
newContent->UnbindFromTree();
|
||||
return res;
|
||||
|
|
|
@ -5928,7 +5928,7 @@ nsHTMLEditor::IsAnonymousElement(nsIDOMElement * aElement, PRBool * aReturn)
|
|||
{
|
||||
NS_ENSURE_TRUE(aElement, NS_ERROR_NULL_POINTER);
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
||||
*aReturn = content->IsNativeAnonymous();
|
||||
*aReturn = content->IsRootOfNativeAnonymousSubtree();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -366,7 +366,7 @@ nsFindContentIterator::SetupInnerIterator(nsIContent* aContent)
|
|||
if (!aContent) {
|
||||
return;
|
||||
}
|
||||
NS_ASSERTION(!aContent->IsNativeAnonymous(), "invalid call");
|
||||
NS_ASSERTION(!aContent->IsRootOfNativeAnonymousSubtree(), "invalid call");
|
||||
|
||||
nsIDocument* doc = aContent->GetDocument();
|
||||
nsIPresShell* shell = doc ? doc->GetPrimaryShell() : nsnull;
|
||||
|
|
|
@ -411,21 +411,6 @@ FocusElementButNotDocument(nsIDocument* aDocument, nsIContent* aContent)
|
|||
esm->SetFocusedContent(nsnull);
|
||||
}
|
||||
|
||||
static PRBool
|
||||
IsInNativeAnonymousSubtree(nsIContent* aContent)
|
||||
{
|
||||
while (aContent) {
|
||||
nsIContent* bindingParent = aContent->GetBindingParent();
|
||||
if (bindingParent == aContent) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
aContent = bindingParent;
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
void nsWebBrowserFind::SetSelectionAndScroll(nsIDOMWindow* aWindow,
|
||||
nsIDOMRange* aRange)
|
||||
{
|
||||
|
@ -451,7 +436,7 @@ void nsWebBrowserFind::SetSelectionAndScroll(nsIDOMWindow* aWindow,
|
|||
// <textarea> or text <input>, we need to get the outer frame
|
||||
nsITextControlFrame *tcFrame = nsnull;
|
||||
for ( ; content; content = content->GetParent()) {
|
||||
if (!IsInNativeAnonymousSubtree(content)) {
|
||||
if (!content->IsInNativeAnonymousSubtree()) {
|
||||
nsIFrame* f = presShell->GetPrimaryFrameFor(content);
|
||||
if (!f)
|
||||
return;
|
||||
|
|
|
@ -1915,8 +1915,9 @@ nsCSSFrameConstructor::CreateAttributeContent(nsIContent* aParentContent,
|
|||
|
||||
content->SetNativeAnonymous();
|
||||
|
||||
// Set aContent as the parent content so that event handling works.
|
||||
rv = content->BindToTree(mDocument, aParentContent, content, PR_TRUE);
|
||||
// Set aParentContent as the parent content so that event handling works.
|
||||
// It is also the binding parent.
|
||||
rv = content->BindToTree(mDocument, aParentContent, aParentContent, PR_TRUE);
|
||||
if (NS_FAILED(rv)) {
|
||||
content->UnbindFromTree();
|
||||
return rv;
|
||||
|
@ -1985,11 +1986,8 @@ nsCSSFrameConstructor::CreateGeneratedFrameFor(nsIFrame* aParentFram
|
|||
content->SetNativeAnonymous();
|
||||
|
||||
// Set aContent as the parent content and set the document object. This
|
||||
// way event handling works
|
||||
// Hack the binding parent to make document rules not match (not
|
||||
// like it matters, since we already have a non-element style
|
||||
// context... which is totally wacky, but anyway).
|
||||
rv = content->BindToTree(mDocument, aContent, content, PR_TRUE);
|
||||
// way event handling works. It is also the binding parent.
|
||||
rv = content->BindToTree(mDocument, aContent, aContent, PR_TRUE);
|
||||
if (NS_FAILED(rv)) {
|
||||
content->UnbindFromTree();
|
||||
return rv;
|
||||
|
@ -2169,7 +2167,7 @@ nsCSSFrameConstructor::CreateGeneratedFrameFor(nsIFrame* aParentFram
|
|||
textContent->SetNativeAnonymous();
|
||||
|
||||
// Set aContent as the parent content so that event handling works.
|
||||
nsresult rv = textContent->BindToTree(mDocument, aContent, textContent,
|
||||
nsresult rv = textContent->BindToTree(mDocument, aContent, aContent,
|
||||
PR_TRUE);
|
||||
if (NS_FAILED(rv)) {
|
||||
textContent->UnbindFromTree();
|
||||
|
@ -3406,7 +3404,8 @@ IsSpecialContent(nsIContent* aContent,
|
|||
aTag == nsGkAtoms::menuitem ||
|
||||
aTag == nsGkAtoms::menubutton ||
|
||||
aTag == nsGkAtoms::menubar ||
|
||||
(aTag == nsGkAtoms::popupgroup && aContent->IsNativeAnonymous()) ||
|
||||
(aTag == nsGkAtoms::popupgroup &&
|
||||
aContent->IsRootOfNativeAnonymousSubtree()) ||
|
||||
aTag == nsGkAtoms::iframe ||
|
||||
aTag == nsGkAtoms::editor ||
|
||||
aTag == nsGkAtoms::browser ||
|
||||
|
@ -5699,20 +5698,17 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsFrameConstructorState& aState,
|
|||
nsIContent* content = newAnonymousItems[i];
|
||||
NS_ASSERTION(content, "null anonymous content?");
|
||||
|
||||
nsIContent* bindingParent = content;
|
||||
#ifdef MOZ_SVG
|
||||
// least-surprise CSS binding until we do the SVG specified
|
||||
// cascading rules for <svg:use> - bug 265894
|
||||
if (aParent &&
|
||||
aParent->NodeInfo()->Equals(nsGkAtoms::use, kNameSpaceID_SVG)) {
|
||||
bindingParent = aParent;
|
||||
} else
|
||||
if (!aParent ||
|
||||
!aParent->NodeInfo()->Equals(nsGkAtoms::use, kNameSpaceID_SVG))
|
||||
#endif
|
||||
{
|
||||
content->SetNativeAnonymous();
|
||||
}
|
||||
|
||||
rv = content->BindToTree(aDocument, aParent, bindingParent, PR_TRUE);
|
||||
rv = content->BindToTree(aDocument, aParent, aParent, PR_TRUE);
|
||||
if (NS_FAILED(rv)) {
|
||||
content->UnbindFromTree();
|
||||
return rv;
|
||||
|
@ -5912,7 +5908,8 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
|||
|
||||
newFrame = NS_NewMenuBarFrame(mPresShell, aStyleContext);
|
||||
}
|
||||
else if (aTag == nsGkAtoms::popupgroup && aContent->IsNativeAnonymous()) {
|
||||
else if (aTag == nsGkAtoms::popupgroup &&
|
||||
aContent->IsRootOfNativeAnonymousSubtree()) {
|
||||
// This frame contains child popups
|
||||
newFrame = NS_NewPopupSetFrame(mPresShell, aStyleContext);
|
||||
}
|
||||
|
@ -6174,7 +6171,8 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
|||
}
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
if (aTag == nsGkAtoms::popupgroup && aContent->IsNativeAnonymous()) {
|
||||
if (aTag == nsGkAtoms::popupgroup &&
|
||||
aContent->IsRootOfNativeAnonymousSubtree()) {
|
||||
nsIRootBox* rootBox = nsIRootBox::GetRootBox(mPresShell);
|
||||
if (rootBox) {
|
||||
NS_ASSERTION(rootBox->GetPopupSetFrame() == newFrame,
|
||||
|
@ -10569,13 +10567,15 @@ static PRBool
|
|||
IsBindingAncestor(nsIContent* aContent, nsIContent* aBindingRoot)
|
||||
{
|
||||
while (PR_TRUE) {
|
||||
// Native-anonymous content doesn't contain insertion points, so
|
||||
// we don't need to search through it.
|
||||
if (aContent->IsRootOfNativeAnonymousSubtree())
|
||||
return PR_FALSE;
|
||||
nsIContent* bindingParent = aContent->GetBindingParent();
|
||||
if (!bindingParent)
|
||||
return PR_FALSE;
|
||||
if (bindingParent == aBindingRoot)
|
||||
return PR_TRUE;
|
||||
if (bindingParent == aContent)
|
||||
return PR_FALSE;
|
||||
aContent = bindingParent;
|
||||
}
|
||||
}
|
||||
|
@ -10673,6 +10673,8 @@ nsCSSFrameConstructor::FindFrameWithContent(nsFrameManager* aFrameManager,
|
|||
// child frames, too.
|
||||
// We also need to search if the child content is anonymous and scoped
|
||||
// to the parent content.
|
||||
// XXXldb What makes us continue the search once we're inside
|
||||
// the anonymous subtree?
|
||||
if (aParentContent == kidContent ||
|
||||
(aParentContent && IsBindingAncestor(kidContent, aParentContent)))
|
||||
{
|
||||
|
@ -11652,7 +11654,7 @@ nsCSSFrameConstructor::CreateFloatingLetterFrame(
|
|||
// its primary frame to be a text frame). So use its parent for the
|
||||
// first-letter.
|
||||
nsIContent* letterContent = aTextContent->GetParent();
|
||||
NS_ASSERTION(letterContent->GetBindingParent() != letterContent,
|
||||
NS_ASSERTION(!letterContent->IsRootOfNativeAnonymousSubtree(),
|
||||
"Reframes of this letter frame will mess with the root of a "
|
||||
"native anonymous content subtree!");
|
||||
InitAndRestoreFrame(aState, letterContent,
|
||||
|
@ -11777,7 +11779,7 @@ nsCSSFrameConstructor::CreateLetterFrame(nsFrameConstructorState& aState,
|
|||
// content for a non-text frame (because we want its primary frame to
|
||||
// be a text frame). So use its parent for the first-letter.
|
||||
nsIContent* letterContent = aTextContent->GetParent();
|
||||
NS_ASSERTION(letterContent->GetBindingParent() != letterContent,
|
||||
NS_ASSERTION(!letterContent->IsRootOfNativeAnonymousSubtree(),
|
||||
"Reframes of this letter frame will mess with the root "
|
||||
"of a native anonymous content subtree!");
|
||||
letterFrame->Init(letterContent, aParentFrame, nsnull);
|
||||
|
@ -12947,7 +12949,7 @@ nsCSSFrameConstructor::RestyleForAppend(nsIContent* aContainer,
|
|||
NS_ASSERTION(index != aNewIndexInContainer, "yikes, nothing appended");
|
||||
break;
|
||||
}
|
||||
NS_ASSERTION(!content->IsNativeAnonymous(),
|
||||
NS_ASSERTION(!content->IsRootOfNativeAnonymousSubtree(),
|
||||
"native anonymous nodes should not be in child lists");
|
||||
}
|
||||
}
|
||||
|
@ -13006,7 +13008,7 @@ void
|
|||
nsCSSFrameConstructor::RestyleForInsertOrChange(nsIContent* aContainer,
|
||||
nsIContent* aChild)
|
||||
{
|
||||
NS_ASSERTION(!aChild->IsNativeAnonymous(),
|
||||
NS_ASSERTION(!aChild->IsRootOfNativeAnonymousSubtree(),
|
||||
"native anonymous nodes should not be in child lists");
|
||||
PRUint32 selectorFlags =
|
||||
aContainer ? (aContainer->GetFlags() & NODE_ALL_SELECTOR_FLAGS) : 0;
|
||||
|
@ -13087,7 +13089,7 @@ nsCSSFrameConstructor::RestyleForRemove(nsIContent* aContainer,
|
|||
nsIContent* aOldChild,
|
||||
PRInt32 aIndexInContainer)
|
||||
{
|
||||
NS_ASSERTION(!aOldChild->IsNativeAnonymous(),
|
||||
NS_ASSERTION(!aOldChild->IsRootOfNativeAnonymousSubtree(),
|
||||
"native anonymous nodes should not be in child lists");
|
||||
PRUint32 selectorFlags =
|
||||
aContainer ? (aContainer->GetFlags() & NODE_ALL_SELECTOR_FLAGS) : 0;
|
||||
|
|
|
@ -4635,7 +4635,7 @@ PresShell::CharacterDataChanged(nsIDocument *aDocument,
|
|||
nsIContent *container = aContent->GetParent();
|
||||
PRUint32 selectorFlags =
|
||||
container ? (container->GetFlags() & NODE_ALL_SELECTOR_FLAGS) : 0;
|
||||
if (selectorFlags != 0 && !aContent->IsNativeAnonymous()) {
|
||||
if (selectorFlags != 0 && !aContent->IsRootOfNativeAnonymousSubtree()) {
|
||||
PRUint32 index;
|
||||
if (aInfo->mAppend &&
|
||||
container->GetChildAt((index = container->GetChildCount() - 1)) ==
|
||||
|
|
|
@ -273,8 +273,10 @@ NS_IMETHODIMP BRFrame::GetAccessible(nsIAccessible** aAccessible)
|
|||
NS_ENSURE_TRUE(mContent, NS_ERROR_FAILURE);
|
||||
nsCOMPtr<nsIAccessibilityService> accService = do_GetService("@mozilla.org/accessibilityService;1");
|
||||
NS_ENSURE_TRUE(accService, NS_ERROR_FAILURE);
|
||||
nsCOMPtr<nsIContent> parent = mContent->GetBindingParent();
|
||||
if (parent && parent->IsNativeAnonymous() && parent->GetChildCount() == 1) {
|
||||
nsIContent *parent = mContent->GetParent();
|
||||
if (parent &&
|
||||
parent->IsRootOfNativeAnonymousSubtree() &&
|
||||
parent->GetChildCount() == 1) {
|
||||
// This <br> is the only node in a text control, therefore it is the hacky
|
||||
// "bogus node" used when there is no text in the control
|
||||
return NS_ERROR_FAILURE;
|
||||
|
|
|
@ -5717,7 +5717,7 @@ nsFrame::GetLastLeaf(nsPresContext* aPresContext, nsIFrame **aFrame)
|
|||
//see bug 278197 comment #12 #13 for details
|
||||
while ((siblingFrame = child->GetNextSibling()) &&
|
||||
(content = siblingFrame->GetContent()) &&
|
||||
!content->IsNativeAnonymous())
|
||||
!content->IsRootOfNativeAnonymousSubtree())
|
||||
child = siblingFrame;
|
||||
*aFrame = child;
|
||||
}
|
||||
|
@ -5849,7 +5849,8 @@ nsIFrame::IsFocusable(PRInt32 *aTabIndex, PRBool aWithMouse)
|
|||
if (!isFocusable && !aWithMouse &&
|
||||
GetType() == nsGkAtoms::scrollFrame &&
|
||||
mContent->IsNodeOfType(nsINode::eHTML) &&
|
||||
!mContent->IsNativeAnonymous() && mContent->GetParent() &&
|
||||
!mContent->IsRootOfNativeAnonymousSubtree() &&
|
||||
mContent->GetParent() &&
|
||||
!mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::tabindex)) {
|
||||
// Elements with scrollable view are focusable with script & tabbable
|
||||
// Otherwise you couldn't scroll them with keyboard, which is
|
||||
|
|
|
@ -349,7 +349,7 @@ inDOMView::GetCellProperties(PRInt32 row, nsITreeColumn* col, nsISupportsArray *
|
|||
if (!node) return NS_ERROR_FAILURE;
|
||||
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(node->node);
|
||||
if (content && content->GetBindingParent()) {
|
||||
if (content && content->IsInAnonymousSubtree()) {
|
||||
properties->AppendElement(kAnonymousAtom);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче