123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- *
- * 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 "JavaScriptChild.h"
- #include "mozilla/dom/ContentChild.h"
- #include "mozilla/dom/BindingUtils.h"
- #include "mozilla/ipc/MessageChannel.h"
- #include "nsContentUtils.h"
- #include "xpcprivate.h"
- #include "jsfriendapi.h"
- #include "AccessCheck.h"
- using namespace JS;
- using namespace mozilla;
- using namespace mozilla::jsipc;
- using mozilla::AutoSafeJSContext;
- static void
- UpdateChildWeakPointersBeforeSweepingZoneGroup(JSContext* cx, void* data)
- {
- static_cast<JavaScriptChild*>(data)->updateWeakPointers();
- }
- static void
- TraceChild(JSTracer* trc, void* data)
- {
- static_cast<JavaScriptChild*>(data)->trace(trc);
- }
- JavaScriptChild::~JavaScriptChild()
- {
- JSContext* cx = dom::danger::GetJSContext();
- JS_RemoveWeakPointerZoneGroupCallback(cx, UpdateChildWeakPointersBeforeSweepingZoneGroup);
- JS_RemoveExtraGCRootsTracer(cx, TraceChild, this);
- }
- bool
- JavaScriptChild::init()
- {
- if (!WrapperOwner::init())
- return false;
- if (!WrapperAnswer::init())
- return false;
- JSContext* cx = dom::danger::GetJSContext();
- JS_AddWeakPointerZoneGroupCallback(cx, UpdateChildWeakPointersBeforeSweepingZoneGroup, this);
- JS_AddExtraGCRootsTracer(cx, TraceChild, this);
- return true;
- }
- void
- JavaScriptChild::trace(JSTracer* trc)
- {
- objects_.trace(trc, strongReferenceObjIdMinimum_);
- }
- void
- JavaScriptChild::updateWeakPointers()
- {
- objects_.sweep();
- unwaivedObjectIds_.sweep();
- waivedObjectIds_.sweep();
- }
- JSObject*
- JavaScriptChild::scopeForTargetObjects()
- {
- // CPOWs from the parent need to point into the child's privileged junk
- // scope so that they can benefit from XrayWrappers in the child.
- return xpc::PrivilegedJunkScope();
- }
- bool
- JavaScriptChild::RecvDropTemporaryStrongReferences(const uint64_t& upToObjId)
- {
- strongReferenceObjIdMinimum_ = upToObjId + 1;
- return true;
- }
- PJavaScriptChild*
- mozilla::jsipc::NewJavaScriptChild()
- {
- JavaScriptChild* child = new JavaScriptChild();
- if (!child->init()) {
- delete child;
- return nullptr;
- }
- return child;
- }
- void
- mozilla::jsipc::ReleaseJavaScriptChild(PJavaScriptChild* child)
- {
- static_cast<JavaScriptChild*>(child)->decref();
- }
|