diff --git a/mozilla/content/base/src/nsPlainTextSerializer.cpp b/mozilla/content/base/src/nsPlainTextSerializer.cpp index 3f78f27dd16..b5c673ab115 100644 --- a/mozilla/content/base/src/nsPlainTextSerializer.cpp +++ b/mozilla/content/base/src/nsPlainTextSerializer.cpp @@ -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) { diff --git a/mozilla/content/base/src/nsPlainTextSerializer.h b/mozilla/content/base/src/nsPlainTextSerializer.h index 20f129a10ba..6c29593033d 100644 --- a/mozilla/content/base/src/nsPlainTextSerializer.h +++ b/mozilla/content/base/src/nsPlainTextSerializer.h @@ -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; } diff --git a/mozilla/content/html/content/src/nsHTMLAtomList.h b/mozilla/content/html/content/src/nsHTMLAtomList.h index 64aee719249..47563167e91 100644 --- a/mozilla/content/html/content/src/nsHTMLAtomList.h +++ b/mozilla/content/html/content/src/nsHTMLAtomList.h @@ -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") diff --git a/mozilla/content/html/document/src/nsHTMLContentSink.cpp b/mozilla/content/html/document/src/nsHTMLContentSink.cpp index 5ad464bf19a..35263ad8adb 100644 --- a/mozilla/content/html/document/src/nsHTMLContentSink.cpp +++ b/mozilla/content/html/document/src/nsHTMLContentSink.cpp @@ -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 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 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; diff --git a/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp b/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp index fd68f474d6d..4ca2a90fb70 100644 --- a/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp +++ b/mozilla/content/html/document/src/nsHTMLFragmentContentSink.cpp @@ -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; } diff --git a/mozilla/content/shared/public/nsHTMLAtomList.h b/mozilla/content/shared/public/nsHTMLAtomList.h index 64aee719249..47563167e91 100644 --- a/mozilla/content/shared/public/nsHTMLAtomList.h +++ b/mozilla/content/shared/public/nsHTMLAtomList.h @@ -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") diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index 22f18521635..46f945e1696 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -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; } diff --git a/mozilla/docshell/base/nsDocShell.h b/mozilla/docshell/base/nsDocShell.h index 261d88a7822..fa37174f1b4 100644 --- a/mozilla/docshell/base/nsDocShell.h +++ b/mozilla/docshell/base/nsDocShell.h @@ -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; diff --git a/mozilla/docshell/base/nsIDocShell.idl b/mozilla/docshell/base/nsIDocShell.idl index 40220277283..60df9e1e2f0 100644 --- a/mozilla/docshell/base/nsIDocShell.idl +++ b/mozilla/docshell/base/nsIDocShell.idl @@ -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; /* diff --git a/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl b/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl index b056b7dc754..4519218df03 100644 --- a/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl +++ b/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl @@ -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; diff --git a/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp b/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp index 02b8f319656..bb1672a2da0 100644 --- a/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp +++ b/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp @@ -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; diff --git a/mozilla/htmlparser/robot/nsRobotSink.cpp b/mozilla/htmlparser/robot/nsRobotSink.cpp index 8e7587ae4e3..cdb838e8f1d 100644 --- a/mozilla/htmlparser/robot/nsRobotSink.cpp +++ b/mozilla/htmlparser/robot/nsRobotSink.cpp @@ -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); diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp index 74041ec4c4b..67a9047e769 100644 --- a/mozilla/htmlparser/src/CNavDTD.cpp +++ b/mozilla/htmlparser/src/CNavDTD.cpp @@ -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 ... 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); diff --git a/mozilla/htmlparser/src/CNavDTD.h b/mozilla/htmlparser/src/CNavDTD.h index afaaa3ec570..c571f0305af 100644 --- a/mozilla/htmlparser/src/CNavDTD.h +++ b/mozilla/htmlparser/src/CNavDTD.h @@ -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) diff --git a/mozilla/htmlparser/src/nsElementTable.cpp b/mozilla/htmlparser/src/nsElementTable.cpp index 0427e9dadcc..17ce52db521 100644 --- a/mozilla/htmlparser/src/nsElementTable.cpp +++ b/mozilla/htmlparser/src/nsElementTable.cpp @@ -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, diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp index ee2eab6fef0..88cf9752b7f 100644 --- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp +++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp @@ -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) /** * diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.h b/mozilla/htmlparser/src/nsHTMLContentSinkStream.h index 330e8675322..319935648ec 100644 --- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.h +++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.h @@ -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); diff --git a/mozilla/htmlparser/src/nsHTMLNullSink.cpp b/mozilla/htmlparser/src/nsHTMLNullSink.cpp index 2ff3c2413ab..b5f366a91c3 100644 --- a/mozilla/htmlparser/src/nsHTMLNullSink.cpp +++ b/mozilla/htmlparser/src/nsHTMLNullSink.cpp @@ -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); diff --git a/mozilla/htmlparser/src/nsIHTMLContentSink.h b/mozilla/htmlparser/src/nsIHTMLContentSink.h index 061733bb9d2..2c5536ecb2f 100644 --- a/mozilla/htmlparser/src/nsIHTMLContentSink.h +++ b/mozilla/htmlparser/src/nsIHTMLContentSink.h @@ -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; }; diff --git a/mozilla/htmlparser/src/nsIParser.h b/mozilla/htmlparser/src/nsIParser.h index d4d56f02973..2e81dab008c 100644 --- a/mozilla/htmlparser/src/nsIParser.h +++ b/mozilla/htmlparser/src/nsIParser.h @@ -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 diff --git a/mozilla/htmlparser/src/nsLoggingSink.h b/mozilla/htmlparser/src/nsLoggingSink.h index d3931bf4a28..bd434e3358c 100644 --- a/mozilla/htmlparser/src/nsLoggingSink.h +++ b/mozilla/htmlparser/src/nsLoggingSink.h @@ -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); diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp index 3f33d3c7497..57f18689449 100644 --- a/mozilla/htmlparser/src/nsParser.cpp +++ b/mozilla/htmlparser/src/nsParser.cpp @@ -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; diff --git a/mozilla/htmlparser/tests/logparse/TestParser.pl b/mozilla/htmlparser/tests/logparse/TestParser.pl index 80acc11e7c5..807376a9cc9 100644 --- a/mozilla/htmlparser/tests/logparse/TestParser.pl +++ b/mozilla/htmlparser/tests/logparse/TestParser.pl @@ -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() { + $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() { + $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"); } } diff --git a/mozilla/layout/base/nsCSSFrameConstructor.cpp b/mozilla/layout/base/nsCSSFrameConstructor.cpp index 63aaeb031af..3ab12063911 100644 --- a/mozilla/layout/base/nsCSSFrameConstructor.cpp +++ b/mozilla/layout/base/nsCSSFrameConstructor.cpp @@ -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 container; + aPresContext->GetContainer(getter_AddRefs(container)); + nsCOMPtr 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 container; + aPresContext->GetContainer(getter_AddRefs(container)); + nsCOMPtr 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 container; + aPresContext->GetContainer(getter_AddRefs(container)); + nsCOMPtr docShell(do_QueryInterface(container)); + if (docShell) { + docShell->GetAllowSubframes(&allowSubframes); + } + } + if (allowSubframes) { + // make 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) { diff --git a/mozilla/layout/html/document/src/html.css b/mozilla/layout/html/document/src/html.css index d20a0005c1a..454d6450284 100644 --- a/mozilla/layout/html/document/src/html.css +++ b/mozilla/layout/html/document/src/html.css @@ -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; } diff --git a/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp b/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp index 63aaeb031af..3ab12063911 100644 --- a/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp +++ b/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp @@ -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) { diff --git a/mozilla/layout/style/html.css b/mozilla/layout/style/html.css index d20a0005c1a..454d6450284 100644 --- a/mozilla/layout/style/html.css +++ b/mozilla/layout/style/html.css @@ -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; } diff --git a/mozilla/modules/libpref/src/init/all.js b/mozilla/modules/libpref/src/init/all.js index 46bcae89a08..8570606c040 100644 --- a/mozilla/modules/libpref/src/init/all.js +++ b/mozilla/modules/libpref/src/init/all.js @@ -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); diff --git a/mozilla/parser/htmlparser/robot/nsRobotSink.cpp b/mozilla/parser/htmlparser/robot/nsRobotSink.cpp index 8e7587ae4e3..cdb838e8f1d 100644 --- a/mozilla/parser/htmlparser/robot/nsRobotSink.cpp +++ b/mozilla/parser/htmlparser/robot/nsRobotSink.cpp @@ -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); diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp index 74041ec4c4b..67a9047e769 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.cpp +++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp @@ -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); diff --git a/mozilla/parser/htmlparser/src/CNavDTD.h b/mozilla/parser/htmlparser/src/CNavDTD.h index afaaa3ec570..c571f0305af 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.h +++ b/mozilla/parser/htmlparser/src/CNavDTD.h @@ -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) diff --git a/mozilla/parser/htmlparser/src/nsElementTable.cpp b/mozilla/parser/htmlparser/src/nsElementTable.cpp index 0427e9dadcc..17ce52db521 100644 --- a/mozilla/parser/htmlparser/src/nsElementTable.cpp +++ b/mozilla/parser/htmlparser/src/nsElementTable.cpp @@ -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, diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp index ee2eab6fef0..88cf9752b7f 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp @@ -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) /** * diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h index 330e8675322..319935648ec 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h +++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h @@ -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); diff --git a/mozilla/parser/htmlparser/src/nsHTMLNullSink.cpp b/mozilla/parser/htmlparser/src/nsHTMLNullSink.cpp index 2ff3c2413ab..b5f366a91c3 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLNullSink.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLNullSink.cpp @@ -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); diff --git a/mozilla/parser/htmlparser/src/nsIHTMLContentSink.h b/mozilla/parser/htmlparser/src/nsIHTMLContentSink.h index 061733bb9d2..2c5536ecb2f 100644 --- a/mozilla/parser/htmlparser/src/nsIHTMLContentSink.h +++ b/mozilla/parser/htmlparser/src/nsIHTMLContentSink.h @@ -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; }; diff --git a/mozilla/parser/htmlparser/src/nsIParser.h b/mozilla/parser/htmlparser/src/nsIParser.h index d4d56f02973..2e81dab008c 100644 --- a/mozilla/parser/htmlparser/src/nsIParser.h +++ b/mozilla/parser/htmlparser/src/nsIParser.h @@ -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 diff --git a/mozilla/parser/htmlparser/src/nsLoggingSink.h b/mozilla/parser/htmlparser/src/nsLoggingSink.h index d3931bf4a28..bd434e3358c 100644 --- a/mozilla/parser/htmlparser/src/nsLoggingSink.h +++ b/mozilla/parser/htmlparser/src/nsLoggingSink.h @@ -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); diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index 3f33d3c7497..57f18689449 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -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; diff --git a/mozilla/parser/htmlparser/tests/logparse/TestParser.pl b/mozilla/parser/htmlparser/tests/logparse/TestParser.pl index 80acc11e7c5..807376a9cc9 100644 --- a/mozilla/parser/htmlparser/tests/logparse/TestParser.pl +++ b/mozilla/parser/htmlparser/tests/logparse/TestParser.pl @@ -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"); } }