From fa73d43aecb6ccf75cb12510da89c218c7a4adc2 Mon Sep 17 00:00:00 2001 From: "radha%netscape.com" Date: Sat, 24 Mar 2001 01:23:42 +0000 Subject: [PATCH] Fix for bug # 69457 r=valeski, rpotts git-svn-id: svn://10.0.0.236/trunk@90316 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/docshell/base/nsDocShell.cpp | 53 +++++++++++++++---- mozilla/docshell/base/nsDocShell.h | 1 + mozilla/docshell/base/nsIDocShell.idl | 6 +++ .../browser/webBrowser/nsIWebBrowserSetup.idl | 3 ++ .../browser/webBrowser/nsWebBrowser.cpp | 8 ++- 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index 29fff83b645..055ee76cd0c 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -128,6 +128,7 @@ nsDocShell::nsDocShell() : mInitialPageLoad(PR_TRUE), mAllowPlugins(PR_TRUE), mAllowJavascript(PR_TRUE), + mAllowMetaRedirects(PR_TRUE), mAppType(nsIDocShell::APP_TYPE_UNKNOWN), mViewMode(viewNormal), mLastViewMode(viewNormal), @@ -714,6 +715,23 @@ NS_IMETHODIMP nsDocShell::SetAllowJavascript(PRBool aAllowJavascript) return NS_OK; } +NS_IMETHODIMP +nsDocShell::GetAllowMetaRedirects(PRBool * aReturn) +{ + NS_ENSURE_ARG_POINTER(aReturn); + + *aReturn = mAllowMetaRedirects; + return NS_OK; +} + +NS_IMETHODIMP +nsDocShell::SetAllowMetaRedirects(PRBool aValue) +{ + mAllowMetaRedirects = aValue; + return NS_OK; +} + + NS_IMETHODIMP nsDocShell::GetAppType(PRUint32* aAppType) { *aAppType = mAppType; @@ -4478,23 +4496,36 @@ NS_IMETHODIMP_(void) nsRefreshTimer::Notify(nsITimer *aTimer) } nsCOMPtr loadInfo; mDocShell->CreateLoadInfo (getter_AddRefs (loadInfo)); - /* Check if this refresh causes a redirection - * to another site within the threshold time we - * have in mind(15000 ms as defined by REFRESH_REDIRECT_TIMER). - * If so, pass a REPLACE flag to LoadURI(). + /* Check if this META refresh causes a redirection + * to another site. If so, check if this is permitted. Some + * embedded applications may not want to do this. */ PRBool equalUri = PR_FALSE; - if (NS_SUCCEEDED(mURI->Equals(currURI, &equalUri)) && (delay <= REFRESH_REDIRECT_TIMER) && (!equalUri) && mMetaRefresh) { - loadInfo->SetLoadType(nsIDocShellLoadInfo::loadNormalReplace); + nsresult rv = mURI->Equals(currURI, &equalUri); + if (NS_SUCCEEDED(rv) && (!equalUri) && mMetaRefresh) { + PRBool allowRedirects=PR_TRUE; + mDocShell->GetAllowMetaRedirects(&allowRedirects); + if (!allowRedirects) + return; + /* It is a META refresh based redirection. Now check if it happened within + * the threshold time we have in mind(15000 ms as defined by REFRESH_REDIRECT_TIMER). + * If so, pass a REPLACE flag to LoadURI(). + */ + if (delay <= REFRESH_REDIRECT_TIMER) { + loadInfo->SetLoadType(nsIDocShellLoadInfo::loadNormalReplace); + } + else + loadInfo->SetLoadType(nsIDocShellLoadInfo::loadRefresh); + /* + * LoadURL(...) will cancel all refresh timers... This causes the Timer and + * its refreshData instance to be released... + */ + mDocShell->LoadURI(mURI, loadInfo, nsIWebNavigation::LOAD_FLAGS_NONE); + } else loadInfo->SetLoadType(nsIDocShellLoadInfo::loadRefresh); mDocShell->LoadURI(mURI, loadInfo, nsIWebNavigation::LOAD_FLAGS_NONE); } - - /* - * LoadURL(...) will cancel all refresh timers... This causes the Timer and - * its refreshData instance to be released... - */ } diff --git a/mozilla/docshell/base/nsDocShell.h b/mozilla/docshell/base/nsDocShell.h index 4c014f1890d..ffb7fa48e90 100644 --- a/mozilla/docshell/base/nsDocShell.h +++ b/mozilla/docshell/base/nsDocShell.h @@ -289,6 +289,7 @@ protected: PRBool mInitialPageLoad; PRBool mAllowPlugins; PRBool mAllowJavascript; + PRBool mAllowMetaRedirects; PRUint32 mAppType; PRInt32 mViewMode; PRInt32 mLastViewMode; diff --git a/mozilla/docshell/base/nsIDocShell.idl b/mozilla/docshell/base/nsIDocShell.idl index db93b3e9eda..cc760c14e49 100644 --- a/mozilla/docshell/base/nsIDocShell.idl +++ b/mozilla/docshell/base/nsIDocShell.idl @@ -148,6 +148,12 @@ interface nsIDocShell : nsISupports */ attribute boolean allowJavascript; + /** + * Attribute stating if refresh based redirects can be allowed + */ + attribute boolean allowMetaRedirects; + + /* The type of application that created this window */ diff --git a/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl b/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl index 27ac48f1d9d..b056b7dc754 100644 --- a/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl +++ b/mozilla/embedding/browser/webBrowser/nsIWebBrowserSetup.idl @@ -34,6 +34,9 @@ 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; + + void setProperty(in unsigned long aId, in unsigned long aValue); }; \ No newline at end of file diff --git a/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp b/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp index efca97dc7f2..a51f42ad1ac 100644 --- a/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp +++ b/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp @@ -604,7 +604,13 @@ NS_IMETHODIMP nsWebBrowser::SetProperty(PRUint32 aId, PRUint32 aValue) mDocShell->SetAllowJavascript(aValue); } break; - + case nsIWebBrowserSetup::SETUP_ALLOW_META_REDIRECTS: + { + NS_ENSURE_STATE(mDocShell); + NS_ENSURE_TRUE((aValue == PR_TRUE || aValue == PR_FALSE), NS_ERROR_INVALID_ARG); + mDocShell->SetAllowMetaRedirects(aValue); + } + break; default: return NS_ERROR_INVALID_ARG;