Skip to content

Commit bf3da0d

Browse files
Bug 22343: Make 'Save Page As' obey first-party isolation
1 parent 0dad55e commit bf3da0d

File tree

6 files changed

+52
-5
lines changed

6 files changed

+52
-5
lines changed

embedding/browser/nsWebBrowser.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,18 @@ nsWebBrowser::SetProgressListener(nsIWebProgressListener* aProgressListener)
985985
return NS_OK;
986986
}
987987

988+
NS_IMETHODIMP
989+
nsWebBrowser::GetLoadingPrincipal(nsIPrincipal** loadingPrincipal)
990+
{
991+
return NS_ERROR_NOT_IMPLEMENTED;
992+
}
993+
994+
NS_IMETHODIMP
995+
nsWebBrowser::SetLoadingPrincipal(nsIPrincipal* loadingPrincipal)
996+
{
997+
return NS_ERROR_NOT_IMPLEMENTED;
998+
}
999+
9881000
NS_IMETHODIMP
9891001
nsWebBrowser::SaveURI(nsIURI* aURI,
9901002
nsISupports* aCacheKey,

embedding/components/webbrowserpersist/nsIWebBrowserPersist.idl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ interface nsIWebProgressListener;
1313
interface nsIFile;
1414
interface nsIChannel;
1515
interface nsILoadContext;
16+
interface nsIPrincipal;
1617

1718
/**
1819
* Interface for persisting DOM documents and URIs to local or remote storage.
@@ -111,6 +112,8 @@ interface nsIWebBrowserPersist : nsICancelable
111112
*/
112113
attribute nsIWebProgressListener progressListener;
113114

115+
attribute nsIPrincipal loadingPrincipal;
116+
114117
/**
115118
* Save the specified URI to file.
116119
*

embedding/components/webbrowserpersist/nsWebBrowserPersist.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ const char *kWebBrowserPersistStringBundle =
274274
nsWebBrowserPersist::nsWebBrowserPersist() :
275275
mCurrentDataPathIsRelative(false),
276276
mCurrentThingsToPersist(0),
277+
mLoadingPrincipal(nsContentUtils::GetSystemPrincipal()),
277278
mFirstAndOnlyUse(true),
278279
mSavingDocument(false),
279280
mCancel(false),
@@ -410,6 +411,18 @@ NS_IMETHODIMP nsWebBrowserPersist::SetProgressListener(
410411
return NS_OK;
411412
}
412413

414+
NS_IMETHODIMP nsWebBrowserPersist::GetLoadingPrincipal(nsIPrincipal** loadingPrincipal)
415+
{
416+
*loadingPrincipal = mLoadingPrincipal;
417+
return NS_OK;
418+
}
419+
420+
NS_IMETHODIMP nsWebBrowserPersist::SetLoadingPrincipal(nsIPrincipal* loadingPrincipal)
421+
{
422+
mLoadingPrincipal = loadingPrincipal;
423+
return NS_OK;
424+
}
425+
413426
NS_IMETHODIMP nsWebBrowserPersist::SaveURI(
414427
nsIURI *aURI, nsISupports *aCacheKey,
415428
nsIURI *aReferrer, uint32_t aReferrerPolicy,
@@ -1352,7 +1365,7 @@ nsresult nsWebBrowserPersist::SaveURIInternal(
13521365
nsCOMPtr<nsIChannel> inputChannel;
13531366
rv = NS_NewChannel(getter_AddRefs(inputChannel),
13541367
aURI,
1355-
nsContentUtils::GetSystemPrincipal(),
1368+
mLoadingPrincipal,
13561369
nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL,
13571370
nsIContentPolicy::TYPE_OTHER,
13581371
nullptr, // aLoadGroup
@@ -2696,7 +2709,7 @@ nsWebBrowserPersist::CreateChannelFromURI(nsIURI *aURI, nsIChannel **aChannel)
26962709

26972710
rv = NS_NewChannel(aChannel,
26982711
aURI,
2699-
nsContentUtils::GetSystemPrincipal(),
2712+
mLoadingPrincipal,
27002713
nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL,
27012714
nsIContentPolicy::TYPE_OTHER);
27022715
NS_ENSURE_SUCCESS(rv, rv);

embedding/components/webbrowserpersist/nsWebBrowserPersist.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ class nsWebBrowserPersist final : public nsIInterfaceRequestor,
146146
nsCOMPtr<nsIMIMEService> mMIMEService;
147147
nsCOMPtr<nsIURI> mURI;
148148
nsCOMPtr<nsIWebProgressListener> mProgressListener;
149+
nsCOMPtr<nsIPrincipal> mLoadingPrincipal;
150+
149151
/**
150152
* Progress listener for 64-bit values; this is the same object as
151153
* mProgressListener, but is a member to avoid having to qi it for each

netwerk/base/LoadContextInfo.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,6 @@ GetLoadContextInfo(nsIChannel * aChannel)
118118
{
119119
nsresult rv;
120120

121-
DebugOnly<bool> pb = NS_UsePrivateBrowsing(aChannel);
122-
123121
bool anon = false;
124122
nsLoadFlags loadFlags;
125123
rv = aChannel->GetLoadFlags(&loadFlags);
@@ -129,7 +127,21 @@ GetLoadContextInfo(nsIChannel * aChannel)
129127

130128
NeckoOriginAttributes oa;
131129
NS_GetOriginAttributes(aChannel, oa);
132-
MOZ_ASSERT(pb == (oa.mPrivateBrowsingId > 0));
130+
131+
#ifdef DEBUG
132+
nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
133+
if (loadInfo) {
134+
nsCOMPtr<nsIPrincipal> principal = loadInfo->LoadingPrincipal();
135+
if (principal) {
136+
bool chrome;
137+
principal->GetIsSystemPrincipal(&chrome);
138+
if (!chrome) {
139+
bool pb = NS_UsePrivateBrowsing(aChannel);
140+
MOZ_ASSERT(pb == (oa.mPrivateBrowsingId > 0));
141+
}
142+
}
143+
}
144+
#endif
133145

134146
return new LoadContextInfo(anon, oa);
135147
}

toolkit/content/contentAreaUtils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,8 @@ function internalSave(aURL, aDocument, aDefaultFileName, aContentDisposition,
467467
: aInitiatingDocument.isPrivate;
468468
}
469469

470+
let loadingPrincipal = aInitiatingDocument.nodePrincipal || aDocument.nodePrincipal;
471+
470472
var persistArgs = {
471473
sourceURI : sourceURI,
472474
sourceReferrer : aReferrer,
@@ -477,6 +479,7 @@ function internalSave(aURL, aDocument, aDefaultFileName, aContentDisposition,
477479
sourcePostData : nonCPOWDocument ? getPostData(aDocument) : null,
478480
bypassCache : aShouldBypassCache,
479481
isPrivate : isPrivate,
482+
loadingPrincipal : loadingPrincipal,
480483
};
481484

482485
// Start the actual save process
@@ -518,6 +521,8 @@ function internalPersist(persistArgs)
518521
{
519522
var persist = makeWebBrowserPersist();
520523

524+
persist.loadingPrincipal = persistArgs.loadingPrincipal;
525+
521526
// Calculate persist flags.
522527
const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
523528
const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES |

0 commit comments

Comments
 (0)