123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include "mozilla/Assertions.h"
- #include "mozilla/BasePrincipal.h"
- #include "mozilla/LoadContext.h"
- #include "mozilla/Preferences.h"
- #include "mozilla/dom/ScriptSettings.h" // for AutoJSAPI
- #include "nsContentUtils.h"
- #include "xpcpublic.h"
- bool
- nsILoadContext::GetOriginAttributes(mozilla::DocShellOriginAttributes& aAttrs)
- {
- mozilla::dom::AutoJSAPI jsapi;
- bool ok = jsapi.Init(xpc::PrivilegedJunkScope());
- NS_ENSURE_TRUE(ok, false);
- JS::Rooted<JS::Value> v(jsapi.cx());
- nsresult rv = GetOriginAttributes(&v);
- NS_ENSURE_SUCCESS(rv, false);
- NS_ENSURE_TRUE(v.isObject(), false);
- JS::Rooted<JSObject*> obj(jsapi.cx(), &v.toObject());
- // If we're JS-implemented, the object will be left in a different (System-Principaled)
- // scope, so we may need to enter its compartment.
- MOZ_ASSERT(nsContentUtils::IsSystemPrincipal(nsContentUtils::ObjectPrincipal(obj)));
- JSAutoCompartment ac(jsapi.cx(), obj);
- mozilla::DocShellOriginAttributes attrs;
- ok = attrs.Init(jsapi.cx(), v);
- NS_ENSURE_TRUE(ok, false);
- aAttrs = attrs;
- return true;
- }
- namespace mozilla {
- NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor)
- LoadContext::LoadContext(nsIPrincipal* aPrincipal,
- nsILoadContext* aOptionalBase)
- : mTopFrameElement(nullptr)
- , mNestedFrameId(0)
- , mIsContent(true)
- , mUseRemoteTabs(false)
- #ifdef DEBUG
- , mIsNotNull(true)
- #endif
- {
- PrincipalOriginAttributes poa = BasePrincipal::Cast(aPrincipal)->OriginAttributesRef();
- mOriginAttributes.InheritFromDocToChildDocShell(poa);
- if (!aOptionalBase) {
- return;
- }
- MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetIsContent(&mIsContent));
- MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetUseRemoteTabs(&mUseRemoteTabs));
- }
- //-----------------------------------------------------------------------------
- // LoadContext::nsILoadContext
- //-----------------------------------------------------------------------------
- NS_IMETHODIMP
- LoadContext::GetAssociatedWindow(mozIDOMWindowProxy**)
- {
- MOZ_ASSERT(mIsNotNull);
- // can't support this in the parent process
- return NS_ERROR_UNEXPECTED;
- }
- NS_IMETHODIMP
- LoadContext::GetTopWindow(mozIDOMWindowProxy**)
- {
- MOZ_ASSERT(mIsNotNull);
- // can't support this in the parent process
- return NS_ERROR_UNEXPECTED;
- }
- NS_IMETHODIMP
- LoadContext::GetTopFrameElement(nsIDOMElement** aElement)
- {
- nsCOMPtr<nsIDOMElement> element = do_QueryReferent(mTopFrameElement);
- element.forget(aElement);
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::GetNestedFrameId(uint64_t* aId)
- {
- NS_ENSURE_ARG(aId);
- *aId = mNestedFrameId;
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::GetIsContent(bool* aIsContent)
- {
- MOZ_ASSERT(mIsNotNull);
- NS_ENSURE_ARG_POINTER(aIsContent);
- *aIsContent = mIsContent;
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::GetUsePrivateBrowsing(bool* aUsePrivateBrowsing)
- {
- MOZ_ASSERT(mIsNotNull);
- NS_ENSURE_ARG_POINTER(aUsePrivateBrowsing);
- *aUsePrivateBrowsing = mOriginAttributes.mPrivateBrowsingId > 0;
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::SetUsePrivateBrowsing(bool aUsePrivateBrowsing)
- {
- MOZ_ASSERT(mIsNotNull);
- // We shouldn't need this on parent...
- return NS_ERROR_UNEXPECTED;
- }
- NS_IMETHODIMP
- LoadContext::SetPrivateBrowsing(bool aUsePrivateBrowsing)
- {
- MOZ_ASSERT(mIsNotNull);
- // We shouldn't need this on parent...
- return NS_ERROR_UNEXPECTED;
- }
- NS_IMETHODIMP
- LoadContext::GetUseRemoteTabs(bool* aUseRemoteTabs)
- {
- MOZ_ASSERT(mIsNotNull);
- NS_ENSURE_ARG_POINTER(aUseRemoteTabs);
- *aUseRemoteTabs = mUseRemoteTabs;
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::SetRemoteTabs(bool aUseRemoteTabs)
- {
- MOZ_ASSERT(mIsNotNull);
- // We shouldn't need this on parent...
- return NS_ERROR_UNEXPECTED;
- }
- NS_IMETHODIMP
- LoadContext::GetIsInIsolatedMozBrowserElement(bool* aIsInIsolatedMozBrowserElement)
- {
- MOZ_ASSERT(mIsNotNull);
- NS_ENSURE_ARG_POINTER(aIsInIsolatedMozBrowserElement);
- *aIsInIsolatedMozBrowserElement = mOriginAttributes.mInIsolatedMozBrowser;
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::GetAppId(uint32_t* aAppId)
- {
- MOZ_ASSERT(mIsNotNull);
- NS_ENSURE_ARG_POINTER(aAppId);
- *aAppId = mOriginAttributes.mAppId;
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::GetOriginAttributes(JS::MutableHandleValue aAttrs)
- {
- JSContext* cx = nsContentUtils::GetCurrentJSContext();
- MOZ_ASSERT(cx);
- bool ok = ToJSValue(cx, mOriginAttributes, aAttrs);
- NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
- return NS_OK;
- }
- NS_IMETHODIMP
- LoadContext::IsTrackingProtectionOn(bool* aIsTrackingProtectionOn)
- {
- MOZ_ASSERT(mIsNotNull);
- if (Preferences::GetBool("privacy.trackingprotection.enabled", false)) {
- *aIsTrackingProtectionOn = true;
- } else if ((mOriginAttributes.mPrivateBrowsingId > 0) &&
- Preferences::GetBool("privacy.trackingprotection.pbmode.enabled", false)) {
- *aIsTrackingProtectionOn = true;
- } else {
- *aIsTrackingProtectionOn = false;
- }
- return NS_OK;
- }
- //-----------------------------------------------------------------------------
- // LoadContext::nsIInterfaceRequestor
- //-----------------------------------------------------------------------------
- NS_IMETHODIMP
- LoadContext::GetInterface(const nsIID& aIID, void** aResult)
- {
- NS_ENSURE_ARG_POINTER(aResult);
- *aResult = nullptr;
- if (aIID.Equals(NS_GET_IID(nsILoadContext))) {
- *aResult = static_cast<nsILoadContext*>(this);
- NS_ADDREF_THIS();
- return NS_OK;
- }
- return NS_NOINTERFACE;
- }
- } // namespace mozilla
|