/* 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/NavigationTransition.h"

#include "mozilla/dom/NavigationBinding.h"
#include "mozilla/dom/NavigationHistoryEntry.h"
#include "mozilla/dom/NavigationTransitionBinding.h"
#include "mozilla/dom/Promise.h"
#include "nsIGlobalObject.h"

namespace mozilla::dom {

NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(NavigationTransition, mGlobalObject,
                                      mFrom, mCommitted, mFinished)
NS_IMPL_CYCLE_COLLECTING_ADDREF(NavigationTransition)
NS_IMPL_CYCLE_COLLECTING_RELEASE(NavigationTransition)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(NavigationTransition)
  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
  NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END

NavigationTransition::NavigationTransition(nsIGlobalObject* aGlobalObject,
                                           enum NavigationType aNavigationType,
                                           NavigationHistoryEntry* aFrom,
                                           Promise* aCommitted,
                                           Promise* aFinished)
    : mNavigationType(aNavigationType),
      mFrom(aFrom),
      mCommitted(aCommitted),
      mFinished(aFinished) {}

// https://html.spec.whatwg.org/#dom-navigationtransition-navigationtype
enum NavigationType NavigationTransition::NavigationType() const {
  return mNavigationType;
}

// https://html.spec.whatwg.org/#dom-navigationtransition-from
NavigationHistoryEntry* NavigationTransition::From() const { return mFrom; }

// https://html.spec.whatwg.org/#dom-navigationtransition-committed
Promise* NavigationTransition::Committed() const { return mCommitted; }

// https://html.spec.whatwg.org/#dom-navigationtransition-finished
Promise* NavigationTransition::Finished() const { return mFinished; }

JSObject* NavigationTransition::WrapObject(JSContext* aCx,
                                           JS::Handle<JSObject*> aGivenProto) {
  return NavigationTransition_Binding::Wrap(aCx, this, aGivenProto);
}

nsIGlobalObject* NavigationTransition::GetParentObject() const {
  return mGlobalObject;
}

}  // namespace mozilla::dom
