Bug 1171853 - re-fix sending inner permissions for view-source URIs, r?mystor
MozReview-Commit-ID: H8WX95dkgdF
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -130,16 +130,17 @@
#include "nsIFormProcessor.h"
#include "nsIGfxInfo.h"
#include "nsIIdleService.h"
#include "nsIInterfaceRequestorUtils.h"
#include "nsIMemoryInfoDumper.h"
#include "nsIMemoryReporter.h"
#include "nsIMozBrowserFrame.h"
#include "nsIMutable.h"
+#include "nsINestedURI.h"
#include "nsIObserverService.h"
#include "nsIParentChannel.h"
#include "nsIPresShell.h"
#include "nsIRemoteWindowContext.h"
#include "nsIScriptError.h"
#include "nsIScriptSecurityManager.h"
#include "nsISiteSecurityService.h"
#include "nsISpellChecker.h"
@@ -5163,16 +5164,33 @@ ContentParent::AboutToLoadHttpFtpWyciwyg
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
if (NS_WARN_IF(!ssm)) {
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIPrincipal> principal;
rv = ssm->GetChannelResultPrincipal(aChannel, getter_AddRefs(principal));
NS_ENSURE_SUCCESS(rv, rv);
+ // If this is a view-source principal, get a principal for the inner URI.
+ if (principal && principal->GetIsCodebasePrincipal()) {
+ nsCOMPtr<nsIURI> uri;
+ rv = principal->GetURI(getter_AddRefs(uri));
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool isViewSource = false;
+ if (NS_SUCCEEDED(uri->SchemeIs("view-source", &isViewSource)) && isViewSource) {
+ nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(uri);
+ if (!nestedURI) {
+ return NS_ERROR_FAILURE;
+ }
+ rv = nestedURI->GetInnerURI(getter_AddRefs(uri));
+ NS_ENSURE_SUCCESS(rv, rv);
+ mozilla::OriginAttributes attrs = principal->OriginAttributesRef();
+ principal = mozilla::BasePrincipal::CreateCodebasePrincipal(uri, attrs);
+ }
+ }
rv = TransmitPermissionsForPrincipal(principal);
NS_ENSURE_SUCCESS(rv, rv);
nsLoadFlags newLoadFlags;
aChannel->GetLoadFlags(&newLoadFlags);
if (newLoadFlags & nsIRequest::LOAD_DOCUMENT_NEEDS_COOKIE) {
UpdateCookieStatus(aChannel);