Bug 1044490 - Follow app redirects during <meta refresh> navigation. r=bz

This commit is contained in:
Reuben Morais 2014-08-04 22:00:50 -03:00
parent 503662b319
commit 3f1d141885
2 changed files with 40 additions and 20 deletions

View File

@ -6162,6 +6162,35 @@ nsDocShell::ForceRefreshURIFromTimer(nsIURI * aURI,
return ForceRefreshURI(aURI, aDelay, aMetaRefresh); return ForceRefreshURI(aURI, aDelay, aMetaRefresh);
} }
bool
nsDocShell::DoAppRedirectIfNeeded(nsIURI * aURI,
nsIDocShellLoadInfo * aLoadInfo,
bool aFirstParty)
{
uint32_t appId;
nsresult rv = GetAppId(&appId);
if (NS_FAILED(rv)) {
return false;
}
if (appId != nsIScriptSecurityManager::NO_APP_ID &&
appId != nsIScriptSecurityManager::UNKNOWN_APP_ID) {
nsCOMPtr<nsIAppsService> appsService =
do_GetService(APPS_SERVICE_CONTRACTID);
NS_ASSERTION(appsService, "No AppsService available");
nsCOMPtr<nsIURI> redirect;
rv = appsService->GetRedirect(appId, aURI, getter_AddRefs(redirect));
if (NS_SUCCEEDED(rv) && redirect) {
rv = LoadURI(redirect, aLoadInfo, nsIWebNavigation::LOAD_FLAGS_NONE, aFirstParty);
if (NS_SUCCEEDED(rv)) {
return true;
}
}
}
return false;
}
NS_IMETHODIMP NS_IMETHODIMP
nsDocShell::ForceRefreshURI(nsIURI * aURI, nsDocShell::ForceRefreshURI(nsIURI * aURI,
int32_t aDelay, int32_t aDelay,
@ -6215,6 +6244,10 @@ nsDocShell::ForceRefreshURI(nsIURI * aURI,
loadInfo->SetLoadType(nsIDocShellLoadInfo::loadRefresh); loadInfo->SetLoadType(nsIDocShellLoadInfo::loadRefresh);
} }
if (DoAppRedirectIfNeeded(aURI, loadInfo, true)) {
return NS_OK;
}
/* /*
* LoadURI(...) will cancel all refresh timers... This causes the * LoadURI(...) will cancel all refresh timers... This causes the
* Timer and its refreshData instance to be released... * Timer and its refreshData instance to be released...
@ -6848,29 +6881,10 @@ nsDocShell::OnRedirectStateChange(nsIChannel* aOldChannel,
return; return;
} }
// Check if we have a redirect registered for this url. if (DoAppRedirectIfNeeded(newURI, nullptr, false)) {
uint32_t appId;
nsresult rv = GetAppId(&appId);
if (NS_FAILED(rv)) {
return; return;
} }
if (appId != nsIScriptSecurityManager::NO_APP_ID &&
appId != nsIScriptSecurityManager::UNKNOWN_APP_ID) {
nsCOMPtr<nsIAppsService> appsService =
do_GetService(APPS_SERVICE_CONTRACTID);
NS_ASSERTION(appsService, "No AppsService available");
nsCOMPtr<nsIURI> redirect;
rv = appsService->GetRedirect(appId, newURI, getter_AddRefs(redirect));
if (NS_SUCCEEDED(rv) && redirect) {
aNewChannel->Cancel(NS_BINDING_ABORTED);
rv = LoadURI(redirect, nullptr, 0, false);
if (NS_SUCCEEDED(rv)) {
return;
}
}
}
// Below a URI visit is saved (see AddURIVisit method doc). // Below a URI visit is saved (see AddURIVisit method doc).
// The visit chain looks something like: // The visit chain looks something like:
// ... // ...

View File

@ -640,6 +640,12 @@ protected:
// Convenience method for getting our parent docshell. Can return null // Convenience method for getting our parent docshell. Can return null
already_AddRefed<nsDocShell> GetParentDocshell(); already_AddRefed<nsDocShell> GetParentDocshell();
// Check if we have an app redirect registered for the URI and redirect if
// needed. Returns true if a redirect happened, false otherwise.
bool DoAppRedirectIfNeeded(nsIURI * aURI,
nsIDocShellLoadInfo * aLoadInfo,
bool aFirstParty);
protected: protected:
nsresult GetCurScrollPos(int32_t scrollOrientation, int32_t * curPos); nsresult GetCurScrollPos(int32_t scrollOrientation, int32_t * curPos);
nsresult SetCurScrollPosEx(int32_t curHorizontalPos, int32_t curVerticalPos); nsresult SetCurScrollPosEx(int32_t curHorizontalPos, int32_t curVerticalPos);