2020-01-20 17:58:52 +03:00
|
|
|
/* -*- 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/. */
|
|
|
|
|
|
|
|
#include "mozilla/dom/WindowContext.h"
|
|
|
|
#include "mozilla/dom/WindowGlobalActorsBinding.h"
|
2020-05-04 17:53:34 +03:00
|
|
|
#include "mozilla/dom/WindowGlobalChild.h"
|
|
|
|
#include "mozilla/dom/WindowGlobalParent.h"
|
2020-01-20 17:58:52 +03:00
|
|
|
#include "mozilla/dom/SyncedContextInlines.h"
|
|
|
|
#include "mozilla/dom/BrowsingContext.h"
|
|
|
|
#include "mozilla/StaticPtr.h"
|
|
|
|
#include "mozilla/ClearOnShutdown.h"
|
2020-07-14 14:22:20 +03:00
|
|
|
#include "nsIScriptError.h"
|
2020-01-20 17:58:52 +03:00
|
|
|
#include "nsRefPtrHashtable.h"
|
2020-07-14 14:22:20 +03:00
|
|
|
#include "nsContentUtils.h"
|
2020-01-20 17:58:52 +03:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
|
|
|
|
// Explicit specialization of the `Transaction` type. Required by the `extern
|
|
|
|
// template class` declaration in the header.
|
|
|
|
template class syncedcontext::Transaction<WindowContext>;
|
|
|
|
|
|
|
|
static LazyLogModule gWindowContextLog("WindowContext");
|
|
|
|
|
|
|
|
using WindowContextByIdMap = nsDataHashtable<nsUint64HashKey, WindowContext*>;
|
|
|
|
static StaticAutoPtr<WindowContextByIdMap> gWindowContexts;
|
|
|
|
|
|
|
|
/* static */
|
|
|
|
LogModule* WindowContext::GetLog() { return gWindowContextLog; }
|
|
|
|
|
|
|
|
/* static */
|
|
|
|
already_AddRefed<WindowContext> WindowContext::GetById(
|
|
|
|
uint64_t aInnerWindowId) {
|
|
|
|
if (!gWindowContexts) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
return do_AddRef(gWindowContexts->Get(aInnerWindowId));
|
|
|
|
}
|
|
|
|
|
|
|
|
BrowsingContextGroup* WindowContext::Group() const {
|
|
|
|
return mBrowsingContext->Group();
|
|
|
|
}
|
|
|
|
|
2020-02-21 02:30:33 +03:00
|
|
|
WindowGlobalParent* WindowContext::Canonical() {
|
|
|
|
MOZ_RELEASE_ASSERT(XRE_IsParentProcess());
|
|
|
|
return static_cast<WindowGlobalParent*>(this);
|
|
|
|
}
|
|
|
|
|
2020-04-24 21:33:04 +03:00
|
|
|
bool WindowContext::IsCached() const {
|
|
|
|
return mBrowsingContext->mCurrentWindowContext != this;
|
|
|
|
}
|
|
|
|
|
2020-05-04 17:26:34 +03:00
|
|
|
WindowContext* WindowContext::GetParentWindowContext() {
|
|
|
|
return mBrowsingContext->GetParentWindowContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
WindowContext* WindowContext::TopWindowContext() {
|
|
|
|
WindowContext* current = this;
|
|
|
|
while (current->GetParentWindowContext()) {
|
|
|
|
current = current->GetParentWindowContext();
|
|
|
|
}
|
|
|
|
return current;
|
|
|
|
}
|
|
|
|
|
2020-01-20 17:58:52 +03:00
|
|
|
nsIGlobalObject* WindowContext::GetParentObject() const {
|
|
|
|
return xpc::NativeGlobal(xpc::PrivilegedJunkScope());
|
|
|
|
}
|
|
|
|
|
2020-04-24 21:33:04 +03:00
|
|
|
void WindowContext::AppendChildBrowsingContext(
|
|
|
|
BrowsingContext* aBrowsingContext) {
|
|
|
|
MOZ_DIAGNOSTIC_ASSERT(Group() == aBrowsingContext->Group(),
|
|
|
|
"Mismatched groups?");
|
|
|
|
MOZ_DIAGNOSTIC_ASSERT(!mChildren.Contains(aBrowsingContext));
|
|
|
|
|
|
|
|
mChildren.AppendElement(aBrowsingContext);
|
|
|
|
|
|
|
|
// If we're the current WindowContext in our BrowsingContext, make sure to
|
|
|
|
// clear any cached `children` value.
|
|
|
|
if (!IsCached()) {
|
|
|
|
BrowsingContext_Binding::ClearCachedChildrenValue(mBrowsingContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void WindowContext::RemoveChildBrowsingContext(
|
|
|
|
BrowsingContext* aBrowsingContext) {
|
|
|
|
MOZ_DIAGNOSTIC_ASSERT(Group() == aBrowsingContext->Group(),
|
|
|
|
"Mismatched groups?");
|
|
|
|
|
|
|
|
mChildren.RemoveElement(aBrowsingContext);
|
|
|
|
|
|
|
|
// If we're the current WindowContext in our BrowsingContext, make sure to
|
|
|
|
// clear any cached `children` value.
|
|
|
|
if (!IsCached()) {
|
|
|
|
BrowsingContext_Binding::ClearCachedChildrenValue(mBrowsingContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-20 17:58:52 +03:00
|
|
|
void WindowContext::SendCommitTransaction(ContentParent* aParent,
|
|
|
|
const BaseTransaction& aTxn,
|
|
|
|
uint64_t aEpoch) {
|
|
|
|
Unused << aParent->SendCommitWindowContextTransaction(this, aTxn, aEpoch);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WindowContext::SendCommitTransaction(ContentChild* aChild,
|
|
|
|
const BaseTransaction& aTxn,
|
|
|
|
uint64_t aEpoch) {
|
|
|
|
aChild->SendCommitWindowContextTransaction(this, aTxn, aEpoch);
|
|
|
|
}
|
|
|
|
|
2020-05-08 04:38:02 +03:00
|
|
|
bool WindowContext::CheckOnlyOwningProcessCanSet(ContentParent* aSource) {
|
|
|
|
if (mInProcess) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (XRE_IsParentProcess() && aSource) {
|
|
|
|
return Canonical()->GetContentParent() == aSource;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-06-16 12:05:54 +03:00
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_IsSecure>, const bool& aIsSecure,
|
2020-05-11 11:11:17 +03:00
|
|
|
ContentParent* aSource) {
|
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
|
|
|
|
2020-05-07 10:22:17 +03:00
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_AllowMixedContent>,
|
|
|
|
const bool& aAllowMixedContent,
|
|
|
|
ContentParent* aSource) {
|
2020-05-08 04:38:02 +03:00
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
|
|
|
|
2020-05-08 23:10:56 +03:00
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_CookieBehavior>,
|
|
|
|
const Maybe<uint32_t>& aValue,
|
|
|
|
ContentParent* aSource) {
|
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_IsOnContentBlockingAllowList>,
|
|
|
|
const bool& aValue, ContentParent* aSource) {
|
2020-05-08 04:38:02 +03:00
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
2020-05-07 10:22:17 +03:00
|
|
|
}
|
|
|
|
|
2020-04-23 17:24:56 +03:00
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_IsThirdPartyWindow>,
|
|
|
|
const bool& IsThirdPartyWindow,
|
|
|
|
ContentParent* aSource) {
|
2020-05-08 04:38:02 +03:00
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
2020-04-23 17:24:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_IsThirdPartyTrackingResourceWindow>,
|
|
|
|
const bool& aIsThirdPartyTrackingResourceWindow,
|
|
|
|
ContentParent* aSource) {
|
2020-05-08 04:38:02 +03:00
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
2020-04-23 17:24:56 +03:00
|
|
|
}
|
|
|
|
|
2020-05-14 00:52:39 +03:00
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_IsSecureContext>,
|
|
|
|
const bool& aIsSecureContext,
|
|
|
|
ContentParent* aSource) {
|
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
2020-05-16 01:20:45 +03:00
|
|
|
|
2020-05-16 00:18:07 +03:00
|
|
|
bool WindowContext::CanSet(FieldIndex<IDX_AutoplayPermission>,
|
|
|
|
const uint32_t& aValue, ContentParent* aSource) {
|
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
2020-05-14 00:52:39 +03:00
|
|
|
|
2020-06-12 19:31:49 +03:00
|
|
|
bool WindowContext::CanSet(
|
|
|
|
FieldIndex<IDX_DelegatedPermissions>,
|
|
|
|
const PermissionDelegateHandler::DelegatedPermissionList& aValue,
|
|
|
|
ContentParent* aSource) {
|
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool WindowContext::CanSet(
|
|
|
|
FieldIndex<IDX_DelegatedExactHostMatchPermissions>,
|
|
|
|
const PermissionDelegateHandler::DelegatedPermissionList& aValue,
|
|
|
|
ContentParent* aSource) {
|
|
|
|
return CheckOnlyOwningProcessCanSet(aSource);
|
|
|
|
}
|
|
|
|
|
2020-07-14 14:22:20 +03:00
|
|
|
void WindowContext::DidSet(FieldIndex<IDX_HasReportedShadowDOMUsage>,
|
|
|
|
bool aOldValue) {
|
|
|
|
if (!aOldValue && GetHasReportedShadowDOMUsage() && IsInProcess()) {
|
|
|
|
MOZ_ASSERT(TopWindowContext() == this);
|
|
|
|
if (mBrowsingContext) {
|
|
|
|
Document* topLevelDoc = mBrowsingContext->GetDocument();
|
|
|
|
if (topLevelDoc) {
|
|
|
|
nsAutoString uri;
|
|
|
|
Unused << topLevelDoc->GetDocumentURI(uri);
|
|
|
|
if (!uri.IsEmpty()) {
|
|
|
|
nsAutoString msg = u"Shadow DOM used in ["_ns + uri +
|
|
|
|
u"] or in some of its subdocuments."_ns;
|
|
|
|
nsContentUtils::ReportToConsoleNonLocalized(
|
|
|
|
msg, nsIScriptError::infoFlag, "DOM"_ns, topLevelDoc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-20 17:58:52 +03:00
|
|
|
void WindowContext::CreateFromIPC(IPCInitializer&& aInit) {
|
|
|
|
MOZ_RELEASE_ASSERT(XRE_IsContentProcess(),
|
|
|
|
"Should be a WindowGlobalParent in the parent");
|
|
|
|
|
|
|
|
RefPtr<BrowsingContext> bc = BrowsingContext::Get(aInit.mBrowsingContextId);
|
|
|
|
MOZ_RELEASE_ASSERT(bc);
|
|
|
|
|
|
|
|
if (bc->IsDiscarded()) {
|
|
|
|
// If we have already closed our browsing context, the
|
|
|
|
// WindowGlobalChild actor is bound to be destroyed soon and it's
|
|
|
|
// safe to ignore creating the WindowContext.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RefPtr<WindowContext> context =
|
2020-05-08 23:44:12 +03:00
|
|
|
new WindowContext(bc, aInit.mInnerWindowId, aInit.mOuterWindowId,
|
|
|
|
/* aInProcess */ false, std::move(aInit.mFields));
|
2020-01-20 17:58:52 +03:00
|
|
|
context->Init();
|
|
|
|
}
|
|
|
|
|
|
|
|
void WindowContext::Init() {
|
|
|
|
MOZ_LOG(GetLog(), LogLevel::Debug,
|
|
|
|
("Registering 0x%" PRIx64 " (bc=0x%" PRIx64 ")", mInnerWindowId,
|
|
|
|
mBrowsingContext->Id()));
|
|
|
|
|
|
|
|
// Register the WindowContext in the `WindowContextByIdMap`.
|
|
|
|
if (!gWindowContexts) {
|
|
|
|
gWindowContexts = new WindowContextByIdMap();
|
|
|
|
ClearOnShutdown(&gWindowContexts);
|
|
|
|
}
|
|
|
|
auto& entry = gWindowContexts->GetOrInsert(mInnerWindowId);
|
|
|
|
MOZ_RELEASE_ASSERT(!entry, "Duplicate WindowContext for ID!");
|
|
|
|
entry = this;
|
|
|
|
|
|
|
|
// Register this to the browsing context.
|
|
|
|
mBrowsingContext->RegisterWindowContext(this);
|
2020-04-29 21:49:10 +03:00
|
|
|
Group()->Register(this);
|
2020-01-20 17:58:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void WindowContext::Discard() {
|
|
|
|
MOZ_LOG(GetLog(), LogLevel::Debug,
|
|
|
|
("Discarding 0x%" PRIx64 " (bc=0x%" PRIx64 ")", mInnerWindowId,
|
|
|
|
mBrowsingContext->Id()));
|
|
|
|
if (mIsDiscarded) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-04-24 05:31:55 +03:00
|
|
|
mIsDiscarded = true;
|
2020-04-24 21:33:04 +03:00
|
|
|
gWindowContexts->Remove(InnerWindowId());
|
|
|
|
mBrowsingContext->UnregisterWindowContext(this);
|
2020-04-29 21:49:10 +03:00
|
|
|
Group()->Unregister(this);
|
2020-01-20 17:58:52 +03:00
|
|
|
}
|
|
|
|
|
2020-05-27 03:28:59 +03:00
|
|
|
void WindowContext::AddMixedContentSecurityState(uint32_t aStateFlags) {
|
|
|
|
MOZ_ASSERT(TopWindowContext() == this);
|
|
|
|
MOZ_ASSERT((aStateFlags &
|
|
|
|
(nsIWebProgressListener::STATE_LOADED_MIXED_DISPLAY_CONTENT |
|
|
|
|
nsIWebProgressListener::STATE_LOADED_MIXED_ACTIVE_CONTENT |
|
|
|
|
nsIWebProgressListener::STATE_BLOCKED_MIXED_DISPLAY_CONTENT |
|
|
|
|
nsIWebProgressListener::STATE_BLOCKED_MIXED_ACTIVE_CONTENT)) ==
|
|
|
|
aStateFlags,
|
|
|
|
"Invalid flags specified!");
|
|
|
|
|
|
|
|
if (XRE_IsParentProcess()) {
|
|
|
|
Canonical()->AddMixedContentSecurityState(aStateFlags);
|
|
|
|
} else {
|
|
|
|
ContentChild* child = ContentChild::GetSingleton();
|
|
|
|
child->SendAddMixedContentSecurityState(this, aStateFlags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-08 23:44:12 +03:00
|
|
|
WindowContext::IPCInitializer WindowContext::GetIPCInitializer() {
|
|
|
|
IPCInitializer init;
|
|
|
|
init.mInnerWindowId = mInnerWindowId;
|
|
|
|
init.mOuterWindowId = mOuterWindowId;
|
|
|
|
init.mBrowsingContextId = mBrowsingContext->Id();
|
|
|
|
init.mFields = mFields.Fields();
|
|
|
|
return init;
|
|
|
|
}
|
|
|
|
|
2020-01-20 17:58:52 +03:00
|
|
|
WindowContext::WindowContext(BrowsingContext* aBrowsingContext,
|
2020-05-08 23:44:12 +03:00
|
|
|
uint64_t aInnerWindowId, uint64_t aOuterWindowId,
|
|
|
|
bool aInProcess, FieldTuple&& aFields)
|
2020-01-20 17:58:52 +03:00
|
|
|
: mFields(std::move(aFields)),
|
|
|
|
mInnerWindowId(aInnerWindowId),
|
2020-05-08 23:44:12 +03:00
|
|
|
mOuterWindowId(aOuterWindowId),
|
2020-05-08 04:38:02 +03:00
|
|
|
mBrowsingContext(aBrowsingContext),
|
|
|
|
mInProcess(aInProcess) {
|
2020-01-20 17:58:52 +03:00
|
|
|
MOZ_ASSERT(mBrowsingContext);
|
|
|
|
MOZ_ASSERT(mInnerWindowId);
|
2020-05-08 23:44:12 +03:00
|
|
|
MOZ_ASSERT(mOuterWindowId);
|
2020-01-20 17:58:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
WindowContext::~WindowContext() {
|
|
|
|
if (gWindowContexts) {
|
|
|
|
gWindowContexts->Remove(InnerWindowId());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
JSObject* WindowContext::WrapObject(JSContext* cx,
|
|
|
|
JS::Handle<JSObject*> aGivenProto) {
|
|
|
|
return WindowContext_Binding::Wrap(cx, this, aGivenProto);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WindowContext)
|
|
|
|
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
|
|
|
NS_INTERFACE_MAP_END
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(WindowContext)
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(WindowContext)
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_CLASS(WindowContext)
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WindowContext)
|
|
|
|
if (gWindowContexts) {
|
|
|
|
gWindowContexts->Remove(tmp->InnerWindowId());
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mBrowsingContext)
|
2020-04-24 21:33:04 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mChildren)
|
2020-01-20 17:58:52 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WindowContext)
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBrowsingContext)
|
2020-04-24 21:33:04 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChildren)
|
2020-01-20 17:58:52 +03:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(WindowContext)
|
|
|
|
|
|
|
|
} // namespace dom
|
|
|
|
|
|
|
|
namespace ipc {
|
|
|
|
|
2020-02-21 02:30:33 +03:00
|
|
|
void IPDLParamTraits<dom::MaybeDiscarded<dom::WindowContext>>::Write(
|
|
|
|
IPC::Message* aMsg, IProtocol* aActor,
|
|
|
|
const dom::MaybeDiscarded<dom::WindowContext>& aParam) {
|
|
|
|
uint64_t id = aParam.ContextId();
|
|
|
|
WriteIPDLParam(aMsg, aActor, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IPDLParamTraits<dom::MaybeDiscarded<dom::WindowContext>>::Read(
|
|
|
|
const IPC::Message* aMsg, PickleIterator* aIter, IProtocol* aActor,
|
|
|
|
dom::MaybeDiscarded<dom::WindowContext>* aResult) {
|
|
|
|
uint64_t id = 0;
|
|
|
|
if (!ReadIPDLParam(aMsg, aIter, aActor, &id)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (id == 0) {
|
|
|
|
*aResult = nullptr;
|
|
|
|
} else if (RefPtr<dom::WindowContext> wc = dom::WindowContext::GetById(id)) {
|
|
|
|
*aResult = std::move(wc);
|
|
|
|
} else {
|
|
|
|
aResult->SetDiscarded(id);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-01-20 17:58:52 +03:00
|
|
|
void IPDLParamTraits<dom::WindowContext::IPCInitializer>::Write(
|
|
|
|
IPC::Message* aMessage, IProtocol* aActor,
|
|
|
|
const dom::WindowContext::IPCInitializer& aInit) {
|
|
|
|
// Write actor ID parameters.
|
|
|
|
WriteIPDLParam(aMessage, aActor, aInit.mInnerWindowId);
|
2020-05-08 23:44:12 +03:00
|
|
|
WriteIPDLParam(aMessage, aActor, aInit.mOuterWindowId);
|
2020-01-20 17:58:52 +03:00
|
|
|
WriteIPDLParam(aMessage, aActor, aInit.mBrowsingContextId);
|
|
|
|
WriteIPDLParam(aMessage, aActor, aInit.mFields);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IPDLParamTraits<dom::WindowContext::IPCInitializer>::Read(
|
|
|
|
const IPC::Message* aMessage, PickleIterator* aIterator, IProtocol* aActor,
|
|
|
|
dom::WindowContext::IPCInitializer* aInit) {
|
|
|
|
// Read actor ID parameters.
|
|
|
|
return ReadIPDLParam(aMessage, aIterator, aActor, &aInit->mInnerWindowId) &&
|
2020-05-08 23:44:12 +03:00
|
|
|
ReadIPDLParam(aMessage, aIterator, aActor, &aInit->mOuterWindowId) &&
|
2020-01-20 17:58:52 +03:00
|
|
|
ReadIPDLParam(aMessage, aIterator, aActor,
|
|
|
|
&aInit->mBrowsingContextId) &&
|
|
|
|
ReadIPDLParam(aMessage, aIterator, aActor, &aInit->mFields);
|
|
|
|
}
|
|
|
|
|
|
|
|
template struct IPDLParamTraits<dom::WindowContext::BaseTransaction>;
|
|
|
|
|
|
|
|
} // namespace ipc
|
|
|
|
} // namespace mozilla
|