diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp
index 7a482101fa3a..ab7ea266e4f5 100644
--- a/content/html/document/src/nsHTMLDocument.cpp
+++ b/content/html/document/src/nsHTMLDocument.cpp
@@ -628,14 +628,11 @@ CheckSameOrigin(nsINode* aNode1, nsINode* aNode2)
NS_PRECONDITION(aNode1, "Null node?");
NS_PRECONDITION(aNode2, "Null node?");
- nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager();
- if (!secMan) {
- return PR_FALSE;
- }
-
+ PRBool equal;
return
- NS_SUCCEEDED(secMan->CheckSameOriginPrincipal(aNode1->NodePrincipal(),
- aNode2->NodePrincipal()));
+ NS_SUCCEEDED(aNode1->NodePrincipal()->
+ Equals(aNode2->NodePrincipal(), &equal)) &&
+ equal;
}
PRBool
@@ -2146,9 +2143,10 @@ nsHTMLDocument::OpenCommon(const nsACString& aContentType, PRBool aReplace)
// If callerPrincipal doesn't match our principal. make sure that
// SetNewDocument gives us a new inner window and clears our scope.
+ PRBool samePrincipal;
if (!callerPrincipal ||
- NS_FAILED(nsContentUtils::GetSecurityManager()->
- CheckSameOriginPrincipal(callerPrincipal, NodePrincipal()))) {
+ NS_FAILED(callerPrincipal->Equals(NodePrincipal(), &samePrincipal)) ||
+ !samePrincipal) {
SetIsInitialDocument(PR_FALSE);
}
@@ -4018,8 +4016,11 @@ nsHTMLDocument::SetDesignMode(const nsAString & aDesignMode)
rv = secMan->GetSubjectPrincipal(getter_AddRefs(subject));
NS_ENSURE_SUCCESS(rv, rv);
if (subject) {
- rv = secMan->CheckSameOriginPrincipal(subject, NodePrincipal());
+ PRBool subsumes;
+ rv = subject->Subsumes(NodePrincipal(), &subsumes);
NS_ENSURE_SUCCESS(rv, rv);
+
+ NS_ENSURE_TRUE(subsumes, NS_ERROR_DOM_PROP_ACCESS_DENIED);
}
}
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index aed29cf57457..caff39779cd6 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -1025,10 +1025,11 @@ nsDocShell::ValidateOrigin(nsIDocShellTreeItem* aOriginTreeItem,
nsCOMPtr targetDocument(do_QueryInterface(targetDOMDocument));
NS_ENSURE_TRUE(targetDocument, PR_FALSE);
+ PRBool equal;
return
- NS_SUCCEEDED(securityManager->
- CheckSameOriginPrincipal(originDocument->NodePrincipal(),
- targetDocument->NodePrincipal()));
+ NS_SUCCEEDED(originDocument->NodePrincipal()->
+ Equals(targetDocument->NodePrincipal(), &equal)) &&
+ equal;
}
NS_IMETHODIMP
@@ -6209,12 +6210,16 @@ nsDocShell::CheckLoadingPermissions()
}
// Compare origins
- sameOrigin =
- securityManager->CheckSameOriginPrincipal(subjPrincipal, p);
+ PRBool equal;
+ sameOrigin = subjPrincipal->Equals(p, &equal);
if (NS_SUCCEEDED(sameOrigin)) {
- // Same origin, permit load
+ if (equal) {
+ // Same origin, permit load
- return sameOrigin;
+ return sameOrigin;
+ }
+
+ sameOrigin = NS_ERROR_DOM_PROP_ACCESS_DENIED;
}
nsCOMPtr tmp;
diff --git a/dom/src/base/nsGlobalWindow.cpp b/dom/src/base/nsGlobalWindow.cpp
index 5a2b11f412a9..c08a99a1e95b 100644
--- a/dom/src/base/nsGlobalWindow.cpp
+++ b/dom/src/base/nsGlobalWindow.cpp
@@ -992,10 +992,10 @@ nsGlobalWindow::WouldReuseInnerWindow(nsIDocument *aNewDocument)
return PR_TRUE;
}
- if (nsContentUtils::GetSecurityManager() &&
- NS_SUCCEEDED(nsContentUtils::GetSecurityManager()->
- CheckSameOriginPrincipal(mDoc->NodePrincipal(),
- aNewDocument->NodePrincipal()))) {
+ PRBool equal;
+ if (NS_SUCCEEDED(mDoc->NodePrincipal()->Equals(aNewDocument->NodePrincipal(),
+ &equal)) &&
+ equal) {
// The origin is the same.
return PR_TRUE;
}
@@ -1329,10 +1329,10 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
// the existing inner window or the new document is from the same
// origin as the old document.
if (!reUseInnerWindow && mNavigator && oldPrincipal) {
- rv = nsContentUtils::GetSecurityManager()->
- CheckSameOriginPrincipal(oldPrincipal, aDocument->NodePrincipal());
+ PRBool equal;
+ rv = oldPrincipal->Equals(aDocument->NodePrincipal(), &equal);
- if (NS_FAILED(rv)) {
+ if (NS_FAILED(rv) || !equal) {
// Different origins. Release the navigator object so it gets
// recreated for the new document. The plugins or mime types
// arrays may have changed. See bug 150087.
@@ -6566,9 +6566,9 @@ nsGlobalWindow::SetTimeoutOrInterval(nsIScriptTimeoutHandler *aHandler,
timeout->mScriptHandler = aHandler;
// Get principal of currently executing code, save for execution of timeout.
- // If either our principals subsume the subject principal, or we're from the
- // same origin, then use the subject principal. Otherwise, use our principal
- // to avoid running script in elevated principals.
+ // If our principals subsume the subject principal then use the subject
+ // principal. Otherwise, use our principal to avoid running script in
+ // elevated principals.
nsCOMPtr subjectPrincipal;
nsresult rv;
@@ -6583,8 +6583,10 @@ nsGlobalWindow::SetTimeoutOrInterval(nsIScriptTimeoutHandler *aHandler,
PRBool subsumes = PR_FALSE;
nsCOMPtr ourPrincipal = GetPrincipal();
- // Note the direction of this test: We don't allow chrome setTimeouts on
- // content windows, but we do allow content setTimeouts on chrome windows.
+ // Note the direction of this test: We don't allow setTimeouts running with
+ // chrome privileges on content windows, but we do allow setTimeouts running
+ // with content privileges on chrome windows (where they can't do very much,
+ // of course).
rv = ourPrincipal->Subsumes(subjectPrincipal, &subsumes);
if (NS_FAILED(rv)) {
timeout->Release();
@@ -6595,13 +6597,7 @@ nsGlobalWindow::SetTimeoutOrInterval(nsIScriptTimeoutHandler *aHandler,
if (subsumes) {
timeout->mPrincipal = subjectPrincipal;
} else {
- // Subsumes does a very strict equality test. Allow sites of the same origin
- // to set timeouts on each other.
-
- rv = nsContentUtils::GetSecurityManager()->
- CheckSameOriginPrincipal(subjectPrincipal, ourPrincipal);
- timeout->mPrincipal = NS_SUCCEEDED(rv) ? subjectPrincipal : ourPrincipal;
- rv = NS_OK;
+ timeout->mPrincipal = ourPrincipal;
}
PRTime delta = (PRTime)realInterval * PR_USEC_PER_MSEC;