зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1313627 - Get the firstPartyDomain from the nodePrincipal of the document in nsDocShell::CanAccessItem() if the first party isolation is on. r=smaug
This commit is contained in:
Родитель
3ffb31894f
Коммит
950b86072e
|
@ -324,6 +324,7 @@ OriginAttributes::SetFromGenericAttributes(const GenericOriginAttributes& aAttrs
|
||||||
mFirstPartyDomain = aAttrs.mFirstPartyDomain;
|
mFirstPartyDomain = aAttrs.mFirstPartyDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* static */
|
||||||
bool
|
bool
|
||||||
OriginAttributes::IsFirstPartyEnabled()
|
OriginAttributes::IsFirstPartyEnabled()
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,13 +61,13 @@ public:
|
||||||
|
|
||||||
void SetFromGenericAttributes(const GenericOriginAttributes& aAttrs);
|
void SetFromGenericAttributes(const GenericOriginAttributes& aAttrs);
|
||||||
|
|
||||||
|
// check if "privacy.firstparty.isolate" is enabled.
|
||||||
|
static bool IsFirstPartyEnabled();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
OriginAttributes() {}
|
OriginAttributes() {}
|
||||||
explicit OriginAttributes(const OriginAttributesDictionary& aOther)
|
explicit OriginAttributes(const OriginAttributesDictionary& aOther)
|
||||||
: OriginAttributesDictionary(aOther) {}
|
: OriginAttributesDictionary(aOther) {}
|
||||||
|
|
||||||
// check if "privacy.firstparty.isolate" is enabled.
|
|
||||||
bool IsFirstPartyEnabled();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PrincipalOriginAttributes;
|
class PrincipalOriginAttributes;
|
||||||
|
|
|
@ -3573,8 +3573,54 @@ nsDocShell::CanAccessItem(nsIDocShellTreeItem* aTargetItem,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (static_cast<nsDocShell*>(targetDS.get())->GetOriginAttributes() !=
|
nsCOMPtr<nsIDocShellTreeItem> accessingRoot;
|
||||||
static_cast<nsDocShell*>(accessingDS.get())->GetOriginAttributes()) {
|
aAccessingItem->GetSameTypeRootTreeItem(getter_AddRefs(accessingRoot));
|
||||||
|
nsCOMPtr<nsIDocShell> accessingRootDS = do_QueryInterface(accessingRoot);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDocShellTreeItem> targetRoot;
|
||||||
|
aTargetItem->GetSameTypeRootTreeItem(getter_AddRefs(targetRoot));
|
||||||
|
nsCOMPtr<nsIDocShell> targetRootDS = do_QueryInterface(targetRoot);
|
||||||
|
|
||||||
|
DocShellOriginAttributes targetOA =
|
||||||
|
static_cast<nsDocShell*>(targetDS.get())->GetOriginAttributes();
|
||||||
|
DocShellOriginAttributes accessingOA =
|
||||||
|
static_cast<nsDocShell*>(accessingDS.get())->GetOriginAttributes();
|
||||||
|
|
||||||
|
// When the first party isolation is on, the top-level docShell may not have
|
||||||
|
// the firstPartyDomain in its originAttributes, but its document will have
|
||||||
|
// it. So we get the firstPartyDomain from the nodePrincipal of the document
|
||||||
|
// before we compare the originAttributes.
|
||||||
|
if (OriginAttributes::IsFirstPartyEnabled()) {
|
||||||
|
if (accessingDS == accessingRootDS &&
|
||||||
|
aAccessingItem->ItemType() == nsIDocShellTreeItem::typeContent &&
|
||||||
|
!accessingDS->GetIsMozBrowserOrApp()) {
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDocument> accessingDoc = aAccessingItem->GetDocument();
|
||||||
|
|
||||||
|
if (accessingDoc) {
|
||||||
|
nsCOMPtr<nsIPrincipal> accessingPrincipal = accessingDoc->NodePrincipal();
|
||||||
|
|
||||||
|
accessingOA.mFirstPartyDomain =
|
||||||
|
BasePrincipal::Cast(accessingPrincipal)->OriginAttributesRef().mFirstPartyDomain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetDS == targetRootDS &&
|
||||||
|
aTargetItem->ItemType() == nsIDocShellTreeItem::typeContent &&
|
||||||
|
!targetDS->GetIsMozBrowserOrApp()) {
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDocument> targetDoc = aAccessingItem->GetDocument();
|
||||||
|
|
||||||
|
if (targetDoc) {
|
||||||
|
nsCOMPtr<nsIPrincipal> targetPrincipal = targetDoc->NodePrincipal();
|
||||||
|
|
||||||
|
targetOA.mFirstPartyDomain =
|
||||||
|
BasePrincipal::Cast(targetPrincipal)->OriginAttributesRef().mFirstPartyDomain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetOA != accessingOA) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3584,10 +3630,6 @@ nsDocShell::CanAccessItem(nsIDocShellTreeItem* aTargetItem,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
nsCOMPtr<nsIDocShellTreeItem> accessingRoot;
|
|
||||||
aAccessingItem->GetSameTypeRootTreeItem(getter_AddRefs(accessingRoot));
|
|
||||||
|
|
||||||
if (aTargetItem == accessingRoot) {
|
if (aTargetItem == accessingRoot) {
|
||||||
// A frame can navigate its root.
|
// A frame can navigate its root.
|
||||||
return true;
|
return true;
|
||||||
|
@ -3605,9 +3647,6 @@ nsDocShell::CanAccessItem(nsIDocShellTreeItem* aTargetItem,
|
||||||
parent.swap(target);
|
parent.swap(target);
|
||||||
} while (target);
|
} while (target);
|
||||||
|
|
||||||
nsCOMPtr<nsIDocShellTreeItem> targetRoot;
|
|
||||||
aTargetItem->GetSameTypeRootTreeItem(getter_AddRefs(targetRoot));
|
|
||||||
|
|
||||||
if (aTargetItem != targetRoot) {
|
if (aTargetItem != targetRoot) {
|
||||||
// target is a subframe, not in accessor's frame hierarchy, and all its
|
// target is a subframe, not in accessor's frame hierarchy, and all its
|
||||||
// ancestors have origins different from that of the accessor. Don't
|
// ancestors have origins different from that of the accessor. Don't
|
||||||
|
|
Загрузка…
Ссылка в новой задаче