From 55e775a8a23b1cfffdcbfc61c8e1ba094de78a1c Mon Sep 17 00:00:00 2001 From: "bryner%brianryner.com" Date: Fri, 14 Jan 2005 23:12:20 +0000 Subject: [PATCH] Less-than-ideal fix for the problem where XTF insertion points don't work if the insertion point has only inline frame ancestors (which are not in the primary frame map) in the anonymous content tree. Track the insertion point content node as we're constructing anonymous content frames and insert the explicit content when we reach the insertion point. Bug 269023, r=bzbarsky, sr=dbaron. git-svn-id: svn://10.0.0.236/trunk@167749 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xtf/src/nsIXTFVisualWrapperPrivate.h | 3 + mozilla/layout/base/nsCSSFrameConstructor.cpp | 206 +++++++++++++++--- mozilla/layout/base/nsCSSFrameConstructor.h | 26 ++- mozilla/layout/generic/nsIFrame.h | 13 +- mozilla/layout/xtf/src/Makefile.in | 1 + mozilla/layout/xtf/src/nsXTFFrameUtils.cpp | 75 +++++++ mozilla/layout/xtf/src/nsXTFFrameUtils.h | 58 +++++ .../layout/xtf/src/nsXTFXMLDisplayFrame.cpp | 42 ++-- .../layout/xtf/src/nsXTFXULDisplayFrame.cpp | 20 +- 9 files changed, 372 insertions(+), 72 deletions(-) create mode 100644 mozilla/layout/xtf/src/nsXTFFrameUtils.cpp create mode 100644 mozilla/layout/xtf/src/nsXTFFrameUtils.h diff --git a/mozilla/content/xtf/src/nsIXTFVisualWrapperPrivate.h b/mozilla/content/xtf/src/nsIXTFVisualWrapperPrivate.h index 0bf8b243d52..d528b295f4f 100644 --- a/mozilla/content/xtf/src/nsIXTFVisualWrapperPrivate.h +++ b/mozilla/content/xtf/src/nsIXTFVisualWrapperPrivate.h @@ -41,6 +41,9 @@ #include "nsISupports.h" +class nsISupportsArray; +class nsIDOMElement; + //////////////////////////////////////////////////////////////////////// // nsIXTFVisualWrapperPrivate: private interface for visual frames diff --git a/mozilla/layout/base/nsCSSFrameConstructor.cpp b/mozilla/layout/base/nsCSSFrameConstructor.cpp index e70214f7b15..638d9fa5cca 100644 --- a/mozilla/layout/base/nsCSSFrameConstructor.cpp +++ b/mozilla/layout/base/nsCSSFrameConstructor.cpp @@ -894,7 +894,26 @@ private: nsIAtom* mChildListName; nsFrameConstructorState* mState; - friend struct nsFrameConstructorState; + friend class nsFrameConstructorState; +}; + +// Structure for saving the existing state when pushing/popping insertion +// points for nsIAnonymousContentCreator. The destructor restores the state +// to its previous state. See documentation of these members in +// nsFrameConstructorState. +class nsFrameConstructorInsertionState { +public: + nsFrameConstructorInsertionState(); + ~nsFrameConstructorInsertionState(); + +private: + nsIFrame* mAnonymousCreator; + nsIContent* mInsertionContent; + PRBool mCreatorIsBlock; + + nsFrameConstructorState* mState; + + friend class nsFrameConstructorState; }; // Structure used for maintaining state information during the @@ -914,6 +933,13 @@ public: nsCOMPtr mFrameState; nsPseudoFrames mPseudoFrames; + // The nsIAnonymousContentCreator we're currently constructing children for. + nsIFrame *mAnonymousCreator; + // The insertion point node for mAnonymousCreator. + nsIContent *mInsertionContent; + // Whether the parent is a block (see ProcessChildren's aParentIsBlock) + PRBool mCreatorIsBlock; + // Constructor // Use the passed-in history state. nsFrameConstructorState(nsPresContext* aPresContext, @@ -979,8 +1005,15 @@ public: PRBool aCanBePositioned = PR_TRUE, PRBool aCanBeFloated = PR_TRUE); + // Push an nsIAnonymousContentCreator and its insertion node + void PushAnonymousContentCreator(nsIFrame *aCreator, + nsIContent *aContent, + PRBool aIsBlock, + nsFrameConstructorInsertionState &aSaveState); + protected: friend class nsFrameConstructorSaveState; + friend class nsFrameConstructorInsertionState; /** * ProcessFrameInsertions takes the frames in aFrameItems and adds them as @@ -1004,7 +1037,10 @@ nsFrameConstructorState::nsFrameConstructorState(nsPresContext* aPresCont mFirstLetterStyle(PR_FALSE), mFirstLineStyle(PR_FALSE), mFrameState(aHistoryState), - mPseudoFrames() + mPseudoFrames(), + mAnonymousCreator(nsnull), + mInsertionContent(nsnull), + mCreatorIsBlock(PR_FALSE) { } @@ -1020,7 +1056,10 @@ nsFrameConstructorState::nsFrameConstructorState(nsPresContext* aPresCont mFloatedItems(aFloatContainingBlock), mFirstLetterStyle(PR_FALSE), mFirstLineStyle(PR_FALSE), - mPseudoFrames() + mPseudoFrames(), + mAnonymousCreator(nsnull), + mInsertionContent(nsnull), + mCreatorIsBlock(PR_FALSE) { nsCOMPtr container = aPresContext->GetContainer(); nsCOMPtr docShell(do_QueryInterface(container)); @@ -1212,6 +1251,23 @@ nsFrameConstructorState::AddChild(nsIFrame* aNewFrame, return NS_OK; } +void +nsFrameConstructorState::PushAnonymousContentCreator(nsIFrame *aCreator, + nsIContent *aContent, + PRBool aIsBlock, + nsFrameConstructorInsertionState &aSaveState) +{ + NS_ASSERTION(aCreator || !aContent, "Must have a frame if there is an insertion node"); + aSaveState.mAnonymousCreator = mAnonymousCreator; + aSaveState.mInsertionContent = mInsertionContent; + aSaveState.mCreatorIsBlock = mCreatorIsBlock; + aSaveState.mState = this; + + mAnonymousCreator = aCreator; + mInsertionContent = aContent; + mCreatorIsBlock = aIsBlock; +} + void nsFrameConstructorState::ProcessFrameInsertions(nsAbsoluteItems& aFrameItems, nsIAtom* aChildListName) @@ -1320,6 +1376,40 @@ nsFrameConstructorSaveState::~nsFrameConstructorSaveState() } } +nsFrameConstructorInsertionState::nsFrameConstructorInsertionState() + : mAnonymousCreator(nsnull), + mInsertionContent(nsnull), + mCreatorIsBlock(PR_FALSE), + mState(nsnull) +{ +} + +nsFrameConstructorInsertionState::~nsFrameConstructorInsertionState() +{ + // Restore the state + if (mState) { + mState->mAnonymousCreator = mAnonymousCreator; + mState->mInsertionContent = mInsertionContent; + mState->mCreatorIsBlock = mCreatorIsBlock; + } +} + +// Putting this up here to help inlining work on compilers that won't inline +// definitions that are after the call site. +inline nsresult +nsCSSFrameConstructor::CreateInsertionPointChildren(nsIPresShell *aPresShell, + nsPresContext *aPresContext, + nsFrameConstructorState &aState, + nsIFrame *aNewFrame, + nsIContent *aContent, + PRBool aUseInsertionFrame) +{ + if (aState.mInsertionContent == aContent) + return CreateInsertionPointChildren(aPresShell, aPresContext, aState, + aNewFrame, aUseInsertionFrame); + + return NS_OK; +} static PRBool IsBorderCollapse(nsIFrame* aFrame) @@ -5298,6 +5388,12 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsIPresShell* aPresShell, } } + if (newFrame) { + rv = CreateInsertionPointChildren(aPresShell, aPresContext, + aState, newFrame, aContent); + NS_ENSURE_SUCCESS(rv, rv); + } + if (addToHashTable) { // Add a mapping from content object to primary frame. Note that for // floated and positioned frames this is the out-of-flow frame and not @@ -5387,7 +5483,8 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsIPresShell* aPresShell return CreateAnonymousFrames(aPresShell, aPresContext, aState, aParent, mDocument, aNewFrame, PR_FALSE, - aAppendToExisting, aChildItems); + aAppendToExisting, aChildItems, + nsnull, nsnull, PR_FALSE); } // after the node has been constructed and initialized create any @@ -5401,13 +5498,22 @@ nsCSSFrameConstructor::CreateAnonymousFrames(nsIPresShell* aPresShell nsIFrame* aParentFrame, PRBool aForceBindingParent, PRBool aAppendToExisting, - nsFrameItems& aChildItems) + nsFrameItems& aChildItems, + nsIFrame* aAnonymousCreator, + nsIContent* aInsertionNode, + PRBool aAnonymousParentIsBlock) { nsCOMPtr creator(do_QueryInterface(aParentFrame)); if (!creator) return NS_OK; + nsFrameConstructorInsertionState saveState; + aState.PushAnonymousContentCreator(aAnonymousCreator, + aInsertionNode, + aAnonymousParentIsBlock, + saveState); + nsCOMPtr anonymousItems; NS_NewISupportsArray(getter_AddRefs(anonymousItems)); @@ -6044,6 +6150,12 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell, // addToHashTable: + if (newFrame) { + rv = CreateInsertionPointChildren(aPresShell, aPresContext, + aState, newFrame, aContent); + NS_ENSURE_SUCCESS(rv, rv); + } + if (topFrame) { // the top frame is always what we map the content to. This is the frame that contains a pointer // to the content node. @@ -6299,7 +6411,7 @@ nsCSSFrameConstructor::InitGfxScrollFrame(nsIPresShell* aPresShell, // if there are any anonymous children for the scroll frame, create frames for them. CreateAnonymousFrames(aPresShell, aPresContext, aState, aContent, aDocument, aNewFrame, - PR_FALSE, PR_FALSE, aAnonymousFrames); + PR_FALSE, PR_FALSE, aAnonymousFrames, nsnull, nsnull, PR_FALSE); return NS_OK; } @@ -6678,12 +6790,18 @@ nsCSSFrameConstructor::ConstructFrameByDisplayType(nsIPresShell* aPre "Cases where AddChild() can fail must handle it themselves"); } - if (newFrame && addToHashTable) { - // Add a mapping from content object to primary frame. Note that for - // floated and positioned frames this is the out-of-flow frame and not - // the placeholder frame - if (!primaryFrameSet) - aState.mFrameManager->SetPrimaryFrameFor(aContent, newFrame); + if (newFrame) { + rv = CreateInsertionPointChildren(aPresShell, aPresContext, + aState, newFrame, aContent); + NS_ENSURE_SUCCESS(rv, rv); + + if (addToHashTable) { + // Add a mapping from content object to primary frame. Note that for + // floated and positioned frames this is the out-of-flow frame and not + // the placeholder frame + if (!primaryFrameSet) + aState.mFrameManager->SetPrimaryFrameFor(aContent, newFrame); + } } return rv; @@ -6937,6 +7055,8 @@ nsCSSFrameConstructor::ConstructMathMLFrame(nsIPresShell* aPresShell, // Set the frame's initial child list newFrame->SetInitialChildList(aPresContext, nsnull, childItems.childList); + rv = CreateInsertionPointChildren(aPresShell, aPresContext, + aState, newFrame, aContent); } return rv; } @@ -7013,6 +7133,11 @@ nsCSSFrameConstructor::ConstructXTFFrame(nsIPresShell* aPresShell, return rv; } + // Get the content node in the anonymous content tree where the explicit + // children should be inserted. + + nsCOMPtr insertionNode = newFrame->GetContentInsertionNode(); + // Create anonymous frames before processing children, so that // explicit child content can be appended to the correct anonymous // frame. Call version of CreateAnonymousFrames that doesn't check @@ -7023,25 +7148,24 @@ nsCSSFrameConstructor::ConstructXTFFrame(nsIPresShell* aPresShell, "xtf wrapper not implementing nsIXTFVisualWrapperPrivate"); nsFrameItems childItems; + + // Since we've set the insertion frame, our children will automatically + // be constructed once |insertionNode| has had its frame created. + // Call version of CreateAnonymousFrames that doesn't check tag: + CreateAnonymousFrames(aPresShell, aPresContext, aState, aContent, mDocument, newFrame, visual->ApplyDocumentStyleSheets(), - PR_FALSE, childItems); + PR_FALSE, childItems, + newFrame, insertionNode, isBlock); // Set the frame's initial child list newFrame->SetInitialChildList(aPresContext, nsnull, childItems.childList); - - // Process the child content if requested - nsIFrame *insertionFrame = newFrame->GetContentInsertionFrame(); - if (insertionFrame) { - nsFrameItems insertionItems; - rv = ProcessChildren(aPresShell, aPresContext, aState, aContent, - insertionFrame, PR_TRUE, insertionItems, isBlock); - if (insertionItems.childList) { - AppendFrames(aPresContext, aPresShell,aState.mFrameManager, - aContent, insertionFrame, - insertionItems.childList); - } - } + + // Note: we don't worry about insertionFrame here because we know + // that XTF elements always insert into the primary frame of their + // insertion content. + rv = CreateInsertionPointChildren(aPresShell, aPresContext, + aState, newFrame, aContent, PR_FALSE); } return rv; } @@ -7363,6 +7487,9 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsIPresShell* aPresShell, // Set the frame's initial child list newFrame->SetInitialChildList(aPresContext, nsnull, childItems.childList); } + + rv = CreateInsertionPointChildren(aPresShell, aPresContext, + aState, newFrame, aContent); } return rv; } @@ -13667,4 +13794,29 @@ nsCSSFrameConstructor::RestyleEvent::RestyleEvent(nsCSSFrameConstructor* aConstr PL_InitEvent(this, aConstructor, ::HandleRestyleEvent, ::DestroyRestyleEvent); } - + +nsresult +nsCSSFrameConstructor::CreateInsertionPointChildren(nsIPresShell *aPresShell, + nsPresContext *aPresContext, + nsFrameConstructorState &aState, + nsIFrame *aNewFrame, + PRBool aUseInsertionFrame) +{ + nsIContent *creatorContent = aState.mAnonymousCreator->GetContent(); + nsFrameItems insertionItems; + + nsIFrame *insertionFrame = + aUseInsertionFrame ? aNewFrame->GetContentInsertionFrame() : aNewFrame; + + nsresult rv = ProcessChildren(aPresShell, aPresContext, aState, + creatorContent, insertionFrame, PR_TRUE, + insertionItems, aState.mCreatorIsBlock); + + if (NS_SUCCEEDED(rv) && insertionItems.childList) { + rv = AppendFrames(aPresContext, aPresShell, aState.mFrameManager, + creatorContent, insertionFrame, + insertionItems.childList); + } + + return rv; +} diff --git a/mozilla/layout/base/nsCSSFrameConstructor.h b/mozilla/layout/base/nsCSSFrameConstructor.h index ab079118930..4cfd6c22878 100644 --- a/mozilla/layout/base/nsCSSFrameConstructor.h +++ b/mozilla/layout/base/nsCSSFrameConstructor.h @@ -69,8 +69,8 @@ struct nsFindFrameHint nsFindFrameHint() : mPrimaryFrameForPrevSibling(nsnull) { } }; -struct nsFrameConstructorState; - +class nsFrameConstructorState; + class nsCSSFrameConstructor { public: @@ -606,7 +606,10 @@ private: nsIFrame* aNewFrame, PRBool aForceBindingParent, PRBool aAppendToExisting, - nsFrameItems& aChildItems); + nsFrameItems& aChildItems, + nsIFrame* aAnonymousCreator, + nsIContent* aInsertionNode, + PRBool aAnonymousParentIsBlock); //MathML Mod - RBS #ifdef MOZ_MATHML @@ -1079,6 +1082,21 @@ private: mQuoteList.RecalcAll(); } + inline NS_HIDDEN_(nsresult) + CreateInsertionPointChildren(nsIPresShell *aPresShell, + nsPresContext *aPresContext, + nsFrameConstructorState &aState, + nsIFrame *aNewFrame, + nsIContent *aContent, + PRBool aUseInsertionFrame = PR_TRUE); + + NS_HIDDEN_(nsresult) + CreateInsertionPointChildren(nsIPresShell *aPresShell, + nsPresContext *aPresContext, + nsFrameConstructorState &aState, + nsIFrame *aNewFrame, + PRBool aUseInsertionFrame); + public: struct RestyleData; friend struct RestyleData; @@ -1101,7 +1119,7 @@ public: void HandleEvent(); }; - friend struct nsFrameConstructorState; + friend class nsFrameConstructorState; protected: nsCOMPtr mRestyleEventQueue; diff --git a/mozilla/layout/generic/nsIFrame.h b/mozilla/layout/generic/nsIFrame.h index 87a5b49eee3..927427d691f 100644 --- a/mozilla/layout/generic/nsIFrame.h +++ b/mozilla/layout/generic/nsIFrame.h @@ -94,9 +94,9 @@ struct nsMargin; typedef class nsIFrame nsIBox; // IID for the nsIFrame interface -// 8657598f-a18a-4b7f-96f3-6e7fe8a8beee +// c8f3532b-ed45-4812-8da9-2a1b0afe4179 #define NS_IFRAME_IID \ - { 0x8657598f, 0xa18a, 0x4b7f, { 0x96, 0xf3, 0x6e, 0x7f, 0xe8, 0xa8, 0xbe, 0xee } } + { 0xc8f3532b, 0xed45, 0x4812, { 0x8d, 0xa9, 0x2a, 0x1b, 0x0a, 0xfe, 0x41, 0x79 } } /** * Indication of how the frame can be split. This is used when doing runaround @@ -563,6 +563,15 @@ public: */ virtual nsIFrame* GetContentInsertionFrame() { return this; } + /** + * Get the child content node whose frame should be used as the parent for + * the frames of child elements. A frame can implement this method, instead + * of GetContentInsertionFrame, if its insertion point corresponds to a + * content node, and the frame for that node is not constructed immediately + * when the frame is initialized. + */ + virtual already_AddRefed GetContentInsertionNode() { return nsnull; } + /** * Get the offsets of the frame. most will be 0,0 * diff --git a/mozilla/layout/xtf/src/Makefile.in b/mozilla/layout/xtf/src/Makefile.in index a7fea3f5493..8a011310c36 100644 --- a/mozilla/layout/xtf/src/Makefile.in +++ b/mozilla/layout/xtf/src/Makefile.in @@ -64,6 +64,7 @@ REQUIRES = xpcom \ CPPSRCS = \ nsXTFXULDisplayFrame.cpp \ nsXTFXMLDisplayFrame.cpp \ + nsXTFFrameUtils.cpp \ $(NULL) ifdef MOZ_SVG diff --git a/mozilla/layout/xtf/src/nsXTFFrameUtils.cpp b/mozilla/layout/xtf/src/nsXTFFrameUtils.cpp new file mode 100644 index 00000000000..9f16169e62f --- /dev/null +++ b/mozilla/layout/xtf/src/nsXTFFrameUtils.cpp @@ -0,0 +1,75 @@ +/* -*- 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 the Mozilla XTF project. + * + * The Initial Developer of the Original Code is + * IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Ryner + * Alex Fritze + * + * 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 NPL, 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 "nsXTFFrameUtils.h" +#include "nsIFrame.h" +#include "nsIXTFVisualWrapperPrivate.h" +#include "nsIDOMElement.h" + +nsIFrame* +nsXTFFrameUtils::GetContentInsertionFrame(nsIFrame *aFrame) +{ + nsCOMPtr content = + nsXTFFrameUtils::GetContentInsertionNode(aFrame); + + NS_ASSERTION(content, "element not implementing nsIContent!?"); + + nsIFrame* insertionFrame = nsnull; + aFrame->GetPresContext()->PresShell()->GetPrimaryFrameFor(content, + &insertionFrame); + return insertionFrame; +} + + +already_AddRefed +nsXTFFrameUtils::GetContentInsertionNode(nsIFrame *aFrame) +{ + nsCOMPtr visual = + do_QueryInterface(aFrame->GetContent()); + NS_ASSERTION(visual, "huh? associated content not implementing nsIXTFVisualWrapperPrivate"); + + nsCOMPtr childInsertionPoint; + visual->GetInsertionPoint(getter_AddRefs(childInsertionPoint)); + if (!childInsertionPoint) return nsnull; // we don't take visual child content + + nsIContent *content = nsnull; + CallQueryInterface(childInsertionPoint, &content); + return content; +} + diff --git a/mozilla/layout/xtf/src/nsXTFFrameUtils.h b/mozilla/layout/xtf/src/nsXTFFrameUtils.h new file mode 100644 index 00000000000..baf0b6651f7 --- /dev/null +++ b/mozilla/layout/xtf/src/nsXTFFrameUtils.h @@ -0,0 +1,58 @@ +/* -*- 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 the Mozilla XTF project. + * + * The Initial Developer of the Original Code is + * IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Ryner + * Alex Fritze + * + * 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 NPL, 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 nsXTFFrameUtils_h_ +#define nsXTFFrameUtils_h_ + +#include "nsIContent.h" +#include "nsCOMPtr.h" + +class nsIFrame; + +class nsXTFFrameUtils +{ +public: + + static NS_HIDDEN_(already_AddRefed) + GetContentInsertionNode(nsIFrame *aFrame); + + static NS_HIDDEN_(nsIFrame*) GetContentInsertionFrame(nsIFrame *aFrame); +}; + +#endif diff --git a/mozilla/layout/xtf/src/nsXTFXMLDisplayFrame.cpp b/mozilla/layout/xtf/src/nsXTFXMLDisplayFrame.cpp index 5e6e44b9ada..e08d5d13fb6 100644 --- a/mozilla/layout/xtf/src/nsXTFXMLDisplayFrame.cpp +++ b/mozilla/layout/xtf/src/nsXTFXMLDisplayFrame.cpp @@ -46,6 +46,7 @@ #include "nsIDOMElement.h" #include "nsIXTFVisualWrapperPrivate.h" #include "nsIAnonymousContentCreator.h" +#include "nsXTFFrameUtils.h" //////////////////////////////////////////////////////////////////////// // nsXTFXMLBlockDisplayFrame @@ -71,6 +72,7 @@ private: public: // nsIFrame virtual nsIFrame* GetContentInsertionFrame(); + virtual already_AddRefed GetContentInsertionNode(); NS_IMETHOD DidReflow(nsPresContext* aPresContext, const nsHTMLReflowState* aReflowState, @@ -108,22 +110,15 @@ NS_INTERFACE_MAP_END_INHERITING(nsXTFXMLBlockDisplayFrameBase) nsIFrame* nsXTFXMLBlockDisplayFrame::GetContentInsertionFrame() { - nsCOMPtr visual = do_QueryInterface(mContent); - NS_ASSERTION(visual, "huh? associated content not implementing nsIXTFVisualWrapperPrivate"); - - nsCOMPtr childInsertionPoint; - visual->GetInsertionPoint(getter_AddRefs(childInsertionPoint)); - if (!childInsertionPoint) return nsnull; // we don't take visual child content - - nsCOMPtr content = do_QueryInterface(childInsertionPoint); - NS_ASSERTION(content, "element not implementing nsIContent!?"); - - nsIFrame* insertionFrame = nsnull; - GetPresContext()->PresShell()->GetPrimaryFrameFor(content, &insertionFrame); - return insertionFrame; + return nsXTFFrameUtils::GetContentInsertionFrame(this); } +already_AddRefed +nsXTFXMLBlockDisplayFrame::GetContentInsertionNode() +{ + return nsXTFFrameUtils::GetContentInsertionNode(this); +} NS_IMETHODIMP nsXTFXMLBlockDisplayFrame::DidReflow(nsPresContext* aPresContext, @@ -174,6 +169,7 @@ private: public: // nsIFrame virtual nsIFrame* GetContentInsertionFrame(); + virtual already_AddRefed GetContentInsertionNode(); NS_IMETHOD DidReflow(nsPresContext* aPresContext, const nsHTMLReflowState* aReflowState, @@ -211,22 +207,14 @@ NS_INTERFACE_MAP_END_INHERITING(nsXTFXMLInlineDisplayFrameBase) nsIFrame* nsXTFXMLInlineDisplayFrame::GetContentInsertionFrame() { - nsCOMPtr visual = do_QueryInterface(mContent); - NS_ASSERTION(visual, "huh? associated content not implementing nsIXTFVisualWrapperPrivate"); - - nsCOMPtr childInsertionPoint; - visual->GetInsertionPoint(getter_AddRefs(childInsertionPoint)); - if (!childInsertionPoint) return nsnull; // we don't take visual child content - - nsCOMPtr content = do_QueryInterface(childInsertionPoint); - NS_ASSERTION(content, "element not implementing nsIContent!?"); - - nsIFrame* insertionFrame = nsnull; - GetPresContext()->PresShell()->GetPrimaryFrameFor(content, &insertionFrame); - return insertionFrame; + return nsXTFFrameUtils::GetContentInsertionFrame(this); } - +already_AddRefed +nsXTFXMLInlineDisplayFrame::GetContentInsertionNode() +{ + return nsXTFFrameUtils::GetContentInsertionNode(this); +} NS_IMETHODIMP nsXTFXMLInlineDisplayFrame::DidReflow(nsPresContext* aPresContext, diff --git a/mozilla/layout/xtf/src/nsXTFXULDisplayFrame.cpp b/mozilla/layout/xtf/src/nsXTFXULDisplayFrame.cpp index 183d52491c6..fac4690af64 100644 --- a/mozilla/layout/xtf/src/nsXTFXULDisplayFrame.cpp +++ b/mozilla/layout/xtf/src/nsXTFXULDisplayFrame.cpp @@ -40,6 +40,7 @@ #include "nsIDOMElement.h" #include "nsIXTFVisualWrapperPrivate.h" #include "nsIAnonymousContentCreator.h" +#include "nsXTFFrameUtils.h" typedef nsBoxFrame nsXTFXULDisplayFrameBase; @@ -61,6 +62,7 @@ private: public: // nsIFrame virtual nsIFrame* GetContentInsertionFrame(); + virtual already_AddRefed GetContentInsertionNode(); NS_IMETHOD EndLayout(nsBoxLayoutState& aState); @@ -108,19 +110,13 @@ NS_INTERFACE_MAP_END_INHERITING(nsXTFXULDisplayFrameBase) nsIFrame* nsXTFXULDisplayFrame::GetContentInsertionFrame() { - nsCOMPtr visual = do_QueryInterface(mContent); - NS_ASSERTION(visual, "huh? associated content not implementing nsIXTFVisualWrapperPrivate"); - - nsCOMPtr childInsertionPoint; - visual->GetInsertionPoint(getter_AddRefs(childInsertionPoint)); - if (!childInsertionPoint) return nsnull; // we don't take visual child content - - nsCOMPtr content = do_QueryInterface(childInsertionPoint); - NS_ASSERTION(content, "element not implementing nsIContent!?"); + return nsXTFFrameUtils::GetContentInsertionFrame(this); +} - nsIFrame* insertionFrame = nsnull; - GetPresContext()->GetPresShell()->GetPrimaryFrameFor(content, &insertionFrame); - return insertionFrame; +already_AddRefed +nsXTFXULDisplayFrame::GetContentInsertionNode() +{ + return nsXTFFrameUtils::GetContentInsertionNode(this); } NS_IMETHODIMP