/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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/. */
/** * RemoteOuterWindowProxy is the proxy handler for the WindowProxy objects for * Window objects that live in a different process. * * RemoteOuterWindowProxy holds a BrowsingContext, which is cycle collected. * This reference is declared to the cycle collector via NoteChildren().
*/
class RemoteOuterWindowProxy
: public RemoteObjectProxy<BrowsingContext,
Window_Binding::sCrossOriginProperties> { public: using Base = RemoteObjectProxy;
// Give RemoteOuterWindowProxy 2 reserved slots, like the other wrappers, // so JSObject::swap can swap it with CrossCompartmentWrappers without requiring // malloc. template <> const JSClass RemoteOuterWindowProxy::Base::sClass =
PROXY_CLASS_DEF("Proxy", JSCLASS_HAS_RESERVED_SLOTS(2));
bool GetRemoteOuterWindowProxy(JSContext* aCx, BrowsingContext* aContext,
JS::Handle<JSObject*> aTransplantTo,
JS::MutableHandle<JSObject*> aRetVal) {
MOZ_ASSERT(!aContext->GetDocShell(), "Why are we creating a RemoteOuterWindowProxy?");
bool RemoteOuterWindowProxy::getOwnPropertyDescriptor(
JSContext* aCx, JS::Handle<JSObject*> aProxy, JS::Handle<jsid> aId,
JS::MutableHandle<Maybe<JS::PropertyDescriptor>> aDesc) const {
BrowsingContext* bc = GetBrowsingContext(aProxy);
uint32_t index = GetArrayIndexFromId(aId); if (IsArrayIndex(index)) {
Span<RefPtr<BrowsingContext>> children = bc->Children(); if (index < children.Length()) { return WrapResult(aCx, aProxy, children[index],
{JS::PropertyAttribute::Configurable,
JS::PropertyAttribute::Enumerable},
aDesc);
} return ReportCrossOriginDenial(aCx, aId, "access"_ns);
}
bool ok = CrossOriginGetOwnPropertyHelper(aCx, aProxy, aId, aDesc); if (!ok || aDesc.isSome()) { return ok;
}
// We don't need the "print" hack that nsOuterWindowProxy has, because pdf // documents are placed in a process based on their principal before the PDF // viewer changes principals around, so are always same-process with things // that are same-origin with their original principal and won't reach this // code in the cases when "print" should be accessible.
if (aId.isString()) {
nsAutoJSString str; if (!str.init(aCx, aId.toString())) { returnfalse;
}
for (BrowsingContext* child : bc->Children()) { if (child->NameEquals(str)) { return WrapResult(aCx, aProxy, child,
{JS::PropertyAttribute::Configurable}, aDesc);
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.