bool TabContext::UpdateTabContextAfterSwap(const TabContext& aContext) { // This is only used after already initialized. MOZ_ASSERT(mInitialized); // The only permissable change is to `mIsMozBrowserElement`. All other fields // must match for the change to be accepted. if (aContext.OwnAppId() != OwnAppId() || aContext.mContainingAppId != mContainingAppId || aContext.mOriginAttributes != mOriginAttributes || aContext.mSignedPkgOriginNoSuffix != mSignedPkgOriginNoSuffix) { return false; } mIsMozBrowserElement = aContext.mIsMozBrowserElement; return true; }
TabContext::TabContext(const IPCTabContext& aParams) : mInitialized(true) { const IPCTabAppBrowserContext& appBrowser = aParams.appBrowserContext(); switch(appBrowser.type()) { case IPCTabAppBrowserContext::TPopupIPCTabContext: { const PopupIPCTabContext &ipcContext = appBrowser.get_PopupIPCTabContext(); TabContext *context; if (ipcContext.openerParent()) { context = static_cast<TabParent*>(ipcContext.openerParent()); if (context->IsBrowserElement() && !ipcContext.isBrowserElement()) { // If the TabParent corresponds to a browser element, then it can only // open other browser elements, for security reasons. We should have // checked this before calling the TabContext constructor, so this is // a fatal error. MOZ_CRASH(); } } else if (ipcContext.openerChild()) { context = static_cast<TabChild*>(ipcContext.openerChild()); } else { // This should be unreachable because PopupIPCTabContext::opener is not a // nullable field. MOZ_CRASH(); } // If ipcContext is a browser element, then the opener's app-id becomes // our containing app-id. Otherwise, our own and containing app-ids are // directly inherited from our opener. if (ipcContext.isBrowserElement()) { mIsBrowser = true; mOwnAppId = nsIScriptSecurityManager::NO_APP_ID; mContainingAppId = context->OwnAppId(); } else { mIsBrowser = false; mOwnAppId = context->mOwnAppId; mContainingAppId = context->mContainingAppId; } break; } case IPCTabAppBrowserContext::TAppFrameIPCTabContext: { const AppFrameIPCTabContext &ipcContext = appBrowser.get_AppFrameIPCTabContext(); mIsBrowser = false; mOwnAppId = ipcContext.ownAppId(); mContainingAppId = ipcContext.appFrameOwnerAppId(); break; } case IPCTabAppBrowserContext::TBrowserFrameIPCTabContext: { const BrowserFrameIPCTabContext &ipcContext = appBrowser.get_BrowserFrameIPCTabContext(); mIsBrowser = true; mOwnAppId = nsIScriptSecurityManager::NO_APP_ID; mContainingAppId = ipcContext.browserFrameOwnerAppId(); break; } case IPCTabAppBrowserContext::TVanillaFrameIPCTabContext: { mIsBrowser = false; mOwnAppId = nsIScriptSecurityManager::NO_APP_ID; mContainingAppId = nsIScriptSecurityManager::NO_APP_ID; break; } default: { MOZ_CRASH(); } } mScrollingBehavior = aParams.scrollingBehavior(); }