ObjectId WrapperOwner::idOfUnchecked(JSObject *obj) { MOZ_ASSERT(IsCPOW(obj)); Value v = GetProxyExtra(obj, 1); MOZ_ASSERT(v.isDouble()); ObjectId objId = ObjectId::deserialize(BitwiseCast<uint64_t>(v.toDouble())); MOZ_ASSERT(!objId.isNull()); return objId; }
void QtIVIWidget::contextMenu(QPoint pos) { QModelIndex index = m_objectTreeView->indexAt(pos); if (!index.isValid()) return; index = index.sibling(index.row(), 0); const ObjectId objectId = index.data(ObjectModel::ObjectIdRole).value<ObjectId>(); if (objectId.isNull()) return; QMenu menu; ContextMenuExtension ext(objectId); ext.populateMenu(&menu); menu.exec(m_objectTreeView->viewport()->mapToGlobal(pos)); }
bool WrapperOwner::toObjectVariant(JSContext* cx, JSObject* objArg, ObjectVariant* objVarp) { RootedObject obj(cx, objArg); MOZ_ASSERT(obj); // We always save objects unwrapped in the CPOW table. If we stored // wrappers, then the wrapper might be GCed while the target remained alive. // Whenever operating on an object that comes from the table, we wrap it // in findObjectById. unsigned wrapperFlags = 0; obj = js::UncheckedUnwrap(obj, true, &wrapperFlags); if (obj && IsCPOW(obj) && OwnerOf(obj) == this) { *objVarp = LocalObject(idOf(obj).serialize()); return true; } bool waiveXray = wrapperFlags & xpc::WrapperFactory::WAIVE_XRAY_WRAPPER_FLAG; ObjectId id = objectIdMap(waiveXray).find(obj); if (!id.isNull()) { MOZ_ASSERT(id.hasXrayWaiver() == waiveXray); *objVarp = MakeRemoteObject(cx, id, obj); return true; } // Need to call PreserveWrapper on |obj| in case it's a reflector. // FIXME: What if it's an XPCWrappedNative? if (mozilla::dom::IsDOMObject(obj)) mozilla::dom::TryPreserveWrapper(obj); id = ObjectId(nextSerialNumber_++, waiveXray); if (!objects_.add(id, obj)) return false; if (!objectIdMap(waiveXray).add(cx, obj, id)) return false; *objVarp = MakeRemoteObject(cx, id, obj); return true; }