diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index cdd4665fc8..ade5b4e2e0 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -560,6 +560,23 @@ BasePrincipal::GetCspJSON(nsAString& outCSPinJSON) return mCSP->ToJSON(outCSPinJSON); } +NS_IMETHODIMP +BasePrincipal::IsSameOrigin(nsIURI* aURI, bool aIsPrivateWin, bool* aRes) { + *aRes = false; + nsCOMPtr prinURI; + nsresult rv = GetURI(getter_AddRefs(prinURI)); + if (NS_FAILED(rv) || !prinURI) { + return NS_OK; + } + nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); + if (!ssm) { + return NS_ERROR_UNEXPECTED; + ; + } + *aRes = NS_SUCCEEDED(ssm->CheckSameOriginURI(prinURI, aURI, aIsPrivateWin)); + return NS_OK; +} + NS_IMETHODIMP BasePrincipal::GetIsNullPrincipal(bool* aResult) { diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index b1f151521f..dd60d33746 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -282,6 +282,7 @@ public: NS_IMETHOD GetUnknownAppId(bool* aUnknownAppId) final; NS_IMETHOD GetUserContextId(uint32_t* aUserContextId) final; NS_IMETHOD GetPrivateBrowsingId(uint32_t* aPrivateBrowsingId) final; + NS_IMETHOD IsSameOrigin(nsIURI* aURI, bool aIsPrivateWin, bool* aRes) override; bool EqualsIgnoringAddonId(nsIPrincipal *aOther); diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index 1d58dcb7fa..03f293f7b2 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -223,6 +223,12 @@ interface nsIPrincipal : nsISerializable */ readonly attribute AUTF8String originSuffix; + /** + * Uses NS_Security Compare to determine if the + * other URI is same-origin as the uri of the Principal + */ + bool IsSameOrigin(in nsIURI otherURI, in bool aIsPrivateWin); + /** * The base domain of the codebase URI to which this principal pertains * (generally the document URI), handling null principals and