From 6cde63d4714097c933bd2e6fc23068cb5e001673 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 17 Feb 2016 21:53:32 -0600 Subject: [PATCH] Bug 1238160 - Set docshell isolation mode. r=smaug Renames nsDocShell isBrowser* attributes to add a "Moz" prefix for clarity. Adds nsDocShell::GetIsIsolatedMozBrowserElement, which parallels GetIsInIsolatedMozBrowserElement, but only checks the immediate docshell. Adds nsDocShell::SetIsInIsolatedMozBrowserElement for the frame loader and tab child to set the isolation state. nsDocShell methods related to mozbrowser elements (and their callers) are updated to use GetIs(In)?IsolatedMozBrowserElement when checking isolation / origins and GetIsMozBrowserElement when checking frame types. MozReview-Commit-ID: 6pGD5fF47ZN --- devtools/shared/layout/utils.js | 4 +- docshell/base/nsDSURIContentListener.cpp | 2 +- docshell/base/nsDocShell.cpp | 56 +++++++++++-------- docshell/base/nsDocShell.h | 3 + docshell/base/nsIDocShell.idl | 32 ++++++----- dom/base/nsFrameLoader.cpp | 5 +- dom/base/nsGlobalWindow.cpp | 12 ++-- dom/browser-element/BrowserElementChild.js | 2 +- .../BrowserElementCopyPaste.js | 2 +- dom/ipc/TabChild.cpp | 5 +- .../windowwatcher/nsWindowWatcher.cpp | 2 +- xpfe/appshell/nsContentTreeOwner.cpp | 2 +- 12 files changed, 76 insertions(+), 51 deletions(-) diff --git a/devtools/shared/layout/utils.js b/devtools/shared/layout/utils.js index 1d018abab77..71fd63a5434 100644 --- a/devtools/shared/layout/utils.js +++ b/devtools/shared/layout/utils.js @@ -34,7 +34,7 @@ function getTopWindow(win) { .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIDocShell); - if (!docShell.isBrowserOrApp) { + if (!docShell.isMozBrowserOrApp) { return win.top; } @@ -94,7 +94,7 @@ function getParentWindow(win) { .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIDocShell); - if (!docShell.isBrowserOrApp) { + if (!docShell.isMozBrowserOrApp) { return win.parent; } diff --git a/docshell/base/nsDSURIContentListener.cpp b/docshell/base/nsDSURIContentListener.cpp index 72bbdfe1d99..01df6ae4248 100644 --- a/docshell/base/nsDSURIContentListener.cpp +++ b/docshell/base/nsDSURIContentListener.cpp @@ -332,7 +332,7 @@ nsDSURIContentListener::CheckOneFrameOptionsPolicy(nsIHttpChannel* aHttpChannel, curDocShellItem->GetParent(getter_AddRefs(parentDocShellItem))) && parentDocShellItem) { nsCOMPtr curDocShell = do_QueryInterface(curDocShellItem); - if (curDocShell && curDocShell->GetIsBrowserOrApp()) { + if (curDocShell && curDocShell->GetIsMozBrowserOrApp()) { break; } diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 33674234588..3cd771cb8e0 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -805,6 +805,7 @@ nsDocShell::nsDocShell() , mDefaultLoadFlags(nsIRequest::LOAD_NORMAL) , mBlankTiming(false) , mFrameType(eFrameTypeRegular) + , mIsInIsolatedMozBrowser(false) , mOwnOrContainingAppId(nsIScriptSecurityManager::UNKNOWN_APP_ID) , mUserContextId(nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID) , mParentCharsetSource(0) @@ -2556,7 +2557,7 @@ nsDocShell::GetFullscreenAllowed(bool* aFullscreenAllowed) NS_IMETHODIMP nsDocShell::SetFullscreenAllowed(bool aFullscreenAllowed) { - if (!nsIDocShell::GetIsBrowserOrApp()) { + if (!nsIDocShell::GetIsMozBrowserOrApp()) { // Only allow setting of fullscreenAllowed on content/process boundaries. // At non-boundaries the fullscreenAllowed attribute is calculated based on // whether all enclosing frames have the "mozFullscreenAllowed" attribute @@ -3364,7 +3365,7 @@ nsDocShell::GetSameTypeParent(nsIDocShellTreeItem** aParent) NS_ENSURE_ARG_POINTER(aParent); *aParent = nullptr; - if (nsIDocShell::GetIsBrowserOrApp()) { + if (nsIDocShell::GetIsMozBrowserOrApp()) { return NS_OK; } @@ -4016,6 +4017,7 @@ nsDocShell::AddChild(nsIDocShellTreeItem* aChild) aChild->SetTreeOwner(mTreeOwner); childDocShell->SetUserContextId(mUserContextId); + childDocShell->SetIsInIsolatedMozBrowserElement(mIsInIsolatedMozBrowser); nsCOMPtr childAsDocShell(do_QueryInterface(aChild)); if (!childAsDocShell) { @@ -6129,7 +6131,7 @@ nsDocShell::SetIsActiveInternal(bool aIsActive, bool aIsHidden) continue; } - if (!docshell->GetIsBrowserOrApp()) { + if (!docshell->GetIsMozBrowserOrApp()) { if (aIsHidden) { docshell->SetIsActive(aIsActive); } else { @@ -13890,13 +13892,6 @@ nsDocShell::SetUserContextId(uint32_t aUserContextId) return NS_OK; } -/* [infallible] */ NS_IMETHODIMP -nsDocShell::GetIsBrowserElement(bool* aIsBrowser) -{ - *aIsBrowser = (mFrameType == eFrameTypeBrowser); - return NS_OK; -} - /* [infallible] */ NS_IMETHODIMP nsDocShell::GetIsApp(bool* aIsApp) { @@ -13905,15 +13900,15 @@ nsDocShell::GetIsApp(bool* aIsApp) } /* [infallible] */ NS_IMETHODIMP -nsDocShell::GetIsBrowserOrApp(bool* aIsBrowserOrApp) +nsDocShell::GetIsMozBrowserOrApp(bool* aIsMozBrowserOrApp) { switch (mFrameType) { case eFrameTypeRegular: - *aIsBrowserOrApp = false; + *aIsMozBrowserOrApp = false; break; case eFrameTypeBrowser: case eFrameTypeApp: - *aIsBrowserOrApp = true; + *aIsMozBrowserOrApp = true; break; } @@ -13939,22 +13934,42 @@ nsDocShell::GetInheritedFrameType() } /* [infallible] */ NS_IMETHODIMP -nsDocShell::GetIsInIsolatedMozBrowserElement(bool* aIsInIsolatedMozBrowserElement) +nsDocShell::GetIsIsolatedMozBrowserElement(bool* aIsIsolatedMozBrowserElement) { - *aIsInIsolatedMozBrowserElement = (GetInheritedFrameType() == eFrameTypeBrowser); + bool result = mFrameType == eFrameTypeBrowser && mIsInIsolatedMozBrowser; + *aIsIsolatedMozBrowserElement = result; return NS_OK; } /* [infallible] */ NS_IMETHODIMP -nsDocShell::GetIsInBrowserOrApp(bool* aIsInBrowserOrApp) +nsDocShell::GetIsInIsolatedMozBrowserElement(bool* aIsInIsolatedMozBrowserElement) +{ + MOZ_ASSERT(!mIsInIsolatedMozBrowser || + (GetInheritedFrameType() == eFrameTypeBrowser), + "Isolated mozbrowser should only be true inside browser frames"); + bool result = (GetInheritedFrameType() == eFrameTypeBrowser) && + mIsInIsolatedMozBrowser; + *aIsInIsolatedMozBrowserElement = result; + return NS_OK; +} + +/* [infallible] */ NS_IMETHODIMP +nsDocShell::SetIsInIsolatedMozBrowserElement(bool aIsInIsolatedMozBrowserElement) +{ + mIsInIsolatedMozBrowser = aIsInIsolatedMozBrowserElement; + return NS_OK; +} + +/* [infallible] */ NS_IMETHODIMP +nsDocShell::GetIsInMozBrowserOrApp(bool* aIsInMozBrowserOrApp) { switch (GetInheritedFrameType()) { case eFrameTypeRegular: - *aIsInBrowserOrApp = false; + *aIsInMozBrowserOrApp = false; break; case eFrameTypeBrowser: case eFrameTypeApp: - *aIsInBrowserOrApp = true; + *aIsInMozBrowserOrApp = true; break; } @@ -14000,10 +14015,7 @@ nsDocShell::GetOriginAttributes() } attrs.mUserContextId = mUserContextId; - - if (mFrameType == eFrameTypeBrowser) { - attrs.mInIsolatedMozBrowser = true; - } + attrs.mInIsolatedMozBrowser = mIsInIsolatedMozBrowser; return attrs; } diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index 730cf7c6315..07402c4a487 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -1000,6 +1000,9 @@ protected: // Are we a regular frame, a browser frame, or an app frame? FrameType mFrameType; + // Whether we are in an isolated mozbrowser frame. + bool mIsInIsolatedMozBrowser; + // We only expect mOwnOrContainingAppId to be something other than // UNKNOWN_APP_ID if mFrameType != eFrameTypeRegular. For vanilla iframes // inside an app, we'll retrieve the containing app-id by walking up the diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl index ba07aa46c83..718fdf46c46 100644 --- a/docshell/base/nsIDocShell.idl +++ b/docshell/base/nsIDocShell.idl @@ -763,21 +763,27 @@ interface nsIDocShell : nsIDocShellTreeItem */ [noscript] void notifyScrollObservers(); - /** - * Returns true if this docshell corresponds to an