Bug 1340333 - Eagerly compute whether a frame is really a browser.

Tag #1375
This commit is contained in:
Matt A. Tobin 2020-04-16 16:41:20 -04:00 • committed by Roy Tam
commit 69139427d5
2 changed files with 19 additions and 22 deletions

View file

@ -399,6 +399,17 @@ nsGenericHTMLFrameElement::MapScrollingAttribute(const nsAttrValue* aValue)
return mappedValue; return mappedValue;
} }
static bool
PrincipalAllowsBrowserFrame(nsIPrincipal* aPrincipal)
{
nsCOMPtr<nsIPermissionManager> permMgr = mozilla::services::GetPermissionManager();
NS_ENSURE_TRUE(permMgr, false);
uint32_t permission = nsIPermissionManager::DENY_ACTION;
nsresult rv = permMgr->TestPermissionFromPrincipal(aPrincipal, "browser", &permission);
NS_ENSURE_SUCCESS(rv, false);
return permission == nsIPermissionManager::ALLOW_ACTION;
}
/* virtual */ nsresult /* virtual */ nsresult
nsGenericHTMLFrameElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName, nsGenericHTMLFrameElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
const nsAttrValue* aValue, const nsAttrValue* aValue,
@ -428,6 +439,11 @@ nsGenericHTMLFrameElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
} }
} }
if (aName == nsGkAtoms::mozbrowser && aNameSpaceID == kNameSpaceID_None) {
mReallyIsBrowser = !!aValue && BrowserFramesEnabled() &&
PrincipalAllowsBrowserFrame(NodePrincipal());
}
return nsGenericHTMLElement::AfterSetAttr(aNameSpaceID, aName, aValue, return nsGenericHTMLElement::AfterSetAttr(aNameSpaceID, aName, aValue,
aNotify); aNotify);
} }
@ -503,28 +519,7 @@ nsGenericHTMLFrameElement::BrowserFramesEnabled()
/* [infallible] */ nsresult /* [infallible] */ nsresult
nsGenericHTMLFrameElement::GetReallyIsBrowserOrApp(bool *aOut) nsGenericHTMLFrameElement::GetReallyIsBrowserOrApp(bool *aOut)
{ {
*aOut = false; *aOut = mReallyIsBrowser;
// Fail if browser frames are globally disabled.
if (!nsGenericHTMLFrameElement::BrowserFramesEnabled()) {
return NS_OK;
}
// Fail if this frame doesn't have the mozbrowser attribute.
if (!GetBoolAttr(nsGkAtoms::mozbrowser)) {
return NS_OK;
}
// Fail if the node principal isn't trusted.
nsIPrincipal *principal = NodePrincipal();
nsCOMPtr<nsIPermissionManager> permMgr =
services::GetPermissionManager();
NS_ENSURE_TRUE(permMgr, NS_OK);
uint32_t permission = nsIPermissionManager::DENY_ACTION;
nsresult rv = permMgr->TestPermissionFromPrincipal(principal, "browser", &permission);
NS_ENSURE_SUCCESS(rv, NS_OK);
*aOut = permission == nsIPermissionManager::ALLOW_ACTION;
return NS_OK; return NS_OK;
} }

View file

@ -36,6 +36,7 @@ public:
, mIsPrerendered(false) , mIsPrerendered(false)
, mBrowserFrameListenersRegistered(false) , mBrowserFrameListenersRegistered(false)
, mFrameLoaderCreationDisallowed(false) , mFrameLoaderCreationDisallowed(false)
, mReallyIsBrowser(false)
{ {
} }
@ -122,6 +123,7 @@ protected:
bool mIsPrerendered; bool mIsPrerendered;
bool mBrowserFrameListenersRegistered; bool mBrowserFrameListenersRegistered;
bool mFrameLoaderCreationDisallowed; bool mFrameLoaderCreationDisallowed;
bool mReallyIsBrowser;
// This flag is only used by <iframe>. See HTMLIFrameElement:: // This flag is only used by <iframe>. See HTMLIFrameElement::
// FullscreenFlag() for details. It is placed here so that we // FullscreenFlag() for details. It is placed here so that we