зеркало из https://github.com/mozilla/pjs.git
69455 - enable noframes content when frames are disabled
r=heikki,sr=waterson,a=choffmann
This commit is contained in:
Родитель
e97ca9d0fd
Коммит
6836236914
|
@ -462,18 +462,6 @@ nsPlainTextSerializer::CloseFrameset(const nsIParserNode& aNode)
|
|||
return CloseContainer(aNode);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsPlainTextSerializer::OpenNoscript(const nsIParserNode& aNode)
|
||||
{
|
||||
return OpenContainer(aNode);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsPlainTextSerializer::CloseNoscript(const nsIParserNode& aNode)
|
||||
{
|
||||
return CloseContainer(aNode);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsPlainTextSerializer::DoFragment(PRBool aFlag)
|
||||
{
|
||||
|
|
|
@ -98,8 +98,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition) { return NS_OK; }
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition) { return NS_OK; }
|
||||
|
|
|
@ -199,6 +199,7 @@ HTML_ATOM(method, "method")
|
|||
HTML_ATOM(multicol, "multicol")
|
||||
HTML_ATOM(multiple, "multiple")
|
||||
HTML_ATOM(name, "name")
|
||||
HTML_ATOM(noframes, "noframes")
|
||||
HTML_ATOM(nohref, "nohref")
|
||||
HTML_ATOM(noresize, "noresize")
|
||||
HTML_ATOM(noscript, "noscript")
|
||||
|
|
|
@ -134,9 +134,12 @@ static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CI
|
|||
#ifdef NS_DEBUG
|
||||
static PRLogModuleInfo* gSinkLogModuleInfo;
|
||||
|
||||
#define SINK_TRACE_CALLS 0x1
|
||||
#define SINK_TRACE_REFLOW 0x2
|
||||
#define SINK_ALWAYS_REFLOW 0x4
|
||||
#define SINK_TRACE_CALLS 0x1
|
||||
#define SINK_TRACE_REFLOW 0x2
|
||||
#define SINK_ALWAYS_REFLOW 0x4
|
||||
|
||||
#define NS_SINK_FLAG_SCRIPT_ENABLED 0x8
|
||||
#define NS_SINK_FLAG_FRAMES_ENABLED 0x10
|
||||
|
||||
#define SINK_LOG_TEST(_lm,_bit) (PRIntn((_lm)->level) & (_bit))
|
||||
|
||||
|
@ -213,8 +216,7 @@ public:
|
|||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref);
|
||||
|
||||
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
|
@ -351,6 +353,7 @@ public:
|
|||
nsICSSLoader* mCSSLoader;
|
||||
PRInt32 mInsideNoXXXTag;
|
||||
PRInt32 mInMonolithicContainer;
|
||||
PRUint32 mFlags;
|
||||
|
||||
void StartLayout();
|
||||
|
||||
|
@ -2203,6 +2206,7 @@ HTMLContentSink::HTMLContentSink() {
|
|||
mInMonolithicContainer = 0;
|
||||
mInsideNoXXXTag = 0;
|
||||
mNodeInfoManager = nsnull;
|
||||
mFlags=0;
|
||||
}
|
||||
|
||||
HTMLContentSink::~HTMLContentSink()
|
||||
|
@ -2307,6 +2311,22 @@ HTMLContentSink::Init(nsIDocument* aDoc,
|
|||
mWebShell = aContainer;
|
||||
NS_ADDREF(aContainer);
|
||||
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(mWebShell));
|
||||
NS_ASSERTION(docShell,"oops no docshell!");
|
||||
if (docShell) {
|
||||
PRBool enabled;
|
||||
|
||||
docShell->GetAllowJavascript(&enabled);
|
||||
if (enabled) {
|
||||
mFlags |= NS_SINK_FLAG_SCRIPT_ENABLED;
|
||||
}
|
||||
|
||||
docShell->GetAllowSubframes(&enabled);
|
||||
if (enabled) {
|
||||
mFlags |= NS_SINK_FLAG_FRAMES_ENABLED;
|
||||
}
|
||||
}
|
||||
|
||||
NS_WITH_SERVICE(nsIPref, prefs, kPrefServiceCID, &rv);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
|
@ -3014,7 +3034,8 @@ HTMLContentSink::OpenFrameset(const nsIParserNode& aNode)
|
|||
mCurrentContext->mStackPos, this);
|
||||
|
||||
nsresult rv = mCurrentContext->OpenContainer(aNode);
|
||||
if ((NS_OK == rv) && (nsnull == mFrameset)) {
|
||||
if ((NS_SUCCEEDED(rv)) && (!mFrameset) &&
|
||||
(mFlags & NS_SINK_FLAG_FRAMES_ENABLED)) {
|
||||
mFrameset = mCurrentContext->mStack[mCurrentContext->mStackPos-1].mContent;
|
||||
NS_ADDREF(mFrameset);
|
||||
}
|
||||
|
@ -3038,7 +3059,8 @@ HTMLContentSink::CloseFrameset(const nsIParserNode& aNode)
|
|||
nsresult rv = sc->CloseContainer(aNode);
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: nsHTMLContentSink::CloseFrameset()\n"));
|
||||
MOZ_TIMER_STOP(mWatch);
|
||||
if (done) {
|
||||
|
||||
if (done && (mFlags & NS_SINK_FLAG_FRAMES_ENABLED)) {
|
||||
StartLayout();
|
||||
}
|
||||
return rv;
|
||||
|
@ -3080,84 +3102,21 @@ HTMLContentSink::CloseMap(const nsIParserNode& aNode)
|
|||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
* From the pref determine if the noscript content should be
|
||||
* processed or not. If java script is enabled then inform
|
||||
* DTD that the content should be treated as an alternate content,i.e.,
|
||||
* the content should not be treated as a regular content.
|
||||
*
|
||||
* harishd 08/24/00
|
||||
* @param aNode - The noscript node
|
||||
* return NS_OK if succeeded else ERROR
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLContentSink::OpenNoscript(const nsIParserNode& aNode) {
|
||||
nsresult result=NS_OK;
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: nsHTMLContentSink::OpenNoscript()\n"));
|
||||
MOZ_TIMER_START(mWatch);
|
||||
SINK_TRACE_NODE(SINK_TRACE_CALLS,
|
||||
"HTMLContentSink::OpenNoscript", aNode,
|
||||
mCurrentContext->mStackPos, this);
|
||||
|
||||
nsCOMPtr<nsIPref> prefs(do_GetService("@mozilla.org/preferences;1", &result));
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
PRBool jsEnabled;
|
||||
result=prefs->GetBoolPref("javascript.enabled", &jsEnabled);
|
||||
if(NS_SUCCEEDED(result)){
|
||||
// If JS is disabled then we want to lose the noscript element
|
||||
// ,and therefore don't OpenContainer, so that the noscript contents
|
||||
// get handled as if noscript wasn't present.
|
||||
if(jsEnabled) {
|
||||
|
||||
result=mCurrentContext->OpenContainer(aNode);
|
||||
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
mInsideNoXXXTag++; // To indicate that no processing should be done to this content
|
||||
result=NS_HTMLPARSER_ALTERNATECONTENT; // Inform DTD that the noscript content should be treated as CDATA.
|
||||
}
|
||||
}
|
||||
}
|
||||
HTMLContentSink::GetPref(PRInt32 aTag,PRBool& aPref) {
|
||||
nsHTMLTag theHTMLTag = nsHTMLTag(aTag);
|
||||
|
||||
if (theHTMLTag == eHTMLTag_script) {
|
||||
aPref = mFlags & NS_SINK_FLAG_SCRIPT_ENABLED;
|
||||
}
|
||||
else if (theHTMLTag == eHTMLTag_frameset) {
|
||||
aPref = mFlags & NS_SINK_FLAG_FRAMES_ENABLED;
|
||||
}
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: nsHTMLContentSink::OpenNoscript()\n"));
|
||||
MOZ_TIMER_STOP(mWatch);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close noscript and enable processing for rest of the content,
|
||||
* outside noscript
|
||||
*
|
||||
* harishd 08/24/00
|
||||
* @param aNode - The noscript node
|
||||
* return NS_OK if succeeded else ERROR
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
HTMLContentSink::CloseNoscript(const nsIParserNode& aNode) {
|
||||
|
||||
// When JS is diabled this method wouldn't get called because
|
||||
// noscript element will not be present then.
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: nsHTMLContentSink::CloseNoscript()\n"));
|
||||
MOZ_TIMER_START(mWatch);
|
||||
SINK_TRACE_NODE(SINK_TRACE_CALLS,
|
||||
"HTMLContentSink::CloseNoscript", aNode,
|
||||
mCurrentContext->mStackPos-1, this);
|
||||
|
||||
nsresult result=mCurrentContext->CloseContainer(aNode);
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
NS_ASSERTION((mInsideNoXXXTag > -1), "mInsideNoXXXTag underflow");
|
||||
if (mInsideNoXXXTag > 0) {
|
||||
mInsideNoXXXTag--;
|
||||
}
|
||||
else {
|
||||
aPref = PR_FALSE;
|
||||
}
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: nsHTMLContentSink::CloseNoscript()\n"));
|
||||
MOZ_TIMER_STOP(mWatch);
|
||||
return result;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -3168,11 +3127,11 @@ HTMLContentSink::OpenContainer(const nsIParserNode& aNode)
|
|||
nsresult rv = NS_OK;
|
||||
// XXX work around parser bug
|
||||
if (eHTMLTag_frameset == aNode.GetNodeType()) {
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: nsHTMLContentSink::OpenContainer()\n"));
|
||||
MOZ_TIMER_STOP(mWatch);
|
||||
return OpenFrameset(aNode);
|
||||
rv = OpenFrameset(aNode);
|
||||
}
|
||||
else {
|
||||
rv = mCurrentContext->OpenContainer(aNode);
|
||||
}
|
||||
rv = mCurrentContext->OpenContainer(aNode);
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: nsHTMLContentSink::OpenContainer()\n"));
|
||||
MOZ_TIMER_STOP(mWatch);
|
||||
return rv;
|
||||
|
|
|
@ -92,6 +92,7 @@ public:
|
|||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD OpenMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD FlushPendingNotifications() { return NS_OK; }
|
||||
|
|
|
@ -199,6 +199,7 @@ HTML_ATOM(method, "method")
|
|||
HTML_ATOM(multicol, "multicol")
|
||||
HTML_ATOM(multiple, "multiple")
|
||||
HTML_ATOM(name, "name")
|
||||
HTML_ATOM(noframes, "noframes")
|
||||
HTML_ATOM(nohref, "nohref")
|
||||
HTML_ATOM(noresize, "noresize")
|
||||
HTML_ATOM(noscript, "noscript")
|
||||
|
|
|
@ -139,6 +139,7 @@ nsDocShell::nsDocShell() :
|
|||
mAllowPlugins(PR_TRUE),
|
||||
mAllowJavascript(PR_TRUE),
|
||||
mAllowMetaRedirects(PR_TRUE),
|
||||
mAllowSubframes(PR_TRUE),
|
||||
mAppType(nsIDocShell::APP_TYPE_UNKNOWN),
|
||||
mBusyFlags(BUSY_FLAGS_NONE),
|
||||
mEODForCurrentDocument (PR_FALSE),
|
||||
|
@ -750,6 +751,21 @@ nsDocShell::SetAllowMetaRedirects(PRBool aValue)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetAllowSubframes(PRBool* aAllowSubframes)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aAllowSubframes);
|
||||
|
||||
*aAllowSubframes = mAllowSubframes;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::SetAllowSubframes(PRBool aAllowSubframes)
|
||||
{
|
||||
mAllowSubframes = aAllowSubframes;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDocShell::GetAppType(PRUint32* aAppType)
|
||||
{
|
||||
|
@ -1687,6 +1703,8 @@ NS_IMETHODIMP nsDocShell::Create()
|
|||
// so read it in once here and be done with it...
|
||||
mPrefs->GetBoolPref("network.protocols.useSystemDefaults", &mUseExternalProtocolHandler);
|
||||
mPrefs->GetBoolPref("browser.target_new_blocked", &mDisallowPopupWindows);
|
||||
mPrefs->GetBoolPref("javascript.enabled", &mAllowJavascript);
|
||||
mPrefs->GetBoolPref("browser.frames.enabled", &mAllowSubframes);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -293,6 +293,7 @@ protected:
|
|||
PRBool mAllowPlugins;
|
||||
PRBool mAllowJavascript;
|
||||
PRBool mAllowMetaRedirects;
|
||||
PRBool mAllowSubframes;
|
||||
PRUint32 mAppType;
|
||||
PRInt32 mChildOffset; // Offset in the parent's child list.
|
||||
PRUint32 mBusyFlags;
|
||||
|
|
|
@ -148,10 +148,15 @@ interface nsIDocShell : nsISupports
|
|||
*/
|
||||
attribute boolean allowJavascript;
|
||||
|
||||
/**
|
||||
* Attribute stating if refresh based redirects can be allowed
|
||||
*/
|
||||
attribute boolean allowMetaRedirects;
|
||||
/*
|
||||
Attribute stating if refresh based redirects can be allowed
|
||||
*/
|
||||
attribute boolean allowMetaRedirects;
|
||||
|
||||
/*
|
||||
Attribute stating if it should allow subframes (framesets/iframes) or not.
|
||||
*/
|
||||
attribute boolean allowSubframes;
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -34,7 +34,8 @@ interface nsIWebBrowserSetup : nsISupports
|
|||
{
|
||||
const unsigned long SETUP_ALLOW_PLUGINS = 1;
|
||||
const unsigned long SETUP_ALLOW_JAVASCRIPT = 2;
|
||||
const unsigned long SETUP_ALLOW_META_REDIRECTS =3;
|
||||
const unsigned long SETUP_ALLOW_META_REDIRECTS = 3;
|
||||
const unsigned long SETUP_ALLOW_SUBFRAMES = 4;
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -629,6 +629,13 @@ NS_IMETHODIMP nsWebBrowser::SetProperty(PRUint32 aId, PRUint32 aValue)
|
|||
mDocShell->SetAllowMetaRedirects(aValue);
|
||||
}
|
||||
break;
|
||||
case nsIWebBrowserSetup::SETUP_ALLOW_SUBFRAMES:
|
||||
{
|
||||
NS_ENSURE_STATE(mDocShell);
|
||||
NS_ENSURE_TRUE((aValue == PR_TRUE || aValue == PR_FALSE), NS_ERROR_INVALID_ARG);
|
||||
mDocShell->SetAllowSubframes(aValue);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
|
|
|
@ -71,8 +71,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode){ return NS_OK; }
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD OpenContainer(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseContainer(const nsIParserNode& aNode);
|
||||
NS_IMETHOD NotifyError(const nsParserError* aError);
|
||||
|
|
|
@ -94,15 +94,18 @@ static char gShowCRC;
|
|||
************************************************************************/
|
||||
|
||||
|
||||
#define NS_PARSER_FLAG_NONE 0x00
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_BODY 0x01
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_FORM 0x02
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_SCRIPT 0x04
|
||||
#define NS_PARSER_FLAG_HAD_BODY 0x08
|
||||
#define NS_PARSER_FLAG_HAD_FRAMESET 0x10
|
||||
#define NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE 0x20
|
||||
#define NS_PARSER_FLAG_REQUESTED_HEAD 0x40
|
||||
#define NS_PARSER_FLAG_IS_FORM_CONTAINER 0x80
|
||||
#define NS_PARSER_FLAG_NONE 0x00000000
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_BODY 0x00000001
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_FORM 0x00000002
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_SCRIPT 0x00000004
|
||||
#define NS_PARSER_FLAG_HAD_BODY 0x00000008
|
||||
#define NS_PARSER_FLAG_HAD_FRAMESET 0x00000010
|
||||
#define NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE 0x00000020
|
||||
#define NS_PARSER_FLAG_REQUESTED_HEAD 0x00000040
|
||||
#define NS_PARSER_FLAG_IS_FORM_CONTAINER 0x00000080
|
||||
#define NS_PARSER_FLAG_SCRIPT_ENABLED 0x00000100
|
||||
#define NS_PARSER_FLAG_FRAMES_ENABLED 0x00000200
|
||||
#define NS_PARSER_FLAG_ALTERNATE_CONTENT 0x00000400 // NOFRAMES, NOSCRIPT
|
||||
|
||||
/**
|
||||
* This method gets called as part of our COM-like interfaces.
|
||||
|
@ -149,37 +152,41 @@ NS_IMPL_RELEASE(CNavDTD)
|
|||
*/
|
||||
CNavDTD::CNavDTD() : nsIDTD(),
|
||||
mMisplacedContent(0),
|
||||
mSkippedContent(0) {
|
||||
NS_INIT_REFCNT();
|
||||
mSkippedContent(0),
|
||||
mSink(0),
|
||||
mTokenAllocator(0),
|
||||
mTempContext(0),
|
||||
mOpenHeadCount(0),
|
||||
mOpenMapCount(0),
|
||||
mParser(0),
|
||||
mTokenizer(0),
|
||||
mDocType(eHTML3Text),
|
||||
mDTDMode(eDTDMode_quirks),
|
||||
mParserCommand(eViewNormal),
|
||||
mSkipTarget(eHTMLTag_unknown),
|
||||
mDTDState(NS_OK),
|
||||
mFlags(NS_PARSER_FLAG_NONE),
|
||||
#ifdef ENABLE_CRC
|
||||
mComputedCRC32(0),
|
||||
mExpectedCRC32(0),
|
||||
#endif
|
||||
|
||||
mSink = nsnull;
|
||||
|
||||
mTempContext=nsnull;
|
||||
#ifdef NS_DEBUG
|
||||
mDTDDebug(0),
|
||||
#endif
|
||||
mLineNumber(1)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
mBodyContext=new nsDTDContext();
|
||||
|
||||
mOpenHeadCount=0;
|
||||
mOpenMapCount=0;
|
||||
mAlternateTagOpenCount=0;
|
||||
mLineNumber=1;
|
||||
|
||||
mComputedCRC32=0;
|
||||
mExpectedCRC32=0;
|
||||
|
||||
mFlags = NS_PARSER_FLAG_NONE;
|
||||
|
||||
mParser=nsnull;
|
||||
mTokenizer=nsnull;
|
||||
mDTDState=NS_OK;
|
||||
mDocType=eHTML3Text;
|
||||
|
||||
mDTDDebug=0; // Why is this not ifdefed?
|
||||
|
||||
#ifdef RICKG_DEBUG
|
||||
//DebugDumpContainmentRules2(*this,"c:/temp/DTDRules.new","New CNavDTD Containment Rules");
|
||||
nsHTMLElement::DebugDumpContainment("c:/temp/contain.new","ElementTable Rules");
|
||||
nsHTMLElement::DebugDumpMembership("c:/temp/membership.out");
|
||||
nsHTMLElement::DebugDumpContainType("c:/temp/ctnrules.out");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -281,7 +288,9 @@ CNavDTD::~CNavDTD(){
|
|||
NS_IF_RELEASE(mSink);
|
||||
}
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
NS_IF_RELEASE(mDTDDebug);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -323,7 +332,7 @@ PRBool CNavDTD::Verify(nsString& aURLRef,nsIParser* aParser){
|
|||
* breaks on some compilers because of some broken
|
||||
* streams code in prstrm.cpp.
|
||||
*/
|
||||
#if !defined(MOZ_DISABLE_DTD_DEBUG)
|
||||
#ifdef NS_DEBUG
|
||||
if(!mDTDDebug){
|
||||
nsresult rval = NS_NewDTDDebug(&mDTDDebug);
|
||||
if (NS_OK != rval) {
|
||||
|
@ -332,11 +341,12 @@ PRBool CNavDTD::Verify(nsString& aURLRef,nsIParser* aParser){
|
|||
}
|
||||
else mDTDDebug->SetVerificationDirectory(kVerificationDir);
|
||||
}
|
||||
#endif
|
||||
|
||||
if(mDTDDebug) {
|
||||
// mDTDDebug->Verify(this,aParser,mBodyContext->GetCount(),mBodyContext->mStack,aURLRef);
|
||||
}
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -408,7 +418,6 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
|
|||
mFilename=aParserContext.mScanner->GetFilename();
|
||||
mFlags = NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE; // residual style is always on. This will also reset the flags
|
||||
mLineNumber=1;
|
||||
mAlternateTagOpenCount=0;
|
||||
mDTDMode=aParserContext.mDTDMode;
|
||||
mParserCommand=aParserContext.mParserCommand;
|
||||
mMimeType=aParserContext.mMimeType;
|
||||
|
@ -432,7 +441,6 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
|
|||
//proxy for the real sink we're given from the parser.
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
|
||||
nsLoggingSink *theLogSink=GetLoggingSink();
|
||||
if(theLogSink) {
|
||||
theLogSink->SetProxySink(mSink);
|
||||
|
@ -444,10 +452,28 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
|
|||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
|
||||
|
||||
if(mSink) {
|
||||
PRBool enabled;
|
||||
mSink->GetPref(eHTMLTag_frameset,enabled);
|
||||
if(enabled) {
|
||||
mFlags |= NS_PARSER_FLAG_FRAMES_ENABLED;
|
||||
}
|
||||
|
||||
mSink->GetPref(eHTMLTag_script,enabled);
|
||||
if(enabled) {
|
||||
mFlags |= NS_PARSER_FLAG_SCRIPT_ENABLED;
|
||||
}
|
||||
}
|
||||
|
||||
mSkipTarget=eHTMLTag_unknown;
|
||||
|
||||
#ifdef ENABLE_CRC
|
||||
mComputedCRC32=0;
|
||||
mExpectedCRC32=0;
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -491,6 +517,12 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
|
|||
mTokenizer->PushTokenFront(theToken);
|
||||
}
|
||||
}
|
||||
|
||||
// always open a body if frames are disabled....
|
||||
if(!(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED)) {
|
||||
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
|
||||
mTokenizer->PushTokenFront(theToken);
|
||||
}
|
||||
//if the content model is empty, then begin by opening <html>...
|
||||
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_LITERAL_STRING("html")));
|
||||
if(theToken) {
|
||||
|
@ -541,7 +573,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
|
|||
|
||||
if(aSink) {
|
||||
|
||||
if((NS_OK==anErrorCode) && !(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
|
||||
if((NS_OK==anErrorCode) && !(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
|
||||
|
||||
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
|
||||
|
||||
|
@ -640,9 +672,11 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
|
|||
IF_FREE(theToken, mTokenAllocator);
|
||||
}
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
if(mDTDDebug) {
|
||||
mDTDDebug->DumpVectorRecord();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} //if aparser
|
||||
|
||||
|
@ -735,8 +769,8 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
|
|||
return result;
|
||||
}
|
||||
}
|
||||
else if(mDTDState==NS_HTMLPARSER_ALTERNATECONTENT) {
|
||||
if(eHTMLTag_noscript!=theTag || theType!=eToken_end) {
|
||||
else if(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT) {
|
||||
if(theTag != mBodyContext->Last() || theType!=eToken_end) {
|
||||
// attribute source is a part of start token.
|
||||
if(theType!=eToken_attribute) {
|
||||
aToken->AppendSource(mScratch);
|
||||
|
@ -797,6 +831,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
|
|||
|
||||
switch(theTag) {
|
||||
case eHTMLTag_html:
|
||||
case eHTMLTag_noframes:
|
||||
case eHTMLTag_noscript:
|
||||
case eHTMLTag_script:
|
||||
case eHTMLTag_doctypeDecl:
|
||||
|
@ -898,9 +933,9 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifdef NS_DEBUG
|
||||
if (mDTDDebug) {
|
||||
mDTDDebug->Verify(this, mParser, mBodyContext->GetCount(), mBodyContext->mStack, mFilename);
|
||||
//mDTDDebug->Verify(this, mParser, mBodyContext->GetCount(), mBodyContext->mStack, mFilename);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1213,18 +1248,11 @@ nsresult CNavDTD::HandleDefaultStartToken(CToken* aToken,eHTMLTags aChildTag,nsC
|
|||
theChildAgrees=PR_TRUE;
|
||||
if(theParentContains) {
|
||||
|
||||
eHTMLTags theAncestor=gHTMLElements[aChildTag].mExcludingAncestor;
|
||||
eHTMLTags theAncestor=gHTMLElements[aChildTag].mRequiredAncestor;
|
||||
if(eHTMLTag_unknown!=theAncestor){
|
||||
theChildAgrees=!HasOpenContainer(theAncestor);
|
||||
theChildAgrees=HasOpenContainer(theAncestor);
|
||||
}
|
||||
|
||||
if(theChildAgrees){
|
||||
theAncestor=gHTMLElements[aChildTag].mRequiredAncestor;
|
||||
if(eHTMLTag_unknown!=theAncestor){
|
||||
theChildAgrees=HasOpenContainer(theAncestor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(theChildAgrees && theChildIsContainer) {
|
||||
if(theParentTag!=aChildTag) {
|
||||
// Double check the power structure a
|
||||
|
@ -1496,7 +1524,7 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags
|
|||
if(gHTMLElements[aChildTag].mSkipTarget) {
|
||||
mMisplacedContent.Push(mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,aNode->GetSkippedContent()));
|
||||
mMisplacedContent.Push(mTokenAllocator->CreateTokenOfType(eToken_end,aChildTag));
|
||||
}
|
||||
}
|
||||
|
||||
mDTDState=NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT; // This state would help us in gathering all the misplaced elements
|
||||
}//if
|
||||
|
@ -1679,11 +1707,6 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
|
|||
isTokenHandled=PR_TRUE;
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
case eHTMLTag_noembed:
|
||||
mAlternateTagOpenCount++;
|
||||
break;
|
||||
|
||||
case eHTMLTag_script:
|
||||
theHeadIsParent=(!(mFlags & NS_PARSER_FLAG_HAS_OPEN_BODY) ||
|
||||
(mFlags & NS_PARSER_FLAG_REQUESTED_HEAD));
|
||||
|
@ -1925,11 +1948,6 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
|
|||
StripWSFollowingTag(theChildTag,mTokenizer,mTokenAllocator,mLineNumber);
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
case eHTMLTag_noembed:
|
||||
mAlternateTagOpenCount--;
|
||||
//and allow to fall through...
|
||||
|
||||
default:
|
||||
{
|
||||
//now check to see if this token should be omitted, or
|
||||
|
@ -2633,9 +2651,10 @@ PRBool CNavDTD::CanPropagate(eHTMLTags aParentTag,eHTMLTags aChildTag,PRBool aPa
|
|||
PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild,PRBool& aParentContains) {
|
||||
|
||||
eHTMLTags theAncestor=gHTMLElements[aChild].mExcludingAncestor;
|
||||
if(eHTMLTag_unknown!=theAncestor){
|
||||
if(HasOpenContainer(theAncestor))
|
||||
if (eHTMLTag_unknown!=theAncestor){
|
||||
if (HasOpenContainer(theAncestor)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
theAncestor=gHTMLElements[aChild].mRequiredAncestor;
|
||||
|
@ -3090,14 +3109,7 @@ nsresult CNavDTD::OpenBody(const nsCParserNode *aNode){
|
|||
nsresult result=NS_OK;
|
||||
|
||||
mFlags |= NS_PARSER_FLAG_HAD_BODY;
|
||||
|
||||
PRBool theBodyIsOpen=HasOpenContainer(eHTMLTag_body);
|
||||
if(!theBodyIsOpen){
|
||||
//body is not already open, but head may be so close it
|
||||
PRInt32 theHTMLPos=mBodyContext->LastOf(eHTMLTag_html);
|
||||
result=CloseContainersTo(theHTMLPos+1,eHTMLTag_body,PR_TRUE); //close current stack containers.
|
||||
}
|
||||
|
||||
|
||||
if(NS_OK==result) {
|
||||
|
||||
STOP_TIMER();
|
||||
|
@ -3108,7 +3120,7 @@ nsresult CNavDTD::OpenBody(const nsCParserNode *aNode){
|
|||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenBody(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
if(!theBodyIsOpen) {
|
||||
if(!HasOpenContainer(eHTMLTag_body)) {
|
||||
mBodyContext->Push(aNode);
|
||||
mTokenizer->PrependTokens(mMisplacedContent);
|
||||
}
|
||||
|
@ -3300,77 +3312,6 @@ nsresult CNavDTD::CloseFrameset(const nsIParserNode *aNode){
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method would determine how the noscript content
|
||||
* should be handled.
|
||||
*
|
||||
* harishd 08/24/00
|
||||
* @param aNode - The noscript node
|
||||
* return NS_OK if succeeded else ERROR
|
||||
*/
|
||||
nsresult CNavDTD::OpenNoscript(const nsCParserNode *aNode,nsEntryStack* aStyleStack) {
|
||||
nsresult result=NS_OK;
|
||||
|
||||
if(mSink) {
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenNoscript(), this=%p\n", this));
|
||||
|
||||
result=mSink->OpenNoscript(*aNode);
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenNoscript(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
if(result==NS_HTMLPARSER_ALTERNATECONTENT) {
|
||||
// We're here because the sink has identified that
|
||||
// JS is enabled and therefore noscript content should
|
||||
// not be treated as a regular content
|
||||
++mAlternateTagOpenCount;
|
||||
mScratch.Truncate();
|
||||
mScratch.SetCapacity(0);
|
||||
|
||||
mBodyContext->Push(aNode,aStyleStack);
|
||||
|
||||
mDTDState=result;
|
||||
result=NS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this method to stop handling noscript content
|
||||
*
|
||||
* harishd 08/24/00
|
||||
* @param aNode - The noscript node
|
||||
* return NS_OK if succeeded else ERROR
|
||||
*/
|
||||
nsresult CNavDTD::CloseNoscript(const nsIParserNode *aNode) {
|
||||
nsresult result=NS_OK;
|
||||
|
||||
if(mSink) {
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::CloseNoscript(), this=%p\n", this));
|
||||
|
||||
result=mSink->CloseNoscript(*aNode);
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::CloseNoscript(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
NS_ASSERTION((mAlternateTagOpenCount > -1), "mAlternateTagOpenCount underflow");
|
||||
if(mAlternateTagOpenCount > 0) {
|
||||
mAlternateTagOpenCount--;
|
||||
}
|
||||
mDTDState=NS_OK; // switch from alternate content state to regular state
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method does two things: 1st, help construct
|
||||
* our own internal model of the content-stack; and
|
||||
|
@ -3385,7 +3326,7 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
|
|||
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
|
||||
|
||||
nsresult result=NS_OK;
|
||||
PRBool isDefaultNode=PR_FALSE;
|
||||
PRBool done=PR_TRUE;
|
||||
|
||||
|
||||
if (nsHTMLElement::IsResidualStyleTag(aTag)) {
|
||||
|
@ -3430,7 +3371,9 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
|
|||
CloseHead(aNode); //do this just in case someone left it open...
|
||||
result=OpenBody(aNode);
|
||||
}
|
||||
else isDefaultNode=PR_TRUE;
|
||||
else {
|
||||
done=PR_FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -3472,25 +3415,41 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
|
|||
break;
|
||||
|
||||
case eHTMLTag_noscript:
|
||||
result=OpenNoscript(aNode,aStyleStack);
|
||||
// If the script is disabled noscript should not be
|
||||
// in the content model until the layout can somehow
|
||||
// turn noscript's display property to block <-- bug 67899
|
||||
if(mFlags & NS_PARSER_FLAG_SCRIPT_ENABLED) {
|
||||
done=PR_FALSE;
|
||||
mScratch.Truncate();
|
||||
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
|
||||
}
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
done=PR_FALSE;
|
||||
if(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED) {
|
||||
mScratch.Truncate();
|
||||
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
isDefaultNode=PR_TRUE;
|
||||
done=PR_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
if(!done) {
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
|
||||
if(isDefaultNode) {
|
||||
result=(mSink) ? mSink->OpenContainer(*aNode) : NS_OK;
|
||||
mBodyContext->Push(aNode,aStyleStack);
|
||||
result=(mSink) ? mSink->OpenContainer(*aNode) : NS_OK;
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
mBodyContext->Push(aNode,aStyleStack);
|
||||
}
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -3545,9 +3504,10 @@ CNavDTD::CloseContainer(const nsCParserNode *aNode,eHTMLTags aTarget,PRBool aClo
|
|||
break;
|
||||
|
||||
case eHTMLTag_noscript:
|
||||
result=CloseNoscript(aNode);
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
// switch from alternate content state to regular state
|
||||
mFlags &= ~NS_PARSER_FLAG_ALTERNATE_CONTENT;
|
||||
// falling thro' intentionally....
|
||||
case eHTMLTag_title:
|
||||
default:
|
||||
|
||||
|
@ -3602,12 +3562,11 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
|
|||
}
|
||||
|
||||
/*************************************************************
|
||||
I've added a check (mAlternateTagOpenCount) below to prevent residual
|
||||
style handling from getting invoked in these cases.
|
||||
This fixes bug 25214.
|
||||
Do not invoke residual style handling when dealing with
|
||||
alternate content. This fixes bug 25214.
|
||||
*************************************************************/
|
||||
|
||||
if(theTagIsStyle && (0==mAlternateTagOpenCount)) {
|
||||
if(theTagIsStyle && !(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT)) {
|
||||
|
||||
PRBool theTargetTagIsStyle=nsHTMLElement::IsResidualStyleTag(aTarget);
|
||||
|
||||
|
|
|
@ -430,7 +430,6 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
|
|||
nsresult OpenForm(const nsIParserNode *aNode);
|
||||
nsresult OpenMap(const nsCParserNode *aNode);
|
||||
nsresult OpenFrameset(const nsCParserNode *aNode);
|
||||
nsresult OpenNoscript(const nsCParserNode *aNode,nsEntryStack* aStyleStack=0);
|
||||
nsresult OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedByStartTag,nsEntryStack* aStyleStack=0);
|
||||
|
||||
/**
|
||||
|
@ -446,7 +445,6 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
|
|||
nsresult CloseForm(const nsIParserNode *aNode);
|
||||
nsresult CloseMap(const nsIParserNode *aNode);
|
||||
nsresult CloseFrameset(const nsIParserNode *aNode);
|
||||
nsresult CloseNoscript(const nsIParserNode *aNode);
|
||||
|
||||
/**
|
||||
* The special purpose methods automatically close
|
||||
|
@ -493,41 +491,38 @@ protected:
|
|||
nsresult HandleSavedTokens(PRInt32 anIndex);
|
||||
nsresult HandleKeyGen(nsIParserNode *aNode);
|
||||
void RecycleNodes(nsEntryStack *aNodeStack);
|
||||
|
||||
nsIHTMLContentSink* mSink;
|
||||
|
||||
nsDTDContext* mBodyContext;
|
||||
nsDTDContext* mTempContext;
|
||||
|
||||
PRInt32 mOpenHeadCount;
|
||||
PRInt32 mOpenMapCount;
|
||||
PRInt32 mAlternateTagOpenCount; //true when NOFRAMES, NOSCRIPT, NOEMBED, NOLAYER are open
|
||||
PRInt32 mLineNumber;
|
||||
|
||||
PRUint32 mComputedCRC32;
|
||||
PRUint32 mExpectedCRC32;
|
||||
|
||||
PRUint16 mFlags;
|
||||
|
||||
nsString mFilename;
|
||||
nsString mScratch; //used for various purposes; non-persistent
|
||||
nsAutoString mMimeType; //ok as an autostring; these are short.
|
||||
|
||||
nsIDTDDebug* mDTDDebug;
|
||||
nsITokenizer* mTokenizer;
|
||||
|
||||
nsParser* mParser;
|
||||
nsTokenAllocator* mTokenAllocator;
|
||||
nsNodeAllocator mNodeAllocator;
|
||||
|
||||
nsDeque mMisplacedContent;
|
||||
nsDeque mSkippedContent;
|
||||
nsresult mDTDState;
|
||||
nsIHTMLContentSink* mSink;
|
||||
nsTokenAllocator* mTokenAllocator;
|
||||
nsDTDContext* mBodyContext;
|
||||
nsDTDContext* mTempContext;
|
||||
PRInt32 mOpenHeadCount;
|
||||
PRInt32 mOpenMapCount;
|
||||
nsParser* mParser;
|
||||
nsITokenizer* mTokenizer;
|
||||
nsDTDMode mDTDMode;
|
||||
|
||||
eHTMLTags mSkipTarget;
|
||||
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
|
||||
eParserDocType mDocType;
|
||||
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
|
||||
eHTMLTags mSkipTarget;
|
||||
nsresult mDTDState;
|
||||
PRUint16 mFlags;
|
||||
PRInt32 mLineNumber;
|
||||
nsString mScratch; //used for various purposes; non-persistent
|
||||
nsAutoString mMimeType; //ok as an autostring; these are short.
|
||||
nsNodeAllocator mNodeAllocator;
|
||||
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
nsString mFilename;
|
||||
nsIDTDDebug* mDTDDebug;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CRC
|
||||
PRUint32 mComputedCRC32;
|
||||
PRUint32 mExpectedCRC32;
|
||||
#endif
|
||||
};
|
||||
|
||||
inline nsresult NS_NewNavHTMLDTD(nsIDTD** aInstancePtrResult)
|
||||
|
|
|
@ -350,7 +350,7 @@ void InitializeElementTable(void) {
|
|||
/*autoclose starttags and endtags*/ &gBodyAutoClose,0,0,0,
|
||||
/*parent,incl,exclgroups*/ kHTMLContent,(kFlowEntity|kSelf), kNone,
|
||||
/*special props, prop-range*/ kOmitEndTag, kBodyPropRange,
|
||||
/*special parents,kids,skip*/ &gInNoframes,&gBodyKids,eHTMLTag_unknown);
|
||||
/*special parents,kids,skip*/ 0,&gBodyKids,eHTMLTag_unknown);
|
||||
|
||||
Initialize(
|
||||
/*tag*/ eHTMLTag_br,
|
||||
|
@ -857,7 +857,7 @@ void InitializeElementTable(void) {
|
|||
/*autoclose starttags and endtags*/ 0,0,0,0,
|
||||
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
|
||||
/*special props, prop-range*/ 0, kNoPropRange,
|
||||
/*special parents,kids,skip*/ &gNoframeRoot,0,eHTMLTag_noframes); // Added noframes - fix bug 62803 - since Mozilla supports frames.
|
||||
/*special parents,kids,skip*/ &gNoframeRoot,0,eHTMLTag_unknown);
|
||||
|
||||
Initialize(
|
||||
/*tag*/ eHTMLTag_nolayer,
|
||||
|
|
|
@ -571,8 +571,6 @@ USE_GENERAL_OPEN_METHOD(OpenMap, eHTMLTag_map)
|
|||
USE_GENERAL_CLOSE_METHOD(CloseMap, eHTMLTag_map)
|
||||
USE_GENERAL_OPEN_METHOD(OpenFrameset, eHTMLTag_frameset)
|
||||
USE_GENERAL_CLOSE_METHOD(CloseFrameset, eHTMLTag_frameset)
|
||||
USE_GENERAL_OPEN_METHOD(OpenNoscript, eHTMLTag_noscript)
|
||||
USE_GENERAL_CLOSE_METHOD(CloseNoscript, eHTMLTag_noscript)
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -138,8 +138,7 @@ class nsHTMLContentSinkStream : public nsIHTMLContentSinkStream
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) ;
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition);
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition);
|
||||
|
|
|
@ -70,8 +70,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode){ return NS_OK; }
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition);
|
||||
|
|
|
@ -190,23 +190,6 @@ public:
|
|||
*/
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode)=0;
|
||||
|
||||
/**
|
||||
* This method is used in opening a NOSCRIPT container.
|
||||
*
|
||||
* @update harishd 08/25/00
|
||||
* @param nsIParserNode reference to parser node interface
|
||||
*/
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode)=0;
|
||||
|
||||
|
||||
/**
|
||||
* This method is used in closing a NOSCRIPT container.
|
||||
*
|
||||
* @update harishd 08/25/00
|
||||
* @param nsIParserNode reference to parser node interface
|
||||
*/
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode)=0;
|
||||
|
||||
/**
|
||||
* This method tells the sink whether or not it is
|
||||
* encoding an HTML fragment or the whole document.
|
||||
|
@ -235,6 +218,14 @@ public:
|
|||
* @param aPosition - Validates the end of a context.
|
||||
*/
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition)=0;
|
||||
|
||||
/**
|
||||
* Use this method to retrieve pref. for the tag.
|
||||
*
|
||||
* @update 04/11/01 harishd
|
||||
* @param aTag - Check pref. for this tag.
|
||||
*/
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref)=0;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -304,9 +304,6 @@ class nsIParser : public nsISupports {
|
|||
#define NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1016)
|
||||
#define NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1017)
|
||||
|
||||
|
||||
#define NS_HTMLPARSER_ALTERNATECONTENT NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_HTMLPARSER,1)
|
||||
|
||||
#define NS_ERROR_HTMLPARSER_CONTINUE NS_OK
|
||||
|
||||
|
||||
|
|
|
@ -72,8 +72,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition);
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition);
|
||||
|
|
|
@ -97,7 +97,12 @@ public:
|
|||
class CSharedParserObjects {
|
||||
public:
|
||||
|
||||
CSharedParserObjects() : mDTDDeque(0) {
|
||||
CSharedParserObjects()
|
||||
:mDTDDeque(0),
|
||||
mHasViewSourceDTD(PR_FALSE),
|
||||
mHasXMLDTD(PR_FALSE),
|
||||
mOtherDTD(nsnull)
|
||||
{
|
||||
|
||||
//Note: To cut down on startup time/overhead, we defer the construction of non-html DTD's.
|
||||
|
||||
|
@ -111,6 +116,10 @@ public:
|
|||
}
|
||||
|
||||
NS_NewNavHTMLDTD(&theDTD); //do this as a default HTML DTD...
|
||||
|
||||
// please handle allocation failure
|
||||
NS_ASSERTION(theDTD, "Failed to create DTD");
|
||||
|
||||
mDTDDeque.Push(theDTD);
|
||||
|
||||
mHasViewSourceDTD=PR_FALSE;
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
|
||||
use Cwd;
|
||||
|
||||
$path=`cd`;
|
||||
$path=~m/:/;
|
||||
$path=`pwd`;;
|
||||
|
||||
$path=~m/mozilla/;
|
||||
|
||||
$drive=$`;
|
||||
|
||||
|
@ -17,14 +18,16 @@
|
|||
|
||||
if($ARGV[0] eq "-b") {
|
||||
foreach $input(<FILE_LIST>) {
|
||||
$input =~s/\n//g;
|
||||
@output=split(/\./,$input);
|
||||
system("$drive://mozilla//dist//WIN32_D.obj//bin//TestParser.exe $input $output[0].b");
|
||||
system("$drive\mozilla/dist/WIN32_D.obj/bin/TestParser.exe $input $output[0].b");
|
||||
}
|
||||
}
|
||||
elsif($ARGV[0] eq "-v") {
|
||||
foreach $input(<FILE_LIST>) {
|
||||
$input =~s/\n//g;
|
||||
@output=split(/\./,$input);
|
||||
system("$drive://mozilla//dist//WIN32_D.obj//bin//TestParser.exe $input $output[0].v");
|
||||
system("$drive\mozilla/dist/WIN32_D.obj/bin/TestParser.exe $input $output[0].v");
|
||||
system("fc $output[0].b $output[0].v");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,6 +82,7 @@
|
|||
#include "nsIXBLBinding.h"
|
||||
#include "nsIElementFactory.h"
|
||||
#include "nsContentCID.h"
|
||||
#include "nsIDocShell.h"
|
||||
#include "nsFormControlHelper.h"
|
||||
|
||||
static NS_DEFINE_CID(kTextNodeCID, NS_TEXTNODE_CID);
|
||||
|
@ -4834,15 +4835,66 @@ nsCSSFrameConstructor::ConstructFrameByTag(nsIPresShell* aPresShell,
|
|||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
|
||||
}
|
||||
rv = NS_NewHTMLFramesetFrame(aPresShell, &newFrame);
|
||||
|
||||
canBePositioned = PR_FALSE;
|
||||
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
rv = NS_NewHTMLFramesetFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (nsHTMLAtoms::iframe == aTag) {
|
||||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
|
||||
}
|
||||
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (nsHTMLAtoms::noframes == aTag) {
|
||||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
|
||||
}
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
// make <noframes> be display:none if frames are enabled
|
||||
nsStyleDisplay* display = (nsStyleDisplay*)aStyleContext->GetMutableStyleData(eStyleStruct_Display);
|
||||
display->mDisplay = NS_STYLE_DISPLAY_NONE;
|
||||
aState.mFrameManager->SetUndisplayedContent(aContent, aStyleContext);
|
||||
}
|
||||
else {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewBlockFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (nsHTMLAtoms::spacer == aTag) {
|
||||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
|
@ -5449,7 +5501,20 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||
else if (aTag == nsXULAtoms::iframe || aTag == nsXULAtoms::editor ||
|
||||
aTag == nsXULAtoms::browser) {
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
|
||||
// XXX should turning off frames allow XUL iframes?
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (aTag == nsXULAtoms::treeindentation)
|
||||
{
|
||||
|
|
|
@ -376,6 +376,11 @@ iframe {
|
|||
border: 2px inset;
|
||||
}
|
||||
|
||||
noframes {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
/* focusable content */
|
||||
|
||||
/* links */
|
||||
|
@ -398,9 +403,9 @@ iframe {
|
|||
}
|
||||
|
||||
/* hidden elements */
|
||||
area, base, basefont, head, meta, script, style, title, noembed,
|
||||
noscript, noframes, param, :-moz-comment, :-moz-pi {
|
||||
display: none;
|
||||
area, base, basefont, head, meta, script, style, title,
|
||||
noembed, noscript, param, :-moz-comment, :-moz-pi {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@
|
|||
#include "nsIXBLBinding.h"
|
||||
#include "nsIElementFactory.h"
|
||||
#include "nsContentCID.h"
|
||||
#include "nsIDocShell.h"
|
||||
#include "nsFormControlHelper.h"
|
||||
|
||||
static NS_DEFINE_CID(kTextNodeCID, NS_TEXTNODE_CID);
|
||||
|
@ -4834,15 +4835,66 @@ nsCSSFrameConstructor::ConstructFrameByTag(nsIPresShell* aPresShell,
|
|||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
|
||||
}
|
||||
rv = NS_NewHTMLFramesetFrame(aPresShell, &newFrame);
|
||||
|
||||
canBePositioned = PR_FALSE;
|
||||
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
rv = NS_NewHTMLFramesetFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (nsHTMLAtoms::iframe == aTag) {
|
||||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
|
||||
}
|
||||
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (nsHTMLAtoms::noframes == aTag) {
|
||||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
|
||||
}
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
// make <noframes> be display:none if frames are enabled
|
||||
nsStyleDisplay* display = (nsStyleDisplay*)aStyleContext->GetMutableStyleData(eStyleStruct_Display);
|
||||
display->mDisplay = NS_STYLE_DISPLAY_NONE;
|
||||
aState.mFrameManager->SetUndisplayedContent(aContent, aStyleContext);
|
||||
}
|
||||
else {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewBlockFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (nsHTMLAtoms::spacer == aTag) {
|
||||
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
|
||||
|
@ -5449,7 +5501,20 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||
else if (aTag == nsXULAtoms::iframe || aTag == nsXULAtoms::editor ||
|
||||
aTag == nsXULAtoms::browser) {
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
|
||||
// XXX should turning off frames allow XUL iframes?
|
||||
PRBool allowSubframes = PR_TRUE;
|
||||
if (aPresContext) {
|
||||
nsCOMPtr<nsISupports> container;
|
||||
aPresContext->GetContainer(getter_AddRefs(container));
|
||||
nsCOMPtr<nsIDocShell> docShell(do_QueryInterface(container));
|
||||
if (docShell) {
|
||||
docShell->GetAllowSubframes(&allowSubframes);
|
||||
}
|
||||
}
|
||||
if (allowSubframes) {
|
||||
rv = NS_NewHTMLFrameOuterFrame(aPresShell, &newFrame);
|
||||
}
|
||||
}
|
||||
else if (aTag == nsXULAtoms::treeindentation)
|
||||
{
|
||||
|
|
|
@ -376,6 +376,11 @@ iframe {
|
|||
border: 2px inset;
|
||||
}
|
||||
|
||||
noframes {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
/* focusable content */
|
||||
|
||||
/* links */
|
||||
|
@ -398,9 +403,9 @@ iframe {
|
|||
}
|
||||
|
||||
/* hidden elements */
|
||||
area, base, basefont, head, meta, script, style, title, noembed,
|
||||
noscript, noframes, param, :-moz-comment, :-moz-pi {
|
||||
display: none;
|
||||
area, base, basefont, head, meta, script, style, title,
|
||||
noembed, noscript, param, :-moz-comment, :-moz-pi {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -112,6 +112,9 @@ pref("browser.PICS.service.http___home_netscape_com_default_rating.s", 0);
|
|||
|
||||
pref("browser.target_new_blocked", false);
|
||||
|
||||
// loading and rendering of framesets and iframes
|
||||
pref("browser.frames.enabled", true);
|
||||
|
||||
// view source
|
||||
pref("view_source.syntax_highlight", true);
|
||||
|
||||
|
|
|
@ -71,8 +71,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode){ return NS_OK; }
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD OpenContainer(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseContainer(const nsIParserNode& aNode);
|
||||
NS_IMETHOD NotifyError(const nsParserError* aError);
|
||||
|
|
|
@ -94,15 +94,18 @@ static char gShowCRC;
|
|||
************************************************************************/
|
||||
|
||||
|
||||
#define NS_PARSER_FLAG_NONE 0x00
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_BODY 0x01
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_FORM 0x02
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_SCRIPT 0x04
|
||||
#define NS_PARSER_FLAG_HAD_BODY 0x08
|
||||
#define NS_PARSER_FLAG_HAD_FRAMESET 0x10
|
||||
#define NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE 0x20
|
||||
#define NS_PARSER_FLAG_REQUESTED_HEAD 0x40
|
||||
#define NS_PARSER_FLAG_IS_FORM_CONTAINER 0x80
|
||||
#define NS_PARSER_FLAG_NONE 0x00000000
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_BODY 0x00000001
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_FORM 0x00000002
|
||||
#define NS_PARSER_FLAG_HAS_OPEN_SCRIPT 0x00000004
|
||||
#define NS_PARSER_FLAG_HAD_BODY 0x00000008
|
||||
#define NS_PARSER_FLAG_HAD_FRAMESET 0x00000010
|
||||
#define NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE 0x00000020
|
||||
#define NS_PARSER_FLAG_REQUESTED_HEAD 0x00000040
|
||||
#define NS_PARSER_FLAG_IS_FORM_CONTAINER 0x00000080
|
||||
#define NS_PARSER_FLAG_SCRIPT_ENABLED 0x00000100
|
||||
#define NS_PARSER_FLAG_FRAMES_ENABLED 0x00000200
|
||||
#define NS_PARSER_FLAG_ALTERNATE_CONTENT 0x00000400 // NOFRAMES, NOSCRIPT
|
||||
|
||||
/**
|
||||
* This method gets called as part of our COM-like interfaces.
|
||||
|
@ -149,37 +152,41 @@ NS_IMPL_RELEASE(CNavDTD)
|
|||
*/
|
||||
CNavDTD::CNavDTD() : nsIDTD(),
|
||||
mMisplacedContent(0),
|
||||
mSkippedContent(0) {
|
||||
NS_INIT_REFCNT();
|
||||
mSkippedContent(0),
|
||||
mSink(0),
|
||||
mTokenAllocator(0),
|
||||
mTempContext(0),
|
||||
mOpenHeadCount(0),
|
||||
mOpenMapCount(0),
|
||||
mParser(0),
|
||||
mTokenizer(0),
|
||||
mDocType(eHTML3Text),
|
||||
mDTDMode(eDTDMode_quirks),
|
||||
mParserCommand(eViewNormal),
|
||||
mSkipTarget(eHTMLTag_unknown),
|
||||
mDTDState(NS_OK),
|
||||
mFlags(NS_PARSER_FLAG_NONE),
|
||||
#ifdef ENABLE_CRC
|
||||
mComputedCRC32(0),
|
||||
mExpectedCRC32(0),
|
||||
#endif
|
||||
|
||||
mSink = nsnull;
|
||||
|
||||
mTempContext=nsnull;
|
||||
#ifdef NS_DEBUG
|
||||
mDTDDebug(0),
|
||||
#endif
|
||||
mLineNumber(1)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
mBodyContext=new nsDTDContext();
|
||||
|
||||
mOpenHeadCount=0;
|
||||
mOpenMapCount=0;
|
||||
mAlternateTagOpenCount=0;
|
||||
mLineNumber=1;
|
||||
|
||||
mComputedCRC32=0;
|
||||
mExpectedCRC32=0;
|
||||
|
||||
mFlags = NS_PARSER_FLAG_NONE;
|
||||
|
||||
mParser=nsnull;
|
||||
mTokenizer=nsnull;
|
||||
mDTDState=NS_OK;
|
||||
mDocType=eHTML3Text;
|
||||
|
||||
mDTDDebug=0; // Why is this not ifdefed?
|
||||
|
||||
#ifdef RICKG_DEBUG
|
||||
//DebugDumpContainmentRules2(*this,"c:/temp/DTDRules.new","New CNavDTD Containment Rules");
|
||||
nsHTMLElement::DebugDumpContainment("c:/temp/contain.new","ElementTable Rules");
|
||||
nsHTMLElement::DebugDumpMembership("c:/temp/membership.out");
|
||||
nsHTMLElement::DebugDumpContainType("c:/temp/ctnrules.out");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -281,7 +288,9 @@ CNavDTD::~CNavDTD(){
|
|||
NS_IF_RELEASE(mSink);
|
||||
}
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
NS_IF_RELEASE(mDTDDebug);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -323,7 +332,7 @@ PRBool CNavDTD::Verify(nsString& aURLRef,nsIParser* aParser){
|
|||
* breaks on some compilers because of some broken
|
||||
* streams code in prstrm.cpp.
|
||||
*/
|
||||
#if !defined(MOZ_DISABLE_DTD_DEBUG)
|
||||
#ifdef NS_DEBUG
|
||||
if(!mDTDDebug){
|
||||
nsresult rval = NS_NewDTDDebug(&mDTDDebug);
|
||||
if (NS_OK != rval) {
|
||||
|
@ -332,11 +341,12 @@ PRBool CNavDTD::Verify(nsString& aURLRef,nsIParser* aParser){
|
|||
}
|
||||
else mDTDDebug->SetVerificationDirectory(kVerificationDir);
|
||||
}
|
||||
#endif
|
||||
|
||||
if(mDTDDebug) {
|
||||
// mDTDDebug->Verify(this,aParser,mBodyContext->GetCount(),mBodyContext->mStack,aURLRef);
|
||||
}
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -408,7 +418,6 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
|
|||
mFilename=aParserContext.mScanner->GetFilename();
|
||||
mFlags = NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE; // residual style is always on. This will also reset the flags
|
||||
mLineNumber=1;
|
||||
mAlternateTagOpenCount=0;
|
||||
mDTDMode=aParserContext.mDTDMode;
|
||||
mParserCommand=aParserContext.mParserCommand;
|
||||
mMimeType=aParserContext.mMimeType;
|
||||
|
@ -432,7 +441,6 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
|
|||
//proxy for the real sink we're given from the parser.
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
|
||||
nsLoggingSink *theLogSink=GetLoggingSink();
|
||||
if(theLogSink) {
|
||||
theLogSink->SetProxySink(mSink);
|
||||
|
@ -444,10 +452,28 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
|
|||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
|
||||
|
||||
if(mSink) {
|
||||
PRBool enabled;
|
||||
mSink->GetPref(eHTMLTag_frameset,enabled);
|
||||
if(enabled) {
|
||||
mFlags |= NS_PARSER_FLAG_FRAMES_ENABLED;
|
||||
}
|
||||
|
||||
mSink->GetPref(eHTMLTag_script,enabled);
|
||||
if(enabled) {
|
||||
mFlags |= NS_PARSER_FLAG_SCRIPT_ENABLED;
|
||||
}
|
||||
}
|
||||
|
||||
mSkipTarget=eHTMLTag_unknown;
|
||||
|
||||
#ifdef ENABLE_CRC
|
||||
mComputedCRC32=0;
|
||||
mExpectedCRC32=0;
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -491,6 +517,12 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
|
|||
mTokenizer->PushTokenFront(theToken);
|
||||
}
|
||||
}
|
||||
|
||||
// always open a body if frames are disabled....
|
||||
if(!(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED)) {
|
||||
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
|
||||
mTokenizer->PushTokenFront(theToken);
|
||||
}
|
||||
//if the content model is empty, then begin by opening <html>...
|
||||
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_LITERAL_STRING("html")));
|
||||
if(theToken) {
|
||||
|
@ -541,7 +573,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
|
|||
|
||||
if(aSink) {
|
||||
|
||||
if((NS_OK==anErrorCode) && !(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
|
||||
if((NS_OK==anErrorCode) && !(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
|
||||
|
||||
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
|
||||
|
||||
|
@ -640,9 +672,11 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
|
|||
IF_FREE(theToken, mTokenAllocator);
|
||||
}
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
if(mDTDDebug) {
|
||||
mDTDDebug->DumpVectorRecord();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} //if aparser
|
||||
|
||||
|
@ -735,8 +769,8 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
|
|||
return result;
|
||||
}
|
||||
}
|
||||
else if(mDTDState==NS_HTMLPARSER_ALTERNATECONTENT) {
|
||||
if(eHTMLTag_noscript!=theTag || theType!=eToken_end) {
|
||||
else if(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT) {
|
||||
if(theTag != mBodyContext->Last() || theType!=eToken_end) {
|
||||
// attribute source is a part of start token.
|
||||
if(theType!=eToken_attribute) {
|
||||
aToken->AppendSource(mScratch);
|
||||
|
@ -797,6 +831,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
|
|||
|
||||
switch(theTag) {
|
||||
case eHTMLTag_html:
|
||||
case eHTMLTag_noframes:
|
||||
case eHTMLTag_noscript:
|
||||
case eHTMLTag_script:
|
||||
case eHTMLTag_doctypeDecl:
|
||||
|
@ -898,9 +933,9 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#ifdef NS_DEBUG
|
||||
if (mDTDDebug) {
|
||||
mDTDDebug->Verify(this, mParser, mBodyContext->GetCount(), mBodyContext->mStack, mFilename);
|
||||
//mDTDDebug->Verify(this, mParser, mBodyContext->GetCount(), mBodyContext->mStack, mFilename);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1213,18 +1248,11 @@ nsresult CNavDTD::HandleDefaultStartToken(CToken* aToken,eHTMLTags aChildTag,nsC
|
|||
theChildAgrees=PR_TRUE;
|
||||
if(theParentContains) {
|
||||
|
||||
eHTMLTags theAncestor=gHTMLElements[aChildTag].mExcludingAncestor;
|
||||
eHTMLTags theAncestor=gHTMLElements[aChildTag].mRequiredAncestor;
|
||||
if(eHTMLTag_unknown!=theAncestor){
|
||||
theChildAgrees=!HasOpenContainer(theAncestor);
|
||||
theChildAgrees=HasOpenContainer(theAncestor);
|
||||
}
|
||||
|
||||
if(theChildAgrees){
|
||||
theAncestor=gHTMLElements[aChildTag].mRequiredAncestor;
|
||||
if(eHTMLTag_unknown!=theAncestor){
|
||||
theChildAgrees=HasOpenContainer(theAncestor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(theChildAgrees && theChildIsContainer) {
|
||||
if(theParentTag!=aChildTag) {
|
||||
// Double check the power structure a
|
||||
|
@ -1496,7 +1524,7 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags
|
|||
if(gHTMLElements[aChildTag].mSkipTarget) {
|
||||
mMisplacedContent.Push(mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,aNode->GetSkippedContent()));
|
||||
mMisplacedContent.Push(mTokenAllocator->CreateTokenOfType(eToken_end,aChildTag));
|
||||
}
|
||||
}
|
||||
|
||||
mDTDState=NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT; // This state would help us in gathering all the misplaced elements
|
||||
}//if
|
||||
|
@ -1679,11 +1707,6 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
|
|||
isTokenHandled=PR_TRUE;
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
case eHTMLTag_noembed:
|
||||
mAlternateTagOpenCount++;
|
||||
break;
|
||||
|
||||
case eHTMLTag_script:
|
||||
theHeadIsParent=(!(mFlags & NS_PARSER_FLAG_HAS_OPEN_BODY) ||
|
||||
(mFlags & NS_PARSER_FLAG_REQUESTED_HEAD));
|
||||
|
@ -1925,11 +1948,6 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
|
|||
StripWSFollowingTag(theChildTag,mTokenizer,mTokenAllocator,mLineNumber);
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
case eHTMLTag_noembed:
|
||||
mAlternateTagOpenCount--;
|
||||
//and allow to fall through...
|
||||
|
||||
default:
|
||||
{
|
||||
//now check to see if this token should be omitted, or
|
||||
|
@ -2633,9 +2651,10 @@ PRBool CNavDTD::CanPropagate(eHTMLTags aParentTag,eHTMLTags aChildTag,PRBool aPa
|
|||
PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild,PRBool& aParentContains) {
|
||||
|
||||
eHTMLTags theAncestor=gHTMLElements[aChild].mExcludingAncestor;
|
||||
if(eHTMLTag_unknown!=theAncestor){
|
||||
if(HasOpenContainer(theAncestor))
|
||||
if (eHTMLTag_unknown!=theAncestor){
|
||||
if (HasOpenContainer(theAncestor)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
theAncestor=gHTMLElements[aChild].mRequiredAncestor;
|
||||
|
@ -3090,14 +3109,7 @@ nsresult CNavDTD::OpenBody(const nsCParserNode *aNode){
|
|||
nsresult result=NS_OK;
|
||||
|
||||
mFlags |= NS_PARSER_FLAG_HAD_BODY;
|
||||
|
||||
PRBool theBodyIsOpen=HasOpenContainer(eHTMLTag_body);
|
||||
if(!theBodyIsOpen){
|
||||
//body is not already open, but head may be so close it
|
||||
PRInt32 theHTMLPos=mBodyContext->LastOf(eHTMLTag_html);
|
||||
result=CloseContainersTo(theHTMLPos+1,eHTMLTag_body,PR_TRUE); //close current stack containers.
|
||||
}
|
||||
|
||||
|
||||
if(NS_OK==result) {
|
||||
|
||||
STOP_TIMER();
|
||||
|
@ -3108,7 +3120,7 @@ nsresult CNavDTD::OpenBody(const nsCParserNode *aNode){
|
|||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenBody(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
if(!theBodyIsOpen) {
|
||||
if(!HasOpenContainer(eHTMLTag_body)) {
|
||||
mBodyContext->Push(aNode);
|
||||
mTokenizer->PrependTokens(mMisplacedContent);
|
||||
}
|
||||
|
@ -3300,77 +3312,6 @@ nsresult CNavDTD::CloseFrameset(const nsIParserNode *aNode){
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method would determine how the noscript content
|
||||
* should be handled.
|
||||
*
|
||||
* harishd 08/24/00
|
||||
* @param aNode - The noscript node
|
||||
* return NS_OK if succeeded else ERROR
|
||||
*/
|
||||
nsresult CNavDTD::OpenNoscript(const nsCParserNode *aNode,nsEntryStack* aStyleStack) {
|
||||
nsresult result=NS_OK;
|
||||
|
||||
if(mSink) {
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenNoscript(), this=%p\n", this));
|
||||
|
||||
result=mSink->OpenNoscript(*aNode);
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenNoscript(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
if(result==NS_HTMLPARSER_ALTERNATECONTENT) {
|
||||
// We're here because the sink has identified that
|
||||
// JS is enabled and therefore noscript content should
|
||||
// not be treated as a regular content
|
||||
++mAlternateTagOpenCount;
|
||||
mScratch.Truncate();
|
||||
mScratch.SetCapacity(0);
|
||||
|
||||
mBodyContext->Push(aNode,aStyleStack);
|
||||
|
||||
mDTDState=result;
|
||||
result=NS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this method to stop handling noscript content
|
||||
*
|
||||
* harishd 08/24/00
|
||||
* @param aNode - The noscript node
|
||||
* return NS_OK if succeeded else ERROR
|
||||
*/
|
||||
nsresult CNavDTD::CloseNoscript(const nsIParserNode *aNode) {
|
||||
nsresult result=NS_OK;
|
||||
|
||||
if(mSink) {
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::CloseNoscript(), this=%p\n", this));
|
||||
|
||||
result=mSink->CloseNoscript(*aNode);
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::CloseNoscript(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
NS_ASSERTION((mAlternateTagOpenCount > -1), "mAlternateTagOpenCount underflow");
|
||||
if(mAlternateTagOpenCount > 0) {
|
||||
mAlternateTagOpenCount--;
|
||||
}
|
||||
mDTDState=NS_OK; // switch from alternate content state to regular state
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method does two things: 1st, help construct
|
||||
* our own internal model of the content-stack; and
|
||||
|
@ -3385,7 +3326,7 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
|
|||
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
|
||||
|
||||
nsresult result=NS_OK;
|
||||
PRBool isDefaultNode=PR_FALSE;
|
||||
PRBool done=PR_TRUE;
|
||||
|
||||
|
||||
if (nsHTMLElement::IsResidualStyleTag(aTag)) {
|
||||
|
@ -3430,7 +3371,9 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
|
|||
CloseHead(aNode); //do this just in case someone left it open...
|
||||
result=OpenBody(aNode);
|
||||
}
|
||||
else isDefaultNode=PR_TRUE;
|
||||
else {
|
||||
done=PR_FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -3472,25 +3415,41 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
|
|||
break;
|
||||
|
||||
case eHTMLTag_noscript:
|
||||
result=OpenNoscript(aNode,aStyleStack);
|
||||
// If the script is disabled noscript should not be
|
||||
// in the content model until the layout can somehow
|
||||
// turn noscript's display property to block <-- bug 67899
|
||||
if(mFlags & NS_PARSER_FLAG_SCRIPT_ENABLED) {
|
||||
done=PR_FALSE;
|
||||
mScratch.Truncate();
|
||||
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
|
||||
}
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
done=PR_FALSE;
|
||||
if(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED) {
|
||||
mScratch.Truncate();
|
||||
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
isDefaultNode=PR_TRUE;
|
||||
done=PR_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
if(!done) {
|
||||
STOP_TIMER();
|
||||
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
|
||||
if(isDefaultNode) {
|
||||
result=(mSink) ? mSink->OpenContainer(*aNode) : NS_OK;
|
||||
mBodyContext->Push(aNode,aStyleStack);
|
||||
result=(mSink) ? mSink->OpenContainer(*aNode) : NS_OK;
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
mBodyContext->Push(aNode,aStyleStack);
|
||||
}
|
||||
|
||||
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
|
||||
START_TIMER();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -3545,9 +3504,10 @@ CNavDTD::CloseContainer(const nsCParserNode *aNode,eHTMLTags aTarget,PRBool aClo
|
|||
break;
|
||||
|
||||
case eHTMLTag_noscript:
|
||||
result=CloseNoscript(aNode);
|
||||
break;
|
||||
|
||||
case eHTMLTag_noframes:
|
||||
// switch from alternate content state to regular state
|
||||
mFlags &= ~NS_PARSER_FLAG_ALTERNATE_CONTENT;
|
||||
// falling thro' intentionally....
|
||||
case eHTMLTag_title:
|
||||
default:
|
||||
|
||||
|
@ -3602,12 +3562,11 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
|
|||
}
|
||||
|
||||
/*************************************************************
|
||||
I've added a check (mAlternateTagOpenCount) below to prevent residual
|
||||
style handling from getting invoked in these cases.
|
||||
This fixes bug 25214.
|
||||
Do not invoke residual style handling when dealing with
|
||||
alternate content. This fixes bug 25214.
|
||||
*************************************************************/
|
||||
|
||||
if(theTagIsStyle && (0==mAlternateTagOpenCount)) {
|
||||
if(theTagIsStyle && !(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT)) {
|
||||
|
||||
PRBool theTargetTagIsStyle=nsHTMLElement::IsResidualStyleTag(aTarget);
|
||||
|
||||
|
|
|
@ -430,7 +430,6 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
|
|||
nsresult OpenForm(const nsIParserNode *aNode);
|
||||
nsresult OpenMap(const nsCParserNode *aNode);
|
||||
nsresult OpenFrameset(const nsCParserNode *aNode);
|
||||
nsresult OpenNoscript(const nsCParserNode *aNode,nsEntryStack* aStyleStack=0);
|
||||
nsresult OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedByStartTag,nsEntryStack* aStyleStack=0);
|
||||
|
||||
/**
|
||||
|
@ -446,7 +445,6 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
|
|||
nsresult CloseForm(const nsIParserNode *aNode);
|
||||
nsresult CloseMap(const nsIParserNode *aNode);
|
||||
nsresult CloseFrameset(const nsIParserNode *aNode);
|
||||
nsresult CloseNoscript(const nsIParserNode *aNode);
|
||||
|
||||
/**
|
||||
* The special purpose methods automatically close
|
||||
|
@ -493,41 +491,38 @@ protected:
|
|||
nsresult HandleSavedTokens(PRInt32 anIndex);
|
||||
nsresult HandleKeyGen(nsIParserNode *aNode);
|
||||
void RecycleNodes(nsEntryStack *aNodeStack);
|
||||
|
||||
nsIHTMLContentSink* mSink;
|
||||
|
||||
nsDTDContext* mBodyContext;
|
||||
nsDTDContext* mTempContext;
|
||||
|
||||
PRInt32 mOpenHeadCount;
|
||||
PRInt32 mOpenMapCount;
|
||||
PRInt32 mAlternateTagOpenCount; //true when NOFRAMES, NOSCRIPT, NOEMBED, NOLAYER are open
|
||||
PRInt32 mLineNumber;
|
||||
|
||||
PRUint32 mComputedCRC32;
|
||||
PRUint32 mExpectedCRC32;
|
||||
|
||||
PRUint16 mFlags;
|
||||
|
||||
nsString mFilename;
|
||||
nsString mScratch; //used for various purposes; non-persistent
|
||||
nsAutoString mMimeType; //ok as an autostring; these are short.
|
||||
|
||||
nsIDTDDebug* mDTDDebug;
|
||||
nsITokenizer* mTokenizer;
|
||||
|
||||
nsParser* mParser;
|
||||
nsTokenAllocator* mTokenAllocator;
|
||||
nsNodeAllocator mNodeAllocator;
|
||||
|
||||
nsDeque mMisplacedContent;
|
||||
nsDeque mSkippedContent;
|
||||
nsresult mDTDState;
|
||||
nsIHTMLContentSink* mSink;
|
||||
nsTokenAllocator* mTokenAllocator;
|
||||
nsDTDContext* mBodyContext;
|
||||
nsDTDContext* mTempContext;
|
||||
PRInt32 mOpenHeadCount;
|
||||
PRInt32 mOpenMapCount;
|
||||
nsParser* mParser;
|
||||
nsITokenizer* mTokenizer;
|
||||
nsDTDMode mDTDMode;
|
||||
|
||||
eHTMLTags mSkipTarget;
|
||||
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
|
||||
eParserDocType mDocType;
|
||||
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
|
||||
eHTMLTags mSkipTarget;
|
||||
nsresult mDTDState;
|
||||
PRUint16 mFlags;
|
||||
PRInt32 mLineNumber;
|
||||
nsString mScratch; //used for various purposes; non-persistent
|
||||
nsAutoString mMimeType; //ok as an autostring; these are short.
|
||||
nsNodeAllocator mNodeAllocator;
|
||||
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
nsString mFilename;
|
||||
nsIDTDDebug* mDTDDebug;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CRC
|
||||
PRUint32 mComputedCRC32;
|
||||
PRUint32 mExpectedCRC32;
|
||||
#endif
|
||||
};
|
||||
|
||||
inline nsresult NS_NewNavHTMLDTD(nsIDTD** aInstancePtrResult)
|
||||
|
|
|
@ -350,7 +350,7 @@ void InitializeElementTable(void) {
|
|||
/*autoclose starttags and endtags*/ &gBodyAutoClose,0,0,0,
|
||||
/*parent,incl,exclgroups*/ kHTMLContent,(kFlowEntity|kSelf), kNone,
|
||||
/*special props, prop-range*/ kOmitEndTag, kBodyPropRange,
|
||||
/*special parents,kids,skip*/ &gInNoframes,&gBodyKids,eHTMLTag_unknown);
|
||||
/*special parents,kids,skip*/ 0,&gBodyKids,eHTMLTag_unknown);
|
||||
|
||||
Initialize(
|
||||
/*tag*/ eHTMLTag_br,
|
||||
|
@ -857,7 +857,7 @@ void InitializeElementTable(void) {
|
|||
/*autoclose starttags and endtags*/ 0,0,0,0,
|
||||
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
|
||||
/*special props, prop-range*/ 0, kNoPropRange,
|
||||
/*special parents,kids,skip*/ &gNoframeRoot,0,eHTMLTag_noframes); // Added noframes - fix bug 62803 - since Mozilla supports frames.
|
||||
/*special parents,kids,skip*/ &gNoframeRoot,0,eHTMLTag_unknown);
|
||||
|
||||
Initialize(
|
||||
/*tag*/ eHTMLTag_nolayer,
|
||||
|
|
|
@ -571,8 +571,6 @@ USE_GENERAL_OPEN_METHOD(OpenMap, eHTMLTag_map)
|
|||
USE_GENERAL_CLOSE_METHOD(CloseMap, eHTMLTag_map)
|
||||
USE_GENERAL_OPEN_METHOD(OpenFrameset, eHTMLTag_frameset)
|
||||
USE_GENERAL_CLOSE_METHOD(CloseFrameset, eHTMLTag_frameset)
|
||||
USE_GENERAL_OPEN_METHOD(OpenNoscript, eHTMLTag_noscript)
|
||||
USE_GENERAL_CLOSE_METHOD(CloseNoscript, eHTMLTag_noscript)
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -138,8 +138,7 @@ class nsHTMLContentSinkStream : public nsIHTMLContentSinkStream
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) ;
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode);
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition);
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition);
|
||||
|
|
|
@ -70,8 +70,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode){ return NS_OK; }
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition);
|
||||
|
|
|
@ -190,23 +190,6 @@ public:
|
|||
*/
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode)=0;
|
||||
|
||||
/**
|
||||
* This method is used in opening a NOSCRIPT container.
|
||||
*
|
||||
* @update harishd 08/25/00
|
||||
* @param nsIParserNode reference to parser node interface
|
||||
*/
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode)=0;
|
||||
|
||||
|
||||
/**
|
||||
* This method is used in closing a NOSCRIPT container.
|
||||
*
|
||||
* @update harishd 08/25/00
|
||||
* @param nsIParserNode reference to parser node interface
|
||||
*/
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode)=0;
|
||||
|
||||
/**
|
||||
* This method tells the sink whether or not it is
|
||||
* encoding an HTML fragment or the whole document.
|
||||
|
@ -235,6 +218,14 @@ public:
|
|||
* @param aPosition - Validates the end of a context.
|
||||
*/
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition)=0;
|
||||
|
||||
/**
|
||||
* Use this method to retrieve pref. for the tag.
|
||||
*
|
||||
* @update 04/11/01 harishd
|
||||
* @param aTag - Check pref. for this tag.
|
||||
*/
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref)=0;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -304,9 +304,6 @@ class nsIParser : public nsISupports {
|
|||
#define NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1016)
|
||||
#define NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1017)
|
||||
|
||||
|
||||
#define NS_HTMLPARSER_ALTERNATECONTENT NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_HTMLPARSER,1)
|
||||
|
||||
#define NS_ERROR_HTMLPARSER_CONTINUE NS_OK
|
||||
|
||||
|
||||
|
|
|
@ -72,8 +72,7 @@ public:
|
|||
NS_IMETHOD CloseMap(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseFrameset(const nsIParserNode& aNode);
|
||||
NS_IMETHOD OpenNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD CloseNoscript(const nsIParserNode& aNode) { return NS_OK; }
|
||||
NS_IMETHOD GetPref(PRInt32 aTag,PRBool& aPref) { return NS_OK; }
|
||||
NS_IMETHOD DoFragment(PRBool aFlag);
|
||||
NS_IMETHOD BeginContext(PRInt32 aPosition);
|
||||
NS_IMETHOD EndContext(PRInt32 aPosition);
|
||||
|
|
|
@ -97,7 +97,12 @@ public:
|
|||
class CSharedParserObjects {
|
||||
public:
|
||||
|
||||
CSharedParserObjects() : mDTDDeque(0) {
|
||||
CSharedParserObjects()
|
||||
:mDTDDeque(0),
|
||||
mHasViewSourceDTD(PR_FALSE),
|
||||
mHasXMLDTD(PR_FALSE),
|
||||
mOtherDTD(nsnull)
|
||||
{
|
||||
|
||||
//Note: To cut down on startup time/overhead, we defer the construction of non-html DTD's.
|
||||
|
||||
|
@ -111,6 +116,10 @@ public:
|
|||
}
|
||||
|
||||
NS_NewNavHTMLDTD(&theDTD); //do this as a default HTML DTD...
|
||||
|
||||
// please handle allocation failure
|
||||
NS_ASSERTION(theDTD, "Failed to create DTD");
|
||||
|
||||
mDTDDeque.Push(theDTD);
|
||||
|
||||
mHasViewSourceDTD=PR_FALSE;
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
|
||||
use Cwd;
|
||||
|
||||
$path=`cd`;
|
||||
$path=~m/:/;
|
||||
$path=`pwd`;;
|
||||
|
||||
$path=~m/mozilla/;
|
||||
|
||||
$drive=$`;
|
||||
|
||||
|
@ -17,14 +18,16 @@
|
|||
|
||||
if($ARGV[0] eq "-b") {
|
||||
foreach $input(<FILE_LIST>) {
|
||||
$input =~s/\n//g;
|
||||
@output=split(/\./,$input);
|
||||
system("$drive://mozilla//dist//WIN32_D.obj//bin//TestParser.exe $input $output[0].b");
|
||||
system("$drive\mozilla/dist/WIN32_D.obj/bin/TestParser.exe $input $output[0].b");
|
||||
}
|
||||
}
|
||||
elsif($ARGV[0] eq "-v") {
|
||||
foreach $input(<FILE_LIST>) {
|
||||
$input =~s/\n//g;
|
||||
@output=split(/\./,$input);
|
||||
system("$drive://mozilla//dist//WIN32_D.obj//bin//TestParser.exe $input $output[0].v");
|
||||
system("$drive\mozilla/dist/WIN32_D.obj/bin/TestParser.exe $input $output[0].v");
|
||||
system("fc $output[0].b $output[0].v");
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче