Additional cleanup related to bug 64116. r=bzbarsky.

This commit is contained in:
bryner%brianryner.com 2004-01-08 19:23:12 +00:00
Родитель 70413c6445
Коммит 83f9b1e537
19 изменённых файлов: 111 добавлений и 405 удалений

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

@ -53,7 +53,6 @@
#include "nsILoadGroup.h"
#include "nsReadableUtils.h"
#include "nsCRT.h"
#include <stdio.h> // for FILE definition
class nsIAtom;
class nsIContent;

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

@ -1519,7 +1519,9 @@ nsDocument::SetStyleSheetApplicableState(nsIStyleSheet* aSheet,
}
} else {
// We still need to notify the style set of the state change, because
// this will invalidate some of the rule processor data.
// this will invalidate some of the rule processor data. We do this
// here instead of in the pres shell because we _don't_ want to do this
// for document style sheets.
PRInt32 count = mPresShells.Count();
PRInt32 indx;
@ -1647,14 +1649,6 @@ nsDocument::RemoveObserver(nsIDocumentObserver* aObserver)
void
nsDocument::BeginUpdate(nsUpdateType aUpdateType)
{
if (aUpdateType & UPDATE_STYLE) {
PRInt32 shellCount = mPresShells.Count();
for (PRInt32 j = 0; j < shellCount; ++j) {
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(j))->StyleSet()->
BeginUpdate();
}
}
PRInt32 i;
for (i = mObservers.Count() - 1; i >= 0; --i) {
nsIDocumentObserver* observer = (nsIDocumentObserver*) mObservers[i];
@ -1665,14 +1659,6 @@ nsDocument::BeginUpdate(nsUpdateType aUpdateType)
void
nsDocument::EndUpdate(nsUpdateType aUpdateType)
{
if (aUpdateType & UPDATE_STYLE) {
PRInt32 shellCount = mPresShells.Count();
for (PRInt32 j = 0; j < shellCount; ++j) {
NS_STATIC_CAST(nsIPresShell*, mPresShells.ElementAt(j))->StyleSet()->
EndUpdate();
}
}
PRInt32 i;
for (i = mObservers.Count() - 1; i >= 0; --i) {
nsIDocumentObserver* observer = (nsIDocumentObserver*) mObservers[i];

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

@ -639,8 +639,8 @@ nsresult
DocumentViewerImpl::InitPresentationStuff(PRBool aDoInitialReflow)
{
// Create the style set...
nsStyleSet *styleSet;
nsresult rv = CreateStyleSet(mDocument, &styleSet);
nsAutoPtr<nsStyleSet> styleSet;
nsresult rv = CreateStyleSet(mDocument, getter_Transfers(styleSet));
NS_ENSURE_SUCCESS(rv, rv);
// Now make the shell for the document
@ -649,6 +649,9 @@ DocumentViewerImpl::InitPresentationStuff(PRBool aDoInitialReflow)
NS_ENSURE_SUCCESS(rv, rv);
// The pres shell owns the style set now.
styleSet.forget();
if (aDoInitialReflow) {
// Since InitialReflow() will create frames for *all* items
// that are currently in the document tree, we need to flush
@ -1191,8 +1194,8 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
if (mPresContext) {
// 3) Create a new style set for the document
nsStyleSet *styleSet;
rv = CreateStyleSet(mDocument, &styleSet);
nsAutoPtr<nsStyleSet> styleSet;
rv = CreateStyleSet(mDocument, getter_Transfers(styleSet));
if (NS_FAILED(rv))
return rv;
@ -1200,6 +1203,9 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
getter_AddRefs(mPresShell));
NS_ENSURE_SUCCESS(rv, rv);
// The pres shell owns the style set now.
styleSet.forget();
mPresShell->BeginObservingDocument();
// 4) Register the focus listener on the new document
@ -1594,7 +1600,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
NS_WARNING("unable to load UA style sheet");
}
nsStyleSet *styleSet = new nsStyleSet();
nsAutoPtr<nsStyleSet> styleSet(new nsStyleSet());
if (!styleSet) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -1663,6 +1669,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
styleSet->EndUpdate();
*aStyleSet = styleSet;
styleSet.forget();
return NS_OK;
}

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

@ -2608,7 +2608,8 @@ nsPrintEngine::ReflowPrintObject(nsPrintObject * aPO, PRBool aDoCalcShrink)
// init it with the DC
(aPO->mPresContext)->Init(mPrt->mPrintDocDC);
rv = mDocViewerPrint->CreateStyleSet(aPO->mDocument, &aPO->mStyleSet);
rv = mDocViewerPrint->CreateStyleSet(aPO->mDocument,
getter_Transfers(aPO->mStyleSet));
NS_ENSURE_SUCCESS(rv, rv);
aPO->mViewManager = do_CreateInstance(kViewManagerCID, &rv);

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

@ -81,7 +81,7 @@ public:
PrintObjectType mFrameType;
nsCOMPtr<nsIPresContext> mPresContext;
nsStyleSet *mStyleSet;
nsAutoPtr<nsStyleSet> mStyleSet;
nsCOMPtr<nsIPresShell> mPresShell;
nsCOMPtr<nsIViewManager> mViewManager;
nsCOMPtr<nsIWidget> mWindow;

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

@ -4358,6 +4358,9 @@ PRBool
nsRuleNode::Sweep()
{
// If we're not marked, then we have to delete ourself.
// However, we never allow the root node to GC itself, because nsStyleSet
// wants to hold onto the root node and not worry about re-creating a
// rule walker if the root node is deleted.
if (!(mDependentBits & NS_RULE_NODE_GC_MARK) && !IsRoot()) {
Destroy();
return PR_TRUE;

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

@ -55,7 +55,7 @@ nsStyleSet::nsStyleSet()
: mRuleTree(nsnull),
mRuleWalker(nsnull),
mDestroyedCount(0),
mBatching(PR_FALSE),
mBatching(0),
mInShutdown(PR_FALSE),
mDirty(0)
{
@ -70,8 +70,10 @@ nsStyleSet::Init(nsIPresContext *aPresContext)
NS_ENSURE_TRUE(gQuirkURI, NS_ERROR_OUT_OF_MEMORY);
}
if (!BuildDefaultStyleData(aPresContext))
return NS_ERROR_FAILURE;
if (!BuildDefaultStyleData(aPresContext)) {
mDefaultStyleData.Destroy(0, aPresContext);
return NS_ERROR_OUT_OF_MEMORY;
}
mRuleTree = nsRuleNode::CreateRootNode(aPresContext);
if (!mRuleTree) {
@ -195,10 +197,8 @@ nsStyleSet::ReplaceSheets(sheetType aType,
const nsCOMArray<nsIStyleSheet> &aNewSheets)
{
mSheets[aType].Clear();
for (PRInt32 i = 0; i < aNewSheets.Count(); ++i) {
if (!mSheets[aType].AppendObject(aNewSheets.ObjectAt(i)))
return NS_ERROR_OUT_OF_MEMORY;
}
if (!mSheets[aType].AppendObjects(aNewSheets))
return NS_ERROR_OUT_OF_MEMORY;
if (!mBatching)
return GatherRuleProcessors(aType);
@ -212,7 +212,7 @@ nsStyleSet::ReplaceSheets(sheetType aType,
nsresult
nsStyleSet::AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument)
{
NS_PRECONDITION((nsnull != aSheet) && (nsnull != aDocument), "null arg");
NS_PRECONDITION(aSheet && aDocument, "null arg");
CHECK_APPLICABLE;
nsCOMArray<nsIStyleSheet>& docSheets = mSheets[eDocSheet];
@ -248,21 +248,26 @@ nsStyleSet::AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument)
void
nsStyleSet::BeginUpdate()
{
mBatching = 1;
++mBatching;
}
nsresult
nsStyleSet::EndUpdate()
{
NS_ASSERTION(mBatching > 0, "Unbalanced EndUpdate");
if (--mBatching) {
// We're not completely done yet.
return NS_OK;
}
for (int i = 0; i < eSheetTypeCount; ++i) {
if (mDirty & 1 << i) {
if (mDirty & (1 << i)) {
nsresult rv = GatherRuleProcessors(i);
NS_ENSURE_SUCCESS(rv, rv);
}
}
mDirty = 0;
mBatching = 0;
return NS_OK;
}
@ -721,7 +726,7 @@ nsStyleSet::NotifyStyleContextDestroyed(nsIPresContext* aPresContext,
#endif
mRuleTree->Sweep();
NS_ASSERTION(deleted, "Root not must not be gc'd");
NS_ASSERTION(!deleted, "Root node must not be gc'd");
}
}

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

@ -49,6 +49,10 @@
class nsIURI;
// The style set object is created by the document viewer and ownership is
// then handed off to the PresShell. Only the PresShell should delete a
// style set.
class nsStyleSet
{
public:
@ -156,12 +160,13 @@ class nsStyleSet
// Free global data at module shutdown
static void FreeGlobals() { NS_IF_RELEASE(gQuirkURI); }
// APIs to manipulate the style sheet lists
// APIs to manipulate the style sheet lists.
// All sheet types are ordered most-significant-first.
enum sheetType {
eAgentSheet,
eUserSheet,
eDocSheet,
eOverrideSheet, // override sheets are ordered most significant first
eOverrideSheet,
eSheetTypeCount
};
@ -237,9 +242,10 @@ class nsStyleSet
PRInt32 mDestroyedCount; // used to batch style context GC
nsVoidArray mRoots; // style contexts with no parent
unsigned mBatching : 1;
PRUint16 mBatching;
unsigned mInShutdown : 1;
unsigned mDirty : 6; // one dirty bit is used per sheet type
unsigned mDirty : 7; // one dirty bit is used per sheet type
};
#endif

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

@ -639,8 +639,8 @@ nsresult
DocumentViewerImpl::InitPresentationStuff(PRBool aDoInitialReflow)
{
// Create the style set...
nsStyleSet *styleSet;
nsresult rv = CreateStyleSet(mDocument, &styleSet);
nsAutoPtr<nsStyleSet> styleSet;
nsresult rv = CreateStyleSet(mDocument, getter_Transfers(styleSet));
NS_ENSURE_SUCCESS(rv, rv);
// Now make the shell for the document
@ -649,6 +649,9 @@ DocumentViewerImpl::InitPresentationStuff(PRBool aDoInitialReflow)
NS_ENSURE_SUCCESS(rv, rv);
// The pres shell owns the style set now.
styleSet.forget();
if (aDoInitialReflow) {
// Since InitialReflow() will create frames for *all* items
// that are currently in the document tree, we need to flush
@ -1191,8 +1194,8 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
if (mPresContext) {
// 3) Create a new style set for the document
nsStyleSet *styleSet;
rv = CreateStyleSet(mDocument, &styleSet);
nsAutoPtr<nsStyleSet> styleSet;
rv = CreateStyleSet(mDocument, getter_Transfers(styleSet));
if (NS_FAILED(rv))
return rv;
@ -1200,6 +1203,9 @@ DocumentViewerImpl::SetDOMDocument(nsIDOMDocument *aDocument)
getter_AddRefs(mPresShell));
NS_ENSURE_SUCCESS(rv, rv);
// The pres shell owns the style set now.
styleSet.forget();
mPresShell->BeginObservingDocument();
// 4) Register the focus listener on the new document
@ -1594,7 +1600,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
NS_WARNING("unable to load UA style sheet");
}
nsStyleSet *styleSet = new nsStyleSet();
nsAutoPtr<nsStyleSet> styleSet(new nsStyleSet());
if (!styleSet) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -1663,6 +1669,7 @@ DocumentViewerImpl::CreateStyleSet(nsIDocument* aDocument,
styleSet->EndUpdate();
*aStyleSet = styleSet;
styleSet.forget();
return NS_OK;
}

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

@ -649,7 +649,7 @@ protected:
// we must share ownership.
nsIDocument* mDocument; // [STRONG]
nsIPresContext* mPresContext; // [STRONG]
nsStyleSet* mStyleSet; // [STRONG]
nsStyleSet* mStyleSet; // [OWNS]
nsIStyleFrameConstruction* mFrameConstructor; // [STRONG]
nsIViewManager* mViewManager; // [WEAK] docViewer owns it so I don't have to
nsIFrameManager* mFrameManager; // [STRONG]

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

@ -1644,9 +1644,7 @@ PresShell::Init(nsIDocument* aDocument,
// before creating any frames.
SetPreferenceStyleRules(PR_FALSE);
result = nsComponentManager::CreateInstance(kFrameSelectionCID, nsnull,
NS_GET_IID(nsIFrameSelection),
getter_AddRefs(mSelection));
mSelection = do_CreateInstance(kFrameSelectionCID, &result);
if (NS_FAILED(result))
return result;
@ -3541,6 +3539,9 @@ PresShell::BeginUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType)
#ifdef DEBUG
mUpdateCount++;
#endif
if (aUpdateType & UPDATE_STYLE)
mStyleSet->BeginUpdate();
return NS_OK;
}
@ -3552,6 +3553,9 @@ PresShell::EndUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType)
--mUpdateCount;
#endif
if (aUpdateType & UPDATE_STYLE)
mStyleSet->EndUpdate();
if (mStylesHaveChanged && (aUpdateType & UPDATE_STYLE))
return ReconstructStyleData();
@ -7097,7 +7101,7 @@ PresShell::VerifyIncrementalReflow()
// Create a new presentation shell to view the document. Use the
// exact same style information that this document has.
nsStyleSet *newSet;
nsAutoPtr<nsStyleSet> newSet;
rv = CloneStyleSet(mStyleSet, &newSet);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to clone style set");
rv = mDocument->CreateShell(cx, vm, newSet, &sh);

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

@ -649,7 +649,7 @@ protected:
// we must share ownership.
nsIDocument* mDocument; // [STRONG]
nsIPresContext* mPresContext; // [STRONG]
nsStyleSet* mStyleSet; // [STRONG]
nsStyleSet* mStyleSet; // [OWNS]
nsIStyleFrameConstruction* mFrameConstructor; // [STRONG]
nsIViewManager* mViewManager; // [WEAK] docViewer owns it so I don't have to
nsIFrameManager* mFrameManager; // [STRONG]

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

@ -1,331 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* 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 NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsIStyleFrameConstruction_h___
#define nsIStyleFrameConstruction_h___
#include "nsISupports.h"
#include "nsChangeHint.h"
class nsIPresShell;
class nsIPresContext;
class nsIContent;
class nsIFrame;
class nsIAtom;
class nsIStyleSheet;
class nsIStyleRule;
class nsStyleChangeList;
class nsIFrameManager;
class nsILayoutHistoryState;
// IID for the nsIStyleFrameConstruction interface {a6cf9066-15b3-11d2-932e-00805f8add32}
#define NS_ISTYLE_FRAME_CONSTRUCTION_IID \
{0xa6cf9066, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}}
/** a simple struct (that may someday be expanded)
* that contains data supplied by the caller to help
* the style set find a frame for a content node
*/
struct nsFindFrameHint
{
nsIFrame *mPrimaryFrameForPrevSibling; // weak ref to the primary frame for the content for which we need a frame
nsFindFrameHint() {
mPrimaryFrameForPrevSibling = nsnull;
};
};
/** Interface for objects that handle frame construction based on style.
* All frame construction goes through an object that implements this interface.
* Frames are built based on the state of the content model and the style model.
* Changes to either content or style can cause changes to the frame model.
*/
class nsIStyleFrameConstruction : public nsISupports {
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISTYLE_FRAME_CONSTRUCTION_IID)
/**
* Create frames for the root content element and its child content.
*
* @param aPresShell the presentation shell for which we will consturct a root frame
* @param aPresContext the presentation context
* @param aDocElement the content node to map into a root frame
* @param aFrameSubTree [OUT] the resulting frame tree (a root frame and its children)
*
* @return NS_OK
*/
NS_IMETHOD ConstructRootFrame(nsIPresShell* aPresShell,
nsIPresContext* aPresContext,
nsIContent* aDocElement,
nsIFrame*& aFrameSubTree) = 0;
/**
* Causes reconstruction of a frame hierarchy rooted by the
* document element frame. This is often called when radical style
* change precludes incremental reflow.
*
* @param aPresContext the presentation context
*
* @return NS_OK
*/
NS_IMETHOD ReconstructDocElementHierarchy(nsIPresContext* aPresContext) = 0;
/////////////// Content change notifications //////////////////
/**
* Notification that content was appended in the content tree.
* This may have the side effect of creating frames for the new content.
*
* @param aPresContext the presentation context
* @param aContainer the content node into which content was appended
* @param aNewIndexInContainer the index in aContainer at which the first
* content node was appended.
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD ContentAppended(nsIPresContext* aPresContext,
nsIContent* aContainer,
PRInt32 aNewIndexInContainer) = 0;
/**
* Notification that content was inserted in the content tree.
* This may have the side effect of creating frames for the new content.
*
* @param aPresContext the presentation context
* @param aContainer the content node into which content was appended
* @param aContainerFrame the frame which the content will be inserted under if
* aContainer has more than one frame; may be null, in which
* case primary frame is used.
* @param aChild the content node that was inserted
* @param aNewIndexInContainer the index of aChild in aContainer
* @param aFrameState the layout history object used to initialize the new frame(s)
* @param aInContentReplaced PR_TRUE must be passed in if this is called from ContentReplaced
* - this will prevent calling ReframeContainingBlock when a special
* inline block situation is detected
*
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD ContentInserted(nsIPresContext* aPresContext,
nsIContent* aContainer,
nsIFrame* aContainerFrame,
nsIContent* aChild,
PRInt32 aIndexInContainer,
nsILayoutHistoryState* aFrameState,
PRBool aInContentReplaced) = 0;
/**
* Notification that content was replaced in the content tree.
* This may have the side effect of creating frames for the new content.
*
* @param aPresContext the presentation context
* @param aContainer the content node into which content was appended
* @param aOldChild the content node that was replaced
* @param aNewChild the new content node that replaced aOldChild
* @param aNewIndexInContainer the index of aNewChild in aContainer
*
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD ContentReplaced(nsIPresContext* aPresContext,
nsIContent* aContainer,
nsIContent* aOldChild,
nsIContent* aNewChild,
PRInt32 aIndexInContainer) = 0;
/**
* Notification that content was inserted in the content tree.
* This may have the side effect of changing the frame tree
*
* @param aPresContext the presentation context
* @param aContainer the content node into which content was appended
* @param aChild the content node that was inserted
* @param aNewIndexInContainer the index of aChild in aContainer
* @param aInContentReplaced PR_TRUE must be passed in if this is called from ContentReplaced
* - this will prevent calling ReframeContainingBlock when a special
* inline block situation is detected
*
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD ContentRemoved(nsIPresContext* aPresContext,
nsIContent* aContainer,
nsIContent* aChild,
PRInt32 aIndexInContainer,
PRBool aInContentReplaced) = 0;
/**
* Notification that content was changed in the content tree.
* This may have the side effect of changing the frame tree
*
* @param aPresContext the presentation context
* @param aContent the content node that was changed
* @param aSubContent a hint to the frame system about the change
*
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD ContentChanged(nsIPresContext* aPresContext,
nsIContent* aContent,
nsISupports* aSubContent) = 0;
/**
* Notification that the state of a content node has changed.
* (ie: gained or lost focus, became active or hovered over)
*
* @param aPresContext the presentation context
* @param aContent1 the content node whose state was changed
* @param aContent2 an optional second content node whose state
* has also changed. The meaning of aContent2
* depends on the type of state change.
*
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD ContentStatesChanged(nsIPresContext* aPresContext,
nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask) = 0;
/**
* Notification that an attribute was changed for a content node
* This may have the side effect of changing the frame tree
*
* @param aPresContext the presentation context
* @param aContent the content node on which an attribute was changed
* @param aNameSpaceID the name space for the changed attribute
* @param aAttribute the attribute that was changed
* @param aHint a hint about the effect of the change
* see nsStyleConsts.h for legal values
* any of the consts of the form NS_STYLE_HINT_*
*
* @return NS_OK
* @see nsIDocumentObserver
*/
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
nsIContent* aContent,
PRInt32 aNameSpaceID,
nsIAtom* aAttribute,
PRInt32 aModType) = 0;
/**
* Method that actually handles style changes for effected frames.
* Note: this may not need to be a public method. Use with extreme caution.
*
* @param aRestyleArray A list of effected frames.
* @param aPresContext The presentation context.
*
* @return NS_OK
*/
NS_IMETHOD ProcessRestyledFrames(nsStyleChangeList& aRestyleArray,
nsIPresContext* aPresContext) = 0;
/////////////// misc methods //////////////////////
/**
* Notification that we were unable to render a replaced element.
* Called when the replaced element can not be rendered, and we should
* instead render the element's contents.
* For HTML, the content object associated with aFrame should either be a IMG
* element or an OBJECT element.
* This may have the side effect of changing the frame tree.
*
* @param aPresShell the presentation shell
* @param aPresContext the presentation context
* @param aFrame the frame constructed for the replaced element
*
* @return NS_OK
*/
NS_IMETHOD CantRenderReplacedElement(nsIPresShell* aPresShell,
nsIPresContext* aPresContext,
nsIFrame* aFrame) = 0;
/**
* Request to create a continuing frame
*
* @param aPresShell the presentation shell
* @param aPresContext the presentation context
* @param aFrame the frame for which we need a continuation
* @param aParentFrame the parent of aFrame
* @param aContinuingFrame [OUT] the resulting frame
*
* @return NS_OK
*/
NS_IMETHOD CreateContinuingFrame(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIFrame* aParentFrame,
nsIFrame** aContinuingFrame) = 0;
/** Request to find the primary frame associated with a given content object.
* This is typically called by the pres shell when there is no mapping in
* the pres shell hash table
*
* @param aPresContext the presentation context
* @param aFrameManager the frame manager for the frame being sought
* @param aContent the content node for which we seek a frame
* @param aFrame [OUT] the resulting frame, if any. may be null,
* indicating that no frame maps aContent
* @param aHint an optional hint used to make the search for aFrame faster
*/
NS_IMETHOD FindPrimaryFrameFor(nsIPresContext* aPresContext,
nsIFrameManager* aFrameManager,
nsIContent* aContent,
nsIFrame** aFrame,
nsFindFrameHint* aHint=nsnull) = 0;
/**
* Return the point in the frame hierarchy where the frame that
* will be constructed for |aChildContent| ought be inserted.
*
* @param aPresShell the presentation shell
* @param aParentFrame the frame that will parent the frame that is
* created for aChildContent
* @param aChildContent the child content for which a frame is to be
* created
* @param aInsertionPoint [OUT] the frame that should parent the frame
* for |aChildContent|.
*/
NS_IMETHOD GetInsertionPoint(nsIPresShell* aPresShell,
nsIFrame* aParentFrame,
nsIContent* aChildContent,
nsIFrame** aInsertionPoint,
PRBool* aMultiple = nsnull) = 0;
};
#endif /* nsIStyleFrameConstruction_h___ */

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

@ -1644,9 +1644,7 @@ PresShell::Init(nsIDocument* aDocument,
// before creating any frames.
SetPreferenceStyleRules(PR_FALSE);
result = nsComponentManager::CreateInstance(kFrameSelectionCID, nsnull,
NS_GET_IID(nsIFrameSelection),
getter_AddRefs(mSelection));
mSelection = do_CreateInstance(kFrameSelectionCID, &result);
if (NS_FAILED(result))
return result;
@ -3541,6 +3539,9 @@ PresShell::BeginUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType)
#ifdef DEBUG
mUpdateCount++;
#endif
if (aUpdateType & UPDATE_STYLE)
mStyleSet->BeginUpdate();
return NS_OK;
}
@ -3552,6 +3553,9 @@ PresShell::EndUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType)
--mUpdateCount;
#endif
if (aUpdateType & UPDATE_STYLE)
mStyleSet->EndUpdate();
if (mStylesHaveChanged && (aUpdateType & UPDATE_STYLE))
return ReconstructStyleData();
@ -7097,7 +7101,7 @@ PresShell::VerifyIncrementalReflow()
// Create a new presentation shell to view the document. Use the
// exact same style information that this document has.
nsStyleSet *newSet;
nsAutoPtr<nsStyleSet> newSet;
rv = CloneStyleSet(mStyleSet, &newSet);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to clone style set");
rv = mDocument->CreateShell(cx, vm, newSet, &sh);

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

@ -2608,7 +2608,8 @@ nsPrintEngine::ReflowPrintObject(nsPrintObject * aPO, PRBool aDoCalcShrink)
// init it with the DC
(aPO->mPresContext)->Init(mPrt->mPrintDocDC);
rv = mDocViewerPrint->CreateStyleSet(aPO->mDocument, &aPO->mStyleSet);
rv = mDocViewerPrint->CreateStyleSet(aPO->mDocument,
getter_Transfers(aPO->mStyleSet));
NS_ENSURE_SUCCESS(rv, rv);
aPO->mViewManager = do_CreateInstance(kViewManagerCID, &rv);

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

@ -81,7 +81,7 @@ public:
PrintObjectType mFrameType;
nsCOMPtr<nsIPresContext> mPresContext;
nsStyleSet *mStyleSet;
nsAutoPtr<nsStyleSet> mStyleSet;
nsCOMPtr<nsIPresShell> mPresShell;
nsCOMPtr<nsIViewManager> mViewManager;
nsCOMPtr<nsIWidget> mWindow;

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

@ -4358,6 +4358,9 @@ PRBool
nsRuleNode::Sweep()
{
// If we're not marked, then we have to delete ourself.
// However, we never allow the root node to GC itself, because nsStyleSet
// wants to hold onto the root node and not worry about re-creating a
// rule walker if the root node is deleted.
if (!(mDependentBits & NS_RULE_NODE_GC_MARK) && !IsRoot()) {
Destroy();
return PR_TRUE;

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

@ -55,7 +55,7 @@ nsStyleSet::nsStyleSet()
: mRuleTree(nsnull),
mRuleWalker(nsnull),
mDestroyedCount(0),
mBatching(PR_FALSE),
mBatching(0),
mInShutdown(PR_FALSE),
mDirty(0)
{
@ -70,8 +70,10 @@ nsStyleSet::Init(nsIPresContext *aPresContext)
NS_ENSURE_TRUE(gQuirkURI, NS_ERROR_OUT_OF_MEMORY);
}
if (!BuildDefaultStyleData(aPresContext))
return NS_ERROR_FAILURE;
if (!BuildDefaultStyleData(aPresContext)) {
mDefaultStyleData.Destroy(0, aPresContext);
return NS_ERROR_OUT_OF_MEMORY;
}
mRuleTree = nsRuleNode::CreateRootNode(aPresContext);
if (!mRuleTree) {
@ -195,10 +197,8 @@ nsStyleSet::ReplaceSheets(sheetType aType,
const nsCOMArray<nsIStyleSheet> &aNewSheets)
{
mSheets[aType].Clear();
for (PRInt32 i = 0; i < aNewSheets.Count(); ++i) {
if (!mSheets[aType].AppendObject(aNewSheets.ObjectAt(i)))
return NS_ERROR_OUT_OF_MEMORY;
}
if (!mSheets[aType].AppendObjects(aNewSheets))
return NS_ERROR_OUT_OF_MEMORY;
if (!mBatching)
return GatherRuleProcessors(aType);
@ -212,7 +212,7 @@ nsStyleSet::ReplaceSheets(sheetType aType,
nsresult
nsStyleSet::AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument)
{
NS_PRECONDITION((nsnull != aSheet) && (nsnull != aDocument), "null arg");
NS_PRECONDITION(aSheet && aDocument, "null arg");
CHECK_APPLICABLE;
nsCOMArray<nsIStyleSheet>& docSheets = mSheets[eDocSheet];
@ -248,21 +248,26 @@ nsStyleSet::AddDocStyleSheet(nsIStyleSheet* aSheet, nsIDocument* aDocument)
void
nsStyleSet::BeginUpdate()
{
mBatching = 1;
++mBatching;
}
nsresult
nsStyleSet::EndUpdate()
{
NS_ASSERTION(mBatching > 0, "Unbalanced EndUpdate");
if (--mBatching) {
// We're not completely done yet.
return NS_OK;
}
for (int i = 0; i < eSheetTypeCount; ++i) {
if (mDirty & 1 << i) {
if (mDirty & (1 << i)) {
nsresult rv = GatherRuleProcessors(i);
NS_ENSURE_SUCCESS(rv, rv);
}
}
mDirty = 0;
mBatching = 0;
return NS_OK;
}
@ -721,7 +726,7 @@ nsStyleSet::NotifyStyleContextDestroyed(nsIPresContext* aPresContext,
#endif
mRuleTree->Sweep();
NS_ASSERTION(deleted, "Root not must not be gc'd");
NS_ASSERTION(!deleted, "Root node must not be gc'd");
}
}

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

@ -49,6 +49,10 @@
class nsIURI;
// The style set object is created by the document viewer and ownership is
// then handed off to the PresShell. Only the PresShell should delete a
// style set.
class nsStyleSet
{
public:
@ -156,12 +160,13 @@ class nsStyleSet
// Free global data at module shutdown
static void FreeGlobals() { NS_IF_RELEASE(gQuirkURI); }
// APIs to manipulate the style sheet lists
// APIs to manipulate the style sheet lists.
// All sheet types are ordered most-significant-first.
enum sheetType {
eAgentSheet,
eUserSheet,
eDocSheet,
eOverrideSheet, // override sheets are ordered most significant first
eOverrideSheet,
eSheetTypeCount
};
@ -237,9 +242,10 @@ class nsStyleSet
PRInt32 mDestroyedCount; // used to batch style context GC
nsVoidArray mRoots; // style contexts with no parent
unsigned mBatching : 1;
PRUint16 mBatching;
unsigned mInShutdown : 1;
unsigned mDirty : 6; // one dirty bit is used per sheet type
unsigned mDirty : 7; // one dirty bit is used per sheet type
};
#endif