diff -r 000000000000 -r 6474c204b198 dom/nfc/MozNDEFRecord.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/nfc/MozNDEFRecord.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,129 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* 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/. */ + +/* Copyright © 2013 Deutsche Telekom, Inc. */ + +#include "MozNDEFRecord.h" +#include "mozilla/dom/MozNDEFRecordBinding.h" +#include "mozilla/HoldDropJSObjects.h" +#include "nsContentUtils.h" + + +namespace mozilla { +namespace dom { + + +NS_IMPL_CYCLE_COLLECTION_CLASS(MozNDEFRecord) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MozNDEFRecord) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow) + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER + tmp->DropData(); +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MozNDEFRecord) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(MozNDEFRecord) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mType) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mId) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mPayload) + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_TRACE_END + +NS_IMPL_CYCLE_COLLECTING_ADDREF(MozNDEFRecord) +NS_IMPL_CYCLE_COLLECTING_RELEASE(MozNDEFRecord) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MozNDEFRecord) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +void +MozNDEFRecord::HoldData() +{ + mozilla::HoldJSObjects(this); +} + +void +MozNDEFRecord::DropData() +{ + if (mType) { + mType = nullptr; + } + if (mId) { + mId = nullptr; + } + if (mPayload) { + mPayload = nullptr; + } + mozilla::DropJSObjects(this); +} + +/* static */ +already_AddRefed +MozNDEFRecord::Constructor(const GlobalObject& aGlobal, + uint8_t aTnf, + const Optional& aType, + const Optional& aId, + const Optional& aPayload, + ErrorResult& aRv) +{ + nsCOMPtr win = do_QueryInterface(aGlobal.GetAsSupports()); + if (!win) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + + nsRefPtr ndefrecord = new MozNDEFRecord(aGlobal.GetContext(), + win, aTnf, aType, aId, + aPayload); + if (!ndefrecord) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + return ndefrecord.forget(); +} + +MozNDEFRecord::MozNDEFRecord(JSContext* aCx, nsPIDOMWindow* aWindow, + uint8_t aTnf, + const Optional& aType, + const Optional& aId, + const Optional& aPayload) + : mTnf(aTnf) +{ + mWindow = aWindow; // For GetParentObject() + + if (aType.WasPassed()) { + mType = Uint8Array::Create(aCx, this, aType.Value().Length(), aType.Value().Data()); + } + + if (aId.WasPassed()) { + mId = Uint8Array::Create(aCx, this, aId.Value().Length(), aId.Value().Data()); + } + + if (aPayload.WasPassed()) { + mPayload = Uint8Array::Create(aCx, this, aPayload.Value().Length(), aPayload.Value().Data()); + } + + SetIsDOMBinding(); + HoldData(); +} + +MozNDEFRecord::~MozNDEFRecord() +{ + DropData(); +} + +JSObject* +MozNDEFRecord::WrapObject(JSContext* aCx) +{ + return MozNDEFRecordBinding::Wrap(aCx, this); +} + +} // namespace dom +} // namespace mozilla